如何使自定义指标中的OnCalculate()函数在MQL5 / OpenCL中使用GPU?

时间:2018-04-24 06:48:52

标签: opencl gpu mql5 metatrader5

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

在分析之后,我读到的程序是我的OnCalculate()使用了99%的CPU。

这是我的功能:

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 );
  }

以下是分析的结果: profiling result

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

1 个答案:

答案 0 :(得分:2)

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

int CLContextCreate(int device)

device可以是CL_USE_GPU_ONLY或特定设备编号。

如何找出号码here

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

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

希望有所帮助。