Планирование параллельной оптимизации

Скачать статью:
Planning for Parallel Optimization [Eng.]

Оптимизация вашего приложения под многоядерные технологии быстро становится обязательным требованием: многоядерные компьютеры уже приобрели широкое распространение и в 2010 г. составили 83% всех поставок персональных компьютеров. Число ядер также растет: по прогнозам IDC, в 2012 г. 60% поставок составят компьютеры с 4 и более ядрами (отчет «Worldwide PC Processor Forecasting 2009-2013»). Параллельная оптимизация может обеспечить значительный рост производительности, однако для этого необходим план действий, оптимальный именно для вашего приложения. Вот несколько рекомендаций, которые помогут вам приступить к делу.

Новая разработка или оптимизация

Первый выбор, который вам необходимо сделать, – начинать ли разработку параллельного приложения с нуля, или оптимизировать существующий код. Если у вас уже есть правильно работающее последовательное приложение, вы можете использовать его в качестве отправной точки и заняться поиском путей внедрения параллелизма.

Прежде, чем начинать изменять существующий код, обязательно замерьте производительность существующего программного продукта, чтобы зафиксировать точку отсчета. Затем, по мере внедрения изменений, повторяйте замеры, чтобы вы всегда могли сказать, действительно ли внесенные изменения обеспечивают рост производительности.

Способ измерения производительности вашего приложения зависит от его предназначения. Чтобы обеспечить повторяемость измерений, следует начать с определения рабочей нагрузки, на основе которой будут производиться измерения. Нагрузка представляет собой задачу или набор задач, выбранных вами для вашего приложения. Ваша цель состоит в том, чтобы выбрать цикличную нагрузку и проводить измерения в ходе ее обработки. Зная объем работы, выполненный в течение заданного периода времени, вы сможете позднее повторить запуск с той же нагрузкой и посмотреть, способно ли ваше приложение выполнить больший объем работы за тот же промежуток времени или тот же объем работы за более короткий промежуток времени. Это позволит вам непосредственно измерять улучшения производительности при оптимизации вашего приложения. Вы также можете измерить результаты ваших усилий по оптимизации с помощью инструментов, измеряющих уровень параллелизма вашего приложения, например, Intel® Concurrency Checker.

Разбиение функций и данных

Если вы начинаете работу с существующим последовательным приложением, то вы сможете выбрать, следует ли применить разбиение (decomposition) функций или данных (или и то, и другое), исходя из его структуры. Если ваше приложение содержит функции или задачи, выполняющиеся независимо друг от друга, их можно запускать параллельно. Если ваше приложение содержит функции, обрабатывающие большие объемы данных, и эти данные можно разбить на более мелкие подмножества, допускающие независимую обработку, можно применить разбиение данных.

Степень дробления при распараллеливании тоже определяется характером вашего приложения. Степень дробления определяет частоту взаимодействия задач, составляющих ваше приложение, друг с другом. Чем реже требуется взаимодействие, тем меньшую степень дробления вы можете использовать, и тем больше ваше приложение выиграет за счет параллельной обработки, поскольку ему потребуется меньше затрат ресурсов на взаимодействие.

Выявление «горячих точек» и «узких мест»

Прежде, чем начинать вносить изменения, очень важно определить, где сосредоточены основные проблемы. Инструменты для выявления «горячих точек» (hotspot) и «узких мест» (bottleneck) в вашем коде помогут вам сконцентрировать свои усилия на тех областях, где можно добиться наиболее заметных результатов. «Горячие точки» – это места, на которые процессор затрачивает очень много времени, поэтому такие области отлично подходят для оптимизации с целью устранения неэффективности кода. Однако может возникнуть ситуация, когда «горячая точка» уже функционирует эффективно, а причина больших затрат процессорного времени в том, что в ней выполняется очень большой объем работы. «Горячая точка» является «узким местом» только в том случае, когда в ней тратится лишнее процессорное время из-за неэффективности кода. Если вы выясните, что такое «узкое место» можно распараллелить, это будет идеальным местом для приложения усилий по оптимизации.

Выбор методики

Когда вы определите, в каких областях кода необходимы улучшения, перед вами встанет выбор различных вариантов выполнения параллельной оптимизации. По данным «Intel Parallel Computing Survey» (Evans Data Corp., апрель 2011 г.), тремя наиболее популярными методами параллельного программирования, применяемыми разработчиками, являются многопоточная организация, совместное использование памяти и передача сообщений.

  • Многопоточная организация предполагает существование в рамках единого процесса нескольких потоков (задач, выполняемых центральным процессором), совместно использующих память и другие ресурсы, что обеспечивает более быстрое функционирование на многоядерных системах. Недостатком многопоточной организации является возникновение недетерминизма: вы не всегда способны предсказать порядок, в котором осуществляется обработка, что может привести к возникновению ошибок.
  • Модель совместного использования памяти (shared memory) предполагает использование единого пространства памяти несколькими процессорами. Модель предусматривает простое в использовании единое пространство адресов, однако необходимо позаботиться о предотвращении состояния «гонки данных» (data race) при наличии зависимости между событиями.
  • Передача сообщений предполагает взаимодействие между процессами и может потребовать более существенных усилий для реализации, однако состояние «гонки» не возникает благодаря механизму синхронизации.

Измерение результатов и проверка ошибок

Каждый раз, когда вы вносите в свое приложение дополнительные элементы параллелизма, следует замерить время работы приложения, чтобы убедиться в повышении производительности. На этом этапе также важно убедиться, что коде не возникло ошибок. Это можно сделать с помощью инструментов, проверяющих наличие ошибок распараллеливания, например, Intel® Parallel Studio. Убедившись, что последний проведенный вами этап параллельной оптимизации принес положительный результат, вы сможете провести очередную итерацию, чтобы добиться еще большего параллелизма и роста производительности, или, если вы уже достигли своей цели, остановиться на сделанном.

Дополнительную информацию о параллельной оптимизации вы можете найти на сайте сообщества по параллельному программированию Intel® Developer Zone, где вы сможете получить доступ к инструментам и ресурсам, способным помочь вам в оптимизации вашего приложения под многоядерные технологии.

Иллюстрация

Об авторе

Диана Бирн (Diana Byrne) является менеджером по многоядерной продукции в Группе программного обеспечения и услуг Корпорации Intel, где она работает с 2004 г. Имеет степень магистра по математике, компьютерным наукам и управлению технологиями.

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.