Функция классификации потоков процессора-Ядра
-
20-09-2019 - |
Вопрос
Я собираюсь написать многопоточную систему обмена сообщениями с общей памятью для сверхвысокообъемной доставки сообщений между процессами.Сообщения будут исходить из рабочих потоков веб-сервера.Я бы хотел использовать локальность кэша процессора, которую совместно используют ядра одного и того же процессора.Так что, когда я пробуждаю рабочий поток на принимающей стороне этой IPC-системы, я пробуждаю поток на том же процессоре.
Мне нужны для Linux (предпочтительно POSIX в genaral) и Windows вызовы API и битовая маска, которые мне нужно выполнить, чтобы извлечь информацию, которая позволит мне классифицировать идентификатор выполняющегося потока - из контекста указанного потока - используя следующую структуру:
struct thread_core_id
{
uint16_t cpu_Id;
uint16_t core_Id;
};
Функции для обеих платформ будут высоко оценены.Я надеюсь, что это можно сделать без системных вызовов, то есть переключения контекста.
-- редактировать --
В данный момент я фокусируюсь на x86, но были бы полезны и другие архитектуры.
Решение
В частности, для Linux вы должны быть в состоянии получить необходимую информацию из /proc/cpuinfo
и /sys/devices/system/cpu/cpu*/cache
и используйте это с sched_{s|g}etaffinity()
звонки.Взгляните на Что каждый программист должен знать о памяти, если вы еще этого не сделали, обратитесь к разделу 5.3.