안녕하세요. 평생개발자 입니다.

 

 

S/W, H/W의 방향을 생각해봤습니다.

 

 

H/W는 단순 동작을 빠르고 명확하게 처리해줍니다. S/W는 H/W 자원을 사용하여 의미 있는 동작을 할 수 있도록 만들 어 주는 도구가 됩니다.

 

 

최선의 S/W 개발자는 제한된 H/W를 최소한으로 사용하여 최선의 결과를 도출하는 것이고,

H/W 개발자는 단순 동작을 더 빠르고 낮은 전력에 처리할 수 있느냐입니다.

 

 

 이제는 H/W에서도 S/W의 개념이 추가될 것입니다.!!

다시 말해서 CPU(central processing unit)에서도 고객에 맞춤식 F/W의 개념이 추가될 수 있을 것입니다.  사용자가 CORE 구조를 변경할 수 있다는 건 현재 구조에서는 불가능하겠지만 

 이러한 기술이 발전하기 위해서는  프로그래밍을 할 수 있는 로직 구조 즉 FPGA(field programmable gate array)이 CPU에 어떻게 녹아들 수 있는가가 문제라고 봅니다. 

 

즉!! 사용자가 CPU 명령어 셋을 입맛에 따라 만들 수 있다면, CPU(Overload)이 현저하게 줄어들 뿐만 아니라, 전력 소비도 잡을 것으로 예상합니다. 

 

최근에는 기계학습(머신러닝, 딥러닝)이 빠르게 발전하고 있기 때문에 CPU에서도 2019년도에서부터는 신경망 관련된 명령어 세트가 지원될 예정입니다.

 

앞으로

 

S/W 개발자의 길은?

 향후 H/W가 발전할 방향을 미리 알고 S/W에서 준비할 수 있다면 개발자로서 가치를 높일 수 있을 것 같습니다. 그래서 상위 레벨 개발보다는 하위 레벨을 계속 볼 줄 알아야 향후 미래 기술을 빠르게 접근할 수 있다는 결론입니다.!!

'컴퓨팅' 카테고리의 다른 글

SIMD와 4x4 Matrix 데이터 처리  (0) 2018.02.16
SIMD intrinsics header  (1) 2016.06.07
CPU 명령어 집합  (1) 2016.05.07

 안녕하세요. 평생개발자 입니다.


SIMD와 4x4 Matrix 데이터 처리에 대한 주관적인 의견입니다.



단일명령어 SISD(Single Instruction Single Data)로 구현된 알고리듬을 처리 속도를 높이기 위해 SIMD(Single Instruction Multiple Data) 자료구조를 변경하게 되었는데, 현재 구조는 Linked-list 구조로 자료형이 링크되어 있다 보니 데이터를 읽고 쓰려면 PC(Program count) 가 다시 찾아가는 문제가 있습니다.


수정 포인트!!

1단계 : Linked-list -> Array-list로 변경하는 구조로 수정작업이 필요 했고


2단계 : 3차원(X,Y,Z) 어떠한 자료구조를 가질것 인가?

 - 첫번째 구조

 X0

Y0 

Z0 

X1 

Y1 

Z1 

X2

Y2 

Z2 

... 

첫 번째 구조는 그래픽스(openGL, SDL,etc)하시는 분이라면 익숙하실 것 입니다. 3차원(3D)을 다루기 위해서는 [X, Y, Z]구조로 메모리에 담아두었다가 필요하면 Copy를 하기도 하고, 

openGL에 버퍼로 옮길 수 있는 구조 입니다.


여기서 요점은, [X, Y, Z]가 데이터를 처리 시간(Processing Time)을 단축할 수 있는 구조인가? 입니다.    


그래픽스에서는 3차원 데이터를 변형하기 위해서 4x4 Matrix 를 사용 합니다. 


여기서부터 최적의 연산(Computing)을 하기 앞어서 , CPU 종류를 결정되게 됩니다.

 

 저가 CPU는 SIMD 명령어(instruction set)이 존재하지 않습니다.  대표적으로 Intel 아톰, 셀러론 시리즈가 되겠습니다. 얘네들은 암호화 변복조에 필요한 AES(Advanced Encryption Standard) 정보만 포함되고, 연산에 필요한 레지스터는 없습니다. 즉,   SISD 연산만 가능하기 때문에 속도향상을 기대하기 어렵습니다. (동영상 플레이 하면 CPU 점유 상승)


