在C中设置CPU关联的问题

时间:2014-04-21 18:22:19

标签: c linux compiler-errors cpu compiler-warnings

我正在尝试计算运行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 );
}

2 个答案:

答案 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