我试图了解使用 SSE 指令进行矢量化是如何工作的。
这是实现矢量化的代码片段:
#include <stdlib.h>
#include <stdio.h>
#define SIZE 10000
void test1(double * restrict a, double * restrict b)
{
int i;
double *x = __builtin_assume_aligned(a, 16);
double *y = __builtin_assume_aligned(b, 16);
for (i = 0; i < SIZE; i++)
{
x[i] += y[i];
}
}
和我的编译命令:
gcc -std=c99 -c example1.c -O3 -S -o example1.s
这里是汇编代码的输出:
.file "example1.c"
.text
.p2align 4,,15
.globl test1
.type test1, @function
test1:
.LFB7:
.cfi_startproc
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L3:
movapd (%rdi,%rax), %xmm0
addpd (%rsi,%rax), %xmm0
movapd %xmm0, (%rdi,%rax)
addq $16, %rax
cmpq $80000, %rax
jne .L3
rep ret
.cfi_endproc
.LFE7:
.size test1, .-test1
.ident "GCC: (Debian 4.8.2-16) 4.8.2"
.section .note.GNU-stack,"",@progbits
多年前我练习过汇编程序,我想知道寄存器 %rdi、%rax 和 %rsi 上面代表什么。
我知道 %xmm0 是 SIMD 寄存器,我们可以在其中存储 2 个双精度数(16 个字节)。
但我不明白如何同时添加:
我认为一切都发生在这里:
movapd (%rdi,%rax), %xmm0
addpd (%rsi,%rax), %xmm0
movapd %xmm0, (%rdi,%rax)
addq $16, %rax
cmpq $80000, %rax
jne .L3
rep ret
%rax 是否代表“x”数组?
%rsi 在 C 代码片段中代表什么?
最终结果(例如 a[0]=a[0]+b[0] 是否存储到 %rdi 中?
谢谢你的帮助