Recent

Author Topic: OpenCL Pascal Wrapper - Any Feature Request?  (Read 3145 times)

schuler

  • Full Member
  • ***
  • Posts: 223
OpenCL Pascal Wrapper - Any Feature Request?
« on: September 29, 2017, 11:00:24 pm »
 :) 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

  • Hero Member
  • *****
  • Posts: 2737
Re: OpenCL Pascal Wrapper - Any Feature Request?
« Reply #1 on: September 29, 2017, 11:31:03 pm »
I'll create a generic pascal wrapper (class) to make it simpler to run OpenCL kernels.

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

  • Full Member
  • ***
  • Posts: 223
Re: OpenCL Pascal Wrapper - Any Feature Request?
« Reply #2 on: September 29, 2017, 11:59:39 pm »
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  [Select][+][-]
  1.   clReleaseMemObject(input);
  2.   clReleaseMemObject(output);
  3.   clReleaseProgram(prog);
  4.   clReleaseKernel(kernel);
  5.   clReleaseCommandQueue(commands);
  6.   clReleaseContext(context);
  7.  

Phil

  • Hero Member
  • *****
  • Posts: 2737
Re: OpenCL Pascal Wrapper - Any Feature Request?
« Reply #3 on: September 30, 2017, 12:02:38 am »
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.

Sounds good.


schuler

  • Full Member
  • ***
  • Posts: 223
Re: OpenCL Pascal Wrapper - Any Feature Request?
« Reply #4 on: October 18, 2017, 12:47:47 am »
 :) Hello :)
The beta version is ready. This is how to compile OpenCL code using TEasyOpenCL:

Code: Pascal  [Select][+][-]
  1.     procedure CompileProgramFromFile(filename:string); overload;
  2.     procedure CompileProgram(programsource: TStrings); overload;
  3.     procedure CompileProgram(programsource: string);   overload;

This is how to create, run and wait to finish an OpenCL kernel:

Code: Pascal  [Select][+][-]
  1.     function CreateKernel(kernelname: string): cl_kernel;
  2.     function RunKernel(pkernel:cl_kernel; ThreadCount: integer): integer;
  3.     function Finish():integer;

This is how to work with buffers (input/output OpenCL parameters):
Code: Pascal  [Select][+][-]
  1.     function CreateBuffer(flags: cl_mem_flags; size: csize_t): cl_mem;
  2.     function WriteBuffer(buffer: cl_mem; cb: csize_t; ptr: Pointer): integer;
  3.     function ReadBuffer(buffer: cl_mem; cb: csize_t; ptr: Pointer): integer;

Your calling program will look like this:
Code: Pascal  [Select][+][-]
  1.   FOpenCL := TEasyOpenCL.Create();
  2.   FOpenCL.CompileProgramFromFile(filename);
  3.   kernel := FOpenCL.CreateKernel('minimize_error');
  4.   ...
  5.   input  := FOpenCL.CreateBuffer(CL_MEM_READ_ONLY, ArraySizeBytes);
  6.   output := FOpenCL.CreateBuffer(CL_MEM_WRITE_ONLY, ArraySizeBytes);
  7.  
  8.   FOpenCL.WriteBuffer(input, ArraySizeBytes, @Data);
  9.  
  10.   clSetKernelArg(kernel, 0, sizeof(cl_mem), @input);
  11.   clSetKernelArg(kernel, 1, sizeof(cl_mem), @output);
  12.   clSetKernelArg(kernel, 2, sizeof(longword), @Count);
  13.  
  14.   FOpenCL.RunKernel(kernel,threadcount);
  15.  
  16.   FOpenCL.Finish();
  17.   FOpenCL.ReadBuffer(output, ArraySizeBytes, @results);
  18. ...
  19.   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 :)
« Last Edit: October 18, 2017, 04:27:22 am by schuler »

 

TinyPortal © 2005-2018