stringtranslate.com

Алгоритмический скелет

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

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

Обзор

Наиболее выдающейся особенностью алгоритмических скелетов, которая отличает их от других высокоуровневых моделей параллельного программирования, является то, что оркестровка и синхронизация параллельных действий неявно определяются шаблонами скелета. Программистам не нужно указывать синхронизации между последовательными частями приложения. Это приводит к двум последствиям. Во-первых, поскольку шаблоны связи/доступа к данным известны заранее, модели затрат могут применяться для планирования программ скелетов. [1] Во-вторых, то, что алгоритмическое программирование скелета уменьшает количество ошибок по сравнению с традиционными низкоуровневыми моделями параллельного программирования (потоки, MPI).

Пример программы

Следующий пример основан на библиотеке Java Skandium для параллельного программирования.

Цель состоит в том, чтобы реализовать параллельную версию алгоритма QuickSort на основе Algorithmic Skeleton с использованием шаблона Divide and Conquer. Обратите внимание, что высокоуровневый подход скрывает управление потоками от программиста.

// 1. Определим скелетную программу Skeleton < Range , Range > sort = new DaC < Range , Range > ( new ShouldSplit ( threshold , maxTimes ), new SplitList (), new Sort (), new MergeList ()); // 2. Входные параметры Future < Range > future = sort . input ( new Range ( generate (...))); // 3. Сделайте здесь что-нибудь еще. // ... // 4. Блок для результатов Range result = future . get ();                      
  1. Первое, что нужно сделать, это определить новый экземпляр скелета с функциональным кодом, который заполняет шаблон (ShouldSplit, SplitList, Sort, MergeList). Функциональный код пишется программистом без учета параллелизма.
  2. Вторым шагом является ввод данных, который запускает вычисление. В этом случае Range — это класс, содержащий массив и два индекса, которые позволяют представлять подмассив. Для каждых данных, введенных в фреймворк, создается новый объект Future. В скелет можно одновременно вводить более одного Future.
  3. Будущее допускает асинхронные вычисления, поскольку во время вычисления результатов можно выполнять другие задачи.
  4. Мы можем получить результат вычисления, заблокировав его при необходимости (т. е. если результаты еще не доступны).

Функциональные коды в этом примере соответствуют четырем типам: «Условие», «Разделение», «Выполнение» и «Объединение».

открытый класс ShouldSplit реализует Condition < Range > {     int threshold , maxTimes , times ; public ShouldSplit ( int threshold , int maxTimes ){ this . threshold = threshold ; this . maxTimes = maxTimes ; this . times = 0 ; } @Override public synchronized boolean condition ( Range r ){ return r . right - r . left > threshold && times ++ < this . maxTimes ; } }                                    

Класс ShouldSplit реализует интерфейс Condition. Функция получает входные данные, в данном случае Range r, и возвращает true или false. В контексте Divide and Conquer, где будет использоваться эта функция, это определит, следует ли снова разделить подмассив или нет.

Класс SplitList реализует интерфейс split, который в этом случае делит (под-)массив на меньшие подмассивы. Класс использует вспомогательную функцию partition(...), которая реализует известную схему QuickSort pivot and swap.

открытый класс SplitList реализует Split < Range , Range > {      @Override public Range [] split ( Range r ) { int i = partition ( r . array , r . left , r . right ); Range [] intervals = { new Range ( r . array , r . left , i - 1 ), new Range ( r . array , i + 1 , r . right )}; return intervals ; } }                            

Класс Sort реализует интерфейс Execute и отвечает за сортировку подмассива, указанного с помощью Range r. В этом случае мы просто вызываем метод Java по умолчанию (Arrays.sort) для данного подмассива.

открытый класс Sort реализует Execute < Range , Range > {       @Override public Range execute ( Range r ) { if ( r.right < = r.left ) return r ; Arrays.sort ( r.array , r.left , r.right + 1 ) ; return r ; } }                

Наконец, после сортировки набора подмассивов мы объединяем части подмассива в больший массив с помощью класса MergeList, который реализует интерфейс Merge.

открытый класс MergeList реализует Merge < Range , Range > {      @Override public Range merge ( Range [] r ){ Range result = new Range ( r [ 0 ] . array , r [ 0 ] . left , r [ 1 ] . right ); return result ; } }               

Фреймворки и библиотеки

ПОМОГАТЬ

ASSIST [2] [3] — это среда программирования, которая предоставляет программистам структурированный язык координации. Язык координации может выражать параллельные программы как произвольный граф программных модулей. Граф модулей описывает, как набор модулей взаимодействует друг с другом с использованием набора типизированных потоков данных. Модули могут быть последовательными или параллельными. Последовательные модули могут быть написаны на C, C++ или Fortran; а параллельные модули программируются с помощью специального параллельного модуля ASSIST ( parmod ).

AdHoc, [4] [5] иерархическая и отказоустойчивая система распределенной общей памяти (DSM) используется для соединения потоков данных между элементами обработки, предоставляя репозиторий с операциями: get/put/remove/execute. Исследования вокруг AdHoc были сосредоточены на прозрачности, масштабируемости и отказоустойчивости репозитория данных.

Хотя это и не классический каркас скелета, в том смысле, что скелеты не предусмотрены, универсальный parmod ASSIST может быть специализирован в классических скелетах, таких как: farm , map и т. д. ASSIST также поддерживает автономное управление parmods и может подчиняться контракту производительности путем динамической адаптации количества используемых ресурсов.

CO2P3S

CO2P3S (правильная объектно-ориентированная система параллельного программирования на основе шаблонов) — это среда разработки, ориентированная на шаблоны, [6] которая обеспечивает параллелизм с помощью потоков в Java.

CO2P3S занимается полным процессом разработки параллельного приложения. Программисты взаимодействуют через программный графический интерфейс, чтобы выбрать шаблон и его параметры конфигурации. Затем программисты заполняют хуки, необходимые для шаблона, и новый код генерируется как фреймворк на Java для параллельного выполнения приложения. Сгенерированный фреймворк использует три уровня в порядке убывания абстракции: слой шаблонов, слой промежуточного кода и слой собственного кода. Таким образом, продвинутые программисты могут вмешиваться в сгенерированный код на нескольких уровнях, чтобы настроить производительность своих приложений. Сгенерированный код в основном типобезопасен , используя типы, предоставленные программистом, которые не требуют расширения суперкласса, но не является полностью типобезопасным, например, в методе reduce(..., Object reducer) в шаблоне сетки.

Набор шаблонов, поддерживаемых в CO2P3S, соответствует последовательности методов, дистрибьютору, сетке и волновому фронту. Сложные приложения могут быть построены путем составления фреймворков с их объектными ссылками. Тем не менее, если ни один шаблон не подходит, графический инструмент MetaCO2P3S решает проблему расширяемости, позволяя программистам изменять дизайн шаблонов и вводить новые шаблоны в CO2P3S.

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

Кальций и скандий

Calcium во многом вдохновлен Lithium и Muskel. Таким образом, он предоставляет алгоритмическое программирование скелета в виде библиотеки Java. Как задачи, так и параллельные скелеты данных полностью вложены; и инстанцируются через параметрические скелетные объекты, а не наследование.

