当我只编译脚本时
#include <mpi.h>
Run Code Online (Sandbox Code Playgroud)
它告诉我没有这样的文件或目录.但是当我包含mpi.h的路径时
#include "/usr/include/mpi/mpi.h"
Run Code Online (Sandbox Code Playgroud)
(路径是正确的)它返回:
In file included from /usr/include/mpi/mpi.h:2087:0,
from lbm.cc:7:
/usr/include/mpi/openmpi/ompi/mpi/cxx/mpicxx.h:35:17: fatal error: mpi.h: No such file or directory
#include "mpi.h"
^
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
有人知道怎么修这个东西吗?
我想知道什么时候需要使用屏障?例如,在分散/聚集之前/之后我需要它吗?或者OMPI应该确保在分散/收集之前所有进程都已达到这一点?同样,在广播之后我可以期望所有进程都已收到消息吗?
通常当我使用mpirun时,我可以"超载"它,使用的处理器比我的计算机上的处理器多.例如,在我的四核mac上,我可以运行mpirun -np 29 python -c "print 'hey'"没问题.我现在在另一台机器上,这会引发以下错误:
$ mpirun -np 25 python -c "print 'hey'"
--------------------------------------------------------------------------
There are not enough slots available in the system to satisfy the 25 slots
that were requested by the application:
python
Either request fewer slots for your application, or make more slots available
for use.
--------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
为什么不"超频"mpirun在这里工作?有没有办法可以克服此错误消息并使用比可用处理器更多的处理器成功运行?
我知道MPI_Send()是一个阻塞调用,它等待修改应用程序缓冲区以便重用是安全的.为了使发送调用同步(应该与接收器握手),我们需要使用MPI_Ssend().我想知道两者之间的区别.假设我需要在进程中发送固定数量的字节,哪一个应该花费更长的时间?
对我来说,代码适用于MPI_Send()调用,但无限期地等待MPI_Ssend().可能的原因是什么?
最重要的是,我非常确定在使用时接收过程中正在接收数据MPI_Send(),因此这种推断无助于在使用时等待握手MPI_Ssend().
或者我可以得出结论:MPI_Send()您可以将数据发送到自我过程但不能使用MPI_Ssend()?
我在具有OpenMPI的服务器上编译我的代码,但我需要知道我在哪个版本,所以我可以阅读正确的文档.是否有一个常数<mpi.h>,我可以打印显示我当前的版本?
我想在我的Kubernetes集群上运行MPI作业.上下文是我实际上运行的是一个现代的,包装良好的容器化应用程序,但部分工作量是一个传统的MPI工作,不会很快重写,我想把它变成一个kubernetes"世界观"尽可能地.
最初的一个问题:是否有人在kube集群上运行MPI作业有任何成功?我见过Christian Kniep的工作是让MPI工作在Docker容器中运行,但是他正在沿着docker swarm路径(使用每个容器中运行的consul发现同行)并且我想坚持kubernetes(已经知道了所有同行)并从外部将此信息注入容器中.我完全可以控制应用程序的所有部分,例如,我可以选择使用哪个MPI实现.
关于如何继续,我有几个想法:
包含slurm和应用程序代码的胖容器 - >在容器启动时使用适当的信息填充slurm.conf - >使用srun作为容器入口点来启动作业
仅使用OpenMPI(无淤泥)的更轻薄的容器 - >使用外部信息(由kubernetes提供)在容器中填充rankfile - >使用mpirun作为容器入口点
更简洁的方法,我基本上通过设置一些环境变量(例如OpenMPI ORTE)来"伪造"MPI运行时 - >直接运行mpicc'd二进制文件(通过env vars可以找到它的同行) )
一些其他选择
绝望地放弃
我知道尝试将"已建立"的工作流程(如MPI)与kubernetes和容器的"新热点"混合起来有点阻抗不匹配,但我只是在寻找指针/陷阱之前我走得太远了.如果什么都不存在,我很乐意破解一些东西并将其推回上游.
我正试图在debian 7上使用openmpi和mpirun运行这个示例hello world程序.
#include <stdio.h>
#include <mpi/mpi.h>
int main (int argc, char **argv) {
int nProcId, nProcNo;
int nNameLen;
char szMachineName[MPI_MAX_PROCESSOR_NAME];
MPI_Init (&argc, &argv); // Start up MPI
MPI_Comm_size (MPI_COMM_WORLD,&nProcNo); // Find out number of processes
MPI_Comm_rank (MPI_COMM_WORLD, &nProcId); // Find out process rank
MPI_Get_processor_name (szMachineName, &nNameLen); // Get machine name
printf ("Hello World from process %d on %s\r\n", nProcId, szMachineName);
if (nProcId == 0)
printf ("Number of Processes: %d\r\n", nProcNo);
MPI_Finalize (); // Shut down MPI
return 0;
} …Run Code Online (Sandbox Code Playgroud) 当我尝试制作CUDA 5.0样本时,会出现错误:
Makefile:79:*未找到MPI,没有构建simpleMPI ..停止.
我已经尝试下载并构建最新版本的Open MPI,以支持Open MPI"FAQ/Platforms/OS X/6.我如何不使用OS X捆绑的Open MPI?" 页面,它没有解决错误.
make -j 4 2>&1 | tee make.out
[ lots of output ]
make[2]: *** [mpi/man/man3/MPI_Comm_disconnect.3] Error 127
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive] Error 1
Run Code Online (Sandbox Code Playgroud)
我现在很困惑,我不知道该怎么办.
我正在研究一种模拟波浪能转换器的工具,我需要将两个软件包相互耦合.一个程序用Fortran编写,另一个用C++编写.我需要在每个时间步骤将Fortran程序中的信息发送到C++程序.但是,在将数据发送到C++程序之前,首先需要在Python中处理数据.我收到了一条使用MPI在程序之间传输数据的提示.
我现在正在尝试从Fortran代码向Python发送一个简单的字符串,但Python代码卡在receive命令中.
我的Fortran代码如下所示:
USE GlobalVariables
USE MPI
IMPLICIT NONE
CHARACTER(LEN=10):: astring
INTEGER :: comm, rank, size, mpierr
! Initialize MPI on first timestep
IF(tstep .LT. 2) THEN
call MPI_INIT(mpierr)
ENDIF
! make string to send to python
astring = "TEST"
! MPI Test
call MPI_Comm_size(MPI_COMM_WORLD, size, mpierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, mpierr)
! Send message to python
CALL MPI_SEND(astring, len(astring), MPI_CHARACTER, 0, 22, MPI_COMM_WORLD, mpierr)
print *, 'MPI MESSAGE SENT ', mpierr
! Initialize MPI on first timestep
IF(tstep .EQ. Nsteps-1) …Run Code Online (Sandbox Code Playgroud)