7

ゼロコピーが正確にどのように機能するかについて、少し混乱しています。

1- 以下がopenclのゼロコピーに対応していることを確認したい。

 .......................
 .           .         .  
 .           .         .
 .           . CPU     . 
 .   SYSTEM  .         .
 .    RAM    . c3 X    .  
 .         <=====>     .  
 ...|...................
   PCI-E     / /
    |       / /
 c2 |X     /PCI-E, CPU directly accessing GPU memory
    |     / /                          copy c3, c2 is avoided, indicated by X. 
 ...|...././................
 .   MEMORY<====>          .
 .   OBJECT  .c1           . 
 .           .     GPU     .
 .   GPU RAM .             .  
 .           .             .  
 ...........................




 .......................
 .           .         .  
 .           .         .
 .           .   CPU   . 
 .SYSTEM RAM .         .
 .           .         .
 .           . c3      .  
 .    MEMORY<====>     .           
 ...| OBJECT............
    |     \  \   
   PCI-E   \  \PCI-E, GPU directly accessing System memory.  copy c2, c1 is avoided
    |       \  \
 C2 |X       \  \
 ...|.........\..\...........
 .  |        .              .
 .       <=======>          . 
 .   GPU    c1 X   GPU      .
 .   RAM     .              .  
 .           .              .  
 ............................

GPU/CPU は、明示的なコピーなしで、システム/GPU-RAM に直接アクセスしています。

2-これを持つことの利点は何ですか? PCI-e は依然として帯域幅全体を制限しています。または、上記の状況で c2 と c1/c3 のコピーを回避できることが唯一の利点ですか?

4

1 に答える 1

15

ゼロコピーがどのように機能するかについての理解は正しいです。基本的な前提は、デバイスからホスト メモリ、またはホストからデバイス メモリにアクセスできることです。その間に中間のバッファリング手順を実行する必要はありません。

次のフラグを使用してバッファを作成することにより、ゼロコピーを実行できます。

CL_MEM_AMD_PERSISTENT_MEM //Device-Resident Memory
CL_MEM_ALLOC_HOST_PTR // Host-Resident Memory

次に、メモリ マッピング セマンティクスを使用してバッファにアクセスできます。

void* p = clEnqueueMapBuffer(queue, buffer, CL_TRUE, CL_MAP_WRITE, 0, size, 0, NULL, NULL, &err);
//Perform writes to the buffer p
err = clEnqueueUnmapMemObject(queue, buffer, p, 0, NULL, NULL);

ゼロコピーを使用すると、次のことを行った実装よりもパフォーマンスを向上させることができます。

  1. ファイルをホスト バッファにコピーする
  2. バッファをデバイスにコピーする

代わりに、すべてを 1 つのステップで行うことができます

  1. メモリ マップ デバイス側バッファ
  2. ホストからデバイスにファイルをコピーする
  3. メモリのアンマップ

一部の実装では、マッピングとマッピング解除の呼び出しにより、データ転送のコストを隠すことができます。私たちの例のように、

  1. メモリ マップ デバイス側バッファ [実際には同じサイズのホスト側バッファを作成]
  2. ホストからデバイスにファイルをコピー [実際にはホスト側のバッファに書き込みます]
  3. メモリのマップを解除 [clEnqueueWriteBuffer を介してホスト バッファからデバイス バッファにデータを実際にコピー]

実装がこのように実行されている場合、マッピング アプローチを使用するメリットはありません。ただし、AMD の OpenCL 用の新しいドライバーでは、データを直接書き込むことができるため、マッピングとマッピング解除のコストがほぼゼロになります。ディスクリート グラフィックス カードの場合、要求は引き続き PCIe バス経由で行われるため、データ転送が遅くなる可能性があります。

ただし、APU アーキテクチャの場合、ゼロコピー セマンティクスを使用したデータ転送のコストは、APU 独自のアーキテクチャ (下図) により、転送速度を大幅に向上させることができます。このアーキテクチャでは、PCIe バスがユニファイド ノース ブリッジ (UNB) に置き換えられ、より高速な転送が可能になります。

メモリ マッピングでゼロ コピーセマンティクスを使用すると、ホストからデバイス側のバッファを読み取るときに非常に恐ろしい帯域幅が表示されることに注意してください。これらの帯域幅は 0.01 Gb/s のオーダーであり、コードの新たなボトルネックになる可能性があります。

これがあまりにも多くの情報である場合は申し訳ありません。これが私の論文テーマでした。

APUのアーキテクチャ

于 2012-10-08T17:24:15.543 に答える