PerCUDAの性能評価
12月23日のHachioji.pm Advent Calendarです. 今日もpapixが担当させて頂きます.
余談ですが今日はいつもお世話になっている@yusukebeさんと, 自分の母親の誕生日だったりします. おめでとうございます!
...さて. Perl Advent Calendarの20日目の記事として書かせて頂いたPerl meets GPUですが, おかげ様で様々な反響を頂いております.
やばい…:Perl meets GPU - Qiita [キータ] http://t.co/3q58j4NC3E
— しゅううさんฅ(๑′Δ’๑)にゃんぱすー (@syuu1228) 2013, 12月 20
その中で, 「CUDAで実装するのとどれくらい差があるのだろう?」というコメントがありました.
これは良い。普通にCUDAで実装するのとどれぐらい差でるんだろ。 / Perl meets GPU by @__papix__ on @Qiita http://t.co/aKUR1GGc1W
— ただむー (@mw529) 2013, 12月 22
というわけで, 今日はPerCUDAの性能評価として, 素のCUDAを利用したGPGPUの実行結果と, PerCUDAを利用したGPGPUの実行結果について紹介したいと思います.
実験対象となるコードは, 素のCUDAとPerCUDAで実装した, 1024*1024要素の配列の乗算を計算するコードです.
「PerCUDA(Perl)」はカーネル関数をPerl処理系で実行した場合, 「PerCUDA(GPU)」はカーネル関数をGPUで実行した場合, そして「CUDA」は素のCUDAを利用した場合の時間になります.
PerCUDA(Perl) | PerCUDA(GPU) | CUDA | |
---|---|---|---|
前処理 | 0.0000401s | 0.0435131s | - |
転送 | - | 0.0218434s | 0.0029387s |
実行 | 232.7142642s | 0.0333679s | 0.0358331s |
後処理 | - | 0.1033700s | - |
合計 | 232.7143043s | 0.2020944s | 0.0387718s |
このうち,
- 前処理: カーネル関数に対する引数の確認, Perlのデータ構造のバイナリ化などにかかった時間
- 転送: ホスト側からデバイス側, デバイス側からホスト側へのデータの転送にかかった時間
- 実行: カーネル関数の実行にかかった時間
- 後処理: 実行結果であるバイナリをPerlのデータ構造に変換するためにかかった時間
を示します.
PerCUDAで実装したGPGPUは, 素のCUDAで実装した場合と比べると5.2倍の時間が必要になっていることがわかります.
しかしながら, それでもPerl処理系を利用した場合と比べると1151.5倍の高速化を達成できていますので, 十分実用的と言えるのではないでしょうか.
PerCUDAを利用したGPGPUにおいて, カーネル関数やデータの転送に関する時間は素のCUDAの場合とほとんど変わっていないので, 「前処理」や「後処理」の時間が大きな負担になっています.
この辺りは, 「前処理」や「後処理」を担当するコードのチューニングやXS化などで, ある程度は高速化できるのではないかと見込んでいます.
まとめ
PerCUDAと素のCUDAの性能評価について解説しました.
3月までを予定しているPerCUDAのリファクタリングで, 「前処理」と「後処理」の部分を出来る限り高速化していきたいと思っています.