嵌入式Linux中的cache vs uncache内存访问

时间:2013-12-17 13:16:13

标签: c linux linux-kernel embedded-linux

我有一个运行嵌入式Linux的嵌入式目标,我想计算以下时间:

1)高速缓冲存储器读/写定时 2)解除内存读/写时序

Linux中是否有任何标准测试来计算上述时间?

我写了自己的测试:

void *mem_src  = (void*)malloc(MEM_SIZE);
void *mem_dest = (void*)malloc(MEM_SIZE);

clock_gettime(CLOCK_THREAD_CPUTIME_ID, &pre);
memcpy(mem_dest, mem_src, MEM_SIZE);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &post);

printf("time %ld\n",
        (SEC_TO_NSEC(post.tv_sec) + post.tv_nsec) -
        (SEC_TO_NSEC(pre.tv_sec) + pre.tv_nsec));

但问题是此测试只能计算缓存内存访问的时间,因为用户空间中的malloc仅从缓存区域分配内存。 我想要对uncache内存区域进行类似的测试。

1 个答案:

答案 0 :(得分:2)

首先=您的测试测量内存带宽 - 如果您需要延迟,则需要使访问依赖(例如,遍历链接列表)。

第二 - 您没有初始化复制的数据,因此您将在时间循环内获得页面错误。这里描述了同样的问题 - cpu cacheline and prefetch policy

对于不可缓存的请求 - 最简单的选择是检查编译器是否识别流媒体存储/加载,它们的行为与非缓存类似(除非您对测量MMIO或类似的特殊情况感兴趣)