Как узнать, на каком физическом процессоре и на каком физическом ядре выполняется мой код - PullRequest
6 голосов
/ 17 мая 2011

Как узнать в программе на C, на каком физическом процессоре и ядре работает мой код?Я использую Linux и GCC 4.4.3.

Ответы [ 5 ]

9 голосов
/ 16 мая 2013

sched_getcpu ()

вызов возвращает номер виртуального процессора. Преобразование виртуального ЦП в реальную информацию о ЦП находится в /proc/cpuinfo.

Если ваша система поддерживает VDSO, то sched_getcpu() относительно быстрый.

Номер ЦП также может быть получен с помощью инструкции CPUID, но он медленнее, чем sched_getcpu().

2 голосов
/ 17 мая 2011

См. http://en.wikipedia.org/wiki/CPUID#Accessing_the_id_from_other_languages

То, что вы хотите, это идентификатор APIC ... в основном:

    cpuid
    shr     ebx, 24
0 голосов
/ 17 мая 2011

Вы можете проверить / proc // stat файловой системы, в соответствии с http://www.kernel.org/doc/Documentation/filesystems/proc.txt, вам нужно просто проверить флаг task_cpu.

Как пример без правильных типов и проверки ошибок:

struct pstat
{
  int  pid;       //process id
  char tcomm[256];//filename of the executable
  char state[2];  //state (R is running, S is sleeping, D is sleeping in an
                  //uninterruptible wait, Z is zombie, T is traced or stopped)
  int ppid;//          process id of the parent process
  int pgrp;//          pgrp of the process
  int sid;//           session id
  int tty_nr;//        tty the process uses
  int tty_pgrp;//      pgrp of the tty
  int flags;//         task flags
  int min_flt;//       number of minor faults
  int cmin_flt;//      number of minor faults with child's
  int maj_flt;//       number of major faults
  int cmaj_flt;//      number of major faults with child's
  int utime;//         user mode jiffies
  int stime;//         kernel mode jiffies
  int cutime;//        user mode jiffies with child's
  int cstime;//        kernel mode jiffies with child's
  int priority;//      priority level
  int nice;//          nice level
  int num_threads;//   number of threads
  int it_real_value;//  (obsolete, always 0)
  int start_time;//    time the process started after system boot
  int vsize;//         virtual memory size
  int rss;//           resident set memory size
  int rsslim;//        current limit in bytes on the rss
  int start_code;//    address above which program text can run
  int end_code;//      address below which program text can run
  int start_stack;//   address of the start of the stack
  int esp;//           current value of ESP
  int eip;//           current value of EIP
  int pending;//       bitmap of pending signals
  int blocked;//       bitmap of blocked signals
  int sigign;//        bitmap of ignored signals
  int sigcatch;//      bitmap of catched signals
  int wchan;//         address where process went to sleep
  int i0;//             (place holder)
  int i1;//             (place holder)
  int exit_signal;//   signal to send to parent thread on exit
  int task_cpu;//      which CPU the task is scheduled on
  int rt_priority;//   realtime priority
  int policy;//        scheduling policy (man sched_setscheduler)
  int blkio_ticks;//   time spent waiting for block IO
  int gtime;//         guest time of the task in jiffies
  int cgtime;//        guest time of the task children in jiffies
} p ;

int main()
{
    char name[256];
    char state[8];
    FILE* f = fopen("/proc/self/stat", "r");

    fscanf(f,  "%d%s%s%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
           &p.pid, &p.tcomm, &p.state, &p.ppid, &p.pgrp, &p.sid, &p.tty_nr, &p.tty_pgrp, &p.flags,
           &p.min_flt, &p.cmin_flt, &p.maj_flt, &p.cmaj_flt, &p.utime, &p.stime,  &p.cutime, &p.cstime,
           &p.priority, &p.nice, &p.num_threads, &p.it_real_value, &p.start_time,  &p.vsize, &p.rss,
           &p.rsslim, &p.start_code, &p.end_code, &p.start_stack, &p.esp, &p.eip,  &p.pending, &p.blocked,
           &p.sigign, &p.sigcatch, &p.wchan, &p.i0, &p.i1, &p.exit_signal,  &p.task_cpu, &p.rt_priority, &p.policy,
           &p.blkio_ticks, &p.gtime, &p.cgtime);

     printf("CPU %d\n", p.task_cpu);
 return 0;  
 }
0 голосов
/ 17 мая 2011

По большому счету, это трудно понять осмысленно. Ваш поток часто будет работать на разных процессорах в течение своей жизни. Вы можете вызвать функцию, чтобы спросить, на каком процессоре вы находитесь, и получить переключение контекста во время выполнения функции. Что должна вернуть функция?

0 голосов
/ 17 мая 2011

Вы можете получить привязку процесса к процессору с помощью GCC.API-интерфейсы CPU могут вам помочь.Вы пытаетесь использовать эту информацию, чтобы гарантировать, что ваш процесс не прерывается или такая высокоприоритетная задача?

...