【发布时间】:2021-07-12 01:15:05
【问题描述】:
我有以下示例代码:
int compute_stuff(int *array)
{
/* do stuff with array */
...
return x;
}
__kernel void my_kernel()
{
__local int local_mem_block[LENGTH*MY_LOCAL_WORK_SIZE];
int result;
/* do stuff with local memory block */
result = compute_stuff(local_mem_block + (LENGTH*get_local_id(0)));
...
}
以上示例在我的 NVIDIA 卡 (RTX 2080) 上编译和执行良好。
但是当我尝试在带有 AMD 卡的 Macbook 上编译时,出现以下错误:
error: passing '__local int *' to parameter of type '__private int *' changes address space of pointer
好的,那么我将“compute_stuff”函数更改为以下内容:
int compute_stuff(__local int *array)
现在 NVIDIA 和 AMD 都可以正常编译了,没问题... 但后来我又进行了一项测试,使用 WINE 在同一台 Macbook 上编译它(而不是在 bootcamp 中启动到 Windows),它给出了以下错误:
error: parameter may not be qualified with an address space
所以似乎不应该用地址空间来限定函数参数。很公平。但是如果我不这样做,那么本机 Windows 上的 AMD 会认为我正在尝试将指针的地址空间更改为 private(我猜是因为它假定所有函数参数都是私有的?)。
有什么好的方法来处理这个问题,以便所有三个环境都乐于编译它?作为最后的手段,我正在考虑简单地让程序检查构建是否在没有限定符的情况下失败,如果是,则替换“__local”限定符并再次构建......看起来像一个黑客,但它可以工作。
【问题讨论】:
标签: pointers memory opencl gpgpu