명령어 셋트는 CPU에서 실행할 수 있는 명령어의 집합으로, 1개의 명령어는 1개의 조작-오퍼레이션-에 해당하며, 어떤 프로그램도 마지막에는 몇개의 명령어로 번역되어 CPU가 이를 식별하고 실행합니다. CPU는 명령에 의존하여 계산을 하며 시스템을 조절하고, 명령어의 강약에 따라 CPU의 성능도 달라지며, 명령어 셋트는 CPU의 효율을 높여즈는 도구이기도 합니다.

 

CPU는 기본적인 명령어 셋트를 가지고 있습니다. 예를 들어 인텔과 AMD의 절대 다수 프로세서는 x86 명령어 셋트를 사용하는데, 이것은 이 제품들이 x86 아키텍처에서 비롯된 것이기 때문입니다. 하지만 CPU가 얼마나 빠르건 x86 명령어는 오직 한번에 1개의 데이터만 처리할 수 있어 효율이 매우 낮습니다. 우리가 실제 사용하는 어플리케이션에서는 데이터가 일종의 셋트를 이루어서 출현하는 경우가 많은데, 예를 들면 1개 점의 좌표(XYZ)나 색상(RGB), 멀티 채널 사운드 등이 그렇습니다. CPU가 이런 부분에서 높은 성능을 낼 수 있도록 하기 위해서는 특수한 명령어를 사용하여 시대의 변화에 따른 수요를 따라가게 되며, 이렇게 새로 늘어나는 명령어를 확장 명령어 셋트라고 합니다.

 

 

인텔 CPU의 확장 명령어 셋트의 변화

 

인텔은 1996년에 MMX(Multi Media eXtensions) 멀티미디어 확장 명령어 셋티으를 도입하여, SIMD(Single Instruction Multiple Data) 명령어 셋트의 선구자가 되었습니다. 즉 1개의 사이클에 1개의 명령어로 여러 데이터 조작을 완성할 수 있는 것입니다. MMX 명령어 셋트는 당시 펜티엄 MMX부터 사용되기 시작했습니다.

 

1.jpg

 

인텔 프로세서의 확장 명령어 셋트의 변천사

 

SSE(Streaming SIMD Extensions)는 1999년에 인텔이 펜티엄 3 프로세서에 먼저 사용한 것으로서, 그 벡터 처리 능력을 64비트에서 128비트로 높인 것입니다. 윌라멧 코어의 펜티엄 4에서는 SSE2로 확장되었으며(2000년), SSE3 명령어는 프레스컷 코어의 펜티엄 4부터 시작되었습니다.

 

SSE4(2007년)은 SSE 명령어 셋트에서 제일 큰 명령어 확장으로, 펜린에서 도입된 SSE4.1과 네할렘에서 도입된 SSE4.2로 나뉩니다. 그 중 SSE4.1에 대부분의 명령어-47개-가 있고, 네할렘에서 추가된 SSE4 명령어 셋트는 7개밖에 안됩니다. 이렇게 하여 총 54개의 명령어가 SSE4.2가 됩니다.

 

2.png

 

샌디 브릿지의 AVX 명령어 셋트.

 

그 다음으로는 SSE5가 나와야 할것 같지만, 2007년 8월에 AMD가 먼저 SSE5 명령어 셋트를 발표하자 인텔은 SSE5 대신 AVX 명령어 셋트를 샌디 브릿지에서 사용한다고 2008년 3월에 발표하고, 4월에는 AVX 명령어 셋트의 스펙을 정식으로 발표했습니다. 그 이후 여러 변화가 있긴 했지만, 업계에서는 AVX가 샌디 브릿지의 제일 중요한 특징이라고 보고 있습니다.

 

 

인텔 AVX 명령어 셋트의 소개

 

AVX(Advanced Vector Extensions) 명령어 셋트는 AMD SSE5의 설계에서 일부를 참고하여, 확장/강화시켜 만든 차세대 SIMD 명령어 셋트입니다.

 

3.jpg

 

IDF 2010에 등장한 AVX의 응용.

 

