2014-11-20 3 views
0

다음 코드는 여기에openmpi for C++ : 함수 내에서 순위가 ​​변경되지 않습니다.

#include "mpi.h" 
#include <stdio.h> 

#define NUM 5 
#define TRANSACTIONS 1 

main(int argc, char *argv[]) { 
int numtasks, rank, dest, source, rc, count, tag=1; 
char outmsg[] = "Hello World, today is a not so fantastic day for programmers"; 
char inmsg[20] = "-------------------"; 
MPI_Status Stat[2]; 

MPI_Init(&argc,&argv); 
MPI_Comm_size(MPI_COMM_WORLD, &numtasks); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

char* baseaddr; 

if (rank == 0) { 
    dest = 1; 
    source = 1; 
    printf("a) I am: %d\n", rank); 
    rc = MPI_Send(outmsg, NUM, MPI_CHAR, dest, tag, MPI_COMM_WORLD); 
    printf("OUTBUFFER OF WORKER %d: %s\n", rank, outmsg); 
    printf("b) I am: %d\n", rank); 
    baseaddr=outmsg+5; 
    //rc = MPI_Send(outmsg+5, NUM, MPI_CHAR, dest, 10, MPI_COMM_WORLD); 
    rc = MPI_Send(baseaddr, NUM, MPI_CHAR, dest, 10, MPI_COMM_WORLD); 
    printf("OUTBUFFER OF WORKER %d: %s\n", rank, outmsg); 
    //rc = MPI_Recv(inmsg, NUM, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat); 
    printf("c) I am: %d\n", rank); 
    } 

else if (rank == 1) { 
    dest = 0; 
    source = 0; 
    printf("d) I am: %d\n", rank); 
    baseaddr = inmsg+5; 
    //rc = MPI_Recv(inmsg+5, NUM, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat); 
    rc = MPI_Recv(inmsg, NUM, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat[0]); 
    printf("e) I am: %d\n", rank); 
    printf("INBUFFER OF WORKER %d: %s\n", rank, inmsg); 
    rc = MPI_Recv(baseaddr, NUM, MPI_CHAR, source, 10, MPI_COMM_WORLD, &Stat[1]); 
    //rc = MPI_Send(outmsg, NUM, MPI_CHAR, dest, tag, MPI_COMM_WORLD); 
    printf("f) I am: %d\n", rank); 
    printf("INBUFFER OF WORKER %d: %s\n", rank, inmsg); 
    } 


for(int i=0; i<=TRANSACTIONS; ++i){ 
    rc = MPI_Get_count(&Stat[i], MPI_CHAR, &count); 
    printf("Task %d: Received %d char(s) from task %d with tag %d \n", 
      rank, count, Stat[i].MPI_SOURCE, Stat[i].MPI_TAG); 
} 

MPI_Finalize(); 
} 

출력 아래에 붙여 출력을 생성합니다

d) I am: 1 
e) I am: 1 
INBUFFER OF WORKER 1: Hello-------------- 
f) I am: 1 
a) I am: 0 
OUTBUFFER OF WORKER 0: Hello World, today is a not so fantastic day for programmers 
b) I am: 0 
OUTBUFFER OF WORKER 0: Hello World, today is a not so fantastic day for programmers 
c) I am: 0 
Task 0: Received 0 char(s) from task 4227856 with tag 0 
Task 0: Received 6365232 char(s) from task 0 with tag 4227856 
INBUFFER OF WORKER 1: Hello Worl--------- 
Task 1: Received 5 char(s) from task 0 with tag 1 
Task 1: Received 5 char(s) from task 0 with tag 10 

이 출력은 올바른 것 같다. 이제 다음 코드는 (내 제한된 이해) 같은 출력을 생성해야하지만,이 말과 같이 경우되지 않습니다 :

#include "mpi.h" 
#include <stdio.h> 

#define NUM 10 
#define TRANSACTIONS 1 