Calcium поддерживает выполнение скелетных приложений поверх среды ProActive для распределенной кластерной инфраструктуры. Кроме того, Calcium имеет три отличительные особенности для алгоритмического скелетного программирования. Во-первых, модель настройки производительности, которая помогает программистам идентифицировать код, ответственный за ошибки производительности. [8] Во-вторых, система типов для вложенных скелетов, которая, как доказано, гарантирует свойства редукции субъекта и реализована с использованием Java Generics. [9] В-третьих, прозрачная модель доступа к файлам алгоритмического скелета, которая позволяет использовать скелеты для приложений с интенсивным использованием данных. [10]

Skandium — это полная переработка Calcium для многоядерных вычислений. Программы, написанные на Skandium, могут использовать преимущества общей памяти для упрощения параллельного программирования. [11]

Эдем

Eden [12] — параллельный язык программирования для сред с распределенной памятью, расширяющий Haskell. Процессы определяются явно для достижения параллельного программирования, в то время как их коммуникации остаются неявными. Процессы взаимодействуют через однонаправленные каналы, которые соединяют одного писателя с ровно одним читателем. Программистам нужно только указать, от каких данных зависит процесс. Модель процессов Eden обеспечивает прямой контроль над гранулярностью процесса, распределением данных и топологией коммуникаций.

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

eSkel

Библиотека Edinburgh Skeleton Library ( eSkel ) написана на языке C и работает поверх MPI. Первая версия eSkel была описана в [13], а более поздняя версия представлена ​​в [14] .

В [15] определены режим вложенности и режим взаимодействия для скелетов. Режим вложенности может быть как временным, так и постоянным, в то время как режим взаимодействия может быть как неявным, так и явным. Временная вложенность означает, что вложенный скелет создается для каждого вызова и впоследствии уничтожается, в то время как постоянная означает, что скелет создается один раз, и один и тот же экземпляр скелета будет вызываться во всем приложении. Неявное взаимодействие означает, что поток данных между скелетами полностью определяется композицией скелета, в то время как явное означает, что данные могут быть созданы или удалены из потока способом, не указанным композицией скелета. Например, скелет, который производит вывод, никогда не получая ввод, имеет явное взаимодействие.

Прогнозирование производительности для планирования и сопоставления ресурсов, в основном для конвейеров, было исследовано Бенуа и др. [16] [17] [18] [19]. Они предоставили модель производительности для каждого сопоставления, основанную на алгебре процессов, и определили наилучшую стратегию планирования на основе результатов модели.

Более поздние работы были посвящены проблеме адаптации структурированного параллельного программирования, [20] в частности, для скелета трубы. [21] [22]

FastFlow

FastFlow — это каркасный параллельный программный фреймворк, специально предназначенный для разработки потоковых и параллельных по данным приложений. Первоначально разработанный для многоядерных платформ, он был успешно расширен для гетерогенных платформ, состоящих из кластеров платформ с общей памятью, [23] [24] возможно, оснащенных вычислительными ускорителями, такими как NVidia GPGPU, Xeon Phi, Tilera TILE64. Основная философия проектирования FastFlow заключается в предоставлении разработчикам приложений ключевых функций для параллельного программирования (например, время выхода на рынок, переносимость, эффективность и переносимость производительности) с помощью подходящих абстракций параллельного программирования и тщательно разработанной поддержки времени выполнения. [25] FastFlow — это универсальный программный фреймворк C++ для гетерогенных параллельных платформ. Как и другие высокоуровневые фреймворки программирования, такие как Intel TBB и OpenMP, он упрощает проектирование и разработку переносимых параллельных приложений. Однако он имеет явное преимущество в плане выразительности и производительности по сравнению с другими фреймворками параллельного программирования в конкретных сценариях применения, включая, среди прочего: мелкозернистый параллелизм на платформах с общей памятью, когерентной по кэшу; потоковые приложения; сопряженное использование многоядерности и ускорителей. В других случаях FastFlow обычно сопоставим (а в некоторых случаях немного быстрее) с современными фреймворками параллельного программирования, такими как Intel TBB, OpenMP, Cilk и т. д. [26]

HDC

Higher-order Divide and Conquer ( HDC ) [27] является подмножеством функционального языка Haskell . Функциональные программы представлены как полиморфные функции высшего порядка, которые могут быть скомпилированы в C/MPI и связаны с реализациями скелета. Язык фокусируется на парадигме разделяй и властвуй, и, начиная с общего вида скелета разделяй и властвуй, выводятся более конкретные случаи с эффективными реализациями. Конкретные случаи соответствуют: фиксированной глубине рекурсии, постоянной степени рекурсии, множественной блочной рекурсии, поэлементным операциям и соответствующим коммуникациям [28]

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

HOC-SA

HOC-SA — проект инкубатора Globus.
HOC-SA означает Higher-Order Components-Service Architecture (Архитектура компонентов-сервисов высшего порядка). Целью компонентов высшего порядка (HOC) является упрощение разработки приложений Grid.
Целью HOC-SA является предоставление пользователям Globus, которые не хотят знать все подробности промежуточного программного обеспечения Globus (документы GRAM RSL, веб-сервисы и конфигурация ресурсов и т. д.), HOC, которые предоставляют интерфейс более высокого уровня для Grid, чем основной Globus Toolkit.
HOC — это каркасы с поддержкой Grid, реализованные как компоненты поверх Globus Toolkit, с удаленным доступом через веб-сервисы. [29]

JaSkel

JaSkel [30] — это каркас скелета на основе Java, предоставляющий скелеты, такие как ферма, конвейер и heartbeat. Скелеты специализированы с использованием наследования. Программисты реализуют абстрактные методы для каждого скелета, чтобы предоставить свой специфичный для приложения код. Скелеты в JaSkel предоставляются как в последовательной, так и в параллельной и динамической версиях. Например, параллельная ферма может использоваться в средах с общей памятью (потоках), но не в распределенных средах (кластерах), где должна использоваться распределенная ферма. Чтобы перейти с одной версии на другую, программисты должны изменить сигнатуру своих классов, чтобы наследовать от другого скелета. Вложенность скелетов использует базовый класс Java Object, и поэтому никакая система типов не применяется во время композиции скелета.

Распределительные аспекты вычислений обрабатываются в JaSkel с использованием AOP, а точнее реализации AspectJ. Таким образом, JaSkel может быть развернут как в кластерных, так и в Grid-подобных инфраструктурах. [31] Тем не менее, недостатком подхода JaSkel является то, что вложенность скелета строго связана с инфраструктурой развертывания. Таким образом, двойная вложенность фермы обеспечивает лучшую производительность, чем одна ферма в иерархических инфраструктурах. Это противоречит цели использования AOP для разделения распределения и функциональных задач скелетной программы.

Литий и Мускуль

Lithium [32] [33] [34] и его преемник Muskel являются каркасными фреймворками, разработанными в Университете Пизы, Италия. Оба они предоставляют программисту вложенные каркасы в виде библиотек Java. Оценка каркасного приложения следует формальному определению операционной семантики, введенному Олдинуччи и Данелутто, [35] [36] , которое может обрабатывать как параллелизм задач, так и параллелизм данных. Семантика описывает как функциональное, так и параллельное поведение скелетного языка с использованием маркированной системы переходов. Кроме того, применяется несколько оптимизаций производительности, таких как: методы переписывания скелета [18, 10], опережающий просмотр задач и ленивое связывание сервера с сервером. [37]

