![](/img/trans.png)
[英]Difference between rdtscp, rdtsc : memory and cpuid / rdtsc?
[英]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.