【问题标题】:C++ OpenMP lock istructionC++ OpenMP 锁定指令
【发布时间】:2016-05-28 07:24:30
【问题描述】:

我是使用 OpenMP 的新手,我想知道是否可以将单个指令锁定在循环中。 换句话说,在 for 循环中我有 5 条指令,比如说 A、B、C、D 和 E。“C”必须使用锁执行(因为它写入公共资源),其他指令可以在平行线。有没有办法做到这一点?

让我用伪代码来阐明我想要实现的目标

#pragma omp parallel for
 for(int i = 0; i<size; i++){
    A;
    B;
    lock(C);
    D; 
    E;
 }

【问题讨论】:

  • 如果C是一个非常简单的操作(比如C++;),使用atomic,否则使用critical区域。
  • 如果对您有帮助,请接受以下答案。

标签: c++ locking openmp


【解决方案1】:

在该锁之前使用critical,这样可以确保下一行代码仅由一个线程执行。 CRITICAL 的定义:CRITICAL 指令指定一个代码区域,一次只能由一个线程执行。

你可以这样做。

#pragma omp parallel for
for(int i = 0; i<size; i++){
    A;
    B;
    #pragma omp critical
    lock(C);
    D; 
    E;
}

定义来源:https://computing.llnl.gov/tutorials/openMP/

【讨论】:

  • 如果 "lock()" 真的是一个简单的语句,比如 x += 1;您可以使用#pragma omp atomic,它通常比临界区更快,因为它更好地利用硬件功能并且通常不使用内部锁。
猜你喜欢
  • 2021-11-18
  • 2023-03-11
  • 1970-01-01
  • 2015-03-15
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
相关资源
最近更新 更多