0

我正在研究一点 MPI,并决定通过制作一个调用对象的程序来进行测试,例如main.c-> 主程序,function.c-> 任何函数

仅使用 MPI 的 function.c。编译我如下:

gcc-c main.c

创建main.ompicc-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");
}

只是函数有 MPI 代码,但是当我运行程序时,mpiexe -np 2我得到

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

但我希望它是

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

我能做些什么?

4

3 回答 3

1

您的整个程序在您使用-np 2. 防止重复打印输出、最终结果等的一种常用方法是让一个线程通过首先检查线程 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 编号以及每个线程正在处理的任何部分结果或数据很有帮助。帮助我更了解正在发生的事情。

于 2012-04-18T01:09:42.667 回答
0

基本上mpirun -np 2启动 2 个相同的进程,你必须使用MPI_Comm_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;
}
于 2012-04-18T01:06:20.810 回答
0

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

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

      ******* barrier ********
  end for
done

如果打印值的线程集不包括所有线程,只需将相关线程添加到屏障。

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

  1. 您不必访问障碍
  2. 您不会丢失任何线程的 printfs
  3. 你的输出是明确的。因此在调试程序时不会造成混乱。

代码 :

sprintf(my_op_file_str, "output%d", myThreadID);
close(1)
open(my_op_file_str)

Now use printf's anywhere you may like.
于 2012-04-18T05:54:43.267 回答