文档
注册

计算分片

由于Unified Buffer空间有限,在数据量很大的情况下,无法完整放入输入数据和输出结果,需要对输入数据分片搬入、计算、再搬出。在进行计算分片时,主要考虑如下因素:

  • 在切分输入数据时要合理的利用Unified Buffer空间,减少搬运次数,从而提高性能。
  • 由于Unified Buffer上的物理限制,要求数据存储必须保持32Byte对齐。
  • 计算时相同指令运算数据尽可能连续存储,充分利用repeat操作,提高Vector利用率。
  • 计算尾块的处理。对于vector指令计算,单条vector指令支持最大的repeat次数为255,以float16类型数据举例,每次计算128个数。因此,vector计算需要分三步判断:
    1. 如果数据量大于255*128,可以设置repeat=255,mask=128,处理N次,把这部分数据处理完。
    2. 剩下的数据量在小于255*128,大于128之间,此时设置mask=128,求出repeat次数,通过一条指令处理完。
    3. 剩下的数据量小于128个数,通过设置mask使用一条指令处理完即可。

下面以张量加法为例,以下给出较大数据场景下的计算分片方案。

       # 给定数据类型,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)
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词