指令级并行

指令重排

1
2
3
4
5
6
int a, b;

void f() {
a = b + 1;
b = 0;
}

x86-64 gcc 4.6 -masm=intel 无优化

1
2
3
4
mov eax, DWORD PTR b[rip]
add eax, 1
mov DWORD PTR a[rip], eax
mov DWORD PTR b[rip], 0

x86-64 gcc 4.6 -masm=intel -O2

1
2
3
4
mov eax, DWORD PTR b[rip]
mov DWORD PTR b[rip], 0
add eax, 1
mov DWORD PTR a[rip], eax

数据级并行

SIMD

1
2
3
for (int i=0; i<128; i++) {
sum += arr[i];
}

x86-64 gcc 9.2, -O3

1
2
3
4
5
6
.L7:
movdqu xmm2, XMMWORD PTR [rdi] # xmm2 = [rdi[0], rdi[1], rdi[2], rdi[3]]
add rdi, 16
paddd xmm0, xmm2
cmp rax, rdi
jne .L7

(此处clang生成的代码更过分,一次可以递增4*32字节,而且经过了一些重排(显然是为了指令级并行),似乎还考虑了cache亲和性?llvm nb啊。)(不过显然也更难读懂了)

(其他架构下simd的实现有:ARM的NEON,RISC-V的V Standard Extention)