如何在 opencl c 内核上使用 vector<char**> 缓冲区或使用此向量设置 SVM?

Posted

技术标签:

【中文标题】如何在 opencl c 内核上使用 vector<char**> 缓冲区或使用此向量设置 SVM?【英文标题】:How could I use a vector<char**> buffer on opencl c kernel or set a SVM with this vector? 【发布时间】:2019-11-05 17:05:00 【问题描述】:

我正在尝试分配一个向量(字符串数组)来存储 2 个或更多 char(字节),但 OpenCL 内核的编译器(clang)在声明 char**compressedBytes 数组时抛出以下错误kernel parameter cannot be declared as a pointer to a pointer

内核: https://gist.github.com/PontiacGTX/0f0897ac1eaf93cb04a5c1e3c205dc4b

主持人: https://gist.github.com/PontiacGTX/745b4942acab0c7213dee1fede6a8e35

内核编译器错误是:

创建内核 1 失败

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:31:111:错误:内核参数不能声明为指向指针的指针 __kernel void CopyBytes(__global unsigned char const* fileBytes,unsigned long length,__global unsigned char**compressedBytes, __global unsigned long* arrayCountCompressedBytes) ^

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:40:16:警告:不兼容的整数到指针转换初始化 'const __generic char ' 使用类型为 'int' 的表达式 const char str=fileBytes[i] + fileBytes[i+1]; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:41:9:警告:不兼容的指针类型将“__global unsigned char *__generic *”传递给“const __global char *__generic”类型的参数*' Find(compressedBytes,size,str,found); ^~~~~~~~~~~~~~~~~~

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:10:33:注意:在此处将参数传递给参数“开始” void Find(__global const char** begin,unsigned long length, const char* val,int found) ^

C:\Users\PONTIA~1\AppData\Local\Temp\OCL4936T1.cl:45:23:错误:将“const __generic char *”分配给“__global unsigned char *__generic”会更改指针的地址空间 压缩字节[i]=str; ^~~~

【问题讨论】:

OpenCL 不支持指向内核内部随机内存的指针。所以没有指针的指针,所有你有cl_buffers形式的线性内存块 @Quimby 所以我唯一的选择是使用另一个包含字符串长度和 char* 数组的数组?有人说 SVM 允许分配带有指针 ***.com/a/26144016/11493865 的缓冲区,所以无论哪种方式使用 SVM,我都需要另一个具有字符串长度的数组? 对于 SVM,您必须至少使用 OpenCL 2.0 - 你有吗? @HEKTO 是的,但如果我需要 spir 做任何事情,不要指望它,因为 AMD 放弃了支持,只能使用来自 APP SDK 的 Opencl 2.0 也检查过,它似乎支持 unsigned long long 但只能分配如果我在 2 个指针 clang(AMD 的 opencl 编译器)之间进行一些运算算术运算,则一个变量到另一个变量会引发错误 【参考方案1】:

OpenCL 不支持指向内核内部随机内存的指针。所以 没有指针的指针,所有你有线性内存块 cl_buffers 的形式——Quimby

【讨论】:

以上是关于如何在 opencl c 内核上使用 vector<char**> 缓冲区或使用此向量设置 SVM?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

从 OpenCL 内核修改 VBO 数据

如何正确初始化此 C++ for openCL 内核的输入/输出参数?

如何在 Nvidia GPU 上调试 OpenCL?

OpenCL 内核中的组内同步,在本地内存上使用自旋锁

OpenCL 在内存和性能方面,在内核代码中使用用户定义函数的效率如何