質問

誰かがこれを利用するアプリケーションを書いたかどうか知りたいと思っています。 GPGPU たとえば、 nVidia CUDA. 。ある場合、どのような問題が見つかり、標準の CPU と比較してどのようなパフォーマンスの向上が得られましたか?

役に立ちましたか?

解決

私はGPGPU開発を行ってきました ATIのストリームSDK Cudaの代わりに。どのようなパフォーマンスの向上が得られるかは、 多く さまざまな要因がありますが、最も重要なのは数値的な強度です。(つまり、メモリ参照に対する計算操作の比率。)

2 つのベクトルを加算するような BLAS レベル 1 または BLAS レベル 2 関数は、3 つのメモリ参照ごとに 1 つの演算演算のみを実行するため、NI は (1/3) になります。これは常に実行されます もっとゆっくり CPU で実行するだけではなく、CAL または Cuda を使用します。主な理由は、CPU から GPU へのデータの転送、およびその逆の転送にかかる時間です。

FFT のような関数の場合、O(N log N) 回の計算と O(N) 回のメモリ参照があるため、NI は O(log N) になります。N が非常に大きい場合 (1,000,000 など)、GPU で実行した方が高速になる可能性があります。N が小さい場合 (たとえば 1,000)、ほぼ確実に遅くなります。

行列の LU 分解やその固有値の検出などの BLAS レベル 3 または LAPACK 関数の場合、O( N^3) 回の計算と O(N^2) 回のメモリ参照があるため、NI は O(N) になります。非常に小さい配列の場合、たとえば N が少数のスコアである場合、これは CPU で実行する方が高速になりますが、N が増加すると、アルゴリズムはメモリ依存から計算依存に非常に早く移行し、GPU でのパフォーマンスの向上が非常に向上します。素早く。

複雑な算術演算を伴うものはすべて、スカラー演算よりも多くの計算を必要とし、通常、NI が 2 倍になり、GPU のパフォーマンスが向上します。


(ソース: アースリンクネット)

これは、Radeon 4870 で実行される複雑な単精度行列と行列の乗算である CGEMM のパフォーマンスです。

他のヒント

私は簡単なアプリケーションを作成しましたが、浮動小数点計算をパラレル化できると非常に役立ちます。

イリノイ大学アーバナ シャンペーン教授と NVIDIA エンジニアが共同指導した次のコースが、私が勉強を始めたときに非常に役立つことがわかりました。 http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (すべての講義の録画が含まれます)。

私はいくつかの画像処理アルゴリズムに CUDA を使用しました。もちろん、これらのアプリケーションは CUDA (または任意の GPU 処理パラダイム) に非常に適しています。

IMO によれば、アルゴリズムを CUDA に移植する際には、次の 3 つの一般的な段階があります。

  1. 初期移植: CUDA の非常に基本的な知識がある場合でも、簡単なアルゴリズムを数時間以内に移植できます。運が良ければ、パフォーマンスが 2 ~ 10 倍向上します。
  2. 簡単な最適化: これには、入力データのテクスチャの使用と多次元配列のパディングが含まれます。経験豊富な方であれば、これは 1 日以内に実行でき、パフォーマンスがさらに 10 倍向上する可能性があります。結果として得られるコードは引き続き読み取ることができます。
  3. 本格的な最適化: これには、グローバル メモリの遅延を回避するためにデータを共有メモリにコピーすること、使用されるレジスタの数を減らすためにコードを裏返すことなどが含まれます。この手順には数週間かかる場合がありますが、ほとんどの場合、パフォーマンスの向上にはそれほど価値がありません。この手順を完了すると、コードは非常に難読化され、(あなたも含めて) 誰もコードを理解できなくなります。

これは、CPU 用のコードの最適化に非常に似ています。ただし、パフォーマンスの最適化に対する GPU の応答は、CPU の場合よりもさらに予測しにくいです。

私は、画像処理による動き検出 (当初は CG、現在は CUDA を使用) と安定化 (CUDA を使用) に GPGPU を使用してきました。このような状況では、約 10 ~ 20 倍のスピードアップが得られました。

私が読んだところによると、これはデータ並列アルゴリズムではかなり典型的なものです。

私はまだ CUDA に関する実際的な経験を持っていませんが、このテーマを研究しており、GPGPU API (すべて CUDA が含まれています) を使用した肯定的な結果を文書化した多くの論文を見つけました。

これ では、効率的なアルゴリズムに組み合わせることができる多数の並列プリミティブ (マップ、散布、収集など) を作成することでデータベース結合を並列化する方法について説明します。

この中で , 、AES 暗号化標準の並列実装が、目立たない暗号化ハードウェアと同等の速度で作成されます。

最後に、これ 構造化および非構造化グリッド、組み合わせロジック、動的プログラミング、データ マイニングなどの多くのアプリケーションに CUDA がどの程度適切に適用されるかを分析します。

財務上の用途のために、CUDA でモンテカルロ計算を実装しました。最適化された CUDA コードは、「もっと努力できたかもしれないが、それほど努力できなかった」マルチスレッド CPU 実装よりも約 500 倍高速です。(ここでは GeForce 8800GT と Q6600 を比較しています)。ただし、モンテカルロ問題が恥ずかしいほど並列していることはよく知られています。

発生する主な問題には、G8x および G9x チップの IEEE 単精度浮動小数点数への制限による精度の損失が含まれます。GT200 チップのリリースにより、パフォーマンスは多少犠牲になりますが、倍精度ユニットを使用することでこの問題をある程度軽減できます。まだ試していません。

また、CUDA は C 拡張機能であるため、これを別のアプリケーションに統合するのは簡単ではありません。

GPU に遺伝的アルゴリズムを実装し、約 7 の高速化を実現しました。他の人が指摘したように、数値強度が高くなると、より多くの利益が得られる可能性があります。はい、アプリケーションが正しければ、利益は得られます

私は、それを使用していたアプリケーションで cuBLAS 実装を約 30% 上回る複素数値行列乗算カーネルを作成しました。また、残りの部分では乗算トレース ソリューションよりも数桁大きい、一種のベクトル外積関数を実行しました。問題。

最終年度のプロジェクトでした。まるまる1年かかりました。

http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf

ATI Stream SDK を使用して、GPU 上で大きな線形方程式を解くためのコレスキー因数分解を実装しました。私の観察は次のとおりです

alt text

パフォーマンスが最大 10 倍高速化されました。

同じ問題を複数の GPU にスケールすることでさらに最適化するために取り組んでいます。

はい。私が実装したのは、 非線形異方性拡散フィルター CUDA APIを使用します。

これは、入力画像を指定して並列実行する必要があるフィルターであるため、非常に簡単です。必要なのは単純なカーネルだけなので、これに関してはあまり困難には遭遇しませんでした。高速化は約 300 倍でした。これが私のCSでの最後のプロジェクトとなりました。プロジェクトが見つかる ここ (それはポルトガル語で書かれています)。

を書いてみました マムフォード&シャー セグメンテーション アルゴリズムも含まれていますが、CUDA はまだ初期段階にあるため、奇妙なことがたくさん発生するため、作成するのは大変でした。を追加することでパフォーマンスが向上したこともあります。 if (false){} コードではO_O。

このセグメンテーション アルゴリズムの結果は良好ではありませんでした。CPU を使用した場合と比較して、パフォーマンスが 20 倍低下しました (ただし、CPU であるため、別のアプローチを使用しても同じ結果が得られる可能性があります)。まだ制作途中ですが、残念ながら取り組んでいた研究室を辞めてしまったので、いつか完成するかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top