在Clion中启用Cuda的代码索引

时间:2016-10-11 15:13:21

标签: cuda clion

我正在使用Clion开发一个cuda程序。当扩展名为.h时,代码突出显示正常。但是,当它被更改为.cuh时,Clion只会将新文件视为纯文本文件,而我无法启用代码突出显示。我理解一个完整的Cuda工具链是不可能的,所以我不希望Clion解析像mykernel<<<<<<<<<>>>>>这样的语句。如果它可以像解析普通的header / cpp文件那样解析文件,我仍然会感到非常满意。

非常感谢

7 个答案:

答案 0 :(得分:12)

首先,请务必告诉CLion使用.cu设置菜单将.cuhFile Types文件视为C ++。

CLion无法解析CUDA的语言扩展,但它确实提供了仅在clion解析代码时才定义的预处理器宏。您可以使用它来自己实现几乎完整的CUDA支持。

很多问题是CLion的解析器被像__host____device__这样的关键字脱轨,导致它无法做其他人知道怎么做的事情: Fail

在这个例子中,CLion无法理解Dtype,因为CUDA的东西混淆了它的解析。

这个问题的最小解决方案是给clion预处理器宏忽略新的关键字,修复最坏的破坏:

#ifdef __JETBRAINS_IDE__
    #define __host__
    #define __device__
    #define __shared__
    #define __constant__
    #define __global__
#endif

这修复了上面的例子:

Yay!

但是,像__syncthreads__popc这样的CUDA函数仍然无法索引。因此,CUDA将像threadIdx一样构建。一种选择是为这些提供无限的预处理器宏(甚至是结构定义),但这很丑陋并且牺牲了类型安全性。

如果你正在使用Clang的CUDA前端,你可以做得更好。 Clang通过在头文件中定义它们来实现隐式定义的CUDA内置函数,然后在编译代码时包含它们。这些提供了诸如threadIdx之类的定义。通过伪装成CUDA编译器的预处理器并包括device_functions.h,我们也可以让__popc和朋友一起工作:

#ifdef __JETBRAINS_IDE__
    #define __host__
    #define __device__
    #define __shared__
    #define __constant__
    #define __global__

    // This is slightly mental, but gets it to properly index device function calls like __popc and whatever.
    #define __CUDACC__
    #include <device_functions.h>

    // These headers are all implicitly present when you compile CUDA with clang. Clion doesn't know that, so
    // we include them explicitly to make the indexer happy. Doing this when you actually build is, obviously,
    // a terrible idea :D
    #include <__clang_cuda_builtin_vars.h>
    #include <__clang_cuda_intrinsics.h>
    #include <__clang_cuda_math_forward_declares.h>
    #include <__clang_cuda_complex_builtins.h>
    #include <__clang_cuda_cmath.h>
#endif // __JETBRAINS_IDE__

这将为您提供几乎所有CUDA代码的完美索引。 CLion甚至可以优雅地处理<<<...>>>语法。它在启动块的每一端的一个字符下面放了一条红线,但是否则将其视为函数调用 - 这非常好:

Launch

答案 1 :(得分:8)

谢谢!我添加了更多“假”声明,以便让CLion更好地解析CUDA:

#ifdef __JETBRAINS_IDE__
#define __CUDACC__ 1
#define __host__
#define __device__
#define __global__
#define __forceinline__
#define __shared__
inline void __syncthreads() {}
inline void __threadfence_block() {}
template<class T> inline T __clz(const T val) { return val; }
struct __cuda_fake_struct { int x; };
extern __cuda_fake_struct blockDim;
extern __cuda_fake_struct threadIdx;
extern __cuda_fake_struct blockIdx;
#endif

答案 2 :(得分:4)

右键单击项目工具窗口中的文件 - &gt;与文件类型相关联 - &gt; C ++

然而,Clion现在不正式支持cuda,它无法解析cuda语法。

答案 3 :(得分:4)

我使用this answer中的方法扩展了this answer以提供更全面的解析宏,现在您可以拥有.x.y和{{1在没有问题的情况下正常工作,并使用网格暗淡。除此之外,我还更新了列表,以包含CUDA 8.0 documentation guide中找到的大多数内在函数和值。请注意,这应该具有完全的C ++兼容性,并且可能是C.这并没有考虑所有函数(缺少原子,数学函数(仅包括math.h),纹理,表面,时间,warp votie和shuffle,断言,发射边界和视频功能)

.z

答案 4 :(得分:3)

如果您希望clion将所有.cu文件解析为.cpp或任何其他支持的文件类型,您可以这样做:

  1. 转到文件 - &gt;设置 - &gt;编辑 - &gt;文件类型
  2. 选择要在第一列(.cpp)
  3. 中解析的文件类型
  4. 单击第二列的加号并写入* .cu

  5. 按apply,clion将解析所有.cu文件,因为它是您在上一栏(.cpp)中指定的文件类型

  6. 您可以看到更多文档here

答案 5 :(得分:0)

我发现clion似乎对所有构建目标进行了代码索引,而不仅仅是您选择构建的目标。我的策略是从我的.cu文件中创建.cpp符号链接,并创建一个引用那些.cpp链接的子clion / cmake c ++构建目标(仅用于索引)。这种方法似乎是在unbuntu 16.04.3中的clion 2017.3.3中的小型cuda / thrust c ++ 11项目上工作。

我是这样做的:

  • 使用clion注册.cu / cuh文件,如其他答案
  • 将cuda / clion宏伏都教添加到我的.cu文件中,就像其他答案一样(伏都教的位置可能很重要,但我还没有遇到任何麻烦)
  • 制作.cpp / .hpp指向项目目录中.cu / .cuh文件的符号链接
  • 使用名为clionShadow / CMakeLists.txt的单个文件创建一个新文件夹,其中包含:
cmake_minimum_required(VERSION 3.9)
project(cudaNoBuild)
set(CMAKE_CXX_STANDARD 11)
add_executable(cudaNoBuild ../yourcudacode.cpp ../yourcudacode.hpp)
target_include_directories(cudaNoBuild PUBLIC ${CUDA_INCLUDE_DIRS})
  • 使用如下所示的行在主CMakeLists.txt末尾的clionShadow / CMakeLists.txt添加依赖项:
add_subdirectory(clionShadow)

现在,clion通过'.cpp文件解析和编码索引.cu文件。

请记住,cudaNoBuild目标不是用于构建 - 它将使用无效的c ++工具链。如果您突然遇到编译错误,请检查clion的构建目标设置 - 我注意到它有时会混合并匹配项目之间的当前构建设置。在这种情况下,转到Run菜单下的Edit_Configurations对话框,确保clion没有将target_executable更改为cudaNoBuild目标。

编辑: Gah!在更新到clion 2017.3.3之后重建CMake和ide缓存时,事情并没有像以前那样真正起作用。索引仅适用于.cpp文件,断点仅适用于.cu文件。

答案 6 :(得分:0)

虽然不是特别相关,但不知何故这个问题出现在谷歌搜索结果“Pycharm cuda highlight”中。但是,那就将 CLion 用于 C/C++ 项目吧!

从 PyCharm 2020.3 Community Edition for Mac 开始,它位于“文件”>“文件类型”>“与文件类型关联”下。

如果不确定,请使用“帮助”菜单下的搜索栏搜索“文件类型”。