我的老板要求我从boost::thread改为OpenMP。
问题很简单:每5次迭代(int it = 5,10,15...)将模拟结果写入磁盘。为了简单起见,假设我有一颗8核CPU。我创建了9个线程;线程0用于IO,其他8个用于计算。当(it%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
}