私の質問は、ホストとデバイス間の異なる非同期キューで複数のアレイを転送する影響についてです。openacc - async - 多くの非同期キューを使用するとデータ転送速度が向上する
double *a, *b, *c, *d;
そして、それぞれがN
のサイズで割り当てられています
は、我々は4つの配列を持っていると仮定します。我々は多くの非同期条項にを使用し、異なるキューにそれらを転送することができ
#pragma acc enter data copyin(a[0:N], b[0:N], c[0:N], d[0:N]) async
#pragma acc wait
または、::
a = (double*) malloc(N * sizeof(double));
b = (double*) malloc(N * sizeof(double));
c = (double*) malloc(N * sizeof(double));
d = (double*) malloc(N * sizeof(double));
今、私たちは、1節に、次のようなデバイスとホストとの間でそれらを転送することができます
#pragma acc enter data copyin(a[0:N]) async(1)
#pragma acc enter data copyin(b[0:N]) async(2)
#pragma acc enter data copyin(c[0:N]) async(3)
#pragma acc enter data copyin(d[0:N]) async(4)
#pragma acc wait
上記の両方のアプローチの結果は同じです。しかし、パフォーマンス面では、2番目の方が良い場合もあります。
私はいくつかの測定を行いましたが、ホストの更新と更新では、more
を使用しているキューの方が性能面ではone
より優れているようです。
のは、最初のアプローチone
、及び第二のアプローチmore
、およびアプローチmore_nonumber
次(非同期句には数に気付かない)を呼び出してみましょう:次に
#pragma acc enter data copyin(a[0:N]) async
#pragma acc enter data copyin(b[0:N]) async
#pragma acc enter data copyin(c[0:N]) async
#pragma acc enter data copyin(d[0:N]) async
#pragma acc wait
、ここでは(最初の100を除く万回の繰り返しのための測定であります間に9,800回の反復の平均を導く100の最後のもの):
one
COPYIN:64.273us
更新デバイス:60.928us
更新自己:69.502us
CopyOut:70.929us
more
COPYIN:65.944us
更新装置:62.271us
更新自己:60.592us
CopyOut:59.565us
more_nonumber
COPYIN:66。018us
更新デバイス:62.735us
更新自己:70.862us
CopyOut:72.317us
平均9800の実行!
one
、または更新自己(69.502/60.592)の14%と比較しmore
方法を使用する場合、19%の高速化は、(70.929/59.565)copyout観察されます。
私の質問: これらの数字は正当なものですか?これらの数字に頼ることはできますか?
お客様の便宜のため、githubに私のコードを記載しました。あなたはそれを見ることができます。
おかげで再びマット。固定メモリーを使用するシステムでは、** one **メソッドが勝者です。しかし、私のシステムでは、固定メモリを使用すると、** more **が向上し、スピードアップが向上します! (PGI 16.5 - Geforce GTX 970 - CUDA 7.5 - CC 5.0)----固定メモリに関する別の質問があります:プログラム/アルゴリズムがメモリにバインドされていると言うと、操作が実行されます。 – Millad
私にとって、メモリが束縛されているということは、アルゴリズムが計算よりもメモリを待つのに多くの時間を費やし、プロセッサがアイドル状態になることを意味します。 GPU上でメモリにバインドされた問題の解決に役立つのは、あるスレッドがメモリを待っている間に別のスレッドが実行できるように、スレッドを追加することです。固定メモリがホストCPU上のメモリ境界問題(ページスワップなし)に役立つことはできませんでしたが、この文脈では、2つは関連しているとは思われません。 –