【发布时间】:2011-06-29 23:31:57
【问题描述】:
我需要从 boost::thread 切换到 OpenMP,因为老板这么说。
问题很简单:每 5 次迭代(int it = 5,10,15...)将模拟结果写入磁盘。为简单起见,假设我有一个 8 核 CPU。我创建了 9 个线程;线程 0 用于 IO,其他 8 用于计算。当 (it%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 不是线程,因为你可以看看 Intel TBB。
-
@whatnick:虽然它有一个线程类,但英特尔 TBB 也不是关于线程的。
-
OpenMP 具有“锁”(类似于互斥锁),我认为可以使用它来跟踪线程。在这种情况下,我认为解决方案是让 IO 任务解锁锁,并确保在生成另一个 IO 任务之前解锁锁。当我问这个问题时,我不知道“锁”。我想我对自己的问题有一个答案;但我仍然需要 OpenMP 专家来验证。
标签: multithreading boost synchronization controls openmp