【发布时间】:2016-01-22 01:42:10
【问题描述】:
我正在尝试使用 OpenMP 并行化此代码。
for(t_step=0;t_step<Ntot;t_step++) {
// current row
if(cur_row + 1 < Npt_x) cur_row++;
else cur_row = 0;
// get data from file which update only the row "cur_row" of array val
read_line(f_u, val[cur_row]);
// computes
for(i=0;i<Npt_x;i++) {
for(j=0;j<Npt_y;j++) {
i_corrected = cur_row - i;
if(i_corrected < 0) i_corrected = Npt_x + i_corrected;
R[i][j] += val[cur_row][0]*val[i_corrected][j]/Ntot;
}
}
}
与
- val 和 R 声明为 **double,
- Npt_x 和 Npt_y 大约是 500,
- Ntot 约为 10^6。
我已经做到了
for(t_step=0;t_step<Ntot;t_step++) {
// current row
if(cur_row + 1 < Npt_x) cur_row++;
else cur_row = 0;
// get data from file which update only the row "cur_row" of array val
read_line(f_u, val[cur_row]);
// computes
#pragma omp parallel for collapse(2), private(i,j,i_corrected)
for(i=0;i<Npt_x;i++) {
for(j=0;j<Npt_y;j++) {
i_corrected = cur_row - i;
if(i_corrected < 0) i_corrected = Npt_x + i_corrected;
R[i][j] += val[cur_row][0]*val[i_corrected][j]/Ntot;
}
}
}
问题是它似乎没有效率。在这种情况下,有没有办法更有效地使用 OpenMP?
多谢
【问题讨论】:
-
您可以使用循环平铺来提高缓存的使用率。
-
我建议你尝试性能工具(例如Paraver bsc.es/computer-sciences/performance-tools/paraver)来探索这段代码的性能。
标签: c multithreading for-loop parallel-processing openmp