Я занимаюсь разработкой некоторых многоядерных программ на C ++ с переменным числом потоков, и я хотел бы знать, как установить правильную (на самом деле "лучшую") привязку. Я использую Boost-потоки, поэтому я могу вызвать get_hardware_concurrency (), чтобы узнать, сколько существует логических ядер. До сих пор я писал отображение «n_th thread в n-ое логическое ядро», но это не самая умная вещь из-за многопроцессорных процессоров и HyperThreading. Мои программы всегда похожи на SIMD, поэтому потокам нечего делить между ними, и, в случае компьютера HT, я бы хотел связать потоки с логическими ядрами самым умным способом, который я могу себе представить: первое логическое ядро на первом физическом 1-й логический для 2-го физического, ..., 1-й логический для n-го физического, 2-й логический для 1-го физического и т. Д.
Я нашел много материала, где обсуждается, как узнать, включена ли HT или нет (CPUID), и как определить логические и физические ядра в пакете. Я знаю, что мне приходится иметь дело с некоторым ассемблерным кодом, и это меня не пугает, но я действительно не мог найти, как узнать полную информацию о логических ядрах, физических ядрах и пакетах и как ОС справляется со всем этим.
Будучи наиболее лаконичным, я могу: как узнать точное местоположение (физическое ядро и пакет) потока, который ОС (Windows и Linux) называет N-м?