我正在尝试使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++源文件中,YCM可以正常工作。

任何想法缺少什么?

最佳答案

我通过以下步骤使它工作:

首先将.cu文件重新映射到.vimrc中的cpp

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

下一步,使用带有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
  }

最后,您需要在.cu文件中添加头文件,以便Ycm可以解析CUDA内置文件。这个文件cuda_builtin_vars.h在我的本地Clang版本中。
#ifdef __clang__
#include <cuda_builtin_vars.h>
#endif

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

资料来源:
  • https://github.com/Valloric/YouCompleteMe/issues/1766
  • http://llvm.org/docs/CompileCudaWithLLVM.html
  • https://github.com/Microsoft/clang-1/blob/master/test/SemaCUDA/kernel-call.cu
  • 关于vim - YouCompleteMe和CUDA源文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27001304/

    10-11 09:14
    查看更多