1

下面是我当前的代码,正如标题所说,我认为它会并行运行。我在 Mac OSX 中工作,在终端中我正在使用 bash。代码是用 C 编写的,我正在尝试使用 openmp。它编译并运行没有任何错误,但我不相信它是并行运行的。

解释代码以便于理解。第一个块只是一堆变量的声明。下一个块是 for 循环,它在终端中运行命令。

第一个命令是运行一个带有四个参数的可执行程序:一个双精度数、一个固定整数、一个字符串和另一个固定整数。双精度取决于您所在的 for 循环的迭代。

第二,第三,第四和第五个命令都处理重命名和移动可执行程序吐出的文件。这样就完成了 for 循环。我希望这个 for 循环能够并行运行,因为每次迭代大约需要 30 秒。

一旦在四个循环之外,在每个循环中写入的文件就会被移动。我意识到写入文件的顺序可能有问题,但这只有在它实际并行运行时才会成为一个问题!

#include <stdio.h>
#include <string.h>

int main(){

    int spot;
    double th;
    char command[50];
    char path0[] = "/home/path0";
    char path1[] = "/home/path1";
    char path2[] = "/home/path2";
    char path3[] = "/home/path3";

    #pragma omp parallel for private(command,path)
    for (th=0.004, spot =0; th<1; th += 0.005, spot++) {
        sprintf(command, "./program %lf 19 %s 418", th, path0);
        system(command);

        sprintf(command, "mv fileA.ppm a.%04d.ppm", spot);
        system(command);

        sprintf(command, "mv a.%04d.ppm %s", spot, path1);
        system(command);

        sprintf(command, "mv fileB.ppm b.%04d.ppm", spot);
        system(command);

        sprintf(command, "mv b.%04d.ppm %s", spot, path2);
        system(command);


    }

    sprintf(command, "mv FNums.txt %s", path3);
    system(command);


     return(0);
}

感谢你们提供的任何见解和帮助。

4

1 回答 1

3

由于这基本上已经基于 shell 脚本,请考虑使用 xargs:

./program首先,如果并行运行,请确保多个实例不会覆盖彼此的 fileA.ppm。我假设您将在此示例中开始将它们写为 fileA.ppm.0.004。

然后制作一个您可以使用现场编号调用的脚本:

#!/bin/sh
spot=$1
th=$(echo "$spot" | awk '{print 0.004 + 0.005*$1 }')
./program "$th" 19 /home/path0 418
mv "fileA.ppm.$th" "$(printf '/home/path1/a.%04d.ppm' "$spot")"
mv "fileB.ppm.$th" "$(printf '/home/path2/b.%04d.ppm' "$spot")"

chmod a+x yourscript,您现在可以使用 、 等运行和测试每个./yourscript 0实例./yourscript 1

当它工作时,使用以下命令并行运行 8 个(或更多):

printf "%s\n" {0..199} | xargs -P 8 -n 1 ./yourscript
于 2013-05-30T23:33:46.927 回答