• 2023. 7. 4.

    by. IT전공

    컴퓨터를 활용하는 응용 분야들 중에는 현재 세계에서 가장 빠른 컴퓨터의 성능으로도 처리에 상당한 시간이 소요되는 분야들이 많이 있습니다. 예를 들면 인공지능, 로보틱스, 신호처리, 유체역학, 일기예보, 입자물리학 및 우주과학 분야 등이 있습니다. 게다가, 인터넷의 발전으로 인해 주요 웹사이트의 서버는 동시에 다수의 사용자 요청을 처리해야 하며, 이러한 요청 대부분은 대용량 데이터베이스 검색 및 멀티미디어 정보 처리를 포함하고 있습니다. 이러한 요구 사항으로 인해 더 빠른 컴퓨터의 개발이 지속적으로 요구되고 있습니다.

     

    병렬처리

     

    병렬처리의 개념 및 필요성

    병렬처리는 반도체 소자의 물리적 한계로 인한 프로세서 속도의 한계를 극복하기 위한 혁신적인 기술입니다. 이 기술은 다수의 프로세서를 활용하여 여러 개의 프로그램 또는 하나의 프로그램의 분할된 부분들을 동시에 처리하는 방식을 말합니다. 최근 고성능 컴퓨터 시스템의 설계에서는 성능 향상을 위해 널리 병렬처리 기술이 사용되고 있습니다. 그러나 병렬처리를 구현하기 위해서는 다음과 같은 조건들이 충족되어야 합니다.

     

    첫째로, 작고 저렴하며 고속인 프로세서들을 사용하여 많은 수의 프로세서로 시스템을 구성할 수 있어야 합니다. 현재의 반도체 기술 발전으로 인해 작은 크기의 칩에는 수천만 개의 트랜지스터가 집적될 수 있고, 이를 통해 저렴한 가격에도 수백 개 이상의 프로세서를 한 시스템에 통합할 수 있게 되었습니다.

     

    둘째로, 하나의 프로그램을 여러 개의 작은 부분으로 분할할 수 있어야 하며, 이러한 분할된 부분들을 병렬로 처리했을 때 전체 프로그램을 순차적으로 처리한 결과와 동일한 결과를 얻을 수 있어야 합니다.

     

    하지만 이러한 조건을 충족시키기 위해서는 몇 가지 문제들을 해결해야 합니다. 첫째로, 병렬처리를 위해 하나의 문제나 프로그램을 여러 개로 나누는 문제 분할이 필요합니다. 그러나 일부 프로그램은 반드시 순차적으로 처리되어야 하므로 병렬처리가 불가능한 경우도 있습니다. 또한, 많은 수의 프로세서가 제공되더라도 프로그램을 그 수만큼 분할하거나 균등하게 분할하는 것이 어려운 경우에는 프로세서의 이용률이 낮아져 원하는 성능 향상을 얻을 수 없습니다. 따라서 문제 분할은 매우 중요합니다. 이러한 경우에는 병렬 알고리즘의 개발을 통해 순차적으로 처리해야 하는 부분을 최소화하여 병렬처리의 효과를 극대화할 필요가 있습니다.

     

    둘째로, 프로세서들 사이의 통신이 필요합니다. 프로세서의 수가 증가하면 통신 선로의 수도 증가하고, 인터페이스를 위한 하드웨어도 복잡해집니다. 이로 인해 프로세서 간 통신을 제어하기 위한 소프트웨어 오버헤드와 하드웨어상의 지연 시간이 증가하므로 시스템의 성능 향상에 한계가 있을 수 있습니다.

     

    또한, 병렬성을 표현할 수 있는 병렬 프로그램 언어와 컴파일러의 개발도 필요합니다. 또한, 프로세서들이 하드웨어 자원을 공유할 수 있도록 상호 배타 메커니즘이 설계되어야 하고, 공유 자원에 대한 경합을 줄이고 이용률을 극대화할 수 있도록 운영체제에 특별한 기능도 추가되어야 합니다. 따라서 고성능 병렬처리 시스템을 개발하기 위해서는 하드웨어 구조, 운영체제, 알고리즘, 프로그래밍 언어, 컴파일러 등 거의 모든 컴퓨터 기술이 통합되어야 합니다.

     

    병렬처리의 단위

    병렬처리에 참여하는 각 프로세서에 분담되는 단위 프로그램의 크기에 따라 다양한 수준의 병렬성(parallelism)들이 존재할 수 있습니다. 이는 다음과 같은 다양한 크기의 단위에 대해 이루어질 수 있습니다.

     

    - 작업-단위 병렬성(job-level parallelism) : 서로 다른 사용자들에 의해 제출된 작업 프로그램들이나 한 사용자가 제출한 여러 개의 독립적인 작업 프로그램을 병렬로 처리하는 것을 말합니다. 예를 들어, 교수가 성적 관리 프로그램과 실험 데이터 통계 프로그램을 동시에 처리하려고 한다면, 이 프로그램들은 서로 독립적으로 처리될 수 있습니다. 시스템 내에 여러 개의 프로세서가 있다면, 이 작업 프로그램들은 각각의 프로세서에서 병렬로 처리될 수 있습니다. 이러한 병렬처리는 주로 서버급 시스템이나 슈퍼컴퓨터에서 다수의 사용자 요구를 처리하는 데 사용됩니다. 이러한 시스템들은 대부분 다중프로세서 구조를 가지며, 수십 개 이상의 프로세서로 구성됩니다.

     

    - 태스크-단위 병렬성(task-level parallelism) : 하나의 큰 작업 프로그램은 내부적으로 서로 다른 기능을 수행하는 더 작은 프로그램들로 분리될 수 있습니다. 예를 들어, 팔과 다리를 가진 로봇이 있다고 가정해봅시다. 이 로봇을 움직이기 위해서는 부착된 여러 개의 센서로부터 정보를 입력받아 팔과 다리를 적절히 제어하는 컴퓨터 프로그램이 필요합니다. 이 프로그램은 하나의 작업 프로그램이지만, 여러 개의 태스크(또는 프로세스)로 분할될 수 있습니다. 즉, 두뇌 기능을 처리하는 태스크, 팔의 움직임을 제어하는 태스크, 다리의 움직임을 제어하는 태스크 등으로 분할되어 병렬로 처리될 수 있습니다. 이러한 태스크들은 처리 중에 상호 연관된 정보를 교환해야 할 수도 있습니다. 이러한 병렬처리는 다중프로세서 시스템이나 슈퍼컴퓨터에서 대규모 계산을 분할하여 처리하는 데 사용되며, 최근에는 멀티코어 프로세서들도 내부에서 이 단위의 병렬처리를 지원하고 있습니다.

     

    - 스레드-단위 병렬성(thread-level parallelism) : 사용자 프로그램이나 운영체제 프로그램은 여러 개의 스레드로 분할될 수 있습니다. 여기서 스레드는 동시에 처리될 수 있는 가장 작은 독립적인 프로그램 단위를 의미합니다. 이 단위의 병렬처리를 멀티스레딩(multi-threading)이라고 하며, 주로 다중프로세서 시스템에서 지원되지만 동적 실행 능력을 갖춘 슈퍼스칼라 프로세서에서도 처리될 수 있습니다.

     

    - 명령어-단위 병렬성(instruction-level parallelism) : 컴퓨터 프로그램은 여러 개의 어셈블리 명령어로 구성되며, 각 명령어는 입력 데이터를 받아 연산을 수행한 후 출력 값을 생성합니다. 그러나 명령어 간에 의존 관계가 없는 경우 여러 명령어를 동시에 수행할 수 있습니다. 이를 명령어 단위 병렬성이라고 하며, 슈퍼스칼라 구조를 가진 프로세서는 이 병렬성을 이용하여 처리 속도를 높일 수 있습니다.

     

    병렬컴퓨터의 성능과 효율을 극대화하기 위해서는 이러한 다양한 수준의 병렬성을 최대한 활용해야 합니다. 이를 위해서는 시스템 구조와 프로세서 구조를 적절히 설계하고 구현해야 합니다.