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

如何使自定义指示器中的OnCalculate()函数在MQL5/OpenCL中使用GPU?,opencl,gpu,mql5,metatrader5,Opencl,Gpu,Mql5,Metatrader5,我已经使用MQL5创建了一个指示器 分析后,我读取的程序显示,我的OnCalculate()使用了99%的CPU 以下是我的功能: int OnCalculate( const int rates_total, const int prev_calculated, const int begin, const double &price[]

我已经使用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 );
  }
int OnCalculate(const int rates_total,
上一次计算的常数,
const int begin,
双倍成本和价格[]
)
{
//---检查酒吧数量
浮动价格[];
ArrayResize(临时价格,ArraySize(价格));
if(rates_total
以下是分析的结果:


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

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

int-CLContextCreate(int设备)
其中,
设备
可以是,例如,
CL\u仅使用GPU
,或特定的设备编号

描述了如何找出号码


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

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


希望这能有所帮助。

当缓冲区的大小总是在变化时,我如何在
OnInit()初始化缓冲区?请帮助我修改代码,以便在CPU干预较少的情况下完全使用GPU。先从一件事开始,再从上下文开始,因为根据您的个人资料,这似乎花费您最多,然后是其他事情。如果您知道应用程序缓冲区大小的上限,请使用该上限并仅传输实际使用的数据量,并相应地设置工作项的数量(NDRange,global size)。如果太大(搜索
CL\u设备\u最大值\u MEM\u ALLOC\u大小
),将您的输入分块。
CLGetDeviceInfo(CL\u ctx,CL\u设备供应商,h,s);打印(“size=”,s);string str=CHARRAYTOSTRING(h);打印(str)我尝试了这个命令。将输出作为OpenCL:GPU设备“GeForce GT 730”选择的OpenCL设备名称:GeForce GT 730 size=19 NVIDIA Corporation
是,这意味着您已经在使用GPU,而不是CPU,因为它可能是系统上安装OpenCL驱动程序的第一个或唯一的设备。正如我前面所写的,您可以在创建上下文期间强制执行特定的设备类型。如果您仍然对性能不满意,请尝试我的建议,并测量内核的运行时间,例如
CLEnqueueNDRangeKernel()
调用,请参阅以了解更多详细信息。