На уровне реализации Lithium использует поток макроданных [38] [39] для достижения параллелизма. Когда входной поток получает новый параметр, скелетная программа обрабатывается для получения графа потока макроданных. Узлы графа — это инструкции потока макроданных (MDFi), которые представляют собой последовательные фрагменты кода, предоставленные программистом. Задачи используются для группировки нескольких MDFi и потребляются простаивающими элементами обработки из пула задач. Когда вычисление графа завершено, результат помещается в выходной поток и, таким образом, доставляется обратно пользователю.

Muskel также предоставляет нефункциональные возможности, такие как качество обслуживания (QoS); [40] безопасность между пулом задач и интерпретаторами; [41] [42] и обнаружение ресурсов, балансировка нагрузки и отказоустойчивость при взаимодействии с Java / Jini Parallel Framework (JJPF), [43] фреймворком распределенного выполнения. Muskel также предоставляет поддержку для объединения структурированного и неструктурированного программирования [44] , а недавние исследования были посвящены расширяемости. [45]

Мальба

Mallba [46] — это библиотека для комбинаторной оптимизации, поддерживающая точные, эвристические и гибридные стратегии поиска. [47] Каждая стратегия реализована в Mallba как общий скелет, который может использоваться путем предоставления необходимого кода. Для точных алгоритмов поиска Mallba предоставляет скелеты ветвей и границ и динамической оптимизации. Для эвристик локального поиска Mallba поддерживает: восхождение на холм , метрополию, имитацию отжига и поиск с запретами ; а также эвристики на основе популяции, полученные из эволюционных алгоритмов, таких как генетические алгоритмы , стратегия эволюции и другие (CHC). Гибридные скелеты объединяют стратегии, такие как: GASA, смесь генетического алгоритма и имитации отжига, и CHCCES, который объединяет CHC и ES.

Скелеты предоставляются как библиотека C++ и не являются вложенными, но безопасными по типу. Используется пользовательский уровень абстракции MPI, NetStream, который заботится о маршаллинге примитивных типов данных, синхронизации и т. д. Скелет может иметь несколько параллельных реализаций нижнего уровня в зависимости от целевых архитектур: последовательных, LAN и WAN. Например: централизованный master-slave, распределенный master-slave и т. д.

Mallba также предоставляет переменные состояния, которые содержат состояние скелета поиска. Состояние связывает поиск с окружающей средой и может быть доступно для проверки эволюции поиска и принятия решения о будущих действиях. Например, состояние может использоваться для хранения наилучшего решения, найденного до сих пор, или значений α, β для обрезки ветвей и границ. [48]

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

Костный мозг

Marrow [49] [50] — это алгоритмический каркас C++ для оркестровки вычислений OpenCL в, возможно, гетерогенных, многопроцессорных средах . Он предоставляет набор скелетов как задач, так и параллельных данных, которые могут быть составлены посредством вложенности для построения составных вычислений. Листовые узлы результирующих деревьев композиции представляют вычислительные ядра GPU, в то время как оставшиеся узлы обозначают скелет, применяемый к вложенному поддереву. Каркас берет на себя всю оркестровку на стороне хоста, необходимую для правильного выполнения этих деревьев в гетерогенных многопроцессорных средах, включая надлежащий порядок передачи данных и запросов на выполнение, а также требуемую связь между узлами дерева.

Среди наиболее отличительных особенностей Marrow — набор скелетов, ранее недоступных в контексте GPU, таких как Pipeline и Loop, а также возможность вложения скелетов — функция, также новая в этом контексте. Более того, фреймворк вводит оптимизации, которые перекрывают связь и вычисления, тем самым маскируя задержку, налагаемую шиной PCIe .

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

Более подробную информацию, а также исходный код можно найти на сайте Marrow.

Мюсли

Muenster Skeleton Library Muesli [51] [52] — это библиотека шаблонов C++, которая повторно реализует многие идеи и концепции, представленные в Skil, например, функции высшего порядка, каррирование и полиморфные типы [1]. Она построена на основе MPI 1.2 и OpenMP 2.5 и поддерживает, в отличие от многих других библиотек скелетов, как скелеты параллельных задач, так и данных. Вложенность скелетов (композиция) похожа на двухуровневый подход P3L, т. е. скелеты параллельных задач могут быть вложены произвольно, в то время как скелеты параллельных данных не могут, но могут использоваться на листьях дерева вложенности параллельных задач. [53] Шаблоны C++ используются для рендеринга скелетов полиморфными, но никакая система типов не применяется. Однако библиотека реализует механизм автоматизированной сериализации, вдохновленный [54] , так что в дополнение к стандартным типам данных MPI в скелетах могут использоваться произвольные пользовательские типы данных. Поддерживаемые скелеты параллельных задач [55] — Branch & Bound, [56] Divide & Conquer, [57] [58] Farm, [59] [60] и Pipe, вспомогательные скелеты — Filter, Final и Initial. Скелеты параллельных данных, такие как fold (reduce), map, permute, zip и их варианты, реализованы как функции-члены более высокого порядка распределенной структуры данных. В настоящее время Muesli поддерживает распределенные структуры данных для массивов, матриц и разреженных матриц. [61]

Как уникальная функция, параллельные скелеты данных Muesli автоматически масштабируются как на одноядерных, так и на многоузловых кластерных архитектурах. [62] [63] Здесь масштабируемость по узлам и ядрам обеспечивается одновременным использованием MPI и OpenMP соответственно. Однако эта функция является необязательной в том смысле, что программа, написанная с помощью Muesli, по-прежнему компилируется и запускается на одноядерном многоузловом кластерном компьютере без внесения изменений в исходный код, т. е. гарантируется обратная совместимость. Это обеспечивается предоставлением очень тонкого уровня абстракции OpenMP, так что поддержка многоядерных архитектур может быть включена/выключена простым предоставлением/пропуском флага компилятора OpenMP при компиляции программы. Благодаря этому фактически не возникает никаких накладных расходов во время выполнения.

P3L, SkIE, SKElib

P3L [64] (Pisa Parallel Programming Language) — это язык координации на основе скелета. P3L предоставляет скелетные конструкции, которые используются для координации параллельного или последовательного выполнения кода C. Для языка предоставляется компилятор Anacleto [65] . Anacleto использует шаблоны реализации для компиляции кода P3 L в целевую архитектуру. Таким образом, скелет может иметь несколько шаблонов, каждый из которых оптимизирован для другой архитектуры. Шаблон реализует скелет на определенной архитектуре и предоставляет параметрический граф процесса с моделью производительности. Затем модель производительности может использоваться для принятия решения о преобразованиях программы, которые могут привести к оптимизации производительности. [66]

Модуль P3L соответствует правильно определенной конструкции скелета с входными и выходными потоками и другими подмодулями или последовательным кодом C. Модули могут быть вложены с использованием двухуровневой модели, где внешний уровень состоит из параллельных скелетов задач, в то время как параллельные скелеты данных могут использоваться на внутреннем уровне [64]. Проверка типа выполняется на уровне потока данных, когда программист явно указывает тип входных и выходных потоков, а также путем указания потока данных между подмодулями.

SkIE [67] (Skeleton-based Integrated Environment) очень похож на P3L , так как он также основан на языке координации, но предоставляет расширенные функции, такие как инструменты отладки, анализ производительности, визуализация и графический пользовательский интерфейс. Вместо прямого использования языка координации программисты взаимодействуют с графическим инструментом, где можно составлять параллельные модули, основанные на скелетах.

