任何解决方案?
这甚至可能吗?
__global *float abc; // pointer to global memory stored in private memory
我希望 abc 存储在本地内存而不是私有内存中。
我认为这在清单 5.2 中得到了澄清:
__global int global_data[128]; // 128 integers allocated on global memory
__local float *lf; // pointer placed on the private memory, which points to a single-precision float located on the local memory
__global char * __local lgc[8]; // 8 pointers stored on the local memory that points to a char located on the global memory
正如我对指针的理解:[它们指向的位置]类型* [存储位置]名称;
好吧,我之前也遇到过和你类似的问题,正如我探索的那样,我认为它是这样工作的:在 OpenCL 内核中,没有地址限定符(__local、__global 等)的内核中的变量将被自动考虑为存储在 __private 内存空间中。对于未使用空间限定符声明的指针,它也将被视为指向 __private 空间。这是一个示例代码片段:
__kernel void foo(__global uint *ptr)
{
uint tid = get_global_id(0);
uint * localPtr = ptr;
uint var= *(localPtr + tid);
... ...
}
在上面的代码片段中,localPtr 是一个没有内存空间限定符的 uint 类型指针,所以会自动认为指向 _私有内存空间。在 OpenCL 中,指向地址空间 A(例如 _global)的指针只能分配给指向同一地址空间(__global)的指针。所以在上面的例子中,指向 __private 地址空间的指针不能用指向 __global 地址的指针 (ptr) 来分配。(关于这一点,您还可以参考“地址空间限定符”部分中的 OpenCL 规范)。希望这会有所帮助!
这是合法的:
global uint *globalPtr=&ptr[tid]