YouCompleteMe和CUDA源文件

6

我正在尝试使vim的YCM插件适用于CUDA源文件。 由于CUDA基本上是带有一些扩展的C++语法,因此我认为编辑标准的'.ycm_extra_conf.py'文件就足够了。我更改了该行:

SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm']

为了

SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm', '.cu' ]

和这条线

return extension in [ '.h', '.hxx', '.hpp', '.hh']

为了

return extension in [ '.h', '.hxx', '.hpp', '.hh', '.cuh' ]

但是YCM不起作用,它甚至没有像在正常的C/C++源文件中一样要求我使用配置文件。有什么想法缺少了什么?


你可能需要在g:ycm_filetype_whitelist或其他vim脚本变量中将其列入白名单。 - FDinoff
我采纳了你的建议,使用了白名单选项,同时使用了通用的*和'cuda'关键字,但是没有成功。我本来希望这个选项能解决问题。 - labotsirc
由于CUDA使用“nvcc”编译器,我开始相信可能不可能。 - labotsirc
1个回答

4

我通过以下步骤使其正常工作:

首先,在您的 .vimrc 中将 .cu 文件映射到 cpp。

" Map cuda files to c++ so that Ycm can parse
autocmd BufNewFile,BufRead *.cu set filetype=cpp

下一步更新 .ycm_extra_conf.py 文件,添加 Clang CUDA 支持的标志。

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
  }

最后,您需要将一个头文件添加到您的.cu文件中,以便Ycm可以解析CUDA内置函数。这个文件名叫做cuda_builtin_vars.h,它在我的本地Clang构建中。
#ifdef __clang__
#include <cuda_builtin_vars.h>
#endif

即使这样,Clang解析器似乎仍然无法接受我的__global__函数实际上是__global__的(尽管它可以处理任何问题的内核调用语法),所以我通常会用#ifndef __clang__将它们包装起来。
来源:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接