Hachioji.pm 日めくりテックトーク

PerCUDAの性能評価

12月23日のHachioji.pm Advent Calendarです. 今日もpapixが担当させて頂きます.
余談ですが今日はいつもお世話になっている@yusukebeさんと, 自分の母親の誕生日だったりします. おめでとうございます!

...さて. Perl Advent Calendarの20日目の記事として書かせて頂いたPerl meets GPUですが, おかげ様で様々な反響を頂いております.

その中で, 「CUDAで実装するのとどれくらい差があるのだろう?」というコメントがありました.

というわけで, 今日は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のリファクタリングで, 「前処理」と「後処理」の部分を出来る限り高速化していきたいと思っています.

created by
papix
created at
last modified at
2013-12-23 01:26
comments powered by Disqus