2011-08-08 2 views
4

다음 질문에 대해서는 2 개의 프로세서가있는 듀얼 코어 (프로세서 당 2 코어) 머신을 가정합니다. 총 4 개의 "코어"가 있습니다. 그래서 몇 가지 자연적인 질문 발생 :멀티 코어 시스템에서 다중 인스턴스 프로그램

  1. 가정하자 나는 각 실행에서 별개의 입력 데이터로, 간단한 시리얼 프로그램을 작성하고 내장, 말, 비주얼 스튜디오를 .. 그리고 말하자면, 두 번 같은 프로그램을 실행. 동일한 프로세서에서 실행되고 있습니까? 또는 별개의 프로세서? 얼마나 많은 RAM 메모리가 각각에 할당됩니까? 1 프로세서 (2 코어) 또는 총 RAM에 RAM 메모리가 있습니까? 두 프로그램은 별개의 프로세서에서 실행되며 각각 1 개의 프로세서 (2 코어)의 RAM 메모리가 있어야한다고 생각합니다. 하지만 나는 100 % 확실하지 않습니다. Linux에서 동작이 조금 다를 수 있습니까?

  2. 내 프로그램이 MPI와 같은 분산 메모리 병렬 인터페이스를 사용하여 작성되었다고 가정하고 np 인수 (예 :)에서 2 개의 프로세서로 한 번 실행했습니다. 프로그램에서 두 프로세서 (사실상 4 코어 모두)를 사용합니까? 이것은 -np 인수에 대해 최적의 값입니까? 즉, 내가 -np 3 또는 -np 4를 사용하여 동일한 작업을 수행했다면; 추가 이점이 없다고 가정하는 것이 맞습니까? 다시 생각해 보겠습니다. 그러나 나는 100 % 확실하지 않습니다. 나는 또한 내가 4보다 높을 수 있다고 가정한다 (-np 5, -np 6 등). 이러한 경우 프로세스가 np> 4 값에서 메모리를 확보하기 위해 어떻게 경쟁합니까? 성능이 np> 4보다 나빠질까요? 나는 그렇다고 생각합니다. 아마도 이것은 문제의 크기에 부분적으로 의존 할 것이지만, 100 % 확실하지는 않을 것입니다.

    다음으로 MPI로 작성된 병렬 프로그램의 두 인스턴스 (각각 둘 다 다른 입력 데이터가있는 -np 2)를 실행했다고 가정합니다. 첫째로, 이것은 가능한가? 나는 그것이 양쪽 프로세서에서 각각 실행된다고 가정합니다. 두 프로그램은 어떻게 동기화되며 개별적으로 메모리를 어떻게 개별적으로 경쟁합니까? 이것은 적어도 프로그램을 시작하는 순서에 기초해야한다는 것입니다. 아마도?

  3. 마지막으로 내 프로그램이 OpenMP와 같은 공유 메모리 병렬 인터페이스를 사용하여 작성되었으며 한 번 실행했다고 가정합니다. 공유 메모리 병렬 처리를 최대한 활용하기 위해 얼마나 많은 "스레드"를 실행할 수 있습니까? 2 또는 4입니까? (이후 2 코어 2 코어 각각). 내 짐작으로 4 살이다. 4 개의 코어가 모두 단일 공유 메모리 장치의 일부이기 때문에? 그 맞습니까? 답이 4면; 4 개 이상의 스레드에서 실행하는 것이 합리적입니까? 나는 이것이 심지어 작동한다는 것을 확신하지 못한다. (MPI와는 달리, 우리가 할 수 있다고 믿는다. -np 5, -np 6 등등).

마지막으로 공유 메모리 병렬 프로그램의 인스턴스를 각각 다른 입력 데이터로 실행한다고 가정합니다. 이것이 가능하다고 가정하고 개별 프로세스가 어떻게 든 메모리 경쟁을 할 것이라고 가정합니다. 아마도 프로그램이 시작된 순서 일 것입니다.

답변

5

어떤 프로세서에서 실행되는지는 전적으로 OS에 달려 있으며 동일한 시스템에서 발생하는 모든 것을 포함하여 많은 요인에 따라 달라집니다. 그러나 공통적 인 경우는 하나의 코어에 각각 앉아서 다른 코어에 스와핑하는 경향이 있습니다 ("간혹"는 몇 번 또는 더 자주 나타날 수 있음).

