안돼 메구밍...ㅠ 애니

안돼 아사나기라니.....ㅜㅜ
메구밍은 분명 아사나기의 폭렬마법에 의해서 눈에 하트가 박혀버릴거야...ㅠㅠ 으아아아아아
에리카만 괴롭히면 됐지 이제는 메구밍까지 건드리냐아아아아!!!ㅠ

컴퓨터 구조 및 설계(정리): 1장 - 컴퓨터 추상화 및 관련 기술(4) 컴퓨터 구조

전력 장벽


1970년대부터 2010년대 까지의 CPU의 트랜지스터, 클럭속도, 전력소비량, 클럭 당 성능 변화 그래프
트랜지스터는 무식하게 1차함수 형태에 근접하게 증가하는데 나머지는 고개숙인 아드님(...)마냥 맥을 못추고 있다.

 위의 그림은 인텔 프로세서가 처음 등장한 이후 최근까지의 클럭속도와 전력이 어떻게 증가했는지를 보여주고 있다. 트랜지스터는 지속적으로 증가하고 있으나 속도와 전력은 최근에 주춤해졌다. 속도와 전력이 같이 증가하는 이유는 둘이 서로 연관되어 있기 때문이고, 2005년대를 기점으로 성장이 느려진 이유는 상용 마이크로프로세서의 냉각 문제 때문에 사용 할 수 있는 전력이 부족해 졌으며 때문에 사용 가능한 실리콘칩 영역이 늘어나지 못하기 때문이다. 이를 다크 실리콘 문제라 한다. 

DEEPDARK♂SILICON이 아니다.


 다크 실리콘(Dark Silicon): 소비 전력의 한계 때문에, 실리콘 칩에서 전력을 공급해 줄 수 없는 음영지역을 의미한다. CPU가 동작할 때 전력이 없어 아무 작업도 수행 할 수 없는 영역이다. 반도체 제조 공정의 미세화가 진행되면 될 수록 다크 실리콘이 차지하는 면적이 커지게 된다.
 통상적이라면 반도체 제조 공정의 미세화가 진행 될 수록 트랜지스터가 버리게 되는 누설전류도 줄어 들어야 한다. 하지만 실제로는 기술상의 한계로 원하는 만큼 누설전류를 줄여내기 어려워졌다. 공정미세화를 통해 실제 CPU가 웨이퍼에 인쇄된 크기는 줄어들어도 줄어든 실리콘 웨이퍼의 영역에서 소비전력은 이전보다 크게 줄어들지 않게 않았으며, 발열때문에 공급 가능한 전력 자체는 한정되어 있기 때문에 이전보다 줄어들고 남은 실리콘 칩 영역을 사용하기 어려워 진 것이다.
답 없는 일에 공돌이들은 야근야근 열매를 먹고 있지요.

 마음에 와닿는 예를 들자면 스트레스로 식비(소비전력)가 위험할 정도로 하루에 엄청난 양을 먹어 대는 당신이 뼈를 깍는 노력으로 다이어트를 해서 체급은 확 줄였어도 여전히 먹는 양은 폭망이라서 식비는 줄지 않고 당신의 수년째 변화 없는 월급(공급가능전력)은 구원받지 못하고 있다는 이야기

 집적회로에서 가장 많이 사용되는 CMOS(complementary metal oxide semiconductor)가 전력을 소비하는 주원인은 "동전력(dynamic power)"이다. 동전력이란 트랜지스터가 스위칭하는 동안에 소비되는 전력을 말한다. 동전력 소모량은 각 트랜지스터의 용량성 부하, 인가 전압, 트랜지스터의 스위칭 속도 등에 따라 결정된다.

전력 = 용량성 부하 X 전압^2 X 스위칭 빈도

 스위칭 빈도는 클럭 속도가 변수가 되는 함수 값이다. 트랜지스터의 용량성 부하는 출력 단자에 연결된 트랜지스터의 개수와 반도체 공정의 미세화가 변수가 되는 함수이다. 반도체 제조 공정은 도선의 길이와 두께 그리고 트랜지스터의 용량을 결정한다.
 새로운 공정이 나올 때마다 전압은 낮아졌고, 전력은 전압의 제곱에 비례하기 때문에 소비 전력이 낮아질 수 있었다. 공정이 미세화 될 때마다 대략 15%씩 전압이 줄어들었으며, 이런 이유는 초창기의 CPU는 구동 전압이 5V에서 현재의 CPU는 1V근처의 전압을 유지하고 있다.

산화막을 죽입시다. 산화막은 공돌이의 원수!

 이는 Dennard 스케일링에 의해서 얻어지는 결과인데, 공정 미세화를 통해 CMOS의 크기가 줄어들려면 이것저것 줄어야 할테니 트랜지스터의 게이트 길이도 줄여야 할 것이고, 트랜지스터 게이트의 산화막도 얇게 만들 것이다. 이렇게되면 구동 전압과 정전용량도 줄어든 만큼 비례해서 떨어지게 된다. 산화막이 얇아지게 되면 트랜지스터의 스위칭도 빨라지기 때문에 트랜지스터의 동작도 빨라지게 된다. 위의 공식에 대입해서 생각해 보면 트랜지스터의 동작은 스위칭 빈도에 대입 할 수 있으며 용량성 부하는 정전용량에 대입해서 생각해 볼 수 있다. 증가한 스위칭 빈도는 감소한 용량성 부하와 상쇄되고 줄어들게 된 전압만 남게 된다.

 때문에 공정 미세화만 달성 할 수 있으면 소비전력을 줄일수 있었던 것이 CPU성능향상과 소비전력 억제의 비밀이었다. 생각보다 소비전력이 잘 억제 되었으면 줄이고 남은 공간에 트랜지스터도 더 늘려줘서 '나님 고성능CPU에염 뿌우!' 하면서 자랑 하기도 하고....

 그런데 미세화가 진행될 수록 전압만 줄이면 만사 ok던 반도체 성능놀음이 130nm를 기점으로 Dennard 스케일링을 따르지 않게 되었다. 공정을 미세하게 해도 기술적인 한계때문에 다른건 다 줄어드는데 트랜지스터의 게이트의 산화막이 얇아지지 않는것이다. 얇아지지 않은 산화막때문에 전압은 더이상 감소하기 어렵게된 것이다. 전압도 안떨어지고 트랜지스터의 스위칭도 오르지 않으니 소비전류량을 감수하고 트랜지스터를 늘려도 큰 성능향상 자체도 기대할 수 없게 되버렸다.
