2

我需要将 a 传递vector<vector<string>>给内核 OpenCL。最简单的方法是什么?传递 achar***给我一个错误:

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

错误:clBuildProgram(CL_BUILD_PROGRAM_FAILURE)

4

1 回答 1

4

在 OpenCL 1.x 中,这种事情基本上是不可能的。您需要转换数据,使其适合单个缓冲区对象,或至少适合固定数量的缓冲区对象。主机上的指针在设备上没有意义。(使用 OpenCL 2 的 SVM 功能,您可以在主机和内核代码之间传递指针值,但您仍然需要确保以适合此的方式分配内存。)

我能想到的一个选择,记住我对你程序的其余部分一无所知,如下:

  1. 为所有字符串创建一个 OpenCL 缓冲区。将所有字符串所需的字节数相加。(可能包括 nul 终止,具体取决于您要执行的操作)
  2. 创建一个用于查找字符串起始偏移量(可能还有长度)的缓冲区。看起来您有 2 个维度的查找(嵌套向量),因此您如何布局将取决于您的内部向量(第二个维度)是否都相同大小。
  3. 将您的字符串背靠背写入第一个缓冲区,在第二个缓冲区中记录起始偏移量(和长度,如有必要)。
于 2020-01-30T19:15:59.413 回答