//+------------------------------------------------------------------+ //| Sum_Vect_OCL.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com/ru/users/dng | //+------------------------------------------------------------------+ //| Computing the sum of 2 vectors using OpenCL | //+------------------------------------------------------------------+ #include #resource "sum_vect_ocl.cl" as string cl_program //+------------------------------------------------------------------+ //| Defines | //+------------------------------------------------------------------+ #define k_kernel 0 #define k_source1 0 #define k_source2 1 #define k_result 2 #define k_size1 3 #define k_size2 4 //+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ COpenCL *cOpenCL; //+------------------------------------------------------------------+ //| Initialization OpenCL program | //+------------------------------------------------------------------+ bool OpenCL_Init(double &source1[], double &source2[], double &result[]) { //--- Create OpenCL program, kernel and buffers cOpenCL=new COpenCL(); if(!cOpenCL.Initialize(cl_program,true)) return false; if(!cOpenCL.SetBuffersCount(3)) return false; if(!cOpenCL.SetKernelsCount(1)) return false; if(!cOpenCL.KernelCreate(k_kernel,"SumVectors")) return false; if(!cOpenCL.BufferFromArray(k_source1,source1,0,ArraySize(source1),CL_MEM_READ_ONLY)) return false; if(!cOpenCL.BufferFromArray(k_source2,source2,0,ArraySize(source2),CL_MEM_READ_ONLY)) return false; if(!cOpenCL.BufferFromArray(k_result,result,0,ArraySize(result),CL_MEM_WRITE_ONLY)) return false; //--- return true; } //+------------------------------------------------------------------+ //| Sum of vectors | //+------------------------------------------------------------------+ bool SumVectorsOCL(double &source1[], double &source2[], double &result[]) { //--- Set parameters if(!cOpenCL.SetArgumentBuffer(k_kernel,k_source1,k_source1)) return false; if(!cOpenCL.SetArgumentBuffer(k_kernel,k_source2,k_source2)) return false; if(!cOpenCL.SetArgumentBuffer(k_kernel,k_result,k_result)) return false; if(!cOpenCL.SetArgument(k_kernel,k_size1,ArraySize(source1))) return false; if(!cOpenCL.SetArgument(k_kernel,k_size2,ArraySize(source2))) return false; //--- Run kernel int off_set[]= {0}; int s=MathMax(ArraySize(source1),ArraySize(source1)); int d=s%4; s=(s-d)/4+(d>0 ? 1 : 0); int NDRange[]= {s}; if(!cOpenCL.Execute(k_kernel,1,off_set,NDRange)) return false; //--- Get result if(!cOpenCL.BufferRead(k_result,result,0,0,NDRange[0])) return false; //--- return true; } //+------------------------------------------------------------------+ //| Shutdown OpenCL program | //+------------------------------------------------------------------+ void OpenCL_Deinit() { if(CheckPointer(cOpenCL)==POINTER_INVALID) return; //--- cOpenCL.Shutdown(); delete cOpenCL; } //+------------------------------------------------------------------+