【发布时间】:2014-03-01 18:08:36
【问题描述】:
我编写了两个程序来检查 clflush 是否正在从缓存中清除我的数据。在我编写的两个程序中,只有一个给出了正确的结果(按照我的预期,在 clflush 之后,访问时间必须比刷新之前的时间长)。
这是我得到预期结果的 Program1。
#include <stdio.h>
#include <stdint.h>
inline void clflush(volatile void *p)
{
asm volatile ("clflush (%0)" :: "r"(p));
}
inline uint64_t rdtsc()
{
unsigned long a, d;
asm volatile ("cpuid; rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx");
return a | ((uint64_t)d << 32);
}
static int i=10; // static variable
inline void test()
{
uint64_t start, end;
int j;
start = rdtsc();
j = i;
end = rdtsc();
printf("took %lu ticks\n", end - start);
}
int main(int ac, char **av)
{
test();
test();
printf("flush: ");
clflush((void *)&i);
test();
test();
return 0;
}
这是我的输出(如预期的那样)
took 314 ticks
took 282 ticks
flush: took 442 ticks
took 272 ticks
这是另一个程序,我没有得到预期的结果。
#include <stdio.h>
#include <stdint.h>
inline void clflush(volatile void *p)
{
asm volatile ("clflush (%0)" :: "r"(p));
}
inline uint64_t rdtsc()
{
unsigned long a, d;
asm volatile ("cpuid; rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx");
return a | ((uint64_t)d << 32);
}
static const int i=10; // I make this as constant
inline void test()
{
uint64_t start, end;
int j;
start = rdtsc();
j = i;
end = rdtsc();
printf("took %lu ticks\n", end - start);
}
int main(int ac, char **av)
{
test();
test();
printf("flush: ");
clflush((void *)&i);
test();
test();
return 0;
}
这是我的输出(如预期的那样)
took 314 ticks
took 282 ticks
flush: took 282 ticks // same as previous
took 272 ticks
--------
took 314 ticks
took 282 ticks
flush: took 272 ticks // lower than previous
took 272 ticks
如果我让静态 int i=10;进入静态 const int i=10;那么结果并不符合我的预期。在 clflush 之后,我得到了更低的价值/平等的访问时间。
谁能解释为什么会这样?我怎样才能按照我的期望(在 clflush as program1 之后访问时间更长)来制作它(在 C 或 C++ 中)?
我在 Fedora19 linux 下使用 GCC。任何帮助将不胜感激。
【问题讨论】:
-
你使用什么编译器选项?
-
我正在使用这个选项编译,gcc -O0 test.c -o test
-
完全删除
j=i需要多长时间?我猜你只是测量cpuid的延迟 -
@ Leeor ,如果我完全删除 j=i 语句,我得到了 296 个滴答 272 个滴答 刷新:两种情况(非 const 和 const )都花费了 272 个滴答 272 个滴答。
-
(保留
@附加到名称,否则 SO 不会发送有关您的评论的消息)。无论如何,这表明大部分时间度量确实是 cpuid(以及它的序列化引起的停顿)
标签: c++ c linux performance-testing cpu-architecture