예전 인텔의 보일러의 대명사였던 펜티엄4 프레스캇 CPU
이놈의 문제는 공정미세화문제와 아키텍쳐 설계가 절묘한 하모니를 이루어 발열문제를 이루어 낸 놈이었다. 짜장면과 짬뽕을 섞어 괴작을 만든느낌?
당시 나온 개그 썰로 "요즘 날씨도 추운데 어머님 집에 펜티엄4 하나 놔드려야 겠어요"
간간이 유튜브에 CPU로 고기나 계란을 굽는 동영상이 있는데 이놈을 생각하면 절대 개소리가 아님을 알 수 있다.
추가로 이놈부터가 130nm에서 90nm도 돌입한 CPU다.

 공정미세화를 통해 직접회로의 크기는 줄어들었지만 소비전력은 변화가 없거나 줄어드는 비율은 감소하게 되었다.  클럭을 억지로 올리거나 공정미세화를 하고 남은 공간에 트랜지스터를 더 늘리게 되면 소비전력은 증가하게 되고 발열은 감당할 수 없는 지경에 이르게 되며 당신의 컴퓨터는 펑! 이라는 상황에 직면하게  되었다. (클럭을 올릴 수 없는 상황을 흔히는 4Ghz의 벽이라고 부른다. 용어가 나올 당시는 액체질소라도 때려부우면서 오버클럭을 해야 벽을 깨니 마니 했지 요즘은 오버클럭을 안해도 간간히 순정에서 4Ghz를 넘는 CPU도 있다.) 전력소비에 따른 발열때문에 CPU에 줄 수 있는 공급전력량은 한정되어 질 수 밖에 없게 된 것이 지금의 현 상황이다.

 때문에 CPU제조사들은 어떻게든 별의 별 꼼수를 써서 발열을 줄여내고 쿨링에도 신경을 쓰게 된 것인데 그래도 근본적인 문제를 해결 한 것이 아니었다.



단일 프로세서에서 멀티프로세서로의 변화


 2005년 이전까지의 CPU설계 방법은 대게 일반적으로 공정미세화를 하면서 트랜지스터를 왕창 때려박고 클럭속도를 높이는 것으로 성능향상을 꾀하였다. 하지만 프레스캇 발열로 이슈화 된 성능둔화 및 발열 문제는 CPU의 앞날에 암운을 드리어 냈다.

 현재는 단일 프로세서에서 한 프로그램의 응답시간을 계속 줄여나가는 대신 칩 하나에 여러개의 프로세서를 집적한 마이크로프로세서를 생산하고 있는데, 이는 응답시간보다는 처리량 개선에 더 효과가 있다.

 요는 좀 많이 비싸고 육성하기도 여려운 천재 한명을 배출하기 보단 적당한 범재들 여려명 묶어서 처리하게 한다는것. 수식문제를 내줘도 천재는 혼자서 빠르게 풀어내지만 한명이 처리 할 수 있는 문제수는 정해진 시간 내에서 제한적인 반면 범재 여려명이 동시에 푸는것은 푸는 속도는 천재보다는 약간 떨어져도 문제를 풀어내는 양 자체는 더 많은 것이다.

 프로세서와 마이크로프로세서 수 용어 사이에 혼란을 줄이기 위하여, 일반적으로는 프로세서를"코어"라 부르고 이러한 마이크로프로세서를 멀티코어 프로세서라 부른다.

아이큐 300....일리가 없잖아!

 코어를 여러개 쓰는 방법은 이전에도 존재하였었다. 슈퍼컴퓨터의 운영방식이 그러했고, 서버에서는 듀얼 CPU라 하여 메인보드에 시피유 자체를 여러개 박아서 성능향상을 노리는 방법도 존재했다. 단일 CPU에 단일코어의 성능향상이 어려워지니 기술자들은 이전에 존재하던 기술을 재활용 하여 성능에 대한 방향성을 다르게 잡은 것이다.

 과거에 프로그래머는 코드 한 줄도  바꾸지 않고 하드웨어와 컴퓨터 구조, 그리고 컴파일러의 발전에만 의존해도 성능향상의 혜택을 누릴 수 있었다. 조금 타협해서 코드를 발로 짜도 컴퓨터의 가파른 성능향상이 모든걸 덮어 주었었다. 이를 업계 동네에선 '공짜점심'이라고 불렀다. 하지만 이제 더이상 반도체 회사들이 먹여주는 공짜점심은 없어져 버렸다. 단일 CPU의 성능 향상을 더이상 노리기 어려워 졌기 때문에 CPU설계는 멀티코어의 구조를 따라 흘러가게 되었고, 프로그래머들은 멀티코어 CPU에서 완벽하게 동작 할 수 있도록 스스로 최적화를 해야 하는 상황이 되었다. 즉 병렬 프로그래밍의 도래이다.

 병렬 프로그래밍을 이용한 병렬프로그램을 작성하는 것은 상당히 어려운 일이다. 이유는 아래와 같다.
  • 병렬 프로그래밍은 정의상 성능을 중시하는 프로그래밍이고 이는 프로그래밍의 어려움을 가중시킨다.
  • 프로그램을 작성할때 프로그램에서 수행하는 각각의 여러개의 작업이 각각의 다른 작업의 성능이나 작업영역을 방해하지 않도록 스케쥴링과 조정작업을 거치도록 해야 한다. 이러한 스케쥴링 관리는 난이도가 높다.

요는 작업들이 지 밥그릇만 처리하면 좋은데 현실은 그렇지 않다는거...조련사(프로그래머)의 능력이 빛나야 하는 부분이다.
개판이네!!!

-공부를 위한 목적으로 작성하는 글이기 때문에 글 내용에 오류가 있을 수도 있습니다. 읽어보시고 올바르지 못한 내용에 대해서는 지적 부탁드립니다.


컴퓨터 구조 및 설계(정리): 1장 - 컴퓨터 추상화 및 관련 기술(3) 컴퓨터 구조

성능

상사의 눈을 피하기 위해서도 응답시간이 작은 컴퓨터는 필수인 것이다.

alt+tab을 하다가 랙걸릴때의 그 눈물이란...ㅠㅠ


응답시간(response time): 실행시간이라고도 한다. 컴퓨터가 작업 개시에서 완료하기까지의 총 소요시간으로 디스크 접근, 메모리 접근, 입출력 작업, 운영체제의 오버헤드 및 CPU시간을 모두 포함하는 시간이다.


그림입니다.<br/>원본 그림의 이름: mem00002d1c0001.tmp<br/>원본 그림의 크기: 가로 417pixel, 세로 260pixel

이놈들은 항상 남은 시간 내에 작업 완료를 끝내는 걸 본 적이 없더라...


처리량(throughput): 대역폭이라고도 한다. 주어진 시간에 완료하는 작업의 수를 나타내는 또 다른 성능의 척도이다.


 임베디드 시스템이나 속도위주의 데스크탑 컴퓨터에서는 응답시간이 중요한 성능지표일 것이다. 그러나 많은 양의 작업을 처리해야 하는 서버와 같은 시스템에서는 처리량이 중요한 성능지표이다.

 여기서는 컴퓨터의 성능을 논할 때 주로 응답시간에 초점을 맞추기로 한다. 성능을 최대화하기 위해서는 어떤 태스크의 응답시간 또는 실행시간을 최소화해야 할 것이다. 따라서 어떤 컴퓨터X의 성능과 실행시간의 관계를 다음과 같이 표시할 수 있다.



