Jump to content

Уличный алгоритм

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

Алгоритм Штрассена работает для любого кольца , например плюс/умножение, но не для всех полуколец , например мин-плюс или булевой алгебры , где все еще работает наивный алгоритм, и так называемого комбинаторного умножения матриц .

Фолькер Штрассен впервые опубликовал этот алгоритм в 1969 году и тем самым доказал, что общий алгоритм умножения матриц не был оптимальным. [1] Публикация алгоритма Штрассена привела к увеличению количества исследований по умножению матриц, которые привели как к асимптотически нижним оценкам, так и к улучшению вычислительных верхних границ.

Алгоритм

[ редактировать ]
В левом столбце визуализируются вычисления, необходимые для определения результата умножения матрицы 2х2 . Наивное умножение матриц требует одного умножения на каждую «1» левого столбца. Каждый из остальных столбцов (M1-M7) представляет одно из 7 умножений в алгоритме Штрассена. Сумма столбцов M1-M7 дает тот же результат, что и умножение полной матрицы слева.

Позволять , быть двумя квадратными матрицами над кольцом , например матрицы, элементы которых являются целыми или действительными числами. Целью умножения матриц является вычисление произведения матрицы. . Следующее описание алгоритма предполагает, что все эти матрицы имеют размеры, являющиеся степенями двойки (т. е. ), но это лишь концептуально необходимо — если матрицы , не относятся к типу , «недостающие» строки и столбцы можно заполнить нулями, чтобы получить матрицы с размерами степеней двойки, хотя реальные реализации алгоритма на практике этого не делают.

Разделения алгоритма Штрассена , и одинакового размера на блочные матрицы

с . Наивный алгоритм будет таким:

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

Вместо этого алгоритм Штрассена определяет новые значения:

используя всего 7 умножений (по одному на каждое ) вместо 8. Теперь мы можем выразить с точки зрения :

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

Практическая реализация алгоритма Штрассена переключается на стандартные методы умножения матриц для достаточно маленьких подматриц, для которых эти алгоритмы более эффективны. Конкретная точка пересечения, для которой алгоритм Штрассена более эффективен, зависит от конкретной реализации и аппаратного обеспечения. Ранее авторы подсчитали, что алгоритм Штрассена работает быстрее для матриц шириной от 32 до 128 для оптимизированных реализаций. [2] Однако было замечено, что эта точка пересечения в последние годы увеличивается, и исследование 2010 года показало, что даже один шаг алгоритма Штрассена часто не приносит пользы для современных архитектур по сравнению с высокооптимизированным традиционным умножением, пока размеры матрицы не превысят 1000 или более, и даже для размеров матриц в несколько тысяч выигрыш обычно в лучшем случае незначителен (около 10% или меньше). [3] Более недавнее исследование (2016 г.) выявило преимущества для матриц размером всего 512 и около 20%. [4]

Форма Винограда

[ редактировать ]

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

где .

Это уменьшает количество сложений и вычитаний матриц с 18 до 15. Количество умножений матриц по-прежнему равно 7, а асимптотическая сложность та же. [5]

Асимптотическая сложность

[ редактировать ]

Схема приведенного выше алгоритма показала, что можно обойтись всего 7 вместо традиционных 8 матричных умножений для подблоков матрицы. С другой стороны, приходится делать сложение и вычитание блоков, хотя по общей сложности это не имеет значения: Сложение матриц размера требуется только операции, тогда как умножение существенно дороже (традиционно операции сложения или умножения).

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

Количество сложений и умножений, необходимых в алгоритме Штрассена, можно рассчитать следующим образом: пусть быть числом операций за матрица. Затем, рекурсивно применив алгоритм Штрассена, мы видим, что , для некоторой константы это зависит от количества сложений, выполняемых при каждом применении алгоритма. Следовательно , т. е. асимптотическая сложность умножения матриц размера использование алгоритма Штрассена . Однако за уменьшение количества арифметических операций приходится несколько снижать числовую стабильность . [6] и алгоритм также требует значительно больше памяти по сравнению с наивным алгоритмом. Обе исходные матрицы должны иметь размеры, расширенные до следующей степени 2, что приводит к хранению в четыре раза большего количества элементов, а каждая из семи вспомогательных матриц содержит четверть элементов расширенных.

