我正在尝试编译包含MSVS 2012和CUDA内核的程序。我使用共享内存,但与this question中的同一问题不同,我只使用我的变量名称一次这个内核的共享内存,所以没有重定义的问题。使用这样的代码:
template<typename T>
__global__ void mykernel(
const T* __restrict__ data,
T* __restrict__ results)
{
extern __shared__ T warp_partial_results[];
/* ... */
warp_partial_results[lane_id] = something;
/* ... */
results[something_else] = warp_partial_results[something_else];
/* ... */
}
实例化了几种类型(例如float,int,unsigned int),我得到了可怕的
declaration is incompatible with previous "warp_partial_results"
消息。什么可能导致这种情况?
答案 0 :(得分:2)
CUDA不会立即“支持”模板化函数中动态分配的共享内存数组,因为它(显然)会生成这些extern的实际定义。如果为多种类型实例化模板化函数,则定义会发生冲突。
可通过类以模板特化的形式提供变通方法。参见:
您可以按如下方式使用解决方法:
template<class T> __global__ void foo( T* g_idata, T* g_odata)
{
// shared memory
// the size is determined by the host application
SharedMem<T> shared;
T* sdata = shared.getPointer();
// .. the rest of the code remains unchanged!
}
getPointer()
具有 * 每种类型的专用实现,它返回不同的指针,例如extern __shared__ float* shared_mem_float
或extern __shared__ int* shared_mem_int
等。
(*) - 不是真的。在NVidia提供的头文件中,他们专注于一些基本类型,就是这样。