gpt4 book ai didi

openmp - 使用 OpenMP 进行缩减

转载 作者:行者123 更新时间:2023-12-03 23:23:26 27 4
gpt4 key购买 nike

我正在尝试使用 openmp 计算二维矩阵的平均值。这个二维矩阵实际上是一个图像。

我正在对数据进行线程分割。例如,如果我有 N线程比我处理行/N thread0 的行数, 等等。

我的问题是:我可以使用带有“#pragma omp parallel”的 openmp 缩减子句吗?

#pragma omp parallel reduction( + : sum )
{
if( thread == 0 )
bla bla code
sum = sum + val;

else if( thread == 1 )
bla bla code
sum = sum + val;
}

最佳答案

是的,您可以 - 减少条款适用于整个平行区域以及单个 for工作共享结构。这允许例如减少在不同并行部分中完成的计算(重构代码的首选方式):

#pragma omp parallel sections private(val) reduction(+:sum)
{
#pragma omp section
{
bla bla code
sum += val;
}
#pragma omp section
{
bla bla code
sum += val;
}
}

您还可以使用 OpenMP for工作共享构造自动在团队中的线程之间分配循环迭代,而不是使用部分重新实现它:

#pragma omp parallel for private(val) reduction(+:sum)
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
}

请注意,归约变量是私有(private)的,它们的中间值(即它们在 parallel 区域末尾归约之前持有的值)只是部分的,不是很有用。例如,下面的串行循环不能(很容易?)通过归约操作转换为并行循环:

for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
if (sum > threshold)
yada yada code
}

这里 yada yada code应在每次迭代中执行一次 sum 的累积值已通过 threshold 的值.当循环并行运行时, sum 的私有(private)值可能永远达不到 threshold ,即使他们的总和确实如此。

关于openmp - 使用 OpenMP 进行缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290245/

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