首页 > 解决方案 > 这些avx2内在函数有什么错误,以及如何使用原始汇编程序

问题描述

英特尔参考手册对如何使用指令的细节相当不透明。每个说明页上都没有示例。

https://software.intel.com/sites/default/files/4f/5b/36945

可能我们还没有找到正确的页面或正确的手册。无论如何,gnu as 的语法可能会有所不同。

所以我想也许我们可以调用内在函数,介入并查看 gdb 中的操作码,并从中学习 gnu 中的操作码。我们还在 gnu 中搜索了 avx2 的操作码,但没有找到它们的文档。

从未编译的 c++ 代码开始:

#include <immintrin.h>
int main() {
  __m256i a = _mm256_set_epi32(1, 2, 3, 4, 5, 6, 7, 8); // seems to work
  double x = 1.0, y = 2.0, z = 3.0;
  __m256d c,d;
  __m256d b = _mm256_loadu_pd(&x);
  //  __m256d c = _mm256_loadu_pd(&y);
  //  __m256d d = _mm256_loadu_pd(&z);
  d = _mm256_fmadd_pd(b, c, d); // c += a * b
  _mm256_add_pd(b, c);
}

g++ -g 我们希望能够加载具有单个值的向量寄存器 %ymm0,这似乎由内在函数支持:_mm256_loadu_pd。融合乘加和加法也在那里。除了第一个内在函数之外,所有内在函数都会给出错误。

/usr/lib/gcc/x86_64-linux-gnu/9/include/fmaintrin.h:47:1: error: inlining failed in call to always_inline ‘__m256d _mm256_fmadd_pd(__m256d, __m256d, __m256d)’: target specific option mismatch
   47 | _mm256_fmadd_pd (__m256d __A, __m256d __B, __m256d __C)
      | ^~~~~~~~~~~~~~~

接下来,底层汇编指令的语法是什么?如果您可以指向显示它们的手册,那将非常有帮助。

标签: gccvectorizationintrinsicsavx

解决方案


推荐阅读