SIMD 명령어가 포함된 Intel i3,i5,i7, 제온 등이 있습니다.  AMD는 애슬론, 비쉐라, 라이젠 등이 있는데,  저가 CPU에서도 SIMD 명령어 셋이 포함되어 있었습니다. 그래서 사람들이 인코딩 작업에는 AMD를 쓰라고 하는지? 느낌이었는지 궁금하군요.



 SISD 명령어는 [1] + [1] = [2] 하나씩 명령어를 처리하는 단일 연산자라고 생각하면 됩니다. 메모리에서부터 명령어 파이프라인 속도, CPU 병목현상에 따라서 속도가 결정되고, 일반적인 자료형으로 계산을 하였다면 SISD를 사용하고 있을 것입니다. 어쩌면 컴파일러가 지능적이라면 자동으로 수정할 지 의문!


 SIMD는 [1,2,3,4] + [1,2,3,4] = [2,4,6,8]  []묶음으로 한 번의 명령어로 데이터를 처리 할 수 있다.  

즉, SIMD는 묶음으로 한 번에 명령어를 처리함으로서 전체 명령어 수행 횟수를 줄일 수 있게 되어 속도 향상 효과를 가져다준다.  



SIMD 기대 효과에 대해서 이야기 드리겠습니다. 


 CPU 명령어 셋에는 크게 MMX, SSE, AVX, FMA 등 있습니다. (자세한 설명은 다음 포스팅에..)

각각의 레지스터들은  MMX = 64bit, SSE = 128bit, AVX = 256, AVX512 = 512bit 

데이터를 []묶을 수 있는 크기를 가지고 있습니다. 방금 언급한것 처럼 한 번에 데이터를 크게 묶을 수록 PC 수행 횟수가 줄어들기 때문에 속도 향상 효과를 가져다줍니다.


지금까지 서론 이였다면....    이제 본론으로 들어가겠습니다.

4x4 매트릭스가 어떠한 구조로 계산이 되는가? 이게 핵심 포인트 입니다.


SIMD 레지스터는 최대 512bit = flaot[16]를 묶을 수 있는데 어떻게 matrix에 담을 것인가? 

이 의문점에서는 두번째 구조를 확인하면 이해될 것이다. 


첫번째 구조에서 최적의 속도로 연산하는 방법은 SSE = float[4]  와 FMA 사용 할 것이다. 


Matrix SISD로 계산을 풀면

W' = (X*0 + Y*0 + Z*0 + 1 * 1 )               -> 8

 X' = (X*1 + Y*0 + Z*0 + 0 * 1 ) / W'         -> 9

 Y' = (X*0 + Y*1 + Z*0 + 0 * 1 ) / W'         -> 9

 Z' = (X*0 + Y*0 + Z*1 + 0 * 1 ) / W'         -> 9


Operand = 35



Matrix SIMD (SSE, FMA) (포스팅 예정)

E = A[X*0, Y*0, Z*0, 1 * 1 ] + B[X*1, Y*0, Z*0, 0 * 1 ] +

C[X*0, Y*1, Z*0, 0 * 1 ] + D[X*0, Y*0, Z*1, 0 * 1 ]       -> 6


X' = E[0] / E[3]    -> 2

Y' = E[1] / E[3]    -> 2

Z' = E[2] / E[3]    -> 2


Operand = 12



SIMD 를 사용하여 연산 수를 줄여 알고리듬 수행 속도를 높일 수 있게됩니다.


보통 openCV, Eigen, alglib 등등 matrix 관련된 라이브러리에서 SIMD 연산을 하고 있지만, Matrix 구조에 맞도록 넣어 주어야 합니다.




- 두번째 구조

 X0

X1 

X2 

X3 

X4 

X5 

X6 

X7 

X8 

... 


 Y0

Y1

Y2 

Y3 

Y4 

Y5 

Y6 

Y7 

Y8 

... 


 Z0

Z1 

Z2 

Z3 

Z4 

Z5 

Z6 

Z7 

Z8 

... 



첫번째 구조 SSE = float[4] 만 고려하였다면, 두 번째 구조에서는 avx512 = float[16]을 처리 할 수 있는 자료구조를 만들어서 데이터 처리 수행 시간을 크게 단축 할 수 있게 됩니다.


