-1

我想找到用 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

4

2 回答 2

1

这是什么意思?

这意味着您可能必须查看源代码并尝试了解它的工作原理。高性能标记已经指向正确的 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 启动器执行,在大多数情况下称为mpiexecmpirun。它将进程数作为参数。如果您不通过 运行代码mpiexec,大多数 MPI 实现的行为就好像程序是使用

mpiexec -np 1 ./program

1不是偶数,因此if条件的第一部分计算为真,中止代码被执行。

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

你提到代码::块。有关如何使其运行 MPI 程序的一些想法,请参见此处mpiexec

于 2012-10-22T11:11:52.850 回答
0

在 MPI 程序执行期间获取进程数的常用方法是调用MPI_COMM_SIZE子程序,像这样

call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr)

其中num_procs是一个整数,它将等于调用完成后的进程数。我希望您所说的任务与我所说的流程相同。

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

于 2012-10-22T08:47:29.427 回答