NUMA Получить текущий узел / ядро

Я использую libnuma в Linux. Мои потоки должны знать об узле / ядре, которое ониснова работает. Можно ли получить текущие темы?с узлом / ядром как-то? Я'просмотрел документацию, но я нене могу найти такую функцию ...

Ответы на вопрос(3)

getcpu() системный вызов. Как говорится на странице руководства:

определить процессор и узел NUMA, на котором работает вызывающий поток

Итак, это должно служить вашей цели. Необходимо включить, с версией ядра больше 2.6.19 и для x86_64, i386 arch.

 Lovro03 июн. 2013 г., 14:47
Спасибо, это должно сработать, но я нене удается запустить его. Там'нет нетLinux / getcpu.h>и документация говорит, что он должен быть вызван напрямую с помощью syscall (). Поэтому я попробовал другое решение с помощью <utmpx.h> и sched_getcpu () ...
Решение Вопроса

#include <stdio.h>
#include <utmpx.h>

int main(void) {
  printf("CPU: %d\n", sched_getcpu());
  return 0;
}
</utmpx.h></stdio.h>

Затем, если вам нужен узел процессора, вы можете использовать numa.h:

int cpu = sched_getcpu();
int node = numa_node_of_cpu(cpu);
 rakib_03 июн. 2013 г., 18:18
sched_getcpu () - самый стабильный способ получить cpuid. Поскольку вы явно искали как процессор, так и идентификатор узла, это 'Вот почему я ответил с getcpu (). На самом деле, getcpu () неДля использования оболочки libc необходимо использовать системный вызов syscalls (). И это еще одна причина, по которой sched_getcpu () лучше, чем getcpu (), наряду с проблемами переносимости.

истемах x86, которые ее поддерживают, она будет указана как "rdtscp» в "флаги» поле / proc / cpuinfo).

Инструкция RDTSCP возвращает значение счетчика меток времени в паре 32-битных регистров (% eax и% ebx), но также возвращает содержимое MSR IA32_TSC_AUX в регистре% ecx. Содержимое MSR IA32_TSC_AUX теоретически произвольно, но каждая версия Linux, которая распознает "rdtscp» флаг процессора предварительно загружает регистр IA32_TSC_AUX на каждом логическом процессоре с кодированием как номера логического процессора (биты 11: 0% ecx), так и "номер узла " (биты 21:12% ecx). Инструкция захватывает регистры TSC и IA32_TSC_AUX атомарно, поэтому вы гарантируете, что значение TSC и значение IA32_TSC_AUX были получены на одном и том же ядре (что важно, если TSC имеет разные смещения на разных ядрах).

Хорошая особенность этого подхода в том, что RDTSCP - это инструкция машинного языка в пространстве пользователя, так что вы неНе нужно взаимодействовать с ядром или любыми библиотеками. На последних системах накладные расходы составляют менее 50 циклов. Рутина, которую я использую:

unsigned long tacc_rdtscp(int *chip, int *core)
{
    unsigned long a,d,c;
    __asm__ volatile("rdtscp" : "=a" (a), "=d" (d), "=c" (c));
    *chip = (c & 0xFFF000)>>12;
    *core = c & 0xFFF;
    return ((unsigned long)a) | (((unsigned long)d) << 32);;
}

Ваш ответ на вопрос