Я пытаюсь понять, почему программа (код ниже) работает быстрее, используя два протекторов вместо четырех на процессоре Intel (R) Core i5-3210M с частотой 2.50 ГГц, но на Intel (R) Core (TM) i7 -4510U CPU @ 2.00GHz с четырьмя потоковыми версиями работает быстрее, чем версия с двумя потоками одной и той же программы.Почему время выполнения одной и той же программы отличается для двух аналогичных процессоров?
# include <stdlib.h>
# include <stdio.h>
# include <math.h>
# include <time.h>
# include <omp.h>
int main (void);
void timestamp (void);
int main (void)
{
double a[500][500];
double angle;
double b[500][500];
double c[500][500];
int i;
int j;
int k;
int n = 500;
double pi = M_PI;
double s;
int thread_num;
double wtime;
timestamp ();
printf ("\n");
printf ("MXM_OPENMP:\n");
printf (" C/OpenMP version\n");
printf (" Compute matrix product C = A * B.\n");
omp_set_dynamic(0);
omp_set_num_threads(2); /* Change param to modify number of threads */
thread_num = omp_get_max_threads ();
printf ("\n");
printf (" The number of processors available = %d\n", omp_get_num_procs ());
printf (" The number of threads available = %d\n", thread_num);
printf (" The matrix order N = %d\n", n);
/*Loop 1: Evaluate A.*/
s = 1.0/sqrt ((double) (n));
wtime = omp_get_wtime ();
# pragma omp parallel shared (a, b, c, n, pi, s) private (angle, i, j, k)
{
# pragma omp for
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
angle = 2.0 * pi * i * j/(double) n;
a[i][j] = s * (sin (angle) + cos (angle));
}
}
/* Loop 2: Copy A into B.*/
# pragma omp for
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
b[i][j] = a[i][j];
}
}
/* Loop 3: Compute C = A * B.*/
# pragma omp for
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
c[i][j] = 0.0;
for (k = 0; k < n; k++)
{
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
}
}
printf (" The number of threads used = %d\n", omp_get_num_threads());
}
wtime = omp_get_wtime () - wtime;
printf (" Elapsed seconds = %g\n", wtime);
printf (" C(100,100) = %g\n", c[99][99]);
/*Terminate.*/
printf ("\n");
printf ("MXM_OPENMP:\n");
printf (" Normal end of execution.\n");
printf ("\n");
timestamp ();
return 0;
}
void timestamp (void)
{
# define TIME_SIZE 40
static char time_buffer[TIME_SIZE];
const struct tm *tm;
time_t now;
now = time (NULL);
tm = localtime (&now);
strftime (time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm);
printf ("%s\n", time_buffer);
return;
# undef TIME_SIZE
}
В первой строке говорится, что «2 потока» работают быстрее; последняя строка говорит, что «4 потока» работают быстрее. Итак, какой из них? Сколько у вас процессоров? –
Ввод более пяти мегабайт в стек может быть плохой идеей. – EOF
Оба процессора имеют одинаковое количество физических ядер (2) и поддерживают гиперпоточность, но в архитектуре есть тонкие различия, которые могут объяснить разницу, которую вы наблюдаете. Является ли эта разница значительной и систематической? – chqrlie