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

标签 c matrix parallel-processing openmp shared-memory

我想使用 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/

相关文章:

multithreading - 同一节点中MPI进程如何通信

Java并行处理有返回值

c - 如何通过管道将 C 中定义的变量传递给 Gnuplot?

c - 在 C 中使用 strtok()

r - R中如何将向量转化为矩阵?

多 CPU 内核中的 Java 多线程

c - 浏览结构数组

c++ - 如何在Objective-C/C/C++中进行字符和字节位置的转换

MATLAB根据第1列条件维护2列

r - 点矩阵之间的距离,简单的 if 和 for