【发布时间】:2013-12-13 14:42:18
【问题描述】:
我读了这篇文章http://igoro.com/archive/gallery-of-processor-cache-effects/。文章说因为cacheline延迟,代码:
int[] arr = new int[64 * 1024 * 1024];
// Loop 1
for (int i = 0; i < arr.Length; i++) arr[i] *= 3;
// Loop 2
for (int i = 0; i < arr.Length; i += 16) arr[i] *= 3;
几乎有相同的执行时间,我写了一些示例 c 代码来测试它。我在带有 Ubuntu 64 位的 Xeon(R) E3-1230 V2、带有 Debian 的 ARMv6 兼容处理器 rev 7 上运行代码,并且还在 Core 2 T6600 上运行它。所有结果都不是文章所说的。
我的代码如下:
long int jobTime(struct timespec start, struct timespec stop) {
long int seconds = stop.tv_sec - start.tv_sec;
long int nsec = stop.tv_nsec - start.tv_nsec;
return seconds * 1000 * 1000 * 1000 + nsec;
}
int main() {
struct timespec start;
struct timespec stop;
int i = 0;
struct sched_param param;
int * arr = malloc(LENGTH * 4);
printf("---------sieofint %d\n", sizeof(int));
param.sched_priority = 0;
sched_setscheduler(0, SCHED_FIFO, ¶m);
//clock_gettime(CLOCK_MONOTONIC, &start);
//for (i = 0; i < LENGTH; i++) arr[i] *= 5;
//clock_gettime(CLOCK_MONOTONIC, &stop);
//printf("step %d : time %ld\n", 1, jobTime(start, stop));
clock_gettime(CLOCK_MONOTONIC, &start);
for (i = 0; i < LENGTH; i += 2) arr[i] *= 5;
clock_gettime(CLOCK_MONOTONIC, &stop);
printf("step %d : time %ld\n", 2, jobTime(start, stop));
}
每次我选择一个片段来编译和运行(注释一个并取消注释另一个)。 编译:
gcc -O0 -o cache cache.c -lrt
在 Xeon 上我明白了:
step 1 : 258791478
step 2 : 97875746
我想知道文章所说的是否正确?或者,最新的 cpu 是否有更高级的预取策略?
【问题讨论】:
-
您的
LENGTH设置为什么? -
#define LENGTH (64 * 1024 * 1024)
-
您不考虑进程交换、系统调用、缓存预热逻辑、涡轮增压。换句话说,您的测量结果不正确。
-
弗拉德我使用 FIFO 进行处理,并将所有 printf 移到底部,我还将 scaling_governor 核心设置为“性能”,我仍然得到相同的结果。您能否提供一个代码示例来执行此操作。谢谢。
-
@Vlad Lazarenko 你能举个例子吗?
标签: c cpu-architecture cpu-cache