仮想リソース アノテーションを使用したロードおよびストア - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

AI エンジンでは、1 サイクルごとに複数のベクター ロードまたはストアを実行できます。ただし、ロードまたはストア操作を並列実行するには、異なるメモリ バンクをターゲットとする必要があります。通常、コンパイラは同じサイクルでできるだけ多くのメモリ アクセスをスケジュールするよう試みますが、例外があります。同じポインターからのメモリ アクセスは、異なるサイクルにスケジュールされます。複数の変数またはポインターに対する演算が同じサイクルにスケジュールされる場合、メモリ バンクの競合が発生することがあります。

複数の変数またはポインターで 1 つのメモリに同時にアクセスするのを避けるため、異なる仮想リソースをアノテートする次の aie_dm_resource アノテーションが提供されています。同じ仮想リソースに関連付けられているタイプを使用するアクセスは、同じサイクルでそのリソースにアクセスするようにはスケジュールされません。

__aie_dm_resource_a
__aie_dm_resource_b
__aie_dm_resource_c
__aie_dm_resource_d
__aie_dm_resource_stack

たとえば、次のコードでは 2 つの配列を同じ __aie_dm_resource_a にアノテートしており、同じ命令ではアクセスされません。

v8int32 va[32];
v8int32 vb[32];
v8int32 __aie_dm_resource_a* restrict p_va = (v8int32 __aie_dm_resource_a*)va;
v8int32 __aie_dm_resource_a* restrict p_vb = (v8int32 __aie_dm_resource_a*)vb;
//access va, vb by p_va, p_vb 
v8int32 vc;
vc=p_va[i]+p_vb[i];

次のコードでは、配列とウィンドウ バッファーを同じ __aie_dm_resource_a にアノテートしており、同じ命令ではアクセスされません。

void func(input_window_int32 * __restrict wa, ......
  v8int32 coeff[32];
  input_window_int32 sa;
  v8int32 __aie_dm_resource_a* restrict p_coeff = (v8int32 __aie_dm_resource_a*)coeff;
  input_window_int32 __aie_dm_resource_a* restrict p_wa = (input_window_int32 __aie_dm_resource_a*)&sa;
  window_copy(p_wa,wa);
  v8int32 va;
  va=window_readincr_v8(p_wa);//access wa by p_wa