Ускорение проблем с 4 потоками в четырехъядерной системе с использованием OpenMP

У меня проблема ускорения при использовании 4 потоков в четырехъядерной системе с использованием OpenMP. С 2 потоками эффективность близка к 1, но с 4 потоками она уменьшается вдвое, то есть время выполнения более или менее такое же, как при выполнении кода с использованием 2 потоков. Я искал на форуме OpenMP, и я нахожу аналогичную проблему, прежде чем из-за технологии Inter Turbo Boost. Пожалуйста, обратитесь к этому сообщению http://openmp.org/forum/viewtopic.php?f=3&т = 1289&начать = 0&hilit = Intel + турбо + импульс

Поэтому я попытался отключить турбонаддув на всех 4 процессорах моей машины, но не смог избавиться от проблемы.

Я взял только эталонный код по ссылке выше.

У меня есть ноутбук DELL, и моя сводная информация об аппаратном обеспечении / ОС выглядит следующим образом:

OS : Linux3.0.0.12-generic , Ubuntu
KDE SC Version : 4.7.1

Processor: Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz

Пожалуйста, дайте мне знать, что может быть другими возможными проблемами, которые не позволяют мне ускорить использование 4 потоков / ядер. В качестве дополнительной информации. Я проверил, что все 4 потока работают на разных ядрах.

Ждем ваших ответов.

Код:

#include <stdio.h>
#include <omp.h>
#include <math.h>double estimate_pi(double radius, int nsteps){

int i;
double h=2*radius/nsteps;
double sum=0;
for (i=1;i<nsteps;i++){
sum+=sqrt(pow(radius,2)-pow(-radius+i*h,2));
//sum+=.5*sum;
}
sum*=h;
sum=2*sum/(radius*radius);
//printf("radius:%f --> %f\n",radius,sum);
return sum;}

int main(int argc, char* argv[]){double ser_est,par_est;
long int radii_range;
if (argc>1) radii_range=atoi(argv[1]);
else radii_range=500;

int nthreads;
if (argc>2) nthreads=atoi(argv[2]);
else nthreads=omp_get_num_procs();

printf("Estimating Pi by averaging %ld estimates.\n",radii_range);
printf("OpenMP says there are %d processors available.\n",omp_get_num_procs());

int r;
double start, stop, serial_time, par_time;par_est=0;
double tmp=0;
ser_est=0;
start=omp_get_wtime();
for (r=1;r<=radii_range;r++){
tmp=estimate_pi(r,1e6);
ser_est+=tmp;
}
stop=omp_get_wtime();
serial_time=stop-start;
ser_est=ser_est/radii_range;

omp_set_num_threads(nthreads);
start=omp_get_wtime();
#pragma omp parallel for private(r,tmp) reduction(+:par_est)
for (r=1;r<=radii_range;r++){
tmp=estimate_pi(r,1e6);
par_est+=tmp;
}
stop=omp_get_wtime();
par_time=stop-start;
par_est=par_est/radii_range;

printf("Serial Estimate: %f\nParallel Estimate:%f\n\n",ser_est,par_est);
printf("Serial Time: %f\nParallel Time:%f\nNumber of Threads: %d\nSpeedup: %f\nEfficiency: %f\n",serial_time,par_time,nthreads,serial_time/par_time, serial_time/par_time/nthreads);}

2

Решение

Core i7-2620M является двухъядерным с HT (таким образом, 4 логических ядра). HT не всегда улучшает производительность программы, и улучшение во многом зависит от самой программы (для некоторых приложений, интенсивно использующих память, оно может даже ухудшиться). Вы не должны ожидать ускорения в 4 раза, так как у него нет 4 физических ядер.

Если у вас есть время, стоит немного почитать здесь: http://software.intel.com/en-us/articles/performance-insights-to-intel-hyper-threading-technology/

5

Другие решения

была другая проблема. это было из-за функции printf.

переписал весь код, только потом нашел его. У меня новый 8-ядерный компьютер, но open mp использовал только 4 потока на одном процессоре, проверил все: по умолчанию (нет), чтобы найти ошибки, использовал firstprivate, чтобы сделать переменные только для чтения, и это все еще не работало.
Тогда я забыл сделать printf из rowid-s строк, что сделано, и тогда это сработало!

-2

По вопросам рекламы [email protected]