omp_init_lock(omp_lock_t *) - 这个函数的功能是什么?

时间:2016-11-23 16:59:24

标签: c++ linux openmp

# 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锁定功能查找数组中的max元素。每当我跳过该函数omp_init_lock时,我的代码就不会执行。它仍然可以成功编译,但只要数组的SIZE为小数(如10或20),所有线程都会在进入for循环后停止。其他时候它会运行没有问题(当数组的大小是一个像100这样的大数字时)。

omp_init_lock()解决了所有问题。怎么样?我搜索过但找不到太多关于它的信息。唯一提到的是它将锁初始化为解锁状态。为什么当数组大小为100时代码仍在运行,即使我没有初始化锁?

那么omp_init_lock()究竟在做什么呢?

2 个答案:

答案 0 :(得分:5)

OpenMP锁可以处于以下三种可能状态之一:未初始化解锁已锁定({{3 }})。声明但未通过调用 -D, --duplicates If Slurm job ids are reset, some job numbers will probably appear more than once in the accounting log file but refer to different jobs. Such jobs can be distinguished by the "submit" time stamp in the data records. When data for specific jobs are requested with the --jobs option, sacct returns the most recent job with that number. This behavior can be overridden by specifying --duplicates, in which case all records that match the selection criteria will be returned. 初始化时,锁定处于 unitialized 状态。调用omp_init_lock()会将锁转换为解锁状态。从那时起,锁定可以首先使用omp_init_lock() 锁定,然后使用omp_set_lock() 解锁

未初始化状态的锁上调用omp_unset_lock()是错误的(第3.3.4节)。在不包含锁定状态的锁定上调用omp_set_lock(),包括未初始化,也是错误的(第3.3.5节)。

您的程序在特定条件下工作而未正确初始化锁定是未指定的行为

答案 1 :(得分:1)

看起来omp_init_lock函数正在初始化锁定变量以进行设置/取消设置。这将包括分配用于锁定的任何所需内存并将初始状态设置为“解锁”。如果没有正确初始化,您应该会得到不可预测的结果。

  

OMP_INIT_LOCK初始化与锁定变量

关联的锁定

来源:LLNL OpenMP Tutorials