2015-09-16 73 views
-1

在C++中,我使用system(「./file blahblah」)調用可執行文件;現在,因爲有很多重複我希望把它們並行在C++中調用可執行文件,並行運行

#pragma omp parallel for 
for(int i = 0; i < 999; ++i) 
system("./filename blahblah"); 

但我敢肯定上面的都不行,因爲OMP的#pragma是C++編譯器的擴展,只能努力修改彙編C++行。 system()調用終端shell來處理命令,而#pragma omp不會影響該命令的執行。

有沒有辦法解決這個問題?我認爲在GNU中有fork()& exec()的方法,但我不知道如何。誰能幫我這個?謝謝。

+0

循環迭代之間是否存在任何依賴關係?幾個「./filename blahblah」可以同時運行嗎?如果前者是負面的,後者是正面的,那麼你提出的解決方案可能會正常工作......只需添加一個「-fopenmp」或任何你需要的編譯器選項來激活OpenMP的支持,那可能就是這樣。 – Gilles

+3

['system'](http://man7.org/linux/man-pages/man3/system.3.html)函數實際上調用了shell,這意味着你可以使用shell的所有功能,比如把在後面用'&'結尾處理。 –

+0

它是特定於操作系統的。我猜你在Linux上 –

回答

2

是的,你需要使用fork(2)execve(2)waitpid(2)pipe(2)和其他一些syscalls(2)(如poll(2)是非常有用的一個event loop,你可能需要一個)等等

我不會解釋如何,閱讀Advanced Linux Programming書(可在線獲得),其中有幾章專門介紹了這個主題(大多數章節與其他POSIX系統如MaCOSX相關)。

您可能會感興趣MPI

順便說一句,有一千個正在運行進程在大多數計算機上是不合理的。您最好將自己限制在最多十幾個正在運行的進程(例如,有一些進程的pool)。 通常,每個core只需要一個運行進程或線程(即任務)(如果您有一個hyper-threaded英特爾處理器,則稍微多一點)。如果您的運行進程太多,系統將無響應,整體性能會受到影響(scheduler會有太多活動任務需要管理)。

您可能對batch系統感興趣(例如,您可能需要popen(3) a batch命令;在MacOSX上,另請參閱launchd)。

+0

通常情況下?爲什麼你會想要比核心更多的線程/進程? – corazza

+1

@jco:當你知道或直覺某些進程會睡覺(或等待IO)大部分時間 –

+0

啊,謝謝,這很有道理。但是如果他們都在計算某種東西,那麼它就沒有意義了,對吧? – corazza

相關問題