У меня есть Mac с процессором Quad Core i7 начала 2011 года. Из-за гиперпоточности многие программы сообщают о 8 "ядрах". Если бы я написал программу, которая выполняется параллельно, смог бы я запустить 8 экземпляров этой программы или только 4?
Я понимаю, что могу запустить столько потоков, сколько захочу, но увижу ли я, как 4 или 8 экземпляров программы выполняются параллельно?
решение1
Процессор Intel Core i7 имеет 4 физических ядра, но каждое ядро способно обрабатывать до 2 потоков одновременно, отображая в общей сложности 8 потоков для операционной системы в виде «доступных логических ЦП».
В действительности одно ядро может обрабатывать только один поток за раз, но у него есть специальные механизмы очередей/синхронизации/планирования, позволяющие двум потокам находиться на разных стадиях «конвейера» одновременно. Это позволяет ЦП завершать 2 потока раньше, чем если бы он обрабатывал только один поток за раз. Поскольку оба потока используют один и тот же конвейер, выигрыш в производительности, очевидно, не будет двукратным. Большинство тестов фиксируют выигрыш где-то между 10% и 50% в зависимости от типа выполняемых инструкций.
В ответ на ваш вопрос, если вы запустите 4, 8 или 16 экземпляров вашей программы, они все будут "запущены", но инструкции для каждого будут поставлены в очередь в зависимости от того, сколько доступно ПОТОКОВ. Как только вы выйдете за пределы числа доступных ФИЗИЧЕСКИХ ЯДЕР (например, 5 или более), производительность снизится, поскольку любые потоки за пределами базы 4 будут совместно использовать физическое ядро ЦП.
Наконец, как только вы достигнете предела доступных возможностей потоков ЦП (превысите 8 потоков), ОС начнет планировать/ставить в очередь инструкции, чтобы дождаться завершения тех, что находятся в конвейере. В идеале вы хотите избежать выхода за пределы доступных потоков, поскольку это может отрицательно сказаться на производительности и стать узким местом в системе.