使用;“字符串”;在openCl内核中
我有一个关于OpenCl编程的问题。场景是:我有一个从不同长度的文件中提取的单词列表,我必须将这个列表传递给OpenCl内核。我尝试使用由包含单词的char数组和包含大小的int组成的结构。但是这种解决方案不起作用,因为在内核中,我必须创建一个新的数组,其大小如结构中所示,但是内核不喜欢大小可变的数组。有一种方法可以实现这个解决方案(我的意思是为不同大小的每个线程创建一个数组)?如果没有这样的解决办法,我该怎么办? 谢谢:) 编辑:这是示例代码。。我希望它能澄清问题使用;“字符串”;在openCl内核中,c,opencl,C,Opencl,我有一个关于OpenCl编程的问题。场景是:我有一个从不同长度的文件中提取的单词列表,我必须将这个列表传递给OpenCl内核。我尝试使用由包含单词的char数组和包含大小的int组成的结构。但是这种解决方案不起作用,因为在内核中,我必须创建一个新的数组,其大小如结构中所示,但是内核不喜欢大小可变的数组。有一种方法可以实现这个解决方案(我的意思是为不同大小的每个线程创建一个数组)?如果没有这样的解决办法,我该怎么办? 谢谢:) 编辑:这是示例代码。。我希望它能澄清问题 typedef struct
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 ];
}
请提供一些代码,很难看到您正在尝试执行的操作。感谢您的回答。。我已经编辑了主要帖子,谢谢你提供了这个可能的解决方案。我会尽快试一试。非常感谢你,真的!