gpt4 book ai didi

c - 在 openCl 内核中使用 "String"

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:48 26 4
gpt4 key购买 nike

我有一个关于 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] 一样,您几乎肯定会用完所有寄存器并溢出(即超慢)。

如果您确实必须处理非常长的可变长度单词,那么您将不得不在本地内存中为每个具有原子的线程动态“分配”内存

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

关于c - 在 openCl 内核中使用 "String",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26492263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com