0

我正在使用 Mac OSX,并在终端中使用 bash。

我已经能够找到很多关于在 C 中使用 OpenMP 的文献,但是我遇到了一个我正在为其运行 shell 脚本的程序。该脚本使用 1000 个不同的参数调用可执行文件 1000 次。没有一个调用相互依赖,所以我知道这可能是并行化我的代码的好地方。

那么问题是如何在 bash 的 shell 脚本中使用 #pragma omp parallel for。我也想过在 .c 文件中编写 shell 的功能,但我不确定如何调用 .exe 并在 c 中重命名和移动文件。

这是名称易于理解的 shell 脚本:

#!/bin/zsh
for ((x = 0, y = 4 ; x < 1000 ; x++, y *= 1.0162))
do
typeset -F 3 y
echo $y
./program arg1 $y /path0 arg2
mv file1.ppm file1.$(printf %04d $x).ppm
mv file1.$(printf %04d $x).ppm /path1
mv file2.ppm file2.$(printf %04d $x).ppm
mv file2.$(printf %04d $x).ppm /path2
done

paste a.txt b.txt > c.txt
mv c.txt /path3

变量说明:

程序在接受 4 个参数后运行。出于此脚本的目的,只有 y 是变化的。

给出了 arg1 和 arg2。

所有 /path 都是我存储数据的不同位置的路径。

file1.ppm 和 file2.ppm 是从 ./program 调用中计算出来的。

a.txt 和 b.txt 分别在 for 循环中给出和计算。

4

3 回答 3

1

So OpenMP is something that's built into compilers, and isn't something you can access from bash - but you don't need too.

Let's consider a single run; for a given run, you could have a script (call it dorun) which runs one complete job:

#!/bin/zsh
x=$1
y=$( echo $x | awk '{print 4.*(1.0162^$1)}' )
typeset -F 3 y
echo $y
./program arg1 $y /path0 arg2
mv file1.ppm file1.$(printf %04d $x).ppm
mv file1.$(printf %04d $x).ppm /path1
mv file2.ppm file2.$(printf %04d $x).ppm
mv file2.$(printf %04d $x).ppm /path2

And if you call this with, say dorun 5 you'll get the x=5 job from the above.

Now you have to figure out how to run this for 0...999 in parallel. My favourite tool for doing this sort of thing is gnu parallel, which lets you fire off many of these jobs, even if they take different lengths of time, and keep a fixed number of processors busy. At our centre, we have instructions on its use here, but there are many other places with good examples of its use.

In this case, you could do something as simple as:

seq 1000 | parallel -j 4 --workdir $PWD ./dorun {}
paste a.txt b.txt > c.txt
mv c.txt /path3

to run this script for parameters x=0...999 on up to 8 processors on the local machine; there are even options for making use of other hosts.

于 2013-05-29T03:08:32.420 回答
1

我曾经使用便携式批处理系统 (PBS) 来提交并行作业。您也可以使用计算机集群进行设置,提交您的作业,在后台以低优先级运行它们,然后在主机上收集输出。

http://en.wikipedia.org/wiki/Portable_Batch_System

但是,似乎不再支持此免费版本,所以我不知道现在推荐什么。

于 2013-05-29T08:43:03.137 回答
1

除了乔纳森的回答,我建议您使用task spooler。它允许您安排任务,配置一次并行运行多少任务,控制完成多少任务,输出应该去哪里等。

于 2013-05-29T08:25:53.530 回答