본문 바로가기

My Study/Programming&Theory

병렬 프로그래밍

 최근 마소 잡지를 읽었는데 병렬 프로그래밍이라는 내용에 대해서 나왔었습니다. 
그 내용을 읽기 전까진 전 단순히 이렇게 생각 했었죠;;

" 스레드를 많이 만들어서 프로그래밍 하면 병렬 프로그래밍이겠지......... " 
라고 말이죠. 너무 철 없는 말 같군요.;;

내용을 읽어본 결과 
저의 생각이 너무 창피하다는 생각이 들었지만요. ^^;

현재 CPU 코어의 개수가 2개는 기본 아니.. 4개도 기본이 된거같군요.
이렇게 하드웨어는 엄청난 발전이 생겼는데 하드웨어 위에서 돌아가는 소프트웨어는 얼마나 큰 발전이 있었을까요??

CPU 코어 2개, 4개가 됬다고 해서 응용 프로그램들이 CPU를 효율적으로 사용하고 있을까요.
효율적으로 사용한다는 것은 모든 코어들이 놀지 않고 병렬적으로 처리되는 것을 말합니다.

그러면 현재 만들어진 일반 프로그램들은 얼마나 병렬 프로그래밍을 잘 사용했을까요??
일단 알집을 대상으로 봐보았고 대상 파일을 압축시킬 때 각 스레드 사용량을 봐보았습니다.


만들어진 스레드는 여러개가 있지만 정작 압축하고 있는데 사용되는 스레드는 하나에서 처리를 하고 있습니다.

압축하는 루틴을 병렬 프로그래밍 하지 않은 것 같습니다.
제 생각인데 알집을 만든 개발자가 실력이 부족해서 저렇게 만들었을까요??
아마 그건 아닐 것 입니다. 압축하는 루틴을 병렬 프로그래밍을 사용해 다중 코어에서 처리를 하도록 만들려면 
만들어지는데 엄청난 시간과 비용이 들어갈 것입니다. 만들수 있음에도 불구하고 이런 이유에서 그냥 저렇게 만들었을 것 같군요.. 단순히 주관적인 생각입니다;;

알집 외에도 대다수 프로그램들을 보면 동시에 2개를 효율적으로 사용하는 프로그램은 드뭅니다.
제 컴이 듀얼코어라 확 두드러지게 안보였을 수도 있지만 쿼드코어 급에서만 봐도 이러한 현상을 쉽게 볼 수 있을 것입니다.

위에서 말했지만 단순히 스레드만 여러개 만들어서 돌린다고해서 병렬 프로그래밍을 했다고 말하긴 어렵습니다.
각 스레드들이 서로 병렬적으로 효율적으로~ 작동해야합니다. 사실 저도 직접 병렬 프로그래밍을 사용해 큰 프로그램을 만들어보질 않아서 자세한 설명은 못하겠군요.

마소 잡지에 나온 말을 그대로 써보겠습니다. 저도 약간의 경험밖에 없지만 너무나 공감되는 말이기 때문입니다.
" 간단한 멀티스레드 프로그램도 정확하게 작성하기가 어렵다는 사실을 보면 이 병렬화 작업은 매우 난해한 작업이다. 더군다가 버그 없이 작성하는 것도 어렵지만 최적화하는 것은 더욱 어렵다. "
저도 병렬화 프로그래밍은 아니더라도 단순히 스레드를 만들어 여러 루틴을 사용할때도 코드가 조잡하다는 느낌을 많이 받습니다. 그리고 각 공유 메모리를 사용하게 될 경우 각 스레드들 끼리 동기화를 시켜주는 루틴이 들어가면 더욱 조잡해지죠..;
( 제가 아직 실력이 미흡한 점도 큽니다....... )
특히 IRQL이 적용되어 있는 디바이스 드라이버 같은 경우엔 동기화 시켜줄게 많아서 더욱 조잡해집니다...

이제부터라도 프로그래밍 할 때 신경써서 병렬 프로그래밍을 해봐야겠습니다.
그런 차원에서 간단한 덧셈프로그램을 병렬 프로그래밍으로 작성해보았습니다;;
( 말이 병렬 프로그램이지 별로 병렬 프로그램이라는 느낌은 없습니다;; )
1~n까지 합을 구하는 프로그램 입니다..
듀얼코어에서만 작동하는게 아닌 현재 컴퓨터의 cpu core개수를 얻어와서 
해당 코어를 다 사용해 덧셈을 하는 프로그램입니다. 

나중에 제대로 병렬 프로그래밍을 해보도록 하겠습니다 ...;;ㅠ