我对 OpenMP 还很陌生,所以这可能有一个简单的答案,但我找不到它。
假设我有以下 C 代码并想使用 OpenMP 对其进行并行化。 A 是一个对象数组,其中一些 double 值小于 1 桶是一个链表数组, append 将一个指向对象的指针添加到链表的末尾。
#pragma omp for
for (i = 0; i < n; ++i) {
x = (int) (A[i].val * NUM_BUCKETS);
append(&A[i], buckets[x]);
}
问题是多个线程可能试图一次将项目附加到给定的存储桶。我可以让那个 append 语句变得至关重要。但是,在我的应用程序中,我可能有大约 1000 个存储桶,因此大部分时间线程将在不同的存储桶上运行。
有没有办法对存储桶的各个元素实现锁定?或者其他一些处理方法?
最佳答案
好吧,OpenMP 不能自动为您做这件事,但它允许您创建自己的锁变量,您可以使用它来限制对数组元素的访问;例如,您可以为每个数组元素设置一个锁:
#include <stdio.h>
#include <omp.h>
int main(int argc, char **argv)
{
const int NITEMS=20;
int array[NITEMS];
omp_lock_t lock[NITEMS];
for (int i=0; i<NITEMS; i++)
omp_init_lock(&(lock[i]));
#pragma omp parallel for shared(array, lock) default(none)
for (int i=0; i<NITEMS; i++) {
int tid = omp_get_thread_num();
int item = (i * 7) % NITEMS;
omp_set_lock(&(lock[item]));
array[item] = tid; // only one thread in here at a time; others block at set_lock()
omp_unset_lock(&(lock[item]));
}
for (int i=0; i<NITEMS; i++)
printf("%3d ", array[i]);
printf("\n");
for (int i=0; i<NITEMS; i++)
omp_destroy_lock(&(lock[i]));
return 0;
}
或者,如果该粒度级别超出您的需要,您可以阻塞数组的区域等。
关于c - OpenMP:锁定对单个数组元素的访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11017851/