2015-05-08 3 views
-1

Я пытаюсь понять, почему программа (код ниже) работает быстрее, используя два протекторов вместо четырех на процессоре 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

В первой строке говорится, что «2 потока» работают быстрее; последняя строка говорит, что «4 потока» работают быстрее. Итак, какой из них? Сколько у вас процессоров? –

+0

Ввод более пяти мегабайт в стек может быть плохой идеей. – EOF

+0

Оба процессора имеют одинаковое количество физических ядер (2) и поддерживают гиперпоточность, но в архитектуре есть тонкие различия, которые могут объяснить разницу, которую вы наблюдаете. Является ли эта разница значительной и систематической? – chqrlie

ответ

0

Даже если у вас есть тот же самый аппарат, все функциональные возможности все еще могут быть разными. Зачем? Поскольку, когда может быть машина 1, запущены 200 сервисов, а в машине 2, 225, тогда программа на машине 2 будет меньше времени на процессор/ресурсы, что может привести к дополнительному времени.

Это точно зависит от выполняемых сервисов (фон и передний план оба).

+0

, и вы по-прежнему используете разные машины. – user29671

+0

Да, я использую разные машины, но аргумент запущенных служб недействителен, потому что я загрузил Ubuntu 15.04 на обоих из них. –