main(int argc, char *argv[]) { 
int numtasks, rank, dest, source, rc, count, tag=1; 
char outmsg[] = "Hello world, today is a beautiful day.\n"; 
char inmsg[30] = "-----------------------------"; 
MPI_Request req; 
MPI_Status Stat[TRANSACTIONS]; 

MPI_Init(&argc,&argv); 
MPI_Comm_size(MPI_COMM_WORLD, &numtasks); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

char* baseaddr; 

if (rank == 0) { 
    dest = 1; 
    source = 1; 
    rc = MPI_Send(outmsg, NUM, MPI_CHAR, dest, 99, MPI_COMM_WORLD); 
    printf("OUTBUFFER OF WORKER %d: %s\n", rank, outmsg); 
    printf("a) I am: %d\n", rank); 
    baseaddr = outmsg + NUM; 
    //rc = MPI_Send(baseaddr, NUM, MPI_CHAR, dest, 999, MPI_COMM_WORLD); 
    printf("OUTBUFFER OF WORKER %d: %s\n", rank, outmsg); 
    printf("b) I am: %d\n", rank); 
    //rc = MPI_Irecv(&inmsg, NUM, MPI_CHAR, source, 2, MPI_COMM_WORLD, &req); 
    } 

else if (rank == 1) { 
    dest = 0; 
    source = 0; 
    //rc = MPI_Recv(inmsg, NUM, MPI_CHAR, source, 99, MPI_COMM_WORLD, &Stat[0]); 
    printf("INBUFFER OF WORKER %d: %s\n", rank, inmsg); 
    printf("c) I am: %d\n", rank); 
    baseaddr = inmsg + NUM; 
    rc = MPI_Recv(baseaddr, NUM, MPI_CHAR, source, 99, MPI_COMM_WORLD, &Stat[1]); 
    printf("INBUFFER OF WORKER %d: %s\n", rank, inmsg); 
    printf("d) I am: %d\n", rank); 
    //rc = MPI_Isend(&outmsg, NUM, MPI_CHAR, dest, 2, MPI_COMM_WORLD, &req); 
    } 

for(int i=0; i<=TRANSACTIONS; ++i){ 
    rc = MPI_Get_count(&Stat[i], MPI_CHAR, &count); 
    printf("Task %d: Received %d char(s) from task %d with tag %d \n", 
      rank, count, Stat[i].MPI_SOURCE, Stat[i].MPI_TAG); 
} 

MPI_Finalize(); 
} 

그리고 여기

위의 출력에 해당되지 않습니다 출력

OUTBUFFER OF WORKER 0: Hello world, today is a beautiful day. 

a) I am: 0 
OUTBUFFER OF WORKER 0: Hello world, today is a beautiful day. 

b) I am: 0 
Task 0: Received 0 char(s) from task 6362440 with tag 0 
Task 0: Received 2 char(s) from task 0 with tag 1969314218 
INBUFFER OF WORKER 1: Hello worl------------------- 
c) I am: 1 
INBUFFER OF WORKER 0: Hello world, today i--------- 
d) I am: 0 
Task 0: Received 10 char(s) from task 0 with tag 99 
Task 0: Received 10 char(s) from task 0 with tag 999 
순위는 제로

c) I am: 1 

d) I am: 0 

1 내지 변경 같다) 사이의 C)와 (D) 또한 (대신) WORKER 1 WORKER 0 출력 INBUFFER 양해 것을 관찰한다.

무엇이 누락 되었습니까? THX 당신이없는 것은 당신이 하나 개의 요소의 배열로 Stat을 선언한다는 것입니다

답변

1

:

#define TRANSACTIONS 1 
MPI_Status Stat[TRANSACTIONS]; 

하지만 당신은 배열 Stat[1]의 (아웃 오브 바운드) 두 번째 요소를 참조하십시오

rc = MPI_Recv(baseaddr, NUM, MPI_CHAR, source, 99, MPI_COMM_WORLD, &Stat[1]); 
//                 ^^^^^^^ 

이렇게하면 rank을 포함하여 일부 스택 메모리를 덮어 쓰게됩니다.