Алгоритм Штрассена следует сравнить с «наивным» способом умножения матриц, который потребует 8 вместо 7 умножений подблоков. Тогда это привело бы к сложности, которую можно ожидать от стандартного подхода: . Сравнение этих двух алгоритмов показывает, что асимптотически алгоритм Штрассена быстрее: существует размер так что матрицы большего размера более эффективно умножаются с помощью алгоритма Штрассена, чем «традиционным» способом. Однако из асимптотического утверждения не следует, что алгоритм Штрассена всегда быстрее даже для маленьких матриц, и на практике это на самом деле не так: для маленьких матриц стоимость дополнительных добавлений матричных блоков перевешивает экономию на количестве умножения. Существуют и другие факторы, не учтенные в приведенном выше анализе, например, разница в стоимости современного оборудования между загрузкой данных из памяти в процессоры и стоимостью фактического выполнения операций с этими данными. Вследствие такого рода соображений алгоритм Штрассена обычно используется только с «большими» матрицами. Этот вид эффекта еще более выражен при использовании альтернативных алгоритмов, таких как алгоритм Копперсмита и Винограда : хотя асимптотически даже быстрее, точка пересечения настолько велик, что этот алгоритм обычно не используется для матриц, встречающихся на практике.

Ранг или билинейная сложность

[ редактировать ]

Билинейная сложность или ранг билинейного отображения является важным понятием асимптотической сложности умножения матриц. Ранг билинейного отображения над полем F определяется как (что-то вроде злоупотребления обозначениями )

Другими словами, ранг билинейного отображения — это длина его кратчайшего билинейного вычисления. [7] Существование алгоритма Штрассена показывает, что ранг умножение матрицы не более семи. Чтобы убедиться в этом, давайте представим этот алгоритм (наряду со стандартным алгоритмом) как такое билинейное вычисление. В случае матриц двойственные пространства A * и B * состоят из отображений в поле F , индуцированных скалярным двойным скалярным произведением (т.е. в данном случае суммой всех элементов произведения Адамара ).

Стандартный алгоритм Уличный алгоритм
1
2
3
4
5
6
7
8

Можно показать, что общее количество элементарных умножений необходимое для умножения матриц тесно асимптотически связано с рангом , то есть или, более конкретно, поскольку константы известны, . Одним из полезных свойств ранга является то, что он субмультипликативен для тензорных произведений , и это позволяет показать, что умножение матриц может быть выполнено не более чем за элементарное умножение любого . (Этот -кратное тензорное произведение карта умножения матрицы сама на себя — -я тензорная степень — реализуется на рекурсивном этапе показанного алгоритма.)

Поведение кэша

[ редактировать ]

Алгоритм Штрассена не учитывает кэш . Анализ алгоритма поведения кэша показал, что он несет

кеш промахивается во время своего выполнения, предполагая, что кеш идеализированного размера (т.е. с линии длины ). [8] : 13 

Рекомендации по реализации

[ редактировать ]

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

