更新时间:2021-03-18 GMT+08:00
分享

Vector计算

TIK提供了大量计算类API以调用Vector计算资源展开计算,用户需要关注API参数的合理设置以及背后的原理。考虑到API参数的共通性,以下仅以矢量单目运算API为例进行阐述。矢量单目运算的函数原型如下所示:

instruction(mask, dst, src, repeat_times, dst_rep_stride, src_rep_stride)

其中,mask表示Vector的每个计算单元是否参与运算。若数据充分,Vector一次最多可计算8个block,此时mask值取得对应数据类型下的最大值;若数据不足,只能让部分Vector计算单元参与时,则根据实际数据量对mask进行取值。值得注意的是,TIK提供了连续模式和逐bit两种模式对mask进行赋值。其中,连续模式使用简单,而逐bit模式更灵活且复杂,用户可根据使用习惯和实际场景选择使用。

参数dst、src分别表示目的操作数和源操作数,也是Vector读取的数据起始地址。参数repeat_times、dst_rep_stride、src_rep_stride是计算类API中需要着重注意的参数。在当前版本的TIK API中,Vector每次读取连续的256 bytes数据进行计算;为完成对输入数据的处理,Vector必须通过多次迭代(repeat)才能完成所有数据的读取与计算,而repeat_times表示单次API调用中执行的迭代次数。考虑到每次API启动都有固定时延,将多次迭代放入单次API调用中,可大幅减少不必要的启动开销,从而提升整体执行效率。顾及AI Core本身的硬件限制,repeat_times取值上限为255。dst_rep_stride、src_rep_stride分别表示目的操作数和源操作数在相邻迭代间相同block间的地址步长,如图1所示;为方便起见,这类参数以下记为*_rep_stride。

图1所示,假设定义一个Tensor供目的操作数和源操作数同时使用(即地址重叠),*_rep_stride取值为8。此时,Vector第一轮迭代读取连续8个block(蓝色方框),第二轮迭代紧接着读取下一个连续的8个block(灰色方框),则Vector通过多轮迭代即可完成所有输入数据的计算。

需要注意的是,*_rep_stride有一些特殊的取值,在一些特殊场景可能有用:

  • 当repeat_times大于1,且*_rep_stride取值大于8(如取10)时,则相邻迭代间Vector读取的数据在地址上不连续,出现间隔(红色方框);
  • 当repeat_times大于1,且*_rep_stride取值为0时,Vector会对首个连续的8个block进行反复读取和计算。
  • 当repeat_times大于1,且*_rep_stride取值大于0且小于8时,相邻迭代间部分数据会被Vector重复读取和计算,此种情形一般场景不涉及。

综上,用户必须根据实际算子的数据访问模式,进行合适的参数设置,以保证获得正确的计算结果。

图1 repeat_times与*_rep_stride不同取值示例
分享:

    相关文档

    相关产品

close