Ошибка устройства 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
Кроме того, когда я перезагружаю систему, обнаруживается графический процессор. Но позже та же ошибка всплывает на моем экране вывода. Значение, если есть, всегда нули.
Пожалуйста, помогите мне с решением.