在ubuntu 14.04(相当旧的配置)上使用gcc 4.8.4在cuda 7.5上编译程序时,出现此错误
error: identifier "__shfl_down" is undefined
detected during instantiation of "T gmx_shfl_down_sync(unsigned int, T, unsigned int, int) [with T=float]"
指向
template <typename T>
static __forceinline__ __device__
T gmx_shfl_down_sync(const unsigned int activeMask,
const T var,
unsigned int offset,
int width = warp_size)
{
#if GMX_CUDA_VERSION < 9000
GMX_UNUSED_VALUE(activeMask);
return __shfl_down(var, offset, width);
#else
return __shfl_down_sync(activeMask, var, offset, width);
#endif
}
有什么办法可以解决这个问题?我在旧的cuda版本中看到了这个问题,但是还没有一个明确的答案。
答案 0 :(得分:2)
Warp Shuffle内在函数仅在3.0(cc)及更高的计算能力(cc)架构中定义(仅受支持)。
在CUDA 8.0之后,nvcc
仅支持这些GPU,因此即使您针对默认架构(3.0)进行编译,它也可以正确编译。
但是对于CUDA 8.0 and prior,nvcc
仍支持cc 2.x体系结构,并且仍然是“默认”体系结构(如果您在{上未指定任何体系结构切换,将会得到什么{1}}编译命令行)。
因此,在CUDA 8.0及更早版本(CUDA 6中引入了warp shuffle)中,如果您指定cc 2.x体系结构或不指定体系结构,则会看到此错误。
由于cc 2.x架构不支持warp shuffle,因此解决方案是在nvcc
编译命令行上使用nvcc
或类似名称明确指定合适的架构。