Воспроизведение "Галерея эффектов кэша процессора" - PullRequest
3 голосов
/ 09 октября 2010

Прочитав эту статью, я попытался воспроизвести пример на моем Mac. Однако моя кривая для первого примера выглядит совершенно иначе, и я не понимаю, почему ..

Updating every k-th int

Мой код ниже:

#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;
}

Я измерил время, как описано в этом блоге , надеясь, что это правильно. Мне также интересно, что я должен использовать для измерения времени выполнения или циклов ЦП на Mac. Или еще приятнее было бы увидеть количество попаданий / пропусков кэша для определенной функции. Акула, однако, показывает только пропуски в кеше l2 в процентах.

Обновите это при компиляции для 32 бит, обратите внимание, что размер int изменяется с 8 байтов до 4 байтов

Updating every k-th int compiled for 32bit

1 Ответ

1 голос
/ 09 октября 2010

Несколько вещей:

  • Ваш рабочий цикл не имеет видимых побочных эффектов; Вы уверены, что компилятор не оптимизирует некоторые или все из них?
  • int, вероятно, имеет размер не один байт
  • Чем больше вы делаете K, тем меньше общая работа, которую вы делаете (i достигает len за меньшее количество итераций)
...