OpenCL结构声明在不同的内存空间中

时间:2011-11-05 16:25:10

标签: opencl gpgpu gpu-programming

在OpenCL中,以下结构声明之间的结果和差异是什么。如果它们是非法的,为什么?

struct gr_array
{
    int ndims;
    __global m_integer* dim_size;
    __global m_real* data;
};
typedef struct gr_array g_real_array;

struct lr_array
{
    int ndims;
    __local m_integer* dim_size;
    __local m_real* data;
};
typedef struct lr_array l_real_array;

__ kernel temp(...){

        __local g_real_array A;
        g_real_array B;

        __local l_real_array C;
        l_real_array D;

}

我的问题是结构将被分配到哪里(和成员)?谁可以访问它们?这是一个好的做法吗?

修改

这个怎么样

struct r_array
    {
       __local int ndims;
    };

typedef struct r_array real_array;

__ kernel temp(...){

        __local real_array A;
        real_array B;

}

如果工作项修改了struct B中的ndims,那么该工作组中的其他工作项是否可以看到更改?

2 个答案:

答案 0 :(得分:2)

我已将您的代码重写为有效的CL,或至少将编译的CL。这里:

typedef struct gr_array {
    int ndims;
    global int* dim_size;
    global float* data;
} g_float_array;

typedef struct lr_array {
    int ndims;
    local int* dim_size;
    local float* data;
} l_float_array;

kernel void temp() {
    local g_float_array A;
    g_float_array B;

    local l_float_array C;
    l_float_array D;
}

一个接一个,这就是崩溃的原因:

  • A在当地空间。它是一个由一个int和两个指针组成的结构。这些指针指向全局空间中的数据,但它们本身是在本地空间中分配的。

  • B在私人空间;这是一个自动变量。它由一个int和两个指针组成,指向全局内存中的东西。

  • C位于本地空间。它包含一个int和两个指向本地空间内容的指针。

  • D,你可以猜到这一点。它位于私有空间中,包含一个int和两个指向本地空间内容的指针。

我不能说你的问题是否更可取,因为你还没有描述你想要实现的目标。

编辑:我意识到我没有解决你问题的第二部分 - 谁可以访问结构字段。

好吧,您可以访问变量在范围内的任何位置。我猜你在认为你在g_float_array中标记为全局的字段是全局空间(l_float_array的局部空间)。但他们只是指向到全球(或本地)空间的东西。

所以,你会像这样使用它们:

kernel void temp(
            global float* data, global int* global_size,
            local float* data_local, local int* local_size,
            int num) 
{
    local g_float_array A;
    g_float_array B;

    local l_float_array C;
    l_float_array D;

    A.ndims = B.ndims = C.ndims = D.ndims = num;

    A.data = B.data = data;
    A.dim_size = B.dim_size = global_size;

    C.data = D.data = data_local;
    C.dim_size = D.dim_size = local_size;
}

顺便说一下 - 如果你在运行Lion的Mac上攻击CL,你可以使用“离线”CL编译器编译.cl文件,这使得尝试这种东西更容易一些。它位于:

/System/Library/Frameworks/OpenCL.framework/Libraries/openclc

有一些示例代码here

答案 1 :(得分:0)

它可能不起作用,因为当前的GPU-s对OpenCL内核和普通程序有不同的内存空间。您必须在两个空间之间进行显式调用以传输数据,这通常是程序的瓶颈(因为PCI-X图形卡的带宽非常低)。