88 lines
3.6 KiB
MQL5
88 lines
3.6 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Sum_Vect_OCL.mqh |
|
|
//| Copyright 2021, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com/ru/users/dng |
|
|
//+------------------------------------------------------------------+
|
|
//| Computing the sum of 2 vectors using OpenCL |
|
|
//+------------------------------------------------------------------+
|
|
#include <OpenCL/OpenCL.mqh>
|
|
#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;
|
|
}
|
|
//+------------------------------------------------------------------+
|