gpt4 book ai didi

c - OpenMP:锁定对单个数组元素的访问?

转载 作者:太空狗 更新时间:2023-10-29 15:16:38 25 4
gpt4 key购买 nike

我是 OpenMP 的新手,所以这可能有一个简单的答案,但我一直没能找到。

假设我有以下 C 代码并想使用 OpenMP 对其进行并行化处理。 A 是一个对象数组,其中一些 double 值小于 1 buckets 是一个链表数组,append 将指向对象的指针添加到链表的末尾。

#pragma omp for 
for (i = 0; i < n; ++i) {
x = (int) (A[i].val * NUM_BUCKETS);
append(&A[i], buckets[x]);
}

问题是多个线程可能同时尝试将项目附加到给定的桶中。我可以使该附加语句变得至关重要。但是,在我的应用程序中,我可能会有大约 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/

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