2010년 4월의 IDF 2010에서 인텔은 AVX의 응용 사례를 보여주었습니다. 2개의 다른 플랫홈에서 운동복의 국기를 추적하는데 AVX를 지원하는 영상 추적 시스템은 14초가 걸려서, AVX를 지원하지 않은 시스템보다 21초 빠른 결과가 나와 60% 이상의 성능 향상을 보여주었습니다.

 

관심 있으신 분은 AVX 관령 영상의 33분 쯤을 보세요. http://intelstudios.edgesuite.net/idf/2010/bj/keynote/100413_DP_CN/f.htm

 

4.jpg

 

인텔 AVX의 새로운 특징.

 

인텔 AVX는 다음과 같은 몇가지 확충과 강화가 있습니다.

 

256비트 벡터 계산으로 부동소수점 성능을 2배 증가.

개선된 데이터 재배열로 효율적으로 데이터를 액세스.

3 조작 함수와 4 조작 함수를 지원하여 벡터와 스칼라 코드에서 레지스터를 더 효율적으로 사용.

 

 

256비트 벡터 계산의 지원

 

199년에 SSE는 벡터 처리 능력을 64비트에서 128비트로 끌어올렸습니다. 그 이후로 SSE 시리즈는 128비트 XMM 레지스터만 사용해 왔는데, 이번에 AVX가 16개의 128비트 XMM 레지스터를 256비트 UMM 레지스터로 확충하면서 256비트 벡터 연산을 지원하게 됐습니다.

 

5.jpg

 

128비트 XMM 레지스터가 256비트로 확장.

 

이것은 동시에 8개의 32비트 부동소수점이나 1개의 256비트 부동소수점을 처리할 수 있다는 것을 의미합니다. 프로그램을 짤 때 SSE 128비트의 제한을 신경쓰지 않아도 되며, 한번에 더 많은 조작을 직접 해서 256비트 데이터 대역폭의 코드를 충분히 이용한다면, 이상적인 경우 부동소수점 성능은 최고 2배 늘어나게 됩니다.

 

당연히 256비트 코드를 충분히 이용하지 못할 경우도 있습니다. 대부분의 경우 이런 레지스터에서 128비트보다 더 높은 부분은 0이나 left unchanged로 채워질 것입니다. 동시에 모든 SSE/SSE2/SSE3/SSSE3/SSE4 명령어는 AVX와 완전 호환되기 때문에(AVX는 MMX를 호환하지 않습니다) 실제로 조작하는 YMM 레지스터가 128비트보다 낮아도, 원래의 SSE 시리즈 명령어와 차이가 없습니다.

 

6.jpg

 

샌디 브릿지의 하이라이트.

 

명령어 대역폭의 개선을 만족하기 위해 Load 유닛도 한번에 256비트를 처리할 수 있는 능력을 갖춰야 합니다. 따라서 1개의 완전한 Load 조작을 할 수 있는 유닛을 추가하였으며 이것은 단순히 대역폭이 배로 늘어난 것이 아닙니다. 이렇게 하여 1 사이클에 256비트의 곱셈/덧셈과 셔플 연산이 가능합니다.

 

새로운 256비트 레지스터를 사용하여 데이터 I/O 효율이 나아지고 데이터의 전달과 태그가 더 나아졌으며, 데이터의 배열 순서를 동적으로 고칠 수 있게 되었습니다. 이렇게 하여 필요한 데이터를 조직하고, 엑세스하고 불러들여 연산하는 속도가 더 빨라지고 효율적이 되었습니다.

 

7.jpg

 

AVX는 아주 많은 새 부동소수점 연산 명령을 추가했습니다.

 

AVX는 많은 새 부동소수점 명령어를 추가하여 부동소수점 연산 능력을 강화하였으며, 3D 게임의 성능 향상 뿐만 아니라 복잡한 플래시의 표시, 더 빠른 SVG(스케잉러블 벡터 그래픽), 더 나은 HTML5 효과 등을 지원하게 되었습니다. GPU 계산과 비교하면 전력 소비가 더 적고, 크기가 더 적고, 제조 원가도 아주 낮아 GPU 연산에 상당한 충격을 가져다 줄 것입니다.

 

 

