Автор оригинала статьи — Пэдро Диниз ([email protected])

Краткий обзор

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

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

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

Коммутативный анализ это структура статического анализа для определения коммутированных операций. Две операции коммутируют тогда. Когда они создают одинаковый результат, несмотря на порядок, в котором они выполняются. Коммутативный анализ освещает множество ограничений в подходах, которые базируются на существующей зависимости данных. Вместо сберегания относительного порядка индивидуальных чтений и записей в памяти отдельных слов, коммутативный анализ собирает в одно целое и данные, и вычисления. А затем он статически анализирует вычисления в этой степени детализации для того, чтобы открыть, когда части вычислений коммутируют, то есть генерируют одинаковый результат, несмотря на порядок, в котором они выполняются. Если все операции, которые требуются для того, чтобы вычисление коммутировало, компилятор может автоматически сгенерировать параллельный код. В то время, как итоговая параллельная программа может взломатьзависимости данных оригинальной серийной программы, она все же гарантирует создание такого же результата.

Этот подход несет в себе несолько интересных свойств. Так как коммутативность не опирается на информацию о топологии манипулятивных структур данных, компилятор, который использвует коммутативный анализ, не нуждается в анализе тех частей кода, которые формируют структуру данных.  По этой причине оммутативный анализ подходит для незавершенных вычислений, таких как приложения, которые управляют долговременными данными ( то есть информационной базой данных, ориентированно на объекте) или приложения, которые управляют географически распределенными данными ( например мибильные вычисления в World Wide Web). В таких случаях, код, который изначально построен на структуре данных может не быть доступным или больше не существовать. Коммутативный анализ также особенно сопровождается вычислениями, которые управляют графиками. Это важный аспект коммутативного анализа, потому как вычисления, которые управляют этими структрами данных по своей сути находятся за пределами достижения анализа зависимостей данных.

Мы взяли системно-ориентированный подход для повышения способности комутативного анализа извлекать и разрабатывать значительные количества параллелизмов в завершенном приложении. Мы построили парраллелизованный компилятор, который использует коммутативный анализ как его первичную парадигму анализа. Этот компилятор берет результат неаннотированной последовательной программы, написанной на разновидности  of C++ и создает параллельный код для мультипроцессора общей памяти. Используя это параллелизированный компилятор, мы автоматически параллелизируем несколько приложений, включая средство проверки Barnes-Hut N-body, водно-жидкостной код симуляции и сейсмический код моделирования. Для всех этих приложений, коммутативный анализ способен выявить существенное количество конкуренции, а созданные параллельные коды дают очень хороший показательный результат. На 16 процессорах, автоматически параллелизированная версия Barnes-Hut запускается где-то в 11-12 раз быстрее, чем оригинальная однопоточная версия;  для приложения водной симуляции, автоматически параллелизованная версия запускается в 7-8 раз быстрее, чем однопоточная версия; для приложения сейсмического моделирования, автоматически параллелизированная версия запускается в 12 раз быстрее, чем оригинальная однопоточная.

Эти экспирементальные результаты очень ободряют. Эти приложения очень динамичны по своей природе – они или управляют сложными структурными данными в виде связанного списка или

Показывают очень нерегулярные схемы доступа к данным. Использование параллелизма на уровне крупных структурных единиц в приложениях с этими характеристиками было признано сложной проблемой. Мы не знаем ни одного компилятора или техники компиляции, способной извлечт знаительное количество конкуренции для этих вычислений. Более того, позитивные результаты эксперимента предоставляют конкретные доказательства практического значения коммутативного анализа как техники для автоматически параллелизированных компиляторов.