2011-03-05 6 views
1

이 문제를 해결하고 있습니다. 사이클링 매핑을 구현할 때 프로세서가 4 개이므로 하나의 작업이 프로세서 1 (루트)에 매핑 된 다음 3 개의 다른 작업자가 작업자입니다. 나는주기적인 매핑을 사용하고 있으며, 입력으로 여러 개의 정수를 가지고있다. 0-40. 나는 각 근로자가 받기를 원한다. (이 경우에는 각 근로자에 ​​대해 10 개의 정수가된다.) 계산을하고 저장한다.MPI - 작업 0 (루트)에서 다중 int를받습니다.

나는 루트로부터 정수를 보내기 위해 MPI_Send를 사용하고 있지만, 동일한 프로세스 (루트)로부터 어떤 숫자를받는 방법을 배제하지는 않는다. 또한 정수가 1 일 때 버퍼 크기를 1로 고정하여 int를 보냅니다. 12, 그것은 나쁜 일을 할 것입니다. int의 길이를 확인하는 방법?

모든 조언을 주시면 감사하겠습니다. 감사합니다

답변

4

당신의 질문은 말할 수 없지만 당신이 C++에서 일한다고 가정 할 것입니다. 어쨌든 MPI_Send의 인수를 살펴 보겠습니다. 두 번째 인수는 보낼 데이터 항목 수를 지정합니다. 이 호출은 "bufcount 개의 숫자가있는 메모리의 한 지점을 가리키며, 모두가 datatype 인 형식으로 하나씩 보내면됩니다.

int values[10]; 
for (int i=0; i<10; i++) 
    values[i] = i; 
MPI_Send(values, 10, MPI_INTEGER, 1, 0, MPI_COMM_WORLD); 

values의 시작 부분에 메모리를 읽기 시작, 10 개 MPI_INTEGER의 읽을 때까지 계속 읽어 것이다 : 이것은 당신이 이런 식으로, 전체 배열의 내용을 보낼 수 있습니다.

int values[40]; 
for (int i=0; i<40; i++) 
    values[i] = i; 
for (int i=1; i<4; i++) // start at rank 1: don't send to ourselves 
    MPI_Send(values+10*i, 10, MPI_INTEGER, i, 0, MPI_COMM_WORLD); 

그러나,이 MPI는 그것을 그 자신의 기능을 제공합니다 분산 컴퓨팅에서 같은 일반적인 작업을, MPI_Scatter입니다 : 프로세스 사이의 숫자를 배포 사건에 대한

, 이것은 당신이 MPI_Send 함께 할 방법입니다 . Scatter는 원하는 것을 정확히 수행합니다. 하나의 배열을 호출하고이를 호출하는 모든 프로세스간에 균등하게 분할합니다. 이것은 약간 고급 주제 인 collective communication 콜입니다. 따라서 MPI를 배우는 것만으로도 MPI_Send 및 MPI_Recv를 사용하기가 편할 때까지 자유롭게 건너 뛸 수 있습니다.