我需要在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 缓冲区?
我应该创建一个多维输入而不是一维数组吗?
答案 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
)