OpenCL: Difference between revisions
No edit summary |
|||
(16 intermediate revisions by the same user not shown) | |||
Line 6: | Line 6: | ||
===Linux=== | ===Linux=== | ||
https://gist.github.com/Brainiarc7/dc80b023af5b4e0d02b33923de7ba1ed | https://gist.github.com/Brainiarc7/dc80b023af5b4e0d02b33923de7ba1ed | ||
<pre> | |||
sudo apt install ocl-icd-opencl-dev opencl-headers | |||
sudo apt install opencl-c-headers opencl-clhpp-headers | |||
</pre> | |||
==Getting Started== | ==Getting Started== | ||
Line 13: | Line 17: | ||
See https://www.eriksmistad.no/getting-started-with-opencl-and-gpu-computing/ | See https://www.eriksmistad.no/getting-started-with-opencl-and-gpu-computing/ | ||
{{hidden | C example | | |||
vector_add_kernel.cl | |||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
__kernel void vector_add(__global const int *A, __global const int *B, __global int *C) { | __kernel void vector_add(__global const int *A, __global const int *B, __global int *C) { | ||
Line 23: | Line 29: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
Line 136: | Line 142: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
}} | |||
===C++=== | ===C++=== | ||
[https://github.khronos.org/OpenCL-CLHPP/index.html#intro C++ Bindings]<br> | [https://github.khronos.org/OpenCL-CLHPP/index.html#intro C++ Bindings]<br> | ||
While you can use the C bindings in your C++ application, Khronos also provides a set of C++ bindings in <code>CL/cl2.hpp</code> which are much easier to use alongside std containers such as <code>std::vector</code>. When using C++ bindings, you also do not need to worry about releasing buffers since these are reference-counted. | While you can use the C bindings in your C++ application, Khronos also provides a set of C++ bindings in <code>CL/cl.hpp</code> (or <code>CL/cl2.hpp</code>) which are much easier to use alongside std containers such as <code>std::vector</code>. | ||
When using C++ bindings, you also do not need to worry about releasing buffers since these are reference-counted. | |||
{{hidden | C++ example | | {{hidden | C++ example | | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
Line 238: | Line 246: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
}} | }} | ||
===Python=== | |||
See [https://documen.tician.de/pyopencl/index.html pyopencl]. | |||
===Julia=== | ===Julia=== | ||
Line 243: | Line 254: | ||
==Usage== | ==Usage== | ||
===Types=== | ===Scalar Types=== | ||
[https://www.khronos.org/registry/OpenCL/sdk/1. | [https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/scalarDataTypes.html OpenCL 1.2 Scalar Data Types]<br> | ||
While all OpenCL devices support single-precision floats, not all support double-precision doubles.<br> | While all OpenCL devices support single-precision floats, not all support double-precision doubles.<br> | ||
===Vector Types=== | |||
[https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/dataTypes.html OpenCL Data Types]<br> | |||
[https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/vectorDataTypes.html OpenCL 1.2 Vector Data Types]<br> | |||
Just like glsl, OpenCL supports vector types such | Just like glsl, OpenCL supports vector types such | ||
<syntaxhighlight lang="c">float3 my_vec = (float3)(1.0);</syntaxhighlight> | <syntaxhighlight lang="c">float3 my_vec = (float3)(1.0);</syntaxhighlight> | ||
where its elements are accessed using x,y,z as <code>my_vec.x</code>.<br> | where its elements are accessed using x,y,z as <code>my_vec.x</code>.<br> | ||
To convert between vector types, use <code>convert_T()</code><br> | |||
;Notes | |||
* 3-component data types are aligned to 4 components. I.e. an array of <code>uchar3</code> with 4 elements will be equivalent to an array of <code>uchar4</code> with 4 elements. | |||
==OpenGL Interop== | |||
Setting up OpenCL/OpenGL interop is fairly complicated and very hard to debug. | |||
You will also need to manage synchronizing OpenGL/OpenCL so they do not access the same memory at the same time. | |||
If you can, just use OpenGL compute shaders rather than OpenCL to simplify your life. | |||
===Textures=== | |||
See [https://software.intel.com/content/www/us/en/develop/articles/opencl-and-opengl-interoperability-tutorial.html OpenCL™ and OpenGL* Interoperability Tutoria]. | |||
In C++, you can use [https://github.khronos.org/OpenCL-CLHPP/classcl_1_1_image_g_l.html <code>cl::ImageGL</code>] to access textures in OpenGL. | |||
Note that <code>cl::Image</code> and <code>cl::Buffer</code> are not the same thing. Interchanging them will result in <code>CL_INVALID_MEM_OBJECT</code> errors or similar. | |||
I recommend writing to a separate buffer and copying to images. | |||
See [https://www.khronos.org/registry/OpenCL/sdk/2.2/docs/man/html/clCreateFromGLTexture.html clCreateFromGLTexture] to get a list of compatible pixel formats. | |||
If in doubt, use <code>GL_RGBA8</code> which is the most likely format to be supported. | |||
===Buffers=== | |||
[https://web.engr.oregonstate.edu/~mjb/cs575/Handouts/opencl.opengl.vbo.1pp.pdf Oregon State VBO Interop] | |||
[https://github.khronos.org/OpenCL-CLHPP/classcl_1_1_buffer_g_l.html cl::BufferGL] | |||
==Advanced Topics== | ==Advanced Topics== | ||
====Local Memory v. Global Memory==== | ====Local Memory v. Global Memory==== | ||
[[Category:Programming languages]] | |||
[[Category:GPU Programming languages]] |
Latest revision as of 16:47, 31 January 2022
Installation
Windows
If you're using an NVIDIA GPU, install the CUDA Toolkit.
Linux
https://gist.github.com/Brainiarc7/dc80b023af5b4e0d02b33923de7ba1ed
sudo apt install ocl-icd-opencl-dev opencl-headers sudo apt install opencl-c-headers opencl-clhpp-headers
Getting Started
Compiling
OpenCL kernels are compiled at runtime. All you have to do is link OpenCL when compiling your program and include your kernels in your program. For gcc
just add flag -lOpenCL
C
See https://www.eriksmistad.no/getting-started-with-opencl-and-gpu-computing/
C++
C++ Bindings
While you can use the C bindings in your C++ application, Khronos also provides a set of C++ bindings in CL/cl.hpp
(or CL/cl2.hpp
) which are much easier to use alongside std containers such as std::vector
.
When using C++ bindings, you also do not need to worry about releasing buffers since these are reference-counted.
Python
See pyopencl.
Julia
See OpenCL.jl.
Usage
Scalar Types
OpenCL 1.2 Scalar Data Types
While all OpenCL devices support single-precision floats, not all support double-precision doubles.
Vector Types
OpenCL Data Types
OpenCL 1.2 Vector Data Types
Just like glsl, OpenCL supports vector types such
float3 my_vec = (float3)(1.0);
where its elements are accessed using x,y,z as my_vec.x
.
To convert between vector types, use convert_T()
- Notes
- 3-component data types are aligned to 4 components. I.e. an array of
uchar3
with 4 elements will be equivalent to an array ofuchar4
with 4 elements.
OpenGL Interop
Setting up OpenCL/OpenGL interop is fairly complicated and very hard to debug.
You will also need to manage synchronizing OpenGL/OpenCL so they do not access the same memory at the same time.
If you can, just use OpenGL compute shaders rather than OpenCL to simplify your life.
Textures
See OpenCL™ and OpenGL* Interoperability Tutoria.
In C++, you can use cl::ImageGL
to access textures in OpenGL.
Note that cl::Image
and cl::Buffer
are not the same thing. Interchanging them will result in CL_INVALID_MEM_OBJECT
errors or similar.
I recommend writing to a separate buffer and copying to images.
See clCreateFromGLTexture to get a list of compatible pixel formats.
If in doubt, use GL_RGBA8
which is the most likely format to be supported.
Buffers
Oregon State VBO Interop
cl::BufferGL