문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 SMT (문단 편집) ==== 2000년대 이전의 SMT ==== 현대 [[CPU]]는 [[슈퍼스칼라]] 구조와 [[파이프라인|파이프라이닝]] 기법이 담겨진 [[마이크로아키텍처]]를 기반으로, CPU 전체가 한 번에 하나의 명령을 처리하는 것이 아니라 명령어 몇 개를 동시에 처리함과 동시에 명령 하나를 또다시 여러 단계의 작은 명령으로 나누고 각 부분을 차례대로 처리한다. 즉 몇 개의 명령어가 몇분의 1로 나누어지고, 그런 명령어 몇 개가 한번에 돌아가는 것이다. 이런 식으로 작동하는 이유는 많은 기계어 명령이 코드로는 하나로 되어 있어도 실제 처리해야 하는 일은 여러 단계로 나누어져 있고 각 단계는 이전 단계가 처리되기 전에는 수행이 불가능하기 때문이다. 예를 들어 메모리의 값을 증가시키는 명령이 >1 메모리의 값을 읽는다. >2 읽은 값을 더한다. >3 값을 메모리에 쓴다. 와 같이 작동한다면 [[한 번에 한 놈 법칙|1번이 끝나기 전에는 2번을 할 수 없고 2번이 끝나기 전에는 3번을 할 수 없다]]. 하지만 파이프라인과 슈퍼스칼라를 동원한다고 해서 능사가 아니다. 명령어 자체에서도 한계가 있는데, 단일 코어에서 구현할 수 있는 명령어 수준의 병렬처리 능력(Instruction-Level Parallelism)은 명령어 종속성(Dependency)을 피할 수 없다. RAW(Read-After-Write), WAR(Write-After-Read), WAW(Write-After-Write) 등의 다양한 종속성이 있으며, 구조적으로 어느 정도 극복할 수 있다고 해도 근본적인 종속성은 해결되지 않는다. 이렇다보니 멀티 프로세서(여기서는 멀티 CPU)를 구축하면 [[레이스 컨디션]] 문제만 제외하고 명령어 종속성과 무관하게 동작할 수 있다. 실제로는 명령이 처리되기 위해 필요한 일이 명령마다 다르고 연계지 않을 수도 있는데, CPU의 예시는 아니지만 네트워크 비동기 처리의 예시를 들어보자. 네트워크에서 특정 값을 읽어 이를 처리하는 경우, 상당한 경우에는 네트워크의 대기 시간이 프로그램 전체 실행 시간의 대부분을 차지한다. 이 상황에서 위와 같이 >1 네트워크의 값을 읽는다. >2 읽은 값을 처리한다. >3 값을 저장장치에 쓴다. 로 코드를 작성한다면, 1번의 네트워크 대기 지연 시간에 의해 프로그램은 상당히 비효율적인 구조를 가지게 될 것이다. 네트워크에서 값을 읽어오는 데 걸리는 시간은 시스템의 자체 저장장치인 메모리나 하드디스크에서 데이터를 읽는데 걸리는 시간에 비해 몇십~몇천배는 되기 때문이다. 이때 CPU는 1번에서 값을 읽어올 때까지 대기하게 된다. 하지만 CPU가 처리해야 할 일 중에는 이렇게 서로 연계된 일만 있는 게 아니다. 예를 들어 네트워크에서 값이 들어오길 하염없이 기다리는 저 컴퓨터에서 동시에 MP3 음원 파일도 하나 재생하고 있다고 하자. 그렇다면 네트워크에서 값이 들어올 때까지 MP3 음원 파일을 재생하고 있으면 효율이 올라가지 않을까? 멀티 CPU에서 하나의 CPU를 네트워크 처리에 할당하고 다른 하나의 CPU를 MP3 음원 파일 재생에 할당하는 것이 SMT를 구현하는 가장 확실한 방법이다. 이런 식으로 멀티 CPU 시스템에서 하나의 CPU 스레드에 성능을 더 이상 향상시킬 수 없을 경우, 남는 연산 능력을 다른 CPU 스레드의 명령어를 처리하는데 사용한다면 이렇게 놀고 있는 부분에 명령어 종속성이 없는 다른 스레드의 명령어를 투입하여 CPU 전체의 효율을 높이는 즉, 전체적인 명령어 병렬 처리 능력을 향상시킬 수 있다는 개념이다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기