如何从N个固定长度字符串的缓冲区中处理opencl内核中的字符串?

时间:2019-03-11 14:12:55

标签: parallel-processing opencl

我需要在OpenCL设备上并行处理N个固定长度的字符串。

处理字符串涉及调用提供的函数,该函数将字符串作为输入表示为缓冲区,并说明该缓冲区中字符串的长度。

void Function(const char *input_buffer, const int string_length, const char *output_buffer)

在主机应用程序内部,我已将N个字符串串联成一个大的char缓冲区,它们之间没有分隔符。

我想创建一个定义类似于

的内核
__kernel void myKernel(global char *buffer_of_strings, char length_of_string, global char *output_buffer) {

     char *string_input = ??? (no dynamic allocation allowed)
     Function(string_input, length_of_string, output_buffer);
}

在所有内核中,只有一个会“成功”并写入输出缓冲区。

由于字符串长度会有所不同,如何将* global char buffer_of_strings 的子范围分配给 string_input 缓冲区?

我应该创建一个多维输入而不是一维数组吗?

1 个答案:

答案 0 :(得分:0)

您的问题不是100%清楚,因此在回答之前,我将简要概述我对情况的理解:

您有一个buffer_of_strings,其中包含N个字节的length_of_string个字符串。这意味着每个字符串从缓冲区的偏移量i * length_of_string开始:

      +--------length_of_string--------+
      |          |          |          |
 <----+----><----+----><----+----><----+---->
"String0    String1    Str2       String3    "
 ^          ^                     ^
 |          |                     |
 0     (1 * length_of_string)     (3 * length_of_string)

因此,使用普通的老式指针算术,我将得到以下结果:

__kernel void myKernel(global char *buffer_of_strings, char length_of_string, global char *output_buffer) {
     uint offset = get_global_id(0) * length_of_string;
     global char *string_input = buffer_of_strings + offset;
     Function(string_input, length_of_string, output_buffer);
}

确保用适当的内存区域注释所有指针。 (在这种情况下,{global