Parallel processing MPI中的临界截面?

Parallel processing MPI中的临界截面?,parallel-processing,distributed,mpi,critical-section,Parallel Processing,Distributed,Mpi,Critical Section,我有一些代码可以将2D数组打印到标准输出。 问题是,当我运行它时,每个进程都会写入输出,并且数据会重叠,使其无法使用 如何在MPI中构建关键部分,以便一次只有一个进程进入显示输出的部分 我正在使用OpenMPI。使用MPI\u屏障将其分离出来 rank = 0; while (rank < total_processes) { if (myrank == rank) { printf ("Array printed by rank: %d\n", myrank);

我有一些代码可以将2D数组打印到标准输出。 问题是,当我运行它时,每个进程都会写入输出,并且数据会重叠,使其无法使用

如何在MPI中构建关键部分,以便一次只有一个进程进入显示输出的部分


我正在使用OpenMPI。

使用MPI\u屏障将其分离出来

rank = 0;
while (rank < total_processes) {
   if (myrank == rank) {
       printf ("Array printed by rank: %d\n", myrank);
       print_array();
       fflush (stdout);
   }
   rank ++;
   MPI_Barrier ();
}
rank=0;
while(秩
#包括
#包括“mpi.h”
void main(整型参数,字符**argv){
int i;
int nitems=5;
int totalnodes,mynode;
双*阵列;
int trap_key=0;
MPI_状态;
MPI_Init(&args,&argv);
MPI_Comm_大小(MPI_Comm_WORLD和totalnodes);
MPI通信等级(MPI通信世界和mynode);
数组=新的双精度[nitems];
对于(i=0;i你可能想在某个地方增加
排名
。:)谢谢你的回复!虽然稍微好一点,但仍然重叠:(那么,它似乎没有正常刷新。也许你应该尝试写入不同的文件。每个列组都可以写入输出_$rank.txt或类似的内容。是的,这是我最终的解决方案。我输出了多个文件。非常感谢!我有一个类似的问题,除了我尝试写入sqlite数据库。是否有更高效的我想让每个进程按照它们的顺序执行。MPI_send()和MPI_recv()会阻止点对点通信,所以当一个进程调用MPI_recv()时它进入忙等待状态,直到收到消息,MPI_send也会出现同样的情况,它等待消息传递到源。
#include<iostream>
#include"mpi.h"

void main(int args, char **argv) {
int i;
int nitems = 5 ;
int totalnodes, mynode;
double *array;
int trap_key = 0;
MPI_Status status;

MPI_Init(&args, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &totalnodes);
MPI_Comm_rank(MPI_COMM_WORLD, &mynode);

array = new double[nitems];

for (i = 0; i < nitems; i++)
    array[i] = double(i);

if (mynode != trap_key)  //this will allow only process 0 to skip this stmt
    MPI_Recv(&trap_key, 1, MPI_INT, mynode - 1, 0, MPI_COMM_WORLD, &status);

//here is the critical section 
cout << "I am Process: " << mynode << endl;
for (i = 0; i < nitems; i++) 
    cout << "array[" << i << "] =" << array[i] << endl;

if(mynode != totalnodes - 1)  // this will allow only the last process to
                              //skip this
    MPI_Send(&trap_key, 1, MPI_INT, mynode + 1, 0, MPI_COMM_WORLD);

MPI_Finalize(); 

}