C MPI 2x打印

C MPI 2x打印,c,parallel-processing,printf,mpi,C,Parallel Processing,Printf,Mpi,我正在学习一点MPI,决定做一个调用对象的程序来做一个测试,例如main.c->main程序,function.c->任何函数 只使用MPI的函数.c。汇编一如下: gcc-c main.c 要创建main.o,mpicc-c要创建function.cfunction.o,当然我也要创建文件function.h 我使用mpicc-o程序main.ofunction.o 这里是main.c #include <stdio.h> #include "function.h" void

我正在学习一点MPI,决定做一个调用对象的程序来做一个测试,例如
main.c
->main程序,
function.c
->任何函数

只使用MPI的函数.c。汇编一如下:

gcc-c main.c
要创建
main.o
mpicc-c
要创建
function.c
function.o
,当然我也要创建文件
function.h

我使用
mpicc-o
程序
main.o
function.o

这里是
main.c

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

void main(int argc, char *argv[])
{
  printf("Hello\n");
  function();
  printf("Bye\n");
}
但我希望是这样

Hello
------ function job -----
Bye

我能做什么?

基本上
mpirun-np2
启动两个相同的进程,您必须使用
MPI\u Comm\u rank
函数检查进程排名

下面是一个简短的片段:

int main(int argc, char **argv)
{
  int myrank;
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  if (myrank == 0) {
    printf("Hello\n");
    function();
    MPI_Barrier(MPI_COMM_WORLD);
    printf("Done\n");
  } else {
    function();
    MPI_Barrier(MPI_COMM_WORLD);
  }
  MPI_Finalize();
  return 0;
}

整个程序在您使用
-np2
设置的两个处理器上运行。防止打印输出、最终结果等重复的一种常见方法是让一个线程只需首先检查线程id即可完成这些操作。比如:

int id;
MPI_Comm_rank(MPI_COMM_WORLD, &id);
if (id == 0) {
  printf("only process %d does this one\n", id);
}

printf("hello from process %d\n", id);  // all processes do this one

在开始使用MPI时,我发现打印出这些id号以及每个线程处理的部分结果或数据很有帮助。帮助我更好地理解正在发生的事情。

我通常更喜欢这种打印数据的方法。 它涉及障碍。所以你在使用它的时候一定要小心

if(1)
do
  for(i = 0 to num_threads)
  do
     if(i==my_rank)
     do
       do_printf
     done

      ******* barrier ********
  end for
done
如果打印值的线程集不包括所有线程,只需将相关线程添加到barrier

另一种方法是让每个线程将其输出写入专用文件。这样:

  • 你不必进入障碍物
  • 您不会丢失任何线程的printfs
  • 您的输出是显式的。因此,在调试程序时不会出现混乱
  • 代码:

    sprintf(my_op_file_str, "output%d", myThreadID);
    close(1)
    open(my_op_file_str)
    
    Now use printf's anywhere you may like.
    

    所以,在每个例程中,我必须使用MPI_Comm_rank并只打印1个列,但我也需要在每个例程中调用MPI_Init?您不需要在外部函数中调用MPI_Init,只需在
    main
    sprintf(my_op_file_str, "output%d", myThreadID);
    close(1)
    open(my_op_file_str)
    
    Now use printf's anywhere you may like.