标签: mpich

mpiexec.hydra - 如何在hydra_pmi_proxy位置不同的机器上运行MPI进程?

我试图在两台机器的集群上使用MPICH运行一个简单的MPI程序.然而,一个正在运行Fedora 17而另一个正在运行Debian Squeeze - 不一定是个问题,但问题是两个发行版将他们的mpi执行者放在不同的目录中:

当我从host1运行以下内容时:

mpiexec -hosts host2 -np 1 -wdir /home/chris/src/mpi/ ./mpitest
Run Code Online (Sandbox Code Playgroud)

它失败并出现以下错误

bash: /usr/lib/mpich2/bin/hydra_pmi_proxy: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这似乎是因为hydra_pmi_proxy安装在/usr/lib/mpich2/binFedora机器上而是安装在/usr/binDebian机器上.我假设当我通过ssh从host1生成进程时,它希望在host2上的相同位置找到hydra_pmi_proxy.

如果我只是在该节点上本地运行它,程序在两台机器上运行正常 - 我在尝试在两者上运行它时只会遇到问题.

我已经在MPICH文档中搜索了一种覆盖远程路径的方法hydra_pmi_proxy,但无济于事.

我能以某种方式这样做吗?我认为MPICH的一个优点是它可以轻松处理hetrogeneous host ....

任何见解都将非常感激!

mpi mpich

6
推荐指数
1
解决办法
1万
查看次数

MPI:MPICH2使用Windows在LAN中安装和编程

我正在学习MPI.我遵循的第一个教程就在这里

我在Windows 7上使用MSVC 2010成功运行的代码是:

#include "mpi.h"
#include "iostream.h"

int main(int argc,char *argv [])
{
   int numtasks, rank, rc; 
   rc = MPI_Init(&argc,&argv);
   if (rc != MPI_SUCCESS) {
       printf ("Error starting MPI program. Terminating.\n");
       MPI_Abort(MPI_COMM_WORLD, rc);
   } 
   MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
   printf ("Number of tasks= %d My rank= %d\n", numtasks,rank);
   MPI_Finalize();
}
Run Code Online (Sandbox Code Playgroud)

我在Pentium-4机器上成功运行了这个代码(不要惊讶我还有一台Pentium-4).

现在我想在以太网LAN中连接的多台机器上运行此代码(或任何其他MPI代码).比如说每台机器总和1到1000,然后发送回主节点,主节点然后添加所有这些数字以获得最终总和.

我的问题是如何在网络中启动MPI编程?我应该在每台机器上运行所有工具/软件.

如果你能给我一个教程指针,我将非常感激.

MPI Implemnetation: MPICH2 
O.S:each machine is having Windows 7, 32 bit CPU: Intel's Pentium 4 and Dual core 
Network: Ethernet 
IDE:MSVC2010
Run Code Online (Sandbox Code Playgroud)

更新:

我用Jev的答案清除了一些疑虑.我最近的问题是:

我是否在每台机器上安装MPICH2.在cfg文件中每行写入每台机器的名称后,我是否还需要执行其他操作或只是给出命令:

<path-to-mpich2>/bin/mpiexec.exe -machinefile hosts.cfg …
Run Code Online (Sandbox Code Playgroud)

mpi mpich

6
推荐指数
1
解决办法
2460
查看次数

确保混合 MPI/OpenMP 在不同的内核上运行每个 OpenMP 线程

我正在尝试运行混合 OpenMP/MPI 作业,以便 OpenMP 线程由内核分隔(每个内核只有一个线程)。我已经看到其他使用 numa-ctl 和 bash 脚本来设置环境变量的答案,我不想这样做。

我希望只能通过在命令行上设置 OMP_NUM_THREADS 和或 OMP_PROC_BIND 和 mpiexec 选项来做到这一点。我尝试了以下方法 - 假设我想要 2 个 MPI 进程,每个进程都有 2 个 OpenMP 线程,并且每个线程都在不同的内核上运行,所以我总共需要 4 个内核。

OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2 
Run Code Online (Sandbox Code Playgroud)

这将拆分作业,以便只有两个进程在工作,并且它们都在同一个 CPU 上,因此它们每个只使用大约 25% 的 CPU。如果我尝试:

OMP_PROC_BIND=false OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2
Run Code Online (Sandbox Code Playgroud)

然后,我只得到两个独立的 MPI 进程,每个进程都以 100% 或超过 100% 的 CPU 功率运行,根据 top。这似乎没有显示用于 OpenMP 线程的不同内核。

如何强制系统将单独的线程放在单独的内核上?

仅供参考,lscpu 打印:

-CPU(s):                48
-On-line CPU(s) list:   0-47
-Thread(s) per core:    2
-Core(s) per socket:    12
-Socket(s):             2
-NUMA node(s):          2
Run Code Online (Sandbox Code Playgroud)

hpc mpi openmp mpich

6
推荐指数
1
解决办法
1701
查看次数

打开MPI/MPICH - 如果节点终止会发生什么?

我想知道如果OpenMPI/MPICH2集群的节点终止会发生什么?是否有一些机制可以容忍这种情况并继续执行?

谢谢你的回答海因里希

distributed-computing cluster-computing mpi openmpi mpich

5
推荐指数
1
解决办法
1161
查看次数

使用Boost.MPI库的目的是什么?

使用Boost.MPI库的目的是什么?它会提高性能吗?它与MPICH库有什么区别?

