私は 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 はこれらの一般的なトリックを自動的に使用しますか?