Сложности параллелизму создает не оборудование, на самом деле для ускорения выполнения задач на мультипроцессорах были переписаны лишь немногие известные прикладные программы. Сложно создать такое программное обеспечение, которое использует несколько процессоров для ускоренного завершения одной задачи, и с ростом количества процессоров эта проблема только усугубляется.
В чем причина этой сложности? Почему разработка параллельно выполняемых программ дается намного сложнее, чем разработка последовательных программ?
Первая причина состоит в том, что вы должны получить более высокую производительность и эффективность от параллельного выполнения программ на мультипроцессорной системе, иначе получится, что вы будете просто использовать последовательную программу на одном процессоре, поскольку такое программирование проще. На самом деле в таких технологиях конструирования однопроцессорных систем как суперскаляры и процессоры с измененной последовательностью выполнения инструкций, используется параллелизм на уровне инструкции (см. главу 4), и для этого не требуется вмешательство программиста. Подобные нововведения сокращают потребности в переписывании программ для мультипроцессоров, поскольку программистам здесь нечего делать, и даже их последовательные программы будут работать на новых компьютерах быстрее.
Почему так трудно написать параллельно выполняемые программы, которые работают быстрее, особенно при увеличении количества процессоров? В главе 1 была использована аналогия с восемью репортерами, пытающимися написать одну статью в надежде на то, что это удастся сделать в восемь раз быстрее. Чтобы добиться успеха, задача должна быть разбита на восемь частей одинакового размера, поскольку в противном случае кто-то из репортеров будет бездельничать в ожидании тех коллег, которым досталась более весомая часть работы. Еще одна загвоздка производительности заключается в том, что репортерам придется потратить слишком много времени на общение друг с другом вместо написания своей части статьи. Как для данной аналоги и, так и для параллельного программирования трудности заключаются в диспетчеризации, балансе загруженности, времени на синхронизацию и издержках на обмен данными между участниками. Ситуация усложняется с ростом количества репортеров, пишущих статью в газету и с ростом количества процессоров для параллельного программирования.
При рассмотрении материала главы 1 было обнаружено еще одно препятствие, а именно закон Амдала. Он напоминает нам о том, что в программе, разрабатываемой с прицелом на рациональное использование множества ядер, необходимо распараллелить даже небольшие части.
Из этих примеров следует, что получить хорошее ускорение на мультипроцессоре при фиксированном объеме задачи труднее, чем получить его при увеличении объема задачи. Это дает возможность представить еще два понятия, описывающих способы увеличения масштаба. Строгое масштабирование означает оценку ускорения при фиксированном объеме задачи. Нестрогое масштабирование означает, что объем задачи растет пропорционально увеличению количества процессоров. Предположим, что объем задачи M равен рабочему набору, хранящемуся в оперативной памяти, и у нас имеется P процессоров. Тогда объем памяти, приходящийся на каждый процессор для строгого масштабирования, будет примерно равен M/P, а для нестрогого масштабирования он будет примерно равен M.
В зависимости от приложения можно привести доводы в пользу любого подхода к масштабированию. Например, дебетно-кредитная контрольная задача требует увеличения количества клиентских счетов для достижения большего количества транзакций в минуту. Возражение в том, что наивно полагать, что имеющаяся масса клиентов неожиданно начнет использовать банкоматы по сто раз на день только потому, что у банка появился более скоростной компьютер. Вместо этого, если вы собираетесь продемонстрировать систему, которая может выполнять в 100 раз больше транзакций в минуту, нужно провести эксперимент с увеличенным в 100 раз количеством клиентов.