« 散髪に行く | トップページ | ちょっとうれしいこと »

2009年6月 7日 (日)

なぜか明日も休み

職場で担当している、幾何光学ソフトエンジン部分を、CUDA on GPUで並列化する作業を、自宅に持ち帰って検討してみようと考える。それで、金曜日の夕方に、職場で、プログラムやテストデータをUSBメモリに入れて、自宅に持ち帰った。20090607blog

現在、このCUDA on GPU書き換え作業では、次のような問題が生じている。これまで、自分がCUDAに移植したコードは、通常のC言語プログラムの約三倍の速度で動いてくれていた。ただし、計算結果に微妙な食い違いが生じていた。自分は、このわずかな計算結果の食い違いを、GPUの計算精度の誤差と解釈していた。

しかし、数日前に、kerner.cuのコードに小さなバグがあることを発見する。このバグを修正したところ、計算結果の食い違いの問題は解消された。しかし、その代償として、プログラムの実行計算速度が非常に落ちてしまったのである。

実際、通常のC言語プログラムより、CUDA移植版の方が遅くなってしまったのである。自分は、これは困ったことになったなと考えた。それで、週末、自宅で、どうしてこういう事態に陥ったのか調べてみようと考えたのである。

問題のCUDAコードを、自宅のノートパソコンのCUDA emulatorで動かしてみる。すると、何の問題も無くcompileされ、計算も滞りなく実行された。何の問題も発生しなかった。CUDA emulatorの出力を見た限りでは、並列化も成功しているようであった。

CUDA emulatorが、何の警告も発しないので、プログラムを修正することが出来ない。どこを修正すべきか、分からないからである。要するに、このプログラムコードは、理屈の上ではどこも間違っておらず、ただ、いざGPUで並列計算すると異常に計算時間を消費してしまう、ということのようであった。

自宅には、GeForceを搭載したパソコンなど無いので、これ以上の作業は無理のようであった。それで、諦めることにする。プログラム修正作業は、職場のパソコンでしか出来ないようである。

明日、自分は仕事を休んで良いことになっている。これは、強制的に有給休暇を消化して欲しい、ということを受けてである。職場の組合がそう決めたようであった。他の多くの社員も、明日の休みをもらったようである。

しばらく前から、自分は、'Microscopic derivation of the Jaynes-Cummings model with cavity losses', M. Scala, B. Militello, A. Messina, J. Piilo, S. Maniscalco, Phys. Rev. A 75, 013811 (2007)、および、'Cavity losses for the dissipative Jaynes-Cummings Hamiltonian beyond Rotating Wave Approximation', M. Scala, B. Militello, A. Messina, S. Maniscalco, J. Piilo, K.-A. Suominen, J. Phys. A: Math. Theor. 40, 14527-14536 (2007)という、二編の論文に取り組んでいる。これらの論文は、Jaynes-Cummings modelに熱浴(調和振動子の集まり)を結合させ、Jaynes-Cummings modelの単一モード光子と熱浴の調和振動子が相互作用するモデルを新たに考え、そのモデルのmaster equationを導出する、という内容の研究に関するものであった。そして、新たに導入した熱浴を、cavity lossと解釈するようであった。

自分は、それら二編の論文を読んで、自分なりのやり方で、彼らの結果を導き出せないかと、いろいろ試行錯誤して計算をしてみた。と言うのも、これら二編の論文に出て来る方程式、および、その導出過程は、どれも非常に複雑で、ややもすれば、読み手の元気を失わせる感じのものだったからである。(自分は、これら二編の論文の内容に価値が無いと言っている訳ではない。ただ、とても複雑なのである。)

しかし、いくら自分で計算してみても、際立った改善は得られなかった。自分は、「きっと、今自分がしている計算を、これらの著者達も試したのだろうな」、と考えたりした。世の中、そうそう、良い論文の種が転がっている訳が無い。楽して良い結果が得られる訳が無い。そう考えたりした。

今日、昼ご飯に、妻は焼きそばを作ってくれた。

|

« 散髪に行く | トップページ | ちょっとうれしいこと »

日記・コラム・つぶやき」カテゴリの記事

コメント

ヒロさんお久しぶりです♪
やはり並列化で思うように速度が出ないみたいですね。私もバグを発見したときはいつも冷や汗ものです(T T

ヒロさんが書いた並列化処理の内容が具体的にわからないので的確にアドバイスが難しいですが、CUDAにおいての速度的ペナルティが何点かあるので挙げておきます。
・分岐命令
 CUDAの処理は全スレッドが同じ動作を行うことで処理速度を上げているので、分岐命令が多いと遅くなってしまいます。
 例えば正負の判定であればCUDAの組み込み関数で符号判定の関数があるのでそれを使って、すべて計算で済ますとかトリッキーなことをすれば回避できるかと。

・global memory
 データの読み書きにつかうメモリですが、レイテンシが高いのが、悩みの種です。アドレスを連続させて速度を上げる「コアレス・アクセス」があるのでそれを使えるなら検討してみては?(コアレスのスペル忘れました。。。programing guideに載ってますので一読してみてください)

・除算について
 基本的に計算機全体にいえますが、除算は非常に遅いです。可能であれば式を整理して除算を最小にするとか、整数演算であればシフト命令で代替するとかで回避してみてください。

・キャッシュ機能について
 もし定数とか使用して計算されているのであれば、constant memoryに割り当ててキャッシュ機能を使えるようにすると早くなるかもしれません。(texture memoryもあります。違いは私もはっきりは知りません^^;)

私が知ってる情報はこれくらいです(汗
具体的に質問してもらっても全然嫌じゃないですから、気兼ねなくどうぞ☆

たまには頭のリフレシュしてくださいね。

焼きそばおいしそう。。。いい奥さんですね♪

でわでわー

投稿: たー | 2009年6月 8日 (月) 00時52分

たー様、いつもコメントを下さり、ありがとうございます。また、CUDAに関するアドバイスを下さり、ありがとうございます。
職場で担当している、CUDA on GPUへのプログラム書き換え作業ですが、たー様の助言を参考にして、ある分岐命令(if文)を回避するように、アルゴリズムに変更を加え、何とかトラブルをクリアしました。それでも、計算速度は4倍程度にしかなっていません。
今後も、地道にCUDAの勉強を続けて行きたいと思います。
とにかく、私は、たー様に、とても感謝しています。
では、これからも、よろしくお願い致します。

投稿: ヒロ | 2009年6月11日 (木) 20時30分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/518994/29991339

この記事へのトラックバック一覧です: なぜか明日も休み:

« 散髪に行く | トップページ | ちょっとうれしいこと »