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
。是否可以以某种方式初始化全局变量?我知道我可以把它写成代码,但是还有其他方法吗?
PS 我正在使用 AMD OpenCL
UPD上面的代码只是一个例子。我有很多功能更复杂的代码。所以我想在程序范围内创建数组以在所有函数中使用它。
UPD2更改了示例代码并添加了编程指南中的引用