在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,那么该工作组中的其他工作项是否可以看到更改?
答案 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图形卡的带宽非常低)。