OpenCL: Difference between revisions

From David's Wiki
Line 262: Line 262:


==OpenGL Interop==
==OpenGL Interop==
===Textures===
See [https://software.intel.com/content/www/us/en/develop/articles/opencl-and-opengl-interoperability-tutorial.html OpenCL™ and OpenGL* Interoperability Tutoria].
See [https://software.intel.com/content/www/us/en/develop/articles/opencl-and-opengl-interoperability-tutorial.html OpenCL™ and OpenGL* Interoperability Tutoria].


Line 267: Line 269:
Note that <code>cl::Image</code> and <code>cl::Buffer</code> are not the same thing. A buffer is a contiguous section of memory whereas an image is a mipmapped texture. Interchanging them will result in <code>CL_INVALID_MEM_OBJECT</code> errors or similar.
Note that <code>cl::Image</code> and <code>cl::Buffer</code> are not the same thing. A buffer is a contiguous section of memory whereas an image is a mipmapped texture. 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.
I recommend writing to a separate buffer and copying to images.
===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====

Revision as of 14:41, 10 December 2020


Installation

Windows

If you're using an NVIDIA GPU, install the CUDA Toolkit.

Linux

https://gist.github.com/Brainiarc7/dc80b023af5b4e0d02b33923de7ba1ed

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 example

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.

C++ example

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 of uchar4 with 4 elements.

OpenGL Interop

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. A buffer is a contiguous section of memory whereas an image is a mipmapped texture. Interchanging them will result in CL_INVALID_MEM_OBJECT errors or similar. I recommend writing to a separate buffer and copying to images.

Buffers

Oregon State VBO Interop
cl::BufferGL

Advanced Topics

Local Memory v. Global Memory