【问题标题】:Using "String" in openCl Kernel在 openCl 内核中使用“字符串”
【发布时间】:2014-10-21 17:03:46
【问题描述】:

我有一个关于 OpenCl 编程的问题。场景是:我有一个从不同长度的文件中获取的单词列表,我必须将此列表传递给 OpenCl Kernel。我尝试使用由包含单词的 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 说我不能有一个可变大小的数组..

【问题讨论】:

  • 请提供一些代码,很难看出你在做什么。
  • 感谢您的回答。我已经编辑了主帖

标签: c opencl


【解决方案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 ];
}

【讨论】:

  • 感谢您提供这种可能的解决方案。我会尽快尝试。非常感谢,真的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 2011-12-06
相关资源
最近更新 更多