【问题标题】:How to disable vectorization in clang++?如何在 clang++ 中禁用矢量化?
【发布时间】:2018-12-29 21:50:20
【问题描述】:

考虑以下小型搜索功能:

template <uint32_t N>
int32_t countsearch(const uint32_t *base, uint32_t needle) {
    uint32_t count = 0;
    #pragma clang loop vectorize(disable)
    for (const uint32_t *probe = base; probe < base + N; probe++) {
        if (*probe < needle)
            count++;
    }
    return count;
}

-O2 或更高版本,clang vectorizes this search,例如。产生这样的代码(对于 10 个元素):

int countsearch<10u>(unsigned int const*, unsigned int):            # @int countsearch<10u>(unsigned int const*, unsigned int)
        vmovd   xmm0, esi
        vpbroadcastd    ymm0, xmm0
        vpbroadcastd    ymm1, dword ptr [rip + .LCPI0_0] # ymm1 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
        vpxor   ymm2, ymm1, ymmword ptr [rdi]
        vpxor   ymm0, ymm0, ymm1
        vpcmpgtd        ymm0, ymm0, ymm2
        cmp     dword ptr [rdi + 32], esi
        vpsrld  ymm1, ymm0, 31
        vextracti128    xmm1, ymm1, 1
        vpsubd  ymm0, ymm1, ymm0
        vpshufd xmm1, xmm0, 78          # xmm1 = xmm0[2,3,0,1]
        vpaddd  ymm0, ymm0, ymm1
        vphaddd ymm0, ymm0, ymm0
        vmovd   eax, xmm0
        adc     eax, 0
        cmp     dword ptr [rdi + 36], esi
        adc     eax, 0
        vzeroupper
        ret

如何在命令行上或在代码中使用#pragma 禁用此矢量化?

我尝试了以下命令行参数,但都没有阻止矢量化:

-disable-loop-vectorization 
-disable-vectorization
-fno-vectorize 
-fno-tree-vectorize

如您在上面的代码中看到的,我还在循环上方尝试了#pragma clang loop vectorize(disable),但没有运气。

【问题讨论】:

    标签: c++ optimization x86 clang vectorization


    【解决方案1】:

    关闭SLP Vectorization

    clang++ -O2 -fno-slp-vectorize
    

    Godbolt Link

    【讨论】:

    • 谢谢,有趣:根据描述,您不会认为 SLP 矢量化器会适用,因为这似乎结合了附近的非循环指令,但我猜在内部循环完全展开,然后是 SLP 矢量化适用。无论如何,它奏效了!是否有 #pragma 等效项?
    • @BeeOnRope 看起来没有 #pragma 等效项 (clang.llvm.org/docs/…)
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    相关资源
    最近更新 更多