我正在尝试使用openmp计算二维矩阵的平均值。这个二维矩阵实际上是一幅图像。
我正在进行数据的线程化划分。例如,如果我有N线程,那么我用thread0处理行数/N行数,依此类推。
我的问题是:我可以将openmp clause子句与"#pragma omp parallel“一起使用吗?
#pragma omp parallel reduction( + : sum )
{
if( thread == 0 )
bla bla code
sum = sum + val;
else if( thread == 1 )
bla bla code
sum = sum + val;
}发布于 2012-11-08 22:13:04
可以- region子句适用于整个并行区域以及单个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;
}请注意,约简变量是私有的,它们的中间值(即,它们在parallel区域末尾的约简之前保持的值)只是部分的,并不是很有用。例如,下面的串行循环不能(很容易?)转换为具有归约操作的并行运算:
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
if (sum > threshold)
yada yada code
}在这里,一旦sum的累加值超过了threshold的值,就应该在每次迭代中执行yada yada code。当循环并行运行时,sum的私有值可能永远不会达到threshold,即使它们的和达到了。
发布于 2014-05-08 04:14:53
约简是前缀和的一种解决方案,你可以对任何交换-结合运算符使用约简,如'+','-','*','/‘。
https://stackoverflow.com/questions/13290245
复制相似问题