17

私は GPU プログラミングにまったく慣れていませんが、計算量の多いタスクがあるため、可能なパフォーマンス向上のために GPU に目を向けました。

ArrayFire Free版でプログラムを書き換えてみました。マルチスレッドが有効になっている私の CPU ルーチンよりも確かに高速ですが、期待したほどではなく (つまり、100% 未満の速度向上)、返された結果は正しくありません (CPU ルーチンと比較して 1% 未満のエラーであると仮定すると、 CPU ルーチンの結果は正しい)。

私のタスクは主に大きな行列 (300MB ~ 500MB サイズ) での要素単位の float-32 数学演算であり、if-thes/switch-cases などはほとんどありません。パフォーマンスのボトルネックはおそらく CPU と GPU メモリ間の帯域幅であると思います。テストした GPU は、3 GB のビデオ メモリを搭載した GeForce 580GTX です。

タスクに ArrayFire を使用する代わりに、未加工の CUDA コード (CUBLAS などと平均的な最適化を使用) を記述した場合、最適化の余地はまだありますか? NVIDIA 最適化ガイドをいくつか読みました。データアクセスを高速化し、バンク競合を減らすためのメモリアクセスのトリックがいくつかあるようです。ArrayFire はこれらの一般的なトリックを自動的に使用しますか?

4

1 に答える 1

22

投稿ありがとうございます。最初の結果がスピードアップをもたらしたと聞いてうれしく思います。私はArrayFireに取り組んでおり、あなたの質問にここで答えることができます.

何よりもまず、具体性を支援するために、ここではコードが本当に必要です。あなたが書いたコードを共有できますか?

次に、CUDA と ArrayFire について次のように考える必要があります。CUDA は、必要な GPU コードを記述できるようにする GPU をプログラムする方法です。しかし、素朴な CUDA コード (多くの場合、CPU よりも遅い) と、時間をかけて手作業で最適化された熟練した CUDA コードとの間には大きな違いがあります。ArrayFire (および CUBLAS などの他の GPU ライブラリ) には、何年にもわたる最適化が注ぎ込まれており、通常、ほとんどの普通の人が自力で達成する時間よりも優れた結果が得られます。ただし、ArrayFire (またはその他のライブラリ) の使い方には個人差があります。最高のパフォーマンスを得るために、ArrayFire ライブラリ呼び出しを使用する際に微調整できる変数があり、微調整する必要があります。コードを投稿していただければ、その一部をここで共有できます。

第 3 に、ArrayFire は BLAS に依存する関数で CUBLAS を使用するため、CUBLAS を直接使用しても大きな違いは見られません。

4番目に、はい、ArrayFireは、NVIDIA CUDAプログラミングガイドで利用可能なすべての最適化を使用します(たとえば、データ転送の高速化や、言及したメモリバンクの競合の削減など)。ArrayFire 開発の大部分は、そのようなものを最適化することに重点を置いています。

最後に、お気づきのデータの不一致は、CPU と GPU コンピューティングの性質によるものと思われます。これらは異なるデバイスであるため、わずかに異なる結果が表示されることがよくあります。CPU が GPU よりも優れた結果をもたらすということではなく、どちらもわずかに異なる方法で有限の精度で動作しているということです。倍精度ではなく単精度を使用している場合は、それを検討してください。コードを投稿すると、その点でも役立ちます。

コードが投稿されたら、私の答えを喜んで拡大してください。

于 2012-09-29T23:06:16.380 に答える