openmp并行化代码与内部for循环

时间:2017-05-03 13:33:30

标签: for-loop parallel-processing openmp

我正在尝试使用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循环。任何见解都会有所帮助。

1 个答案:

答案 0 :(得分:1)

如果size >> #CPUs那么使用内部循环的缩减只会降低性能。与序列相比,减少需要额外的log(#CPUs)步骤。 因此,进一步并行化此代码将不会获得改进,并可能会对其造成损害。 但是,如果size < #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也必须等待第二次读取,它将同时执行(只有在两个值都准备好后才会启动操作)。