使用AVX2对2个短int向量进行矢量化加法

时间:2018-03-14 23:52:32

标签: c x86 simd avx2

我在使用AVX2指令集对2个短(16位整数)向量类型执行加法运算时遇到问题。 我已经构建了代码但是在添加命令中出现错误,可能是因为语法错误。 我正在使用以下代码创建2个向量:

short int si1[16] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
short int si2[16] ={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

__m256i i1 = _mm256_load_si256((__m256i*)si1);
__m256i i2 = _mm256_load_si256((__m256i*)si2);

我正在尝试使用以下代码执行添加:

__m256i result = _mm256_add_si256(i1,i2);

我理解对于16位整数我们使用标量后缀,但是编译器给出了添加命令的隐式函数声明的错误。

1 个答案:

答案 0 :(得分:0)

通过人们的评论和我的一些实验,我通过使用未对齐的操作解决了问题。所以我的代码最终看起来像这样 -

short int si1[16] =
        { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
short int si2[16] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

__m256i i1 = _mm256_loadu_si256((__m256i *) si1);
__m256i i2 = _mm256_loadu_si256((__m256i *) si2);

    __m256i result = _mm256_adds_epi16(i2, i1);

这样可以在尝试编译程序时使用-O2优化标志(在gcc上),以防你使用多线程,因为优化是我得到一些其他错误的原因(大工作负载的执行时间更长)线程与单线程相比。)