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
을 선언한다는 것입니다