Armv8 SIMD (Single Instruction Multiple Data)

EEEFFEE·2023년 12월 1일
0

Armv8 Architecture

목록 보기
14/15

23.11.30 최초 작성

  • 하나의 명령어로 여려개의 데이터를 처리할 수 있는 기법

1. NEON

  • 하나의 명령어로 여려개의 데이터를 처리할 수 있는 기법
  • V 레지스터(128-bit)를 분할해서 병렬 연산
31x 64-bit일반 레지스터
W32 bit
X64 bit

32x 128-bitfloating point register
B8 bit
H16 bit
S32 bit
D64 bit
Q128 bit

1.1 SIMD 연산

FADD <Vd>.<T>, <Vn>.<T>, <Vm>.<T>
insturction
		destination 
        		operand1
                		operand1

MUL V0.8B V0.8B V1.8B /// V0의 8byte 8개와 V1의 8byte 8개를 곱해 V0의 8byte 8개에 저장
MUL V0.4S, V2.4S, V3.S[2] /// V2의 32bit 4개와 V3의 2번째 요소(1개)를 곱해 V0의 32byte 4개에 저장

1.2 SIMD 사용하기


#include <arm_neon.h>
//	/usr/lib/gcc-cross/aarch64-linux-gnu/11/include/arm_neon.h

float32x4_t va = vldlq_f32(&a[i]);			//a[i]의 32bit 4개를 va에 저장
Va = vmulq_n_f32(va, 2.0);					//va를 2.0으로 곱함
vstlq_f32(&a[i], va);						//va 값을 a[i]에 저장

2. SVE (Scalable Vector Extension)

  • VLA (Vector Length Agnostic) : 128~2048bit까지 벡터 길이를 동적으로 설정 가능하도록 지원
  • 명시적으로 병렬연산으로 만든 반복문이 아니더라도 자동으로 vector화 가능

2.1 SVE 특징

  • Per-lane predication : 연산할 레지스터를 지정하는 predicate register를 참고해 각 lane마다 연산할지 결정

  • Predicate-driven loop control and management : predicate register를 활용해 불필요한 반복문을 줄일 수 있음

  • Vector partitioning & software-managed speculation : 메모리의 여러 페이지에 분산되어 있는 Vector를 모을 필요 없이 바로 연산 가능

2.2 SVE 레지스터

  • Scalable vector registers

    • Z0 ~ Z31 : NEON의 V0 ~ V31비트

    • Packed DP, SP & HP : 64bit, 32bit, 16bit

    • Packed 64, 32, 16 & 8bit integer elements

  • Scalable vector registers

    • P0 ~ P15 : 반복문, 사칙연산 제어 (1 : 저장, 0 : 연산 X)

    • FFR : 분산된 페이지를 활용한 연산 제어

2.2 SVE 사용하기

  • gcc -march=armv8-a+sve -O3

#include <arm_sve.h>
//	/usr/lib/gcc-cross/aarch64-linux-gnu/11/include/arm_sve.h

for(int i = 0; i < N; i ++){
	a[i] = 2.0 * a[i];
}

// SVE
for(int i = 0; i < N; i += svcntw (){
	svbool_t Pg = svwhilelt_b32(i, N);
    svfloat32_t va = svld1(Pg, &a[i);
    va = svmul_x(Pg, va, 2.0);
    svstl1(Pg, &a[i], va);
}

3. gcc option

  • --param=aarch64-autovec-preference=<값>
일반 레지스터
0default
1SIMD
2SVE
3SIMD(추천), SVE
4SIMD, SVE(추천)

0개의 댓글