如何在shell脚本中使用多个内核(i7机器)运行c程序

时间:2012-10-05 17:51:38

标签: c shell parallel-processing

我有一个C程序fextract,它以wavfile作为输入,并以某种fcc格式提供输出。语法类似于'fextract file.wav file.fcc'。现在我有75000个wav文件,需要转换成fcc格式。加快我计划使用我的i7机器的所有核心的程序。首先,我将所有输入和输出路径保存在一个文件中,我称之为scp文件 例如:/mnt/disk1/file1.wav /mnt/disk2/file1.fcc     /mnt/disk1/file2.wav /mnt/disk2/file2.fcc 等等

现在使用以下shell脚本我已将scp文件分成8个文件并存储在临时目录中

mkdir $tmpDir
cd $tmpDir

nCores=`cat /proc/cpuinfo | grep processor | wc -l`
nLines=`cat $scpFile|wc -l`

split -l $((nLines/nCores + 1)) $scpFile

现在我的临时文件有八个子文件。我如何评估他们使用多核运行程序fextract

for i in `ls`
do 

fextract &i

done

需要这些东西。请帮我解决这个问题吧

2 个答案:

答案 0 :(得分:2)

使用GNU Parallel:

parallel -j $nCores fextract -- `ls`

或者您可以将xargs与-P键一起使用(对find有用)。

这些命令将在多个线程中启动您的代码,这将允许它们在多个核心上执行。

答案 1 :(得分:0)

使用GNU Parallel:

cat filenames | parallel fextract {} {.}.fcc

由于花费了一些时间用于磁盘I / O,因此每个cpu核心运行一点点可能会更快:

cat filenames | parallel -j150% {} {.}.fcc

如果您只想要当前目录中的所有文件:

parallel -j150% {} {.}.fcc ::: *.wav

如果您想在由空格分隔的单行上同时提供输入和输出文件名,您可以使用:

cat filenames_2_per_line | parallel --colsep ' ' -j150% {1} {2}

如果文件名不在同一行但在彼此之后,那么您需要一次读取2行:

cat filenames_interleaved | parallel -N2 -j150% {1} {2}

观看介绍视频以了解详情:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1