요즘은 CPU의 클럭보다는 코어가 많아지는 추세입니다.
그렇다면 코어가 많아지면 정말 속도가 빨라 질까요?
빠라지긴 합니다.
단지 운영체제가 지원해야 하며 소프트웨어가 지원해야 하죠.
CPU, 운영체제, 소프트웨어의 삼박자가 중요합니다.
1-1. 운영체제와 소프트웨어가 지원하지 않는 경우
운영체제나 소프트웨어가 멀티코어를 지원하지 않는다면 코어가 하나짜리 CPU가 됩니다.
운영체제와 소프트웨어가 멀티코어를 지원하지 않는 경우
듀얼코어 3GHz == 싱글코어 3GHz
운영체제가 일단 멀티코어를 지원해야 소프트웨어도 그것을 활용할수 있습니다.
그런데 요즘사용하는 운영체제중 멀티코어를 지원하지 않는 운영체제는 없던걸로 알고 있습니다.
심지어 대부분의 모바일용 운영체제도 멀티코어를 지원 하죠.
일단 운영체제가 멀티코어를 지원한다면 자동으로 멀티코어를 활용하게 됩니다.
백신 프로그램은 A코어에서 돌고 게임은 B코어에서 도는 식이죠.
이런 동작은 운영체제에서 자동으로 할당하므로 소프트웨어가 멀티코어를 지원하지 않는 다고 해도 성능 향상에 도움이 됩니다.
문제는 이렇게 할당된 프로그램은 코어를 하나만 사용하므로 다른코어가 놀고 있더라고 사용할수 없습니다.
여러 프로그램을 사용할때는 성능이 향상되지만 단일 프로그램일때는 성능이 향상되지 않는 다는 것이죠.
A코어 3.0GHz |
B코어 3.0GHz |
|
싱글코어 3.0GHz |
A프로그램 |
B프로그램 |
> |
A프로그램, B프로그램 |
A프로그램 |
작업 없음 |
== |
A프로그램 |
소프트웨어가 멀티코어를 지원하기 위해서는 크게 2가지 방법이 있습니다.
멀티 쓰래드를 활용하는 방법과 병렬컴퓨팅(병렬프로그래밍)을 하는 것입니다.
쓰래드라는 것은 프로그램의 흐름을 말합니다.
(참고 : 위키백과 -
쓰레드)
쓰래드를 하나만 쓰는 프로그램이라면 로딩(데이터를 불러오거나 화면을 그리거나 할때)중에 프로그램이 멈춘것 처럼 보이죠.
심지어 작업이 길어지면 운영체제에서는 응답없음으로 처리 합니다.
응답없음 문제뿐만 아니라 사용자입장에서는 이 프로그램이 제대로 로딩이 되고 있는지? 프로그램 자체가 죽었는지를 확인 할방법이 필요하기 때문에 로딩중에는 지속적으로 움직이는(혹은 변하는) 이미지나 텍스트를 넣는 것이 일반적입니다.
'악마성 드라큐라 - 월하의 야상곡'에서는 로딩화면에서 사용자의 입력을 받아 로딩화면조작이 가능합니다.
좀 더 덜지루하게 할수 있죠 ㅎㅎㅎ
이런기능을 구현하기 위해서는 멀티쓰래드는 필수 입니다.
쓰래드는 흐름이라고 했으니 하나의 흐름만 있다면 당연이 로딩중에는 아무런 작업을 할수 없습니다.
앞에 작업이 끝나기전에는 다른작업을 할수 없으니까요.
이것을 멀티쓰래드로 구성하면 한번에 2가지 흐름을 제어하기 때문에 로딩중에 프로그램이 처리중인지를 확인할수 있습니다.
쓰레드1 |
쓰레드2 |
작업1 |
|
|
작업2 |
작업1 |
|
|
작업2 - 완료 |
작업1 |
|
작업1 |
|
|
작업3 |
작업1 |
|
이런식으로 코어 하나를 여러개 인것 처럼 사용할수 있습니다.
OS는 이렇게 멀티쓰레드로 구성되있는 프로그램에 있을때 각 쓰레드를 효율적으로 분배를 하게 됩니다.
코어가 여러개라면 쉬고있는 코어에 할당하기도 하죠.
A코어 3.0GHz |
B코어 3.0GHz |
|
싱글코어 3.0GHz |
A프로그램-쓰레드1 |
A프로그램-쓰래드2 |
> |
A프로그램-쓰레드1 |
작업없음 |
작업 없음 |
A프로그램-쓰레드2 |
멀티쓰레드도 멀티코어상에서 프로그램을 여러게 돌리것과 같은 문제가 있습니다.
한쓰래드만 작업량이 많다면 어차피 코어 하나는 놀게 됩니다 ㅡ.-;
병렬프로그래밍이라는 것은 한가지 작업을 여러 프로세서(코어)에서 작업을 나눠 처리하는 것을 말합니다.
(참고 : 위키 백과 -
병렬컴퓨팅)
A코어 |
B코어 |
작업1(1/2) |
작업1(2/2) |
이렇게 작업하나를 여러개로 나누어 작업 하는 것입니다.
당연이 작업이 모두 완료 될때 까지 모든 코어가 작동하므로 3GHz + 3GHz = 6GHz의 효과를 볼수 있습니다.
참고로 있던 위키백과 글을 읽어보셨다면 아시겠지만 병렬프로그래밍은 프로그래머에게 있어 난제입니다.
간단하게 병렬프로그램밍을 설명 하자면 1부터 100까지 더하는 프로그램이 있다면 한쪽코어에서는 1~50까지 더하고 다른 코어에서는 51~100까지 더하면 됩니다.
A코어 |
B코어 |
작업1(1~50) |
작업2(51~100) |
결과 합산 |
|
이런 프로그램은 별문제가 되지 않습니다.
왜냐하면 A코어에서 한는 동작이 B코어에 영향을 줄 일이 없기 때문입니다.
문제는 일반적으로 이런 계산을 할일은 그닥 없습니다-_-;
보통 병렬프로그래밍을 해야 할정도의 작업이라면 엄청난 수행시간을 자랑하고 서로에게 영향을 줄수 밖에 없습니다.
예를 들어 1부터 100까지 곱하는 프로그램이 있다면 1과 2를 곱한 결과를 알아야 그값에 3을 곱할수 있습니다.
A코어 |
B코어 |
1*2 = 2 |
|
|
3*2=6 |
4*6=24 |
|
|
7*24=172 |
으잌? 싱글 쓰레드랑 다를 게 없잔아!
A코어 |
B코어 |
1*2 = 2 |
3*4=12 |
5*14=70 |
6*14=84 |
7*154=1078 |
8*154=1232 |
결과없이 같이 데이터를 처리 하면 이렇게 되겠죠.
그렇기 때문에 이런 문제를 회피하면서도 여러 코어를 활용하기 위해서 여러가지 방법들을 사용해야 하는데 프로그래머 입장에서 쉬운 문제가 아닙니다.
그렇기 때문에 멀티코어를 재대로 활용하는 프로그램이 많지 않습니다.
다행이도 사용자의 요구수준이 높아지면서 멀티테스킹을 더 많이 요구하게 됩니다.
예전에 앱등이들이 핸드폰에 멀티태스킹은 낭비라는 헛소리를 하기도 했지만 어느 단말기에서든 사용자들의 요구는 비슷합니다.
멀티태스킹이의 수요가 많아 질수록 멀티코어의 효율을 높아집니다.
예를들면 UI/UX처리와 실제 프로그램의 처리를 각각의 코어에서 처리하도록 한다던가 하는 것입니다.
물론 단일 작업량인 많은 분야에서는 여전이 같은 문제가 발생하지만 말이죠 ㅡ.-;;;