谢谢各位回复和私信,我最后改成了这样,的确用到了_mm512_ror_epi64,但是没有用上_mm512_maskz_ror_epi64,不知道能不能进一步优化。
我把j做成了模板参数,不然编译不过,说某些intrinsic function的参数需要为立即数。
using WORD_t = __m512i;
template<size_t j> static void shift_swap_u512(WORD_t &a, WORD_t &b, WORD_t mask)
{
switch(j){
case 256:
case 128:
case 64:
{
const WORD_t t = (a ^ _mm512_alignr_epi64(b, b, j / 64)) & mask;
a ^= t;
b ^= _mm512_alignr_epi64(t, t, 8 - j / 64);
return;
}
case 32:
case 16:
case 8:
case 4:
case 2:
case 1:
{
const WORD_t t = (a ^ _mm512_ror_epi64(b, j)) & mask;
a ^= t;
b ^= _mm512_rol_epi64(t, j);
return;
}
default:
{
return;
}
}
}
【 在 allegro 的大作中提到: 】
: [code=c]
: using WORD_t = __m512i;
: static inline void shift_swap(WORD_t &a, WORD_t &b, int j, WORD_t mask)
: ...................
--
修改:allegro FROM 158.140.1.*
FROM 158.140.1.*