OpenMPI for C++:函数内部的排名变化显然是无缘无故的
openmpi for c++: rank changes inside function apparently without reason.
以下代码生成粘贴在下面的输出
#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: %dn", rank);
rc = MPI_Send(outmsg, NUM, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
printf("OUTBUFFER OF WORKER %d: %sn", rank, outmsg);
printf("b) I am: %dn", 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: %sn", rank, outmsg);
//rc = MPI_Recv(inmsg, NUM, MPI_CHAR, source, tag, MPI_COMM_WORLD, &Stat);
printf("c) I am: %dn", rank);
}
else if (rank == 1) {
dest = 0;
source = 0;
printf("d) I am: %dn", 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: %dn", rank);
printf("INBUFFER OF WORKER %d: %sn", 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: %dn", rank);
printf("INBUFFER OF WORKER %d: %sn", 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: %sn", rank, outmsg);
printf("a) I am: %dn", rank);
baseaddr = outmsg + NUM;
//rc = MPI_Send(baseaddr, NUM, MPI_CHAR, dest, 999, MPI_COMM_WORLD);
printf("OUTBUFFER OF WORKER %d: %sn", rank, outmsg);
printf("b) I am: %dn", 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: %sn", rank, inmsg);
printf("c) I am: %dn", rank);
baseaddr = inmsg + NUM;
rc = MPI_Recv(baseaddr, NUM, MPI_CHAR, source, 99, MPI_COMM_WORLD, &Stat[1]);
printf("INBUFFER OF WORKER %d: %sn", rank, inmsg);
printf("d) I am: %dn", 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) 和 d) 之间,秩似乎从 1 变为零
c) I am: 1
d) I am: 0
另请注意工作线程 0 输出的 INBUFFER(而不是工作线程 1)。
我错过了什么?感谢
你缺少的是你声明Stat
是一个元素的数组:
#define TRANSACTIONS 1
MPI_Status Stat[TRANSACTIONS];
但是你引用数组的(越界)第二个元素Stat[1]
:
rc = MPI_Recv(baseaddr, NUM, MPI_CHAR, source, 99, MPI_COMM_WORLD, &Stat[1]);
// ^^^^^^^
这会导致一些堆栈内存被覆盖,包括保存rank
的堆栈内存。
相关文章:
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么预减量会导致奇怪的变化?
- MATLAB:跟踪imufilter对象中的状态变化
- 调用函数时,变量突然无缘无故地更改
- 无缘无故地抛出实例
- C++数据无缘无故地变化
- OpenMPI for C++:函数内部的排名变化显然是无缘无故的