在openCl内核中使用“String”

我有一个关于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说我不能有一个可变大小的数组..

您不能在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]你几乎肯定会耗尽你所有的寄存器和溢出(即超慢速)。

如果你必须处理很长的可变长度的单词,那么你将不得不为每个具有primefaces的线程在本地内存中动态“分配”内存

 __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 ]; }