OpenCL - 将结构体从全局内存复制到本地内存

时间:2012-06-18 12:16:43

标签: opencl gpgpu

我有一个struct Primitive,它有以下定义:

typedef struct Primitive {
    float m[12];
    float invm[12];
    enum PrimitiveType type;
    int rayDensity;
    float util1;             
    float util2;                
} Primitive;

我在一个常量内存缓冲区中将这些结构的数组传递给我的内核:

__constant Primitive *objects;

作为优化练习的一部分,我想看一下将结构加载到本地内存中,所以我的内核有这样的代码:

__kernel void test(int n_objects, __constant Primitives *objects) {
    local Primitive pFrom, pTo;

    for(int i = 0; i < n_objects; i++) {
        pFrom = objects[i]; 
    }

}

当我运行这个时,我收到一个编译错误:

ptxas application ptx input, line 42; error: State space mismatch between instruction and address in instruction 'ld'

作为一项实验,我首先尝试将结构复制到私有变量,然后复制到本地变量,如下所示:

__kernel void test(int n_objects, __constant Primitives *objects) {
    Primitive pF, Pt;
    local Primitive pFrom, pTo;

    for(int i = 0; i < n_objects; i++) {
        pF = objects[i]
        pFrom = pF; 
    }

}

现在编译并运行,但似乎对象没有被深深地复制到局部变量pFrom中。

请注意,我的代码示例纯粹是示例,为了简洁起见,我删除了所有内容。当我直接从常量全局内存中使用原始结构时,我的代码也能正常工作。

有谁知道我在这里缺少什么,当然这是深度复制或OpenCL地址空间的一些基本基础。

1 个答案:

答案 0 :(得分:1)

您需要的是async_work_group_copy function。您可以等待此异步操作以完成wait_group_events功能。

希望这有帮助。