【问题标题】:CUDA __syncthreads() compiles fine but is underlined with redCUDA __syncthreads() 编译正常,但带有红色下划线
【发布时间】:2012-12-03 08:29:55
【问题描述】:

我已经使用 CUDA 4.2 一个星期了,但我遇到了一个小问题。 当我编写 __syncthreads() 函数时,它会变成下划线,看起来好像是错误的......

然后,如果我将鼠标放在功能上,则会出现一条消息:

标识符 __syncthreads();未定义。

但是当我编译我的项目时,输出表单 build 说:

========== 构建:1 成功,0 失败,0 最新,0 跳过 ==========

所以我猜测一切正常,但 Visual Studio 强调该函数的事实让我感到困惑......我怎样才能让 Visual Studio 知道该函数是在编译过程之前定义的?

注意:内核调用也会发生同样的事情:kernel>> 其中第三个“

我知道这可能是一个小问题,但我想解决它...非常感谢! 我在带有 Cuda 4.2 和 Nsight 2.2 的 win7 上使用 Visual Studio 2010

【问题讨论】:

  • 是文件名something.c还是something.cu,而最后一个表示cuda文件而不是纯c文件。虽然没有使用 cuda 的 VS 经验。
  • @ks6g10... 显然这将是一个cu 文件。你还能在哪里使用__syncthreads
  • @sgar91 是的,你只能在 cu 文件中使用它,如果使用 nvidia nsight 将文件命名为 .c 而不是 .cu,它将注册为错误。当传递给 nvcc 时,它可以以某种方式编译。
  • 尝试包含cuda_runtime.h 和/或device_functions.h,看看红色下划线是否消失。我并不是真的建议这是一个很好的解决方案,因为它may have side effects,但我认为这就是 IDE 确定要下划线的方式 - 它正在解析您的代码以在某处定义。

标签: visual-studio-2010 cuda


【解决方案1】:

我在 cu 文件的顶部添加了以下几行,它开始识别这些函数。出于某种原因,Intellisense 没有选择这个#define:

#ifndef __CUDACC__  
    #define __CUDACC__
#endif

我在代码中丢失了一些颜色编码,但我不再收到奇怪的误报错误。

【讨论】:

  • 这实际上适用于函数“syncthreads();”但问题变成了还有另外 100 个错误“未知属性“__device_builtin”。
  • 有趣的是,这对我有用。我参加了 2013 年 VS 社区...有人知道为什么吗?
【解决方案2】:

我正在使用CUDA 9.1Visual Studio 2017 15.6.4。以下代码帮助我消除“__syncthreads() 未定义”错误。

//for __syncthreads()
#ifndef __CUDACC__ 
#define __CUDACC__
#endif
#include <device_functions.h>

但是,不推荐这种方法,因为它可能会带来不可预知的副作用。解决此智能感知警告的另一种方法是:

#ifdef __INTELLISENSE___
// in here put whatever is your favorite flavor of intellisense workarounds
#endif

参考: __syncthreads(); is undefined need a help

【讨论】:

    【解决方案3】:

    我有CUDA 8.0Visual Studio 2015,我也遇到了同样的问题。 以下几行帮助了我:
    在这些行之后:(已经在代码中)

    #include "cuda_runtime.h"
    #include "device_launch_parameters.h"
    

    我添加了这些行:

    //for __syncthreads()
    #ifndef __CUDACC_RTC__ 
    #define __CUDACC_RTC__
    #endif // !(__CUDACC_RTC__)
    
    #include <device_functions.h>
    

    基于此链接:https://devtalk.nvidia.com/default/topic/1009723/__syncthreads-and-atomicadd-are-undefined-in-visual-studio-2015/

    【讨论】:

      【解决方案4】:

      尝试在 .cuh 文件中定义 __global__ 函数的主体时遇到此问题。将函数体移动到 .cu 源文件中解决了它。

      然而,这意味着我的一些模板化函数不能使用像__syncthreads() 这样的基本功能,因为模板可能必须在.cuh 标头中定义。

      因此,您可能需要放弃函数模板,而是坚持使用多个函数,每个函数的名称略有不同。

      【讨论】:

        【解决方案5】:

        其他解决方案要么没有解决在 Eclipse 2021-06 中使用 CMake 3.16.3 发生的相同问题,要么在 CUDA 运行时版本 = 10.1 时产生了以下警告:

        /usr/include/device_functions.h:54:2: warning: #warning "device_functions.h is an internal header file and must not be used directly.  This file will be removed in a future CUDA release.
        

        以下在 Eclipse 中给出了正确的突出显示和代码完成,并且没有产生编译警告:

        #ifndef __CUDACC__
            #define __CUDACC__
            #include <device_functions.h>
        #endif
        

        【讨论】:

        • 你明白这个问题是关于 Visual Studio 和 Visual Studio Code 中的 Intellisense,而不是 Eclipse?
        • @talonmies 是的。我的意思是提高对其他 IDE 和工具链的可移植性。据我了解,类似于#ifdef __INTELLISENSE___ 的解决方案是首选,因为它仅在 IDE 中被考虑,但在构建过程中被忽略。但是__INTELLISENSE___ 不适用于其他 IDE(没有 Intellisense)。这些 IDE 也犯了类似的索引错误。作为对答案的评论(并且也包括这些考虑因素),我的回复可能更有意义,但我没有声誉。如果仍然认为它没有增加足够的价值,我当然愿意删除/改进我的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-01
        • 2021-09-04
        • 1970-01-01
        • 2022-10-17
        • 2020-03-24
        相关资源
        最近更新 更多