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

Yng*_*dal 10 c++ linker cuda header visual-studio

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

__device__ __constant__ CaseParams deviceCaseParams;
Run Code Online (Sandbox Code Playgroud)

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

void copyMetaData(CaseParams* caseParams)
{
    cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}
Run Code Online (Sandbox Code Playgroud)

哪个有效.

无论如何,似乎(通过反复试验,以及从网上阅读帖子),由于某些原因,deviceCaseParams的声明及其复制操作(对cudaMemcpyToSymbol的调用)必须在同一个文件中.目前我在.cu文件中有这两个,但我真的想在.cuh文件中有参数struct,这样任何实现都可以看到它.这意味着我还必须在头文件中使用copyMetaData函数,但这会混淆链接(已定义的符号),因为.cpp和.cu文件都包含此头文件(因此MS C++编译器和nvcc都编译它) ).

有没有人对设计有任何建议?

更新:查看评论

Tom*_*Tom 7

随着上最新的CUDA(如3.2),你应该能够从一个不同的翻译单元中做的memcpy如果你正在寻找向上运行时的符号(通过传递一个字符串作为第一个参数,即要cudaMemcpyToSymbol像你在你的例子中).

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