由于底层实现的差异,GPU上可以只支持对于非连续的tensor进行操作而不会产生额外性能问题,对于NPU则需要插入非连续转连续算子。因此GPU上某些代码的写法会连续对一个非连续tensor操作,对NPU来说就会插入多余的转换算子造成性能下降。因此可以提前一把将非连续的tensor转连续,避免后续额外转换算子插入。
由于NPU上有些算子泛化性能较差,因此对于一些非尾轴reduce的算子以及一些非首轴的随机访存算子,优化有显著问题。此时可以先transpose做尾轴reduce或首轴随机访存,再transpose回来,可能性能更好。
bboxes = torch.where(bboxes < min_xy, min_xy, bboxes) 可以换成 bboxes = torch.lerp(bboxes, min_xy, (bboxes < min_xy).float()) 可以用where assigned_gt_inds[pos_inds] = argmax_overlaps[pos_inds] + 1 assigned_gt_inds = torch.where(pos_inds, argmax_overlaps + 1, assigned_gt_inds) last_tags = tags[seq_ends, torch.arange(batch_size)]