内嵌mpirun调用的Python

2024-03-29 07:49:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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)

我使用以下方法运行代码:

^{pr2}$

但是,我得到了以下错误:

[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 ***

我发现两个不同的mpirun调用(调用python脚本的调用和脚本中的调用)是相互冲突的。 有什么线索可以解决这个问题吗?在

谢谢你!!在


Tags: 代码fromimport脚本modulesosmathdpm
1条回答
网友
1楼 · 发布于 2024-03-29 07:49:01

请参见Calling mpi binary in serial as subprocess of mpi application:最安全的方法是使用^{}。以this manager-worker example为例。在

一个快速的解决方法是使用subprocess.Popen,如@EdSmith所示。但是,请注意,subprocess.Popen的默认行为使用父环境。我的猜测是os.system()也是一样的。不幸的是,mpirun会根据MPI实现添加一些环境变量,例如OMPI_COMM_WORLD_RANK或{}。要查看这些环境变量,请在mpi4py代码和基本pythonshell中键入import os ; print os.environ。这些环境变量可能导致子进程失败。所以我不得不加上一行来除掉它们…这相当脏。。。归根结底是:

^{1}$

完成测试代码,由mpirun -np 2 python opti.py运行:

^{pr2}$

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;

}

相关问题 更多 >