OpenCL: Difference between revisions

From David's Wiki
Line 246: Line 246:
==Usage==
==Usage==
===Types===
===Types===
[https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/scalarDataTypes.html Scalar Data Types]
[https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/scalarDataTypes.html 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>
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>
 


==Advanced Topics==
==Advanced Topics==
====Local Memory v. Global Memory====
====Local Memory v. Global Memory====

Revision as of 16:50, 31 October 2019


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/

__kernel void vector_add(__global const int *A, __global const int *B, __global int *C) {
 
    // Get the index of the current element to be processed
    int i = get_global_id(0);
 
    // Do the operation
    C[i] = A[i] + B[i];
}
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/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

Types

Scalar Data Types
While all OpenCL devices support single-precision floats, not all support double-precision doubles.
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()

Advanced Topics

Local Memory v. Global Memory