有人能告诉我cradaMemcpyToSymbol的OpenCl版本是否将__constant复制到设备并返回主机?
或者通常的clenquewritebuffer(...)会做这个工作吗?
在论坛中找不到多少帮助。实际上几行演示就足够了。
我还期望opencl中的同类优化与使用常量缓存的CUDA相同吗?
谢谢
答案 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上运行时,常量内存会给你带来任何好处。