3 조작수와 4 조작수

 

통상적인 컴퓨터 명령어느 조작 코드와 조작 수(Operands, 피 연산 수)를 가지고 있습니다. 조작 코드는 조작의 완성을 결정하고 자작 수는 연산에 참가하는 데이터와 필요한 유닛의 주소를 가리킵니다. 예를 들어 movaps xmm1, xmm0은 듀얼 조작수이며 SSE 명령 movaps는 조작 코드로서, 그 기능은 xmm0 레지스터의 내용을 xmm1에 복사하는 것입니다.

 

8.jpg

 

새로운 3 조작수와 4 조작수의 포멧.

 

AVX 명령어의 개선과 더불어 원래 특징을 강화하여 , 3 조작수의 명령어 코드와 문법을 더욱 알맞게 사용할 수 있게 되었습니다. 예를 들어 xmm10 = xmm9 + xmm1라는 기능은 지금까지만 해도 2개의 명령어를 사용하여 실행해야만 했습니다.

 

movapps xmm10, xmm9 xmm9 레지스터의 데이터를 xmm10으로 복사할것
addpd xmm10, xmm1 xmm1과 xmm10 레지스터의 데이터를 추가하여 xmm10에 저장할것

 

하지만 AVX 명령어에서 새로 늘어난 3 조작 함수를 사용하면 1개의 명령만으로 완성됩니다.

 

vaddpd xmm10, xmm9, xmm1

 

AVX의 3조작 삼수는 더 적은 레지스터 복제를 사용하며 더 간단한 코드를 사용한다는 것을 알 수 있습니다.

 

4 조작 함수는 비록 AMD의 SSE5에서 먼저 나온 것이지만, 인텔의 AVX에서도 이를 지원합니다. AVX 128과 AVX 256비 비파괴성 문법을 사용하기 때문에 레지스터 사이에 복사를 줄이고 코드를 간소화하며 load/op fusion의 기회를 늘리는데 도움이 됩니다.

 

movaps xmm0, xmm4
movaps xmm1, xmm2
blendvps xmm1, m128

 

이상의 3개 명령어를 4 조작 함수를 사용하면 xmm0을 쓰지 않고 1줄의 명령으로 완성할 수 있습니다.

 

vblendvps xmm1, xmm2, m128, xmm4

 

 

정렬되지 않은 메모리 어드레스 엑세스의 효율적 지원

 

CPU가 작동할때는 메모리 데이터의 길이(예를 들면 32비트)의 배수에 따라 메모리 조작을 진행하게 됩니다. 예를 들면 어드레스가 0, 32, 64, 96 같은 식으로 나가면서 엑세스를 하는 것이고, 27, 58, 83 같은 어드레스에 엑세스하진 않습니다. 만약 이런 어드레스에 저장된 내용을 직접 엑세스 가능하다면 메모리 효율을 크게 높일 수 잇을 것입니다.

 

하나의 구조체 설계 길이는 32의 배수일 필요는 없습니다. 예를 들어 6바이트의 구조를 사용하면 길이가 48비트가 되는 것입니다. 만약 다양한 형태의 이런 구조를 메모리 배열에 사용한다면, 시작 주소가 주소의 경계에 위치하지 않는 여러가지 구조가 있을 것이고, 따라서 프로그래머가 각 구조의 끝부분에 반드시 공백문자를 넣어서 32비트의 배수로 바꿔야 할 것입니다. 이것이 메모리 정렬의 기본 원리입니다.

 

9.jpg

 

전통적인 명령어에서 정렬되지 않은 메모리 엑세스(unaligned memory access)를 할 때에, 상당히 큰 액세스 사이클을 필요로 하며, 심지어는 그 속도를 대폭 감소시키기도 합니다.

 

