【发布时间】:2021-09-10 09:01:09
【问题描述】:
我有以下示意图并行化 for 循环(使用 OpenMP),
char command[200];
int thread_id;
# pragma omp parallel private(thread_id)
{
thread_id = omp_get_thread_num();
# pragma omp for
for (int i = 0; i < max_value; i++) {
// Generates a text file here (.inp) with a file name of node_(thread_id).inp
std::sprintf(command, "executable.exe < node_%d.inp > node_%d.out", thread_id, thread_id);
std::system(command);
// Reads the output file node_(thread_id).out
}
}
然后我使用 MPC 1.1.0 和 GCC 8.4.0 编译代码,并将其提交给 SLURM。该代码有时似乎运行良好,但我观察到有时文件名错误。例如,.inp 文件变为“nodee0.inp”或“node_0.o.o”。有时 SLURM 会引发分段错误错误,并且有时没有从节点 0 写入的文件,即文件名以节点 1 或 2 结尾,这与我期望的相反始终是“node_0”。
所以我的问题是,文件命名错误、分段错误错误以及丢失节点中的文件可能是什么原因?问题可能来自 SLURM,因为代码在其他时候运行良好,但我想知道是否应该在代码中编写或更改某些内容以减少这些错误的发生。
提前谢谢你。
【问题讨论】:
-
我不会为此使用 OMP,而是使用一些外部库(例如 boost.process)来处理进程。这样多线程就会过时了。
-
每个线程可能都使用同一个数组来存储命令。
command定义在哪里? -
@Marek R - 我还不熟悉 boost.process,但我发现这篇文章是 stackoverflow.com/questions/62602232/… 的开始。从这里开始,如果我的理解是正确的,我似乎需要先为所有迭代编写文件,然后将它们用作子进程的输入。但是
max_value太大了,可能会导致 50 万个输入文件。 -
@user253751
command在循环外定义。 -
@mague_e 所以这是你的问题。