OMP_INIT_LOCK(OMP_LOCK_T*) - 此功能准确地做什么

omp_init_lock(omp_lock_t*) - What does this function do EXACTLY?

本文关键字:OMP LOCK 什么 功能 INIT      更新时间:2023-10-16
# 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教程