AVX 명령어 셋트에서느 VEX prefix에 연결된 코드의 산술 명령과 메모리 엑세스 명령어가, 메모리를 더 효율적으로 엑세스할 수 있도록 하여 정렬되지 않은 메모리 주소를 바로 엑세스하여 데이터를 꺼내올 수 있게 하였습니다. 물론 정렬되지 않은 데이터 엑세스에는 어느 정도의 성능 손실이 있지만, 전통적인 명령어와 비교하면 많이 줄어든 것입니다.

 

 

혁신적인 VEX 명령어 포멧

 

인텔은 2008년 봄 IDF에서 AVX를 소개하면서 AVX에서 도입한 VES(Vector Extension)을 소개했습니다.

 

10.jpg

 

VEX 명령어 코딩 솔루션

 

x86 명령어는 쉽게 확장이 가능하지만 새로운 명령어와 새로운 데어터에 맞춰 확장을 해야 하며, 모두 opcode 전에 새로운 1바이트 prefix를 넣는 것으로 확장을 지원합니다. 이렇게 하여 명령어 셋트의 복잡도와 명령어 길이의 증가를 하게 되며, 이 때문에 이진 구조에서 데이터가 쓸데없이 남게 되고 CPU 명령 디코드 하드웨어가 복잡해지게 됩니다.

 

VEX 인코딩은 이 문제를 해결하였습니다. VEX는 prefix의 데이터를 압축하는 방법을 사용하여, 1바이트의 payload에 전부의 prefix를 포함시켜, 명령어 길이를 단축시키고 불필요한 code size의 낭비를 대폭 줄였습니다. 뿐만 아니라 앞으로 새로운 레지스터를 도입할 수 있고, 128비트나 더 긴 256비트 데이터에서도 payload를 압축하게 됩니다.

 

11.jpg

 

인텔 AVX와 AMD XOP.

 

VEX prefix는 2바이트와 3바이트 버전으로 나뉘는데 prefix 부분에서 C4h와 C5h를 사용합니다. AMD의 XP 명령어 셋트도 비슷한 방법을 사용하는데 XOP의 prefix 바이트는 8Fh로 바뀝니다. 비록 prefix가 다르긴 하지만 payload 부분의 포멧은 VEX와 같습니다. AVX의 VEX 코딩 시스템은 인텔 프로세서의 앞으로 변화를 반영하며, x86 시리즈 CPU의 코딩 능력 부족을 해결할 것입니다.

 

 

AVX는 샌디 브릿지의 제일 중요한 개선점

 

12.jpg

 

AVX와 SSE의 처리 속도 비교

 

인텔 AVX 명령어 셋트는 벡터 처리 성능을 256비트로 끌어올려, 이론적으로는 CPU의 부동소수점 성능을 최대 2배로 끌어올렸습니다. 뿐만 아니라 혁신적인 VES 코딩은 x86 디코더의 병목 현상을 해결할 것으로 기대됩니다.

 

AMD의 SSE5와 인텔의 AVX 명령어 셋트는 그 기능이 비슷하지만, AVX가 더 많은 우수한 특징을 가지고 있습니다. 비록 SSE5가 AVX보다 더 먼저 발표되었지만 작년에 AMD도 AVX를 지원할 것이라고 결정하였기 때문에 개발자들에게 어려움은 없을 것입니다. 동시에 AMD는 SSE5를 고쳐 XOP, CVT16, FMA4 명령어 셋트를 새로 정의할 것입니다. 심지어 AVX 명령어 때문에 불도저가 2010년에서 2011년으로 연기되었다는 이야기도 있으니까요.

 

AVX는 샌디 브릿지에서 제일 중요한 개선점이며, 며칠 후면 그 진면목을 보게 될 것입니다. 물론 하드웨어 뿐만 아니라 소프트웨어의 지원은 필수 불가결한 것인데, 다행인 것은 윈도우즈 7 SP1에서 AVX를 지원한다는 것입니다.

 

 

 

 

 

 

 

 

           

기글하드웨어(http://gigglehd.com/zbxe)에 올라온 모든 뉴스와 정보 글은 다른 곳으로 퍼가실 때 작성자의 허락을 받아야 합니다. 번역한 뉴스와 정보 글을 작성자 동의 없이 무단 전재와 무단 수정하는 행위를 금지합니다.