답변

32

다중 스레드 프로그래밍은 병렬이지만 병렬 프로그래밍이 반드시 다중 스레드되지는 않습니다.

단일 코어에서 멀티 스레딩이 발생하지 않는 한, 동시 발생은 예외입니다.

+2

AFAIK는 단일 코어 프로세서에서 스레딩이 병렬이 아닙니다. 동시지만 병렬은 아닙니다. –

+0

@Ionut : http : //thesaurus.reference.com/browse/concurrent <- 첫 번째 결과의 '동의어'헤더를 보면됩니다. –

+5

동시성과 병렬 성의 차이점은 병렬성이 진정으로 동시성이라는 것입니다. 동시에 동시성은 마치 마치 동시성 인 것처럼 보입니다. 스레드 간 전환은 너무 빠르기 때문에 병렬 인 것처럼 보이지만 그렇지 않습니다. 어쩌면 이것을 지칭하는 다른 용어가있을 수 있습니다. 그러나 그것이 제가 이해하는 것입니다. –

28

은 반드시입니다. 여러 프로세스 또는 심지어 여러 시스템간에 작업을 분산시킬 수 있습니다. 각 프로세스는 단일 스레드 만 사용할 수 있으므로 "다중 스레드"프로그래밍으로 분류하지는 않겠지 만 확실히 병렬 프로그래밍입니다. 그렇다면 여러 프로세스에서 시스템 전체에 여러 스레드가 있다고 주장 할 수 있습니다.

궁극적으로 이와 같은 정의는 상황에서만 유용합니다. 당신의 특별한 경우에 어떤 차이가 있습니까? 아니면 그냥 관심 밖입니까?

+1

SIMD를 병렬 프로그래밍으로 간주해야합니까? 우리는 병렬로 여러 데이터에 대해 동일한 작업을 수행하고 있지만 이것이 병렬 프로그래밍의 정의에 포함될 마이크로 병렬화로 간주되는지는 잘 모릅니다. –

+0

나는 SIMD가 더 병렬 하드웨어 설계라고 말하고 싶지만, 어느 정도는 병렬 하드웨어를 갖는 프로그래밍 측면을 고려해야한다. GPU 프로그래밍은 어떻습니까? –

26

아니요. 다중 스레드 프로그래밍은 단일 프로세스가 있다는 것을 의미하며,이 프로세스는 많은 스레드를 생성합니다. 모든 스레드는 동시에 실행되지만 동일한 프로세스 공간 아래에 있습니다. 동일한 메모리에 액세스 할 수 있고 동일한 열린 파일 설명자를 가질 수 있습니다.

병렬 프로그래밍은 정의와 같이 좀 더 "일반"입니다. MPI에서는 동일한 프로세스를 여러 번 실행하여 병렬 프로그래밍을 수행합니다. 각 프로세스마다 다른 "식별자"를 사용한다는 차이점이 있으므로 원하는 경우 각 프로세스를 구별 할 수 있지만 반드시 필요하지는 않습니다. 또한 이러한 프로세스는 서로 독립적이며 파이프 또는 네트워크/유닉스 소켓을 통해 통신해야합니다. MPI 라이브러리는 동기식 또는 비동기식으로 노드간에 데이터를 이동하는 특정 기능을 제공합니다.

반면 OpenMP는 멀티 스레드 및 공유 메모리를 통해 병렬 처리를 구현합니다. 컴파일러에 대한 특수 지시문을 지정하면 자동으로 병렬 실행을 수행합니다.

OpenMP의 장점은 매우 투명하다는 것입니다. 병렬화 할 루프가 있습니까? 몇 개의 지시문을 추가하면 컴파일러가이를 조각으로 처리하고 루프의 각 부분을 다른 프로세서에 할당합니다. 불행히도이를 위해 공유 메모리 아키텍처가 필요합니다. 노드 기반 아키텍처가있는 클러스터는 클러스터 레벨에서 OpenMP를 사용할 수 없습니다. MPI를 사용하면 노드 기반 아키텍처에서 작업 할 수 있지만보다 복잡하고 투명하지 않은 사용료를 지불해야합니다.

+0

아, 그래서 1 개의 작업이 n 개의 프로세스에 의해 처리된다는 의미입니다. 하나의 작업이 n 개의 스레드에 의해 처리되지 않습니다. –

+0

다중 프로세스 아키텍처를위한 OpenMP 스타일의 병렬 처리에서 수행되는 작업을 기억합니다 ... 기억이 안납니다. 그것이 OpenMP 그 자체이거나 다른 것인가? –

+1

@ 에코 : 정확하지 않습니다. MPI는 동일한 프로그램의 n 개의 인스턴스를 시작합니다. 각각의 인스턴스는 특수한 변수에 다른 ID 번호를 갖습니다 (MPI_Comm_Rank를 찾습니다). 이러한 인스턴스와 관련된 작업은 귀하에게 달려 있습니다. –