问题描述
我正在尝试使用AVX2程序集优化代码。 一方面,我需要将计算结果与阈值进行比较,然后将0或255字节写入 输出。 我比较
VCMPPD ymm2,ymm1 (values here),ymm4 (thresholds here),1
然后,ymm2包含4个QUADWORDS 0和0xFF。理想情况是将其全部缩小到EAX中的4个字节。 但是现在,我正在执行4个VPTEST操作和几个条件跳转以形成输出。这会大大降低性能。
问题:如何有效地获取和使用与AVX2的比较结果?
解决方法
您可能正在寻找vmovmskpd eax,ymm2
(manual entry)来获取4位位图,然后可以使用诸如test eax,eax
之类的整数指令进行分析。或cmp al,0xf
来检查 all 元素是否为真,如果需要更详细的信息,甚至可以作为jmp [table + rax*8]
之类的跳转表的索引。
如果实际上每个向量元素都想要想要 8个相同的位,而每个字节一个,则可以使用vpmovmskb
。
如果您还不了解movmskps/pd
等,我建议使用Agner Fog的优化指南:他有一章关于SIMD。 https://agner.org/optimize/。向量->位图是x86的最佳功能之一。