gcc - 这些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)
| ^~~~~~~~~~~~~~~
接下来,底层汇编指令的语法是什么?如果您可以指向显示它们的手册,那将非常有帮助。
解决方案
推荐阅读
- python - 类级别的 classmethod() 只能在 method_descriptor 或实例方法上调用
- linux - 如何找到 nginx 的安装位置?
- python - 我该怎么做才能在找不到数据的循环中不要阻止我并继续该过程
- sql-server - 在“新查询”中调用 com 组件 SQL Server 返回了错误 hresult e_fail
- javascript - 页面加载时如何使软键盘自动显示?
- java - 如何仅从 kafka 资源中获取值以激发火花?
- tensorflow - 如何将新的 Tensorflow 层添加到 TensorRT 引擎?
- java - 这是做序列的正确方法吗?
- oracle - Oracle nvl2 在存储过程 PLS-00201 中不起作用:必须声明标识符“NVL2”
- php - 忽略 ~/Homestead 不起作用。忽略符号链接