【问题标题】:Integer intrinsics are undefined整数内在函数未定义
【发布时间】:2021-02-21 07:23:58
【问题描述】:

E0020 标识符“__ffs”未定义

所有各种整数内在函数都相同。

失败的代码(它是一个方法定义;类定义了x,y,z):

__device__ uint32 lowbit()
{
    if (x) return __ffs(x);
    if (y) return 32 + __ffs(y);
    if (z) return 64 + __ffs(z);
    return 96;
}

我也试过这个(在我添加 __ffs 行之前一切正常:

__global__ void addKernel(int* c, const int* a, const int* b)
{
    int i = threadIdx.x;
    c[i] += a[i] + b[i];
    int foo = __ffs(i);
}

之前的一个问题是关于智能的。就我而言,nvcc 编译器也看不到它们。

根据 CUDA 文档:

1.9。整数内在函数 本节介绍仅在设备代码中支持的整数内在函数。要使用这些函数,您不需要在程序中包含任何额外的头文件。

https://docs.nvidia.com/cuda/cuda-math-api/group__CUDA__MATH__INTRINSIC__INT.html#group__CUDA__MATH__INTRINSIC__INT

我正在使用 Visual Studio Community 2019,CUDA 11.2.0

【问题讨论】:

  • E0020 是 Visual Studio 错误而不是 nvcc 错误。您真的在正确设置的 CUDA 项目中的 .cu 文件中执行此操作吗?
  • 是的,它是 .cu 文件包含的 .h 文件,该文件基于 VS 向导中的新 CUDA 项目。在添加该行之前,代码已编译并在我的设备上运行。但有趣的是,E0020 是一个 VS 错误。不知道该怎么做。
  • 在VS中,有两个日志需要注意,错误日志和控制台日志。如果您将来询问 VS 构建失败,我的建议是包含由构建命令产生的完整控制台日志。这将使其他人有最好的能力来帮助你。在此处提取单行的单个部分(如果这是您所做的):E0020 identifier "__ffs" is undefined 不太有用。如果您实际上将其从错误日志中提取出来(通常只有 1 行这样的行),那么您可能会对 Intellisense 错误感到困惑,具体取决于日志设置/下拉列表

标签: cuda


【解决方案1】:

嗯,这确实很奇怪。我添加了以下行作为实验:

#define __CUDACC__

修复了它,但给了我这个警告:

warning C4005: '__CUDACC__': macro redefinition

在没有清楚了解 __CUDACC__ 真正在做什么的情况下,我真的不想就这样离开。

奇怪的是,当我删除#define CUDACC 时,问题并没有出现。现在一切正常。魔法。或者也许 Visual Studio 默默地为我做一些事情。当微软做那种事情时让我担心,但这次我不会抱怨。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2021-07-07
    • 2018-10-25
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多