代码改变世界

OpenCL参数存储器类型

2014-01-02 10:16  valerlina  阅读(1237)  评论(0编辑  收藏  举报

转自:http://blog.csdn.net/eric41050808/article/details/16341227

opencl内核参数分为global/local/constant/private四种。定义时需要使用地址空间限定符来指定,限定符分别为__global/__local/__constant/__private,空间位置前加两个下划线。

下面总结几条定义的规律:

private:

1.未指定地址空间的变量默认为private类型;

2.内核函数的参数声明时,指针参数不能指定为private,不能缺省地址空间限定符,如例1;

global:

3.全局地址限定符,__global,只能用来限制指针型数据(全局地址空间的指针可以作为函数的参数和函数内声明的变量);

4.全局地址限定符,不能用来限定图像类型image2d_t;

constant:

5.常量地址空间限定符,用来描述只读全局内存地址空间的变量,即是全局变量,只读。

6.图像类型,image2d_t,不能在常量地址空间分配;

7.常量地址空间的指针可以作为函数的参数和函数内声明的变量;

local:

8.同一个workgroup内的工作项通用一个局部地址空间,__local。
9.内核函数中声明的变量可以在local空间分配,但又一下限制,如例2:
a.声明必须出现在内核函数作用域;
b.不能被初始化;

例1.__kernel void my_func(int *p){}//不允许内核指针类型参数为private
例2.
__kernel void my_func(__local float *para)
{
local float4 *p;//合法
local float4 a; //合法
local float4 b = (float4)(0);//不合法,不能初始化
if(...)
{
local float c;//不合法,不在内核函数作用域
}
}