OMP_INIT_LOCK(OMP_LOCK_T*) - 此功能准确地做什么
omp_init_lock(omp_lock_t*) - What does this function do EXACTLY?
# include <iostream>
# include <cstdlib>
# include <omp.h>
#define SIZE 10
#define NUM_THREADS SIZE
using namespace std;
main() {
omp_lock_t lock;
//omp_init_lock(&lock);
srand(time(NULL));
int arr[SIZE], max = -1;
omp_set_num_threads(NUM_THREADS);
for(int i = 0; i < SIZE; i++)
arr[i] = rand()%100;
#pragma omp parallel for
for(int i = 0; i < SIZE; i++) {
omp_set_lock(&lock);
if(arr[i] > max)
max = arr[i];
omp_unset_lock(&lock);
}
cout << "Max: " << max << endl;
}
这是代码,我写的是使用OpenMP锁定功能在数组中找到最大元素。每当我跳过该功能omp_init_lock
时,我的代码都不会执行。它仍然会成功编译,但是我所有的线程都会在他们输入for loop 之后停止,每当数组的大小为较小的数字(例如10或20)时。其他时候它将没有问题(当数组的大小大于100之类的大小时)。
但是omp_init_lock()
解决了所有问题。如何?我搜索了,但找不到太多。提到的唯一一件事是,它将锁定到解锁状态的初始化。当数组的大小为100时,为什么即使我不初始化锁?
那么omp_init_lock()
详细地做什么?
openMP锁可以在三个可能的状态之一中:无限制, unlocked 或 locked (OpenMP规范的第3.3节)。当声明但未通过拨打 在状态中的锁上调用 您的程序在特定条件下工作omp_init_lock()
的呼叫初始化时,锁定是在 unitialization 状态中。调用omp_init_lock()
将锁定到解锁状态。从那时起,可以使用omp_set_lock()
首先使用锁定,然后使用omp_unset_lock()
。omp_set_lock()
是错误的(第3.3.4节)。在不在锁定状态中的锁上调用omp_unset_lock()
,其中包括,也是错误的(第3.3.5节)。
看来omp_init_lock
功能正在初始化用于设置/不设置的锁定变量。这将包括分配用于锁定的任何必需内存,并将初始状态设置为"解锁"。您应该期望不适当初始化的结果不可预测。
OMP_INIT_LOCK初始化与锁变量关联的锁
来源:llnl OpenMP教程
- C++omp没有显著改善
- 等待整个 omp 块完成,然后再调用第二个函数
- 尝试构建"lock-free"数据结构C++
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- "lock cmpxchg"如何在装配中工作?
- 自定义 OMP 缩减 在 std::map 上
- std::lock 仍然导致死锁
- 函数中的"pragma omp parallel for"在另一个并行循环中调用函数时无效
- OMP for 循环,无需初始化
- 为什么在杂注 omp 关键之后多次调用 printf 会产生乱码输出?
- GSL+OMP:C++中的线程安全随机数生成器
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 编译器是否实际使用我的"omp declare simd"函数?