我有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