본문 바로가기

Programming/NEON

[NEON] 수학, 이항, 스칼라 연산 1. 수학연산NEON에서는 수학 함수로 역수와 역수 제곱근에 관련된 함수를 제공한다. (제곱근 함수는 지원하지 않는다.) 1.1 역수 함수벡터의 각 레인에 대해서 역수를 계산한다. float32x4_t r = vrecpeq_f32(float32x4_t a) 1을 레인의 값으로 나누고 그 결과를 저장한다. 1.2 역수 제곱근 함수벡터의 각 레인에 대해서 제곱근의 역수 값을 계산한다.float32x4_t r = vrsqrteq_f32(float32x4_t a)레인의 제곱근 값으로 나누고 그 결과를 저장한다. 수식으로 풀면 r = 1/sqrt(a) 1.3 역수 확장 함수2에서 두 벡터의 레인 사이의 곱하기 연산 결과를 뺀다. 이를 식으로 나타내면 r = 2 - (a * b)와 같다. float32x2_t vr.. 더보기
[NEON] 변환 연산 1. NEON 변환 연산벡터의 변환은 NEON의 모든 연산에서 유용하게 사용되며, 필요에 따라서 여러 방법으로 사용할 수 있다.벡터의 변환은 더블 워드 벡터를 연산하여 쿼드 워드 벡터에 저장하거나, 그 반대의 경우 포화 연산을지원하지 않는 연산에서 오버플로를 방지하기 위해서 사용된다. 1.1 벡터 결합 함수벡터를 두 배 크기로 확장할 때 벡터 결합을 사용한다.벡터 결합 함수는 레인의 수는 변경되고, 레인의 크기는 변경되지 않는다. int16x8_t r = vcombine_s16(int16x4_t a, int16x4_t b)16bit 레인 더블 워드 벡터 2개를 결합하여 16bit 레인 쿼드 워드 벡터를 생성한다. 1.2 벡터 분할 함수벡터 변수의 분할은 high분할과 low 분할로 나뉜다.결합과 마찬가지.. 더보기
[NEON] 비교 연산과 절대값 1. 비교 연산1.1 같음(==) 비교 함수벡터 사이에 레인 값이 같은지 비교한다. uint16x8_t r = vceqq_s16(int16x8_t a, int16x8_t b)벡터 a와 b의 레인이 같은 값인지 비교하여 벡터 r의 각 레인에 결과가 참이면 16진수로0xffff, 거짓이면 16진수로 0x0000을 저장한다. 1.2 크거나 같음(>=) 비교 함수벡터 사이에 레인 값이 크거나 같은지 비교한다. uint16x8_t r = vcgqe_s16(int16x8_t a, int16x8_t b)벡터 a가 b보다 크거나 같은지 비교하여 벡터 r의 각 레인에 그 결과가 참이면0xffff, 거짓이면 0x0000을 저장한다. 1.3 작거나 같음() 비교 함수벡터 사이에 레인 값이 큰지를 비교한다. uint16x8_.. 더보기
[NEON] 비트와 시프트 연산 1. 비트 연산1.1 NOT(~)연산uint8x8_t r = vmvn_u8(uint8x8_t a)벡터의 모든 레인에 NOT 연산을 실행 1.2 AND(&) 연산uint8x8_t r = vand_u8(uint8x8_t a, uint8x8_t b)두 벡터의 레인 사이에 AND(&)연산을 실행 1.3 OR(|) 연산uint8x8_t r = vorr_u8(uint8x8_t a, uint8x8_t b)두 벡터의 레인 사이에 OR(|) 연산을 실행 1.4 XOR(^) 연산uint8x8_t r = veor_u8(uint8x8_t a, uint8x8_t b)두 벡터의 레인 사이에 XOR(^) 연산을 실행 1.5 AND NOT(&~) 연산uint8x8_t ar = vbic_u8(uint8x8_t a, uint8x8_t .. 더보기
[NEON] 레인 설정과 조회 NEON 에서는 벡터 안의 레인에 다양한 값을 저장하거나, 레인의 값을 확인할 수 있다. 또한, 하나의 벡터 안에서 레인 사이의 교환(swap)도 가능하다. 레인 설정함수 중 몇 개는 벡터 저장 함수 중에서 브로드캐스트 함수나 레인 저장함수와 결과가 같은데, 이는 어셈블러 명령어 차이에 따른 것으로 성능의 차이는 없다. 1. NEON 레인 설정NEON 에서는 벡터의 특정 레인의 값을 불러오거나 변경 할수 있다. 단 레인 설정에 관련된 모든 함수는 복수 벡터에 지원하지 않는다. 1.1 레인 추출 함수지정된 레인의 값 하나를 일반 변수에 저장한다.uint16_t r = vgetq_lane_u16(uint16x8_t a, __constrange(0, 7) int lane)예) lane이 2일때 변수 r에 벡터.. 더보기
[NEON 산술 연산과 확장 NEON 에서는 벡터 변수 사이의 기본 산술 연산을 지원하고, 포화 더하기와 인접 레인 더하기 등 NEON만의 독특한 산술 연산도 지원한다. 또한 최댓값 및 최솟값 연산과 Long, Wide, Narrow, 포화와 관련된 산술 연산을 지원한다. NEON에서는 나누기와 제곱근 연산은 지원하지 않아서 Shift 연산이나 역수를 이용해야 한다. 1. NEON 기본 산술 연산 (더하기, 빼기, 곱하기, 레인 최댓값, 최솟값, 인접 레인 더하기 함수)(1) 더하기 함수uint16x8_t r = vaddq_u16(uint16x8_t a, uint16x8_t b) a + b 를 r벡터에 저장 (2) 빼기 함수uint16x8_t r = vsubq_u16(uint16x8_t a, uint16x8_t b) a - b 를 .. 더보기
[NEON] 함수 정리 (로드 함수, 저장 함수) 단일 로드 함수일반 로드 함수uint16x8_t = r = vld1q_u16(__transfersize(8) uint16_t const *ptr)메모리 배열에서 벡터로 데이터를 가져온다. (메모리 배열 요소와 벡터의 레인 크기가 같아야 한다) 레인 로드 함수uint16x8_t r = vld1q_lane_u16(__transfersize(1) uint16_t const *ptr, uint16x8_t a, __constrange(0, 7) int nlane)메모리의 값을 벡터의 특정 레인으로 가져온다.(ptr 메모리 변수에서 nlane번쨰 값을 a로 변환) 브로드캐스트 로드 함수uint16x8_t q = vld1q_dup_u16(__transfersize(1) uint16_t const *ptr)벡터의 모든.. 더보기
[NEON] 벡터 자료형 벡터 데이터형 : 1차원 배열 형태를 갖는 데이터형벡터 데이터 : 공간 정보의 기본 단위인 점, 선, 면을 사용하여 실세계의 위치를 2차원 또는 3차원의 좌표값으로 표현한 자료. 래스터 자료(raster data)와 더불어 공간 정보 저장 방식의 두 축을 이루고 있다. NEON에서의 벡터 데이터 유형벡터를 나타내기 위해 다음 유형을 정의합니다. NEON 벡터 데이터 유형은 다음 패턴에 따라 명명됩니다. x_t예를 들어 int16x4_t는 각각 부호 있는 16비트 정수를 포함하는 4개의 레인이 있는 벡터입니다. Table E.1에서는 벡터 데이터 유형을 나열합니다. Table E.1. 벡터 데이터 유형int8x8_tint8x16_tint16x4_tint16x8_tint32x2_tint32x4_tint64x.. 더보기
[NEON] 기본 개념 출처 : http://vision0814.tistory.com/57NEON의 자료형{0,1}을 통한 다항식 산술이란 숫자 0과 1을 이용하여 bool 산술 규칙을 이용하는 것을 말한다. NEON 벡터의 크기NEON 벡터(변수) 는 레지스터와 연결되어 있고, NEON 함수는 레지스터를 제어하기 위해서 사용된다. 더블워드(64bit) NEON벡터(D 레지스터) 0 + 0 = 1 + 1 = 0, 0 + 1 = 1 + 0 = 1, 0 * 0 = 0 * 1 = 1 * 0 = 0, 1 * 1 = 1 - 8개의 8비트 요소- 4개의 16비트 요소- 2개의 64비트 요소- 1개의 64 비트 요소 쿼드워드(128bit) NEON벡터(Q 레지스터)- 16개의 8비트 요소- 8개의 16비트 요소- 4개의 32비트 요소- 2.. 더보기