Android NEON type could not be resolved at Eclipse

프로그래밍/NEON(ARM) 2014. 9. 23. 15:57
  • Make a new C++ project
  • Default options for everything
  • Once created, right-click the project and go to "Properties"
  • C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags. Put-std=c++0x at the end . ... instead of GCC C++ Compiler I have also Cygwin compiler
  • C/C++ General -> Paths and Symbols -> Symbols -> GNU C++. Click "Add..." and paste__GXX_EXPERIMENTAL_CXX0X__ (ensure to append and prepend two underscores) into "Name" and leave "Value" blank.
  • Hit Apply, do whatever it asks you to do, then hit OK.
  • I had the same problem. It could be resolved by flushing the Eclipse indexer.
    I used the projects context menu and selected Index->Rebuild and Index->Freshen All Files. The last removed the error messages.


'프로그래밍 > NEON(ARM)' 카테고리의 다른 글

NEON 수학, 이항, 스칼라 연산  (0) 2014.09.03
NEON 변환 연산  (0) 2014.09.03
NEON 비교 연산과 절대값  (0) 2014.09.03
NEON 비트와 시프트 연산  (0) 2014.09.03
NEON 레인 설정과 조회  (0) 2014.08.31

2015년 상반기 삼성소프트웨어 멤버십 회원 선발

카테고리 없음 2014. 9. 23. 03:50

[삼성전자 소프트웨어멤버십 회원 선발 공고]

삼성소프트웨어멤버십에서 2015년도 상반기 신입회원을 선발 합니다.
  
1. 모집 요강
  □ 모집대상 : IT분야 연구개발에 ‘재능’과 ‘열정’있는 국내 정규 4년제 대학(원)생
  □ 해당지역 : 서울, 수원, 대전, 대구, 부산, 광주, 전주
  □ 접수방법 : 온라인 접수( www.secmem.org )
  □ 모집일정
    * 서류접수 : 2014. 11. 3 ~ 2014. 11. 12 / 오후 3시까지
    * 기술면접 : 2014. 11. 24 ~ 2014. 11. 28
    * 결과발표 : 2014. 12월 중 예정
    ※ 2015년 하반기 서류접수/기술전형 : 2015년 5월 예정

2. 지원 자격
  □ IT 연구개발에 재능과 열정이 있는 자
  □ 정규 4년제 대학(원)생 (1~4학년, 석사)
  □ 전공 학과 불문
  □ 국내외 공모전 수상자 우대
  □ 대학 졸업 전 1년 이상 회원 활동이 가능한 자(대학 졸업과 동시에 수료)

3. 전형 방법
  1차|서류전형 (Portfolio 및 보유기술소개서)
  - 공모전 수상작, 학교 텀 프로젝트 등, 본인이 직접(공동)개발한 작품에 대한 소개 및
    본인이 보유하고 있는 Software 관련 기술/이력 작성전공 학과 불문

  2차|보유 기술 면접 (Portfolio 및 Software 응용개발능력 면접)
  - 서류전형 합격 후 개발한 작품 및 본인 이력을 통한 보유 기술 면접 진행

  3차|코딩 풀이 면접 (Software 언어 문제 풀이 면접)
  - Software 언어를 활용한 코딩/알고리즘 풀이 진행

4. 선발 인원 : 약 ○○○명

5. 회원 혜택
  □ 연구개발 활동 및 환경 지원
  회원 활동 수료 후 입사 희망 시 SSAT 면제
   ※ 보다 자세한 사항은 홈페이지( www.secmem.org )를 참조하세요.


[삼성소프트웨어멤버십이란?]
1. 설립목적
  삼성소프트웨어멤버십이란, S/W 및 관련 분야에 대한 재능과 열정이 있는
  대학생들에게 연구, 개발에 필요한 모든 것들을 지원하여 창의적이고
  실력 있는 삼성의 Software 전문가가 되도록 지원하는 프로그램입니다.

2. S/W멤버십에서 바라는 인재상
  열정적이고 창의적인, Software 에 재능이 있는 학생들입니다.
  학년, 나이, 학교, 전공, 성별에 구애 받지 않고 S/W 분야에 대한
  열정, 그리고 그 열정을 꽃 피울만한 실력이 갖춰진 학생이라면
  S/W멤버십 회원이 될 수 있습니다.

3. S/W멤버십 Program 이란?
  S/W멤버십 회원이 되기 위한 절차를 거쳐 모든 시험과정에 합격한 뒤
  회원이 되어 활동 과정을 수료하는 사람에 한해 삼성전자에 입사할 수
  있는 특전이 주어지는 제도입니다.


