MPI素数

时间:2012-10-22 08:39:59

标签: parallel-processing mpi primes

我想找到并行算法,用mpi库查找素数。我找到了这个但是当我在代码块上运行时,总是得到

    Sorry - this exercise requires an even number of tasks.
   evenly divisible into 2500000 .  Try 4 or 8.



 What it means?how can i obtain number of tasks.

https://computing.llnl.gov/tutorials/mpi/samples/C/mpi_prime.c

2 个答案:

答案 0 :(得分:1)

  

这意味着什么?

这意味着您可能需要查看源代码并尝试了解其工作原理。高性能Mark已经指出了正确的MPI调用,如果你看一下main函数的开头,你会看到以下几行:

MPI_Comm_size(MPI_COMM_WORLD,&ntasks);
if (((ntasks%2) !=0) || ((LIMIT%ntasks) !=0)) {
   printf("Sorry - this exercise requires an even number of tasks.\n");
   printf("evenly divisible into %d.  Try 4 or 8.\n",LIMIT);
   MPI_Finalize();
   exit(0);
   }

显然它需要偶数个MPI进程(否则为ntasks%2 != 0),这个数字也应该除LIMIT(在这种情况下等于2500000)。 MPI程序应该通过MPI启动程序执行,MPI启动程序在大多数情况下称为mpiexecmpirun。它将进程数作为参数。如果您不通过mpiexec运行代码,则大多数MPI实现的行为就像使用

启动程序一样
mpiexec -np 1 ./program

1不是偶数,因此if条件的第一部分求值为true,并且执行中止代码。

您应该使用mpiexec -np <# of procs> executable在终端中运行程序,其中<# of procs>是所需的MPI进程数,executable是可执行文件的名称。 <# of procs>应该是均匀的,应该划分2500000。我建议您使用24810也会这样做。除非您的开发系统具有多核CPU或/和多个CPU,否则您不会看到速度有任何改进。

你提到Code :: Blocks。有关如何通过mpiexec运行MPI程序的一些想法,请参阅here

答案 1 :(得分:0)

在执行MPI程序期间获取进程数的通常方法是调用MPI_COMM_SIZE子例程,如下所示

call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr)

其中num_procs是一个整数,它等于调用完成后的进程数。我希望您所谓的任务与我称之为进程的内容相同。

请注意,我已经在Fortran中编写了调用,C和C ++绑定也可用,虽然后者似乎不受欢迎。