【发布时间】:2013-07-07 17:58:52
【问题描述】:
AMD OpenCL 编程指南,第 6.3 节常量内存优化:
全局范围的常量数组。这些数组被初始化, 全局作用域,并且在常量地址空间中(如在 OpenCL 规范的第 6.5.3 节)。如果数组的大小是 低于 64 kB,它被放置在硬件常量缓冲区中;否则,它 使用全局内存。这方面的一个例子是数学查找表 功能。
我想使用这个“全局范围的常量数组”。我在纯 C 中有这样的代码
#define SIZE 101
int *reciprocal_table;
int reciprocal(int number){
return reciprocal_table[number];
}
void kernel(int *output)
{
for(int i=0; i < SIZE; i+)
output[i] = reciprocal(i);
}
我想把它移植到 OpenCL 中
__kernel void kernel(__global int *output){
int gid = get_global_id(0);
output[gid] = reciprocal(gid);
}
int reciprocal(int number){
return reciprocal_table[number];
}
我应该如何处理全局变量reciprocal_table?如果我尝试在其中添加 __global 或 __constant,则会收到错误消息:
global variable must be declared in addrSpace constant
我不想将 __constant int *reciprocal_table 从 kernel 传递到 reciprocal。是否可以以某种方式初始化全局变量?我知道我可以把它写成代码,但是还有其他方式吗?
附:我正在使用 AMD OpenCL
UPD 上面的代码只是一个例子。我有很多功能更复杂的代码。所以我想在程序范围内创建数组以在所有函数中使用它。
UPD2更改了示例代码并添加了来自编程指南的引用
【问题讨论】:
标签: memory-management global-variables constants opencl