我试图使vim的YCM插件适用于CUDA源文件.由于CUDA基本上是带有一些扩展的C++语法,我认为编辑标准的'.ycm_extra_conf.py'文件就足够了.我换了线
SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm']
Run Code Online (Sandbox Code Playgroud)
至
SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm', '.cu' ]
Run Code Online (Sandbox Code Playgroud)
和线
return extension in [ '.h', '.hxx', '.hpp', '.hh']
Run Code Online (Sandbox Code Playgroud)
至
return extension in [ '.h', '.hxx', '.hpp', '.hh', '.cuh' ]
Run Code Online (Sandbox Code Playgroud)
但YCM不起作用,它甚至没有要求我在开始时使用配置文件.在普通的C/C++源文件中,YCM工作正常.
什么缺少的想法?
我通过以下步骤完成了这项工作:
首先将 .cu 文件重新映射到 .vimrc 中的 cpp
" Map cuda files to c++ so that Ycm can parse
autocmd BufNewFile,BufRead *.cu set filetype=cpp
Run Code Online (Sandbox Code Playgroud)
接下来使用 Clang CUDA 支持标志更新 .ycm_extra_conf.py。
import os
import ycm_core
includes = ['-I/opt/cudatoolkit/6.5/include', '-I/your/includes/here']
common = ['-std=c++11',
'-DUSE_CLANG_COMPLETER',
'-I/usr/local/include',
'-I/usr/include/clang/3.5/include',
'-I/usr/include/x86_64-linux-gnu',
'-I/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/include',
'-I/usr/include',
'-I/usr/include/c++/4.9']
cpp_flags = ['-x', 'c++',]
# http://llvm.org/docs/CompileCudaWithLLVM.html
cuda_flags = ['-x', 'cuda', '--cuda-gpu-arch=sm_35']
def FlagsForFile( filename ):
compile_flags = cpp_flags
if filename.endswith('.cu'):
compile_flags = cuda_flags
compile_flags.extend(common)
compile_flags.extend(includes)
return {
'flags': compile_flags,
'do_cache': True
}
Run Code Online (Sandbox Code Playgroud)
最后,您需要将头文件添加到 .cu 文件中,以便 Ycm 可以解析 CUDA 内置函数。这个文件cuda_builtin_vars.h
位于我本地的 Clang 版本中。
#ifdef __clang__
#include <cuda_builtin_vars.h>
#endif
Run Code Online (Sandbox Code Playgroud)
即使如此,Clang 解析器似乎仍然不接受我的__global__
函数实际上是__global__
(即使它可以处理任何问题的内核调用语法),所以我通常将它们包装为 #ifndef __clang__
资料来源: