问题描述
这是一个简单的 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 (将#修改为@)