LibreOCL/Lesson01/Part01/Prog01_01A/Prog01_01A.mq5

151 lines
13 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 15:03:43 +02:00
<EFBFBD><EFBFBD>//============================================================================================= MQL5 ===
// LibreOCL v1.002 (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.002"
#property strict
//============================================================================================= MQL5 ===
// >4 DC=:F89 4;O OpenCL
//------------------------------------------------------------------------------------------------------
const string CL_Source =
"kernel void Exch(global double *ix) \r\n"
"{ \r\n"
" double z; \r\n"
" z=ix[0]; \r\n"
" ix[0]=ix[1]; \r\n"
" ix[1]=z; \r\n"
"} \r\n";
//
//============================================================================================= MQL5 ===
// Script program start function
//------------------------------------------------------------------------------------------------------
void OnStart()
{
//----- AE>4=K9 <0AA82 7=0G5=89 4;O ?5@5AB0=>2:8
double x[2] = {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; //%5=4; :>=B5:AB0
int h_CL_Program; //%5=4; ?@>3@0<<K
int h_CL_Kernel; //%5=4; :5@=5;0
int h_CL_Buffer; //%5=4; 1CD5@0
//----- !>740=85 :>=B5:AB0 (A@54K) 4;O ?@>3@0<<K OpenCL (2K1>@ 45209A0)
ResetLastError();
{
if((h_CL_Context = CLContextCreate(CL_USE_ANY)) == INVALID_HANDLE) //CL_USE_ANY - 8A?>;L7>20BL ;N1>5 4>ABC?=>5 CAB@>9AB2> A ?>445@6:>9 OpenCL
{
Print("OpenCL not found, error:", GetLastError());
return;
}
else
{
Print("OpenCL found, %5=4; =0 :>=B5:AB OpenCL:", h_CL_Context, " Error:", GetLastError());
}
}//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
ResetLastError();
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
{
Print("OpenCL program create failed, error:", GetLastError(), " BuildLog=", BuildLog);
CLContextFree(h_CL_Context);
return;
}
else
{
Print("OpenCL program create, %5=4; ?@>3@0<<K OpenCL:", h_CL_Program, " Error:", GetLastError());
}
}//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
ResetLastError();
{
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
{
Print("OpenCL kernel create failed, error:", GetLastError());
CLProgramFree(h_CL_Program);
CLContextFree(h_CL_Context);
return;
}
else
{
Print("OpenCL kernel create, %5=4; :5@=5;0 OpenCL:", h_CL_Kernel, " Error:", GetLastError());
}
}//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
ResetLastError();
{
if((h_CL_Buffer = CLBufferCreate(h_CL_Context, ArraySize(x) * sizeof(double), CL_MEM_READ_WRITE)) == INVALID_HANDLE)
{
Print("OpenCL buffer create failed, error:", GetLastError());
CLKernelFree(h_CL_Kernel);
CLProgramFree(h_CL_Program);
CLContextFree(h_CL_Context);
return;
}
else
{
Print("OpenCL buffer create, %5=4; 1CD5@0 OpenCL:", h_CL_Buffer, " Error:", GetLastError());
}
}//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@
Print(" 1CD5@ 70?8A0=> ", CLBufferWrite(h_CL_Buffer, x), " M;5<5=B>2");
//----- 5@540Q< 7=0G5=8O 1CD5@0 ?> E5=4;C h_CL_Buffer 2 :5@=5;
ResetLastError();
{
if(!CLSetKernelArgMem(h_CL_Kernel, 0, h_CL_Buffer))
{
Print("OpenCL set buffer failed, error:", GetLastError());
CLBufferFree(h_CL_Buffer);
CLKernelFree(h_CL_Kernel);
CLProgramFree(h_CL_Program);
CLContextFree(h_CL_Context);
return;
}
else
{
Print("OpenCL set buffer, error:", GetLastError());
}
}//if(CLSetKernelArgMem(h_CL_Kernel,0,h_CL_Buffer))
//----- 0?CA:05< 2K?>;=5=85 :5@=5;0
ResetLastError();
{
if(!CLExecute(h_CL_Kernel))
{
Print("OpenCL execute failed, error:", GetLastError());
CLBufferFree(h_CL_Buffer);
CLKernelFree(h_CL_Kernel);
CLProgramFree(h_CL_Program);
CLContextFree(h_CL_Context);
return;
}
else
{
Print("OpenCL execute, error:", GetLastError());
}
}//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
CLBufferFree(h_CL_Buffer);
CLKernelFree(h_CL_Kernel);
CLProgramFree(h_CL_Program);
CLContextFree(h_CL_Context);
return;
}//OnStart()