그러므로 두 컴퓨터 x와 y에 대해 x의 성능이 y의 성능보다 좋다면





 이 된다. 즉, x가 y보다 빠르다면, y에서의 실행시간이 x에서의 실행시간보다 길다.

 컴퓨터 설계에 관해 설명할 때는 두 컴퓨터의 성능을 정량적으로 비교해야 하는 경우가 생긴다. 다음과 같은 경우를 정량적으로 표현하면 ‘x가 y보다 n배 빠르다“고 말한다.



x가 y보다 n배 빠르다면, y에서의 실행시간이 n배 길 것이다.



위의 예시에서



 이므로, B는 A보다 1.5배 느리다고도 말할 수 있다.

 혼돈파괴망가을 피하기 위해, 컴퓨터 성능을 정량적으로 비교할 때는 “...보다 빠르다”라는 용어만 사용하기로 하자.

그림입니다.<br/>원본 그림의 이름: mem00002d1c5d6c.jpg<br/>원본 그림의 크기: 가로 500pixel, 세로 678pixel<br/>사진 찍은 날짜: 2008년 06월 21일 오후 2:35<br/>프로그램 이름 : Adobe Photoshop 7.0

오덕군자 킬제덴 선생



성능

그림입니다.<br/>원본 그림의 이름: mem00002d1c0003.jpg<br/>원본 그림의 크기: 가로 700pixel, 세로 1209pixel

 뭔가 밑의 대머리가 한방에 모든 작업을 끝내줄 것 같지만 속지마 숫놈이다!

역시 신사라면 지포스지 *=_=*, 하지만 내 눈엔 ATI가 보배네! -철컹철컹


 시간은 컴퓨터 성능의 가장 기본적인 측도이다. 같은 작업을 최단 시간에 실행하는 컴퓨터가 가장 빠른 컴퓨터이다. 여기서 프로그램 실행시간은 프로그램을 처리하는 데 걸린 시간을 초 단위로 표시한 것이다. 그러나 시간은 우리가 재는 방법에 따라 여러 가지로 정의할 수가 있다. 가장 쉽게 생각할 수 있는 것은 벽시계 시간(wall-clock time), 응답시간 또는 경과시간(elapsed time)이라 부르는 것이다. 이것은 한 작업을 끝내는 데 필요한 전체 시간을 뜻하는 것으로 디스크접근, 메모리 접근, 입출력 작업, 운영체제 오버레드 등 모든 시간을 더한 것이다.

 그러나 시분할 시스템에서는 프로세서 하나가 여러 프로그램을 동시에 실행하는데, 이런 환경에서는 특정 프로그램의 경과시간을 최소화하는 것보다는 처리량을 최적화 하는 것이 중요할 수 있다.

 때문에 경과시간과 구분해서 프로세서가 순수하게 이 프로그램을 실행하기 위해 소비한 시간을 계산할 필요가 있다. 이를 CPU 실행시간이라 한다.


 시분할 시스템(time sharing system): CPU 스케쥴링과 다중 프로그래밍을 이용하여 다수의 사용자들에게 시스템을 이용할 수 있게 구성한 시스템 또는 다수의 프로그램이 동시에 돌아갈 수 있도록 구성된 시스템이다.


그림입니다.<br/>원본 그림의 이름: mem00002d1c0005.png<br/>원본 그림의 크기: 가로 595pixel, 세로 431pixel

큿!


 예를 들면 우리가 일상적으로 쓰는 윈도우즈 운영체제를 생각해보자 당신은 구글 크롬을 켜서 모 갤질을 하고 있을지도 모른다. 동시에 컴퓨터 백 그라운드에서는 蒼い鳥 노래가 흘러나오고 있을 수도 있으며, 아니면 화면 한쪽에는 동영상 재생기로 아이돌 마스터 5화가 틀어져 있을지도 모른다. 요는 하나의 컴퓨터에서 여러 작업이 동시에 수행이 가능하다는 것이다.


그림입니다.<br/>원본 그림의 이름: mem00002d1c0004.png<br/>원본 그림의 크기: 가로 1920pixel, 세로 1080pixel

속지마 개년이야!


 이러한 다중 작업을 제공하기 위한 시스템이 시분할 시스템이며 원리는 이름 그대로 시간을 쪼개는 것이다. A, B, C라는 프로그램 3개가 있다고 하자. 이 3개의 프로그램은 서로 작동하는데 어떤 연관도 없다고 가정한다. 우리가 다중 작업에 익숙해 져서 그렇지 컴퓨터는 기본적으로 하나의 프로그램만 실행이 가능하다. 때문에 A, B, C 3개의 결과를 전부 보고 싶다면 A가 종료된 후 B를 수행하고 종료된 이후에 C를 수행하고 종료되어야 3개의 결과를 전부 볼 수 있다. 하지만 A를 실행하고 1초후 일시정지를 걸고 B를 실행하고 1초 후 일시정지, C를 실행하고 1초 후 일시정지, 다시 A를 실행하고 1초 후 일시정지... 라는 식으로 반복을 하다보면 어떨까? 1초라는 감각만으로는 별다른 느낌이 없을 것이다. 그러나 0.1초 0.001초 0.0001초 와 같은 식으로 일시정지 후 다음 프로그램을 돌리는 주기를 빠르게 한다면 3개의 프로그램이 동시에 움직이는 것처럼 보이지 않겠는가?

 좀 더 간단한 비유를 말하자면 드래곤볼의 잔상권이나 분신술 같은 것을 생각해보면 된다. 미친 듯이 빠르게 움직여서 잔상이 남아서 여러 명이 보이는 듯한 느낌을 상상하면 쉬울 것이다. 물론 그 분신들이 전부 다른 동작을 하고 있음은 물론이다.

그림입니다.<br/>원본 그림의 이름: mem00002d1c0006.jpg<br/>원본 그림의 크기: 가로 1300pixel, 세로 1065pixel

"더 돌릴 필요 필요 없으니 그만 결과 보여 주십시오."

라고 했더니, 화를 버럭 내며,

"실행할 만큼 실행해야 프로그램이 돌아가지, 램타 조인다고 프로그램이 돌아가나"


 CPU 실행시간(CPU excution time): 특정 작업의 수행을 위하여 프로세서가 순수하게 소비한 실제 시간. 입출력에 걸린 시간이나 다른 프로그램을 실행하는 데 걸린 시간은 여기에 포함되지 않는다. CPU 실행시간은 다시 사용자 CPU시간과 시스템 CPU시간으로 나눌 수 있다.

사용자 CPU시간: 실제로 사용자 프로그램 실행에 소요된 시간

