SSE 명령어로 벡터화가 어떻게 작동하는지 이해하려고합니다. 여기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은 2 배 (16 바이트)를 저장할 수있는 SIMD 레지스터입니다.
는하지만 동시에 또한이 수행되는 방법을 이해하지 않습니다
을 내가 모두가 여기 일이 생각 :
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 코드 조각에서 무엇을 나타 냅니까?
이 [0]이 [0] + B를 = 예를 들어, 최종 결과 (하는가 [0] %의 RDI에 저장?
감사 도와
가
64 비트 코드를 생성 중이며 rXX 레지스터는 일반적인 x86 레지스터의 64 비트 버전입니다 (예 : eax = 32 비트, rax = 64 비트). –
'-fverbose-asm'을 사용하면 gcc가 각 명령어에 주석을 달아 각 피연산자의 이름을 부여 할 수 있습니다. (종종 tmp 이름에 번호가 매겨 지지만 때때로 의미있는 C 변수 이름을 얻습니다. 특히 배열 색인 생성에 사용됩니다.) –