将async_work_group_copy与自定义数据类型一起使用

时间:2016-06-23 02:41:24

标签: opencl

我需要使用async_work_group_copy将一些数据从__global复制到openCL中的__local。问题是,我没有使用内置数据类型。

我尝试过的代码片段如下:

typedef struct Y
{
    ...
} Y;

typedef struct X
{
    Y y[MAXSIZE];
} X;

kernel void krnl(global X* restrict x){ 
    global const Y* l = x[a].y;

    local Y* l2;

    size_t sol2 = sizeof(l);

    async_work_group_copy(l2, l, sol2, 0);
}

其中'a'只是int的向量。此代码不起作用,特别是因为gen_type不是内置的。规范(1.2)说:

  

我们使用泛型类型名称gentype来指示内置数据   types ...作为参数的类型,除非另有说明。

那么如何以其他方式说明这种数据类型呢?

1 个答案:

答案 0 :(得分:3)

OpenCL async_work_group_copy()旨在复制基本数据类型的N个元素。然而,它并不真正知道被复制的内容。所以你可以告诉它复制N个字节,里面包含任何类型(包括结构)。与memcpy()类似。

你可以这样做:

kernel void krnl(global X* restrict x){ 
    global const Y* l = x[a].y;
    local Y l2;

    size_t sol2 = sizeof(Y);

    async_work_group_copy((local char *)&l2, (global char *)l, sol2, 0);
}

但是,请记住,您需要在内核中显式声明本地内存,或者从API端声明并将指针传递给本地内存。 您无法在没有任何初始化的情况下创建本地指针并在那里进行复制。 (见我的代码)