2

そのため、MPI を使用して複数のマシンに分散されている OpenCL を使用して実装したいアプリケーションがあります。

アルゴリズムの反復ごとに、MPI プロセス間でバッファーを同期する必要がありますが、ここに問題があります。領域全体ではなく、2D バッファーの境界のみを同期/コピーする必要があります。

したがって、私の質問は、OpenCL のメモリ マッピング メカニズム (clEnqueueMapBuffer & clEnqueueUnmapMemObject) を使用して、バッファー全体の完全なコピーをトリガーすることなく、2D バッファーの境界のみを読み書きできるかどうかです。

基本的に、これは OpenCL がホスト側のバッファ コピーの代わりに DMA を使用している場合にのみ機能します。したがって、私の質問は、OpenCL がディスクリート PCIe GPU 上のデバイス バッファ データの DMA アクセスをサポートしているかどうかです。はいの場合、どのハードウェアとどのオペレーティング システムで使用しますか?

4

1 に答える 1

3

DMA を使用できるようにするには、バッファをページロック メモリに配置する必要があります。AMD と NVIDIA はプログラミング ガイドで、ページロック メモリにバッファを作成するには、CL_MEM_ALLOC_HOST_PTR フラグを使用して作成する必要があると述べています。NVIDIA がそのガイドのセクション 3.3.1 で述べていることは次のとおりです。

OpenCL アプリケーションは、メモリ オブジェクトがページ ロック メモリに割り当てられるかどうかを直接制御できませんが、CL_MEM_ALLOC_HOST_PTR フラグを使用してオブジェクトを作成できます。そのようなオブジェクトは、最適なパフォーマンスを得るためにドライバによってページ ロック メモリに割り当てられる可能性があります。

太字の「可能性が高い」に注意してください。

どのOS?NVIDIA は OS について語っていないため、NVIDIA が提供するすべての OS (AMD の場合も同様) に対してドライバーを提供します。
どのハードウェア? 私が推測するDMAコントローラーを持っている人。

バッファの一部だけを書き込むには、次の関数を参照してください。

clEnqueueWriteBufferRect()

この関数を使用すると、バッファの 2 次元または 3 次元領域に書き込むことができます。もう1つの可能性は、関数でそれらを作成するサブバッファを使用することです:

clCreateSubBuffer()

ただし、2D バッファーの概念はありません。

于 2013-07-12T08:20:02.087 に答える