본문 바로가기

Programming/NEON

[NEON] 변환 연산

1. NEON 변환 연산

벡터의 변환은 NEON의 모든 연산에서 유용하게 사용되며, 필요에 따라서 여러 방법으로 사용할 수 있다.

벡터의 변환은 더블 워드 벡터를 연산하여 쿼드 워드 벡터에 저장하거나, 그 반대의 경우 포화 연산을

지원하지 않는 연산에서 오버플로를 방지하기 위해서 사용된다.


1.1 벡터 결합 함수

벡터를 두 배 크기로 확장할 때 벡터 결합을 사용한다.

벡터 결합 함수는 레인의 수는 변경되고, 레인의 크기는 변경되지 않는다.


int16x8_t r = vcombine_s16(int16x4_t a, int16x4_t b)

16bit 레인 더블 워드 벡터 2개를 결합하여 16bit 레인 쿼드 워드 벡터를 생성한다.


1.2 벡터 분할 함수

벡터 변수의 분할은 high분할과 low 분할로 나뉜다.

결합과 마찬가지로 레인의 수는 변경되고, 레인의 크기는 변경되지 않는다.

 

High 분할

int16x4_t r = vget_high_s16(int16x8_t a)


Low 분할

int16x4_t r = vget_low_s16(int16x8_t a)


1.3 벡터 레인 축소 함수

벡터 레인 축소(Narrow) 함수는 쿼드 워드 벡터를 더블 워드 벡터로 변경한다.

레인의 크기는 절반으로 축소되고, 레인의 수는 변경되지 않는다.


int8x8_t r = vmovn_s16(int16x8_t a)

16bit 레인 쿼드 워드 벡터 a가 8bit 레인 더블 워드 벡터 r로 변경된다.

( C언어에서 signed short 형을 강제로 unsigned char 형으로 강제 형변환(casting)한 것과 같다.)


1.4 벡터 레인 확대 함수

벡터 레인 확대(Long) 함수는 더블 워드 벡터를 쿼드 워드 벡터로 변경한다.

레인의 크기는 2배 확대 되고, 레인의 수는 변경되지 않는다.


int8x8_t r = vmovl_s8(int8x8_t a)

8bit 레인 더블 워드 벡터 a가 16bit 쿼드 워드 벡터 r로 변경된다. char형이 short 형으로 강제 형변환된다.


1.5 실수 형변환 함수

실수 벡터를 정수 벡터로 변환하거나 정수 벡터를 실수 벡터로 형변환 할 수 있다.


실수형 레인 ▶  (부호 있는, 부호 없는) 정수형 레인

int32x4_t r = vcvtq_s32_f32(float32x4_t a)


(부호 있는, 부호 없는) 정수형 레인 ▶  실수형 레인

float32x4_t r = vcvtq_f32_s32(int32x4_t a)


NEON 변환과 재해석 연산은 NEON으로 어플리케이션을 개발할 때 매우 자주 사용된다.

NEON에서는 형변환시 분할 함수와 결합 함수를 사용해야하만 한다. 또한 NEON에서는

정수와 실수 사이에 연산할 때에도 같은 형으로(정수를 실수 또는 실수를 정수로) 변환하고 연산해야 한다.


2. NEON 재해석 함수

어플리케이션을 개발하다 보면, 실수 변수의 형변환 이외에 다른 종류의 벡터 사이에 형변환이 필요할 때가 있다.

이런 경우를 대비해 NEON은 재해석 함수(형변환)를 제공한다.

NEON에서의 형변환 결과는 C/C++ 과는 조금 다르다. NEON 재해석 함수는 함수 이름의 조합으로 다양한

형변환을 할 수 있다.

 

재해석 함수 문법


int16x8_t r = vreinterpertq_s16_f32(float32x4_t a)

실수 32bit 쿼드 워드 벡터를 정수 16bit 레인 쿼드 워드(부호있는) 벡터로 재해석 한다.


uint16x4_t r = vreinterpret_u16_s16(int16x4_t a)

부호 있는 정수 16bit 레인 더블 워드 벡터를 부호 없는 정수 16bit 레인 더블 워드 벡터로 재해석 한다.

재해석할 때 bit의 이동

재해석 연산이 실행되면 레인의 bit는 그대로 복사된다. 재해석 연산에서는 bit의 패턴이 변경되지 않으므로

예상치 못한 결과가 나타날 수 있다. 예를 들어 16bit 레인이 8bit레인 2개로 변경되면 16bit의 상위 8bit는 상위

레인에 복사되고, 하위 8bit는 하위레인에 그대로 복사된다.


'Programming > NEON' 카테고리의 다른 글

[NEON] 수학, 이항, 스칼라 연산  (0) 2016.09.23
[NEON] 비교 연산과 절대값  (0) 2016.09.23
[NEON] 비트와 시프트 연산  (0) 2016.09.23
[NEON] 레인 설정과 조회  (0) 2016.09.23
[NEON 산술 연산과 확장  (0) 2016.09.23