尚未为cuda-7.5定义标识符“ __shfl_down”

时间:2019-11-24 14:09:53

标签: gcc cuda

在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版本中看到了这个问题,但是还没有一个明确的答案。

1 个答案:

答案 0 :(得分:2)

Warp Shuffle内在函数仅在3.0(cc)及更高的计算能力(cc)架构中定义(仅受支持)。

在CUDA 8.0之后,nvcc仅支持这些GPU,因此即使您针对默认架构(3.0)进行编译,它也可以正确编译。

但是对于CUDA 8.0 and priornvcc仍支持cc 2.x体系结构,并且仍然是“默认”体系结构(如果您在{上未指定任何体系结构切换,将会得到什么{1}}编译命令行)。

因此,在CUDA 8.0及更早版本(CUDA 6中引入了warp shuffle)中,如果您指定cc 2.x体系结构或不指定体系结构,则会看到此错误。

由于cc 2.x架构不支持warp shuffle,因此解决方案是在nvcc编译命令行上使用nvcc或类似名称明确指定合适的架构。