【发布时间】:2020-04-08 10:06:28
【问题描述】:
我有一个具有以下一般结构的函数:
void a_generic_function(int N, int *arr, int *superarr)
{
//some code
for (int i = 0; i < N; i++)
{
omp_init_lock(&(lock[i])); //Initializes N locks, lock is allocated dynamic mem previously.
}
#pragma omp parallel shared(lock)
{
#pragma omp for
{
for (int i = 1; i <= N; i++)
{
//some code
for (int j = arr[i-1]; j < arr[i]; i++) //where arr is size N+1
{
//some code
for (int k = 0; k < temp; k++) //where temp < N
{
omp_set_lock(&(lock[subarr[k]])); //subarr is size <= N
superarr[subarr[k]] += temp-1; //superarr is size = N. Temp is an int value.
omp_unset_lock(&(lock[subarr[k]]));
}
}
}
}
}
}
这段代码中只有一个点限制线程进入,一旦关键操作完成就应该立即解锁,但是这个函数经常会死锁。 我不明白是什么原因造成的。
(为了完整起见:在这个函数之外没有并行化)
【问题讨论】:
-
不回答您的问题,但请阅读 OpenMP 原子操作(这将使您消除这里的所有锁定!)