【问题标题】:OpenMP critical section vs locksOpenMP 临界区与锁
【发布时间】:2015-04-12 07:35:45
【问题描述】:

OpenMP 锁和临界区有什么区别?它们只是彼此的替代品吗? 例如,如果我使用多个文件写入同一个文件,我应该在写入文件之前使用锁定还是只使用临界区?

【问题讨论】:

  • 你在写什么文件?你是从每个线程写的吗?你使用任务还是并行循环?你是从所有线程写的吗?你有一些代码吗?你心目中的语言是什么? (OpenMP 支持 Fortran、C 和 C++)您的问题非常广泛且难以回答,您应该缩小范围。
  • 好的,我将尝试一个简单的操作。我在 C++ 中使用了一个 char 缓冲区,当一个线程正在写入该缓冲区时,我只想让其他线程不要尝试读取或写入该缓冲区.一次只有一个线程可以访问缓冲区。它可以读取或写入该缓冲区..所以我应该在关键部分下写入缓冲区还是使用锁
  • 这真的取决于你的代码的整体设计。

标签: openmp


【解决方案1】:

关键部分最常在内部使用锁,例如:

  • libgomp:source
  • libiomp:

    如果省略可选的(名称),它会锁定一个未命名的全局互斥锁。

OpenMP 规范保证以下行为:

>

关键构造限制了相关联的执行 结构化块一次到一个线程

因此,临界区的作用与获取锁相同。不同之处在于为您处理低级细节。

由于简单,我建议您尽可能使用critical。如果您有单独的块需要很关键但不相互干扰,请给它们命名,并且只有当您需要一些注释无法适应的行为时,才使用显式锁定。

【讨论】:

  • 您的源代码是一个特定的运行时库。你有任何证据证明这种说法是普遍的吗?更重要的是,引用的源文件中的那些锁真的是 OpenMP 锁还是更低级别的东西?
  • 来自 OpenMP 规范:The critical construct restricts execution of the associated structured block to a single thread at a time. 这显然暗示了某种形式的互斥语义。我展示了在(可以说)最流行的开源实现中,它只是在内部使用锁。关键点(使用其中一个)仍然有效。
  • 已编辑以纳入我的一些发现。
猜你喜欢
  • 2016-05-12
  • 2014-12-08
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多