2

我对 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 上编译。

4

1 回答 1

0

在 AMD 硬件 6970 上,我查看了内核生成的 ISA 代码,但它是 NOOP,所以我认为内核不会被执行,因为没有指令只有初始化

ISA 视图。

; --------  Disassembly --------------------

00 NOP NO_BARRIER 
END_OF_PROGRAM

伊利诺伊州的视图

       ;ARGEND:__OpenCL_test_kernel
        func 1026 ; test                        ; @__OpenCL_test_kernel
        ; BB#0:                                 ; %entry
    ret_dyn
ret
endfunc ; test
于 2012-08-11T05:31:36.093 回答