【问题标题】:pointers to __global memory inside a __local struct指向 __local 结构中的 __global 内存的指针
【发布时间】:2012-07-26 14:20:46
【问题描述】:

我对 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 机器上成功编译。

我的驱动程序是here。 (这只是 Apple 的带有更改内核的演示程序)。它使用 gcc -o test test.c -framework OpenCL 在 OS X 上编译。

【问题讨论】:

    标签: c macos opencl


    【解决方案1】:

    在 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
    

    【讨论】:

    • 对,这就是我所期望的——但在我的硬件上,这不会发生。相反,编译失败并显示CL_BUILD_PROGRAM_FAILURE
    猜你喜欢
    • 2012-07-16
    • 2015-07-04
    • 1970-01-01
    • 2012-04-18
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多