繁体   English   中英

使用RDTSC访问内存中的ARRAY的C中意外输出

[英]Unexpected output in C with access to ARRAY in memory with RDTSC

这是我用C语言编写的程序。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>

static int DATA[1024]={1,2,3,4,.....1024};

inline void foo_0(void)
{
    int j;
    puts("Hello, I'm inside foo_0");
    int k=0;
    for(j=0;j<1024;j++)
    {
        //k=DATA[j];
        DATA[j]+=1;
    }
    k+=0;
}


inline void foo_1(void)
{
    int j;
    puts("Hello, I'm inside foo_1");
    int k=0;
    for(j=0;j<1024;j+=4)
    {
        //k=DATA[j];
        DATA[j]+=1;
    }
    k+=0;
}

inline void foo_2(void)
{
    int j;
    puts("Hello, I'm inside foo_2");
    int k=0;
    for(j=0;j<1024;j+=16)
    {
        //k=DATA[j];
        DATA[j]+=1;
    }
    k+=0;
}


inline uint64_t rdtsc()
{
    unsigned long a, d;
    asm volatile ("cpuid; rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx");// core i3/i7 
    return a | ((uint64_t)d << 32);
}

inline void clflush(volatile void *p)
{
    asm volatile ("clflush (%0)" :: "r"(p));
}

int main(void)
{

    volatile uint64_t start, end,temp;
    unsigned long long total_time=0;


    foo_0();  // This will load DATA array into memory
    foo_1();  // DATA already loaded into memory
    foo_2(); // DATA already loaded into memory

    printf("**********************\n");  
    start=rdtsc();
    foo_2();
    end=rdtsc();
    temp=end-start;
    total_time=temp;

    printf("Time taken foo_2 = %llu\n",total_time);             

    start=rdtsc();
    foo_1();
    end=rdtsc();
    temp=end-start;
    total_time=temp;

    printf("Time taken foo_1 = %llu\n",total_time);

    start=rdtsc();
    foo_0();
    end=rdtsc();
    temp=end-start;
    total_time=temp;

    printf("Time taken foo_0 = %llu\n",total_time);


    return 0;
}

输出:

Hello, I'm inside foo_0
Hello, I'm inside foo_1
Hello, I'm inside foo_2
**********************
Hello, I'm inside foo_2
**Time taken foo_2 = 6350**
Hello, I'm inside foo_1
**Time taken foo_1 = 10056**
Hello, I'm inside foo_0
**Time taken foo_0 = 21726**

编辑1:

当我从所有三个函数中删除puts()时,我得到了这个结果

Time taken foo_0 = 16448
Time taken foo_1 = 4438
**********************
Time taken foo_2 = 1548

期望对所有三个foo_0,foo_1和foo_2的访问时间与访问内存以访问整数时所用的访问时间相同 ,整个缓存块均已加载(块大小为64字节,因此在缓存块内部加载了16个整数),因此访问时间为1、4、16的整数必须相同。 明白。 我在哪里犯错? 我在Linux下使用gcc。 提前致谢 。

编辑2

根据BЈовић的回答和评论中Leeor的建议,执行时间必须不同,因为在三个不同功能中执行的加法运算数不同。 尽管在这三种情况下都不会丢失,但是加法操作的执行不会改变,并且对于所有操作, 数据都是从缓存访问的 (* 不是从主存储器访问 *我怀疑)总时间取决于未执行加法操作在阵列上,而不在缓存未命中/命中上。 因此,我接受BЈовић的回答和Leeor的建议。 谢谢大家。

1)您的进程被其他进程推到了后台,因此无法获得准确的时间。

2)由于循环不同,时间不可能相同:

foo_0(): for(j=0;j<1024;j++)
foo_1(): for(j=0;j<1024;j+=4)
foo_2(): for(j=0;j<1024;j+=16)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM