gpt4 book ai didi

c++ - omp_init_lock(omp_lock_t*) - 这个函数究竟做了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:25 26 4
gpt4 key购买 nike

# 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 循环后都会停止 只要数组的 SIZE 是一个小数字(如 10 或 20)。其他时候它会毫无问题地运行(当数组的大小是一个很大的数字时,比如 100)。

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

那么omp_init_lock()具体是做什么的呢?

最佳答案

OpenMP 锁可以处于三种可能状态之一:未初始化未锁定已锁定(OpenMP specification 的第 3.3 节| ).当声明但未通过调用 omp_init_lock() 初始化时,锁处于unitialized 状态。调用 omp_init_lock() 将锁转换为解锁 状态。从那时起,可以先使用 omp_set_lock() 锁定,然后使用 omp_unset_lock() 解锁

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

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

关于c++ - omp_init_lock(omp_lock_t*) - 这个函数究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40770263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com