Сглаживающее преобразование

Преобразование выравнивания — это алгоритм , который преобразует вложенный параллелизм данных в плоский параллелизм данных. Он был впервые предложен Гаем Блеллохом как часть языка программирования NESL . [1] Преобразование выравнивания также иногда называют векторизацией , но оно совершенно не связано с автоматической векторизацией . Первоначальный алгоритм выравнивания был связан исключительно с многомерными массивами первого порядка, содержащими примитивные типы, но был расширен для обработки типов данных более высокого порядка и рекурсивных типов в работе над Data Parallel Haskell. [2]

Обзор

Сглаживание работает путем поднятия функций для работы с массивами, а не с отдельными значениями. Например, функция поднимается до функции . Это означает, что выражение может быть заменено применением поднятой функции: . Интуитивно понятно, что сглаживание таким образом работает путем замены всех применений функций применениями соответствующей поднятой функции. f : A B {\displaystyle f:A\rightarrow B} f : [ A ] [ B ] {\displaystyle f':[A]\rightarrow [B]} m a p   f   x {\displaystyle map~f~x} f   x {\displaystyle f'~x}

После выравнивания массивы представляются как одномерный вектор значений V , содержащий скалярные элементы, наряду со вспомогательной информацией, записывающей вложенную структуру, обычно в форме вектора булевых флагов F. Вектор флагов указывает для соответствующего элемента в векторе значений, является ли он началом нового сегмента . Например, двумерный нерегулярный массив может быть представлен как вектор данных рядом с вектором флагов . A = [ [ 1 , 2 , 3 ] , [ 4 , 5 ] , [ ] , [ 6 ] ] {\displaystyle A=[[1,2,3],[4,5],[],[6]]} V = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] {\displaystyle V=[1,2,3,4,5,6,7]} F = [ 1 , 0 , 0 , 1 , 0 , 1 , 1 ] {\displaystyle F=[1,0,0,1,0,1,1]}

Этот вектор флага необходим для правильного выравнивания вложенного параллелизма. Например, он используется при выравнивании суммы префикса до сегментированного сканирования .

Сглаживание может увеличить асимптотическую работу и сложность пространства исходной программы, что приведет к гораздо менее эффективному результату. [3]

Использование

Первоначально метод Flattening был разработан для векторных машин, таких как Connection Machine , и часто создает код, который не очень хорошо подходит для современных многоядерных процессоров. [4] Однако принципы, лежащие в основе его более простых случаев, можно найти в таких конструкциях, как vmapв Google Jax .

Ссылки

  1. ^ Блеллок, Гай (1995). «NESL: вложенный язык параллельных данных». {{cite journal}}: Цитировать журнал требует |journal=( помощь )
  2. ^ Параллельные данные Haskell: отчет о состоянии
  3. ^ Спунхауэр, Дэниел; Харпер; Блеллох; Гиббонс (2008). «Профилирование пространства для параллельных функциональных программ». {{cite journal}}: Цитировать журнал требует |journal=( помощь )
  4. ^ Бергстром, Ларс; Флюэт, Мэтью; Рейни, Майк; Реппи, Джон (2013), «Выравнивание только данных для параллелизма вложенных данных», PPoPP , стр.  81–92 , doi :10.1145/2442516.2442525, ISBN 978-1-4503-1922-5, S2CID  1005665
Retrieved from "https://en.wikipedia.org/w/index.php?title=Flattening_transformation&oldid=1249558999"