我正在尝试使用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循环。任何见解都会有所帮助。
答案 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也必须等待第二次读取,它将同时执行(只有在两个值都准备好后才会启动操作)。