我正在尝试计算运行CPUID指令所需的时间。
来源:
#include <stdio.h>
#include <sched.h>
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
static inline unsigned long long tick()
{
unsigned long long d;
asm volatile ("rdtsc" : "=A" (d));
return d;
}
void cpuid(void)
{
int i;
for(i=0; i != 5; i++)
{
asm volatile ("cpuid");
}
}
int main()
{
long long bef;
long long aft;
long long dif;
bef=tick();
cpuid();
aft=tick();
dif=aft-bef;
printf("%d\n", bef);
printf("%d\n", aft);
printF("%d\n", dif);
return 0;
}
现在我正在使用以下
进行编译gcc -D_GNU_SOURCE -o test test.c
我的代码不会出现文件错误! 例如:
test.c:6:1: error: expected identifier or '(' before 'do'
test.c:6:1: error: expected identifier or '(' before 'while'
test.c:7:1: error: expected identifier or '(' before '__extension__'
test.c:8:1: warning: data definition has no type or storage class [enable by def...
test.c:8:1: error: intializer element is not constant
&#34; def ...&#34;实际上输出不是因为我的终端窗口很小。我在ESXi工作。
任何帮助都会很棒!!!
未来读者
用户@Iwillnotexist Idonotexist说正确使用以下功能完整的x86&amp; x64支持。
static __inline__ unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
答案 0 :(得分:3)
你有一个函数之外的代码。这是不允许的。将以下内容移至main
:
CPU_ZERO(&mask);
CPU_SET(0, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
答案 1 :(得分:1)
这些说明应该是main():
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
这应该可以解决编译错误。
然后,cpuid()
的五次迭代太少,无法给出有意义的结果。
您可以检查此answer,但使用两个不同长度的序列,仅使用CPUID指令。你需要一个更长的周期,但不要太长,内存提取进入游戏。
我已经在TEST定义的5到1000之间运行了一些测试; CPU亲和力似乎不会影响四核上的结果:
#include <stdio.h>
#include <sched.h>
static inline unsigned long long tick() {
unsigned long long d;
asm volatile ("rdtsc" : "=A" (d));
return d;
}
static inline void cpuid(void) {
int i;
for(i=0; i != TEST; i++) {
asm volatile ("cpuid");
}
}
int main()
{
long long bef, aft, dif;
bef=tick();
cpuid();
aft=tick();
dif=(aft-bef)/TEST;
printf("%lld\n", dif);
return 0;
}
gcc -o0 -DTEST=100 -D_GNU_SOURCE -W -Wall -o time time.c && ./time