我想使用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解决了这个问题。
答案 0 :(得分:2)
你编写它的方式是正确的,但并不理想:只有外部循环才会被并行化,并且每个内部循环都将在各个线程上执行。如果X
足够大(明显大于线程数),这可能没问题。如果要并行化两个循环,则应该在指令中添加collapse(2)
子句。这告诉编译器将两个循环合并为一个循环并并行执行整个过程。
考虑一个例子,你有8个线程,X = 4。如果没有collapse
子句,则只有四个线程可以正常工作:每个线程将完成一个index
值的工作。使用collapse
子句,所有8个线程将分别执行一半的工作。 (当然,并行完成如此微不足道的工作是毫无意义的 - 这只是一个例子。)