SKELib [68] основывается на вкладах P3L и SkIE , наследуя, среди прочего, систему шаблонов. Он отличается от них тем, что больше не используется язык координации, а вместо этого скелеты предоставляются как библиотека на языке C, с производительностью, аналогичной той, которая достигнута в P3L . В отличие от Skil , другого каркаса скелетов на языке C, безопасность типов не рассматривается в SKELib .

ПАС и ЭПАС

PAS (Parallel Architectural Skeletons) — это фреймворк для программирования скелетов, разработанный на C++ и MPI. [69] [70] Программисты используют расширение C++ для написания своих скелетных приложений1. Затем код передается через скрипт Perl, который расширяет код до чистого C++, где скелеты специализированы посредством наследования.

В PAS каждый скелет имеет объект-представитель (Rep), который должен быть предоставлен программистом и отвечает за координацию выполнения скелета. Скелеты могут быть вложены в иерархическом порядке с помощью объектов Rep. Помимо выполнения скелета, Rep также явно управляет приемом данных от скелета более высокого уровня и отправкой данных в подскелеты. Параметризованный протокол связи/синхронизации используется для отправки и получения данных между родительским и подскелетами.

Расширение PAS, обозначенное как SuperPas [71] и позднее как EPAS [72], решает проблемы расширяемости скелета. С помощью инструмента EPAS в PAS можно добавлять новые скелеты . Язык описания скелета (SDL) используется для описания шаблона скелета путем указания топологии относительно сетки виртуальных процессоров. Затем SDL можно скомпилировать в собственный код C++, который можно использовать как любой другой скелет.

СБАСКО

SBASCO ( Skeleton-BAsed Scientific COmponents ) — это среда программирования, ориентированная на эффективную разработку параллельных и распределенных численных приложений. [73] SBASCO нацелена на интеграцию двух моделей программирования: скелетов и компонентов с пользовательским языком композиции. Представление приложения компонента предоставляет описание его интерфейсов (тип ввода и вывода); в то время как представление конфигурации предоставляет, кроме того, описание внутренней структуры компонента и компоновки процессора. Внутренняя структура компонента может быть определена с использованием трех скелетов: фермы, трубы и многоблочного.

SBASCO адресует доменные разложимые приложения через свой многоблочный скелет. Домены указываются через массивы (в основном двумерные), которые разлагаются на подмассивы с возможными перекрывающимися границами. Затем вычисление происходит итеративным способом, подобным BSP. Первый этап состоит из локальных вычислений, в то время как второй этап выполняет обмен границами. Пример использования представлен для задачи реакции-диффузии в. [74]

Два типа компонентов представлены в [75] Scientific Components (SC), которые предоставляют функциональный код; и Communication Aspect Components (CAC), которые инкапсулируют нефункциональное поведение, такое как коммуникация, распределение процессора макета и репликация. Например, компоненты SC подключены к компоненту CAC, который может действовать как менеджер во время выполнения, динамически переназначая процессоры, назначенные SC. Пример использования, показывающий улучшенную производительность при использовании компонентов CAC, показан в [76] .

СКЛ

Язык структурированной координации ( SCL ) [77] был одним из самых ранних языков программирования скелетов. Он обеспечивает подход языка координации для программирования скелетов над компонентами программного обеспечения. SCL считается базовым языком и был разработан для интеграции с хост-языком, например, Fortran или C, используемым для разработки последовательных компонентов программного обеспечения. В SCL скелеты подразделяются на три типа: конфигурация , элементарные и вычисления . Скелеты конфигурации абстрактные шаблоны для часто используемых структур данных, таких как распределенные массивы (ParArray). Элементарные скелеты соответствуют параллельным скелетам данных, таким как map, scan и fold. Скелеты вычислений, которые абстрагируют поток управления и соответствуют в основном параллельным скелетам задач, таким как farm, SPMD и iterateUntil. Подход языка координации использовался в сочетании с моделями производительности для программирования традиционных параллельных машин, а также параллельных гетерогенных машин, которые имеют различные множественные ядра на каждом узле обработки. [78]

SkePU

SkePU [79] SkePU — это каркас программирования скелетов для многоядерных ЦП и многопроцессорных систем. Это библиотека шаблонов C++ с шестью скелетами параллельных данных и одним скелетом параллельных задач, двумя типами контейнеров и поддержкой выполнения на многопроцессорных системах как с CUDA, так и с OpenCL. Недавно в SkePU была разработана поддержка гибридного выполнения, динамического планирования с учетом производительности и балансировки нагрузки путем внедрения бэкэнда для системы выполнения StarPU. SkePU расширяется для кластеров GPU.

ШКИПЕР И КУАФФ

SKiPPER — это библиотека скелетов, специфичная для домена, для приложений машинного зрения [80] , которая предоставляет скелеты в CAML и, таким образом, полагается на CAML для обеспечения безопасности типов. Скелеты представлены двумя способами: декларативным и операционным. Декларативные скелеты напрямую используются программистами, в то время как их операционные версии предоставляют целевую реализацию, специфичную для архитектуры. Из среды выполнения, спецификаций скелета CAML и функций, специфичных для приложения (предоставленных программистом на языке C), генерируется и компилируется новый код C для запуска приложения на целевой архитектуре. Одна из интересных особенностей SKiPPER заключается в том, что программа-скелет может выполняться последовательно для отладки.

В SKiPPER были исследованы различные подходы к написанию операционных скелетов: статические графы потоков данных, параметрические сети процессов, иерархические графы задач и графы потоков данных с тегами-токенами. [81]

QUAFF [82] — более поздняя библиотека скелетов, написанная на C++ и MPI. QUAFF опирается на методы метапрограммирования на основе шаблонов для сокращения накладных расходов во время выполнения и выполнения расширений скелетов и оптимизаций во время компиляции. Скелеты могут быть вложенными, а последовательные функции сохраняют состояние. Помимо проверки типов, QUAFF использует преимущества шаблонов C++ для генерации во время компиляции нового кода C/MPI. QUAFF основан на модели CSP, где программа скелета описывается как сеть процессов и правила производства (одиночные, последовательные, парные, объединенные). [83]

SkeTo

Проект SkeTo [84] — это библиотека C++, которая достигает параллелизации с помощью MPI. SkeTo отличается от других библиотек скелетов, поскольку вместо предоставления вложенных шаблонов параллелизма SkeTo предоставляет параллельные скелеты для параллельных структур данных, таких как: списки, деревья [ 85] [86] и матрицы. [87] Структуры данных типизируются с помощью шаблонов, и на них можно вызывать несколько параллельных операций. Например, структура списка предоставляет параллельные операции, такие как: map, reduce, scan, zip, shift и т. д.

Дополнительные исследования вокруг SkeTo также были сосредоточены на стратегиях оптимизации путем преобразования и, в последнее время, на оптимизации, специфичной для домена. [88] Например, SkeTo обеспечивает преобразование слияния [89] , которое объединяет два последовательных вызова функции в один, тем самым уменьшая накладные расходы на вызов функции и избегая создания промежуточных структур данных, передаваемых между функциями.

Скил

