简单的减法命令使ARM64 SIMD功能成为瓶颈?

时间:2018-10-12 17:07:31

标签: assembly optimization simd arm64

我有一个函数,其签名为void aggregate(const char *string, int64_t length, void *dest),目标是将string中的每个字符映射到dest中的相应位,如果该字符为{,则该位为1 {1}},否则为0。因此,如果字符串为'\"',则将"\"aaaaaa\"...写入0b10000001...。该函数一次处理dest中的32个字节,因此要求string是该字节的倍数。

无论如何,我都有工作功能,但是根据我的分析,它在length指令上花费了80%以上的时间。我知道您必须谨慎处理普通寄存器和SIMD寄存器,但我不知道为什么会出现这样的瓶颈。我还尝试使用当前字符串指针和字符串的末尾进行subs,并且仅在当前指针小于末尾时才循环。但是,这没有帮助。我还尝试了展开操作,以使我可以执行cmp条指令的一半或四分之一,但这也无济于事。有什么想法吗?

subs

1 个答案:

答案 0 :(得分:0)

探查器以二进制形式提供一个地址作为位置。在这种情况下,它是iter标签。但是标签当然不会在二进制文件本身中占据空间,因此地址是subs指令的地址,它是循环结束时分支的目标。

这表明程序中的瓶颈确实是分支,可能是由于分支的错误预测所致。这可能是个好消息,因为这意味着您的SIMD逻辑不会阻止您的处理。

一个有趣的实验是在不同长度的输入上尝试您的函数。个人资料会发生很大变化吗?