我对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上也失败了。但是,它在我的Linux机器上使用NVidia显卡成功编译。
我的驱动程序是here。 (这只是Apple改进内核的演示程序)。它使用gcc -o test test.c -framework OpenCL在OS X上编译。
答案 0 :(得分:0)
在AMD硬件6970上,我查看了内核生成的ISA代码,但它是一个NOOP,所以我不认为内核会被执行,因为没有指令只有初始化
ISA的观点。
; -------- Disassembly --------------------
00 NOP NO_BARRIER
END_OF_PROGRAM
IL的视图
;ARGEND:__OpenCL_test_kernel
func 1026 ; test ; @__OpenCL_test_kernel
; BB#0: ; %entry
ret_dyn
ret
endfunc ; test