使用OpenMP进行复杂的线程处理

时间:2011-06-29 23:31:57

标签: multithreading boost synchronization controls openmp

我需要从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
}

2 个答案:

答案 0 :(得分:2)

英特尔对OpenMP vs Threads的困境非常nice answer,我会尊重他们并要求你的老板接受一些教育。

OpenMP非常面向循环,你可以平行整个循环而不是同步线程。

答案 1 :(得分:0)

您的设计对我来说似乎是正确的:为I / O提供单独的线程,并为计算提供线程池是正确的。你可能用OpenMP替换池[1..8]中的Boost线程用于计算部分,但我不会超越它。如果你不能使用Boost,请使用POSIX线程。