OpenCL版本的cudaMemcpyToSymbol&优化

时间:2012-05-02 11:44:06

标签: cuda opencl gpgpu opencl.net

有人能告诉我cradaMemcpyToSymbol的OpenCl版本是否将__constant复制到设备并返回主机?
或者通常的clenquewritebuffer(...)会做这个工作吗? 在论坛中找不到多少帮助。实际上几行演示就足够了。

我还期望opencl中的同类优化与使用常量缓存的CUDA相同吗?

谢谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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上运行时,常量内存会给你带来任何好处。