2012-09-29 11 views
11

私はGPUのプログラミングには全く新しいですが、計算量の多いタスクがあるので、パフォーマンスの向上のためにGPUを使用しました。ArrayFireと未処理のCUDAプログラミングはどちらですか?

ArrayFire Freeバージョンでプログラムを書き直そうとしました。実際には、マルチスレッドが有効になっているが、予想した程度(すなわち、<の100%のスピードアップ)ではなく、CPUルーチンよりもCPUルーチンよりも高速で、返された結果は正しくありません(< CPUルーチンと比較して1% CPUルーチンの結果は正しい)。

私の仕事は、大規模な行列(300MB-500MBサイズ)での要素的な浮動小数点演算ですが、if-thens/switch-caseなどはほとんどありません。パフォーマンスのボトルネックはCPUとGPUの間の帯域幅私は、3GBのビデオメモリを搭載したGeForce 580GTXをテストしました。

私のタスクにArrayFireを使用する代わりに、生のCUDAコード(CUBLASなど、平均的な最適化)を書くと、最適化の余地はまだありますか? NVIDIAの最適化ガイドを読みました。高速なデータアクセスと銀行間の競合を減らすために、そこにメモリアクセストリックが存在するようです。 ArrayFireはこれらの一般的なトリックを自動的に使うのですか?

答えて

16

ありがとうございます。初期の結果を聞いてうれしかったので、スピードアップができました。私はArrayFireで作業し、ここであなたの質問にチャイムすることができます。

まず最初に、誰かが特異性を助けるためのコードが本当に必要です。あなたが書いたコードを共有できますか?

第2に、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よりも優れた結果を出すのではなく、わずかに異なる方法で有限の精度で作業しています。倍精度ではなく単精度を使用している場合は、それを考慮する必要があります。コードを投稿することで、私たちもその手助けをすることができます。

私の答えを広げることを嬉しく思います。

+0

IEEE仕様に準拠していませんか?両方で「単精度」を使用すると同じ結果が得られるはずです。ここでも計算の順序は同じであると仮定します。 – Royi

関連する問題