Линуксовое
Aug. 21st, 2014 06:24 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
У линукса есть несколько механизмов ограничить процесс в доступных процессорных ядрах. Как минимум, 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);
}
no subject
Date: 2014-08-21 03:37 pm (UTC)no subject
Date: 2014-08-21 04:54 pm (UTC)Запускать нитей больше, чем доступное количество ядер не имеет смысла. Поэтому getaffinity и запуск нитей на все доступные ядра.
Как в этом случае переписать, чтобы учитывать изменение количества ядер? Постоянно дергать getaffinity?
no subject
Date: 2014-08-21 05:26 pm (UTC)no subject
Date: 2014-08-21 05:58 pm (UTC)no subject
Date: 2014-08-22 02:20 am (UTC)no subject
Date: 2014-08-21 05:56 pm (UTC)no subject
Date: 2014-08-21 04:51 pm (UTC)пороть на конюшне
no subject
Date: 2014-08-21 04:56 pm (UTC)no subject
Date: 2014-08-21 05:00 pm (UTC)no subject
Date: 2014-08-21 05:57 pm (UTC)no subject
Date: 2014-08-21 07:37 pm (UTC)я про pthread_getaffinity_np, например
no subject
Date: 2014-08-21 08:16 pm (UTC)no subject
Date: 2014-08-21 08:19 pm (UTC)no subject
Date: 2014-08-22 02:40 am (UTC)IMHO, если задача переносимости не ставится, то лучше использовать родной API.
no subject
Date: 2014-08-22 05:30 am (UTC)а апи эти поди похожи как близнецы-братья, разница только в инклюдах и префиксах, т.е. все бесплатно, если сразу.
no subject
Date: 2014-08-22 05:23 am (UTC)no subject
Date: 2014-08-22 05:30 am (UTC)no subject
Date: 2014-08-21 07:40 pm (UTC)no subject
Date: 2014-08-21 08:13 pm (UTC)no subject
Date: 2014-08-21 08:14 pm (UTC)no subject
Date: 2014-08-22 06:18 am (UTC)Мне нужно знать N для make -jN.
no subject
Date: 2014-08-22 07:52 am (UTC)