시스템 CPU시간: 프로그램을 위한 작업을 수행하기 위하여 소비한 시간


 하지만 운영체제의 각 작업이 어떤 프로그램을 우해서 수행되고 있는가를 명확히 가려내는 것이 어렵고 운영체제 간의 기능 차이도 있기 때문에, 시스템 CPU시간과 사용자 CPU 시간을 정확히 구하는 것은 쉽지 않다.



CPU성능과 성능 인자

그림입니다.<br/>원본 그림의 이름: mem00002d1c0007.png<br/>원본 그림의 크기: 가로 800pixel, 세로 500pixel

하고 싶지않아~~...이제부터 골 아파질 예정이다.


 간단한, 그리고 기본적인 성능 측도로는 클럭 사이클 수와 클럭 사이클 시간으로 CPU 시간을 표시하면 다음과 같다.



클럭 속도와 클럭 사이클 시간은 역수관계이므로



 이 공식을 보면 클럭 사이클의 시간을 줄이거나 프로그램 실행에 필요한 클럭 사이클 수를 줄이면 성능을 개선 할 수 있음을 알 수 있다. 하지만 실제로는 둘 중 하나를 감소시키면 다른 한쪽이 증가하는 경우가 많으며 이 외에도 파이프라인이나 캐시등 여러 요인에 의해서 실제 프로그램의 CPU실행시간과 공식에서 유추할 수 있는 CPU실행 시간과는 달라지는 경우가 많다.



명령어 성능

 컴파일러가 하이레벨 언어에서 로우레벨 언어로 번역하면서 프로그램이 돌아가는데 필요한 명령어를 생성하고 컴퓨터는 이 명령어를 실행한다. 실행 시간은 실제로 프로그램의 명령어 수와 관련이 있다. 때문에 위의 공식에서 프로그램의 CPU 클럭 사이클수는 다음과 같이 표현할 수 있다.



명령어당 클럭 사이클 수(clock cycles per instruction): CPI로 줄여서 쓰기도 한다. 프로그램 전체 혹은 일부에서 명령어 하나의 실행에 필요한 평균 클럭 사이클 수를 의미한다. 명령어마다 제각각 수행 시간이 다르다. 일반적인 사칙 연산은 메모리 연산이나 부동소수점 연산보다 빠르다. 때문에 CPI를 얻어야 할 때 우리는 다음과 같은 정보를 얻어야 할 필요가 있다.

  •  프로그램에 어떤 종류의 명령어가 얼마나 많이 있는가
  • 각각의 명령어 종류가 이 프로세서에서 수행 될 때 평균적으로 얼마나 걸리는가



고전적인 CPU 성능식


클럭 속도는 클럭 사이클 시간의 역수이므로



 

 이제 성능에 관한 내용을 요점정리하면 다음과 같다.

성능 요소

측정 값

CPU 실행시간

초/프로그램

명령어 개수(IC)

프로그램이 실행한 명령어 수

명령어당 클럭 사이클 수(CPI)

명령어의 평균 클럭 사이클 수

클럭 사이클 시간

초/클럭 사이클

 

 위와 같은 요소들로부터 프로그램의 실행 시간은 아래와 같은 식을 이용해 구할 수 있다.



 컴퓨터의 성능에 대한 척도는 지금 우리가 배우는 내용으로는 실행시간이 믿을 수 있는 척도이다. 예를 들어 명령어 개수를 줄이기 위하여 명령어 집합을 바꾸었을 때 클럭속도가 느려지거나 CPI가 커져서 오히려 성능이 더 나빠질 수도 있다. CPI는 실행되는 명령어 종류에 따라 달라지므로 실행 명령어 수가 적은 코드가 항상 가장 빠른 것은 아니다.


 그렇다면 위와 같은 성능식의 인자 값들은 어떻게 구해야 하는가? CPU 실행시간은 실제 프로그램을 켜서 측정해 볼 수 있고, 클럭 사이클 시간은 컴퓨터의 매뉴얼이나 cpu-z와 같은 하드웨어 사양 체크 프로그램으로 알아낼 수 있다. 명령어 개수와 CPI는 구하기 위한 방법이 조금 까다로운데, 명령어 개수는 실행 과정을 추적하는 소프트웨어 도구(디버거 등)나 컴퓨터 구조의 시뮬레이터를 이용해서 측정해 볼 수 있다. 이 외에 하드웨어 카운터를 이용하면 실행 명령어 수나, 평균 CPI들을 찾을 수 있다.

그림입니다.<br/>원본 그림의 이름: mem00002d1c0008.tmp<br/>원본 그림의 크기: 가로 476pixel, 세로 340pixel


-공부를 위한 목적으로 작성하는 글이기 때문에 글 내용에 오류가 있을 수도 있습니다. 읽어보시고 올바르지 못한 내용에 대해서는 지적 부탁드립니다.


컴퓨터 구조 및 설계(정리): 1장 - 컴퓨터 추상화 및 관련 기술(2) 컴퓨터 구조

프로그램 밑의 세계


 응용 프로그램이 필요로 하는 여러 가지 기능을 구현하는 복잡한 소프트웨어 라이브러리를 사용하게 된다. 하지만, 컴퓨터 하드웨어는 아주 단순한 저수준의 명령어를 실행 할 뿐이기에, 높은 수준의 내용을 단순한 컴퓨터 명령어로 번역 또는 해독하는 여러 겹의 소프트 웨어가 필요하다. 이러한 소프트웨어들은 계층적으로 구성된다.
하드웨어와 소프트웨어를 계층으로 구분한 그림. 원 3개가 겹쳐져 있는것 뿐인데 뭔가 짜증이 난다.

 시스템소프트웨어: 하드웨어와 응용 소프트웨어 사이에 존재하며, 공통적으로 필요한 서비스를 제공하는 소프트웨어들이다. 운영체제, 컴파일러, 어셈블러가 이에 속한다.

운영체제(Operating System): 사용자가 실행하는 응용소프트웨어와 하드웨어를 중재하면서 각종 서비스와 감독 기능을 수행한다. 최근에는 가상화 기술에 힘 입어 실제 하드웨어 위에서 돌아가는것이 아닌 하드웨어를 예뮬레이팅한 하이퍼바이저 안에서 돌아가는 경우도 많다. 운영체제는 다음과 같은 것들이 가장 중요한 기능에 속한다.
  • 기본적인 입출력 작업의 처리
  • 보조기억장치 및 메모리 할당
  • 컴퓨터를 동시에 사용하는 여러 응용들 간의 컴퓨터 공유 방법 제공
 오늘날 일반적으로 사용되고 있는 운영체제의 예로는 윈도우즈(Windows), 리눅스(Linux), 맥OS(MacOS)등이 있다.

