DLL 없이 MetaTrader 5 터미널에서 직접 OpenCL로 할 수 있는 일은 다음과 같습니다. - 페이지 18

 
Aleksei Grebenkin :

Renat Fatkhullin이 MQL5+OpenCL로 작성 가능성에 대해 논의하기 위해 귀하에게 연락하는 방법. 비디오 카드의 컴퓨팅 성능을 사용해야 합니다. 내가 모든 것을 올바르게 이해했다면 실습의 예를 사용하여 작성되었습니다. 작성된 로봇은 로컬 네트워크를 통해 연결된 3대의 기계로 11개의 매개변수만 최적화하며 기간은 단 1년 6시간입니다. 데이터의 완전한 열거로 5년의 최적화를 청구하려고 시도했는데 2개월을 기다려야 한다는 것을 보여주었습니다. 내가 올바르게 이해하면 OpenCL이 이 문제를 해결합니다 . 속도는 프로세서가 아니기 때문에 수백 배 증가해야 하지만 계산에는 비디오 카드가 포함될 것입니다. 즉, 전체 거래 시스템을 고려하면 설정에 약 200-300개의 매개변수가 있습니다. 로봇이 OpenCL에서 실행될 때 3-5년 동안의 이러한 계산량은 몇 분 또는 몇 시간 안에 내 기계 중 하나에서 수행될 것입니다. 내가 올바르게 이해하고 있으며 그러한 로봇을 작성하는 것에 대해 당신과 논의할 수 있습니까?

OpenCL 계산은 최적화 프로세스의 병렬화에 참여하지 않습니다.

OpenCL의 도움으로 알고리즘의 특별히 준비된 특정 부분을 더 빠르고 병렬로 계산할 수 있습니다. OpenCL에 대한 많은 기사와 토론 이 있습니다.

 
Maxim Kuznetsov # :

더 큰 카드를 구매하는 데 방해가 되는 것은 무엇입니까?

일부 스레드 A100 https://www.nvidia.com/ru-ru/data-center/a100/

곧 완료됩니다.




Gforce RTX2080 TI에 대한 이전 계산의 X2-X3 가속

그러나 테스터에서 신경망으로 모델을 테스트하는 모든 사람을 위한 별도의 지점이 있습니다.

OpenCl은 10-12개 이상의 프로세스(에이전트)가 있는 경우 다중 스레드 액세스 중에 장치를 캡처하는 것을 허용하지 않습니다.

특히 여러 신경망을 동시에 생성하여 하나의 조합으로 다른 데이터를 분석하는 경우.

그리고 현재 서버에 96개의 논리 프로세서가 있음에도 불구하고 12개가 여전히 사용 중입니다.

따라서 네트워크에서 여러 대의 구형 컴퓨터를 보유하는 것이 어느 정도 더 유리할 수 있으며 때로는 더 저렴할 수도 있습니다.


이와 별도로 OpenCL과 함께 CPU를 사용할 수 있는 AMD SDK 패키지를 설치할 수 있는 별도의 기회를 언급하고 싶습니다.

이제 동일한 속도로 작업을 완료할 준비가 된 96개의 장치가 있지만 더 이상 카드의 성능에만 의존하지 않습니다.



그러나 장치 선택 과정에서 OpenCl 라이브러리를 수정해야 했습니다.

CLContextCreate(CL_USE_ANY)

현재 로드된 장치를 이해할 수 없습니다.

그리고 GPU만 선택하거나 CPU만 선택한다고 해서 두 옵션을 동시에 사용할 수 있는 것은 아닙니다.


이 문제를 해결하기 위해 각 카드의 현재 계산 속도를 테스트했고,

이 흥미로운 예를 사용하여 계산 시뮬레이션(좋음)

https://www.mql5.com/ru/code/825


