已关闭
[Requirement|需求建议]: embedding_hash_table_lookup_or_insert 算子高bit访存优化 #5092
AlfengYuan创建于  8月25日关闭于  8月25日
AlfengYuan
AlfengYuan成员
8月25日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

Ascend 系列芯片在使用高bit访存的时候,同样数据量,高bit访存指令数更少,底层性能更好。

本 PR 针对 EmbeddingHashTableLookupOrInsert 算子(arch35)引入 SIMT 访存合并优化:根据 embeddingDim 的对齐情况(dim%4==0 → merge=4、dim%2==0 → merge=2、否则 → merge=1),让每个 X 线程一次搬运 merge 个连续 float,从而在读写嵌入向量时使用 float4(B128)/float2(B64) 短向量代替逐元素标量访问,并同步调整 tiling 的 threadXNum 计算公式(next_pow2(ceil(dim/merge)),上限 WARP_SIZE)及单元测试覆盖。

Origin(信息来源)

华为海思

Benefit / Necessity (价值/作用)

推荐场景,hashTable类算子,带宽bound类算子

Design(设计方案)

simt 宽带提升,SIMT访存性能与单次访存粒度相关,按照最朴素的写法,B32 的访存性能比B16的好一倍,在带宽范围内,b128 > b64 > b32 > b16 > b8。
因此,通常可以将低数据类型合并到高数据类型访问。可以将数据类型提升到b128访存,以便获取到比其他数据类型更好的性能。
(1)按shape数据类型合并: 对shape合轴后,根据last轴的大小合并数据类型。
last_shape 16Byte 对齐并且数据类型小于16Byte, 按照16Byte访存;
last_shape 8Byte对齐并且数据类型小于8Byte, 按照8Byte访存;
last_shape 4Byte对齐并且数据类型小于4Byte, 按照4Byte访存。
last_shape 2Byte对齐并且数据类型小于2Byte, 按照2Byte访存。
(2)按场景数据类型合并。
如果输入输出数据类型可以合并那直接合并。
如果输入可以合并,输出不可合并,输入按照(1)的原则做数据类型合并,输出按照实际数据类型搬出。
如果输入不可合并输出可合并,那输入按照实际数据类型搬入,输出按照(1)的原则做数据类型合并。

likedislike
AlfengYuanAlfengYuan成员
8月25日 添加了label:requirement
AlfengYuanAlfengYuan成员
8月25日 将 alfengyuan 设为负责人
CANN-robotCANN-robot成员
8月25日 关闭了 issue
AlfengYuanAlfengYuan成员
8月25日 issue状态由 进行中 改变为 已完成
CANN-robotCANN-robot成员
8月25日 添加了label:resolved