【问题标题】:How to make OnCalculate() function in Custom Indicator use GPU in MQL5 / OpenCL?如何使自定义指标中的 OnCalculate() 函数使用 MQL5 / OpenCL 中的 GPU?
【发布时间】:2018-10-04 07:48:15
【问题描述】:

我使用 MQL5 创建了一个指标。

在 Profiling 之后,我读到的程序我的 CPU 的 99% 被我的OnCalculate() 使用。

这是我的功能:

int OnCalculate( const int     rates_total,
                 const int     prev_calculated,
                 const int     begin,
                 const double &price[]
                 )
  {
//--- check for bars count
      float tempprice[];
      ArrayResize( tempprice, ArraySize( price ) );
      if (  rates_total <  InpMAPeriod - 1 + begin ) return( 0 ); // not enough bars for calculation
//--- first calculation or number of bars was changed
      if (  prev_calculated == 0 ) ArrayInitialize( ExtLineBuffer, 0 );

      ArrayCopy( tempprice, price );
//--- sets first bar from what index will be draw
      PlotIndexSetInteger( 0, PLOT_DRAW_BEGIN, InpMAPeriod - 1 + begin );

      switch( InpMAMethod )
      {
         case MODE_EMA:  Execute_Me( price,
                                    "CalculateEMA",
                                     rates_total,
                                     prev_calculated,
                                     begin
                                     );
                         break;
         case MODE_LWMA: Execute_Me( price,
                                    "CalculateLWMA",
                                     rates_total,
                                     prev_calculated,
                                     begin
                                     );
                         break;
         case MODE_SMMA: Execute_Me( price,
                                    "CalculateSmoothedMA",
                                     rates_total,
                                     prev_calculated,
                                     begin
                                     );
                         break;
         case MODE_SMA:  Execute_Me( price,
                                    "CalculateSimpleMA",
                                     rates_total,
                                     prev_calculated,
                                     begin
                                     );
                         break;
     }
     return( rates_total );
  }

这是分析的结果:

请告诉我,如何让OnCalculate() 在 GPU 而不是 CPU 上工作。

【问题讨论】:

    标签: opencl gpu mql5 metatrader5


    【解决方案1】:

    可以通过CLContextCreate调用控制哪个计算设备,即你的程序是否使用CPU:

    int CLContextCreate(int device)
    

    device 可能在哪里,例如CL_USE_GPU_ONLY,或特定的设备号。

    如何找出号码在here中描述。


    但是:我可以从配置文件中看到,大部分时间都花在了创建和释放 OpenCL 上下文上。如果配置文件代表某种调用堆栈,我会假设为每次计算创建和释放 OpenCL 上下文,而不是在程序初始化和取消初始化期间执行一次。

    这似乎花费了您 85% 的运行时间。因此,请确保在初始化期间创建 OpenCL 上下文、程序、内核和缓冲区对象。对于重复计算,您只需要设置内核参数,读/写缓冲区对象,并将内核排队执行

    希望对您有所帮助。

    【讨论】:

    • 当缓冲区的大小一直在变化时,如何在OnInit() 处初始化缓冲区?请帮我修改代码以完全与 GPU 一起工作,如果可能的话,减少 CPU 的干预。
    • 从一件接一件的事情开始,从上下文开始,因为根据您的个人资料,这似乎花费您最多,然后是其他事情。如果您知道应用程序缓冲区大小的上限,请使用该上限并仅传输实际使用的数据量,并相应地设置工作项的数量(NDRange,全局大小)。如果它太大(搜索CL_DEVICE_MAX_MEM_ALLOC_SIZE),请将您的输入分块。
    • CLGetDeviceInfo(cl_ctx,CL_DEVICE_VENDOR,h,s); Print("size = ",s); string str=CharArrayToString(h); Print(str); 我试过这个命令。输出为OpenCL: GPU device 'GeForce GT 730' selected OpenCL device name: GeForce GT 730 size = 19 NVIDIA Corporation
    • 是的,这意味着您已经在使用 GPU 而不是 CPU,因为它可能是您系统上第一个或唯一一个安装了 OpenCL 驱动程序的设备。正如我之前所写,您可以在上下文创建期间强制执行特定的设备类型。如果您仍然对性能不满意,请尝试我的建议,并测量内核的运行时间,例如CLEnqueueNDRangeKernel() 电话,请参阅this 了解更多详情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多