Skil [90] — императивный язык для программирования скелетов. Скелеты не являются непосредственной частью языка, но реализуются с его помощью. Skil использует подмножество языка C, которое предоставляет функциональные языковые возможности, такие как функции высшего порядка, curring и полиморфные типы. Когда Skil компилируется, такие возможности устраняются и создается обычный код C. Таким образом, Skil преобразует полиморфные функции высшего порядка в мономорфные функции C первого порядка. Skil не поддерживает вложенную композицию скелетов. Параллелизм данных достигается с помощью определенных параллельных структур данных, например, для распределения массивов между доступными процессорами. Можно использовать скелеты фильтров.

Каркас скелета STAPL

В STAPL Skeleton Framework [91] [92] скелеты определяются как параметрические графы потоков данных, что позволяет им масштабироваться за пределы 100 000 ядер. Кроме того, этот фреймворк рассматривает композицию скелетов как композицию «точка-точка» соответствующих им графов потоков данных через понятие портов, что позволяет легко добавлять новые скелеты в фреймворк. В результате этот фреймворк устраняет необходимость в повторной реализации и глобальных синхронизациях в составных скелетах. STAPL Skeleton Framework поддерживает вложенную композицию и может переключаться между параллельным и последовательным выполнением на каждом уровне вложенности. Этот фреймворк выигрывает от масштабируемой реализации параллельных контейнеров STAPL [93] и может запускать скелеты на различных контейнерах, включая векторы, многомерные массивы и списки.

Т4П

T4P была одной из первых систем, представленных для скелетного программирования. [94] Система в значительной степени опиралась на свойства функционального программирования, и пять скелетов были определены как функции высшего порядка: Разделяй и властвуй, Ферма, Карта, Труба и RaMP. Программа могла иметь более одной реализации, каждая из которых использовала комбинацию различных скелетов. Кроме того, каждый скелет мог иметь различные параллельные реализации. Методология, основанная на функциональных преобразованиях программ, направляемых моделями производительности скелетов, использовалась для выбора наиболее подходящего скелета для использования в программе, а также наиболее подходящей реализации скелета. [95]

Сравнение фреймворков

Смотрите также

