我对 OpenCL 编译器对存储在本地内存中的结构内指向全局内存的指针的响应感到困惑。这是一个最小的测试用例:
struct Helper {
unsigned char bytes[32769];
};
struct Main {
__global struct Helper *h;
};
void __kernel test(void)
{
__local struct Main m;
}
这在 clBuildProgram 期间失败,并出现错误CL_BUILD_PROGRAM_FAILURE
。但是,将上面的幻数从32769
更改为较小的数字允许程序编译。
失败时clBuildProgram
,不会通过clGetProgramBuildInfo(… CL_PROGRAM_BUILD_LOG)
. 系统日志中未报告任何错误。
32k 恰好是我的显卡(AMD Radeon HD 6750M)上每个计算单元的本地内存量。但正如你所看到的,我正在存储一个指向这个大型结构的指针,该结构将存储在全局内存中。我没有尝试在本地内存中创建结构本身。那么,为什么指向结构的大小会有所不同呢?
这个故障发生在我运行 OS X 10.8 的 Macbook Pro 上,并且在早期版本的 OS X 上也发生了故障。但是,它在我的带有 NVidia 显卡的 Linux 机器上成功编译。
我的驱动程序在这里。(这只是 Apple 的带有更改内核的演示程序)。它使用 gcc -o test test.c -framework OpenCL 在 OS X 上编译。