0

インテル Xeon Phi コプロセッサーからホスト CPU へのデータ転送に問題があります。オフロード モデルを使用して計算を実装しようとしています。計算の開始時に、すべてのデータをコプロセッサー (1 つの配列) に転送します。計算後、この配列の一部のみをホスト プロセッサに転送したいのですが、結果として次のエラーが発生します。

オフロード エラー: データ転送 (ベース = 0x75654640、サイズ = 7896016) は既存の割り当てのサブセットではありません (ベース = 0x75654640、サイズ = 4512008)

ソースコードの一部を次に示します。

array_Dc = _mm_malloc(...);
...
#pragma offload target(mic : micZero) \
 in(array_Dc : length(size) alloc_if(0) free_if(0)) \
 out(array[micBegin : micEnd] : alloc_if(0) free_if(0) 
{
   //...
}

この場合、この配列のサイズ = 564001、micBegin = 423001、micEnd = 564001 です。CPU によって使用されるため、データを転送する必要があります。問題とは何ですか?それを解決する方法は?

4

1 に答える 1

2

コプロセッサーに割り当てるべき配列の量を伝えずに、配列の一部を転送しようとしていると不平を言っています。転送する配列の一部だけを割り当てたいのか、より大きな部分を割り当てたいのか、配列全体を割り当てたいのかを知りたいのです。できることがいくつかあります。1 つは、alloc オプションを使用することです。16.0 コンパイラのドキュメントでは、 Allocating Memory for Parts of Arrays で指示を見つけることができます。基本的に、 out オプションは次のようになります-コプロセッサー上の完全な配列にスペースを割り当てたいと仮定すると:

#pragma offload ........... out(array[micBegin : micEnd] : alloc[0 : 564001])

別のオプションは、たとえば offload_transfer を使用して、配列の割り当てをデータ転送から分離することです。16.0 コンパイラのドキュメントでは、 About Asynchronous Data Transferで指示を見つけることができます。

最後にもう 1 つ - C/C++ では、micEnd の値は、最後の要素のインデックスになる Fortran とは異なり、要素の数になります。昔の Fortran プログラマーとして、これは私を壁に押し上げますが、それはその通りです。

于 2015-12-14T18:44:42.217 に答える