首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cudaMemcpyToSymbol和优化的OpenCL版本

cudaMemcpyToSymbol和优化的OpenCL版本
EN

Stack Overflow用户
提问于 2012-05-02 19:44:06
回答 2查看 535关注 0票数 1

谁能告诉我用于将__constant复制到设备并返回到主机的OpenCl版本的cudaMemcpyToSymbol?

或通常的clenquewritebuffer(...)会做这件事吗?

在论坛中找不到太多帮助。实际上,几行演示就足够了。

另外,我是否应该期待opencl中使用常量缓存进行与CUDA相同的优化?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-02 20:04:40

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

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

代码语言:javascript
运行
复制
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上运行时,我怀疑常量内存是否会给您带来比全局内存更多的好处。

票数 0
EN

Stack Overflow用户

发布于 2012-09-07 07:22:27

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10413051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档