2016년 10월 4일 화요일

네온(Neon)이 대체 뭐지?

이제 LD2 인스트럭션은 이해했습니다만, 애초에 v0, v1 같은 레지스터는 왜 있는 걸까요?
대체 x1, x2 같은 generic purpose register와는 무엇이 다른 걸까요?

이걸 이해하려면 이제 ARM사에서 말하는 NEON이 뭔지 알아야 할것 같습니다.

SIMD라는 말이 먼저 나오는데요. SIMD란 Single Instruction Multiple Data를 줄인 말입니다. 한 마디로 인스트럭션 하나로 Data를 여러개 다룰 수 있다는 말이죠.

그럼 이게 왜 필요할까요?

ARM은 32비트 프로세서 (AArch32)에서 현재는 64비트 프로세서 모드(AArch64)를 지원하고 있습니다. 이게 무슨 말이냐 하면, 한번에 다루는 Data의 Address나 크기가 32bit혹은 64bit까지 한꺼번에 다루는 것이 가능하다는 뜻이죠.

그런데 문제는, 많은 경우에 (특히 멀티미디어 관련 - 이를 테면 오디오 코덱 이나 그래픽 관련에서 함수들) 이것 보다 작은 크기의 데이터를 대량으로 다루는 경우가 많다는 겁니다.

가령 이런 함수에서 많은 양의 8비트 데이터를 엄청나게 연산해야 하는데, CPU는 한꺼번에 64비트를 처리할 능력이 있는데, 고작? 8비트의 데이터를 복사 혹은 연산하기 위해서 한개 인스트럭션을 소모해야 한다면, CPU를 효율적으로 사용하고 있다고 말하기 힘들겠죠.

이런 비효율의 문제를 해결하기 위해서, ARM社에서는 ARMv6에 작은 크기에 데이터를 여러개 처리하도록 해주는 기본적인 SIMD 명령어를 추가하게 됩니다. 이때는 8비트 혹은 16bit로 값들을 generic purpose register에 packed한 형태로 연산하도록 지원을 했었고, ARMv7이후에는 이 개념을 더 확장해서 이런 operation을 위해서 vector register를 두고, 명령어 세트와 해당 Architecture를 합쳐서 네온 (NEON) 이라고 부르게 됩니다. 현재는 모든 Cortex-A 프로세서에서 지원하고 있습니다..

Cortex-A8 프로세서에서 등장한 개념이니까 아주 최신 개념이라고 하기는 힘듦니다만, 그래도 다른 명령어에 비해서 생소하다고 할수는 있겠죠.

현재 NEON에서는 지원하는 operation에는 크게 4가지가 있습니다.

- 메모리 Access (load or store)
- Vector 레지스터간 혹은 Vector레지스터와 General Purpose레지스터간 데이터 복사
- Data Type Conversion
- Data Processing (add, substract, multiplication, shift...)

Vector 레지스터는 Vxx 형태로 불리고, 사용시에는 크기를 지정하는 이름과 함께 사용됩니다.
- Q - quad word - 128 bit
- D - double word - 64 bit
- S - single word - 32 bit
- H - half word - 16 bit
- B - byte - 8 bit

이를 테면 Vn.16B는 8비트 크기의 element 16 lane을, Vn.4S라고 하면 32bit 크기의 element 4 lane을 가리키게 됩니다.

그리고 혼동하지 말아야 할 것은, 실제로 V0.2D 나 V0.4S, V0.8H, 혹은 V0.16B는 실제로 같은 register 이지만, operation하는 단위가 달라지게 됩니다..

예를 들어, 아래 코드에서 보면 x15, x16, x17, x18의 주소에서 값을 읽어서 v0~v7 regiseter로 (각각 128비트) 복사하게 되는데,

ld2 {v0.4s, v1.4s}, [x15]
ld2 {v2.4s, v3.4s}, [x16]
ld2 {v4.4s, v5.4s}, [x17]
ld2 {v6.4s, v7.4s}, [x18]
x15입장에서 보면, 첫번째 single word (32bit)는 v0로, 두번째 single word(32bit)는 v1, 세번째 single word(32bit)는 v0의 두번째 word로, 내번째 single word(32bit)는 v1의 두번째 word로 복사되게 됩니다.

댓글 없음:

댓글 쓰기