1

有人可以告诉我用于将 __constant 复制到设备并返回主机的 OpenCl 版本的 cudaMemcpyToSymbol 吗?
还是通常的 clenquewritebuffer(...) 可以完成这项工作?
在论坛中找不到太多帮助。实际上几行演示就足够了。

我也应该期望在 opencl 中进行与使用常量缓存的 CUDA 相同的优化吗?

谢谢

4

2 回答 2

3

我见过人们cudaMemcpyToSymbol()用于在内核中设置常量,编译器可以在优化代码时利用这些常量。如果要在 openCL 中设置一个内存缓冲区来将这些常量传递给内核,那么编译器就无法使用它们来优化代码。

相反,我找到的解决方案是cudaMemcpyToSymbol()用 print 替换为定义编译器符号的字符串。-D FOO=bar编译器可以采用将符号设置FOO为值的形式进行定义bar

于 2012-09-06T23:22:26.567 回答
0

不确定 OpenCL.Net,但在普通的 OpenCL 中:是的,clenquewritebuffer就足够了(只需记住创建带有CL_MEM_READ_ONLY标志集的缓冲区)。

这是来自Nvidia GPU Computing SDK (OpenCL/src/oclQuasirandomGenerator/oclQuasirandomGenerator.cpp) 的演示:

c_Table[i] = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int),     
                 NULL, &ciErr);
ciErr |= clEnqueueWriteBuffer(cqCommandQueue[i], c_Table[i], CL_TRUE, 0, 
            QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int), tableCPU, 0, NULL,  NULL);

CUDA 和 OpenCL 中的常量内存完全相同,并提供相同类型的优化。也就是说,如果您使用 nVidia GPU。在 ATI GPU 上,它的行为应该类似。而且我怀疑在 CPU 上运行时,恒定内存是否会给您带来任何优于全局的好处。

于 2012-05-02T12:04:40.010 回答