我有4個可執行文件,它們執行一些非常複雜的任務,這些程序中的每一個都可能佔用四核CPU的單個核心幾乎100%的功率,因此導致幾乎佔CPU總功率的25%。由於所有這些程序都使用不能在多個進程之間共享的硬件資源,因此我希望運行一個生成3個子進程的可執行文件,而這3個子進程佔用另外3個內核。我在Linux上,我正在使用C++ 11。大多數複雜的代碼都在自己的類中運行,而最難的部分運行在我通常稱爲Process()
的函數中,所以我有4個對象,每個對象都有自己的Process()
,運行時佔用單個內核的100%。四核上的Linux:單個可執行文件,四個進程
我嘗試過使用OpenMP,但我不認爲這是最好的解決方案,因爲我無法控制CPU親和力。同樣使用std::thread
不是一個好主意,因爲線程會繼承主進程的CPU關聯。在Linux中,我認爲我可以用fork()來做到這一點,但我不知道整個結構是如何製作的。
這可能與my other question有關,可能是因爲我在嘗試在某些情況下有效的錯誤方法,但在我的情況下不起作用。
的僞代碼的一個例子可能是這樣的:
int main()
{
// ...init everything...
// This alone takes 100% of a single core
float out1 = object1->Process();
// This should be spawned as a child process running on another core
float out2 = object2->Process();
// on another core...
float out3 ...
// yet another core...
float out4 ...
// This should still run in the parent process
float total_output = out1 + out2 + out3 + out4;
}
我相信你仍然可以通過在該線程內調用'gettid()'來使用'std :: thread',然後將'pid'參數傳遞給'sched_setaffinity()'。編輯:實際上,你甚至不需要調用'gettid()',只需將'pid'保留爲零,'sched_setaffinity()'將修改調用線程*的親和性。 – inetknght 2015-02-11 16:03:44