У меня есть то, что я понимаю как относительно простую конструкцию OpenMP. Проблема в том, что программа работает примерно на 100-300x быстрее с 1 потоком по сравнению с 2 потоками. 87% программы проводится в gomp_send_wait()
и еще 9,5% в gomp_send_post
.Ужасная производительность - простая проблема с накладными расходами, или есть программный недостаток?
Программа дает правильные результаты, но мне интересно, есть ли недостаток в коде, вызывающем некоторый конфликт ресурсов, или просто потому, что накладные расходы на создание потоков резко не стоят его для цикла цикла размер 4. p
варьируется от 17 до 1000, в зависимости от размера молекулы, которую мы имитируем.
Мои номера относятся к наихудшему случаю, когда p равно 17 и размер куска 4. Производительность одинакова независимо от того, использую ли я статическое, динамическое или управляемое планирование. С p=150
и размером куска 75
программа по-прежнему на 75x100x медленнее, чем серийная.
...
double e_t_sum=0.0;
double e_in_sum=0.0;
int nthreads,tid;
#pragma omp parallel for schedule(static, 4) reduction(+ : e_t_sum, e_in_sum) shared(ee_t) private(tid, i, d_x, d_y, d_z, rr,) firstprivate(V_in, t_x, t_y, t_z) lastprivate(nthreads)
for (i = 0; i < p; i++){
if (i != c){
nthreads = omp_get_num_threads();
tid = omp_get_thread_num();
d_x = V_in[i].x - t_x;
d_y = V_in[i].y - t_y;
d_z = V_in[i].z - t_z;
rr = d_x * d_x + d_y * d_y + d_z * d_z;
if (i < c){
ee_t[i][c] = energy(rr, V_in[i].q, V_in[c].q, V_in[i].s, V_in[c].s);
e_t_sum += ee_t[i][c];
e_in_sum += ee_in[i][c];
}
else{
ee_t[c][i] = energy(rr, V_in[i].q, V_in[c].q, V_in[i].s, V_in[c].s);
e_t_sum += ee_t[c][i];
e_in_sum += ee_in[c][i];
}
// if(pid==0){printf("e_t_sum[%d]: %f\n", tid, e_t_sum[tid]);}
}
}//end parallel for
e_t += e_t_sum;
e_t -= e_in_sum;
...
Сколько процессоров в системе вы arerunning на? – Michael
8 проки на этой тестовой системе – 2009-05-15 21:52:28