如何使用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
THE END
二维码