我对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说我不能拥有可变大小的数组..
答案 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 ];
}