gpt4 book ai didi

c - OpenMP 嵌套 For 循环竞争条件

转载 作者:行者123 更新时间:2023-11-30 14:50:47 27 4
gpt4 key购买 nike

我在当前情况下遇到了种族问题。我正在尝试创建线程数量,因为有核心,在 OMP 上使用锁。我尝试过 #pragma omp critical#pragma ampatomic 但它们都没有帮助。我得到了一些疯狂的负数...我知道如何使用 private 来做到这一点,但我想实际同步线程,而不是为线程创建多个变量,然后在最后组合。

// multiplication
#pragma omp parallel for
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
c[i][j] = 0.;
for (k = 0; k < N; k++)
{
omp_set_lock(&lock);
//#pragma omp critical
//#pragma omp atomic
c[i][j] += a[i][k] * b[k][j];
threadTasks[omp_get_thread_num()]++;
omp_unset_lock(&lock);
}
printf("[%d, %d]: Thread ID %d\n", i, j, omp_get_thread_num());
}
}

最佳答案

对于此矩阵乘法,您不需要任何针对竞争条件的保护(锁、原子、临界区)。事实上,这样做会完全破坏你的表现。由于每个线程正在执行不同的i,因此不同的线程永远无法写入或读取c[i][j]的相同索引。

但是,您的内部循环需要有私有(private)循环变量,否则一切都会出错。一般来说,尽可能在本地声明所有变量。然后它们是隐式私有(private)的,这对于私有(private)部分之外不需要的变量来说几乎总是正确的。

I know how to do it using private, but I want to actually synchronize the threads, not create multiple variables for the threads and then combine at the end.

对于内部循环变量,除了将它们设为私有(private)之外别无选择。很多时候,缩减(私有(private)副本,最后聚合)的性能比共享结果变量更好。在这种情况下,共享结果应该没问题。

关于c - OpenMP 嵌套 For 循环竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48779782/

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