我想使用 openmp 编写并行代码并减少矩阵 (X*X) 值的平方加法。我可以在#pragma omp parallel 之后使用“2 for loops”进行缩减吗?如果不是好心建议。
#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
即可解决。
最佳答案
您编写它的方式是正确的,但并不理想:只有外部循环将被并行化,而每个内部循环将在单独的线程上执行。如果 X
足够大(明显大于线程数),这可能没问题。如果您想并行化两个 循环,那么您应该向指令添加一个collapse(2)
子句。这告诉编译器将两个循环合并为一个循环并并行执行整个循环。
考虑一个示例,其中有 8 个线程,并且 X=4。如果没有 collapse
子句,只有四个线程会工作:每个线程会完成一个 index
值的工作。使用 collapse
子句,所有 8 个线程将各自完成一半的工作。 (当然,并行化如此微不足道的工作量是没有意义的——这只是一个例子。)
关于c - 如何使用openmp并行化代码以减少添加矩阵和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940339/