Как обработать строку в ядре opencl из буфера N строк фиксированной длины? - PullRequest
0 голосов
/ 11 марта 2019

Мне необходимо обрабатывать N строк фиксированной длины параллельно на устройстве OpenCL.

Обработка строки включает в себя вызываемую функцию, которая принимает строку в качестве входных данных, представленную в виде буфера, и длину строки в этом буфере.

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

Внутри хост-приложенияЯ объединил N строк в большой буфер символов без разделителя между ними.

Я хотел бы создать ядро ​​с определением, аналогичным

__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 голосов
/ 12 марта 2019

Ваш вопрос не ясен на 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 в данном случае)

...