ArrayFire ライブラリとメモリの使用に関する質問があります。プレーンな CUDA/C でいくつかのプログラムを実装し、ArrayFire を使用して同じプログラムを実装しました。CUDA/C プログラムははるかに高速です (ArrayFire のものよりも 5 倍高速です)。
両方で Nvidia プロファイラーをチェックしましたが、主な違いは memcpy 操作です。ArrayFire の場合、多くの Memcpy 操作があり、それ以外の場合は、プログラムの最初にいくつかあります。いくつかのテストを行うと、次のようなことを行うことがわかりました:
f = f*q;
f、q配列であると、このmemcpy呼び出しがより多く生成されます...これが、ArrayFireコードのパフォーマンスが向上しない理由だと思います。なぜこれが起こるのですか?どこから、このすべての Memcpys が来たのですか? どうすれば回避できますか?***** // コードの断片を //// 編集する
void Adveccion(){
for(int i = 0; i< q ; i++){
f(span,span,span,i) = shift( f(span,span,span,i) , V[1][i] , V[0][i] , V[2][i] );
}
}
f は 4 次元配列です。そして、私はこの関数を他の for ループ内に持っています。関数を次のように変更すると:
void Adveccion(){
for(int i = 0; i< q ; i++){
shift( f(span,span,span,i) , V[1][i] , V[0][i] , V[2][i] );
}
}
プロファイラーは、memcpys の大規模な使用を示していません。私の問題は、配列に新しい値を代入する正しい方法を見つけることだと思います...おそらくA = Bを使用するのは最善ではありませんが、まだ学ぶことがたくさんあります...
ご清聴ありがとうございました。さらにコードが必要な場合はお知らせください。ありがとう !