是否有任何英特尔AVX内在库?我正在寻找类似'sse2mmx.h'标题的东西,如果SSE2整数内在函数在编译时不可用,它会回退到MMX内在函数.因此,如果我有类似AVX的库,我可以为新硬件编写优化代码,如果AVX扩展不可用,它将具有几乎最佳速度.谷歌搜索到目前为止没有多大帮助:(
我正在尝试在一些文件上实现和编码,其中一些包含 SIMD 调用。我已经在服务器上编译了这段代码,运行与我的机器基本相同的操作系统,但我无法编译它。
\n\n这是错误:
\n\nmake\ng++ main.cpp -march=native -o main -fopenmp\nIn file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,\n from tensor.hpp:9,\n from main.cpp:4:\n/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h: In function \xe2\x80\x98_ZN6TensorIdE8add_avx2ERKS0_._omp_fn.5\xe2\x80\x99:\n/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:447:1: error: inlining failed in call to always_inline \xe2\x80\x98__m256d _mm256_mask_add_pd(__m256d, __mmask8, __m256d, __m256d)\xe2\x80\x99: target specific option mismatch\n _mm256_mask_add_pd (__m256d __W, __mmask8 __U, __m256d __A,\n ^~~~~~~~~~~~~~~~~~\nIn file included from main.cpp:4:0:\ntensor.hpp:228:33: note: called from here\n res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));\n ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nIn file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,\n from tensor.hpp:9,\n from main.cpp:4:\n/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:610:1: error: inlining failed in call to …Run Code Online (Sandbox Code Playgroud) 我在 C/C++ 代码中明确使用了英特尔 SIMD 内在扩展。为了编译代码,我需要在命令行上指定 -mavx、-mavx512 或类似的内容。我对这一切都很满意。
然而,从阅读 gcc 手册页来看,并不清楚这些命令行标志是否也告诉 gcc 编译器尝试使用英特尔 SIMD 指令自动矢量化 C/C++ 代码。有人知道情况是否如此吗?-mavx 标志只是允许您手动将 SIMD 内在函数插入代码中,还是还告诉编译器在编译 C/C++ 代码时使用 SIMD 指令?
我想知道编译器如何处理内部函数。
如果使用 SSE2 Intrinsics (Using #include <emmintrin.h>) 并使用-mavx标志进行编译。编译器会生成什么?它会生成 AVX 或 SSE 代码吗?
如果使用 AVX2 Intrinsics (Using #include <immintrin.h>) 并使用-msse2标志进行编译。编译器会生成什么?它会生成 SSE Only 或 AVX 代码吗?
编译器如何处理内部函数?
如果使用 Intrinsics,它是否可以帮助编译器理解循环中的依赖关系以实现更好的矢量化?
例如,这里发生了什么 - https://godbolt.org/z/Y4J5OA(或https://godbolt.org/z/LZOJ2K)?
查看全部 3 个窗格。
我正在尝试构建具有不同 CPU 功能(SSE4 和 AVX2)的相同功能的各种版本。
我正在使用 SSE Intrinsics 编写相同的版本,并且使用 AVX Intrinsics 编写一次。
假设他们的名字MyFunSSE()是 和MyFunAVX()。两者都在同一个文件中。
如何让编译器(相同的方法适用于 MSVC、GCC 和 ICC)仅使用各自的函数来构建它们?