Char *** в аргументе ядра OpenCL? - PullRequest
2 голосов
/ 30 января 2020

Мне нужно передать vector<vector<string>> ядру OpenCL. Какой самый простой способ сделать это? Передача char*** дает мне ошибку:

__kernel void vadd(
   __global char*** sets,
   __global int* m,
   __global long* result)
{}

ОШИБКА: clBuildProgram (CL_BUILD_PROGRAM_FAILURE)

1 Ответ

4 голосов
/ 30 января 2020

В OpenCL 1.x подобные вещи в принципе невозможны. Вам нужно будет преобразовать ваши данные так, чтобы они помещались в один буферный объект или, по крайней мере, в фиксированное количество буферных объектов. Указатели на хосте не имеют смысла на устройстве. (С помощью функции SVM в OpenCL 2 вы можете передавать значения указателя между кодом хоста и ядра, но вам все равно нужно убедиться, что память выделена таким образом, который подходит для этого.)

Один вариант, который я могу себе представить Принимая во внимание, что я ничего не знаю об остальной части вашей программы, выглядит так:

  1. Создайте буфер OpenCL для всех строк. Сложите количество байтов, необходимое для всех ваших строк. (возможно, включая нулевое завершение, в зависимости от того, что вы пытаетесь сделать)
  2. Создать буфер для поиска смещений начала строки (и, возможно, длины). Похоже, у вас есть 2 измерения поиска (вложенные векторы), поэтому то, как вы их раскроете, будет зависеть от того, все ли ваши внутренние векторы (второе измерение) одинакового размера или нет.
  3. Пишите ваши строки обратно в обратно в первый буфер, смещения начала записи (и длину, если необходимо) во втором буфере.
...