我有一个函数,其签名为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
答案 0 :(得分:0)
探查器以二进制形式提供一个地址作为位置。在这种情况下,它是iter
标签。但是标签当然不会在二进制文件本身中占据空间,因此地址是subs
指令的地址,它是循环结束时分支的目标。
这表明程序中的瓶颈确实是分支,可能是由于分支的错误预测所致。这可能是个好消息,因为这意味着您的SIMD逻辑不会阻止您的处理。
一个有趣的实验是在不同长度的输入上尝试您的函数。个人资料会发生很大变化吗?