使用;“字符串”;在openCl内核中

使用;“字符串”;在openCl内核中,c,opencl,C,Opencl,我有一个关于OpenCl编程的问题。场景是:我有一个从不同长度的文件中提取的单词列表,我必须将这个列表传递给OpenCl内核。我尝试使用由包含单词的char数组和包含大小的int组成的结构。但是这种解决方案不起作用,因为在内核中,我必须创建一个新的数组,其大小如结构中所示,但是内核不喜欢大小可变的数组。有一种方法可以实现这个解决方案(我的意思是为不同大小的每个线程创建一个数组)?如果没有这样的解决办法,我该怎么办? 谢谢:) 编辑:这是示例代码。。我希望它能澄清问题 typedef struct

我有一个关于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\u-word\u-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 ];
}

请提供一些代码,很难看到您正在尝试执行的操作。感谢您的回答。。我已经编辑了主要帖子,谢谢你提供了这个可能的解决方案。我会尽快试一试。非常感谢你,真的!