Ссылки

  1. ^ Редакторы К. Хаммонд и Г. Михельсон. «Направления исследований в параллельном функциональном программировании». Springer-Verlag, Лондон, Великобритания, 1999.
  2. ^ Ваннески, М. (2002). «Модель программирования ASSIST, среды для параллельных и распределенных переносимых приложений». Параллельные вычисления . 28 (12): 1709–1732. CiteSeerX  10.1.1.59.5543 . doi :10.1016/S0167-8191(02)00188-6.
  3. ^ М. Олдинуччи, М. Коппола, М. Данелутто, Н. Тонеллотто, М. Ваннески и К. Цокколо. «Высокоуровневое программирование сеток с помощью ASSIST». Вычислительные методы в науке и технике, 12(1):21–32, 2006.
  4. ^ М. Алдинуччи и М. Торквати. Ускорение ферм Apache с помощью распределенного масштабируемого репозитория объектов ad hoc. В Proc. of 10th Intl. Euro-Par 2004 Parallel Processing, том 3149 LNCS, страницы 596–605. Springer, 2004.
  5. ^ Aldinucci, M.; Danelutto, M.; Antoniu, G.; Jan, M. (2008). "Отказоустойчивый обмен данными для высокоуровневой Grid: иерархическая архитектура хранения". Достижения в европейских исследованиях Grid-систем . стр. 67. doi :10.1007/978-0-387-72812-4_6. ISBN 978-0-387-72811-7.
  6. ^ 'S. MacDonald, J. Anvik, S. Bromling, J. Schaeffer, D. Szafron и K. Tan.' "От шаблонов к фреймворкам и параллельным программам". Parallel Comput., 28(12):1663–1683, 2002.
  7. ^ K. Tan, D. Szafron, J. Schaeffer, J. Anvik и S. MacDonald. «Использование генеративных шаблонов проектирования для генерации параллельного кода для среды распределенной памяти». В PPoPP '03: Труды девятого симпозиума ACM SIGPLAN по принципам и практике параллельного программирования, страницы 203–215, Нью-Йорк, США, 2003. ACM.
  8. ^ Д. Каромель и М. Лейтон. «Точная настройка алгоритмических скелетов». В 13-й Международной конференции Euro-Par: Параллельная обработка, том 4641 Lecture Notes in Computer Science, страницы 72–81. Springer-Verlag, 2007.
  9. ^ Д. Каромель, Л. Анрио и М. Лейтон. «Типовые безопасные алгоритмические скелеты». В трудах 16-й конференции Euromicro по параллельной, распределенной и сетевой обработке, страницы 45–53, Тулуза, Франция, февраль 2008 г. IEEE CS Press.
  10. ^ Д. Каромель и М. Лейтон. «Прозрачная неинвазивная модель данных файла для алгоритмических скелетов». В 22-м Международном симпозиуме по параллельной и распределенной обработке (IPDPS), страницы 1–8, Майами, США, март 2008 г. IEEE Computer Society.
  11. ^ Марио Лейтон, Хосе М. Пикер. «Skandium: многоядерное программирование с алгоритмическими скелетами», IEEE Euro-micro PDP 2010.
  12. ^ Рита Луген, Иоланда Ортега-Маллен и Рикардо Пенья-Мари. «Параллельное функциональное программирование в Эдеме», Журнал функционального программирования, № 15 (2005), 3, страницы 431–475.
  13. ^ Мюррей Коул. «Вытаскивание скелетов из шкафа: прагматичный манифест скелетного параллельного программирования». Параллельные вычисления, 30(3):389–406, 2004.
  14. ^ A. Benoit, M. Cole, S. Gilmore и J. Hillston. «Гибкое скелетное программирование с eskel». В JC Cunha и PD Medeiros, редакторы, Euro-Par, том 3648 Lecture Notes in Computer Science, страницы 761–770. Springer, 2005.
  15. ^ A. Benoit и M. Cole. «Две фундаментальные концепции в скелетном параллельном программировании». В V. Sunderam, D. van Albada, P. Sloot и J. Dongarra, редакторы, Международная конференция по вычислительной науке (ICCS 2005), Часть II, LNCS 3515, страницы 764–771. Springer Verlag, 2005.
  16. ^ A. Benoit, M. Cole, S. Gilmore и J. Hillston. Оценка производительности скелетно-ориентированных высокоуровневых параллельных программ. В M. Bubak, D. van Albada, P. Sloot и J. Dongarra, редакторы, Международная конференция по вычислительной науке (ICCS 2004), Часть III, LNCS 3038, страницы 289–296. Springer Verlag, 2004.
  17. ^ А. Бенуа, М. Коул, С. Гилмор и Дж. Хиллстон. «Оценка производительности структурированных параллельных программ конвейера с помощью скелетов и алгебры процессов». Масштабируемые вычисления: практика и опыт, 6(4):1–16, декабрь 2005 г.
  18. ^ А. Бенуа, М. Коул, С. Гилмор и Дж. Хиллстон. «Планирование скелетных сетевых приложений с использованием pepa и nws». The Computer Journal, Специальный выпуск по моделированию и измерению производительности сетки, 48(3):369–378, 2005.
  19. ^ A. Benoit и Y. Robert. «Отображение скелетов трубопроводов на гетерогенных платформах». В ICCS 2007, 7-й Международной конференции по вычислительной науке, LNCS 4487, страницы 591–598. Springer Verlag, 2007.
  20. ^ G. Yaikhom, M. Cole, S. Gilmore и J. Hillston. «Структурный подход к моделированию производительности систем с использованием скелетонов». Electr. Notes Theor. Comput. Sci., 190(3):167–183, 2007.
  21. ^ Х. Гонсалес-Велес и М. Коул . «К полностью адаптивному конвейерному параллелизму для гетерогенных распределенных сред». В Параллельная и распределенная обработка и приложения, 4-й Международный симпозиум (ISPA), Конспект лекций по информатике, страницы 916–926. Springer-Verlag, 2006.
  22. ^ Х. Гонсалес-Велес и М. Коул. «Адаптивный структурированный параллелизм для вычислительных сеток». В PPoPP '07: Труды 12-го симпозиума ACM SIGPLAN по принципам и практике параллельного программирования, страницы 140–141, Нью-Йорк, США, 2007. ACM.
  23. ^ Aldinucci, M.; Campa, S.; Danelutto, M.; Kilpatrick, P.; Torquati, M. (2013). «Targeting Distributed Systems in FastFlow» (PDF) . Euro-Par 2012: Parallel Processing Workshops . Euro-Par 2012: Parallel Processing Workshops. Lecture Notes in Computer Science. Vol. 7640. pp. 47–56. doi : 10.1007/978-3-642-36949-0_7 . ISBN 978-3-642-36948-3.
  24. ^ Aldinucci, M.; Spampinato, C.; Drocco, M.; Torquati, M.; Palazzo, S. (2012). «Параллельный алгоритм сохранения краев для шумоподавления изображений типа «соль и перец»». 2012 3-я международная конференция по теории обработки изображений, инструментам и приложениям (IPTA) . 3-я международная конференция по теории обработки изображений, инструментам и приложениям (IPTA). стр. 97–104. doi :10.1109/IPTA.2012.6469567. hdl : 2318/154520 .
  25. ^ Aldinucci, M.; Danelutto, M.; Kilpatrick, P.; Meneghin, M.; Torquati, M. (2012). «Эффективная неограниченная очередь без блокировок для многоядерных систем». Euro-Par 2012 Параллельная обработка . Euro-Par 2012 Параллельная обработка. Lecture Notes in Computer Science. Vol. 7484. pp. 662–673. doi : 10.1007/978-3-642-32820-6_65 . hdl : 2318/121343 . ISBN 978-3-642-32819-0.
  26. ^ Aldinucci, M.; Meneghin, M.; Torquati, M. (2010). "Эффективный Smith-Waterman на многоядерных процессорах с быстрым потоком ". 2010 18-я конференция Euromicro по параллельной, распределенной и сетевой обработке . IEEE. стр. 195. CiteSeerX 10.1.1.163.9092 . doi :10.1109/PDP.2010.93. ISBN  978-1-4244-5672-7. S2CID  1925361.
  27. ^ CA Herrmann и C. Lengauer. «HDC: язык высшего порядка для принципа «разделяй и властвуй». Parallel Processing Letters, 10(2–3):239–250, 2000.
  28. ^ CA Herrmann. Распараллеливание рекурсий «разделяй и властвуй» на основе скелета. Кандидатская диссертация, 2000. ISBN 3-89722-556-5 ". 
  29. ^ J. Dünnweber, S. Gorlatch. "Higher-Order Components for Grid Programming. Making Grids More Usable. ". Springer-Verlag, 2009. ISBN 978-3-642-00840-5 
  30. ^ JF Ferreira, JL Sobral и AJ Proenca. "Jaskel: Java-скелетная структура для структурированных кластерных и сетевых вычислений". В CCGRID '06: Труды шестого международного симпозиума IEEE по кластерным вычислениям и сетке, страницы 301–304, Вашингтон, округ Колумбия, США, 2006. IEEE Computer Society.
  31. ^ J. Sobral и A. Proenca. «Включение скелетов Jaskel для кластеров и вычислительных сеток». В IEEE Cluster. IEEE Press, 9 2007.
  32. ^ М. Олдинуччи и М. Данелутто. «Оптимизация параллельного скелета потока». В Трудах PDCS: Международная конференция по параллельным и распределенным вычислениям и системам, страницы 955–962, Кембридж, Массачусетс, США, ноябрь 1999 г. IASTED, ACTA press.
  33. ^ Aldinucci, M.; Danelutto, M.; Teti, P. (2003). «Продвинутая среда, поддерживающая структурированное параллельное программирование на Java». Future Generation Computer Systems . 19 (5): 611. CiteSeerX 10.1.1.59.3748 . doi :10.1016/S0167-739X(02)00172-3. 
  34. ^ М. Данелутто и П. Тети. «Lithium: структурированная параллельная программная среда на Java». В Proc. ICCS: Международная конференция по вычислительной науке, том 2330 LNCS, страницы 844–853. Springer Verlag, апрель 2002 г.
  35. ^ M. Aldinucci и M. Danelutto. «Операционная семантика для скелетов». В GR Joubert, WE Nagel, FJ Peters и WV Walter, редакторы, Параллельные вычисления: программные технологии, алгоритмы, архитектуры и приложения, PARCO 2003, том 13 Достижения в параллельных вычислениях, страницы 63–70, Дрезден, Германия, 2004. Elsevier.
  36. ^ Aldinucci, M.; Danelutto, M. (2007). «Параллельное программирование на основе скелета: функциональная и параллельная семантика в одном кадре☆». Computer Languages, Systems & Structures . 33 (3–4): 179. CiteSeerX 10.1.1.164.368 . doi :10.1016/j.cl.2006.07.004. 
  37. ^ М. Олдинуччи, М. Данелутто и Дж. Дюннвебер. «Методы оптимизации для реализации параллельных скелетонов в средах сеток». В S. Gorlatch, редакторе, Proc. of CMPP: Intl. Workshop on Constructive Methods for Parallel Programming, страницы 35–47, Стерлинг, Шотландия, Великобритания, июль 2004 г. Universität Munster, Германия.
  38. ^ М. Данелутто . Эффективная поддержка скелетов на кластерах рабочих станций. Parallel Processing Letters, 11(1):41–56, 2001.
  39. ^ М. Данелутто. «Динамическая поддержка времени выполнения для скелетонов». Технический отчет, 1999.
  40. ^ М. Данелутто. «Qos в параллельном программировании через менеджеры приложений». В PDP '05: Труды 13-й конференции Euromicro по параллельной, распределенной и сетевой обработке (PDP'05), страницы 282–289, Вашингтон, округ Колумбия, США, 2005. IEEE Computer Society.
  41. ^ М. Алдинуччи и М. Данелутто. «Стоимость безопасности в скелетных системах». В P. D'Ambra и MR Guarracino, редакторы, Proc. of Intl. Euromicro PDP 2007: Parallel Distributed and network-based Processing, страницы 213–220, Неаполь, Италия, февраль 2007 г. IEEE.
  42. ^ М. Алдинуччи и М. Данелутто. «Защита скелетных систем с ограниченным снижением производительности: опыт мускулатуры». Журнал системной архитектуры, 2008.
  43. ^ М. Данелутто и П. Дацци. «Среда Java/Jini, поддерживающая потоковые параллельные вычисления». В Proc. международного PARCO 2005: Параллельные вычисления, сентябрь 2005 г.
  44. ^ M. Danelutto и P. Dazzi. "Совместное использование структурированного/неструктурированного параллелизма через поток данных". В V. Alexandrov, D. van Albada, P. Sloot и J. Dongarra, редакторы, Proc. of ICCS: Международная конференция по вычислительной науке, Семинар по практическим аспектам высокоуровневого параллельного программирования, LNCS, Рединг, Великобритания, май 2006 г. Springer Verlag.
  45. ^ М. Олдинуччи, М. Данелутто и П. Дацци. «Muskel: расширяемая скелетная среда». Масштабируемые вычисления: практика и опыт, 8(4):325–341, декабрь 2007 г.
  46. ^ Э. Альба, Ф. Алмейда, М. Дж. Блеса, Х. Кабеса, К. Котта, М. Диас, И. Дорта, Х. Габарро, К. Леон, Х. Луна, Л. М. Морено, К. Паблос, Х. Пети , А. Рохас и Ф. Джафа. «Mallba: библиотека скелетов для комбинаторной оптимизации (исследовательская записка)». В Euro-Par '02: Материалы 8-й Международной конференции Euro-Par по параллельной обработке, страницы 927–932, Лондон, Великобритания, 2002. Springer-Verlag.
  47. ^ Э. Альба, Ф. Алмейда, М. Блеса, К. Котта, М. Диас, И. Дорта, Х. Габарро, К. Леон, Г. Люке, Ж. Пети, К. Родригес, А. Рохас и Ф. Джафа. Эффективные параллельные алгоритмы lan/wan для оптимизации: проект mallba. Параллельные вычисления, 32(5):415–440, 2006.
  48. ^ E. Alba, G. Luque, J. Garcia-Nieto, G. Ordonez и G. Leguizamon. «Mallba — программная библиотека для разработки эффективных алгоритмов оптимизации». International Journal of Innovative Computing and Applications, 1(1):74–85, 2007.
  49. ^ "Рикардо Маркес, Эрве Паулино, Фернандо Алешандре, Педро Д. Медейрос". "Алгоритмическая каркасная структура для оркестровки вычислений на GPU". Euro-Par 2013: 874–885
  50. ^ "Фернандо Александре, Рикардо Маркес, Эрве Паулино". "О поддержке параллельных алгоритмических скелетов для многопроцессорных вычислений". ACM SAC 2014: 880–885
  51. ^ Х. Кухен и Дж. Штригниц. «Особенности функционального программирования для библиотеки скелета C++». Параллелизм – Практика и Опыт, 17(7–8):739–756, 2005.
  52. ^ Филипп Цеханович, Михаэль Полднер и Герберт Кухен. «Мюсли из библиотеки скелетов Мюнстера – всеобъемлющий обзор». Рабочий документ ERCIS № 7, 2009 г.
  53. ^ Х. Кучен и М. Коул . «Интеграция параллельных скелетов задач и данных». Parallel Processing Letters, 12(2):141–155, 2002.
  54. ^ А. Александреску. «Современное проектирование на C++: применение шаблонов обобщенного программирования и проектирования». Addison-Wesley, 2001.
  55. ^ Майкл Полднер. «Параллельные алгоритмические скелеты задач». Кандидатская диссертация, Университет Мюнстера, 2008.
  56. ^ Майкл Полднер и Герберт Кухен. «Алгоритмические скелеты для ветвей и границ». Труды 1-й Международной конференции по программному обеспечению и технологиям данных (ICSOFT), 1:291–300, 2006.
  57. ^ Майкл Полднер и Герберт Кухен. «Оптимизация обработки скелетного потока для принципа «разделяй и властвуй». Труды 3-й Международной конференции по технологиям программного обеспечения и данных (ICSOFT), 181–189, 2008.
  58. ^ Майкл Полднер и Герберт Кухен. «Скелеты для разделяй и властвуй». Труды Международной конференции IASTED по параллельным и распределенным вычислениям и сетям (PDCN), 181–188, 2008.
  59. ^ Майкл Полднер и Герберт Кухен. «Масштабируемые фермы». Труды Международной конференции по параллельной обработке (ParCo) 33:795–802, 2006.
  60. ^ Майкл Полднер и Герберт Кухен. «О внедрении скелета фермы». Parallel Processing Letters, 18(1):117–131, 2008.
  61. ^ Филипп Цеханович. «Алгоритмические скелеты для общих разреженных матриц». Труды 20-й Международной конференции IASTED по параллельным и распределенным вычислениям и системам (PDCS), 188–197, 2008.
  62. ^ Филипп Цеханович, Филипп Кегель, Марайке Шеллманн, Сергей Горлач и Герберт Кухен. «Распараллеливание реконструкции изображений LM OSEM на многоядерных кластерах». Параллельные вычисления: от многоядерных процессоров и графических процессоров до петафлопсных вычислений, 19: 169–176, 2010.
  63. ^ Филипп Цеханович и Герберт Кухен. «Улучшение параллельных скелетов данных Мюсли для многоядерных компьютерных архитектур». Международная конференция по высокопроизводительным вычислениям и коммуникациям (HPCC), 108–113, 2010.
  64. ^ Bacci, B.; Danelutto, M.; Orlando, S.; Pelagatti, S.; Vanneschi, M. (1995). "P3L: структурированный высокоуровневый параллельный язык и его структурированная поддержка". Concurrency: Practice and Experience . 7 (3): 225. CiteSeerX 10.1.1.215.6425 . doi :10.1002/cpe.4330070305. 
  65. ^ S. Ciarpaglini, M. Danelutto, L. Folchi, C. Manconi и S. Pelagatti. "ANACLETO: компилятор p3l на основе шаблонов". В трудах Седьмого семинара по параллельным вычислениям (PCW '97), Австралийский национальный университет, Канберра, август 1997 г.
  66. ^ M. Aldinucci, M. Coppola и M. Danelutto. Переписывание скелетных программ: как оценить компромисс между данными и параллельным потоком и параллельным потоком. В S. Gorlatch, редакторе, Proc of CMPP: Intl. Workshop on Constructive Methods for Parallel Programming, страницы 44–58. Uni. Passau, Германия, май 1998 г.
  67. ^ Б. Баччи, М. Данелутто, С. Пелагатти и М. Ваннески. «Skie: гетерогенная среда для приложений HPC». Parallel Comput., 25(13–14):1827–1852, 1999.
  68. ^ М. Данелутто и М. Стиглиани. «Skelib: Параллельное программирование со скелетонами на языке C». В Euro-Par '00: Труды 6-й Международной конференции Euro-Par по параллельной обработке, страницы 1175–1184, Лондон, Великобритания, 2000. Springer-Verlag.
  69. ^ Д. Госвами, А. Сингх и Б. Р. Прейсс. «От шаблонов проектирования к параллельным архитектурным скелетам». J. Parallel Distrib. Comput., 62(4):669–695, 2002. doi:10.1006/jpdc.2001.1809
  70. ^ Д. Госвами, А. Сингх и Б. Р. Прейсс. «Использование объектно-ориентированных методов для реализации параллельных архитектурных скелетов». В ISCOPE '99: Труды третьего международного симпозиума по вычислениям в объектно-ориентированных параллельных средах, заметки лекций по информатике, страницы 130–141, Лондон, Великобритания, 1999. Springer-Verlag.
  71. ^ MM Akon, D. Goswami и HF Li. "Superpas: параллельная архитектурная скелетная модель, поддерживающая расширяемость и скелетную композицию". В Parallel and Distributed Processing and Applications Второй международный симпозиум, ISPA, Lecture Notes in Computer Science, страницы 985–996. Springer-Verlag, 2004.
  72. ^ MM Akon, A. Singh, D. Goswami и HF Li. «Расширяемые параллельные архитектурные скелеты». В High Performance Computing HiPC 2005, 12-я международная конференция, том 3769 Lecture Notes in Computer Science, страницы 290–301, Гоа, Индия, декабрь 2005 г. Springer-Verlag.
  73. ^ М. Диас, Б. Рубио, Э. Солер и Дж. М. Троя. «SBASCO: Научные компоненты на основе скелета». В PDP, страницы 318–. IEEE Computer Society, 2004.
  74. ^ M. Diaz, S. Romero, B. Rubio, E. Soler и JM Troya. «Использование SBASCO для решения уравнений реакции-диффузии в двумерных нерегулярных областях». В Practical Aspects of High-Level Parallel Programming (PAPP), связанном с Международной конференцией по вычислительной науке (ICCS), том 3992 Lecture Notes in Computer Science, страницы 912–919. Springer, 2006.
  75. ^ М. Диас, С. Ромеро, Б. Рубио, Э. Солер и Дж. М. Троя. «Аспектно-ориентированная структура для разработки научных компонентов». В PDP '05: Труды 13-й конференции Euromicro по параллельной, распределенной и сетевой обработке, страницы 290–296, Вашингтон, округ Колумбия, США, 2005. IEEE Computer Society.
  76. ^ M. Diaz, S. Romero, B. Rubio, E. Soler и JM Troya. «Динамическая реконфигурация научных компонентов с использованием аспектно-ориентированного программирования: исследование случая». В R. Meersman And Z. Tari, редакторы, On the Move to Meaningful Internet Systems 2006: CoopIS, DOA, GADA и ODBASE, том 4276 Lecture Notes in Computer Science, страницы 1351–1360. Springer-Verlag, 2006.
  77. ^ J. Darlington, Y. ke Guo, HW To и J. Yang. «Параллельные скелеты для структурированной композиции». В PPOPP '95: Труды пятого симпозиума ACM SIGPLAN по принципам и практике параллельного программирования, страницы 19–28, Нью-Йорк, штат Нью-Йорк, США, 1995. ACM.
  78. ^ Джон Дарлинтон; Мустафа Ганем; Йике Го; Хинг Винг То (1996), «Управляемая организация ресурсов в гетерогенных параллельных вычислениях», Журнал высокопроизводительных вычислений , 4 (1): 13–23, CiteSeerX 10.1.1.37.4309 
  79. ^ "СкеПУ".
  80. ^ J. Serot, D. Ginhac и J. Derutin. "SKiPPER: параллельная программная среда на основе скелета для приложений обработки изображений в реальном времени". В V. Malyshkin, редактор, 5-я Международная конференция по технологиям параллельных вычислений (PaCT-99), том 1662 LNCS, страницы 296–305. Springer, 6–10 сентября 1999 г.
  81. ^ J. Serot и D. Ginhac. «Скелеты для параллельной обработки изображений: обзор проекта SKiPPER». Parallel Computing, 28(12):1785–1808, декабрь 2002 г.
  82. ^ J. Falcou, J. Serot, T. Chateau и JT Lapreste. «Quaff: эффективный дизайн C++ для параллельных скелетонов». Parallel Computing, 32(7):604–615, 2006.
  83. ^ J. Falcou и J. Serot. «Формальная семантика, применяемая к реализации библиотеки параллельного программирования на основе скелета». В GR Joubert, C. Bischof, FJ Peters, T. Lippert, M. Bcker, P. Gibbon и B. Mohr, редакторы, Parallel Computing: Architectures, Algorithms and Applications (Proc. of PARCO 2007, Julich, Germany), том 38 NIC, страницы 243–252, Germany, сентябрь 2007 г. John von Neumann Institute for Computing.
  84. ^ K. Matsuzaki, H. Iwasaki, K. Emoto и Z. Hu. «Библиотека конструктивных скелетов для последовательного стиля параллельного программирования». В InfoScale '06: Труды 1-й международной конференции по масштабируемым информационным системам, стр. 13, Нью-Йорк, США, 2006. ACM.
  85. ^ K. Matsuzaki, Z. Hu и M. Takeichi. «Распараллеливание с помощью скелетов деревьев». В Euro-Par, том 2790 Lecture Notes in Computer Science, страницы 789–798. Springer, 2003.
  86. ^ К. Мацудзаки, З. Ху и М. Такеичи. «Параллельные скелеты для манипулирования общими деревьями». Parallel Computation, 32(7):590–603, 2006.
  87. ^ К. Эмото, З. Ху, К. Какехи и М. Такеичи. «Композиционная структура для разработки параллельных программ на двумерных массивах». Технический отчет, кафедра математической информатики, Токийский университет, 2005.
  88. ^ К. Эмото, К. Мацузаки, З. Ху и М. Такеичи. «Стратегия оптимизации предметной области для скелетных программ». В Euro-Par, том 4641 Lecture Notes in Computer Science, страницы 705–714. Springer, 2007.
  89. ^ К. Мацузаки, К. Какехи, Х. Ивасаки, З. Ху и Ю. Акаши. «Библиотека скелетов, встроенная в Fusion». В М. Данелутто, М. Ваннески и Д. Лафоренце, редакторах, Euro-Par, том 3149 конспектов лекций по информатике, страницы 644–653. Спрингер, 2004.
  90. ^ GH Botorog и H. Kuchen. «Эффективное высокоуровневое параллельное программирование». Theor. Comput. Sci., 196(1–2):71–107, 1998.
  91. ^ Зандифар, Мани; Абдулджаббар, Мустафа; Маджиди, Алиреза; Кейес, Дэвид; Амато, Нэнси; Раухвергер, Лоуренс (2015). «Составление алгоритмических скелетов для выражения высокопроизводительных научных приложений». Труды 29-й ACM по Международной конференции по суперкомпьютерам . стр. 415–424. doi :10.1145/2751205.2751241. ISBN 9781450335591. S2CID  13764901.
  92. ^ Зандифар, Мани; Томас, Натан; Амато, Нэнси М.; Раухвергер, Лоуренс (15 сентября 2014 г.). Бродман, Джеймс; Ту, Пэн (ред.). Языки и компиляторы для параллельных вычислений . Конспект лекций по информатике. Springer International Publishing. стр. 176–190. doi :10.1007/978-3-319-17473-0_12. ISBN 9783319174723.
  93. ^ "G. Tanase, et.al." "STAPL Parallel Container Framework" Труды PPoPP '11 Труды 16-го симпозиума ACM по принципам и практике параллельного программирования Страницы 235–246
  94. ^ J. Darlington, AJ Field, PG Harrison, PHJ Kelly, DWN Sharp и Q. Wu. «Параллельное программирование с использованием скелетных функций». В PARLE '93: Труды 5-й Международной конференции PARLE по параллельным архитектурам и языкам в Европе, страницы 146–160, Лондон, Великобритания, 1993. Springer-Verlag.
  95. ^ J. Darlinton; M. Ghanem; HW To (1993), «Структурированное параллельное программирование», в «Моделях программирования для массивно-параллельных компьютеров». IEEE Computer Society Press. 1993 : 160–169, CiteSeerX 10.1.1.37.4610