라이브러리 코드에서 다음과 같이 구현되었습니다.

 int COpenCL::ID_FasterDevice()
  {
 
   int cl_prg;
   int cl_krn;
   int cl_mem;
   int cl_ctx;
   string device;
   ulong speed [];
   
   int dCount= ( int ) CLGetInfoInteger ( 0 , CL_DEVICE_COUNT );
  
   
   if (dCount> 1 )
   {
   ArrayResize (speed,dCount);
   
       //----------------- измерим текщую производительность и выберем более быстрый девайс ----------
       for ( int i = 0 ; i<dCount;i++)
         {
         cl_ctx=i;
         CLGetInfoString (cl_ctx, CL_DEVICE_NAME ,device);
         Print (cl_ctx, ": " ,device);
         ulong start_time= GetMicrosecondCount ();
     
//--- initializing OpenCL objects
   if ((cl_ctx= CLContextCreate ())== INVALID_HANDLE )
     {
       Print ( "OpenCL not found" );
       return - 1 ;
     }
   if ((cl_prg= CLProgramCreate (cl_ctx,cl_src))== INVALID_HANDLE )
     {
       CLContextFree (cl_ctx);
       Print ( "OpenCL program create failed" );
       return - 1 ;
     }
   if ((cl_krn= CLKernelCreate (cl_prg, "MFractal" ))== INVALID_HANDLE )
     {
       CLProgramFree (cl_prg);
       CLContextFree (cl_ctx);
       Print ( "OpenCL kernel create failed" );
       return - 1 ;
     }
   if ((cl_mem= CLBufferCreate (cl_ctx,SIZE_X*SIZE_Y* sizeof ( uint ), CL_MEM_READ_WRITE ))== INVALID_HANDLE )
     {
       CLKernelFree (cl_krn);
       CLProgramFree (cl_prg);
       CLContextFree (cl_ctx);
       Print ( "OpenCL buffer create failed" );
       return - 1 ;
     }
//--- getting ready for execution
   float x0       =- 2 ;
   float y0       =- 0.5 ;
   float x1       =- 1 ;
   float y1       = 0.5 ;
   uint   max      = 20000 ;
   uint   offset[ 2 ]={ 0 , 0 };
   uint   work  [ 2 ]={SIZE_X,SIZE_Y};
   string objname = "OpenCL_" + IntegerToString ( ChartID ());
   string resname = "::Mandelbrot_" + IntegerToString ( ChartID ());
//--- setting unchangeable OpenCL function parameters
   CLSetKernelArg (cl_krn, 4 ,max);
   CLSetKernelArgMem (cl_krn, 5 ,cl_mem);
//--- creating the object for graphics display
   ChartRedraw ();
   Comment ( "Benchmark OpenCl devices" );
   ObjectCreate ( 0 ,objname, OBJ_BITMAP_LABEL , 0 , 0 , 0 );
   ObjectSetInteger ( 0 ,objname, OBJPROP_XDISTANCE , 4 );
   ObjectSetInteger ( 0 ,objname, OBJPROP_YDISTANCE , 26 );
//--- create initial empty picture
   uint buf[];

   ArrayResize (buf,SIZE_X*SIZE_Y);
   ResourceCreate (resname,buf,SIZE_X,SIZE_Y, 0 , 0 ,SIZE_X, COLOR_FORMAT_XRGB_NOALPHA );
   ObjectSetString ( 0 ,objname, OBJPROP_BMPFILE ,resname);
//--- rendering, till we are not stopped from the outside
   for ( int samples= 0 ;samples< 100 ;samples++)
     {
       uint x= GetTickCount ();
       //--- setting floating parameters
       CLSetKernelArg (cl_krn, 0 ,x0);
       CLSetKernelArg (cl_krn, 1 ,y0);
       CLSetKernelArg (cl_krn, 2 ,x1);
       CLSetKernelArg (cl_krn, 3 ,y1);
       //--- rendering the frame
       CLExecute (cl_krn, 2 ,offset,work);
       //--- taking the frame data
       CLBufferRead (cl_mem,buf);
       //--- outputting the rendering time
       Comment ( IntegerToString ( GetTickCount ()-x)+ " msec per frame" );
       //--- saving the frame in memory and drawing it
       ResourceCreate (resname,buf,SIZE_X,SIZE_Y, 0 , 0 ,SIZE_X, COLOR_FORMAT_XRGB_NOALPHA );
       ChartRedraw ();
       //--- a small pause and parameters update for the next frame
       Sleep ( 10 );
      x0+= 0.001 f;
      x1-= 0.001 f;
      y0+= 0.001 f;
      y1-= 0.001 f;
     
     }
//--- removing OpenCL objects
   CLBufferFree (cl_mem);
   CLKernelFree (cl_krn);
   
   CLProgramFree (cl_prg);
   CLContextFree (cl_ctx);
         ulong finishtime= GetMicrosecondCount ();
         ulong testtime= finishtime-start_time;  
         speed [i] = testtime; 
         
   ObjectDelete ( 0 ,objname);
   Comment ( "" );
     }
      
      m_context= ArrayMinimum (speed, 0 , WHOLE_ARRAY );
   }
   else 
      m_context=- 1 ;
//--- remove object
  
   return m_context;
  }
