LibreOCL/Lesson01/Part01/Prog01_01B/Prog01_01B.mq5

168 lines
13 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 15:03:43 +02:00
<EFBFBD><EFBFBD>//============================================================================================= MQL5 ===
// LibreOCL v1.003 (MQL5)
// ;02=K9 <>4C;L >1@01>B:8 A>1KB89
// Librecoin(c)2014-2017
//============================================================================================= MQL5 ===
// REVIEWS
//------------------------------------------------------------------------------------------------------
// @8<5@ ?@>3@0<<8@>20=8O OpenCL.
//============================================================================================= MQL5 ===
// IDEAS
//------------------------------------------------------------------------------------------------------
// 0=>A8< 420 7=0G5=8O 2 :5@=5;, <5=O5< <5AB0<8 8 2>72@0I05< >1@0B=>.
//============================================================================================= MQL5 ===
// PROPERTY
//------------------------------------------------------------------------------------------------------
#property copyright "Librecoin(c)2017"
#property version "1.003"
#property strict
#resource "Kernels/Prog01_01B.cl" as string CL_Source//>4 :5@=5;-?@>3@0<< <>6=> ?>4:;NG0BL :0: @5AC@A
//
//============================================================================================= MQL5 ===
// Script program start function
//------------------------------------------------------------------------------------------------------
void OnStart()
{
//CL_USE_ANY = -1;
//CL_USE_GPU_ONLY = -2;
//CL_USE_CPU_ONLY = -3;
//CL_USE_GPU_DOUBLE_ONLY = -4;
//---
//----- :;NG0B5;L >B;04>G=>9 ?5G0B8
bool PrintDebugSelector = true;
//----- AE>4=K9 <0AA82 7=0G5=89 4;O ?5@5AB0=>2:8
double x[] = {1111.1, 9999.9};
//----- 0A?5G0B05< 8AE>4=K5 7=0G5=8O M;5<5=B>2 <0AA820
Print("x[0]=", x[0], " x[1]=", x[1]);
//----- %5=4;K 4;O >1J5:B>2 OpenCL
int h_CL_Context = INVALID_HANDLE; //%5=4; :>=B5:AB0
int h_CL_Program = INVALID_HANDLE; //%5=4; ?@>3@0<<K
int h_CL_Kernel = INVALID_HANDLE; //%5=4; :5@=5;0
int h_CL_Buffer = INVALID_HANDLE; //%5=4; 1CD5@0
//----- !>740=85 :>=B5:AB0 (A@54K) 4;O ?@>3@0<<K OpenCL (2K1>@ 45209A0)
{
if((h_CL_Context = CLContextCreate(CL_USE_GPU_DOUBLE_ONLY)) == INVALID_HANDLE) //CL_USE_ANY - 8A?>;L7>20BL ;N1>5 4>ABC?=>5 CAB@>9AB2> A ?>445@6:>9 OpenCL
{
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer);
return;
}
}//if((h_CL_Context=CLContextCreate(CL_USE_ANY))==INVALID_HANDLE)
//----- !>740=85 2 :>=B5:AB5 ?@>3@0<<K =0 >A=>25 :>40 2 AB@>:5 CL_Source
string BuildLog = ""; //>3 :><?8;OF88
{
if((h_CL_Program = CLProgramCreate(h_CL_Context, CL_Source, BuildLog)) == INVALID_HANDLE) // B@5BL5< ?0@0<5B@5 - ;>3 :><?8;OF88
{
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer, BuildLog, PrintDebugSelector);
return;
}
}//if((h_CL_Program=CLProgramCreate(h_CL_Context,CL_Source,BuildLog))==INVALID_HANDLE)
//----- !>740=85 :5@=5;0 4;O @0AG5B0 7=0G5=89 DC=:F88 >B 42CE ?5@5<5==KE
{
if((h_CL_Kernel = CLKernelCreate(h_CL_Program, "Exch")) == INVALID_HANDLE) //<O DC=:F88 ("Exch") 4>;6=> A>>B25BAB2>20BL 8<5=8 2 ?@>3@0<<=>9 AB@>:5 CL_Source
{
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer);
return;
}
}//if((h_CL_Kernel=CLKernelCreate(h_CL_Program,"Exch"))==INVALID_HANDLE)
//----- !>740=85 1CD5@0 OpenCL 4;O ?>;CG5=8O 7=0G5=89 DC=:F88
{
if((h_CL_Buffer = CLBufferCreate(h_CL_Context, ArraySize(x) * sizeof(double), CL_MEM_READ_WRITE)) == INVALID_HANDLE)
{
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer);
return;
}
}//if((h_CL_Buffer=CLBufferCreate(h_CL_Context,ArraySize(x)*sizeof(double),CL_MEM_READ_WRITE))==INVALID_HANDLE)
//----- 0?8AK205< 8AE>4=K5 7=0G5=8O 2 1CD5@
{
if(CLBufferWrite(h_CL_Buffer, x) <= 0)
{
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer);
return;
}
}//if(CLBufferWrite(h_CL_Buffer,x)<=0)
//----- 5@540Q< 7=0G5=8O 1CD5@0 ?> E5=4;C h_CL_Buffer 2 :5@=5;
{
if(!CLSetKernelArgMem(h_CL_Kernel, 0, h_CL_Buffer))
{
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer);
return;
}
}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer))
//----- 0?CA:05< 2K?>;=5=85 :5@=5;0
if(!CLExecute(h_CL_Kernel))
{
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer);
return;
}
//if(!CLExecute(h_CL_Kernel))
//----- !G8BK205< ?>;CG5==K5 7=0G5=8O 2 <0AA82 x
Print("7 1CD5@0 ?@>G8B0=> ", CLBufferRead(h_CL_Buffer, x), " M;5<5=B>2");
//----- 0A?5G0BK205< ?>;CG5==K5 7=0G5=8O M;5<5=B>2 <0AA820
Print("x[0]=", x[0], " x[1]=", x[1]);
//----- #40;O5< >1J5:BK OpenCL
ShutDown(h_CL_Context, h_CL_Program, h_CL_Kernel, h_CL_Buffer);
return;
}//OnStart()
//
//============================================================================================= MQL5 ===
// ShutDown() function
//------------------------------------------------------------------------------------------------------
void ShutDown(
int &i_CL_Context,
int &i_CL_Program,
int &i_CL_Kernel,
int &i_CL_Buffer,
const string i_BuildLog = "",
const bool i_PrintDebugSelector = false
)
{
//----- Build Log Print
{
if((i_PrintDebugSelector) && (i_BuildLog != ""))
{
string LogLines[];
StringSplit(i_BuildLog, '\n', LogLines);
int LogLinesCount = ArraySize(LogLines);
{
for(int i = 0; i < LogLinesCount; i++)
{
Print(LogLines[i]);
}
}//for(int i=0; i<LogLinesCount; i++)
}
}//if((i_PrintDebugSelector)&&(i_BuildLog!=""))
//----- Remove buffer
{
if(i_CL_Buffer != INVALID_HANDLE)
{
CLBufferFree(i_CL_Buffer);
i_CL_Buffer = INVALID_HANDLE;
}
}//if(i_CL_Buffer!=INVALID_HANDLE)
//---- Remove kernel
{
if(i_CL_Kernel != INVALID_HANDLE)
{
CLKernelFree(i_CL_Kernel);
i_CL_Kernel = INVALID_HANDLE;
}
}//if(i_CL_Kernel!=INVALID_HANDLE)
//----- Remove program
{
if(i_CL_Program != INVALID_HANDLE)
{
CLProgramFree(i_CL_Program);
i_CL_Program = INVALID_HANDLE;
}
}//if(m_program!=INVALID_HANDLE)
//----- Remove context
{
if(i_CL_Context != INVALID_HANDLE)
{
CLContextFree(i_CL_Context);
i_CL_Context = INVALID_HANDLE;
}
}//if(m_context!=INVALID_HANDLE)
}//ShutDown()
//