Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How To Structure Large OpenCL Kernels?

I have worked with OpenCL on a couple of projects, but have always written the kernel as one (sometimes rather large) function. Now I am working on a more complex project and would like to share functions across several kernels.

But the examples I can find all show the kernel as a single file (very few even call secondary functions). It seems like it should be possible to use multiple files - clCreateProgramWithSource() accepts multiple strings (and combines them, I assume) - although pyopencl's Program() takes only a single source.

So I would like to hear from anyone with experience doing this:

  • Are there any problems associated with multiple source files?
  • Is the best workaround for pyopencl to simply concatenate files?
  • Is there any way to compile a library of functions (instead of passing in the library source with each kernel, even if not all are used)?
  • If it's necessary to pass in the library source every time, are unused functions discarded (no overhead)?
  • Any other best practices/suggestions?

Thanks.

like image 863
andrew cooke Avatar asked Oct 01 '11 18:10

andrew cooke


People also ask

What is kernel in OpenCL?

A kernel is essentially a function written in the OpenCL language that enables it to be compiled for execution on any device that supports OpenCL. The kernel is the only way the host can call a function that will run on a device. When the host invokes a kernel, many work items start running on the device.

What is workgroup size?

What is "work group" size in SYCL and how does it impact performance? A "work group" is a 1, 2 or 3 dimensional set of threads within the thread hierarchy and contains a set of "work items," and each of these work items maps to a "core" in a GPU.

What is work group OpenCL?

NDRangeKernel Work-Item within a Work-Group Execution In an OpenCL application, the body of a kernel function expresses the computation to be completed for a single work-item. The number of work-items to compute is specified in the enqueueNDRangeKernel command for the kernel as the global size argument.


2 Answers

I don't think OpenCL has a concept of multiple source files in a program - a program is one compilation unit. You can, however, use #include and pull in headers or other .cl files at compile time.

You can have multiple kernels in an OpenCL program - so, after one compilation, you can invoke any of the set of kernels compiled.

Any code not used - functions, or anything statically known to be unreachable - can be assumed to be eliminated during compilation, at some minor cost to compile time.

like image 76
grrussel Avatar answered Sep 18 '22 05:09

grrussel


In OpenCL 1.2 you link different object files together.

like image 42
Yoav Avatar answered Sep 19 '22 05:09

Yoav