我有一个 C++ 程序,我想在 Linux 机器上并行运行,每个实例都是一个完全独立的进程,不与其他进程通信。有没有一种简单的方法可以执行以下操作:
- 统计当前机器上的CPU核心数。
- 对于 CPU 核心数,运行程序的一个实例,将每个实例分配给一个核心。
- 定期检查实例是否仍在运行,并在必要时重新启动实例。
答案1
统计当前机器上的CPU核心数。
有多种特殊文件和命令提供此信息,并且还有一些方法可以做到这一点以编程方式。最后一个链接可能是最好的选择,因为它考虑了 CPU 关联性设置。
对于 CPU 核心数,运行程序的一个实例,将每个实例分配给一个核心。
这听起来像是一个循环fork
和exec
。
定期检查实例是否仍在运行,并在必要时重新启动实例。
您可以使用wait
系统调用以查看是否有任何子进程已退出,如果是,则启动一个新实例。
上述解决方案允许您通过编写一些额外的 C/C++ 代码来满足您的要求。您可以在 shell 脚本中应用相同的原则。以下脚本sleep
在每个核心运行一次非常有趣的命令,确保命令退出时启动新命令以保持运行命令的数量sleep
不变:
#!/bin/bash
numprocs=$(nproc)
echo "There are $numprocs cores available"
while true; do
sleep $(( RANDOM % 10 )) &
(( running++ ))
echo "running=$running"
if (( running >= $numprocs )); then
wait -n -p pid
(( running-- ))
echo "$pid stopped"
fi
done
您可以执行类似的操作,将sleep
命令替换为您尝试运行的任何命令。
答案2
yes 3 | parallel sleep
sleep 3
这将无限期地运行与处理器数量相同的数量。
或者本着另一个答案但更简单的精神:
for ((i=$(nproc);i>0;i--)) ; do
while true ; do
sleep $(( 1+RANDOM%10 ))
done &
done