CUDAコンピューティング最適化の例

はじめに



CUDA計算最適化手法をプラズマモデリングに適用した結果について説明します。 計算は、GT630(Kepler)のCUDA(JCUDA)[1]へのJavaバインディングを使用して実行されます。 モデリングは、Cauchy問題の解決策として行われます。初期値にパラメーター値を設定してから、時間を増やして、すべての方程式を再計算するなどです。 繰り返します。 計算は倍精度で行われます。 結果の正確性は、JCUDAを使用しないCPUでの計算によって確認されます。



プラズマ中のラングミュア波のパラメトリック不安定性のモデルは、振幅、位相、イオン密度、電界強度の方程式(各タイプの方程式の数は400)、イオンの運動方程式(その数は20,000)、および2つのポンプ方程式で構成されます。 関数ライブラリ(cublasなど)は使用されず、GPUで計算するための方程式のコードは.cuファイルに手動で書き込まれます。



1 CUDAでの計算の最適化の主な方法の適用



1.1。 GPUとRAMの間のデータ転送を最小限に抑えることが重要です。これは、CPUに比べて加速が見られないコードをGPUで実行することを意味する場合でもです[2]。 したがって、GPUのポンプパラメーターの計算は、次のように並行して行われます。 それらは2つの方程式のみで記述されます。 CPUでの計算は高速になりますが、データの交換には時間がかかります。



1.2。 計算の初期データは、シミュレーションを開始する前にGPUメモリに一度ロードされます。 さらに、RAMとGPU間の交換は、結果を保存する必要がある時刻を除いて存在しません。



1.3。 ポンピングの計算を除くすべての方程式の計算は並行して行われます(1つの方程式を計算するために1つのストリームが作成されます)。 計算速度が最大になるグリッドとブロックの寸法が選択されます。 私たちの経験によると、ブロックの次元(ブロック内のスレッドの数)は小さくも大きくもありません。GPUのコアの数(GPUで少なくとも500コアまで)にほぼ等しくなければなりません。



1.4。 GPUメモリにロードされたすべてのデータはグローバルメモリに保存されますが、GPUには高速タイプのメモリ(共有および一定)があります。 ただし、それらを使用しようとしても1%の効果しかありませんでした。



1.5。 コード内の一部の場所では、同じ計算が何度も実行されます。 たとえば、a * bが繰り返される場合、変数c = a * bが作成され、その後使用されます。 同様に、いくつかの最適化が行われましたが、その効果は1%です。



2三角関数の使用の最適化



GPUで計算する場合、85%の時間は三角関数の計算であるため、このタスクに三角関数を使用する最適化が重要です。



2.1。 sinpi、cospi関数がありますが、モデルでは4つの関数のみが適切な形式を持ち、それらの使用の効果は2%です。



2.2。 サインとコサインを同時に計算するsincos関数もあります。 その使用の効果は50%です。 ただし、重大な欠点は、各計算でサインとコサインの値を格納するためのメモリを割り当てる必要があることで、その使用が複雑になります。



2.3。 各時点でサインとコサインを事前に計算(つまり、値のテーブルを作成)し、計算された値を方程式で使用しようとしました。 4分の1の関数には同じ引数を持つ同様の関数がありますが、この最適化手法を使用すると最大5%の効果が得られます。



2.4。 CUDAでは、すべてのマット。 この関数には、精度が異なるいくつかの実装があります-ダブル関数(sin、cos)、フロート関数(sinf、cosf)、低精度関数(__sinf、__ cosf)。 そのため、サインとコサインのフロート関数を使用すると、方程式の計算を60%高速化し、サインとコサインの関数を使用すると精度が70%低下します。 ただし、他の計算は引き続き倍精度で実行され、結果の精度は維持されます。



結論



三角関数の使用を最適化する前のGPUでのシミュレーション時間は20分でした。 段落1.1、1.2、1.3を適用する前のシミュレーション時間は測定されませんでした。 これらの段落の規定は最初に実装されました。



最適化後のシミュレーション時間は7分で、そのうち90%はGPU計算(CUDA)、10%は結果の保存に関連するCPUの追加計算(Java)、GPUメモリとRAM間のデータ交換は0.01%です。



成功した方法-1.1、1.2、1.3、2.4-GPUメモリとRAM間のデータ交換は最小限に抑えられ、主な計算はGPUに転送されて並列化され、最適な並列化パラメーターが選択されました-グリッドとブロックのサイズ、精度が低下した三角関数が使用されました。



低効率またはコードの複雑さのために放棄されなければならなかったメソッド-1.4、1.5、2.1、2.2、2.3-計算の数を減らすための値の予備計算、高速タイプのGPUメモリの使用を試みます。



さまざまな最適化手法を適用した結果は、シミュレートされた問題の詳細によって説明できます。



この調査は、数百回シミュレートされました。 パーティクルの数が多い場合があります(パーティクルの数を2倍に増やすと、シミュレーション時間が4倍になります)。 したがって、1つのシミュレーションでわずかな時間を節約するだけで、最終的には大幅に節約できます。 より強力なグラフィックスカードでシミュレーションを実行する機会はありません。 比較はあまり正確ではありませんが、2.2 GHzプロセッサの1つのコアでのJavaでの計算と比較したJCUDAでの加速は、選択したアカウントパラメーターに応じて35から数百倍です。 開発は他のタスクでも使用されます。



文学



1.マルコハッター。 JCUDA。 jcuda.org

2. CUDA Cベストプラクティスガイド。 NVIDIA Corporation。 docs.nvidia.com/cuda/cuda-c-best-practices-guide



この記事の1つの研究に含まれる作品(2014年5月2日追加)



1.最適化の詳細については、記事it-visnyk.kpi.ua/wp-content/uploads/2014/01/Issue-58.pdf (ページ125-130)に記載されています。

数はわずかに異なりますが、本質は同じです。

プリマックA.V. プラズマ中のラングミュア波の不安定性をモデル化する際のCUDAでの計算の最適化。 // NTUU "KPI"のニュース。 情報学、制御およびobucchuyvalna技術:。 科学。 など-K。:Vek +、-2013。-No.58。-C. 125-131。

2.シミュレートされた問題の説明vant.kipt.kharkov.ua/TABFRAME.html (選択2013 No. 4(86))

Belkin EV、Kirichok AV、Kuklin VM、Pryjmak AV、Zagorodny AG シリーズ「プラズマエレクトロニクスと新しい加速方法」。 2013年、No。8、p。260-266。

3. JCUDA csconf.donntu.edu.ua/arxiv (まだ投稿されていない資料)の使用について

プリマックA.V. ラングミュア波のパラメトリック不安定性の発生中にJCUDAテクノロジーを使用してイオンダイナミクスをモデル化する。 -情報学とコンピューター技術/学生、大学院生、若い科学者によるIX国際科学技術会議の議事録。 -2013年11月5〜6日、ドネツク、DonNTU。 -2013 .-- S. 200-204。

4.ソフトウェアカンファレンスのモデリングについてconferences.neasmo.org.ua/node/2924

プリマックA.V. プラズマ中のラングミュア波の変調不安定性のハイブリッドモデルのソフトウェア開発。 XVII国際科学および実用インターネット会議「CIS諸国における第3千年紀の初めの科学発展の問題と展望」の資料//科学論文集。 -2013年11月29〜30日、ペレヤスラフフメリニツキー、ペレヤスラフフメリニツキーDPU im。G.スコボロディ。 -S.155-159。



All Articles