tobotras: (Default)
tobotras ([personal profile] tobotras) wrote2014-08-21 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);
  }

[identity profile] drf-ckoff.livejournal.com 2014-08-21 03:37 pm (UTC)(link)
"Если процессу важно знать, сколько у него ядер" - его надо переписать. ибо никто ему не гарантирует, что этих ядер вдруг не станет меньше или больше.

[identity profile] ostapru.livejournal.com 2014-08-21 04:54 pm (UTC)(link)
Ну, например, всякие считалки/процессилки.
Запускать нитей больше, чем доступное количество ядер не имеет смысла. Поэтому getaffinity и запуск нитей на все доступные ядра.
Как в этом случае переписать, чтобы учитывать изменение количества ядер? Постоянно дергать getaffinity?

[identity profile] drf-ckoff.livejournal.com 2014-08-21 05:26 pm (UTC)(link)
исходить из того, что количество ядер неограничено. прикинуть - после какого количества дальше плодить треды смысла не имеет и столько и делать. а дальше пусть ядро разбирается.

[identity profile] ostapru.livejournal.com 2014-08-22 02:20 am (UTC)(link)
Так оно работает хреново. Если задача хорошо параллелится и синхронизация минимальна, то больше чем поток на ядро - тут же сажает производительность.

[identity profile] http://users.livejournal.com/_slw/ 2014-08-21 04:51 pm (UTC)(link)
линуксятина какая-то
пороть на конюшне

[identity profile] ostapru.livejournal.com 2014-08-21 04:56 pm (UTC)(link)
На виндах оно примерно также. Только вызов будет GetProcessAffinityMask().

[identity profile] http://users.livejournal.com/_slw/ 2014-08-21 05:00 pm (UTC)(link)
т.е. ты даже не понял, за что пороть?

[identity profile] http://users.livejournal.com/_slw/ 2014-08-21 07:37 pm (UTC)(link)
нехорошо пользоваться менее переносимым апи при наличии более переносимого
я про pthread_getaffinity_np, например

[identity profile] http://users.livejournal.com/_slw/ 2014-08-21 08:19 pm (UTC)(link)
по факту, sched_getaffinity кроме линуха нигде нет, в отличии от pthread_getaffinity_np

[identity profile] ostapru.livejournal.com 2014-08-22 02:40 am (UTC)(link)
Ну pthread, так pthread.
IMHO, если задача переносимости не ставится, то лучше использовать родной API.

[identity profile] http://users.livejournal.com/_slw/ 2014-08-22 05:30 am (UTC)(link)
сегодня не ставится, а завтра -- опа и ставится.
а апи эти поди похожи как близнецы-братья, разница только в инклюдах и префиксах, т.е. все бесплатно, если сразу.

[identity profile] http://users.livejournal.com/_slw/ 2014-08-22 05:30 am (UTC)(link)
да ну, это линуха нет

[identity profile] alec_v.livejournal.com 2014-08-21 07:40 pm (UTC)(link)
Количество ядер может ВНЕЗАПНО поменяться, если виртуалка по-живому мигрируется в облаке на другую материнку.

[identity profile] d1f.livejournal.com 2014-08-22 06:18 am (UTC)(link)
А как это правильно сделать из шелла?
Мне нужно знать N для make -jN.