如何在AVX/AVX2中递增一个向量

6
我希望使用内在函数来增加SIMD向量的元素。最简单的方法似乎是将1添加到每个元素中,像这样:
(注意:在此之前已将vec_inc设置为1)
vec = _mm256_add_epi16 (vec, vec_inc);

但是是否有特殊的指令可以增加向量的数量,类似于 inc?还是有其他更简单的方法吗?


2
不,没有特殊的指令 - 就像你上面建议的那样,只需添加一个由1组成的向量即可。 - Paul R
1
减去“-1”可能更便宜,因为可以在运行时生成一个“set1(-1)”向量,而不是加载,使用“vpcmpeqd ymm0,ymm0,ymm0”。 - Peter Cordes
1个回答

9
INC指令不是SIMD级别的指令,它作用于整数标量。 正如你和Paul所建议的那样,最简单的方法是将1添加到每个向量元素,这可以通过添加一个由1组成的向量来实现。
如果您想模拟内置函数,可以实现自己的函数:
inline __m256i _mm256_inc_epi16(__m256i a)
{
    return _mm256_add_epi16(a, _mm256_set1_epi16(1));
}

将来有关x86内部函数的类似问题,您可以在Intel Intrinsics指南中找到Intel ISA内部函数的集合。此外,请参阅标签信息下记录的广泛资源:


我已经阅读了《Intel指令集指南》。顺便说一下,我会接受这个答案。 - Amiri
5
如果您在阅读Intel Intrinsics指南后仍然感到不满足,一定要查看[x86]标签维基中的资源。:-) @fac 我也将此添加到答案中以供未来用户参考。 - Cody Gray
1
@CodyGray:在SSE标签wiki中还有一些SSE/AVX内部函数的教程。x86标签wiki也提到了这一点(在顶部),但我怀疑大多数人不会注意到。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接