동시성은 단일 코어가 한 작업에 약간의 시간을 할애하고 다른 작업에 시간을 할애합니다. 이것을 시간에 대해서 분할/겹침 기간이 있다고 부를 수 있습니다. 실제 병렬 처리는 여러 코어에서 여러 작업을 병렬로 실행하는 것을 의미합니다. 참고로 동시성은 더 넓은 용어이고 병렬성은 그 하위 집합입니다.

실제 병렬 처리를 위해서는 전용 코어, 별도의 메모리 등이 필요한 이유로 더 많은 리소스를 사용합니다. 따라서 여기서 병렬처리가 아닌 동시성을 필요로 하게 됩니다. 동시성을 달성하기 위해서는 작은 논리 단위로 분할 하여 하나의 코어에서 동시적으로 처리되게 할 수 있습니다. 모든 동시 코드를 병렬로 실행하려고 하면 불필요하게 리소스가 고갈됩니다. 따라서 동시를 원하는지 병렬로 구현할 것인지 고민해야 합니다.

  동시성(Concurrency) 병렬성(Parallel)
기본 정의 중첩 또는 시간 분할을 사용하여 동일한 코어에서 여러 작업을 실행 다른 코어에서 여러 작업을 실행
목표 리소스에 스트레스를 주지 않으면서 병렬 처럼 보이게 성능을 위한 실제 병렬 처리
관점 협동 방식으로 계산을 독립적으로 실행하는 구성 병렬 연산 실행
자원 활용 가벼움 무거움
  • 병렬 처리는 동시성의 하위 집합입니다.
  • 동시성은 병렬 처리를 가능하게 합니다.
  • 동시성은 소프트웨어 설계에 관한 것이고 병렬 처리는 하드웨어에 관한 것입니다.
  • 동시성은 병렬 처리의 환상을 주는 반면 병렬 처리는 성능에 관한 것입니다.
  • 동시성은 하나의 코어만 필요하고 병렬 처리에는 최소 2개의 코어가 필요합니다.

Councurrency

동시성은 서로 통신하는 프로그램의 여러 복사본이 동시에 실행될 때 발생합니다. 간단히 말하면, 동시성은 두 작업이 겹칠 때 입니다. 간단한 동시 응용 프로그램은 단일 기계를 사용하여 프로그램의 명령을 저장하지만 해당 프로세스는 여러 개의 서로 다른 스레드에 의해 실행됩니다. 이 설정은 각 스레드가 다음 스레드로 전달하기 전에 명령을 실행하는 일종의 제어 흐름을 생성합니다. 스레드는 독립적으로 작동하고 이전 스레드를 기반으로 결정을 내립니다. 그러나 동시성에서 구현하기 어렵게 만드는 몇 가지 문제가 발생할 수 있습니다.

예를 들어 데이터 경쟁(data race)은 c++ 동시성 및 다중 스레드 프로세스에서 발생할 수 있는 일반적인 문제입니다. c++에서 데이터 경쟁은 최소 두 개의 스레드가 변수 또는 메모리 위치에 동시에 액세스 할 수 있고 해당 스레드 중 하나 이상이 해당 변수에 액세스하려고 할 때 발생합니다.

​동시성과 병렬성은 종종 혼동됩니다. 병렬 처리에서는 동일한 프로그램의 여러 복사본을 동시에 실행하지만 다른 데이터에서 실행됩니다. 예를 들어 병렬 처리를 사용하여 다른 웹 사이트에 요청을 보내지만 프로그램의 각 복사본에 다른 URL 집합을 제공할 수 있습니다. 이러한 복사본은 반드시 서로 통신할 필요는 없지만 동시에 병렬로 실행됩니다. 위에서 설명했듯이 동시 프로그래밍에는 공유 메모리 위치가 포함되며 다른 스레드는 실제로 이전 스레드에서 제공한 정보를 “읽습니다”.

c++에서 동시성을 구현하는 가장 일반적인 두 가지 방법은 멀티스레딩과 병렬 처리를 사용하는 것 입니다. 이것들은 다른 프로그래밍 언어에서 사용 될 수 있지만 c++는 평균보다 낮은 오버헤드 비용과 복잡한 명령을 위한 용량으로 동시 기능이 두드러집니다.

Parallel

작업 병렬처리(task parallelism)는 전체 문제를 작은 독립된 동기화할 필요가 거의 없는 작업들로 나누어 처리하는 방식입니다. 몬테 카를로 시뮬레이션이 이러한 상황을 잘 설명합니다. 몬테 카를로 적분은 다른 것 입니다. 그러나 이 패러다임의 사용은 제한적입니다.

데이터 병렬 처리(data parallelism)는 어레이 등에서 루프를 분석하기 위해 다중 스레드에서 사용하는 방식 입니다. 프로세서 간의 통신 및 동기화는 종종 숨겨져 있어 프로그래밍하기 쉽습니다. 그러나 사용자는 전문 컴파일러에게 많은 제어를 넘겨줍니다. 데이터 병렬화의 예로는 컴파일러 기반 병렬화 및 OpenMP 지시문이 있습니다.

메세지 전달(message passing)는 관련된 모든 프로세서는 독립적인 메모리 주소 공간을 가집니다. 사용자는 글로벌 문제의 데이터 및 작업을 분할하고 하위 문제를 프로세서에 배포할 책임이 있습니다. 프로세서 간의 협업은 데이터 전송과 동기화에 사용되는 명시적 메시지 전달을 통해 이루어집니다.

벡터화(vectorization)는 여러 데이터 요소에서 병렬로 작동할 수 있는 단일 명령 스트림을 나타내는 SIMD(single instructions multiple data)의 특수한 경우입니다. 벡터화는 SIMD 명령어와 함께 루프를 풀어내는 것으로 생각할 수 있습니다.

  • SIMD(single instruction multiple data)는 병렬컴퓨팅의 한 종류로, 하나의 명령어로 여러 개의 값을 동시에 계산하는 방식입니다. 벡터 프로세서에서 많이 사용되는 방식으로, 비디오 게임 콘솔이나 그래픽 카드와 같은 멀티미디어 분야에 자주 사용됩니다