为什么gcc -O3处理avx256的内在函数与gcc -O0和clang不同?

问题描述 投票:3回答:1

我想设置两个整数向量,并将它们与SIMD进行比较,然后稍后将此掩码用于打包浮点的混合操作。我产生了以下代码:

#include <immintrin.h>
#include <stdio.h>
#include <string.h>


int main(){
    __m256i is =  _mm256_setr_epi32(1, 2, 3, 4, 5, 6, 7, 8);
    __m256i js =  _mm256_set1_epi32(1);               // integer bit-patterns
    __m256 mask = _mm256_cmp_ps(is,js, _CMP_EQ_OQ);   // compare as subnormal floats

    float val[8];
    memcpy(val, &mask, sizeof(val));
    printf("%f %f %f %f %f %f %f %f \n", val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7]);
}

gcc -mavx main.c以及clang -mavx main.cclang -O3 -mavx main.c一起使用都很好。

((编者注:当cmpps将这些非正常输入视为-ffast-math时,它将以0.0中断,因此所有比较都是正确的。您希望AVX2 _mm256_cmp_epi32进行integer比较,然后将[C0 ]结果,但这与_mm256_castsi256_ps和clang允许从gcc -O0__m256i隐式转换的问题无关。

但是,当我使用__m256时,出现以下错误消息:

gcc -O3 -mavx main.c

我注意到两件事。首先,编译器似乎将main.c: In function ‘main’: main.c:9:33: error: incompatible type for argument 1 of ‘_mm256_cmp_ps’ 9 | __m256 mask = _mm256_cmp_ps(is,js, _CMP_EQ_OQ); | ^~ | | | __m256i {aka __vector(4) long long int} In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/immintrin.h:51, from main.c:1: /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/avxintrin.h:404:23: note: expected ‘__m256’ {aka ‘__vector(8) float’} but argument is of type ‘__m256i’ {aka ‘__vector(4) long long int’} 404 | _mm256_cmp_ps (__m256 __X, __m256 __Y, const int __P) | ~~~~~~~^~~ main.c:9:36: error: incompatible type for argument 2 of ‘_mm256_cmp_ps’ 9 | __m256 mask = _mm256_cmp_ps(is,js, _CMP_EQ_OQ); | ^~ | | | __m256i {aka __vector(4) long long int} In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/immintrin.h:51, from main.c:1: /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/avxintrin.h:404:35: note: expected ‘__m256’ {aka ‘__vector(8) float’} but argument is of type ‘__m256i’ {aka ‘__vector(4) long long int’} 404 | _mm256_cmp_ps (__m256 __X, __m256 __Y, const int __P) | ~~~~~~~^~~ 视为is,而它包含8个整数。其次,编译器是正确的抱怨,因为intel内部函数指南__m256i {aka __vector(4) long long int}将参数显示为1。我现在很困惑为什么这个代码甚至在一开始就起作用。如果由于整数被强制转换为浮点数而确实是正确的,那么我不理解为什么它不适用于__m256

我不想使用返回一个gcc -O3_mm256_cmpeq_epi32,并且那里(似乎没有)(没有)接受这种掩码的__m256i指令。

为什么编译器的行为不同,正确

进行此操作的方式是什么?

编译器版本

blend_ps
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-pkgversion='Arch Linux 9.3.0-1' --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
gcc version 9.3.0 (Arch Linux 9.3.0-1) 

[1] $ clang -v clang version 10.0.0 Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/8.4.0 Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/9.3.0 Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.4.0 Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.3.0 Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/8.4.0 Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0 Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/8.4.0 Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/9.3.0 Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.3.0 Candidate multilib: .;@m64 Candidate multilib: 32;@m32 Selected multilib: .;@m64 Found CUDA installation: /opt/cuda, version 10.1

我想设置两个整数向量,并将它们与SIMD进行比较,然后稍后将此掩码用于打包浮点的混合操作。我产生了以下代码:#include #include&...

c gcc simd intrinsics avx
1个回答
3
投票

首先,编译器似乎将https://software.intel.com/sites/landingpage/IntrinsicsGuide/视为is,而它包含8个整数。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.