在C ++中,我使用系统调用可执行文件(" ./ filename blahblah");现在,因为有许多迭代,我想将它们并行放置
#pragma omp parallel for
for( int i = 0; i < 999; ++i )
system("./filename blahblah");
但是我很确定上面的内容不会起作用,因为#pragma omp是C ++编译器的扩展,只能修改C ++行的编译。 system()调用终端shell来处理命令,而#pragma omp不会影响该命令的执行。
有没有办法解决这个问题?我认为有一种方法用fork()和amp; exec()在GNU中,但我不确切知道如何。谁能帮我这个?谢谢。
答案 0 :(得分:2)
是的,您需要使用fork(2),execve(2),waitpid(2),pipe(2)以及其他一些syscalls(2)(例如poll(2)一个event loop,你可能需要一个)等......
我不会解释如何阅读Advanced Linux Programming书籍(在线提供),该书有几个专门讨论该主题的章节(其中大多数章节与其他POSIX系统如MaCOSX相关)。
您可能对MPI感兴趣。
BTW,在大多数计算机上有一千个运行进程是不合理的。您最好将自己限制在十几个正在运行的进程中(例如,有一些pool进程)。 您通常只需要每core个运行进程或线程(即任务)不多于一个(如果您有hyper-threaded英特尔处理器,则需要更多)。如果您运行的进程太多,系统将无法响应,整体性能将受到影响(scheduler将有太多活动任务需要管理)。您可能对batch系统感兴趣(例如,您可以popen(3) batch
命令;在MacOSX上也可以参阅launchd)。