c++ boost mpi mpich

5
推荐指数
2
解决办法
2997
查看次数

MPICH2无法在Windows 7中连接

每当我尝试命令mpiexec -n 4 testmpi.exe

无法连接到'RIJDZUAN-PC:8676',sock错误:通用套接字故障,错误堆栈:MPIDU_Sock_post_connect(1200):无法连接到端口8676上的RIJDZUAN-PC,前端所有端点(错误-1)MPIDU_Sock_post_connect(1247) ):无法连接到端口8676上的RIJDZUAN-PC,无法建立连接,因为目标计算机主动拒绝它.(错误10061)

当我尝试smpd -install或smpd -start给我

OpenSCManager失败:访问被拒绝.(错误5)

我相信我已经在mpiexec -register上注册了mpiexec

怎么解决这个?

mpi windows-7 mpich

5
推荐指数
1
解决办法
2万
查看次数

MPI中每个进程的随机数

我正在使用MPICH2来实现"Odd-Even"排序.我做了实现但是当我随机化到每个进程的值时,相同的数字被随机化到所有进程.

这是每个进程的代码,每个进程随机化他的值.

int main(int argc,char *argv[])
{
    int  nameLen, numProcs, myID;
    char processorName[MPI_MAX_PROCESSOR_NAME];
    int myValue;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&myID);
    MPI_Comm_size(MPI_COMM_WORLD,&numProcs);    
    MPI_Get_processor_name(processorName,&nameLen);
    MPI_Status status;

    srand((unsigned)time(NULL));
    myValue = rand()%30+1; 

    cout << "myID: " << myID << " value: " << myValue<<endl;
    MPI_Finalize();

    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

为什么每个过程都获得相同的价值?

编辑:谢谢你的答案:)

我换了线

 srand((unsigned)time(NULL));
Run Code Online (Sandbox Code Playgroud)

 srand((unsigned)time(NULL)+myID*numProcs + nameLen);
Run Code Online (Sandbox Code Playgroud)

它为每个进程提供不同的值:)

c++ random mpi mpich

5
推荐指数
1
解决办法
5885
查看次数

MPI_Comm_Create挂起而没有响应

我希望多播到不超过4台计算机的组中,MPI_bcast是否仍比多个单播节省大量时间(请注意我的组很小)?

给定机器的数量和这些机器的等级,我编写了以下函数来创建新的通信器。

void createCommunicator(MPI_Comm *NGBRS_WORLD, int num_ngbrs, int *ngbrs_ranks)
{
        MPI_Group NGBRS_GROUP, MPI_COMM_GROUP;

        int ret = MPI_Comm_group(MPI_COMM_WORLD, &MPI_COMM_GROUP);
        printf("RETURNED %d\n", ret);

        ret = MPI_Group_incl(MPI_COMM_GROUP, num_ngbrs, ngbrs_ranks, &NGBRS_GROUP);
        printf("RETURNED %d\n", ret);

        ret = MPI_Comm_create(MPI_COMM_WORLD, NGBRS_GROUP, NGBRS_WORLD);
        printf("RETURNED : %d\n", ret);
}
Run Code Online (Sandbox Code Playgroud)

当我调用此函数时,输出为:

RETURNED 0
RETURNED 0
Run Code Online (Sandbox Code Playgroud)

该程序只是挂在MPI_Comm_create

关于可能出什么问题或如何调试问题的任何想法?请注意,我已将ngbrs_ranks动态分配为num_ngbrs大小。

debugging mpi mpich

5
推荐指数
0
解决办法
372
查看次数

可以在互联网上而不是在LAN群集中分发MPI(C++)程序吗?

我写了一些MPI代码,可以在大型集群上完美运行.集群中的每个节点都具有相同的cpu体系结构,并且可以访问联网(即"公共")文件系统(这样每个节点都可以超越实际的二进制文件).但请考虑这种情况:

  • 我的办公室里有一台配有双核处理器(intel)的机器.
  • 我家里有一台带双核处理器的机器(amd).

两台机器都运行linux,两台机器都可以在本地成功编译和运行MPI代码(即使用2个内核).

现在,是否可以通过MPI将两台机器连接在一起,这样我就可以利用所有4个内核,同时考虑到不同的架构,并牢记没有共享(联网)文件系统的事实?

如果是这样,怎么样?

谢谢,本.

c++ mpi openmpi mpich mpic++

4
推荐指数
1
解决办法
884
查看次数

如何在MPI中创建新类型

我是MPI的新手,我想为其创建一个新的数据类型Residence struct.我只是想看看我是否可以正确地创建新类型.struct Residence {double x; 双y; };

我的新MPI类型

MPI_Datatype createRecType()
{
    // Set-up the arguments for the type constructor
    MPI_Datatype new_type;

    int count = 2;
    int blocklens[] = { 1,1 };

    MPI_Aint indices[2];
    //indices[0]=0;
    MPI_Type_extent( MPI_DOUBLE, &indices[0] );
    MPI_Type_extent( MPI_DOUBLE, &indices[1] );

    MPI_Datatype old_types[] = {MPI_DOUBLE,MPI_DOUBLE};

    MPI_Type_struct(count,blocklens,indices,old_types,&new_type);
    MPI_Type_commit(&new_type);

}
Run Code Online (Sandbox Code Playgroud)

c c++ cluster-computing mpi mpich

4
推荐指数
1
解决办法
3007
查看次数