下面是我当前的代码,正如标题所说,我认为它将并行运行。我在Mac OSX工作,在终端我正在使用bash。代码是用C语言编写的,我正在尝试使用openmp。它编译并运行没有任何错误,但我不相信它是并行运行。
解释代码以便于理解。第一个块只是一堆变量的声明。下一个块是for循环,它在终端中运行命令。
第一个命令是运行一个带有四个参数的可执行程序:double,固定整数,字符串和另一个固定整数。 double取决于你所在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);
}
感谢您提供的任何见解和帮助。
答案 0 :(得分: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