运行多个进程,每个进程都有一组不同的环境变量值



我有很多工作。通常,我通过打开一些终端窗口来手动启动这些作业,并在每个终端窗口中将某些环境变量设置为不同的值,然后手动调用我的程序。例如:

Terminal 1 commands:
export OMP_NUM_THREADS=4
./run_application1.sh
Terminal 2 commands:
export OMP_NUM_THREADS=10
./run_application2.sh
.
.
.
Terminal 8 commands:
export OMP_NUM_THREADS=5
./run_application8.sh

您可以看到,在每个终端中,我调用了一些应用程序(run_applicationX.sh),每个应用程序对OMP_NUM_THREADS使用不同的值。现在我想编写一个脚本(bash或python,哪个最合适)来概括这一点。换句话说,我可以传递一个作业号(例如——jobs=2),以及一个长度等于——jobs的数组a[],以及一个N个应用程序的列表(run_application1.sh, ....)run_applicationN.sh)。然后我想要执行所有N个应用程序,在每个瞬间最多有——个作业应用程序并行运行。此外,每个应用程序都应该使用A[#当前作业号]中的值作为其环境变量。换句话说,我正在寻找这样的内容:

parfor i=1...N
export OMP_NUM_THREADS=${A[JOB NUMBER]}
./run_application{i}.sh

表示最多有——个job应用程序并行运行。最好的方法是什么?我知道可以使用GNU并行工具来执行此操作,但是我不确定如何根据当前的作业数分配一组不同的环境变量。注意,作业号是一个介于1和——jobs之间的整数,它保证不会同时使用同一组环境变量值。由于

我不清楚你想要什么,但让我们看看是否可以一起构建它。

app1() {
export OMP_NUM_THREADS=$1
sleep 1
echo app1 $OMP_NUM_THREADS
}
app2() {
export OMP_NUM_THREADS=$1
sleep 1
echo app2 $OMP_NUM_THREADS
}
app3() {
export OMP_NUM_THREADS=$1
sleep 1
echo app3 $OMP_NUM_THREADS
}
app4() {
export OMP_NUM_THREADS=$1
sleep 1
echo app4 $OMP_NUM_THREADS
}
export -f app1 app2 app3 app4
parallel app{1} {2} ::: 1 2 3 4 :::+ 2 3 5 7

或者使用Perl代码

计算基于作业数的OMP_NUM_THREADS
seq 4 | parallel app{} '{= $_= seq()*seq()+1 =}' 

为了保证没有两个作业使用相同的值(通常用于CUDA_VISIBLE_DEVICES),您可以使用作业槽号:

# 0..3
seq 10 | parallel -j 4 'CUDA_VISIBLE_DEVICES={= $_=slot()-1 =} app{}'

或:

# 1..4
seq 10 | parallel -j 4 'app{} {%}'

最新更新