web-dev-qa-db-fra.com

Mesurer le temps d'exécution en code OpenMP C ++

J'utilise un code .cpp (i) en style séquentiel et (ii) en utilisant des instructions OpenMP. J'essaie de voir le décalage horaire. Pour calculer le temps, j'utilise ceci:

#include <time.h>
.....
main()
{

  clock_t start, finish;
  start = clock();
  .
  .
  .
  finish = clock();

  processing time = (double(finish-start)/CLOCKS_PER_SEC);

 }

Le temps est assez précis dans l'exécution séquentielle (ci-dessus) du code. Cela prend environ 8 secondes pour exécuter ceci. Lorsque j'insère des instructions OpenMP dans le code et calcule ensuite le temps, j'obtiens une réduction de temps, mais le temps affiché est d'environ 8 à 9 secondes sur la console, alors qu'en réalité ce ne sont que 3 à 4 secondes en temps réel!

Voici à quoi ressemble mon code de manière abstraite:

#include <time.h>
.....
main()
{

  clock_t start, finish;
  start = clock();
  .
  .
  #pragma omp parallel for
  for( ... )
     for( ... )
       for (...)
    {           
      ...;      
    }
  .
  .
  finish = clock();

  processing time = (double(finish-start)/CLOCKS_PER_SEC);

 }

Lorsque j'exécute le code ci-dessus, j'obtiens la réduction de temps mais le temps affiché n'est pas précis en termes de temps réel. Il me semble que la fonction clock () calcule le temps individuel de chaque thread et les additionne et les affiche.

Quelqu'un peut-il en expliquer la raison ou me suggérer une autre fonction de synchronisation à utiliser pour mesurer le temps dans les programmes OpenMP?

Merci.

27
Benny

J'ai vu clock () signaler le temps CPU, au lieu du temps réel.

Vous pourriez utiliser

struct timeval start, end;
gettimeofday(&start, NULL);

// benchmark code

gettimeofday(&end, NULL);

delta = ((end.tv_sec  - start.tv_sec) * 1000000u + 
         end.tv_usec - start.tv_usec) / 1.e6;

Pour chronométrer les choses à la place

17
sehe

Il me semble que la fonction clock () calcule le temps individuel de chaque thread et les additionne et les affiche.

C'est exactement ce que clock() fait - il mesure le temps CPU utilisé par le processus, ce qui au moins sur Linux et Mac OS X signifie le temps CPU cumulé de tous les threads qui ont déjà existait depuis le début.

La synchronisation en temps réel (ou horloge murale) des applications OpenMP doit être effectuée à l'aide de l'appel de minuterie OpenMP haute résolution omp_get_wtime() qui renvoie une valeur double du nombre de secondes depuis un point arbitraire dans le passé. C'est une fonction portable, par ex. existe dans les exécutions Unix et Windows OpenMP, contrairement à gettimeofday() qui est uniquement Unix.

35
Hristo Iliev

Eh bien oui, c'est ce que clock() est censé faire, vous dire combien de temps processeur le programme a utilisé.

Si vous souhaitez rechercher le temps réel écoulé, au lieu du temps CPU, utilisez une fonction qui renvoie l'heure de l'horloge murale, telle que gettimeofday().

5
Ben Voigt
#include "ctime"

std::time_t start, end;
long delta = 0;
start = std::time(NULL);

// do your code here

end = std::time(NULL);
delta = end - start;

// output delta
0
Erdinc Ay