[App 개발] Cell 아키텍쳐 글을 읽기위한 간단한 토막상식 ㅡㅡ;;
본문
혹시 글 내용중에 해설이 필요한 부분은 말씀해 주시면 풀어드리겠습니다.
- VLIW
VLIW 는 Very Large Instruction Width 라는 것의 약자입니다. 공학, 기술 계열은 옛날부터 줄임말 만들기가 서툴어서 그런지 저렇게 촌스러운 단어들도 뻔뻔하게 잘 사용합니다.
기본적인 아이디어는 이렇습니다. 옛날 8비트나 16비트 시절에는 기계여 명령어 (인스트럭션) 하나를 내리기 위해서 8비트나 16비트를 모조리 사용해야 했습니다. 예를 들어 Z-80 에서 A 레지스터에 어떤 값을 대입하는 명령은 16진수로 3E XX 이 됩니다. 3E 라는 것은 어셈블리로 표현하면 LD A, XX 가 되지요.
이런 것이 프로세서 비트 수가 점점 늘어나면서 32비트, 64비트가 되었습니다. 그렇다고 해서 프로세서가 처리하는 명령어 갯수가 그렇게 많이 늘어나지도 않았습니다. 낭비죠. 그리고 병렬 처리에 대한 욕구도 늘어나게 되었습니다. 그래서 이제 마이크로프로세서 내부에 명령어 수행 유닛을 여러 개 만든 다음, 한 번에 여러 개의 명령을 동시에 내리도록 하는 방법을 사용하게 됩니다. 이렇게 명령어의 비트가 늘어났다고 해서 VLIW 라고 합니다.
어드레스에서 명령 하나를 읽어서 수행하는 것이 여러 개이므로 어셈블리의 표현도 그에 맞게 변경됩니다. 예를 들면,
0000103A 명령어 1
명령어 2
명령어 3
명령어 4
0000103B 명령어 1
명령어 2
명령어 3
명령어 4
과거에는 어드레스 하나에 명령어 하나가 할당되어 있었지만, 이제는 내부 프로세서 갯수만큼의 명령어가 할당될 수 있습니다. 물론 필요한 경우 명령어 하나, 혹은 두 개만 부를 수도 있습니다. 특히, 어떤 계산이 앞에서의 계산 결과에 종속되는 경우는 이렇게 병렬 구조를 채택할 수가 없게 되지요. 그리고 이제는 파이프라인도 기본이 되었으므로 그것도 역시 고려해서 프로그램을 작성해야 합니다. 어떤 명령이 실제로 수행되는 순간, 프로세서는 이미 다음번 계산을 위한 데이터를 입력 (fetch 라고 합니다) 하는 작업에 들어가야 합니다. 병렬 유닛이 여러개일 경우, 그리고 앞의 계산을 받아서 다음 계산을 수행하는 경우에는 파이프라인과 루프 등을 고려해서 명령을 내려주어야 프로세서의 최대 속도를 발휘할 수 있습니다.
최적화 (Optimization) 이라는 단어는 여러 분야에서 많은 다양한 의미로 사용되지만, 이쪽 동네에서는 바로 이렇게 프로세서의 최대 속력을 낼 수 있도록 명령어를 나열하는 방법을 뜻합니다.
수작업으로 일일이 해 주면 속도는 확실하겠지만 매우 고단한 작업이 됩니다. 그리고 초보자의 경우 진짜 최적화된 코드를 얻어내기란 쉽지 않습니다. 따라서 똑똑한 컴파일러를 사용해야 하는데, 일반적으로 컴파일러가 이런 작업을 대신하는 경우 전문가가 손으로 하는 작업의 약 70% 성능을 발휘한다고 알려져 있습니다. 100%가 아니면 곤란한 분들은 어쩔 수 없겠지만, 우리같은 서민들은 손쉽게 70% 를 얻을 수 있으므로 충분히 값어치가 있습니다. ^^
- SIMD
Single Instruction, Multiple Data 의 약자입니다. 센스 있는 분들이라면 당연히 "그렇다면 Multiple Instruction, Multiple Data도 있겠네" 라고 하시겠지요? 맞습니다. 컴퓨터 아키텍쳐 교과서에서 모두 다루고 있는 고전적인 방법입니다. 옛날에는 대형 컴퓨터에서만 적용하던 것들이 이제 가정용 컴퓨터까지 내려온 것입니다.
어떤 한 명령어가 한 가지의 데이터만을 다루는 경우 (일반적인 모든 작업에 해당합니다) SISD 라고 합니다. 그런데 만약 똑같은 명령어를 여러 번 계속 반복해야 하는 일이라면? 주로 FOR 루프 내에서 어떤 배열과 또 다른 배열을 곱셈하는 경우가 되겠지요? 특히 1차원 배열을 과학도, 공학도들은 "벡터" 라고 부릅니다. 어떤 값 하나를 부를 때는 "스칼라", 여러 개의 값이 일렬로 모인 것은 "벡터" 입니다. 가로 세로로 모인 경우? 그것은 "매트릭스" 라고 하지요. (웰컴 투 더 리얼 월드... ㅡㅡ;;;)
벡터 프로세서라고 하는 것을 맥 쓰시는 분들은 너무 자주 들으셨을 것입니다. 거기서 말하는 벡터는 뭐 대단한 것이 아니고, 저렇게 1차원 행렬을 한꺼번에 계산할 수 있다는 의미에서 벡터 프로세서라고 부르는 것입니다. 물론 SIMD 는 그보다도 더 많은 의미를 지니고 있습니다.
단점은 여러 개의 데이터에 덧셈이면 덧셈, 곱셈이면 곱셈, 한 가지 명령어만 적용됩니다. 첫 번째 값은 곱셈, 두 번째 값은 덧셈? 이거는 안 된다는 말이지요. 이것이 가능한 것이 MIMD 입니다. 앞에서 말씀드린 VLIW 는 MIMD 의 일종이라고 할 수 있겠지요?
요즘 나오는 대부분 프로세서들은 모두 SIMD 기능을 갖고 있습니다. 인텔의 MMX 가 그렇고, 파워피씨의 AltiVec 이 그렇습니다. 제가 알고 있기로는 AltiVec 은 모토롤라의 등록상표입니다. 애플사에서는 이제 공식적으로 AltiVec 이라고 부르지 않고 벨로시티 엔진 (Velocity Engine) 이라고 부르고 있지요. IBM 의 파워피씨 970 에서 구현된 것은 VMX 라고 부르고, AltiVec 과 하위 호환성을 갖고 있습니다. 하지만 최초로 만들어졌고 이름도 쿨한 AltiVec 이 가장 많이 쓰이고 있지요.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0