首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用OpenMP降低成本

使用OpenMP降低成本
EN

Stack Overflow用户
提问于 2012-11-08 21:48:53
回答 2查看 74K关注 0票数 20

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

我正在进行数据的线程化划分。例如,如果我有N线程,那么我用thread0处理行数/N行数,依此类推。

我的问题是:我可以将openmp clause子句与"#pragma omp parallel“一起使用吗?

代码语言:javascript
运行
复制
#pragma omp parallel reduction( + : sum )
{
    if( thread == 0 )
       bla bla code 
       sum = sum + val;

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

回答 2

Stack Overflow用户

发布于 2012-11-08 22:13:04

可以- region子句适用于整个并行区域以及单个for工作共享构件。例如,这可以减少在不同并行部分中完成的计算(重构代码的首选方法):

代码语言:javascript
运行
复制
#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工作共享构造在团队中的线程之间自动分配循环迭代,而不是使用部分重新实现循环迭代:

代码语言:javascript
运行
复制
#pragma omp parallel for private(val) reduction(+:sum)
for (row = 0; row < Rows; row++)
{
   bla bla code
   sum += val;
}

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

代码语言:javascript
运行
复制
for (row = 0; row < Rows; row++)
{
   bla bla code
   sum += val;
   if (sum > threshold)
      yada yada code
}

在这里,一旦sum的累加值超过了threshold的值,就应该在每次迭代中执行yada yada code。当循环并行运行时,sum的私有值可能永远不会达到threshold,即使它们的和达到了。

票数 30
EN

Stack Overflow用户

发布于 2014-05-08 04:14:53

约简是前缀和的一种解决方案,你可以对任何交换-结合运算符使用约简,如'+','-','*','/‘。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13290245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档