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

running multiple processes, each with a different set of values for the environment variable

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

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 个应用程序,其中每个时刻最多 --jobs 应用程序是 运行ning 并行。此外,每个应用程序都应该使用 A[#current job number] 中的值作为其环境变量。换句话说,我正在寻找这样的东西:

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

最多 --jobs 应用程序曾经 运行 并行。做这个的最好方式是什么?我知道 GNU 并行工具可用于执行此操作,但我不确定如何根据当前作业编号分配一组不同的环境变量。请注意,作业编号是 1 和 --jobs 之间的整数,这保证绝不会同时使用同一组环境变量值。谢谢

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

app1() {
    export OMP_NUM_THREADS=
    sleep 1
    echo app1 $OMP_NUM_THREADS
}
app2() {
    export OMP_NUM_THREADS=
    sleep 1
    echo app2 $OMP_NUM_THREADS
}
app3() {
    export OMP_NUM_THREADS=
    sleep 1
    echo app3 $OMP_NUM_THREADS
}
app4() {
    export OMP_NUM_THREADS=
    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{} {%}'