我需要从boost :: thread切换到OpenMP,因为老板这么说。
问题很简单:模拟的结果每5次迭代写入磁盘(int it = 5,10,15 ...)。为简单起见,假设我有一个8核CPU。我创建了9个线程;线程0用于IO,其他8用于计算。当(%5 == 0)时,我检查线程0以查看它是否已完成。如果是,我创建另一个线程,调用0,并要求它将结果写入磁盘。如果没有,所有线程都必须等待。通常,写出结果所需的时间少于5次迭代,因此我有效地“隐藏”了IO成本。
我花了几个小时研究OpenMP,我猜可以使用“task”构造完成相同的算法,但我不知道如何同步线程。 OpenMP专家请帮忙。感谢。
当前的伪代码看起来像这样
boost::thread pool[9];
for(int it=0;it<1000;it++)
{
- simulate using pool[1,8]
- if(it%5 == 0)
+ check pool[0]
+ if finished: create new thread, assign to pool[0], write data out
+ if not, wait
}
答案 0 :(得分:2)
英特尔对OpenMP vs Threads的困境非常nice answer,我会尊重他们并要求你的老板接受一些教育。
OpenMP非常面向循环,你可以平行整个循环而不是同步线程。
答案 1 :(得分:0)
您的设计对我来说似乎是正确的:为I / O提供单独的线程,并为计算提供线程池是正确的。你可能用OpenMP替换池[1..8]中的Boost线程用于计算部分,但我不会超越它。如果你不能使用Boost,请使用POSIX线程。