2011年4月22日金曜日

4/22 Zero Copy

*最近OpenCL関係で検索すると自分のページがよく出てきますが、
*このブログはあくまでもただの学生の作業メモ日記なので、
*勘違いや嘘が多々含まれているかもしれません ご注意を

*致命的なミスなどがあったらご一報をお願いします



・AMD APUでZero Copyを使うには
AMDの4月発表の最新のAMD APP OpenCLプログラミングガイドの4.4を見るとよいそうだ。


・OpenCLのメモリオブジェクト
5種類に分けられるようだ。
1.Host Memory
2.Pinned Host Memory
3.Device-Visible Host Memory
4.Device Memory
5.Host-Visible Device Memory

詳細はAMDのガイドを参照すべきだが、簡単にまとめると、
Host/Device Memoryは名を冠するデバイス以外は直接参照不可能で、
一度Pinned Memory領域かホストのBufferにコピーしないと参照できない。

Pinned Host Memoryは物理メモリと直接対応付けされているので、
デバイスとのDMA通信が可能。領域サイズにより挙動は多少異なる。

Device-Visible Host MemoryはCPUのキャッシュを無効にした領域。
デバイスからのアクセスは早いが、CPUからのアクセス速度は低下。

Device Memoryはデバイス側のメモリ。アクセスはHostメモリの逆。
要はCUDAのGlobal Memory。
APUではDevice-Visible Host Memoryをこれとして扱うらしい。

Host-Visible Device MemoryはGlobal Memoryの一部で割り当て可能。
CPUからはPCIeを通したキャッシュ不可能なメモリ領域としてアクセス。速度は遅い。


・メモリオブジェクトの確保・アクセス
clCreateBufferで確保、clEnqueueReadBuffer / clEnqueueWriteBufferでアクセス。
clCreateImageなんてやつもあるらしい。

確保したオブジェクトを実際に配置するにはMappingを行う。
これはclEnqueueMapBufferで行う。
消す前にはclEnqueueUnmapMemObjectが必要で、clReleaseMemObjectで消し去れる。

オブジェクトの確保の際に、定数を引き渡すことでオブジェクトの性質?を決める。
これも色々あって複雑。WindowsかLinuxかでも動作が変わる。
1.Default(no flags)
2.CL_MEM_ALLOC_HOST_PTR
3.CL_MEM_USE_HOST_PTR
4.CL_MEM_USE_PERSISTENT_MEM_AMD

OpenCLプログラムの実行元がGPUか、APUのGPUか、CPUかで配置が変わるが、
CPUの場合は今回は無視。Windows以外の場合も無視。

デフォルトだとAPUではDevice-Visible Host Memory、
GPUではHostかDeviceのメモリを文脈に応じて選択。

CL_MEM_ALLOC_HOST_PTRではPinned Host MemoryでZero Copy。

CL_MEM_USE_HOST_PTRではデフォルトと同様になり、Copyされる。

CL_MEM_USE_PERSISTENT_MEM_AMDとCL_MEM_ALLOC_HOST_PTRの挙動の違いが謎だが、
Map Locationの説明が異なっている。
前者では異なるメモリエリアの割り当てがなされるが、
後者ではそれぞれのメモリマップに同一のメモリエリアが割り当てられるらしい。
どういった差異が発生するかはわからない。。。
4.4.3.1に書かれているようだがよくわからなかった。
どちらもWindows Vista/7環境ならZero Copyは可能なようだ。


・速度計測
clEnqueue系の命令にはイベント情報の格納先を指定することができるので、
そのイベント情報をclWaitForEventに引き渡せば実行を待つことが可能。
この時間を計測すれば各イベントの実行時間がわかる。便利。
使ったイベント情報はclReleaseEventで開放してあげよう。


・リモートデスクトップ
VNCなら大丈夫らしい。NVIDIA GPUでも同様の事例はあるらしく、
Windowsのリモートデスクトップの実装に起因しているらしい。MS頑張れ。

0 件のコメント:

コメントを投稿