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.
All variables inside a function (including __kernel
functions),
or passed into the function as arguments are in the __private
or private
address space. Variables declared as pointers are considered to point to the __private
address space if an address space qualifier is not specified except for arguments declared to be of type image2d_t and image2d_t which implicitly point to the __global
address space.
// 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]; |