Blender on GPGPU 序序 (gnu global で cuda の解析)
この記事は GPGPU Advent Calender の18日目の記事です。
最初に断っておきますが私はGPGPUプログラマでもないですし、Blenderデベロッパでもないので
本記事には多分に、「嘘、大げさ、紛らわしい」を含んでいます。*1
破に続くと思ったか、それは幻想だ(´・ω・`)
今回は、破(コードリーディング予定)に至る前の物語*2です
って、タイトルにBlenderとかGPGPUとか書いてますけど、
関係することはあんまりないです><、
global cuda parser
最初に以下結論です。
_ _ _ rへ!,_<Y-、 ゙i _r''r、ゞラ ノ フ ''rラi(vヾー'′ / 7 ゙i V'`´ i\ ,./ フ / /' `ン rく__,/ ! ,、_ し' `゙/゙_ノ . ヽ、 '´>> / . \_,.-'´ イ´ | / / _ノノイ-ノノ) __人__人__人__人__人__人__人__ | ,.,.( 、ヽ'` ´ ) ( ヽ ゝ` ,-'_ ) おれはgrepをやめるぞ!( ヽ_ (ノヘ!( | l 、、ゝ、 ) ( \ 代t、 ,=毛i r=、 ノ) 序序 ――ッ!! ( ,.-=| ゙〈_  ̄ ,.ノ〈 ) ( rl、'_‐! |こヲ /ノ|ノ゙| ⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒ /|、_ l ゙ニ´_/// ト / | i `"゙´_,.-'´
はい、cuda読むのにgrep使うのやめますw;
私コード読むのにGNU Global使っているんですが、
これがcudaコードを解析してくれないw<
GNU Globalのデフォルトで解析可能な言語が、
C/C++/Java/PHPな為です。
なので、しかたなくblender内のcudaコード読むのに、
この__global__ hogehoge関数は何処から呼ばれてるのかな〜
って、grepで探すか、あれ、ない、、あれ、、、ってヤッてられるかヾ(。`Д´。)ノ彡
って、なるわけですよ。わかりますよね。
って、わかんない?あれ、おかしいなぁ〜*3
ってか皆さんはどうしてるんでしょうね?
基本cudaはc++の毛の生えたような言語なので
少し弄れば使えると思うのでglobalを弄ってみましょう。
before gtags parse cuda
最初に適当なcudaソースをgithubからcloneします。
VS持ってないけどbuildするわけでないので気にしないw<
git clone https://github.com/programmine/CUDA.git
はい一先ずclone内の.cuをgtagsでparseされないことを確認します。
cloneしたコードには以下の通り.cu/.cuhが含まれています。
$ cd CUDA $ tree . |-- WaterSurface | |-- GPUFunctions.cu | |-- GPUFunctions.cuh ... | |-- wavemapCUDA.cpp | |-- wavemapCUDA.h | |-- wmatrix.cpp | `-- wmatrix.h `-- WaterSurface.sln 1 directory, 35 files
これをgtagsでparseしてみても
以下の通りGPUFunctions.cuとGPUFunctions.cuhは
解析してくれません><
$ gtags -v [Tue Dec 18 00:17:00 JST 2012] Gtags started. Using default configuration. [Tue Dec 18 00:17:00 JST 2012] Creating 'GTAGS' and 'GRTAGS'. [1] extracting tags of WaterSurface/trianglelist.cpp [2] extracting tags of WaterSurface/triangle.cpp [3] extracting tags of WaterSurface/watersurface.cpp [4] extracting tags of WaterSurface/wavemapCUDA.h [5] extracting tags of WaterSurface/main.cpp [6] extracting tags of WaterSurface/waterplaneCUDA.cpp [7] extracting tags of WaterSurface/wmatrix.h [8] extracting tags of WaterSurface/wavemap.h [9] extracting tags of WaterSurface/renderwidget.h [10] extracting tags of WaterSurface/wavemap.cpp [11] extracting tags of WaterSurface/triangle.h [12] extracting tags of WaterSurface/renderwidget.cpp [13] extracting tags of WaterSurface/vector.cpp [14] extracting tags of WaterSurface/waterplane.h [15] extracting tags of WaterSurface/wmatrix.cpp [16] extracting tags of WaterSurface/disturbances.h [17] extracting tags of WaterSurface/vector.h [18] extracting tags of WaterSurface/disturbances.cpp [19] extracting tags of WaterSurface/trianglelistCUDA.h [20] extracting tags of WaterSurface/wavemapCUDA.cpp [21] extracting tags of WaterSurface/waterplaneCUDA.h [22] extracting tags of WaterSurface/trianglelist.h [23] extracting tags of WaterSurface/watersurface.h [24] extracting tags of WaterSurface/waterplane.cpp [25] extracting tags of WaterSurface/trianglelistCUDA.cpp [Tue Dec 18 00:17:00 JST 2012] Done.
と、ここで拡張子.cu/.cuhが.cpp/.hppだったら
普通に解析されるよね!?*4と思いたる。
「論よりrun」ってことで、まずは拡張子変更。
$ mv GPUFunctions.cu GPUFunctions.cpp $ mv GPUFunctions.cuh GPUFunctions.hpp
で、gtags実行
$ gtags -v ... [5] extracting tags of WaterSurface/GPUFunctions.hpp ... [24] extracting tags of WaterSurface/GPUFunctions.cpp ...
ほいほい、gtags-find-tag/rtag/symbol等はできるかなっと^^;
ありゃ、拡張子の変更だけで大丈夫ですね。
after gtags parse cuda
で、cudaをc++としてparserする様の修正ですが一瞬*6で終わります。
configure.ac*7弄って、
autoconfして、./configure & make して
はい完了。
gtagsしてみると、
$ gtags -v ... [7] extracting tags of WaterSurface/GPUFunctions.cu ... [17] extracting tags of WaterSurface/GPUFunctions.cuh ... [Tue Dec 18 01:17:39 JST 2012] Done.
はい、.cu/.cuh拡張子のファイルもしっかり解析されてます。
軽く触ってみた感じは期待通り動いています。
conclusion
__global__等のCUDAで拡張された予約語を全く解析してない
なんちゃってcuda用globalパッチですが、何かの参考になれば幸いですので
githubにコード上げておきます。
GitHub - murasesyuka/global at cpp_parser_include_cuda