由于Unified Buffer空间有限,在数据量很大的情况下,无法完整放入输入数据和输出结果,需要对输入数据分片搬入、计算、再搬出。在进行计算分片时,主要考虑如下因素:
下面以张量加法为例,以下给出较大数据场景下的计算分片方案。
# 给定数据类型,data_each_block表示一个block能够存放的数据数目
# vector指令每次迭代最多计算8个block,vector_mask_max为mask的最大值
vector_mask_max = 8 * data_each_block
# move_num表示搬入的数据数目
# 计算repeat_times取得最大值255时,需要循环调用vec_add多少次
vadd_loop = move_num // (vector_mask_max * 255)
add_offset = 0
if vadd_loop > 0:
with tik_instance.for_range(0, vadd_loop) as add_index:
add_offset = add_index * vector_mask_max * 255
tik_instance.vec_add(vector_mask_max,
input_x_ub[add_offset],
input_x_ub[add_offset],
input_y_ub[add_offset], 255, 8, 8, 8)
# 对剩余数据,当Vector计算单元满载运行时,计算单次调用vec_add需要多少次迭代
repeat_time = (move_num % (vector_mask_max * 255) // vector_mask_max)
if repeat_time > 0:
add_offset = vadd_loop * vector_mask_max * 255
tik_instance.vec_add(vector_mask_max,
input_x_ub[add_offset],
input_x_ub[add_offset],
input_y_ub[add_offset], repeat_time, 8, 8, 8)
# 数据尾巴,此时最后一次调用vec_add,计算需要多少Vector单元参与计算
last_num = move_num % vector_mask_max
if last_num > 0:
add_offset += repeat_time * vector_mask_max
tik_instance.vec_add(last_num,
input_x_ub[add_offset],
input_x_ub[add_offset],
input_y_ub[add_offset], 1, 8, 8, 8)