gpt4 book ai didi

c - CLFLUSH() 的问题?

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:04 25 4
gpt4 key购买 nike

你能告诉我如何使用 clflush() 指令吗?我编写了以下简单代码来测量从缓存中读取变量的执行时间与从缓存中逐出变量后的执行时间之间的差异。但是我没有找到确凿的结果。使用 clflush() 清除缓存的正确方法是什么?

            #include <stdio.h>
#include <stdint.h>
#include"cpucycles.c"

#define REPEAT 1900000
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);
}

volatile int i;

inline void test()
{
uint64_t start, end,clock;
volatile int j;
long int rep;
int k;

clock=0;
for(rep=0;rep<REPEAT;rep++){
start = rdtsc();
j = i+1;
end = rdtsc();
clock=clock+(end-start);
k=j;
}
printf("took %lu ticks\n", clock);
}

inline void testflush()
{
uint64_t start, end,clock;
volatile int j;
int k;
long int rep;

clock=0;
for(rep=0;rep<REPEAT;rep++){
start = rdtsc();
j = i+1;
end = rdtsc();
clflush(&i);
clock=clock+(end-start);
k=j;
}
printf("took %lu ticks\n", clock);
}


int main(int ac, char **av)
{
i=5;
printf("------------------------------------------\n");
test();
printf("------------------------------------------\n");
testflush();
printf("------------------------------------------\n");
test();

return 0;
}

最佳答案

看起来您的“刷新”时间被其余代码淹没了。此外,如所写,您的非刷新执行的代码行更少(无刷新),使比较“不公平”。

更像是:

#include <stdio.h>
#include <stdint.h>
#include <malloc.h>
#include <emmintrin.h>

#define REPEAT 1900000

volatile int i;

inline void test(void *v)
{
uint64_t start, end;
volatile int j;
long int rep;
int k;

start = __builtin_ia32_rdtsc();
for(rep=0;rep<REPEAT;rep++){
j = i+1;
_mm_clflush(v);
k=j;
}
end = __builtin_ia32_rdtsc();
printf("%p took %lu ticks\n", v, end-start);
}

int main(int ac, char **av)
{
void *v = malloc(1000);
i=5;
printf("------------------------------------------\n");
test(v);
printf("------------------------------------------\n");
test((void *)&i);
printf("------------------------------------------\n");
test(v);
free(v);

return 0;
}

这样我们总是刷新一些东西,但是一个测试会影响你的全局,而另一个不会。它也不使用任何内联汇编。

使用 -O3 构建,这给了我 149 次非刷新和 312 次刷新。

关于c - CLFLUSH() 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39452678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com