首页 文章

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

提问于
浏览
4

我使用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 回答

  • 2

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

    int CLContextCreate(int device)
    

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

    如何找出数字描述here .


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

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

    希望有所帮助 .

相关问题