我正在使用Clion开发一个cuda程序。当扩展名为.h时,代码突出显示正常。但是,当它被更改为.cuh时,Clion只会将新文件视为纯文本文件,而我无法启用代码突出显示。我理解一个完整的Cuda工具链是不可能的,所以我不希望Clion解析像mykernel<<<<<<<<<>>>>>这样的语句。如果它可以像解析普通的header / cpp文件那样解析文件,我仍然会感到非常满意。
非常感谢
答案 0 :(得分:12)
首先,请务必告诉CLion使用.cu
设置菜单将.cuh
和File Types
文件视为C ++。
CLion无法解析CUDA的语言扩展,但它确实提供了仅在clion解析代码时才定义的预处理器宏。您可以使用它来自己实现几乎完整的CUDA支持。
很多问题是CLion的解析器被像__host__
或__device__
这样的关键字脱轨,导致它无法做其他人知道怎么做的事情:
在这个例子中,CLion无法理解Dtype
,因为CUDA的东西混淆了它的解析。
这个问题的最小解决方案是给clion预处理器宏忽略新的关键字,修复最坏的破坏:
#ifdef __JETBRAINS_IDE__
#define __host__
#define __device__
#define __shared__
#define __constant__
#define __global__
#endif
这修复了上面的例子:
但是,像__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甚至可以优雅地处理<<<...>>>
语法。它在启动块的每一端的一个字符下面放了一条红线,但是否则将其视为函数调用 - 这非常好:
答案 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或任何其他支持的文件类型,您可以这样做:
单击第二列的加号并写入* .cu
按apply,clion将解析所有.cu文件,因为它是您在上一栏(.cpp)中指定的文件类型
您可以看到更多文档here
答案 5 :(得分:0)
我发现clion似乎对所有构建目标进行了代码索引,而不仅仅是您选择构建的目标。我的策略是从我的.cu文件中创建.cpp符号链接,并创建一个引用那些.cpp链接的子clion / cmake c ++构建目标(仅用于索引)。这种方法似乎是在unbuntu 16.04.3中的clion 2017.3.3中的小型cuda / thrust c ++ 11项目上工作。
我是这样做的:
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})
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 开始,它位于“文件”>“文件类型”>“与文件类型关联”下。
如果不确定,请使用“帮助”菜单下的搜索栏搜索“文件类型”。