Post List

2015년 1월 18일 일요일

Concurrent와 Parallel의 차이

원문 : http://minjang.egloos.com/2517211

Concurrency(병행성)와 parallelim(병렬성), 또는 concurrent programming(병행 프로그래밍)과 parallel programming(병렬 프로그래밍)의 차이를 지금까지 깊게 생각해본 적이 없었다. 막연히 concurrent programming은 예전 운영체제 시간에 뮤텍스와 데드락을 배울 때 봤었고, 병렬 프로그래밍은 OpenMP, MPI를 배울 때 자주 봤었다. 그런데 이 둘은 생각보다 구분이 뚜렷이 되고 있었다. 그걸 지금까지 제대로 몰랐다.
위의 글을 보면 concurrent와 parallel이 같지 않다고 명확히 말하고 있다. 사실 이 둘은 경계가 모호하게 느껴져 아무렇게나 사용되었다. 일단 한 줄로 요약하면:
Concurrency는 프로그램의 성질이고 parallel execution은 기계의 성질이다.
Concurrenty is a property of the prgoram and parallel execution is a property of the machine.
이것만 가지고는 여전히 긴가민가 한다. 먼저 concurrency부터 이야기를 하면, 어떤 프로그램이나 알고리즘이 순서에 상관없이 동시에 수행될 수 있다면 concurrent하다고 말한다. 예를 들어, 1부터 100까지 숫자를 더하는 과정을 생각해보면 숫자 100개를 여러 부분 집합으로 나눈 뒤 동시에 부분합을 구한다. 그리고 이 부분합을 다시 더하면 원래 얻고자 하는 값을 얻을 수 있다. 이 때 이 알고리즘은 concurrent하다라고 말한다.
그런데 이 알고리즘이 정말 물리적으로 병렬로 돌아갈지 아닐지는 이 알고리즘이 어떤 하드웨어 위에서 돌아갈지 알아야만 확답할 수 있다. 방금 이야기한 알고리즘이 멀티 프로세서 머신에서 돌아가야 병렬 실행된다라고 말한다. Parallel execution은 따라서 프로그램의 성질보다는 하드웨어의 성질이다.
Concurrent한 프로그램은 싱글코어 머신에서도 분명 돌아간다. 뮤텍스, 데드락은 싱글코어에서도 얼마든지 그 의미를 갖는다. 멀티스레드 프로그램이 비록 물리적인 제약으로 싱글코어에서 시분할 형태로 돌아가지만 겉으로는 concurrent하게 작동한다고 속일 수 있다. 반대로 아무리 멀티스레드로 작성된 프로그램이라 하더라도 멀티코어가 아니면 병렬로 작동한다고 말하지 못한다.
대충 이 정도면 병행과 병렬, concurrent와 parallel의 차이가 다소 이해가 되었을 것이다. 몇 가지 실제 예를 적용해보면:
  • OpenMP, MPI, CUDA 같은 프로그래밍 방법론은 병행 프로그래밍 보다는 병렬 프로그래밍이 옳은 표현이다. 언급한 세 방법론은 모두 물리적으로 제공되는 다양한 병렬 하드웨어를 활용하니까 말이 된다.
  • 멀티스레드 프로그램에서 벌어지는 각종 버그를 concurrency bug라고 부르는데, 굳이 하드웨어가 반드시 병렬성을 지원하지 않더라도 논리적으로 발생하니까 concurrency라는 말이 옳다.
  • 보통 프로그램에서 병렬성(parallelism)을 찾는다고 하지 병행성을 찾는다고는 말 안 한다. 약간 모호하기는 하나 결국 물리적으로 병렬 실행이 가능한 코드를 찾는 것이니 병렬성이 더 합리적으로 보인다.
  • 어떤 함수에 락을 무식하게 크게 걸면 병행성(concurrency)가 나빠진다고 말한다. 병렬성이 나빠진다고는 말 안 한다.
이제 위키 설명에서 이러한 미묘한 차이를 느낄 수 있다 (영어 번역은 귀찮아서 안 했음 죄송..)
  • Parallel computing is a form of computation in which many calculations are carried out simultaneously, operating on the principle that large problems can often be divided into smaller ones, which are then solved concurrently ("in parallel"). => 역시 병렬로 실행됨이 강조된다.
  • Concurrent computing is a form of computing in which programs are designed as collections of interacting computational processes that may be executed in parallel. => 동시에 실행 될 수도 있음을 강조. 이에 뒤 따르는 설명을 보면
    • Concurrent programs can be executed sequentially on a single processor by interleaving the execution steps of each computational process, or executed in parallel by assigning each computational process to one of a set of processors that may be close or distributed across a network. => 병행 프로그램은 싱글코어 머신에서는 시분할 방법으로, 겉으로는 동시에 실행되는 것처럼 보이지만, 결국 순차적으로 실행되고, 물리적인 병렬 머신에서는 계산 작업을 분배해 동시에 실행됨을 말하고 있다.