我需要使用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 ...作为参数的类型,除非另有说明。
那么如何以其他方式说明这种数据类型呢?
答案 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端声明并将指针传递给本地内存。 您无法在没有任何初始化的情况下创建本地指针并在那里进行复制。 (见我的代码)