▷▶▷삼성소프트웨어멤버십 홈페이지 바로가기
▷▶▷삼성소프트웨어멤버십 블로그 바로가기
▷▶▷삼성소프트웨어멤버십 페이스북 바로가기

Newton_Raphson Method

수학 2014. 9. 3. 21:00

Newton's  method


수치해석부분에서 Newton's method(혹은 Newton-Raphson Method)라고 알려저 있는 방법은

Isaac Newton과 Joseph Raphson이 발견한 함수의 근사값이나 실제값을 찾는 가장 효과적인 방법이다.


찾고자 하는 함수 식을 f(x)라고 할때, 이 함수의 미분f'(x)를 구해 처음 근사값 x(0) 으로 시작하여

좀더 나은 x(1)을 찾는 방식이다. 아래과 같은 수식에 대입하여


x1 값을 얻고, 이러한 과정을 반복적으로 수행(n번째 x를 넣어 n+1을 찾음)하여

근사값을 구하는 방법이다.


식을 다시 정리하면 다음과 같다.




출처 : http://en.wikipedia.org/wiki/Newton%27s_method



'수학' 카테고리의 다른 글

분산과 표준편차 구하기  (0) 2014.10.17
고유값, 고유벡터  (0) 2014.10.14
다각형 나머지 한점 구하기(다각형의 넓이)  (1) 2014.03.02
사인법칙  (0) 2014.02.26
함수의 극값 구하기  (0) 2014.01.29

NEON 수학, 이항, 스칼라 연산

프로그래밍/NEON(ARM) 2014. 9. 3. 20:47

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 vrecps_f32(float32x2_t a, float32x2_t b) - 실수 32bit 2개

 float32x4_t vrecps_f32(float32x4_t a, float32x4_t b) - 실수 32bit 4개

 

1.4 역수 제곱근 확장 함수

3에서 두 벡터의 레인 사이의 곱하기 연산 결과를 빼고, 그 결과를 2로 나누어 저장한다.

이를 식으로 나타내면 r = (3 - (a*b)))/2

 float32x2_t vrsqrts_f32(float32x2_t a, float32x2_t b) - 실수 32bit 2개

 float32x4_t vrsqrts_f32(float32x4_t a, float32x4_t b) - 실수 32bit 4개

 

NEON의 역수 확장 함수를 이용하면 Newton-Raphson 알고리즘을 구현 할수 있다.


1.5 역수를 이용한 나누기 연산

역수를 이용하면 나누기를 구현할수 있다.


X / N = X (1 / N)


X / N의 결과는 X * (1 / N) 과 같으므로 X / N = X * (1 / N)이 성립한다.

이 공식을 이용하면 곱하기와 역수로 나누기를 구할수 있다.

10나누기 2를 이 공식으로 나타내면 다음과 같다.



2. NEON 이항 연산

2.1 벡터 교환 함수

단일 벡터 사이에 레인 값을 교환하고 복수 벡터에 결과를 저장한다.


int8x8_t r = vtrn_s8(int8x8_t a, int8x8_t b)



2.2 인터리브와 디인터리브

인터리브와 디인터리브를 이해하면 앞에서 다룬 복수 벡터의 로드와 저장 연산 방식을 이해 할수 있게 된다.

복수 벡터로 메모리 데이터를 로드할 때는 인터리브(Interleave)가 적용되고, 메모리 데이터에 복수 벡터를 

저장할 때는 디인터리브(De-Interleave)가 자동으로 적용된다. 여기에서 메모리 데이터는 배열을 의미한다.


        

 예를 들어 RGB 이미지 메모리를 uint8x8x3_t 형식의 복수 벡터에 로드하면 R, G, B 데이터가 val[0], val[1], 

val[2]에 각각 로드된다. 이렇게 메모리가 벡터에 분할되어 로드되는 것을 인터리브라고 한다.


반대로 uint8x8x3_t 형식의 벡터를 메모리로 저장하는 경우 val[0], val[1], val[2]에 포함된 

R, G, B데이터가 메모리에 각각 저장되는 것을 인터리브라고 한다. 디인터리브는 인터리브의 반대이다.


RGB 데이터는 이미지 데이터 포맷으로 멀티미디어에 사용되는데, NEON은 이와 같은 연산을 지원하여

멀티미디어를 처리하는 데 최적화되어 있으므로, 개발자가 이미지 데이터를 처리하는 애플리케이션을 

