Я пытаюсь распараллелить этот код с помощью OpenMP.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;
}
}
}
с
- вал и R ** объявлен как двойной,
- 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 более эффективно в этом случае?
Многого Thks
Возможно, вы сможете использовать черепицу с использованием цикла использования для улучшения использования кеша. –
Предлагаю вам попробовать инструменты производительности (например, Paraver http://www.bsc.es/computer-sciences/performance-tools/paraver), чтобы изучить производительность этого кода. – Harald