W' = (X*0 + Y*0 + Z*0 + 1 * 1 )               -> 8

 X' = (X*1 + Y*0 + Z*0 + 0 * 1 ) / W'         -> 9

 Y' = (X*0 + Y*1 + Z*0 + 0 * 1 ) / W'         -> 9

 Z' = (X*0 + Y*0 + Z*1 + 0 * 1 ) / W'         -> 9

기존의 SISD 형대의 자료형을 한 번에 16개를 처리한다고 생각하면 이해가 빠를것이라 생각 한다. 
즉, float[16] 를 한 번에 가지고 올 수 있는 구조 
x[x0, x1, ..., x15]
y[y0, y1, ..., y15]
z[z0, z1, ..., z15]
4x4 매트릭스도 16개가 있다고 생각하면 됩니다.

W[]' = (X[]*0[] + Y[]*0[] + Z[]*0[] + 1[] * 1[] )               -> 8

 X[]' = (X[]*1[] + Y[]*0[] + Z[]*0[] + 0[] * 1[] ) / W[]'         -> 9

 Y[]' = (X[]*0[] + Y[]*1[] + Z[]*0[] + 0[] * 1[]) / W[]'         -> 9

 Z[]' = (X[]*0[] + Y[]*0[] + Z[]*1[] + 0[] * 1[] ) / W[]'         -> 9


Array List인 이러한 구조를 통해서 명령어 처리 량이 16배 줄어든 것이다.  이러한 구조가 16배 속도 향상을 나타내는것은 아니며, 메모리 대역폭과 CPU레지스터의 성능에 따라서 좌우될것이라 생각 하고 있습니다. 



3단계 : SIMD 명령어를 지원하지 않을경우 예외처리.



다음 포스팅에서 좀 더 구체적이고 발전된 모습으로 정리하겠습니다. 


궁금한 사항은 문의 주세요. ^^

'컴퓨팅' 카테고리의 다른 글

향후 CPU가 발전할 방향?  (0) 2018.02.16
SIMD intrinsics header  (1) 2016.06.07
CPU 명령어 집합  (1) 2016.05.07
SIMD intrinsics header

mmintrin.h: MMX (Pentium MMX!)

mm3dnow.h: 3dnow! (K6-2) (deprecated)

xmmintrin.h: SSE + MMX (Pentium 3, Athlon XP)

emmintrin.h: SSE2 + SSE + MMX (Pentiuem 4, Ahtlon 64)

pmmintrin.h: SSE3 + SSE2 + SSE + MMX (Pentium 4 Prescott, Ahtlon 64 San Diego)

tmmintrin.h: SSSE3 + SSE3 + SSE2 + SSE + MMX (Core 2, Bulldozer)

popcntintrin.h: POPCNT (Core i7, Phenom subset of SSE4.2 and SSE4A)

ammintrin.h: SSE4A + SSE3 + SSE2 + SSE + MMX (Phenom)

smmintrin.h: SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Core i7, Bulldozer)

nmmintrin.h: SSE4_2 + SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Core i7, Bulldozer)

wmmintrin.h: AES (Core i7 Westmere, Bulldozer)

immintrin.h: AVX, SSE4_2 + SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Core i7 Sandy Bridge, Bulldozer)




<mmintrin.h>  MMX

<xmmintrin.h> SSE

<emmintrin.h> SSE2

<pmmintrin.h> SSE3

<tmmintrin.h> SSSE3

<smmintrin.h> SSE4.1

<nmmintrin.h> SSE4.2

<ammintrin.h> SSE4A

<wmmintrin.h> AES

<immintrin.h> AVX

<zmmintrin.h> AVX512




SIMD Vector header

<fvec.h> verter class

<dvec.h> integer, double (AVX 포함)



x86 Instruction Set Reference

http://www.felixcloutier.com/x86/

'컴퓨팅' 카테고리의 다른 글

향후 CPU가 발전할 방향?  (0) 2018.02.16
SIMD와 4x4 Matrix 데이터 처리  (0) 2018.02.16
CPU 명령어 집합  (1) 2016.05.07

앞으로 병령처리를 하기 위해 알아두어야 하는 알짜 상식을 정리하겠습니다.

목표는 실제로 코딩을 하여 SIMD에 대해 몸소 느껴보는걸 목표로 두고 있습니다.



Cache memory

