Оживший юзерпик - Линуксовое
авг. 21, 2014
06:24 pm - Линуксовое
У линукса есть несколько механизмов ограничить процесс в доступных процессорных ядрах. Как минимум, cgroup и taskset. Если процессу важно знать, сколько у него ядер (чтобы сконфигурировать thread pool или ещё зачем-нибудь), то наивный способ -- прочитать /proc/cpuinfo. Он неправильный. Менее наивный -- позвать sysconf(_SC_NPROCESSORS_ONLN). Он тоже неправильный. Правильный -- вот:
long num_processor_configured = sysconf (_SC_NPROCESSORS_CONF); /* list the number of processors configured */
long num_processor_available;
cpu_set_t mask;
if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == 0) {
num_processor_available = CPU_COUNT(&mask);
} else {
num_processor_available = sysconf(_SC_NPROCESSORS_ONLN);
}
Comments:
Mass Action
Групповое действие над комментариями:
Запускать нитей больше, чем доступное количество ядер не имеет смысла. Поэтому getaffinity и запуск нитей на все доступные ядра.
Как в этом случае переписать, чтобы учитывать изменение количества ядер? Постоянно дергать getaffinity?
пороть на конюшне
я про pthread_getaffinity_np, например
IMHO, если задача переносимости не ставится, то лучше использовать родной API.
а апи эти поди похожи как близнецы-братья, разница только в инклюдах и префиксах, т.е. все бесплатно, если сразу.
У линукса есть несколько механизмов ограничить процес
Мне нужно знать N для make -jN.