【发布时间】:2015-08-01 08:18:17
【问题描述】:
有几个类似的字符串
std::string 第一、二、三; ...
我的计划是将他们的地址收集到一个 char* 数组中:
char *addresses = {&first[0], &second[0], &third[0]} ...
并将 char **地址传递给 OpenCL 内核。
有几个问题或疑问:
主要问题是我无法传递指针数组。
有什么好的方法可以使用内核代码中的多对多字符串而不复制它们,而是将它们留在共享内存中?
我在 Windows 上使用 NVIDIA。所以,我只能使用 OpenCL 1.2 版本。
我无法连接字符串,因为它们来自不同的结构...
编辑:
根据第一个答案,如果我有这个(示例):
char *p;
cl_mem cmHostString = clCreateBuffer(myDev.getcxGPUContext(), CL_MEM_ALLOC_HOST_PTR, BUFFER_SIZE, NULL, &oclErr);
oclErr = clEnqueueWriteBuffer(myDev.getCqCommandQueue(), cmHostString, CL_TRUE, 0, BUFFER_SIZE, p, 0, NULL, NULL);
我是否需要将 char 数组的每个元素从主机内存复制到主机的其他部分 内存(并且新地址对主机隐藏)? ?这不符合我的逻辑。为什么我不能使用相同的地址?我可以直接从 GPU 设备访问主机内存并使用它。
【问题讨论】:
-
std::string 将其内容保存在堆上并使用内部引用,即指向数据的内部指针很可能指向另一个字符串实例,直到您开始修改它。我不明白你为什么要这样做。您可以传递指针数组,但需要注意它们指向的位置。
-
谢谢。我无法在 1.2 中将 (__global char **myWords) 传递给内核。我什至无法编译
-
手头没有可用的 OpenCL 设置,但有几次我使用了 __local float* 输入[2],参见例如stackoverflow.com/questions/11978024/…。您始终可以使用单个指针并在内核中重新建立行指针。如果字符串的长度不同,它会有点混乱
-
我不确定我是否理解你。但我认为在 1.2 的情况下我在内核中有不同的地址。这意味着我不能在不复制整个数组的情况下使用 [] 运算符,不是吗?
-
如果你知道所有字符串的长度,你可以将字符保存在一个大的一维数组中,并在内核内部创建行指针,这样你就可以得到一个指针数组,char* input[NSTRINGS ],输入[i] = largeArray[i*STRING_LENGTH]。这比一遍又一遍地使用偏移更容易。
标签: c windows opencl gpgpu nvidia