Function 仅使用一个内核将MQL5函数转换为OpenCL内核

Function 仅使用一个内核将MQL5函数转换为OpenCL内核,function,opencl,mql5,Function,Opencl,Mql5,我尝试将用于简单移动平均的MQL5函数转换为基于OpenCL的内核程序。 以下是我所做的: MQL5功能 void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[]) { int i,limit; //--- first calculation or number of bars was changed if(prev_calculated==0)//

我尝试将用于简单移动平均的MQL5函数转换为基于OpenCL的内核程序。
以下是我所做的:
MQL5功能

void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)// first calculation
     {
      limit=InpMAPeriod+begin;
      //--- set empty value for first limit bars
      for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- main loop
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }
void CalculateSimpleMA(整数费率、整数上一次计算、整数开始、常数加倍和价格[])
{
int i,极限;
//---更改了第一次计算或钢筋数量
if(prev_computed==0)//第一次计算
{
limit=inpmperiod+begin;
//---为第一个限制条设置空值

用于(i=0;iget_全局_id(4)看起来不正确,应该是一个介于0和2之间的数字,因为最多只能有3个维度。另外,您的ClenqueEndRange参数是什么?例如,您的本地大小是多少?@Ruyk我有
clinfo
的信息输出,我可以与您共享:可能有重复的,有人能帮我吗?这可以获得\u全局\u id(4)不正确,设备最多只报告3维。您链接的OpenCL信息是平台信息,但不是您为内核提交的信息。如果不知道ClenqueEndRange的实际参数,我们将帮不上什么忙。
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable                          
__kernel void CalculateSimpleMA(                                        
                                int rates_total,                               
                                int prev_calculated,                            
                                int begin,                                     
                                int InpMAPeriod,                               
                                __global double *price,                        
                                __global double *ExtLineBuffer                 
                                )                                              
        {                                                                  
            int i,limit;                                                   
            int len_price = get_global_id(4);                                 
         if(prev_calculated==0)// first calculation                        
         {                                                                 
            limit=InpMAPeriod+begin;                                       
            for(i=0;i<limit-1;i++) 
               ExtLineBuffer[i]=0.0;                   
            double firstValue=0;                                           
            for(i=begin;i<limit;i++)                                       
               firstValue+=price[i];                                           
            firstValue/=InpMAPeriod;                                       
            ExtLineBuffer[limit-1]=firstValue;                             
            }                                                              
        else limit=prev_calculated-1;                                   
        for(i=limit;i<rates_total;i++)                                 
            ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
        }