Функция MQL5, преобразованная в ядро ​​OpenCL с использованием только одного ядра - PullRequest
0 голосов
/ 30 апреля 2018

Я пытался преобразовать функцию 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. Но я вижу, что могу использовать только одно ядро. Пока я пытался использовать рабочий в Execution, ядро ​​не удалось выполнить. Это то, что происходит.

Я подумал, что допустил ошибку при преобразовании функции в программу Opencl.
Пожалуйста, предложите мне то, что я пропустил из-за того, какой характер я прохожу через мою программу. Я хотел использовать все ядра, если это возможно.

ИЗД.

Вопрос связан с преобразованием функции с одного языка на другой.

...