GPGPUを学びたい人たちへ

  • 投稿日:
  • by
  • Category:

ちょっと思ったことを まるく 書いていきます。

以前、物理屋さんと化学屋さん、計算屋さんが集まる研究会に参加しました。

私は計算屋さん(の卵)として参加したんですが、自分の研究に対して考えさせられるものでした。

 

私の専門はGPUを使った計算、GPGPUです。

この科学シミュレーションにGPGPUを適用すると、これだけ高速化できましたよ、という

計算屋では良くありがちな報告をしたのですが、反応はイマイチです。

というのも、計算屋、特にGPGPUを学んだ人以外には、やはりGPGPUの敷居は高すぎるのです。

 

現在、京(K-computer)を含み、多くのスパコンで使われている並列計算方式はMPIです。

最近ではさらに進んで、MPI+OpenMPのハイブリッド方式がよく用いられるようになってきています。

OpenMPの場合、初心者でも比較的簡単にプログラミングできて、一般的なコンパイラですぐに

コンパイルができます。そしてマルチスレッドに対応した今のCPUで動かせば、

簡単に数倍の高速化ができます。

 

MPI+GPGPUというハイブリッド方式もあるのですが、この場合はそう簡単にはいきません。

例えばCUDAなら、別途、CUDAのコンパイラが必要ですし、コンパイル方法も複雑だし、

デバッグにも一苦労です。

ブロックとスレッド、メモリ構造、更には使用するGPUアーキテクチャの仕様まで頭に叩きこんで

プログラミングしなければなりません。

なので、初心者からすれば、性能を出せるプログラミングをするのは至難の業です。

(一応、PGIコンパイラという自動的にGPGPUのコードを書いてくれるものもありますよ)

しかしながら、上手くGPUに合った計算アルゴリズムならば、数十倍〜数百倍の高速化が可能です。

OpenMPなんて比じゃありません。言ってみれば、ハイリスク・ハイリターンです。

こういう駆け引きがあるからこそ、GPGPUを使った計算高速化は一流論文誌にもアクセプトされるし、

計算屋さんが挑戦する面白さがあるのだと思います。

 

確かにGPGPUの性能は高いのですが、先走りすぎている感が否めません。

cuBLASなど、優れたライブラリも存在するのですが、結局スパコンを使うのは計算屋以外が多いのです。

なので、私が思うにGPGPUを学ぶと同時、いやそれ以前に、MPIやOpenMPなど、

GPGPUよりも非常に実用的な並列計算手法を十分に実践しておくべきじゃないかと思います。

そういう手法が使えることは、GPGPUの研究や論文を書くときに必ず役に立ちます。

 

そして近年の目まぐるしいGPGPUの発展、研究は、必ず将来につながると思います。

最近ではGPUメーカーが自動並列化コンパイラを開発していたり、IntelもGPUアーキテクチャと同じ

アクセラレータを発表したりと、注目度は増々高まっています。

消費電力の面でもCPUより有利なので、CPUにGPUがくっついている近年では

スパコンはもとより一般のコンピュータでもGPGPUを扱おうという取り組みが始まっています。

ソフトウェア業界でもGPGPUを扱える人間が重宝される時代が来るかもしれません。

GPGPUの未来は決して暗くなく、輝いていると私は研究(たった2年ですが)を通じて感じました。

 

[CUDA]FermiでのL1/Shared Mem サイズ変更

  • 投稿日:
  • by
  • Category:

FermiではL1キャッシュが利用できるようになった。L1は従来のSharedメモリと同じSM上にある。
L1/Sharedメモリの容量はGTX480の場合、

  ・L1が16KBならSharedは48KB、
  ・L1が48KBならSharedは16KB、
という二択になっている。

グローバルメモリやコンスタント、テクスチャメモリからのロード回数が多いプログラムの場合、
L1のサイズを優先し、上記のメモリからのロードを殆どしない、もしくはキャッシュヒットが
見込めないプログラムでは、Sharedメモリのサイズを優先したほうが効率がよさそうである。

そして、この2択は、cudaFuncSetCacheConfig(func, cacheConfig) 関数を使って選択できる。
func にはCUDAで実行するkernelのfunction名を、cacheConfigには、次のいずれかの設定値を入れる。

cudaFuncCachePreferNone:    L1/Sharedのサイズ選択をnvccにお任せ(default)
cudaFuncCachePreferShared: L1を16KB、Sharedを48KBに
cudaFuncCachePreferL1:         L1を48KB、Sharedを16KBに

エラー処理も含めるとこんな感じ。

         CUDA_SAFE_CALL(cudaFuncSetCacheConfig(
               cuda_Kernel,cudaFuncCachePreferL1) );
        

文献:CUDA API Reference Manual PDF 4.7.2.3 p38