多线程 – 使用OpenMP进行复杂线程处理

我需要从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非常面向循环,您可以平行整个循环而不是同步线程.

点赞