我试图在两台机器的集群上使用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.我遵循的第一个教程就在这里
我在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) 我正在尝试运行混合 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) 我想知道如果OpenMPI/MPICH2集群的节点终止会发生什么?是否有一些机制可以容忍这种情况并继续执行?
谢谢你的回答海因里希
使用Boost.MPI库的目的是什么?它会提高性能吗?它与MPICH库有什么区别?
每当我尝试命令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
怎么解决这个?
我正在使用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)
它为每个进程提供不同的值:)
我希望多播到不超过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大小。
我写了一些MPI代码,可以在大型集群上完美运行.集群中的每个节点都具有相同的cpu体系结构,并且可以访问联网(即"公共")文件系统(这样每个节点都可以超越实际的二进制文件).但请考虑这种情况:
两台机器都运行linux,两台机器都可以在本地成功编译和运行MPI代码(即使用2个内核).
现在,是否可以通过MPI将两台机器连接在一起,这样我就可以利用所有4个内核,同时考虑到不同的架构,并牢记没有共享(联网)文件系统的事实?
如果是这样,怎么样?
谢谢,本.
我是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)