23.11.30 최초 작성
31x 64-bit | 일반 레지스터 |
---|---|
W | 32 bit |
X | 64 bit |
32x 128-bit | floating point register |
---|---|
B | 8 bit |
H | 16 bit |
S | 32 bit |
D | 64 bit |
Q | 128 bit |
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개에 저장
#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]에 저장
VLA (Vector Length Agnostic)
: 128~2048bit까지 벡터 길이를 동적으로 설정 가능하도록 지원Per-lane predication
: 연산할 레지스터를 지정하는 predicate register
를 참고해 각 lane마다 연산할지 결정
Predicate-driven loop control and management
: predicate register
를 활용해 불필요한 반복문을 줄일 수 있음
Vector partitioning & software-managed speculation
: 메모리의 여러 페이지에 분산되어 있는 Vector를 모을 필요 없이 바로 연산 가능
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
: 분산된 페이지를 활용한 연산 제어
#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);
}
--param=aarch64-autovec-preference=<값>
값 | 일반 레지스터 |
---|---|
0 | default |
1 | SIMD |
2 | SVE |
3 | SIMD(추천), SVE |
4 | SIMD, SVE(추천) |