보통 PC 하드웨어에는 자체 RAM이 없으므로 프로세스가 많은 RAM을 요구합니다.

MPI 프로세스의 경우 병렬 처리가 코어 수와 일치해야합니다 (CPU 사용량이 많은 경우). 두 개의 MPI 프로세스가 -np 2로 실행되는 경우, 그들은 4 개의 코어를 모두 소비합니다. 무엇이든 늘리면 그들은 싸울 것입니다. 위에서 설명한 바와 같이, RAM은 경합이있을 때 캐시가 손상 되더라도 아무 것도이 작업과 관련이 없습니다.

"질문"이 너무 길기 때문에 지금 중단하겠습니다.

+0

@Cantos : 답변 해 주셔서 감사합니다. 하지만 좀 더 정교하게 신경 쓰겠습니까? 질문에는 세 가지 범주 (직렬, MPI 및 openMP)가 있었으며 첫 번째 대답에 답하는 것처럼 보입니다. 하지만 다시 한 번 감사드립니다! –

+0

@Cantos : 나는 당신이 지금 편집 한 것을 본다. 어쨌든, 나는 그 긴 질문을 인정한다. 다시 한번 감사드립니다. –

+0

@ user545591 : 가장 좋은 답변은 나만의 테스트에서 나옵니다. –

2

@Marcelo는 절대적으로 옳으며 나는 그의 대답을 조금 더 넓히고 싶습니다.

OS는 시스템에서 진행중인 작업과 사용 가능한 리소스에 따라 스레드가 응용 프로그램 실행을 구성하는 위치와 시간을 결정합니다. 각 응용 프로그램은 자체 프로세스에서 실행되며 해당 프로세스는 hundereds or thousands of threads이 될 수 있습니다. OS (Windows, Linux, Mac)는 프로세싱 코어의 실행 컨텍스트를 전환하여 모든 응용 프로그램과 서비스가 파이 조각을 얻도록합니다.

마더 보드에있는 NorthBridge Controller에 의해 물리적으로 제어되는 RAM과 같은 I/O 액세스. 각 프로세스 (프로세서가 아닙니다!)은 처리 할 수있는 RAM 할당량을 응용 프로그램의 수명 동안 확장 또는 축소 할 수 있습니다 ... 물론 이것은 시스템에서 사용할 수있는 리소스의 양, 또한 OS가 물리적으로 디스크 가용성 (즉, 가상 RAM) 이상으로 RAM 요청을 스와핑 할 때주의해야합니다. 다른 한편으로는 critical sections 및 다른 스레드 동기화 메커니즘을 사용하여 응용 프로그램 내의 메모리에 대한 액세스를 조정해야합니다.

OpenMP는 멀티 스레드 parellel 응용 프로그램을 작성하고 스레드를 동기화 상태로 유지하는 구문을 쉽게 만드는 라이브러리입니다. 누군가가 더 나은 설명을 줄 수 있는지 확인하십시오.

+0

응답 해 주셔서 감사합니다. @cheesus –

2

나는 창을 사용하고 있기 때문에 작업 관리자에서 프로세스 친 화성 (프로세스가 실행될 수있는 코어 또는 코어)을 설정할 수 있다고 말함으로써 요약 할 것입니다. 또한 winapi 전화가 있지만 그 이름이 나를 도피합니다

a) 단일 스레드 프로그램의 경우 동일한 CPU (해당 CPU를 사용한다고 가정)에서 실행되지 않습니다. 친화력을 변경하여 보증 할 수 있습니다. 리눅스에서는 sched_setaffinity과 사용자 공간 프로그램이 있습니다 taskset

b)는 MPI 라이브러리에 따라 다릅니다. 기계 장치는 도서관에 한정됩니다.

c) 특정 응용 프로그램 및 데이터 패턴에 따라 다릅니다. 소규모 데이터 액세스지만 메시징이 많이 전달되는 경우 실제로는 1 개의 CPU로 제한하는 것이 가장 효율적인 패턴이라는 것을 알 수 있습니다.

+0

응답 해 주셔서 감사합니다. @FooBah –

관련 문제