含虚拟资源注解的加载和存储 - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文

AI 引擎可在每个周期内执行多次矢量加载或存储操作。但这些操作必须以不同存储体为目标才能并行执行加载或存储操作。总之,编译器会尝试尽可能在同一个周期内调度多次存储器访问,但也存在例外情况。源自同一指针的多次存储器访问调度为在不同周期内执行。如果编译器在同一个周期内对多个变量或指针调度执行多项操作,则可能发生存储体冲突。

为了避免并发访问含多个变量或指针的存储器,编译器提供了以下 aie_dm_resource 注解,用于给不同虚拟资源添加注解。使用与相同虚拟资源关联的类型执行访问并不会被调度为在同一个周期内访问该资源。

__aie_dm_resource_a
__aie_dm_resource_b
__aie_dm_resource_c
__aie_dm_resource_d
__aie_dm_resource_stack

例如,以下代码会将两个阵列注解到同一个 __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