Ошибка устройства Opencl и значения возвращают ноль OpenCL MQL5

Я пытаюсь рассчитать линейную регрессию. Для этого я использую графический процессор моей системы с OpenCl, поскольку это единственная возможность, с помощью которой я могу соединить MQL5 с графическим процессором.
Вот код:

const string cl_src = 
" #pragma OPENCL EXTENSION cl_khr_fp64 : enable                       \r\n"
"__kernel void CalculateSimpleMA(int rates_total,                     \r\n"
                                 "int prev_calculated,                \r\n"
                                 "int begin,                          \r\n"
                                 "int InpMAPeriod,                    \r\n"
                                 "__global const double *price,                \r\n"
                                "__global double *storeValue          \r\n"
                                ")                                    \r\n"
         "{                                                           \r\n"
         " int i,limit;                                               \r\n"
         " if(prev_calculated==0)// first calculation                 \r\n"
         "{                                                           \r\n" 
            "limit=InpMAPeriod+begin;                                 \r\n"
            "for(i=0;i<limit-1;i++) storeValue[i]=0.0;                \r\n"
            "double firstValue=0;                                     \r\n"
            "for(i=begin;i<limit;i++) firstValue+=price[i];           \r\n"
            "firstValue/=InpMAPeriod;                                 \r\n"
            "storeValue[limit-1]=firstValue;                          \r\n"
         "}                                                           \r\n"
         "else limit=prev_calculated-1;                               \r\n"
         "for(i=limit;i<rates_total;i++)                              \r\n"
            "storeValue[i]=storeValue[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;\r\n"
         "}                                                           \r\n";

Выше приведено ядро ​​opencl, а ниже - моя функция OnCalculate:

int InpMAPeriod = 20;
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- check for bars count
   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);
//--- sets first bar from what index will be draw
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod-1+begin);
int cl_ctx;
   int cl_prg;
   int cl_krn;
   int cl_mem, cl_price;
   if((cl_ctx=CLContextCreate(CL_USE_GPU_ONLY))==INVALID_HANDLE)
     {
      Print("OpenCL not found: ", GetLastError() );
      return(0);

     }
     string str;
   if(CLGetInfoString(cl_ctx,CL_DEVICE_NAME,str)) 
      Print("OpenCL device name: ",str);
   if((cl_prg=CLProgramCreate(cl_ctx,cl_src,str))==INVALID_HANDLE)
     {
      CLContextFree(cl_ctx);

      Print("OpenCL program create failed: ", str);
      return(0);
     }
//--- calculation
   switch(InpMAMethod)
     {
       case MODE_SMA:  
           if((cl_krn=CLKernelCreate(cl_prg,"CalculateSimpleMA"))==INVALID_HANDLE)
           {
               CLProgramFree(cl_prg);
               CLContextFree(cl_ctx);
               Print("OpenCL kernel create failed");
               return(0);
           }
              if((cl_mem=CLBufferCreate(cl_ctx,sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)
           {
               CLKernelFree(cl_krn);
               CLProgramFree(cl_prg);
               CLContextFree(cl_ctx);
               Print("OpenCL buffer create failed");
               return(0);
           }
              if((cl_price=CLBufferCreate(cl_ctx,sizeof(price),CL_MEM_READ_WRITE))==INVALID_HANDLE)
           {
               CLKernelFree(cl_krn);
               CLProgramFree(cl_prg);
               CLContextFree(cl_ctx);
               CLBufferFree(cl_mem);
               Print("OpenCL buffer create failed");
               return(0);
           }
           CLSetKernelArgMem(cl_krn,4,cl_price);
           CLSetKernelArgMem(cl_krn,5,cl_mem);
           CLBufferWrite(cl_price, price);
           CLSetKernelArg(cl_krn,0,rates_total);
           CLSetKernelArg(cl_krn,1,prev_calculated);
           CLSetKernelArg(cl_krn,2,begin);
           CLSetKernelArg(cl_krn,3,InpMAPeriod);
           CLSetKernelArg(cl_krn,3,cl_price);
           CLExecute(cl_krn);

            CLBufferRead(cl_mem,ExtLineBuffer);

            CLBufferFree(cl_price);
            CLBufferFree(cl_mem);
            CLKernelFree(cl_krn);
            CLProgramFree(cl_prg);

      break;
     }
     ArrayPrint(ExtLineBuffer);

   CLContextFree(cl_ctx);


   return(rates_total);
  }

Приведенный выше код при запуске выдает ошибку:

OpenCL not found: 5103

Кроме того, когда я перезагружаю систему, обнаруживается графический процессор. Но позже та же ошибка всплывает на моем экране вывода. Значение, если есть, всегда нули.

Пожалуйста, помогите мне с решением.

0 ответов

Другие вопросы по тегам