- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 PyOpt 运行一些并行优化。棘手的部分是,在我的目标函数中,我还想使用 mpi 运行 C++ 代码。
我的 python 脚本如下:
#!/usr/bin/env python
# Standard Python modules
import os, sys, time, math
import subprocess
# External Python modules
try:
from mpi4py import MPI
comm = MPI.COMM_WORLD
myrank = comm.Get_rank()
except:
raise ImportError('mpi4py is required for parallelization')
# Extension modules
from pyOpt import Optimization
from pyOpt import ALPSO
# Predefine the BashCommand
RunCprogram = "mpirun -np 2 CProgram" # Parallel C++ program
#########################
def objfunc(x):
f = -(((math.sin(2*math.pi*x[0])**3)*math.sin(2*math.pi*x[1]))/((x[0]**3)*(x[0]+x[1])))
# Run CProgram
os.system(RunCprogram) #where the mpirun call occurs
g = [0.0]*2
g[0] = x[0]**2 - x[1] + 1
g[1] = 1 - x[0] + (x[1]-4)**2
time.sleep(0.01)
fail = 0
return f,g, fail
# Instantiate Optimization Problem
opt_prob = Optimization('Thermal Conductivity Optimization',objfunc)
opt_prob.addVar('x1','c',lower=5.0,upper=1e-6,value=10.0)
opt_prob.addVar('x2','c',lower=5.0,upper=1e-6,value=10.0)
opt_prob.addObj('f')
opt_prob.addCon('g1','i')
opt_prob.addCon('g2','i')
# Solve Problem (DPM-Parallelization)
alpso_dpm = ALPSO(pll_type='DPM')
alpso_dpm.setOption('fileout',0)
alpso_dpm(opt_prob)
print opt_prob.solution(0)
我使用以下代码运行该代码:
mpirun -np 20 python Script.py
但是,我收到以下错误:
[user:28323] *** Process received signal ***
[user:28323] Signal: Segmentation fault (11)
[user:28323] Signal code: Address not mapped (1)
[user:28323] Failing at address: (nil)
[user:28323] [ 0] /lib64/libpthread.so.0() [0x3ccfc0f500]
[user:28323] *** End of error message ***
我发现 2 个不同的 mpirun
调用(调用 python 脚本的调用和脚本中的调用)相互冲突。关于如何解决这个问题的任何线索?
谢谢!!
最佳答案
参见 Calling mpi binary in serial as subprocess of mpi application : 最安全的方法是使用 MPI_Comm_spawn()
.看看this manager-worker example例如。
一个快速的解决方法是使用 subprocess.Popen
作为@EdSmith 的信号。然而,请注意 subprocess.Popen
的默认行为使用父环境。我的猜测是 os.system()
也是一样的。不幸的是,一些环境变量是由 mpirun 添加的,具体取决于 MPI 实现,例如 OMPI_COMM_WORLD_RANK
或 OMPI_MCA_orte_ess_num_procs
。要查看这些环境变量,请键入 import os ;在 mpi4py 代码和基本的 python shell 中打印 os.environ
。这些环境变量可能会导致子流程失败。所以我不得不添加一行来摆脱它们......这很脏......归结为:
args = shlex.split(RunCprogram)
env=os.environ
# to remove all environment variables with "MPI" in it...rather dirty...
new_env = {k: v for k, v in env.iteritems() if "MPI" not in k}
#print new_env
# shell=True : watch for security issues...
p = subprocess.Popen(RunCprogram,shell=True, env=new_env,stdout=subprocess.PIPE, stdin=subprocess.PIPE)
p.wait()
result="process myrank "+str(myrank)+" got "+p.stdout.read()
print result
完整的测试代码,由 mpirun -np 2 python opti.py
运行:
#!/usr/bin/env python
# Standard Python modules
import os, sys, time, math
import subprocess
import shlex
# External Python modules
try:
from mpi4py import MPI
comm = MPI.COMM_WORLD
myrank = comm.Get_rank()
except:
raise ImportError('mpi4py is required for parallelization')
# Predefine the BashCommand
RunCprogram = "mpirun -np 2 main" # Parallel C++ program
#########################
def objfunc(x):
f = -(((math.sin(2*math.pi*x[0])**3)*math.sin(2*math.pi*x[1]))/((x[0]**3)*(x[0]+x[1])))
# Run CProgram
#os.system(RunCprogram) #where the mpirun call occurs
args = shlex.split(RunCprogram)
env=os.environ
new_env = {k: v for k, v in env.iteritems() if "MPI" not in k}
#print new_env
p = subprocess.Popen(RunCprogram,shell=True, env=new_env,stdout=subprocess.PIPE, stdin=subprocess.PIPE)
p.wait()
result="process myrank "+str(myrank)+" got "+p.stdout.read()
print result
g = [0.0]*2
g[0] = x[0]**2 - x[1] + 1
g[1] = 1 - x[0] + (x[1]-4)**2
time.sleep(0.01)
fail = 0
return f,g, fail
print objfunc([1.0,0.0])
Basic worker,由mpiCC main.cpp -o main
编译:
#include "mpi.h"
int main(int argc, char* argv[]) {
int rank, size;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
if(rank==0){
std::cout<<" size "<<size<<std::endl;
}
MPI_Finalize();
return 0;
}
关于带有对 mpirun 的嵌入式调用的 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384649/
我使用 MPI_Open_port 在 MPI 中实现了点对点连接和 MPI_Comm_accept .我使用运行服务器和客户端程序 rafael@server1:~$ mpirun server r
我在集群中运行。我试图用 4 种不同的形式运行我的可执行文件: 在串行,与 myexec 这开始在 stdout 中给出输出马上,正如预期的那样。 串行,重定向 stdout和 stderr , 和
通常当我使用 mpirun 时,我可以“重载”它,使用比我计算机上实际使用的处理器更多的处理器。例如,在我的四核 mac 上,我可以运行 mpirun -np 29 python -c "print
据我所知,mpirun 和 mpiexec 都是启动器。有人能说出 mpiexec 和 mpirun 之间的确切区别吗? 最佳答案 mpiexec 是在 MPI 标准中定义的(嗯,至少是最近的版本),
-------------------------------------------------------------------------- MPI_ABORT was inv
显然,mpirun使用 SIGINT 处理程序将 SIGINT 信号“转发”到它产生的每个进程。 这意味着您可以为启用了 mpi 的代码编写中断处理程序,执行 mpirun -np 3 my-mpi-
我在使用 OpenMPI 编译此代码时遇到问题。由于我对使用 OpenMPI 的概念有点陌生,如果你们中的任何人能给我提示以指出此处的错误,那就太好了。编译工作正常,但如果我运行代码,我会收到此消息:
我需要做一个小的 openMP 项目。我以 www.openmp.org 为例。我可以在 VC++ 2005 中使用/openmp 选项对其进行编译。但是,当我尝试运行该程序时,我遇到了“'mpiru
mpirun(和 mpiexec)似乎没有将命令行参数传递给我的 C 代码。 直接从命令行运行我的可执行文件“gecko”会给出预期的结果: $ ./gecko -np 2 main:There a
我的 MPI 程序如何检测它是作为独立应用程序启动还是通过 mpirun 启动? 最佳答案 没有 MPI 标准方法来区分直接启动的 MPI 应用程序或作为与 mpirun 的单一等级之间的区别。有关此
我对 3 件事感到困惑:mpirun、mpiexec 和 mpiexec.hydra 在我的集群上,它们都存在,并且都属于intel。 它们之间有什么区别和关系?特别是,mpiexec.hydra 到
我尝试运行一个程序: ~/mpich3/bin/mpirun --hostfile hosts_8_12.txt python simulation.py 但我收到此错误: [mpiexec@pome
我正在桌面上测试一个简单的 MPI 程序(Ubuntu LTS 16.04/Intel® Core™ i3-6100U CPU @ 2.30GHz × 4/gcc 4.8.5/OpenMPI 3.0.
我是 openMPI 的新手,我无法理解这些概念。 (我发现 this 很有帮助) 1- 谁能简要解释一下我们为什么使用 openMPI?据我了解,OpenMPI 用于并行化那些可以并行运行的代码部分
这是我的脚本和 python 代码。 $猫走 while true do echo "------->" python3 -m mpi4py ./go.py echo " -------> -----
我有一个简单的程序,我想在多台计算机上分散结构,但似乎我定义的数据类型不正确,即使程序编译正常。我有以下代码。 #include #include #include typedef struct
我正在尝试运行我在两台机器上使用 MPI 编写的程序。当使用 MPIRUN 启动时,它在本地机器上使用 4 个内核运行得非常好。我已经配置了ssh,这样本地机器就可以不用密码登录远程机器了。每当我运行
我正在尝试使用 PyOpt 运行一些并行优化。棘手的部分是,在我的目标函数中,我还想使用 mpi 运行 C++ 代码。 我的 python 脚本如下: #!/usr/bin/env python
如何使用 mpirun 的 -machine 标志? 要选择要在哪个集群节点上执行,我想出了像这样使用 mpirun 的 -machinefile 选项 > mpirun -machinefile $
我最近在看 this post关于mpirun对比mpiexec和 this post关于srun对比sbatch , 但我想知道如何 mpirun与 slurm 和 srun 有关. 通常在我看到的
我是一名优秀的程序员,十分优秀!