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"
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
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. –
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
J'ai eu les mêmes problèmes reproduisant ses résultats, même avec le drapeau '-O0' activé ... –