컴파일러(Compiler)와 프로그래밍 언어: C, C++, Pascal, Delphi 등과 같은 하이레벨 언어로 작성된 프로그램을 하드웨어가 실행 할 수 있는 로우레벨 언어로 번역하는 중요한 일을 수행한다.
궳뛣뾁뙑!!! 소리가 절로 나온다. 
컴퓨터계의 위대한 괴수 폰 노이만 께서는 '기계어 외의 다른 언어는 사도다!' 라면서 기계어를 찬양하셧다는데....

 초창기 프로그램의 개발은 기계어에서 시작하였다. 기계어는 0과 1로 구성된 2진수로만 구성이 되어있다. 기계어의 명령은 CPU에서 바로 처리가 가능하기 때문에, 사람이 기계어를 얼마나 잘 짜냐에 따라 성능이 쉽게 결정되어졌다. 
당신이 능력만 된다면 다른 키보드 버튼들은 쓸모가 없겠다만...그렇다면 이 글을 읽을 이유는 없겠지????

 그러나 기계의 관점에서만 고려된 언어이기에 인간이 사용하기에도, 이해하기도 가독성도 너무 불편한 언어이다. 때문에 일단은 인간이 인지하기 그나마 쉽게 읽을 수 있는 방법을 고안하게 되고, 최초의 어셈블리어와 어셈블러가 등장하게 된다. 
뭔가 읽을 수 있는 꼬부랑 글씨는 튀어 나왔지만 여전히 당최 뭔지.....

 어셈블리어는 기계어와 1:1로 대응된다. 어떤 이야기인가 하면 기계어의 특정 배열의 조합이 어셈블리어와 특정 명령어와 바로 대응된다는 이야기이다.  여전히 기계어를 컴퓨터가 어떻게 해석하는지의 이해는 필요하지만 그래도 '읽을 수 있는 뭔가'가 튀어 나왔기 때문에, 프로그래머들의 게슈탈트는 무사할 수 있는 계기가 마련된다.
이것이 개발자의 운명이겠지요.

 하지만 가독성이 해결 되었을 뿐이지 근본적인 문제는 여전히 해결되지 않았다. 여전히 이해하기가 어려운것이다. 어떠한 단순한 행위를 컴퓨터에게 수행 시키게 하려 한다 해도 인간의 관점에서는 너무나 간단한 절차지만 컴퓨터에게는 그 간단한 절차조차 더 이상 나눌 수 없는 최소의 행위들로 전부 쪼갠 후 그것을 컴퓨터의 동작에 맞추어 어셈블리어로 작성해야 한다.
 또한 기계어는 CPU를 제조하는 제조 회사나 혹은 제작자마다 다르게 구성되어있다. 이것은 기계어와 1:1로 대응하는 어셈블리어또한 CPU마다 천차 만별로 달라진다는 이야기다. 결국 어셈블리어에서 해결 된 것은 읽을수 있게 되었다는 것 외에는 근본적인 부분은 아직 미해결 상태이다. 

최초의 하이레벨 언어인 포트란의 소스. 
어셈블리어하고 비교하면 훠~~~얼씬 읽기 편하다. 그래도 난 뭔소리인지 모르겠지만.... 포트란의 역사는 길고 지금은 프로그래밍 언어의 왕위는 C언어 계열에게 내주었지만 여전히 물리연산을 위시한 과학분야에서는 죽창을 들고 대기하고 계시는 중이다.

 프로그래밍 언어는 이후 인간이 이해하기 쉽게 그러면서도 작성한 코드의 재사용성이 쉽게 되어가는 방향으로 진화해 가게 되었다. 인간이 사용하는 문법에 최대한 근접하게 변화해 가고 프로그램을 작성하기 위한 학습에 투자하는 시간을 상당히 줄여 낼 수 있게 되었다. 그러나 인간이 이해 할 수 있게 된 만큼 그 반대 급부로 컴퓨터는 이렇게 진화한 언어들을 이해 할 수 없게 되었고, 인간이 이해 할 수 있는 형태로 만들어진 프로그래밍 언어를 컴퓨터가 이해 할 수 있는 기계어로 번역하기 위한 프로그램인 컴파일러가 등장하게 되었다. 컴파일러의 등장은 프로그래머에게는 단비와 같은 존재일 것이다. 하이레벨 언어를 로우레벨 언어로 번역 해 주는 것은 물론이고 문법 검사와 최적화 까지 같이 수행해 준다. 잘 만들어진 컴파일러는 당신이 직접 어셈블리어로 최적화 하는것 보다, 더 훌륭한 결과물을 내놓기도 한다. 그렇다고 너무 발로 프로그램을 짜면 안돼고......

이 아이들이 당신의 세이브 데이터를 날려버리고 메타 발언을 날려도 여전히 이 아이들은 응용소프트웨어다. 
아직 인류는 응용소프트웨어를 모니터에서 튀어나오게 하는 경지까지는 이르지 못했으니
너무 걱정말아라

 응용소프트웨어: 운영체제에서 사용자가 직접 사용하는 소프트웨어를 뜻한다. 때문에 응용소프트웨어는 우리가 일상적으로 사용하는 모든 어플리케이션(Application 줄여서 App)이 이에 해당한다. 오피스, 웹브라우저, 게임 등과 같은 분야는 전부 응용소프트웨어에 속하게 된다.

참고
 임베디드 시스템의 경우는 특정 목적만을 수행하기 위해서 제작된 시스템이기 때문에, 응용 소프트웨어와 시스템 소프트웨어의 구분이 애매모호하거나 구별이 어려울 가능성이 크다. 대게 단일 프로그램만 실행하기때문에, 다양한 응용프로그램의 공통분모를 지원하는 시스템소프트웨어와의 구분할 명분이 적어진다.


프로세서

이것이 당신과 우리가 앞으로의 밥벌이로서 끌어안고 살아가야 할 대상이다.

프로세서는 프로그램의 지시대로 일을 하는 부분으로 컴퓨터 내에서 가장 역동적인 부분이다. 숫자를 더하고, 검사하고, 입출력장치에 신호를 보내 작동을 지시하는 것 등이 프로세서가 하는 일이다. 프로세서를 CPU(Central Processor Unit)라는 용어로 부르기도 한다.
프로세서는 논리적으로 데이터패스와 제어 유닛 두 부분으로 구성되며 각각은 프로세서의 근육과 두뇌에 해당한다.
이런거....히이이익!!

데이터패스(datapath): 산술연산을 수행하는 프로세서 구성요소
제어유닛(control unit): 프로그램의 명령어에 따라 데이터패스, 입출력장치에 지시를 한다.

 프로세서 내부에는 또 다른 종류의 메모리가 있는데 이것을 캐쉬 메모리라 한다. 캐쉬 메모리는 DRAM의 버퍼 역할을 한다. 캐쉬는 SRAM이라는 DRAM보다 빠르지만 그렇지만 비싼 종류로 만들어진다.

