gpt4 book ai didi

c++ - 如何以程序员愉快的方式使用 CUDA 常量内存?

转载 作者:可可西里 更新时间:2023-11-01 15:59:35 35 4
gpt4 key购买 nike

我正在使用 CUDA 框架开发一个数字处理应用程序。我有一些所有线程都应该可以访问的静态数据,所以我把它放在常量内存中,如下所示:

__device__ __constant__ CaseParams deviceCaseParams;

我使用调用 cudaMemcpyToSymbol 将这些参数从主机传输到设备:

void copyMetaData(CaseParams* caseParams)
{
cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}

有效。

无论如何,似乎(通过反复试验,以及阅读网上的帖子)出于某种病态的原因,deviceCaseParams 的声明及其复制操作(对 cudaMemcpyToSymbol 的调用)必须在 相同的文件。目前我将这两个放在 .cu 文件中,但我真的希望将参数结构放在 .cuh 文件中,以便任何实现都可以根据需要看到它。这意味着我还必须在头文件中包含 copyMetaData 函数,但这会混淆链接(已定义的符号),因为 .cpp 和 .cu 文件都包含此头文件(因此 MS C++ 编译器和 nvcc 都会编译它).

这里有人对设计有什么建议吗?

更新:查看评论

最佳答案

使用最新的 CUDA(例如 3.2),如果您在运行时查找符号(即通过将字符串作为第一个参数传递给cudaMemcpyToSymbol 就像你在你的例子中一样)。

此外,对于 Fermi 级设备,您只需 malloc 内存 (cudaMalloc),复制到设备内存,然后将参数作为 const 指针传递。编译器将识别您是否跨 warp 统一访问数据,如果是,将使用常量缓存。有关详细信息,请参阅 CUDA 编程指南。注意:您需要使用 -arch=sm_20 进行编译。

关于c++ - 如何以程序员愉快的方式使用 CUDA 常量内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008031/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com