【问题标题】:openmp parallelizing code with an internal for loopopenmp 使用内部 for 循环并行化代码
【发布时间】:2017-05-03 13:33:30
【问题描述】:

我正在尝试使用 mpi 和 openmp 编写在并行硬件中运行的代码。我有以下代码:

#pragma omp parallel for private(k, temp_r)
for(j=0; j<size; j++){
     temp_r = b[j];
     for(k=0; k<rows; k++){
          temp_r = temp_r - A[j*rows + k] * x[k];
     }  
     r[j] = temp_r;
 }

我知道这段代码可以进一步改进,因为内部 for 循环是一个缩减。我可以减少一个 for 循环。但我不知道该怎么做,因为这里涉及两个 for 循环。任何见解都会有所帮助。

【问题讨论】:

  • 你真正想做什么?你的目标是什么?什么是典型的size/rows。你在什么系统上执行代码?最终,您必须提供minimal reproducible example 才能获得好的答案。
  • 就您所展示的内容而言,大多数编译器应该都能很好地处理它。根据编译器和选项,内部循环上的 #pragma omp simd reduction(+: temp_r) 可能有助于也可能不会帮助产生 simd 优化。如果您的编译器对 j 的使用产生警告,则通过 for(int j=o;... 将其设为本地应该会有所帮助。

标签: for-loop parallel-processing openmp


【解决方案1】:

如果size &gt;&gt; #CPUs 则对内部循环使用缩减只会降低性能。与串行相比,减少需要额外的log(#CPUs) 步骤。 因此,进一步并行化此代码将不会获得改进,并且可能会损害它。 但是,如果size &lt; #CPUs 会提高性能。这是因为您将拥有比 CPU 更少的工作块。

缓存优化也不可行。每个基本操作 (temp_r = temp_r - A[j*rows + k] * x[k]) 需要读取两个值(A[j][k]x[k]),其中一个是该操作专有的(A[j][k]),这意味着它不在缓存中。 如果您正在使用Out-of-Order-Exectution CPU(您可能是),您将不会通过尝试改善缓存位置而不是读取x 数组而获得任何改进,因为CPU 还必须等待第二个读取,它会同时执行(只有在两个值都准备好后才会启动操作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多