在openCl内核中使用“String”

时间:2014-10-21 17:03:47

标签: c opencl

我对OpenCl编程有疑问。场景是:我有一个从不同长度的文件中获取的单词列表,我必须将此列表传递给OpenCl内核。我试图使用由包含单词的char数组和包含大小的int组成的结构。但是这种解决方案不起作用,因为在内核中,我必须创建一个结构中指示大小的新数组,但内核不喜欢可变大小的数组。有一种方法可以实现这个解决方案(我的意思是为每个不同大小的线程创建一个数组)?如果没有这种方式的解决方案,我该怎么办? 谢谢:)

编辑:这是示例代码..我希望它澄清事情

typedef struct word{
    char word[100];
    int len;
}word_t;
__kernel void test(__global word_t *data,  __global res_t *result)
{
   size_t id=get_global_id(0);
   int size=0;
   size=data[id].len;
   char word[size];
   //working with the word

}

但是clBuildProgram说我不能拥有可变大小的数组..

1 个答案:

答案 0 :(得分:1)

您不能在OpenCL中使用这样的可变长度数组,因此如果您可以将字长限制为一个简单的解决方案,则可以使用固定的最大长度数组。

#define MAX_WORD_LEN 100
#define WORK_GROUP_SIZE 128

typedef struct word{
    char word[MAX_WORD_LEN];
    int len;
}word_t;

__kernel void test(__global word_t *data,  __global res_t *result)
{
   size_t id=get_global_id(0);
   int size=0;
   size=data[id].len;
   __local char word[MAX_WORD_LEN * WORK_GROUP_SIZE];
   //working with the word
   __local char* pThreadWord = &word[ MAX_WORD_LEN * id];
}

我已将数组放在本地内存中,就好像你char word[MAX_WORD_LENGTH]一样,你几乎肯定会用完所有寄存器并溢出(即超慢)。

如果你必须处理很长的可变长度的单词,那么你将不得不动态地分配"每个具有原子

的线程在本地内存中的内存
__kernel void test(__global word_t *data,  __global res_t *result)
{
   size_t id=get_global_id(0);
   int size=0;
   int size=data[id].len;
   // local memory "allocator"
   __local int offset = 0;
   volatile __local int* pOffset = &offset;
   __local char wordBuffer[BUFFER_SIZE];
   // "allocate" memory
   int myOffset = atomic_add( pOffset, size );
   //working with the word
   __local char* pThreadWord = &wordBuffer[ myOffset ];
}