我试图了解不同步骤的以下代码的执行时间,但有些数字对我来说真的很混乱。这是一个简单的代码,用于增加步骤的内存读取。 这是我的代码
#include <iostream>
#include <algorithm>
#include <ctime>
#include <stdio.h>
using namespace std;
int main(){
int a=1024;
int numLoop=a;
int temp =0;
int * arr;
arr = (int*) malloc (100000000 * sizeof(int));
for(int array=a; array<(a+1); array+=1) {
for(int step=1; step<(numLoop+1); step*=2) {
clock_t begin = clock();
for(int v=1; v<(step+1); v++) {
for(int i=0; i<array; i+=step) {
temp = (temp+arr[i]) % 33721;
}
}
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
printf("%0.6lf %d %d\n",elapsed_secs,step,array);
}
}
return 0;
}
执行后我得到了以下结果
0.000073 1 1024
0.000069 2 1024
0.000078 4 1024
0.000099 8 1024
0.000140 16 1024
0.000220 32 1024
0.000432 64 1024
0.000682 128 1024
0.001354 256 1024
0.002693 512 1024
0.005178 1024 1024
架构细节:
飞思卡尔p4080ds QorIQ处理器 活动核心数:1(已配置) L1缓存:32kB 二级缓存:128kB L3缓存:2MB (关于架构的更多信息是here)
这对我来说最令人不安的是结果的最后一行。当step = 1024时,它访问arr [0] 1024次,这应该在第一次访问后在缓存中。那为什么它需要最高的执行时间(0.005178)?