Original_NNB/MQL5/Include/NeuroNetworksBook/algotrading/sum_vect_ocl.mqh
super.admin e81e22b7b8 convert
2025-05-30 16:15:14 +02:00

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;
}
//+------------------------------------------------------------------+