我需要从boost :: thread切换到OpenMP,因为老板这么说.
问题很简单:模拟的结果每5次迭代写入磁盘(int it = 5,10,15 ……).为简单起见,假设我有一个8核CPU.我创建了9个线程;线程0用于IO,其他8用于计算.当(%5 == 0)时,我检查线程0以查看它是否已完成.如果是,我创建另一个线程,调用0,并要求它将结果写入磁盘.如果没有,所有线程都必须等待.通常,写出结果所花费的时间少于5次迭代,因此我有效地“隐藏”了IO成本.
我花了几个小时研究OpenMP,我想同样的算法可以使用“任务”构造完成,但我不知道如何同步线程. 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
}
最佳答案 英特尔对OpenMP vs Threads的困境非常有争议,我会推迟他们并要求你的老板接受一些教育.
OpenMP非常面向循环,您可以平行整个循环而不是同步线程.