![使用 bash 在处理器的多个内核中运行相同的程序](https://linux22.com/image/183480/%E4%BD%BF%E7%94%A8%20bash%20%E5%9C%A8%E5%A4%84%E7%90%86%E5%99%A8%E7%9A%84%E5%A4%9A%E4%B8%AA%E5%86%85%E6%A0%B8%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%9B%B8%E5%90%8C%E7%9A%84%E7%A8%8B%E5%BA%8F.png)
我有一个 8 核处理器,我想在其中 3 个核心上运行一系列实验,其中我针对一个实例运行 C++ 二进制文件。我能够使用 bash 对其进行并行化,但无法将核心数量限制为 3。
这是我的 bash 脚本
run_graph_algo1(){
./../bin/graph_algo1_cpp "$1" > "${1}.algo1.log"
}
for file in *.txt
do
run_graph_algo1 "$file" &
done
wait
echo "All Instances have finsihed running."
如果重要的话我会使用 MacOS,而且我宁愿不使用任何额外的库。谢谢!
答案1
如果您有 GNU Parallel:
run_graph_algo1(){
./../bin/graph_algo1_cpp "$1" > "${1}.algo1.log"
}
export -f run_graph_algo1
parallel -j3 run_graph_algo1 ::: *.txt
echo "All Instances have finsihed running."
GNU Parallel 正是为此类任务而构建的。
答案2
编辑:这是一个错误的解决方案。下面的程序将启动 3 个单独的任务,但它将等待所有三个任务完成,然后开始接下来的三个任务。我希望它在三个任务中的任何一个完成后启动下一个任务,以便在任何时间点(除了最后,总是有三个任务在运行)
经过进一步谷歌搜索,我找到了一个可行的解决方案。但如果有人能给出更优雅的解决方案,我会将其标记为正确的。
run_graph_algo1(){
./../bin/graph_algo1_cpp "$1" > "${1}.algo1.log"
}
N=3
#N = 4 just preserving this mistake
for file in *.txt
do
((i=i%N)); ((i++==0)) && wait
run_graph_algo1 "$file" &
done
wait
echo "All Instances have finsihed running."