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