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

时间:2018-04-30 07:10:19

标签: 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)// 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;
//---
  }

的OpenCL

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

该计划工作正常。但问题是我确实使用过OpenCL,因此我可以使用GPU的多个内核。但我看到的是我只能使用单核。当我尝试在执行中使用worker时,该内核无法执行。这是正在发生的事情。

我认为将函数转换为Opencl程序时出现了一些错误 请注意,由于我通过我的计划获得的性质,建议我错过了什么。我希望尽可能使用所有核心。

已编辑

问题与将功能从一种语言转换为另一种语言有关。

0 个答案:

没有答案