如何使用openmp并行化代码以减少矩阵和

时间:2014-11-14 23:09:12

标签: c matrix parallel-processing openmp shared-memory

我想使用openmp和reduction来编写并行代码,用于矩阵(X * X)值的平方加法。我可以使用" 2进行循环播放"在#pragma omp并行进行还原之后。如果不是善意的话。

#pragma omp parallel
{
#pragma omp parallel for reduction(+:SqSumLocal)
for(index=0; index<X; index++)
{
  for(i=0; i<X; i++)
  {
  SqSumLocal = SqSumLocal + pow(InputBuffer[index][i],2);
  }
 }
}

解决方案:在#pragma omp parallel下添加int i解决了这个问题。

1 个答案:

答案 0 :(得分:2)

你编写它的方式是正确的,但并不理想:只有外部循环才会被并行化,并且每个内部循环都将在各个线程上执行。如果X足够大(明显大于线程数),这可能没问题。如果要并行化两个循环,则应该在指令中添加collapse(2)子句。这告诉编译器将两个循环合并为一个循环并并行执行整个过程。

考虑一个例子,你有8个线程,X = 4。如果没有collapse子句,则只有四个线程可以正常工作:每个线程将完成一个index值的工作。使用collapse子句,所有8个线程将分别执行一半的工作。 (当然,并行完成如此微不足道的工作是毫无意义的 - 这只是一个例子。)