再现“处理器缓存效果库”

时间:2010-10-09 16:24:07

标签: c macos caching hardware

阅读this文章后,我尝试在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;
}

我按this blog中所述测量了时间,希望它是正确的。我也想知道在Mac上测量执行时间或CPU周期应该用什么。或者更好的是,它会看到特定功能的缓存命中/未命中数量。然而,Shark仅以百分比显示l2缓存未命中。

在编译32位时更新它,注意int大小从8字节变为4字节

Updating every k-th int compiled for 32bit

1 个答案:

答案 0 :(得分:1)

一些事情:

  • 你的工作循环没有可观察到的副作用;你确定编译器没有优化其中的部分或全部吗?
  • int的大小可能不是一个字节
  • 你做的越大K,你所做的整体工作就越少(i在更少的迭代中达到len