Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI仅识别C中的1个进程?_C_Multithreading_Mpi - Fatal编程技术网

MPI仅识别C中的1个进程?

MPI仅识别C中的1个进程?,c,multithreading,mpi,C,Multithreading,Mpi,我正在学习C语言并行编程的MPI,我正在使用一个4核处理器。我试图从一个教程中做一个示例,其中的输出应该是: Hello world! I'm process 0 out of 4 processes Hello world! I'm process 2 out of 4 processes Hello world! I'm process 1 out of 4 processes Hello world! I'm process 3 out of 4 processes 以任何顺序 这是我的

我正在学习C语言并行编程的MPI,我正在使用一个4核处理器。我试图从一个教程中做一个示例,其中的输出应该是:

Hello world! I'm process 0 out of 4 processes
Hello world! I'm process 2 out of 4 processes
Hello world! I'm process 1 out of 4 processes
Hello world! I'm process 3 out of 4 processes
以任何顺序

这是我的密码:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char** argv)
{
  int ierr, num_procs, my_id;
  ierr = MPI_Init(&argc, &argv);

  ierr = MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
  ierr = MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

  printf("Hello world! I'm process %i out of %i processes\n", my_id, num_procs);
  ierr = MPI_Finalize();
}
我使用以下方法运行它:

mpicc helloworld.c -o helloworld
mpirun -np 4 helloworld
这是输出的内容:

Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
它输出了4次,我想这是一个相对好的消息,但是程序无法识别线程的数量和每个线程ID

它是并行运行还是串行运行4次? 如何让程序正确识别线程数量和线程ID

提前谢谢

mpicc helloworld.c -o helloworld

mpirun -np 4 helloworld

Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
Hello world! I'm process 0 out of 1 processes
这个序列清楚地告诉我们,您的MPI运行时无法检测并行启动,这可能是因为配置错误:您的
mpicc
来自一个MPI实现,而您的
mpirun
来自另一个MPI实现。例如,MPICH和OpenMPI都有用于编译MPI程序的
mpicc
脚本,但它们的
mpiexec
/
mpirun
程序不兼容。使用MPICH编译,使用OpenMPI启动程序启动,MPICH运行时将不会收到计算并行运行及其参数所需的环境变量

您应该重新查看已安装软件包的列表(
dpkg-l | egrep'mpich | openmpi'
)并检查哪个文件来自哪个库(
dpkg-l mpich
dpkg-l openmpi bin
dpkg-l libmpich dev
dpkg-l libopenmpi dev
)。Ubuntu/debian还有一个“替代品”系统,它将安装到实际脚本的符号链接
mpicc
mpirun
(do
ls-l/usr/bin/mpicc/usr/bin/mpirun
,以查看链接的当前状态)。检查
updatealternatives
tool,了解如何将所有mpi命名脚本重置为一个实现(并且有
galtentives
GUI)

根据软件包中的文件列表,mpich和openmpi具有带有后缀的mpirun/mpiexec变体:

mpicc脚本的情况相同:

始终使用来自同一实现的mpicc和mpirun(或mpiexec)。您还可以使用带有后缀的变体来确保:
mpicc.openmpi
&
mpiexec.openmpi
pair或
mpicc.mpich
&
mpiexec.mpich
pair


要使用一些MPI实现,您应该完全安装它,包括bin、lib和dev包。

您使用的是哪个MPI库?mpich。我通过sudo找到的图书馆很容易得到mpich。除此之外,我什么也没做过@请检查您使用的
mpirun
是否确实来自同一个MPI库mpich(提供mpicc),而不是来自openmpi。(mpich有
mpiexec
,openmpi有
mpirun
;脚本使用的环境变量集不同,因此mpirun无法确保程序处于并行启动状态)。我该如何做?一般来说,我对MPI和并行编程非常陌生,我找不到任何地方教我如何设置它。我也尝试过使用相同参数的mpiexec,但它在终端中产生相同的结果:
mpirun--version
应该会提供一些信息
/usr/bin/mpiexec.openmpi
/usr/bin/mpirun.openmpi
/usr/bin/mpiexec.hydra
/usr/bin/mpiexec.mpich
/usr/bin/mpirun.mpich
/usr/bin/mpicc.openmpi
/usr/bin/mpicc.mpich