OpenCL implements the following disjoint address spaces: __global, __local, __constant
and __private.
The address space qualifier may be used in variable declarations to specify the region of memory that is used to allocate the object. The C syntax for type qualifiers is extended in OpenCL to include an address space name as a valid type qualifier. If the type of an object is qualified by an address space name, the object is allocated in the specified address name; otherwise, the object is allocated in the generic address space.
The address space names without the __ prefix i.e. global
, local
, constant
and private
may be substituted for the corresponding address space names with the __ prefix.
The generic address space name for arguments to a function in a program, or local variables of a function is __private
. All arguments to a __kernel
function shall be in the __private
address space.
__kernel function arguments declared to be a pointer of a type can point to one of the following address spaces only: __global
, __local
or __constant
. A pointer to address space A can only be assigned to a pointer to the same address space A. Casting a pointer to address space A to a pointer to address space B is illegal.
The __kernel
function arguments declared to be of type image2d_t or image3d_t
always point to the __global
address space. All program scope variables must be declared in the __constant
address space.
The __constant
or constant
address space name is used to describe variables allocated in
global memory and which are accessed inside a kernel(s) as read-only variables. These read-
only variables can be accessed by all (global) work-items of the kernel during its execution. This
qualifier can be used with arguments to functions
(including __kernel
functions) that are
declared as pointers, or with local variables inside a function declared as pointers, or with global
variables. Global variables declared in the program source
with the __constant
qualifier are
required to be initialized.
Writes to variables declared with the __constant
address space qualifier in the OpenCL program source should be a compile-time error.
// declares a pointer p in the __private address space that // points to an int object in address space __global __global int *p; // declares an array of 4 floats in the __private address space. float x[4]; |