c - 知道为什么这段代码没有并行运行

标签 c macos bash parallel-processing openmp

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

对代码进行解释,以便于理解。第一个 block 只是一堆变量的声明。下一个 block 是 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);
}

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

最佳答案

因为这基本上已经基于 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

关于c - 知道为什么这段代码没有并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847200/

相关文章:

macos - 如何从外壳中检测Mac OS X中的当前语言环境

linux - 比较linux(bash)中的两个平面文件,取出缺少的内容并将其放入第一个文件中?

bash - 为什么运行docker容器时没有执行 `~/.bashrc`?

c - strcpy 在 c 中给出段错误

java - 当应用程序在托盘中时,如何在 Dock 中隐藏 Java SWT 程序图标

c - 对 .. 错误的奇怪 undefined reference

Ruby Gem 包管理器因 Gem::GemNotFoundException 失败

linux - 删除所有早于给定时间的文件并记录其操作的命令

c - 确定 32 位 int 的符号

c - 使用 C 从文本文件中读取输入参数