了解具有不同步幅的内存访问代码的执行时间

时间:2015-01-14 09:37:17

标签: performance caching optimization computer-architecture powerpc

我试图了解不同步骤的以下代码的执行时间,但有些数字对我来说真的很混乱。这是一个简单的代码,用于增加步骤的内存读取。 这是我的代码

#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)?

0 个答案:

没有答案