gpt4 book ai didi

openmp - 避免在 OpenMP 中竞争(在并行 for 循环中)

转载 作者:行者123 更新时间:2023-12-01 14:46:06 28 4
gpt4 key购买 nike

我正在用 C 编写一个 OpenMP 程序。我有这个共享数组“数据”,所有线程都在更新它。我想确保在执行下一条语句 data[j] = temp 之前,每个线程都已完成读取部分并将值存储在 temp 中。

我尝试在两个语句之间放置#pragma omp barrier,但编译器抛出错误。请帮忙。

#pragma omp parallel for shared(data)

for (j = 0; j < numints; j++){

if (j >= max_j)

{

temp = data[j] + data[j - max_j];
data[j] = temp;
}

}

最佳答案

如您所见,barrier不会工作; critical对于这个特定的操作来说是相当重量级的。原子比临界重量轻;你总能做到

if (j >= max_j)
{
#pragma omp atomic
data[j] += data[j-max_j];
}

但是您应该始终警惕在循环中使用任何此类构造(原子的、关键的)——它会降低性能,因为它会破坏并行性(毕竟,这就是它们的全部目的)。

了解您试图用这段代码完成什么会很有帮助,因为即使消除了更新中的数据竞争,(比如)data[maxints-1] 中的最终结果也将取决于什么order data[maxints-1-max_j],data[maxints-1-2*max_j].. were updated in, OpenMPs parallel for 明确不保证这一点。 (您可以使用 ordered 结构,但这比根本不使用并行 for 好不了多少)。

如果maxints < 2*max_j ,那么这很容易;你可以做

#pragma omp parallel for shared(data)
for (j = max_j; j < numints; j++){
data[j] += data[j-max_j];
}

而且您根本不需要任何同步,因为每个线程都只更新一个数据[j],而没有依赖于任何其他数据。但我的印象是 (a) 它不是,并且 (b) 这是一段较大代码的片段......

关于openmp - 避免在 OpenMP 中竞争(在并行 for 循环中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3952174/

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