제작하기 수월하다.


벡터 인터리브

두개의 벡터를 하나의 복수 벡터에 저장한다.


int8x8x2_t r = vzip_s8(int8x8_t a, int8x8_t b)

두 개의 메모리 데이터가 복수 벡터에 대입될 때 1개 레인을 건너가며 저장된다.


   



벡터 디 인터리브

디인터리브는 인터리브와 마찬가지로 두 개의 단일 벡터를 하나의 복수 벡터에 저장하지만, 

저장하는 방식이 다르다.


int8x8x2_t r = vuzp_s8(int8x8_t a, int8x8_t b)

   

두 개의 벡터가 복수 벡터에 대입될 때 val[0]과 val[1]에 교대로 저장된다. 

현재까지 NEON의 벡터 인터리브와 벡터 디 인터리브는 2개의 단일 벡터만 연산이 가능하다.


3. NEON 스칼라 연산

NEON에서 스칼라(Scalar)는 벡터에 포함된 여러 레인 중에서 하나의 레인만을 참조하거나 

하나의 일반 변수를 이용하여 벡터의 여러 레인을 참조하는 것을 말한다. 스칼라에 사용되는

값은 16비트 또는 32비트, 64비트 값이 될 수 있다. NEON에는 여러 가지 스칼라 연산이 있지만

대부분 곱하기 연산에 특화되어 있다.


3.1 스칼라 곱하기

벡터의 모든 레인을 하나의 값으로 곱한다


int16x4_t r = vmul_n_s16(int16x4_t a, int16_t b)


 


3.2 스칼라 벡터 Long 곱하기

두 개의 벡터에서 특정 레인을 이용한 곱하기 연산이다.


int32x4_t r = vmull_lane_s16(int16x4_t a, int16x4_t b, __constrange(0, 3) int c)


     



일반 변수 c로 벡터 b의 레인 중에서 하나의 레인을 선택한다. 

선택된 레인으로 벡터 a의 각레인을 곱하여 결과를 쿼드 워드 벡터 r에 저장한다.


3.3 스칼라 곱하기 누계

스칼라 곱하기 연산 결과에 벡터 더하기 연산을 실행


int16x4_t r = vmla_n_s16(int16x4_t a, int16x4_t b, int16_t c)


b 벡터의 각 레인에 c를 곱한뒤 벡터 a와 각 레인을 더해 벡터 r에 저장한다.(r = (b * c) + a)


3.4 스칼라 벡터 곱하기 누계

스칼라 벡터 곱하기 연산 결과에 벡터 더하기 연산을 실행한다.


int16x4_t r = vmla_lane_s16(int16x4_t a, int16x4_t b, int16x4_t v, __constrange(0, 3) int l)


벡터 b와 v에 스칼라 벡터 곱하기 연산을 실행한다.

벡터 b의 각 레인에 벡터 v의 l번째 값과 곱한뒤 벡터 a의 각 레인값과 더한뒤 벡터 r에 저장





'프로그래밍 > NEON(ARM)' 카테고리의 다른 글

Android NEON type could not be resolved at Eclipse  (0) 2014.09.23
NEON 변환 연산  (0) 2014.09.03
NEON 비교 연산과 절대값  (0) 2014.09.03
NEON 비트와 시프트 연산  (0) 2014.09.03
NEON 레인 설정과 조회  (0) 2014.08.31

NEON 변환 연산

프로그래밍/NEON(ARM) 2014. 9. 3. 17:33

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는 하위레인에 그대로 복사된다.

 

  

 

 

 

NEON 비교 연산과 절대값

프로그래밍/NEON(ARM) 2014. 9. 3. 16:44

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_t r = vcleq_s16(int16x8_t a, int16x8_t b)

벡터 a가 b보다 작거나 같은지 비교하여 벡터 r의 각 레인의 위치에 그 결과가 참이면 0xffff,

거짓이면 0x0000을 저장한다.

 

1.4 큼(>) 비교 함수

벡터 사이에 레인 값이 큰지를 비교한다.

 

uint16x8_t r = vcgtq_s16(int16x8_t a, int16x8_t b)

벡터 a가 b보다 큰지를 비교하여 벡터 r의 각 레인의 위치에 그 결과가 참이면 0xffff, 거짓이면 0x0000을 저장한다.

 

1.5 작음(<) 비교 함수

벡터  사이에 레인값이 작은지 비교한다.

 

uint16x8_t r = vcltq_s16(int16x8_t a, int16x8_t b)

