2010-10-09 9 views
3

Après avoir lu this article j'ai essayé de reproduire l'exemple sur mon Mac. Cependant ma courbe pour le premier exemple est complètement différente et je ne comprends pas pourquoi ..Reproduire "Galerie des effets de cache du processeur"

Updating every k-th int

Mon code est ci-dessous:

#include <mach/mach_time.h> 
#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 

void mach_absolute_difference(uint64_t end, uint64_t start, struct timespec *tp) { 
    uint64_t difference = end - start; 
    static mach_timebase_info_data_t info = {0,0}; 

    if (info.denom == 0) 
     mach_timebase_info(&info); 

    uint64_t elapsednano = difference * (info.numer/info.denom); 

    tp->tv_sec = elapsednano * 1e-9; 
    tp->tv_nsec = elapsednano - (tp->tv_sec * 1e9); 
} 

int main(void) 
{ 
    int len = 64 * 1024 * 1024; 
    int *arr = (int *)malloc(sizeof(int)*len); 

    uint64_t start,end; 
    struct timespec tp; 

    start = mach_absolute_time(); 
    for (int i = 0; i <len; i += K) 
     arr[i] = 0; 
    end = mach_absolute_time(); 

    mach_absolute_difference(end, start, &tp); 

    FILE *fp; 
    fp=fopen("simple_array.log", "a+"); 
    fprintf(fp, "%i\t%ld\t%ld\n", K, tp.tv_sec, 
      tp.tv_nsec); 
    fclose(fp); 

    free(arr); 
    return 0; 
} 

I mesuré le temps comme décrit dans this blog, dans l'espoir que c'est correct. Je me demande aussi ce que je devrais utiliser pour mesurer le temps d'exécution ou les cycles du processeur sur un Mac. Ou encore, il serait plus intéressant de voir le nombre de hits/échecs de cache pour une certaine fonction. Shark ne montre cependant que 12 échecs de cache en pourcentages.

Mise à jour c'est quand compilé 32 bits, notez que les changements de taille int à partir de 8 octets à 4 octets

Updating every k-th int compiled for 32bit

+0

serait beaucoup plus facile si vous expérimenté avec ceci en assembleur. C'est pourquoi utiliser C au lieu d'un assembleur pour apprendre des concepts de bas niveau est mauvais. –

+1

Je n'ai jamais utilisé l'assembleur x86 et je n'ai actuellement pas le temps de l'apprendre. Cependant, dans "Galerie des effets de cache du processeur" C# est utilisé, ce qui est encore plus haut niveau .. – Nils

+0

J'ai eu les mêmes problèmes reproduisant ses résultats, même avec le drapeau '-O0' activé ... –

Répondre

1

Quelques Choses:

  • Votre boucle de travail n'a pas de effets secondaires observables; Êtes-vous sûr que le compilateur n'optimise pas tout ou partie de tout?
  • Un int est probablement pas un octet en taille
  • plus vous faites K, moins de travail que vous faites ensemble (i atteint len en moins d'itérations)
+0

Comment puis-je m'assurer que le compilateur ne l'optimise pas? Je compilé avec -O0 (en utilisant gcc) .. Sure int est de 8 octets dans un arc de 64bit, je suppose – Nils

+0

Il est probablement plus logique de le diviser par 8. – Nils

+0

Ok la courbe (32bit) est plus plate après 16 .. peut-être là est aussi trop de bruit sur mon système. – Nils