バッファーの作成とデータ転送 - 2023.2 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

ホスト プログラムとハードウェア カーネル間の送受信方法は、バッファーの転送とデバイス内のメモリを転送されるデータによって異なります。このプロセスでは、 clCreateBuffer clEnqueueMigrateMemObjects のような関数を使用します。

重要: 現時点では、ホストからグローバル メモリまでのスループットを最大化するために 4 GB を上回るバッファーは使用できませんが、AMD ではバッファー サイズをできれば少なくとも 2 MB に抑えることをお勧めしています。

メモリ バッファーの割り当てとデータの転送には、次の 2 つの方法があります。

  1. XRT のバッファー割り当て
  2. ホスト ポインター バッファーの使用

XRT でバッファーを割り当てる場合は、enqueueMapBuffer を使用してバッファー ハンドルを取得します。2 つ目の方法では、CL_MEM_USE_HOST_PTR でバッファーを直接割り当てるので、ハンドルを取得する必要はありません。

ヒント: エンベデッド プラットフォームには CL_MEM_USE_HOST_PTR を使用しないでください。エンベデッド プラットフォームには、連続したメモリ割り当てが必要で、XRT のバッファー割り当て で説明するように CL_MEM_ALLOC_HOST_PTR を使用する必要があります。

最大限のパフォーマンスおよび詳細な制御をするためのさまざまなコーディング プラクティスがあります。OpenCL API では、バッファーの読み出しおよび書き込み用に追加のコマンドがサポートされていますが、たとえば、 clEnqueueWriteBuffer clEnqueueReadBuffer コマンドを clEnqueueMigrateMemObjects の代わりに使用できます。ただし、これらのコマンドの中には効果の異なるものもあるので、よく理解してから使用するようにしてください。たとえば、 clEnqueueReadBufferRect はバッファー オブジェクトの矩形領域をホスト アプリケーションに読み出すことはできますが、デバイスのグローバル メモリからはホストにデータを転送しません。まず clEnqueueReadBuffer を使用してデバイスのグローバル メモリからデータを転送し、その後に clEnqueueReadBufferRect を使用して必要な矩形領域をホスト アプリケーションに読み出す必要があります。