캐쉬 메모리(Cache Memory): 저장 공간은 크나 동작속도는 느린 메모리의 버퍼로서 동작하는 작고 빠른 속도를 가진 메모리. 컴퓨터에 꽃혀져 있는 램의 경우. 용량은 크지만 CPU에 비해서는 속도가 많이 느리다. CPU가 명령어와 데이터를 처리하고 다음 명령어와 데이터를 수행하기 위해 램에서 데이터를 가져와야 하는데 이 가져오는 시간에서 많은 지연이 발생한다. 그렇다고 램의 속도를 빠르게 구성하면 단가가 올라가고 구조가 많이 복잡해지기 때문에, 램과 CPU사이에 작지만 속도가 빠른 메모리를 하나 더 마련하고 그 안에 데이터와 명령어를 담아 둠으로서 CPU와 메모리의 속도 차이를 완충하는 역할을 수행한다.

추상화(abstraction): 하위 계층의 세부사항을 감추어서 상위 계층일수록 단순한 모델로 만드는 것

명령어 집합 구조(instruction set architecture): 줄여서 구조(architecture)라 한다. 하드웨어와 최하위 계층의 소프트웨어 사이의 인터페이스, 명령어, 레지스터, 메모리 접근, 입출력등을 포함해서 정확히 작동하는 기계어 프로그램을 작성하기 위해서 알아야 하는 모든 정보들을 의미한다.

ABI(application binary interface): 명령어 집합 중 사용자 부분과 응용프로그램이 사용하는 운영체제 인터페이스를 합친 것. 컴퓨터 간 이진 이식성의 표준을 정의한다.

복사도 일이다.

 명령어 집합 구조는 컴퓨터 설계자로 하여금 실행 하드웨어와 독립적으로 컴퓨터의 기능을 생각할 수 있게 해준다. 예를 들어, 당신이 복사기(하드웨어)를 이용한다고 하자. 복사기는 어떤 종이에 출력 되어 있는 내용을, 다른 종이에 복사하는 역할(기능)을 한다. 당신은 손쉽게 복사기를 통해 필요한 내용을 복사 할 수 있지만 당신이 복사기에 어떤 부품이 들어가는지, 혹은 어떠한 방식으로 동작하는지 알 필요는 없다. 그냥 복사기에 필요한 복사할 대상과 복사될 종이를 집어넣고 복사버튼(명령어 집합 구조)한번만 누르면 끝나는 일이다.
 이와 같은 선상에서 컴퓨터 설계자는 구조와 구조의 구현(implementation)을 분리해서 생각한다.
당신이 스마트폰에서 달리고 돼지놈들에게 화가 난 새를 날리기 위해서 스마트폰의 부품 하나하나까지 알 필요는 없다.

 좀 더 쉽게 말하자면 당신이 스마트폰을 쓰기 위해서, 스마트폰의 동작과정을 이해 할 필요가 없다. 그냥 매뉴얼을 보고 숙지하거나, 닥돌하고 감에 의지하여 기능을 추론하는 것이 가능하다는 이야기이다.
 이를 요점정리 하면 다음과 같다.

하드웨어와 소프트웨어는 모두 계층적 구조를 가지고 있으며, 각 하위 계층의 세세한 부분이 상위 계층에서는 보이지 않도록 한다. 이러한 추상화 원리는 하드웨어 설계자난 소프트웨어 설계자가 컴퓨터 시스템의 복잡성에 대처하는 좋은 무기가 된다. 여러 계층의 추상화 중에서 가장 중요한 것은 하드웨어와 최하위 소프트웨워 같의 인터페이스인 명령어 집합 구조이다. 이렇게 인터페이스를 추상화함으로써 같은 소프트웨어를 실행하지만 가격과 성능이 다른 여러 가지 컴퓨터를 구현할 수 있다.
 

데이터저장소
 컴퓨터는 일반적으로 컴퓨터 안에 기억된 내용은 전원이 끊어지면 전부 지워져 초기화 된다. 컴퓨터 내부의 메모리는 전원이 사라지면 전부 지워지는 휘발성(volatile)이기 때문이다. 반면에 블루레이와 같은 저장장비는 비 휘발성 메모리(nonvolatile memory)로서 저장내용이 지워지지는 않는다.
메인메모리인 삼성 DDR4 SDRAM

 실행되는 동안 데이터와 프로그램을 기억하는 휘발성 메모리와 다음 번 실행 때까지 데이터와 프로그램을 저장하는 비휘발성 메모리를 구분하기 위하여, 전자를 메인 메모리(main memory or primary memory)라고 하고 후자를 보조기억장치(auxiliary memory or secondary memory)라고 한다. 1975년 이래 DRAM이 메인 메모리의 주종을 이루고 있으며, 자기 디스크는 1965년 이후 가장 널리 쓰이는 보조기억장치이다. 오늘날 모든 워크스테이션과 서버 컴퓨터에서 사용되는 1차적 비휘발성 저장장치는 자기 하드 디스크이다.
체감성능 향상의 무안단물 SSD

 핸드폰과 같은 이동 기기에서는 자기 디스크 대신 비휘발성 반도체 메모리인 플래시 메모리가 사용되는데 , 플래시 메모리는 MP3플레이어나 랩탑 컴퓨터에 이르기까지 디스크를 점차 대체하고 있다. 컴퓨터에 쓰여서 디스크를 대체하고 있는 플래시 메모리는 SSD(Solid State Drive)라고 불린다.
그래도 아직까지 가격대비 용량으로는 하드디스크가 갑이다.

 하드 디스크는 한 가운데의 회전 축에 여러장의 금속 원반이 고정되어 있으며 분당 5,400~15,000의 속도로 회전한다. 금속 원반의 양면은 카세트나 비디오 테이프에서 사용하는 것과 같은 자성 기록 물질로 덮여 있다. 하드 디스크에서 정보를 읽고 쓰기 위해 읽기/쓰기 헤드(read/write head)라는 작은 전자기 코일이 달린 이동 암(movable arm)이 디스크 표면 바로 위에 위치한다. 드라이브 내부의 환경을 제어하기 위해 드라이브 내부는 영구적으로 밀봉되어 있으며 이렇게 하면 디스크 헤드를 표면에 더 가깝게 접근 시킬 수 있다. 최근에는 이 밀봉시 하드디스크 내부에 헬륨으로 채워서 밀봉을 하기도 한다.
 데이터를 읽을때 이동 암이 디스크위를 지나가면서 특정위치에 기록되어 있는 데이터를 읽는다. 이러한 기계적 장치가 사용되기 때문에 자기 디스크의 접근시간(access time)은 RAM보다 훨씬 느리다. DRAM의 경우 50~70ns 정도 걸리는데 반해 디스크는 일반적으로 5~20ms정도 걸린다. 다만 그럼에도 아직까지는 RAM이나 플래시메모리보다 가격이 더 저렴하기 때문에 대용량으로 자료를 저장해야 하는 곳에서는 여전히 많이 쓰인다.
 위의 내용을 정리하여 볼때 자기 디스크는 메인 메모리와 세 가지 큰 차이점이 있다.
  • 디스크는 자성 매체이므로 비휘발성이다.(자기장의 변화가 있지 않는 이상은 그 상태가 유지된다.)
  • 기계적 장치이므로 접근시간이 길다.
  • 같은 용량당 가격이 훨씬 저렴하다.

