2013-02-01 60 views
0

我想传递一个结构的OpenCL内核,该结构是传递结构的OpenCL内核

struct test 
{ 
    int *x; 
    float *y; 
    char *z; 
}; 

和存储器分配和初始化是像

struct test t; 
t.x = (int*)malloc(sizeof(int)*100); 
t.y = (float*) malloc (sizeof(float)*50); 
t.z = (char*) malloc (sizeof(char) *25); 
    for(i = 0;i<100;i++) 
    { 
     t.x[i] = i; 
     if(i<50) 
      { 
       t.y[i] = i; 
      if(i<25) 
       t.z[i] = 'a'; 
      } 
    } 

我可以通过这样的结构,以opencl内核

+0

不要这样做。首先,它没有任何意义,其次,你的结构包含指针并且没有意义。更不用说不同的对齐和数据类型宽度。如果你想传递结构,你肯定是做错了事,现在是重新考虑你的架构的时候了。 –

回答

2

可以通过这样的结构,但它会毫无意义,因为x,yz指向不同的存储区域。每个这些内存缓冲区都必须自行传输。

+0

是的,你是对的;它不仅毫无意义,甚至也不可能将这个结构作为一个单元来传递,因为它们指向不同的存储位置。 但是如果我有非常大的结构(意味着具有超过10-15个参数的结构),我还需要一个一个地通过它们,或者有什么解决方案。 – Meluha

+0

不幸的是,内核使用的每个内存缓冲区都必须通过'clSetKernelArg'显式设置。但是,也许,你可以更多地分解你的问题? – matthias

0

取代结构,它更好地在主机端分配内存并将它们作为内核参数发送给内核。