我有一个程序在整个程序的各个检查点之间同时顺序和并行地执行相同的代码。为此,初始程序会分离子进程,该进程在父进程并行运行时按顺序运行。无论哪个进程首先到达下一个检查点,然后关闭另一个进程,这将重复执行,直到执行结束,从而尽可能快地执行(忽略fork和copy开销)。
我已经实现了这一点,当只有顺序执行最快,或者只有并行执行最快时,一切正常,但是当前几个部分并行执行最快然后接下来几个执行最快时,程序会停止进程睡觉。我看不出是什么原因造成的。我是否对分叉过程施加了一些限制?杀死父进程是否会影响分叉子进程的执行,反之亦然?
下面的代码给出了我的函数checkPoint()
,它在每个检查点执行,一些自定义代码处理最后一节的结尾。并行代码使用OpenMP实现,顺序代码从不遇到OpenMP pragma语句。
pid_t parent = 0;
pid_t child = 0;
void checkPoint() {
if (parent == 0) {
// First Time
parent = getpid();
} else if (child == 0) {
// Child Process
kill(parent, SIGKILL);
parent = getpid();
} else {
// Parent Process
kill(child, SIGKILL);
}
child = fork();
}
谢谢,
丹
答案 0 :(得分:0)
事实证明,这是使用gcc,OpenMP和forks时出现的错误。
取自http://bisqwit.iki.fi/story/howto/openmp/#OpenmpAndFork
如果您的程序打算成为后台进程使用 daemonize()或其他类似方法,您不能使用OpenMP 叉前的功能。使用OpenMP功能后,使用fork 仅当子进程不使用OpenMP功能时才允许,或者 它是一个全新的过程(例如在exec()之后)。