개요

 ARM에 따르면, Cortex-A8 NEON 블록은 NEON VFP 가속기를 내장하고 있다. NEON Cortex-A8파트에 SIMD(Single Instruction Multiple Data) 가속기를 내장한 것이다. 그럼 SIMD가 어떤 기능을 하는가? 이것은 한 명령어를 실행하는 동안 같은 오퍼레이션이 병렬로 최대 16개 데이터 셋(Set)까지 처리할 수 있다. 또한 벡터 프로세서 언어(Term)이다. 이것이 NEON 안에-서 병렬화할 때, 밖으로는 같은 클럭 비율로 동작하는 기본적인 SISD(Single Instruction Single Data)보다 더 많은 MIPS 혹은 FlOPS를 얻을 수 있다. 여러 NEON 벤치마크에서 NEON N명령어를 받으면서 ARM N 명령어를 보다 적게 받는 모습을 보여주었다. 이것은 병렬화가 얼마나 진행되었냐에 따라 그 성과를 보여주는 것이다. 같은 작업이라도 명령어 수가 줄어들면 낮은 클럭으로도 처리할 수 있을 것이다. 가장 큰 NEON 레지스터가 128비트 일 때, 8비트 값에서 오퍼레이션을 실행하는데 있어 동시에 4개 오퍼레이션을 실행할 수 있다. NEON이 얼마나 빠르게 오퍼레이션 데이터 사이즈를 보게 되는 특정 루프의 속도를 올릴 수 있는가? 대강 16오퍼레이션을 실행할 수 있다. 그러나 메모리 처리량과 루프 오버헤드 등이 실행 속도에 영향을 받을 수 있다는 것을 잊지 말아야 한다. NEON 명령어는 주로 수(numerical), Load/Store, 논리 오퍼레이션이다. Neon 오퍼레이션은 ARM 코어 파이프라인에서 분기가 일어나는 동안 NEON 파이프라인에서 실행한다.

 

SIMD?

 일부 최신 소프트웨어, 특히 미디어 코덱과 그래픽 가속기에서는 글자크기보다 작지만 많은 데이터를 운용한다. 16비트 데이터는 대게 오디오 어플리케이션, 8비트 데이터는 주로 그래픽과 비디오에서 사용한다.

 

 32비트 마이크로프로세서에서 이것을 실행할 때, 부분적으로 연산 유닛을 사용하지 않지만 전력은 계속해서 소비하게 된다. 가용 자원을 보다 효율적으로 사용하는 것이 이 SIMD 기술과 같은 타입이다. 같은 사이즈의 복잡한 데이터 요소에서 병렬 내 같은 오퍼레이션을 실행하는데 단일 명령어를 사용한다. 이 방법은 같은 시간 내에 추가 8비트 값을 4병렬로 실행하는 대신 일반적으로 2개의 32비트 값을 추가한다.

 

NEON이란?

 ARMv7 아키텍처에서 Advanced SIMD 확장을 소개하였고, ARMv7-A ARMv7-R 프로파일에서 선택적으로 확장할 수 있도록 하였다. 이 확장은 SIMD 개념을 정립한 명령어 그룹이 65비트 D, 더블워드, 레지스터와 128비트 Q, 쿼드워드, 벡터레지스터에 벡터를 저장하여 운용한다.

 

 ARM 프로세서에서 사용하는 Advanced SIMD 확장 도구를 NEON이라 부르고, 일반적인 언어는 아키텍쳐 표준 외부에서 사용한다.

 

 NEON 명령어는 부분적으로 ARM 혹은 Thumb 명령어 스트림을 사용하여 실행한다. 이것은 외부 가속기를 사용하는 것과 비교하여 소프트웨어 개발, 디버그, 통합을 단순화 할 ㅜㅅ 있다. 전통적인 ARM, Thumb 명령어는 모든 프로그램 흐름과 동기화를 관리하였다. NEON 명령어는 다음을 수행한다 :

º 메모리 액세스

º NEON과 다목적 레지스터간 데이터 복사

º 데이터 형태 변환

º 데이터 프로세싱

 

NEON으로 얻는 이점은 무엇인가?

º 정렬/미정렬(aligned/unaligned) 데이터 액세스는 SIMD 오퍼레이션의 벡터화 효과를 볼 수 있다.

º 3D 그래픽스를 압축 디코딩 하는데 정수와 부동소수점 오퍼레이션을 둘 다 지원하여 광범위한 어플리케이션 적용을 보증한다.

º 긴밀하게 연결된 ARM코어가 단일 명령어열과 통합된 메모리 뷰를 지원하며, 보다 쉬운 공급을 목적으로 단일 개발 플래폼을 제공한다.

º 라지 NEON 레지스터 파일은 다중 뷰와 결합하여 효율적인 데이터 조작과 최소화한 메모리 액세스, 데이터 처리량 성능을 향상시킨다.

 

VFP?

 VFP는 부동소수점 하드웨어 가속기이다. 이것은 NEON처럼 병렬 아키텍쳐가 아니다. 기본적으로 1인풋 돌아오는 1아웃풋을 한 세트로 하는 1 오퍼레이션을 실행한다. VFP는 부동소수점 연산의 속도 향상을 목적으로 한다. ARM과 같은 프로세서에서 부동소수 하드웨어가 없다면, 소프트웨어 매스 라이브러리에만 의지 할 수 밖에 없는 상황이 된다. 또한 부동소수점 연산 속도를 엄청나게 느려지게 한다. VFP IEEE754 표준에 따라 싱글, /배정밀도 부동소수점 연산을 모두 지원한다. 그리고 VFP NEON처럼 완전한 파이프라인이 아니기 때문에, 성능 면에서도 NEON과 다르다.

 