벡터 a가 b보다 작은지를 비교하여 벡터 r의 각 레인의 위치에 그 결과가 참이면 0xffff, 거짓이면 0x0000을 저장한다.

 

2. 절댓값

2.1 절댓값 함수

벡터의 절댓값(ABS)를 구한다.

 

int8x8_t r = vabs_s8(int8x8_t a)

벡터 a의 절댓값을 계산한다.

 

2.2 절대 차이 함수

벡터 변수 사이에 빼기 연산을 하고 절댓값을 구한다.

 

int8x8_t r = vabd_s8(int8x8_t a, int8x8_t b)

벡터 a에서 b를 뺀 결과의 절댓값을 구한다. (r = |a-b|)

 

2.3 절대 차이 누계 함수

절대 차이 함수의 실행 결과에 또 다른 벡터를 더하여 저장한다.

 

int8x8_t r = vaba_s8(int8x8_t a, int 8x8_t b, int8x8_t c)

벡터 b에서 c를 뺀 절댓값에 벡터 a를 더한다. (r = a + |b-c|)

 

2.4 절댓값 비교

NEON은 절댓값 사이의 비교 연산을 지원한다. 절댓값 비교의 종류는 총 4가지로

절댓값이 크거나 같음, 절댓값이 작거나 같음, 절댓값 큼, 절댓값 작음이 있다.

단, 절댓값 비교는 실수형 벡터만 지원한다.

 

절댓값 크거나 같음 (>=)

uint32x4_t r = vcageq_f32(float 32x4_t a, float32x4_t b)

실수 32bit 레인 벡터 a의 절댓값이 같은 크기의 벡터 b의 절댓값보다 크거나 같은지 비교하여

결과를 부호 없는 정수형 벡터 r에 대입한다. 정수 비교와 마찬가지로 참이면 대상 레인은

0xffff로 설정되고, 그렇지 않으면 모두 0x0000으로 설정된다.

 

절댓값 큼 (<)

uint32x4_t r = vcagtq_f32(float32x4_t a, float32x4_t b)

실수 32bit 레인 벡터 a의 절댓값이 같은 크기의 벡터 b의 절댓값보다 큰지 비교하여 결과를

부호 없는 정수형 벡터 r에 대입한다.

 

절댓값 작거나 같음 (<=)

uint32x4_t r = vcaleq_f32(float32x4_t a, float32x4_t b)

실수 32bit 레인 벡터 a의 절댓값이 같은 크기의 벡터 b의 절댓값보다 작거나 같은지 비교하여 결과를

부호 없는 정수형 벡터 r에 대입한다.

 

절댓값 작음 (<)

uint32x4_t r = vcaltq_f32(float32x4_t a, float32x4_t b)

실수 32bit 레인 벡터 a의 절댓값이 같은 크기의 벡터 b의 절댓값보다 작은지 비교하여 결과를

부호없는 정수형 벡터 r에 대입한다.

 

 

'프로그래밍 > NEON(ARM)' 카테고리의 다른 글

NEON 수학, 이항, 스칼라 연산  (0) 2014.09.03
NEON 변환 연산  (0) 2014.09.03
NEON 비트와 시프트 연산  (0) 2014.09.03
NEON 레인 설정과 조회  (0) 2014.08.31
NEON 산술 연산과 확장  (0) 2014.08.27

NEON 비트와 시프트 연산

프로그래밍/NEON(ARM) 2014. 9. 3. 16:04

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 b)

벡터에 NOT 연산한 결과를 또 다른 벡터와 AND연산 (b 벡터에 NOT 연산후 AND연산)

 

1.6 OR NOT(|~) 연산

uint8x8_t r = vorn_u8(uint8x8_t a, uint8x8_t b)

벡터에 NOT(~) 연산한 결과를 또 다른 벡터와 OR(|) 연산 (b 벡터에 NOT 연산후 OR 연산)

 

1.7 비트 단위 선택 함수

int8x8_t r = vbsl_s8(uint8x8_t a, int8x8_t b, int8x8_t c)

두 벡터의 레인 bit를 조합하여 하나의 레인에 저장

벡터 a의 레인의 값이 1이면 b벡터의 비트 선택, 레인값이 0이면 c벡터의 비트 선택

 

1.8 부호 비트 변환 함수

int8x8_t r = vneg_s8(int8x8_t a)

벡터의 부호 변경(각 레인 마다 변경)

 

2. NEON 시프트 연산

2.1 NEON Shift 함수

int8x8_t r = vshl_s8(int8x8_t a, int8x8_t b)