다른 이야기지만 과거 미디어의 전쟁의 한 가운데는 AV를 얼마나 확보하냐에 따라 그 승부가 갈리게 되었다. 
VHS와 베타맥스가 그랬고 HD-DVD와 블루레이가 그러했다. 
인간의 성욕에 의해 승부가 갈리는 시장이라니...

 광디스크 기술은 자기 디스크 기술과는 완전히 다르다. 광디스크는 데이터가 동심원이 아니고 나선형으로 기록되며, 디스크 표면을 테워서 작은 흠집을 만들어 비트를 기록한다. 흠집으로 만들어진 비트들을 읽을때는 표면에 레이저를 쏘아서 흠집의 유무를 조사한다.


-공부를 위한 목적으로 작성하는 글이기 때문에 글 내용에 오류가 있을 수도 있습니다. 읽어보시고 올바르지 못한 내용에 대해서는 지적 부탁드립니다.

컴퓨터 구조 및 설계(정리): 1장 - 컴퓨터 추상화 및 관련 기술(1) 컴퓨터 구조

컴퓨터 응용 분야의 종류와 그 특성



일반적인 데스크탑 컴퓨터의 형태

 데스크탑 컴퓨터: 가장 잘 알려진 컴퓨터 종류. 흔히 퍼스널 컴퓨터로 불림(Personal Computer: PC). 데스크탑 컴퓨터는 낮은 가격으로 단일 사용자에게 최선의 성능을 제공하는 것이 중요 포인트.



일반적인 서버의 이미지. 서버는 이 외에도 다양한 형태가 있다.

 서버: 이전 메인프레임, 미니컴퓨터, 슈퍼컴퓨터라고 불리던 것의 현대적인 형태. 일반적으로 네트워크를 통해서 접근한다. 서버에서 수행하는 작업들은 대게 대형 작업들로, 대형 작업으로는 과학이나 공학분야의 복잡한 응용프로그램 수행일 수도 있고, 대규모 웹 서버에서처럼 작은 작업 여러 개로 구성될 수도 있다. 서버는 고장이 날 경우 데스크탑 컴퓨터와는 비교 할 수 없는 큰 손해가 발생되므로, 일반적으로 서버는 신용도(dependability)를 매우 강조한다.



최초의 슈퍼컴퓨터 CDC6600. 뭔가 귀엽게 생겼다.

 슈퍼컴퓨터: 시뮬레이팅을 위한 과학연산 및 여러 분야에 사용되는 High-Perfomance Computer. 최초의 슈퍼 컴퓨터는 1964년 미국 CDC의 시모어 로저 크레이가 설계한 CDC6600이며, 이후 시모어 로저 크레이가 CDC에서 독립, 크레이사(Cray Research, Inc.)를 세워 고성능의 슈퍼 컴퓨터들을 제작하기에 이른다. 슈퍼컴퓨터에서 활용되던 벡터 처리 기술은 현재 개인용 컴퓨터와 노트북에 사용되는 CPU에 적용되고 있다. 


 후지쯔사가 제작하고 일본 이화학연구소가 운영중인 클러스터링 슈퍼컴퓨터 K. 영화에서나 볼 법한 디자인이다.
(10^16승을 나타내는 불교의 숫자 단위 경(京)의 일본어 발음 Kei에서 유래된 이름이다.) 

 다만 벡터처리 기술은 현재의 단독적으로 슈퍼 컴퓨터에서는 잘 이용되고 있지 않고 있으며, CPU를 활용하는 개인용 컴퓨터와 소형 워크스테이션들을 집합적으로 연결하여 사용하는 클러스터링 방식의 슈퍼컴퓨터가 주류를 차지하고 있다. 슈퍼컴퓨터는 일반적인 시뮬레이션 분야를 넘어서, 빅데이터 분석, 영화/영상 제작은 물론이며 아마존의 FC2, 마이크로소프트의 Azure등과 같은 클라우팅 컴퓨터 서비스에서도 적극적으로 이용되고 있다.


8051 MCU
개발된지는 오래 돼었으며 저성능이나 현재에도 저렴한 가격에 구현할 기능이 고성능을 요구 하지 않을땐 많이 이용한다. 
임베디드계의 AK47. 하지만 우리는 이놈 하나에게도 휘둘리며 사는 인생일지니...

 임베디드 컴퓨터: 기계나 여타 제어가 필요한 시스템에 대하여, 제어 자체를 수행하는 컴퓨터 시스템으로서, 자동차에 들어 있는 마이크로프로세서와 핸드폰, 비디오 게임기, 디지털 텔레비전 등에서 사용되는 컴퓨터, 현대식 비행기나 화물선을 제어하는 프로세서 네트워크 등이 여기에 포함된다. 임베디드 컴퓨팅 시스템은 한 가지 응용을 수행하거나 서로 연관된 일련의 프로그램을 실행하도록 설계되어 있다. 일반적인 임베디드 컴퓨터는 다른 하드웨어와 한 덩어리로 묶인 단일 시스템으로 공급되며 때문에 임베디드(embedded)란 단어가 사용된다. 임베디드 시스템이 도처에 깔려 있어도 특정 하드웨어 안에 내장되어 있는 특성 상 대부분의 사용자는 자기가 컴퓨터를 사용하고 있다는 사실조차 인식하지 못한다.

참고
임베디드 프로세서 설계에는 프로세서 코어가 많이 이용된다. 프로세서 코어란 Verilog나 VHDL과 같은 하드웨어 기술 언어(Hardware Description Language)형태로 제작된 프로세서 버전이다. 코어를 사용하면 특수한 응용에 특화된(application-specific) 하드웨어를 CPU에 추가하여 한 칩으로 만드는 일이 쉬워진다.


 벡터 프로세서: 반적으로 사용하는 프로세서는 하나의 명령에 하나의 데이터를 처리하는 것이 일반적이다. 그러나 벡터 프로세서는나의 명령어로 다수의 데이터를 처리하는 명령어 체계와 구조를 가진 CPU를 말한다. 컴퓨터에서의 벡터는 1차원 배열의 데이터의 나열을 의미하는데, 빠른 데이터의 처리를 위해 하나의 명령어가 입력되면 벡터에 나열된 데이터들이 동시에 처리가 이루어진다. 다만 이렇게 되면 프로세서의 구현이 매우 복잡해지고 단가도 올라가기 때문에 일반적인 컴퓨터에서는 잘 쓰이질 않았으나 90년대 말 AMD의 3D Now!와 인텔의 SSE와 같은 SIMD(Single instruction stream, multiple data streams)명령어셋 추가로 일반적인 프로세서에도 동시에 데이터를 처리 할 수 있게 되었다.


 플린의 분류: 스탠퍼트 대학의 교수인 마이클 J. 플린이 세운 컴퓨터 구조의 분류이다. 컴퓨터를 명령어와 데이터의 처리방법에 따라서 크게 4가지로 분류하게 된다.