NEON VFP는 어떤 관계인가?

 NEON VFP ARM 코어 내부에 같은 라지 레지스터 파일을 공유한다. 이것들의 레지스터는 ARM 코어 레지스터와 분리되어 있다. Cortex-A8에서 NEON / VFP 레지스터 파일은 256바이트다.

 

20110922504.jpg  

 

NEON 레지스터 파일이 가진 듀얼 뷰:

º 32-64비트 레지스터(Dx 레지스터)

º 16-128비트 레지스터(Qx 레지스터)

VFP 레지스터 파일 또한 듀얼 뷰를 가짐:

º 32-64비트 레지스터(Dx 레지스터)

º 32-32비트 레지스터(Sx 레지스터 레지스터의 1/2만이 32비트 뷰이다)

NEON 관점: 레지스터 Q0 Q0, 혹은 D0:D1에만 액세스

VFP 관점: 레지스터 D0 D0 혹은 D0:D1에만 액세스

 

NEON을 통한 2패스 혹은 파이프라인:

º 정수와 고정소수점(8비트, 16비트, 32비트 정수 지원)

º 단정밀도 부동소수점(32비트 부동소수점 지원)

VFP는 싱글패스

º 단정밀도 혹은 배정밀도 부동소수점(32비트와 65비트 부동소수점 지원)

 

Note:

º NEON은 배정밀도 부동소수점 오퍼레이션을 지원하지 않음.

º VFP는 배정밀도 부동소수점 오퍼레이션을 지원하지 않음.

 

 

[참고1] NEON VFP 둘 다 부동소수점을 지원하는데 그럼 뭘 써야하나?

º VFPv3 IEEE754를 완전히 따른다.

º NEON IEEE754를 완전히 따르진 않는다. 그래서 주로 멀티미디어 어플리케이션을 목적으로 한다.

 

아래는 NEON 파이프라이닝이 VFP를 능가하는 것을 보여주는 예시다.

[이전과 같은 C 펑션을 사용하는 대신 VFP 타입을 사용]

1.   void NeonTest(float * __restrict a, float * __restrict b, float * __restrict z)

2.    {

3.       int i:

4.       for(i=0;i<200;i++) }

5.          z[i] = a[i] * b[i]

6.       }

7.      }

[위의 코드는 Codesourcery : GCC(CodeSourcery G++ LTE 2007q3051)4.2.1을 사용하여 컴파일 함]

[NEON VFP 둘 다 사용할 수 있는 펑션을 컴파일 했음]그리고 비교 결과 :

º arm-non-linux-genueabi-gcc-03 –march=armv7-a –mtune=cortex-a8 –mfpu=neon ftree-vectorize –mfloat-abi=softfp

º arm-non-linux-genueabi-gcc-03 –march=armv7-a –mtune=cortex-a8 –mfpu=vfp ftree-vectorize –mfloat-abi=softfp

 

600MHz Cortex-A8을 사용하는 OMAP3EVM 보드에서 리눅스로 테스트.

VFP/NEON

펑션을 50만 회 실행하는데 걸린 시간

VFP

7.36

NEON

0.94

 

 

[참고2]

□ NEON 지원 데이터 형태

 NEON 명령어는 8비트, 16비트, 32비트, 65비트 signed/unsigned(부호 붙임/없는 정수)를 지원한다. 또한 32비트 단정밀도 부동소수점 요소, 8비트와 16비트 다항식을 지원한다. VCVT 명령어는 단정밀도 부동소수점에서 32비트 정수, 고정소수점, 반정밀도(반정밀도 확장 프로세서 도구가 있을 시) 사이에서 변환할 수 있다.

 

□ NEON 레지스터

 NEON 레지스터 뱅크는 32-64비트 레지스터로 이루어져 있다. Advanced SIMD VFPv3 둘 다 이것을 사용하면, 레지스터 뱅크를 공유할 수 있다. 예를 들어 VFPv3 32비트 배정밀도 부동소수점 레지스터를 지원하는 VFPv3-D32폼을 사용한다. 이것은 전환을 지원하는 Context를 단일 사용하는 것을 집적한 것인데, VFP context NEON context나 저장/반환하는 루틴이 동일하기 때문이다.

 NEON 유닛은 다음과 동일한 레지스터 뱅크를 볼 수 있다.

º 16-128비트 쿼드워드 레지스터, Q0-Q15

º 32-64비트 더블워드 레지스터, D0-D31

 

 

 

출저 : http://infocenter.arm.com/help/topic/com.arm.doc.dht0002a/index.html?resultof=%22%4e%45%4f%4e%22%20%22%6e%65%6f%6e%22%20

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------

 

 

자료는 나름 방대하고(중복내용도 너무 많고, 순수 분량도 많고), 저번 ppt 목차(http://gigglehd.com/zbxe/6099565)처럼 깔끔하게 정리하자니 시간이 더 걸릴 것 같네요.

 

그래서 일단 휴가나온김에 들고온 번역글이나마 올려봅니다. 스캐너만 있었어도 이렇게 일일이 다 치진 않을텐데.. 전역하면 복합기 하나 사야겠어요.

 

부대에선 매일 한글만 쓰다 집에 있는 오피스워드 쓰자니 적응이 안되는 겸 급하게 날림으로 베낀거라 오타가 많을 수도 있고, 눈치보며 번역하다보니 오역도 있을 수 있어영.