CUDAでも自動補完ほしい!!ソース解析したい!!


動機

MicroSoftが提唱したLanguageServerProtocolがテキストエディターの補完ツールやLintingツールとして普及して久しいですね。もはやこうしたツールなしでは生きていけない体にされている人も多いと思います。これを使ってフォーマットをする方も多いでしょう。ある変数の定義にジャンプするのもコマンド一発でいけます。
しかし困ったことに、CUDA C/C++で公式のLanguageServerが提供されていないのです。そこで今回はclangdを使ってcudaでもLanguageServerを使う方法を紹介していきたいと思います。

動作環境:ubuntu18.04
clangd: version 8
CUDA : 10.0

clangdの設定

clangdの設定ファイルはcompile_commands.json、もしくは、compile_flags.txtです[1]。compile_commands.jsonは一つ一つのファイルに対して細かくコマンドを指定できるんですが今回は全部のファイルで一括のオプションを指定するcompile_flags.txtを使います。
compile_flags.txtを以下のようにします。

compile_flags.txt
c++
-x
cuda
--std=c++14

これをプロジェクトのルートに配置します。
すると、.cppを開いても.hppを開いても、.cuを開いてもLanguageServerの恩恵を受けられるようになります。

実例

NeoVim+LanguageClient-neovim+deoplete.nvim+neosnippetの場合
設定については、人によって大きく異なると思われるので、LanguageClient-neovimのwikiを参照。


cudaの関数の補完ができている様子。そして、__global__等が入っていても指摘してこないことから、しっかりとCUDAとして認識していることがわかる。


blockDimやthreadIdxも補完できている様子。

ヘッダファイルでもしっかりLintingが働き、定義元へのジャンプもできます。

VSCodeでも同様のことがvscode-clangdを使うとできる。

以上、CUDAでもVisualStudio等の重量級IDEを使わずとも補完できるようにする方法でした。

参考資料

[1] Getting started with clangd — Extra Clang Tools 11 documentation https://clang.llvm.org/extra/clangd/Installation.html