我想找到使用mpi库查找素数的paralel算法。我找到了这个,但是当我在代码块上运行时,我总是得到
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
这是什么意思?
这意味着您可能必须查看源代码并尝试了解它是如何工作的。高性能标记已经指向正确的 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启动器执行,在大多数情况下称为mpiexec
或mpirun
。它将进程数作为参数。如果不通过mpiexec
运行代码,则大多数 MPI 实现的行为就像程序是使用
mpiexec -np 1 ./program
1
不是偶数,因此if
条件的第一部分计算结果为 true,并执行中止代码。
您应该做的是使用mpiexec -np <# of procs> executable
在终端中运行程序,其中<# of procs>
是所需的 MPI 进程数,executable
是可执行文件的名称。<# of procs>
应该是均匀的,应该划分2500000
。我建议2
,4
或8
一起去。10
也会这样做。除非您的开发系统具有多核 CPU 或/和多个 CPU,否则您不会看到速度的任何提高。
你提到了代码::块。请参阅此处有关如何使其通过mpiexec
运行MPI程序的一些想法。
在执行 MPI 程序期间获取进程数的常用方法是调用MPI_COMM_SIZE
子例程,如下所示
call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr)
其中num_procs
是一个整数,它将等于调用完成后的进程数。 我希望你所说的任务与我所说的过程相同。
请注意,我已经用 Fortran 编写了调用,C 和 C++ 绑定也可用,尽管后者似乎失宠了。