벡터 a의 레인 값을 벡터 b의 레인 값 만큼 Shift 연산을 한다.(양수는 왼쪽으로 shift, 음수는 오른쪽으로 shift)

 

int8x8_t r = vqshl_s8(int8x8_t a, int8x8_t b) - 포화 shift 함수(오버플로우 방지)

 

※ 일반적으로 Shift 연산은 산술적 Shift 연산과 논리적 Shift 연산이 있다.

    NEON 에서는 논리적 Shift 연산을 지원하지 않는다. 그 이유는 예를들어 논리적 Shift 연산은 2의 n승으로

    나눈 효과가 있지만, 음수에서는 문제가 나타난다. 일반적으로 음의 정수는 2의 보수로 구현되는데,

    2의 보수의 최상위 부호는 1이 된다. 그래서 논리적 Shift 연산을 음수에 사용하면 2로 나눈 결과가 아닌

    양수로 바뀌게 된다.(논리적 Shift 연산은 최상위 비트가 부호에 상관없이 무조건 0이 채워지기 때문)

    따라서 NEON 에서는 논리적 Shift 연산을 지원하지 않는다.

 

2.2 오른쪽 Shift 함수

int8x8_t r = vshr_n_s8(int8x8_t a, __constrange(1, 8) int b)

벡터 a 를 b만큼 오른쪽으로 Shift 연산한다. 각 레인에 대해서 최상위 비트 값은 유지하고,

이후 1bit씩 Shift하므로 2의 n승으로 나눈 결과가 된다.

 

2.3 왼쪽 Shift 함수

int8x8_t r = vshl_n_s8(int8x8_t a, __constrange(0, 7) int b)

벡터 a를 b만큼 왼쪽으로 Shift 연산한다. 논리적 왼쪽 Shift 연산은 2의 n승으로 곱한 효과가 있다.

 

2.4 Shift 후 삽입 함수

오른쪽 Shift 후 삽입

uint8x8_t r = vsri_n_u8(uint8x8_t a, uint8x8_t b, __constrange(1, 8) int c)

벡터 레인을 Shift 하고, Shift 한 크기만큼 다른 벡터 레인의 bit로 채워 넣는다.

벡터 b를 c 만큼 오른쪽 shift 연산 한후, 빈 공간은 벡터 b의 bit로 채운다.

 

왼쪽 Shift 후 삽입

uint8x8_t r =vsli_n_u8(uint8x8_t a, uint8x8_t b, __constrange(0, 7) int c)

벡터 a를 2만큼 왼쪽 shift 연산 한 후, 빈 공간은 b의 bit로 채운다.

 

2.5 나눗셈 구현

NEON 에서는 나눗셈을 지원하지 않으므로 Shift 연산으로 대체해야 한다.

순수하게 Shift만을 사용하게 되면 2, 4, 6, 8, 16, 32, 64와 같이 2의 n승 단위의 나눗셈만 구현할 수 있다.

 

149/23과 같은 나눗셈을 구현하려면 일정한 값을 곱하고 나서 Shift 연산을 수행해야 한다.

먼저 레인이 오버플로가 발생하는지를 고려하여 Shift 연산을 수행할 크기를 정한다.

오버플로에 대한 우려가 없다면 Shift 단위가 클수록 오차가 줄고 정확하다. 나눗셈을 구현하는 과정은 다음과 같다.

 

  ① 오버플로가 발생하지 않는 범위의 Shift 단위를 정한다.

  ② Shift 단위를 제수로 나눈다. (6÷3=2에서 6을 말함 )

  ③ 구한 값을 피제수로 곱한다.

  ④ 피제수를 오른쪽 Shift 연산한다.

 

예) 256 Shift 단위로 다음 나눗셈을 구현하기

   149 / 9 = 16

 

직접 나눗셈을 할수 없으므로 Shift 연산을 수행할 단위 256을 9로 나눈다.

   256 / 9 = 16

 

28을 149에 곱하고 나서 256으로 나눈다.

   149 * 28 = 4172

 

4172를 8번 오른쪽 Shift 연산하면

   4172 / 256 = 16

 

결과값 16이 나온다.

 

'프로그래밍 > NEON(ARM)' 카테고리의 다른 글

NEON 변환 연산  (0) 2014.09.03
NEON 비교 연산과 절대값  (0) 2014.09.03
NEON 레인 설정과 조회  (0) 2014.08.31
NEON 산술 연산과 확장  (0) 2014.08.27
NEON 함수 정리(로드 함수, 저장함수)  (0) 2014.08.27