Короче делайте на N потоков и прогонами проверяйте при каком N время выполнения меньше. Это самый разумный способ. По идее N=8 должно быть быстрее, но могут быть исключения.
UPD. Ого, в той заметке вообще N=128 рекомендуют ... Честно говоря не согласен, думаю N=8..10 (для 4/8 процессора) для вычислительных задач будет всегда достаточно.
Там рекомендуется: "общее количество
задач должно быть не меньше чем, ну скажем, 16*количество_ядер". Задач! Не потоков!
2) Я же
в самом начале приводил
ссылку на статью remark, где написано: "общее количество задач должно быть не меньше чем, ну скажем, 16*количество_ядер (
для обеспечения балансировки нагрузки), и так же абсолютный размер задачи должен быть в разумных пределах, скажем, не больше 100 мс". Ключевое я
выделил.
Можно задать параметрами:
число_потоков и число_задач. И смотреть-выбирать минимальное по времени работы. Задачи в очередь. Потоки в очередь. Свободен поток -- берёт из очереди.
Свободен поток -- берёт из очереди.
Именно эту модель я уже и привёл выше, с готовым исходником. И не нужно 16N потоков, достаточно лишь N.
Повторяю.
Там рекомендуется: "общее количество
задач должно быть не меньше чем, ну скажем, 16*количество_ядер". Задач! Не потоков!
общее количество задач должно быть не меньше чем, ну скажем, 16*количество_ядер
не нужно 16N потоков
Из "абсолютный размер задачи должен быть в разумных пределах, скажем, не больше 100 мс" видно, что задача здесь (в статье) -- не поток.
Повторяю. Нет в статье рекомендации про число
потоков = 16*количество_ядер, а есть рекомендация про число
задач = 16*количество_ядер.
Задача -- порция обрабатываемой информации. "Очень ориентировочно минимальный объём полезной работы на задачу должен быть порядка 10 000 тактов." После этого
задача кончается и выполнявший её
поток выбирает из очереди следующую задачу.
P.S. Ужас. Современные программисты...