Linux Bash:在多个核上运行相同的程序
我可以访问一台机器,在那里我可以访问10个内核——我想实际使用它们。我习惯于在自己的机器上做这样的事情:Linux Bash:在多个核上运行相同的程序,linux,bash,parallel-processing,multiprocessing,Linux,Bash,Parallel Processing,Multiprocessing,我可以访问一台机器,在那里我可以访问10个内核——我想实际使用它们。我习惯于在自己的机器上做这样的事情: for f in *.fa; do myProgram (options) "./$f" "./$f.tmp" done 我有10个文件,我想在上面做这件事——我们叫它们blah00.fa,blah01.fa。。。布拉赫09.fa 这种方法的问题是,我的程序一次只使用一个内核,在多核机器上这样做,我一次会使用一个内核10次,所以我不会最大限度地使用我的mahcine 如何更改脚本,使其
for f in *.fa; do
myProgram (options) "./$f" "./$f.tmp"
done
我有10个文件,我想在上面做这件事——我们叫它们blah00.fa,blah01.fa。。。布拉赫09.fa
这种方法的问题是,我的程序一次只使用一个内核,在多核机器上这样做,我一次会使用一个内核10次,所以我不会最大限度地使用我的mahcine
如何更改脚本,使其同时运行我的所有10个.fa文件?我看了看,但我无法从中得到命令来做我想做的事情。您可以使用
for f in *.fa; do
myProgram (options) "./$f" "./$f.tmp" &
done
wait
这将并行启动所有作业,然后等到它们全部完成后再继续。如果作业多于内核,则可以启动所有作业,并让操作系统调度程序担心在输出中交换进程
一个修改是一次启动10个作业
count=0
for f in *.fa; do
myProgram (options) "./$f" "./$f.tmp" &
(( count ++ ))
if (( count = 10 )); then
wait
count=0
fi
done
但这不如使用
parallel
,因为旧作业完成时,您无法启动新作业,而且您也无法在启动10个作业之前检测旧作业是否已完成<代码>等待允许您在单个特定进程或所有后台进程上等待,但不让您知道任意一组后台进程何时完成。使用GNU Parallel,您可以执行以下操作:
parallel myProgram (options) {} {.}.tmp ::: *.fa
发件人:
=完全安装=
GNU Parallel的完整安装非常简单:
./configure && make && make install
如果您不是root用户,则可以将~/bin添加到路径并安装到中
~/bin和~/share:
./configure --prefix=$HOME && make && make install
或者,如果您的系统缺少“make”,您可以简单地复制src/parallel
src/sem src/nice将src/sql加载到路径中的一个目录中
=最小安装量=
如果您只需要并行,而没有安装“make”(可能是
系统是旧的或Microsoft Windows):
观看介绍视频以了解更多信息:您尝试了gnu parallel?什么对你不起作用?你试过在那个答案中使用gnu并行建议吗?
seq 0 10 | parallel myProgram-opt1-opt2./blah{}.fa./blah{}.tmp
是的,我试过使用并行。问题:在多核的机器上,它没有安装,而且我没有sudo访问权限,因此无法使用并行:(安装它不需要是root用户;下载源代码并运行/configure--prefix=${HOME};make;make install
,即可将其安装到主目录中。下一版本的Bash将有一个选项(等待-n
).目前,您可以执行类似的操作,但由于一些错误,这有点疯狂,这些错误也将在下一版本中修复。
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
mv parallel sem dir-in-your-$PATH/bin/
# Wait while instance count less than $3, run additional instance and exit
function runParallel () {
cmd=$1
args=$2
number=$3
currNumber="1024"
while true ; do
currNumber=`ps -e | grep -v "grep" | grep " $1$" | wc -l`
if [ $currNumber -lt $number ] ; then
break
fi
sleep 1
done
echo "run: $cmd $args"
$cmd $args &
}
loop=0
# We will run 12 sleep commands for 10 seconds each
# and only five of them will work simultaneously
while [ $loop -ne 12 ] ; do
runParallel "sleep" 10 5
loop=`expr $loop + 1`
done