我一直在使用优秀的godbolt.org来确定gcc的作用和不进行向量化的方法:但是我无法找到任何方法来将min(X,Y)函数向量化为PMINUQ等。

查看gcc源代码中的sse.md机器描述语言文件,我可以看到12355行左右的代码块,上面提到p ,在我看来它应该输出PMINUQ等。因此我可以没有任何理由说明为什么要使用-msse4 -msse4.1编译该模式不起作用。

但是,md的这一部分内部也带有“&&”行,这似乎(?)表示此操作码仅适用于AVX样式的宽目标。

因此,我无法确定这是硬件限制,编译器/ md错误,-msse4.1的godbolt.org问题还是其他原因。谁能帮我缩小一下范围?

gcc -msse4 -msse4.1 -msse4.2 -O3 -fopt-info-vec-all

#include <stdint.h>

#define MAX_LOOPS 10000

uint64_t in_array[MAX_LOOPS];
uint64_t shift_array[MAX_LOOPS];

void do_max(uint64_t maxval)
{
    for (int i=0; i<MAX_LOOPS; i++)
        out_array[i] = (in_array[i] < maxval) ? in_array[i] : maxval;
}

godbolt.org告诉我我正在...
    pcmpeqq xmm0, xmm1
    pandn   xmm0, xmm2

...当我希望...
    pminuq  xmm0, xmm1

最佳答案

vpminuq需要AVX512。 (https://www.felixcloutier.com/x86/pminud:pminuq)

SSE4.1 / AVX2仅具有pminub/w/d。尝试使用具有32位元素的数组。

10-08 14:43