2013-12-12 5 views
1

나는 다음과 같은 코드를 작성하고 내가 각 행은 서로 다른 프로세서에서 배열을위한 광고 2 차원 배열에 배치하고 실행하지 않는 오류가 발생MPI 보내고 나는 각 프로세서 배열에서 수신하고 테스트 로

#include <iostream> 
#include <mpi.h> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 

    int *sendBuff; 
    int **table; 
    int size, rank; 
    MPI_Status stat; 
    int pass = 1; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    sendBuff = new int[10]; 
    printf("task %d passed %d\n", rank, pass); //1 
    pass++; 
    if (rank == 0) 
    { 
     table = new int*[size]; 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     sendBuff[i] = rank; 
    } 

    printf("task %d passed %d\n", rank, pass); //2 
    pass++; 
    if (rank != 0) 
    { 
     MPI_Send(&sendBuff, 10, MPI_INT, 0, rank, MPI_COMM_WORLD); 
    } 

    printf("task %d passed %d\n", rank, pass); //3 
    pass++; 
    if (rank == 0) 
    { 
     table[0] = sendBuff; 
     for (int i = 1; i < size; i++) 
     { 
      MPI_Recv(&table[i], 10, MPI_INT, i, i, MPI_COMM_WORLD, &stat); 
     } 
    } 
    printf("task %d passed %d\n", rank, pass); //4 
    pass++; 
    delete[] sendBuff; 
    if (rank == 0) 
    { 
     for (int i = 0; i < size; i++) 
     { 
      delete[] table[i]; 
     } 
     delete[] table; 
    } 

    MPI_Finalize(); 
    return 0; 
} 

하지만 내가

mpirun -np 4 a.out 

을 사용하여 실행하고 난 다음 얻을 를들이받은되지 않습니다

[arch:03429] *** Process received signal *** 
[arch:03429] Signal: Aborted (6) 
[arch:03429] Signal code: (-6) 
[arch:03429] [ 0] /usr/lib/libpthread.so.0(+0xf870) [0x7fd2675bd870] 
[arch:03429] [ 1] /usr/lib/libc.so.6(gsignal+0x39) [0x7fd2672383d9] 
[arch:03429] [ 2] /usr/lib/libc.so.6(abort+0x148) [0x7fd2672397d8] 
[arch:03429] [ 3] /usr/lib/libc.so.6(+0x72e64) [0x7fd267275e64] 
[arch:03429] [ 4] /usr/lib/libc.so.6(+0x7862e) [0x7fd26727b62e] 
[arch:03429] [ 5] /usr/lib/libc.so.6(+0x79307) [0x7fd26727c307] 
[arch:03429] [ 6] a.out() [0x408704] 
[arch:03429] [ 7] /usr/lib/libc.so.6(__libc_start_main+0xf5) [0x7fd267224bc5] 
[arch:03429] [ 8] a.out() [0x408429] 
[arch:03429] *** End of error message *** 
-------------------------------------------------------------------------- 
mpirun noticed that process rank 0 with PID 3429 on node arch exited on signal 6 (Aborted). 
-------------------------------------------------------------------------- 

어떤 도움이 필요합니까?

+0

당신의'sendBuf'가'MPI_Send' 또는'MPI_Recv', 당신은 추가'및'가 필요하지 않습니다하는처럼 포인터 변수를 전달합니다. –

답변

3

Hristo Iliev가 지적했듯이 배열 sendBuf는 MPI_Send의 인수 여야합니다. 그것은 table [i]와 같은 방식으로 작동합니다.

또 다른 사실 : MPI_Send 및 MPI_Recv는 메모리를 할당하지 않습니다. 이러한 기능은 메시지를 한 위치에서 다른 위치로 복사합니다. sendBuff와 table [i]는 이전에 할당되어야합니다. 그리고 writting table [0] = sendBuff은 메모리 누수를 유발합니다. 당신에게 도움이 될 수

#include <iostream> 
#include <mpi.h> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 

    int *sendBuff; 
    int **table; 
    int size, rank; 
    MPI_Status stat; 
    int pass = 1; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    sendBuff = new int[10]; 
    printf("firts task %d passed %d\n", rank, pass); //1 
    pass++; 
    if (rank == 0) 
    { 
     table = new int*[size]; 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     sendBuff[i] = rank; 
    } 

    printf("second task %d passed %d\n", rank, pass); //2 
    pass++; 
    if (rank != 0) 
    { 
     MPI_Send(sendBuff, 10, MPI_INT, 0, rank, MPI_COMM_WORLD); 
    } 

    printf("thrid task %d passed %d\n", rank, pass); //3 
    pass++; 
    if (rank == 0) 
    { 
    table[0]=new int[10]; 
    for(int i=0;i<10;i++){ 
     table[0][i]=sendBuff[i]; 
} 
     // table[0] = sendBuff; 
     for (int i = 1; i < size; i++) 
     { 
    table[i]=new int[10]; 
      MPI_Recv(table[i], 10, MPI_INT, i, i, MPI_COMM_WORLD, &stat); 
     } 
    } 
    printf("fourth task %d passed %d\n", rank, pass); //4 
    pass++; 


    if (rank == 0) 
    { 
     for (int i = 0; i < size; i++) 
     { 
      delete [] table[i]; 
     table[i]=NULL; 
     } 
     delete [] table; 
    } 

delete [] sendBuff; 

    MPI_Finalize(); 
    return 0; 
} 

함수 : MPI_Gather (...) 여기

당신을 도울 수있는 코드입니다. 그것은 당신이 찾고있는 것으로 보인다! 당신이 그것을 원한다면 메모리 할당을주의하라 : 모든 테이블 값은 하나의 인접한 메모리 덩어리로 할당되어야한다.

http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Gather.html

안녕,

프랜시스