//+------------------------------------------------------------------+

어드바이저 코드에서

 COpenCL         *TestOpenCL;
      TestOpenCL = new COpenCL;
      int faster_device=TestOpenCL.ID_FasterDevice();
      TestOpenCL.Initialize(cl_program,id_device, true );         

OpenCL 라이브러리에서 장치 선택 가능성을 고려하십시오.

 //+------------------------------------------------------------------+
//| Initialize                                                       |
//+------------------------------------------------------------------+
bool COpenCL::Initialize( const string program, const int id_device=- 1 , const bool show_log= true )
  {  
   
     
     m_context=id_device;
    
     if ((m_context= CLContextCreate ())== INVALID_HANDLE )
     {
       Print ( "OpenCL not found" );      
     }   
     else if ((m_context= CLContextCreate ( CL_USE_ANY ))== INVALID_HANDLE )
         {
       
               Print ( "OpenCL not found. Error code=" , GetLastError ());
                   return ( false );     
         }
파일:
 

내일 릴리스에서는 기계 학습에 사용할 일반 행렬/벡터 데이터 유형 을 출시할 예정입니다.

MQL5 프로그램의 코드는 크게 단순화되어 광범위한 수학 연산을 구현할 수 있습니다.

이것은 1세대 기능이며 TensorFlow와 같은 패키지의 기능을 구현하기 위해 더 복잡한 메커니즘을 구현합니다. 여기에서 OpenCL이 유용합니다.

 
새로운 시대의 통과가 이전 통과의 결과를 기반으로 해야 할 때 신경망에 대한 이 모든 멀티스레딩의 요점은 무엇입니까? 그리고 모든 병렬 스레드는 첫 번째 스레드의 결과를 반복합니다. 그리고 결국 그들은 하나의 파일에 결과를 채울 것입니다. 이전 스레드의 결과를 덮어쓰지만 본질적으로 값을 변경하지 않는...
 
Dmytryi Voitukhov # :
새로운 시대의 통과가 이전 통과의 결과를 기반으로 해야 할 때 신경망에 대한 이 모든 멀티스레딩의 요점은 무엇입니까? 그리고 모든 병렬 스레드는 첫 번째 스레드의 결과를 반복합니다. 그리고 결국, 그들은 결과를 하나의 파일에 채울 것입니다. 이전 스레드의 결과를 덮어쓰지만 본질적으로 값을 변경하지 않는...

레나트가 소리치고 당신은 징징거립니다. 당신은 몇 살입니까?

 

라이브러리를 약간 수정하여 아름답게 만들었습니다.

       double testtime= ( GetTickCount ()-start_time)/ 1000 ;  
         speed [i] = NormalizeDouble ( MathRound ( 1000 /testtime/ 8 )* 8 , 3 ); //NormalizeDouble(1000/testtime,2); 
      
       CLGetInfoString (i, CL_DEVICE_NAME ,device);
       Print ( "Device #" , i, ", speed =" ,speed [i], " FPS. " ,device); 
   ObjectDelete ( 0 ,objname);
   Comment ( "" );
     }
      
      m_context= ArrayMaximum (speed, 0 , WHOLE_ARRAY );
       CLGetInfoString (m_context, CL_DEVICE_NAME ,device);
     
       Print ( "Faster device: #" ,m_context, ", " ,device, " " ); 


파일: