Как узнать число процессоров?
Вроде простая задача, но пока не могу найти решения. Может быть, кто-нибудь сталкивался?
Конечно, есть Runtime.getRuntime().availableProcessors( ). И переменная среды в Windows. Но таким образом я получаю 2 на процессоре с гипертрейдингом. А мне надо реальное число процессоров или ядер процессора.
Дело в том, что (в кои-то веки) моим алгоритмическим библиотекам захотелось задействовать многоядерность (или многопроцессорность) для повышения быстродействия. Для этого задача, например, сложной поэлементной обработки многомегабайтного массива, делится на n частей, которые обрабатываются параллельно n потоками (используется Executors.newFixedThreadPool). Первоначально я рассчитывал попросту указать n=Runtime.getRuntime().availableProcesso rs(). Итог оказался обескураживающим: на одном Pentium с гипертрейдингом все замедлилось, ибо два потока обрабатывали массив медленнее, чем один. Эффект пока пронаблюдал на двух компьютерах. На третьем компьютере стоит более старый Pentium без гипертрейдинга, там два потока тратят примерно столько же времени, как и один. Очевидно, использовать в качестве умолчания решение, которое в обычных ситуациях замедляет алгоритм, никак нельзя.
Еще бывают, например, 2-процессорные системы, где каждый процессор обладает гипертрейдингом. Число логических процессоров, возвращаемое availableProcessors(), будет 4. Запускать 4 потока почти наверняка окажется хуже, чем 2 или 3. На многоядерных или многопроцессорных системах, возможно, стоит оставить один процессор свободным ради UI. В общем, желательно правильно определить число реальных ядер, которые действительно способны независимо обрабатывать разные области памяти.
С какой стороны можно порешать задачу? Хотя бы в рамках Windows?
Конечно, есть Runtime.getRuntime().availableProcessors(
Дело в том, что (в кои-то веки) моим алгоритмическим библиотекам захотелось задействовать многоядерность (или многопроцессорность) для повышения быстродействия. Для этого задача, например, сложной поэлементной обработки многомегабайтного массива, делится на n частей, которые обрабатываются параллельно n потоками (используется Executors.newFixedThreadPool). Первоначально я рассчитывал попросту указать n=Runtime.getRuntime().availableProcesso
Еще бывают, например, 2-процессорные системы, где каждый процессор обладает гипертрейдингом. Число логических процессоров, возвращаемое availableProcessors(), будет 4. Запускать 4 потока почти наверняка окажется хуже, чем 2 или 3. На многоядерных или многопроцессорных системах, возможно, стоит оставить один процессор свободным ради UI. В общем, желательно правильно определить число реальных ядер, которые действительно способны независимо обрабатывать разные области памяти.
С какой стороны можно порешать задачу? Хотя бы в рамках Windows?
