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等はできるかなっと^^;
ありゃ、拡張子の変更だけで大丈夫ですね。

conclusion!?

 なのでglobalでcuda使いたい場合は拡張子を変更しましょうwww;
って分けないですwー

 .cu/.cuh拡張子ファイルもc++としてparsrしてくれるようglobal*5を弄りましょう。

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


build blender near 2.65

 ToDo


 オレ、次回こそは、Cyclesの内部実装*8を読むんだ。

*1:JAR○への相談は勘弁してくださいw;

*2:だってglobalが無いとコード読めないゆとりなんだもの^^;

*3:日常的にglobal使っている人は分かると思います><

*4:__global__とかの予約語の扱いが不安ですが

*5:やっと本題に入った><

*6:厳密な解析するなら他にも色々弄らないと駄目ですが

*7:fix : c++ parser include .cu / .cuh filename extension. · murasesyuka/global@aec74ac · GitHub

*8:25日過ぎちゃいますけど、GPGPU Advent Calenderの27日辺りですかねw=