我正在使用Clion开发一个cuda程序.当扩展名为.h时,代码突出显示正常.但是,当它被更改为.cuh时,Clion只会将新文件视为纯文本文件,而我无法启用代码突出显示.我理解一个完整的Cuda工具链是不可能的,所以我不希望Clion解析像mykernel <<< 1024,100 >>>这样的语句.如果它可以像解析普通的header/cpp文件一样解析文件,我仍然会感到非常满意.
非常感谢
Chr*_*ing 14
首先,确保你告诉克利翁治疗.cu和.cuh文件作为C++使用File Types设置菜单.
CLion无法解析CUDA的语言扩展,但它确实提供了只在clion解析代码时才定义的预处理器宏.您可以使用它来自己实现几乎完整的CUDA支持.
很多问题是CLion的解析器被像__host__或者关键字脱轨__device__,导致它无法做其他人知道怎么做的事情:

Dtype在这个例子中,CLion无法理解,因为CUDA的东西混淆了它的解析.
解决此问题的最小解决方案是给clion预处理器宏忽略新关键字,修复最坏的破坏:
#ifdef __JETBRAINS_IDE__
#define __host__
#define __device__
#define __shared__
#define __constant__
#define __global__
#endif
Run Code Online (Sandbox Code Playgroud)
这修复了上面的例子:
然而,像CUDA功能__syncthreads,__popc仍然将无法指数.所以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__
Run Code Online (Sandbox Code Playgroud)
这将为您提供几乎所有CUDA代码的完美索引.CLion甚至优雅地应对<<<...>>>语法.它在发射块的每一端的一个字符下面放了一个小红线,但是否则将其视为函数调用 - 这非常好:
谢谢!我添加了更多"假"声明,以便让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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10965 次 |
| 最近记录: |