是否存在收集/提取mysite.com/test
的第一位并将其存储到int[32]
的指令?
我知道内在的int
,但这不是我想要的。
我确实有一个代码,但我想也许有指定的指示。
pext
数组为零。因此,不需要掩蔽。ints
刚刚测试了哈罗德的建议。它运作良好,我可以获得很好的加速。
答案 0 :(得分:2)
没有一条指令甚至可以读取那么多数据,但是使用_mm_movemask_ps
可以快速处理4组(AVX2为8组)。忽略它声称是浮点指令的事实,它只是收集并附加4个顶部位。
当然,使用_mm_slli_epi32
将底部位移到顶部很容易。
将它放在一起(未经测试)
int res = 0;
for (int i = 0; i < 32; i += 4) {
__m128i x = _mm_load_si128((__m128i*)&ints[i]); // I assume it's aligned
x = _mm_slli_epi32(x, 31);
int bits = _mm_movemask_ps(_mm_castsi128_ps(x));
res += bits << i;
}
AVX2的扩展非常明显。
另一种可能的方法是将每个通道移动一个可变量(前AVX2,这需要乘法)然后求和,首先垂直,当然,保存最后的水平和。这可能更慢,当然也更尴尬。