インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

配列の一部へのメモリーの割り当て

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。

このトピックは、alloc 修飾子と offload プラグマのセットを使用する方法について説明します。

alloc 修飾子には、部分配列参照が含まれます。この修飾子を指定すると、コプロセッサーの割り当ては配列の形状に制限されます。配列内ではユニットストライドのみ許可されます。2 つ以上のランクが含まれている場合、2 つ目以降のインデックス式でその次元のすべての要素を指定しなければなりません。部分配列は連続していなければなりません。

データは、in または out 式で指定された配列の一部に転送されます。このため、メモリー割り当てとデータ転送で別の配列スライス参照を使用できます。

alloc 修飾子で使用される部分の最初の次元の下限が非ゼロの場合、メモリー割り当てはその要素から始まります。下限よりも前のメモリーは割り当てられないため、プログラムから参照しないでください。この部分を参照しないことにより、配列全体の割り当てを行うことなく、配列のより小さな部分をコプロセッサーに転送することができます。

次の例について考えてみます。
int *p;
//  1000 個の要素を割り当て、データを p[10:100] に転送
#pragma offload … in ( p[10:100] : alloc(p[5:1000]) )
{ … }

typedef int ARRAY[4][4];
ARRAY *p;
p = malloc(…);

// コプロセッサーで 16 個の要素を形状 5x4 の配列に割り当て
// 最初の列は割り当て不可
// データを列 2 にのみ転送
#pragma offload … in ( (*p)[2][:] :  alloc([1:4][:]) )
{ … }

関連情報