Хорошая реализация будет наблюдать следующее:

  • Нет необходимости и нежелательно использовать алгоритм Штрассена вплоть до предела скаляров. По сравнению с обычным умножением матриц этот алгоритм добавляет значительные нагрузка на сложение/вычитание; поэтому ниже определенного размера лучше использовать обычное умножение. Так, например, не нужно дополнять , поскольку его можно разделить на Затем на этом уровне можно использовать матрицы и обычное умножение.
  • Этот метод действительно можно применить к квадратным матрицам любой размерности. [3] Если размер четный, они делятся пополам, как описано. Если размерность нечетная, сначала применяется заполнение нулями одной строки и одного столбца. Такое дополнение можно применять «на лету» и лениво, а лишние строки и столбцы отбрасываются по мере формирования результата. Например, предположим, что матрицы . Их можно разделить так, чтобы верхняя левая часть была и правый нижний угол . Везде, где этого требуют операции, размеры дополняются нулями до первый. Обратите внимание, например, что произведение используется только в нижней строке вывода, поэтому требуется только ряды высокие; и, следовательно, левый фактор использовать для его создания нужно только ряды высокие; соответственно, нет необходимости дополнять эту сумму до ряды; нужно только проложить к столбцы для соответствия .

Более того, нет необходимости, чтобы матрицы были квадратными. Неквадратные матрицы можно разделить пополам, используя те же методы, в результате чего неквадратные матрицы будут меньшего размера. Если матрицы достаточно неквадратны, имеет смысл свести первоначальную операцию к более квадратным произведениям, используя простые методы, которые по сути являются , например:

  • Продукт размером можно сделать как 20 отдельных операции, организованные для формирования результата;
  • Продукт размером можно сделать как 10 отдельных операции, суммированные для формирования результата.

Эти методы усложнят реализацию по сравнению с простым заполнением квадрата степени двойки; однако разумно предположить, что любой, кто приступит к реализации Штрассена, а не к обычному умножению, будет отдавать более высокий приоритет вычислительной эффективности, чем простоте реализации.

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

См. также

[ редактировать ]
  1. ^ Штрассен, Волкер (1969). «Исключение по Гауссу не оптимально». Число. Математика . 13 (4): 354–356. дои : 10.1007/BF02165411 . S2CID   121656251 .
  2. ^ Скиена, Стивен С. (1998), «§8.2.3 Умножение матриц», Руководство по разработке алгоритмов , Берлин, Нью-Йорк: Springer-Verlag , ISBN  978-0-387-94860-7 .
  3. ^ Jump up to: а б Д'Альберто, Паоло; Николау, Александру (2005). Использование рекурсии для повышения производительности ATLAS (PDF) . Шестой международный симпозиум. по высокопроизводительным вычислениям.
  4. ^ Jump up to: а б Хуан, Цзяньюй; Смит, Тайлер М.; Генри, Грег М.; ван де Гейн, Роберт А. (13 ноября 2016 г.). Перезагрузка алгоритма Штрассена . SC16: Международная конференция по высокопроизводительным вычислениям, сетям, хранению и анализу . IEEE Пресс. стр. 690–701. дои : 10.1109/SC.2016.58 . ISBN  9781467388153 . Проверено 1 ноября 2022 г.
  5. ^ Кнут (1997) , с. 500.
  6. ^ Уэбб, Миллер (1975). «Вычислительная сложность и численная устойчивость». СИАМ Дж. Компьютер . 4 (2): 97–107. дои : 10.1137/0204009 .
  7. ^ Бургиссер; Клаузен; Шокроллахи (1997). Алгебраическая теория сложности . Издательство Спрингер. ISBN  3-540-60582-7 .
  8. ^ Фриго, М.; Лейзерсон, CE ; Прокоп, Х. ; Рамачандран, С. (1999). Алгоритмы, не обращающие внимания на кэш (PDF) . Учеб. IEEE симп. по основам информатики (FOCS). стр. 285–297.
  9. ^ Хайэм, Николас Дж. (1990). «Использование быстрого матричного умножения в BLAS уровня 3» (PDF) . Транзакции ACM в математическом программном обеспечении . 16 (4): 352–368. дои : 10.1145/98267.98290 . hdl : 1813/6900 . S2CID   5715053 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 8b1865da318ecc295a80c51a4a0b8ccb__1701862320
URL1:https://arc.ask3.ru/arc/aa/8b/cb/8b1865da318ecc295a80c51a4a0b8ccb.html
Заголовок, (Title) документа по адресу, URL1:
Strassen algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)