컴퓨터 구조를 알아야 하는 이유는 컴퓨터의 처리속도를 이해하기 위함입니다. 나무위키 참고 하였습니다.

레지스터 - 캐시 - 주기억장치 - 보조기억장치 순서 입니다. 레지스터와 캐시는 CPU 내에 포함되어 있습니다.

가장 쉽게 말해 느린 장치는 적게 쓰고 빠른 장치를 많이 쓰면 가장 효율 좋은 프로그램이 됨니다.

SIMD 를 쓰는 이유는 다 이러한 이유가 있기 때문에 사용한다고 생각하시면 되겠습니다. 멀티코어 환경에서는 더욱 그 가치가 돋보이게 됨니다.





명령어주기 - 1참고, 2참고

instruction cycle

컴퓨터의 명령어 주기를 알기위해서는 4개의 의미를 기억해둬야 한다.

Fetch(인출) : 메모리상의 PC가 가리키는 명령어를 CPU로 인출하여 적재.
Decode(해석) : 명령어의 해석. 이 단계에서 명령어의 종류와 타겟 등을 판단한다.
Execute(실행) : 해석된 명령어에 따라 데이터에 대한 연산을 수행한다.
Writeback(쓰기) : 명령어대로 처리 완료된 데이터를 메모리에 기록한다.


PC(Program counter), MAR(Memory address register), MDR(Memory data register)
IR(Instruction register), CU(Control unit), ALU(Arithmetic logic unit)


위키에 설명이 잘되어 있으므로 참고하세요.





단일 명령어 - 단일 데이터 흐름 

SISD(Single Instruction stream, Single Data stream)

가장 일반적으로 사용되는 방법으로 사용자가 일일이 CPU 명령어를 모르더라도 컴파일러가 일반적으로 처리해 주는 기법임으로 명령어를 실행시 마다 매번 메모리를 읽어오기때문에 효율이 떨어집니다. 





단일 명령어 - 복수 데이터 흐름

SIMD(Single Instruction stream, Multiple Data stream)

SISD 기법에서는 하나의 싸이클동안 하나의 데이터 처리를 하지만 SIMD 기법은 복수의 데이터를 처리하는 방법을 말합니다.  컴퓨팅 성능을 높이기 위해서는 최소한의 메모리를 참조(읽기 쓰기)해야 성능이 높아짐을 알 수 있습니다. 이때문에 SIMD 기법은 반복작업이 많은 프로세싱 분야에 많이 사용되고 있으며 openCV, Eigen, Armadillo, IPP등 다양한 라이브러리에서 사용되어 지고 있습니다.






복수 명령어 - 단일 데이터 흐름

MISD(Multiple Instruction stream, Single Data stream)

(위키 참고)


복수 명령어 - 복수 데이터 흐름

MIMD(Multiple Instruction stream, Multiple Data stream)

(위키 참고)



명령어 파이프라인

IP(instruction pipeline)

파이프라이닝기법은 순차적으로 실행하는 프로세서에 적용되는 기술로(단일 명령어 처리는 말하는것으로 이해하고 있다.) 한번에 하나의 명령어를 처리하는것이 아닌  하나의 명령어가 처리중 동시에 복수의 명령어를 처리하는것을 말합니다. 동시에 처리하기 위해서는 반드시 순차적인 명령어가 파이프라인닝이 되어야 합니다.  예를 들어 RISC(Reduced Instruction Set Computer) CPU 에서는 명령어 조합을 통해 연산을 수행 합니다.

이때 캐시 공간을 버퍼로 사용함으로 상대적으로 느린 메모리에 접근은 최소화하게 됨니다.


파이프라인 붕괴 - 명령어 수행 과정중 예외발생

(작업중 예외 상황으로 끼어들었을때 캐시메모리 영역을 초화과하여 저장된 명령어가 손실되었을대는 말하는것인지 궁금함??)


해저드(Hazard) -  파이프라인이 속도가 느려지는 경우를 해저드라고 합니다.







참고 

위키, 위키

나무위키



허접한 내용 봐주셔서 감사합니다. 부족한 내용은 보안 해야겠습니다.




'컴퓨팅' 카테고리의 다른 글

향후 CPU가 발전할 방향?  (0) 2018.02.16
SIMD와 4x4 Matrix 데이터 처리  (0) 2018.02.16
SIMD intrinsics header  (1) 2016.06.07

+ Recent posts