c - 使用 AVX2 对 2 个短整数 vector 进行 vector 加法

标签 c x86 simd avx2

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

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 位整数,但编译器给出了函数隐式声明以添加命令的错误。

最佳答案

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

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 上),因为优化是我遇到其他一些错误的原因(大工作量的执行时间更长线程与单线程相比)。

关于c - 使用 AVX2 对 2 个短整数 vector 进行 vector 加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49289420/

相关文章:

c++ - 在用户拖动 ListView 项时检测何时需要滚动

c - gcc 警告 : braces around scalar initializer

c - 为什么最后的代码会返回这样的结果? (在C中)

assembly - x86 cr3 和 linux swqpper_pg_dir

c - 如何对 __m128 类型变量中的浮点元素求反(更改符号)?

c - 从汇编语言编写 C 程序

计算一个 32 位数字数组的奇数位置有多少个 1

assembly - 我如何在 NASM x86 中定义宏

c - 为什么 strchr 比我的 simd 代码快两倍

scala - 服务于一项任务的多个 Scala 参与者