Forum > General

OpenCL Pascal Wrapper - Any Feature Request?

(1/1)

schuler:
 :) Hello :) ,
as my neural networks advance, soon, I'll be porting some code to OpenCL.

I'll create a generic pascal wrapper (class) to make it simpler to run OpenCL kernels.

In the case that you have something in mind that you would like to see, I'm open to explore options.

:) Long life to pascal :)

Phil:

--- Quote from: schuler on September 29, 2017, 11:00:24 pm --- I'll create a generic pascal wrapper (class) to make it simpler to run OpenCL kernels.

--- End quote ---

I assume you're thinking of something different from the OpenCL interface headers included with FPC:

http://wiki.freepascal.org/OpenCL

https://developer.apple.com/library/content/documentation/Performance/Conceptual/OpenCL_MacProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008312


schuler:
Hello Phill,
I'm thinking about building a class that will use existing headers but will allow fpc developers to use OpenCL with a lot less effort.

As you can see in the following example, I need to type loads of commands to get a running kernel:
https://sourceforge.net/p/cai/svncode/HEAD/tree/trunk/lazarus/opencl/trillion-test/uopencl_trillion_test.pas

I'm thinking about a class that:
* Gives available platforms/devices.
* Allows you to pass your OpenCL source code/kernel and leave the kernel (or kernels) ready to run when required.
* No need to care bout with clCreateCommandQueue, clCreateProgramWithSource, clBuildProgram, clCreateKernel ...
* Allows you to run your kernel at the moment you want.
* Takes care about releasing pointers (only used pointers) such as:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---  clReleaseMemObject(input);  clReleaseMemObject(output);  clReleaseProgram(prog);  clReleaseKernel(kernel);  clReleaseCommandQueue(commands);  clReleaseContext(context); 

Phil:

--- Quote from: schuler on September 29, 2017, 11:59:39 pm ---I'm thinking about building a class that will use existing headers but will allow fpc developers to use OpenCL with a lot less effort.

--- End quote ---

Sounds good.

schuler:
 :) Hello :)
The beta version is ready. This is how to compile OpenCL code using TEasyOpenCL:


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---    procedure CompileProgramFromFile(filename:string); overload;    procedure CompileProgram(programsource: TStrings); overload;    procedure CompileProgram(programsource: string);   overload;
This is how to create, run and wait to finish an OpenCL kernel:


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---    function CreateKernel(kernelname: string): cl_kernel;    function RunKernel(pkernel:cl_kernel; ThreadCount: integer): integer;    function Finish():integer;
This is how to work with buffers (input/output OpenCL parameters):

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---    function CreateBuffer(flags: cl_mem_flags; size: csize_t): cl_mem;    function WriteBuffer(buffer: cl_mem; cb: csize_t; ptr: Pointer): integer;    function ReadBuffer(buffer: cl_mem; cb: csize_t; ptr: Pointer): integer;
Your calling program will look like this:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---  FOpenCL := TEasyOpenCL.Create();  FOpenCL.CompileProgramFromFile(filename);  kernel := FOpenCL.CreateKernel('minimize_error');  ...  input  := FOpenCL.CreateBuffer(CL_MEM_READ_ONLY, ArraySizeBytes);  output := FOpenCL.CreateBuffer(CL_MEM_WRITE_ONLY, ArraySizeBytes);   FOpenCL.WriteBuffer(input, ArraySizeBytes, @Data);   clSetKernelArg(kernel, 0, sizeof(cl_mem), @input);  clSetKernelArg(kernel, 1, sizeof(cl_mem), @output);  clSetKernelArg(kernel, 2, sizeof(longword), @Count);   FOpenCL.RunKernel(kernel,threadcount);   FOpenCL.Finish();  FOpenCL.ReadBuffer(output, ArraySizeBytes, @results);...  FOpenCL.Free;
The TEasyOpenCL source code is located at:
https://sourceforge.net/p/cai/svncode/HEAD/tree/trunk/lazarus/libs/ueasyopencl.pas

A good example about how to code using TEasyOpenCL can be found here:
https://sourceforge.net/p/cai/svncode/HEAD/tree/trunk/lazarus/opencl/easy-trillion-test/

OpenCL source codes ( *.cl files) are temporarily stored here:
https://sourceforge.net/p/cai/svncode/HEAD/tree/trunk/lazarus/opencl/trillion-test/

 :) wish everyone happy coding :)

Navigation

[0] Message Index

Go to full version