2

我一直在使用优秀的 godbolt.org 来确定 gcc 做什么和不矢量化:但我无法找到任何方法让它将 min(X,Y) 函数矢量化为 PMINUQ 等。

查看 gcc 源代码中的 sse.md 机器描述语言文件,我可以在第 12355 行之前看到一个提到 p<maxmin_int><ssemodesuffix> 的块,在我看来它应该输出 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
4

1 回答 1

2

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

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

于 2019-09-23T23:11:13.277 回答