Я создал ядро OpenCL в Mql5.
Вот код:
const string cl_src =
//" int weightsum; \r\n"
" #pragma OPENCL EXTENSION cl_khr_fp64 : enable \r\n"
"__kernel void CalculateSimpleMA( \r\n"
"int rates_total, \r\n"
"int prev_calculated, \r\n"
"int begin, \r\n"
"int InpMAPeriod, \r\n"
"__global double *price, \r\n"
"__global double *ExtLineBuffer \r\n"
") \r\n"
"{ \r\n"
"int i,limit; \r\n"
"int len_price = get_global_id(4); \r\n"
//"int len_Ext = get_global_id(5); \r\n"
" if(prev_calculated==0)// first calculation \r\n"
" { \r\n"
"limit=InpMAPeriod+begin; \r\n"
"for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0; \r\n"
"double firstValue=0; \r\n"
"for(i=begin;i<limit;i++) \r\n"
"firstValue+=price[i]; \r\n"
"firstValue/=InpMAPeriod; \r\n"
"ExtLineBuffer[limit-1]=firstValue; \r\n"
"} \r\n"
"else limit=prev_calculated-1; \r\n"
"for(i=limit;i<rates_total;i++) \r\n"
"ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;\r\n"
"} \r\n"
" \r\n"
"__kernel void CalculateEMA( \r\n"
"int rates_total, \r\n"
"int prev_calculated, \r\n"
"int begin, \r\n"
"int InpMAPeriod, \r\n"
"__global double *price, \r\n"
"__global double *ExtLineBuffer \r\n"
") \r\n"
"{ \r\n"
"int i,limit; \r\n"
"double SmoothFactor=2.0/(1.0+InpMAPeriod); \r\n"
"if(prev_calculated==0) \r\n"
"{ \r\n"
"limit=InpMAPeriod+begin; \r\n"
"ExtLineBuffer[begin]=price[begin]; \r\n"
"for(i=begin+1;i<limit;i++) \r\n"
"ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor); \r\n"
"} \r\n"
"else limit=prev_calculated-1; \r\n"
"for(i=limit;i<rates_total;i++) \r\n"
"ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor); \r\n"
"} \r\n"
" \r\n"
"__kernel void CalculateLWMA( \r\n"
"int rates_total, \r\n"
"int prev_calculated, \r\n"
"int begin, \r\n"
"int InpMAPeriod, \r\n"
"__global double *price, \r\n"
"__global double *ExtLineBuffer \r\n"
") \r\n"
"{ \r\n"
"int i,limit; \r\n"
"int weightsum; \r\n"
"double sum; \r\n"
"if(prev_calculated==0) \r\n"
"{ \r\n"
"weightsum=0; \r\n"
"limit=InpMAPeriod+begin; \r\n"
"for(i=0;i<limit;i++) ExtLineBuffer[i]=0.0; \r\n"
"double firstValue=0; \r\n"
"for(i=begin;i<limit;i++) \r\n"
"{ \r\n"
"int k=i-begin+1; \r\n"
"weightsum+=k; \r\n"
"firstValue+=k*price[i]; \r\n"
"} \r\n"
"firstValue/=(double)weightsum; \r\n"
"ExtLineBuffer[limit-1]=firstValue; \r\n"
"} \r\n"
"else limit=prev_calculated-1; \r\n"
"for(i=limit;i<rates_total;i++) \r\n"
"{ \r\n"
"sum=0; \r\n"
"for(int j=0;j<InpMAPeriod;j++) sum+=(InpMAPeriod-j)*price[i-j];\r\n"
"ExtLineBuffer[i]=sum/weightsum; \r\n"
"} \r\n"
"} \r\n"
" \r\n"
"__kernel void CalculateSmoothedMA( \r\n"
"int rates_total, \r\n"
"int prev_calculated, \r\n"
"int begin, \r\n"
"int InpMAPeriod, \r\n"
"__global double *price, \r\n"
"__global double *ExtLineBuffer \r\n"
") \r\n"
"{ \r\n"
"int i,limit; \r\n"
"if(prev_calculated==0) \r\n"
"{ \r\n"
"limit=InpMAPeriod+begin; \r\n"
"for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0; \r\n"
"double firstValue=0; \r\n"
"for(i=begin;i<limit;i++) \r\n"
"firstValue+=price[i]; \r\n"
"firstValue/=InpMAPeriod; \r\n"
"ExtLineBuffer[limit-1]=firstValue; \r\n"
"} \r\n"
"else limit=prev_calculated-1; \r\n"
"for(i=limit;i<rates_total;i++) \r\n"
"ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;\r\n"
"} \r\n";
Хотя я могу запустить этот код, я получаю результаты, но не так быстро, как ожидалось с графическим процессором, поскольку я не могу использовать ядра или работника. Я попытался выполнить следующий способ:
int offset[2]={0,0};
int work [2]={1024,1024};
if(!CLExecute(cl_krn,2,offset,work))
Print("Kernel not executed",GetLastError());
Но программа получила ошибку как OpenCl device not found
.
Тогда я попробовал это:
int offset[2]={0,0};
int work [2]={1024,1024};
if(!CLExecute(cl_krn))
Print("Kernel not executed",GetLastError());
И мой код работал гладко, но не с несколькими ядрами.
Что я могу сделать, чтобы программа работала с несколькими работниками в обязательном порядке.
EDITED
Какая платформа? Вы установили правильные драйверы OpenCL? Каков выход клинфо?
Ответ: Я использую Windows 10 Pro. Я установил последние версии драйверов OpenCL с веб-сайта Intel. Я думаю, что SDK, что они дают, это то, что я установил.
Вот вывод клинфо: Суть вывода клинфо