谁能告诉我用于将__constant复制到设备并返回到主机的OpenCl版本的cudaMemcpyToSymbol?
或通常的clenquewritebuffer(...)会做这件事吗?
在论坛中找不到太多帮助。实际上,几行演示就足够了。
另外,我是否应该期待opencl中使用常量缓存进行与CUDA相同的优化?
谢谢
发布于 2012-05-02 20:04:40
不确定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图形处理器。在ATI GPU上,它的行为也应该类似。当在CPU上运行时,我怀疑常量内存是否会给您带来比全局内存更多的好处。
发布于 2012-09-07 07:22:27
我见过人们使用cudaMemcpyToSymbol()在内核中设置常量,编译器可以在优化代码时利用这些常量。如果要在openCL中设置内存缓冲区来将这些常量传递给内核,那么编译器就不能使用它们来优化代码。
相反,我找到的解决方案是将cudaMemcpyToSymbol()替换为定义编译器符号的字符串的打印。编译器可以采用-D FOO=bar形式的定义,以便将符号FOO设置为值bar。
https://stackoverflow.com/questions/10413051
复制相似问题