字符谓词的自动向量化

问题描述

这是一个简单的 C 函数来检查是否所有的字符 在字符串中属于正则表达式字符类 [A-Za-z_-]:

int checker(char* restrict src,int len) {
    int res = 1;
    for(int i = 0; i < len; i++) {
        char c = src[i];
        res = res && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c == '_') || (c == '-'));
    }
    return res;
}

使用 AVX-512,应该可以矢量化这个循环。然而,我是 无法让 GCC 或 LLVM (clang) 这样做。只需 -O3,GCC 10.2 给了我们这个漂亮干净的组件:

checker:
        test    esi,esi
        jle     .L10
        lea     eax,[rsi-1]
        lea     rcx,[rdi+1+rax]
.L12:
        movzx   edx,BYTE PTR [rdi]
        mov     eax,edx
        and     eax,-33
        sub     eax,65
        cmp     al,25
        jbe     .L4
        cmp     dl,95
        je      .L4
        cmp     dl,45
        je      .L4
        xor     eax,eax
        ret
.L4:
        inc     rdi
        cmp     rdi,rcx
        jne     .L12
.L10:
        mov     eax,1
        ret

但是,将编译选项更改为 -O3 -march=skylake-avx512 -ftree-vectorize 结果不会改变输出。 LLVM 的表现更糟。使用这些相同的选项, 它生成 75 行汇编代码,其中没有一条调用任何 AVX-512 指令。

是否有一组选项会导致 GCC 或 clang 对此进行矢量化 循环,或者这是否超出了主线 C 编译器自动向量化的限制 目前有能力吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)