如何使用SIMD向量化和/或并行化让编译器为字符串搜索循环输出更快的代码?

我有这个 C:

#include <stddef.h>
size_t findChar(unsigned int length, char*  __attribute__((aligned(16))) restrict string) {
    for (size_t i = 0; i < length; i += 2) {
        if (string[i] == '[' || string[i] == ' ') {
            return i;
        }
    }
    return -1;
}

它检查字符串的所有其他字符并返回字符串的第一个索引,即[or 。使用 x86-64 GCC 10.2 -O3 -march=skylake -mtune=skylake,这是汇编输出:

findChar:
        mov     edi, edi
        test    rdi, rdi
        je      .L4
        xor     eax, eax
.L3:
        movzx   edx, BYTE PTR [rsi+rax]
        cmp     dl, 91
        je      .L1
        cmp     dl, 32
        je      .L1
        add     rax, 2
        cmp     rax, rdi
        jb      .L3
.L4:
        mov     rax, -1
.L1:
        ret

看起来它可以被显着优化,因为我看到了多个分支。如何编写我的 C 以便编译器使用 SIMD、字符串指令和/或矢量化对其进行优化?

我如何编写我的代码以向编译器发出可以优化此代码的信号?

Godbolt 上的交互式装配输出:https ://godbolt.org/z/W19Gz8x73

将其更改为具有明确声明长度的 VLA 并没有多大帮助:https : //godbolt.org/z/bb5fzbdM1

这是修改后的代码版本,因此该函数将只返回每 100 个字符:https : //godbolt.org/z/h8MjbP1cf

以上是如何使用SIMD向量化和/或并行化让编译器为字符串搜索循环输出更快的代码?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>