SISD(Single instruction stream, single data stream): 한 번의 명령어로 하나의 데이터를 처리하는 방법이다. 폰 노이만 구조에서 볼 수 있는 방법으로서 일반적인 컴퓨터가 이러한 구조를 따른다. 요는 한 번에 한 놈 이라는 이야기. 
영화 올드보이의 초 유명한 장도리씬. 이걸 보면 SISD를 이해(?)할 수 있지 않을까?
 가령 당신이 길을 걷다가 학생의 삥을 뜯고 있는 불량배 무리들을 만났다고 가정하자. 여기서 당신은 프로세서고 불량배는 데이터들이다. 정의감이 넘치는 당신은 불량배들을 '처리'하고자 마음먹었다. 그러나 날고 기는 무술의 고수가 아닌지라 당신의 주먹(명령어)은 한 놈밖에 처리할 수가 없다. 이대로 가다간 불량배들의 다구리에 뻗어버릴것은 자명한 이야기. 때문에 당신은 골목길로 불량배를 유인한다. 골목길은 매우 좁기 때문에 두 명이 동시에 들어 갈 수 없으며, 한 사람만 들어오게 된다. 일렬로 늘어져서 들어오는 불량배들을 이제 당신은 한 명씩 순차적으로 처리 할 수 있게 된 것이다.

SIMD(Single instruction stream, multiple data stream): 한 번의 명령어로 여러개의 데이터를 처리하는 방법이다. 위에서 설명한 벡터프로세서에서 사용되는 방식으로, 과거에는 슈퍼 컴퓨터가 동시대의 컴퓨터와 비교하여 고 성능을 발휘 할 수 있게 한 원동력이었으나 자료처리에 범용성을 유지하면서 데이터를 동시에 처리하기에는 복잡한 구조와 단가 상승때문에 점차 쓰이지 않게 되었다가 90년대 후반 일반적인 CPU에서 AMD의 3D Now!와 인텔의 SSE명령어셋 추가로 SIMD기술이 쓰이기 시작하였다.
워크스테이션용 그래픽 카드 쿼드로의 3-Way SLI구성. 나도 써본 적 없다.
  CPU분야에서는 SIMD구조의 형태가 흥망성쇠를 거치며 그 기복이 컸던 것에 비해 SIMD구조가 꾸준히 발전되던 분야가 있는데 GPU분야가 CPU와는 별도로 SIMD구조를 꾸준히 발전시켜가며 성능을 높여 가고 있었다. GPU의 경우 그래픽 연산에 필요한 명령어가 매우 한정되어 있기 때문에 범용성을 크게 고려할 필요가 없는데다가 데이터의 병렬화가 쉬운것이 그래픽 연산이기때문에 수백개의, 그러나 간단한 구조의 프로세서를 계속적으로 늘리는 것 만으로도 성능향상을 꾀하기가 쉬었다.  때문에 그래픽카드의 강력한 그래픽 연산성능을 눈여겨 보던 일부 프로그래머들은 이러한 성능을 다른 연산처리에 돌릴 수 없을까 많은 고민을 하게 되었는데, 일반적인 산술연산들을 그래픽을 표현하는데 사용하는 셰이더 프로그래밍에 맞게 '변형'해 가면서 프로그래밍을 수행하는 고행과 같은 일을 수행해 가다가 최근 GPGPU가 등장하면서 '그나마' 손쉽게 GPU를 연산에 사용할 수 있는 방법이 등장하게 되었다.
괄약근과 관절께 묵념(...)

 SIMD를 그나마 알아듣기 쉽게 말하자면 일타쌍피를 생각하면 된다. 위의 GIF와 같이 한번의 슛(명령어)로 두명의 불쌍한 중생들(데이터)가 처리되는 상황을 생각하면 되는것이다.

MISD(Multiple instruction stream, single data stream): 여러 개의 명령어를 동시에 처리하여 하나의 데이터를 처리하는 것을 의미한다. 현대적인CPU에서 쉽게 볼 수 있는 파이프라인 개념이 이러한 MISD구조인데, 다만 MISD구조 자체를 단독적으로 사용하는 경우는 거의 없다. 파이프라인도 사실상 MISD를 위시하기 위한것이라기 보다는 명령어의 처리를 CPU의 유닛이 쉬지 않고 효율적으로 처리하기 위하여 나온 것이다.
잔인한 놈들(...) 악역이 다 불쌍해보이네

 즉 이전에는 다구리를 하던 놈들이 데이터들이었다면 이제는 반대로 명령어가 데이터 하나를 향하여 다구리를 수행하는 상황이라 보면 될 것이다.

MIMD(Multiple instruction stream, Multiple data stream): 여러 개의 명령어가 동시에 여러 개의 데이터를 처리하는 것을 말한다. 이전이  1:1 혹은 1:N의 상황이었다면 이번에는 N:N의 상황으로 보면 될 것이다. 이것의 가장 대표적인 예가 슈퍼컴퓨터를 들 수 있다. 여러개의 프로세서를 특정 노드들로 묶어서 개별적으로 명령어와 데이터를 처리하고 취합하거나 특정한 단일 데이터들을 쪼개어 프로세서 별로 다른 명령어를 동시에 처리함으로서 데이터를 처리한다.
데이터 VS 명령어
 수 많은 데이터와 명령어를 동시에 처리 할 수 있기때문에 기대 할 수 있는 성능 처리는 매우 높으나 소프트웨어나 하드웨어의 구조적가 복잡해지는 문제가 산재하게 된다. 다만 MIMD구현으로서 손쉽게 볼 수 있는 클러스터링 구성의 경우 그나마 간단하게 하드웨어 구성이 가능하고, OpenSource로  구할 수 있는 다양한 소프트웨어가 있기때문에 돈만 해결된다면 구성을 위한 진입장벽은 낮은 편이다. CPU 내부에서는 슈퍼스칼라가 MIMD구조를 따르고 있다. 또한 현대 프로세서에서 자주 볼 수 있는 멀티코어 프로세서도 MIMD구조의 일종으로 볼 수 있다.
 이처럼 플린의 분류는 컴퓨터 구조를 4개로 분류해서 설명하고 있으나 여기까지 읽어보다 보면 알 수 있듯이 과거와 달리 현대의 CPU는 집요한 성능 향상과 효율성을 꾀하기 위하여, 명령어 처리와 데이터의 처리에 다양한 방법을 혼합하여 사용하기 때문에 플린의 분류는 지금에 와서는 적합하지 않다는 의견도 있다.



-공부를 위한 목적으로 작성하는 글이기 때문에 글 내용에 오류가 있을 수도 있습니다. 읽어보시고 올바르지 못한 내용에 대해서는 지적 부탁드립니다.

1 2 3 4