我正在使用CUDA框架开发一个进行数字计算的应用程序。我有一些静态数据应该对所有线程都可访问,所以我把它放在常量内存里,像这样:
__device__ __constant__ CaseParams deviceCaseParams;
我使用 cudaMemcpyToSymbol 函数将这些参数从主机传输到设备:
void copyMetaData(CaseParams* caseParams)
{
cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}
这似乎是一个奇怪的问题,通过试错和阅读网络帖子得知,deviceCaseParams声明和它的复制操作(call to cudaMemcpyToSymbol)必须在同一个文件中。目前我把这两个操作都放在了一个.cu文件中,但我真的希望将参数结构体放在一个.cuh文件中,以便任何实现都可以看到它。这意味着我也必须在头文件中包含copyMetaData函数,但这会导致链接出错(符号已定义),因为.cpp和.cu文件都包含了这个头文件(因此MS C++编译器和nvcc都编译它)。
有人对这里的设计有任何建议吗?
更新:请参见评论。