【问题标题】:Using async_work_group_copy with a custom data type将 async_work_group_copy 与自定义数据类型一起使用
【发布时间】:2016-06-23 11:09:14
【问题描述】:

我需要使用 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 ... 作为参数的类型,除非另有说明。

那么我该如何声明这种数据类型呢?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    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 端动态声明并传递指向本地内存的指针。 您不能只创建一个没有任何初始化的本地指针并在那里复制。 (见我的代码)

    【讨论】:

      猜你喜欢
      • 2014-04-08
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多