【问题标题】:complex threading with OpenMP使用 OpenMP 的复杂线程
【发布时间】: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


【解决方案1】:

英特尔对 OpenMP 与线程的两难境地有一个非常 nice answer,我会听从他们的意见,并请你的老板接受一些教育。

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

【讨论】:

  • 教育老板是不可能的。与 boost 相同,这很好,但老板不想用我们的软件打包库。 OpenMP 3 有一个新的“任务”构造,可以随意生成线程,因此必须有某种方法可以知道线程何时完成......
  • 英特尔库...不太喜欢。等到你必须阅读俄语手册(我说的是 MKL 库),然后你就会明白我的意思了。我的公司坚持使用 gcc,我认为老板对此是正确的......
【解决方案2】:

总体而言,您的设计对我来说似乎是正确的:拥有一个单独的 I/O 线程和一个用于计算的线程池是正确的。对于计算部分,您可能会用 OpenMP 替换 pool[1..8] 中的 Boost 线程,但我不会超越。如果不能使用 Boost,请使用 POSIX 线程。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多