Я правильно понимаю, что любой многопоточный код с ростом числа ядер достигнет числа, когда прирост остановится совсем, а при дальшейнем превышении — начнется замедление назад? Оцениваю так:
ВремяВыполнения = X + Y + Z = ВремяПараллелящегосяКода/ЧислоЯдер + ВремяПодМьютексами + ПереключениеКонтекстов*ЧислоЯдер
С ростом числа ядер, время X падает, Y — остается постоянным, а Z — растет.
Функция f(x) = a/x + b + cx при увеличении x рано или поздно начинает расти независимо от соотношения [положительных] констант a, b, c.
При соотношениях 0.98/x + 0.01 + 0.01*x где-то на сотне штук время сравнивается с одноядерником и неограниченно растет.
Может быть похуже, 0.88/x + 0.1 + 0.02*x — уже на 34.
Получается, что как не пыжься с оптимизацией, минимизируя время проведенное в мьютексах, затраты на конкуренцию все равно все погубят.
Интуитивно я согласен — для каждой задачи есть свой оптимум исполнителей, два человека забьют два гвоздя в 2 раза быстрее, чем один, но если это будут делать 16 человек — получится только замедление.
Выходит, идеально распараллеленый софт — не тот, который загрузит все ядра, а тот, который оценит нужное ему число и загрузит только их?