Автоматическая оптимизация умножения 0-1 матричного вектора

22

Вопрос:

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

Другими словами, у меня есть матрица M и я хочу выполнить некоторые предварительные вычисления на основе M , которые сделают вычисление Mv максимально эффективным, когда я позже получу вектор v .

M является прямоугольной плотной двоичной матрицей, которая известна во время компиляции, тогда какv является неизвестным вещественным вектором, который известен только во время выполнения.

Пример 1: (раздвижное окно)

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

M=[11111111111111111111].
Предположим, что мы применяем эту матрицу к векторуvчтобы получитьw=Mv. Тогда записи результата,
w1=v1+v2+v3+v4+v5w2=v2+v3+v4+v5+v6w3=v3+v4+v5+v6+v7w4=v4+v5+v6+v7+v8

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

w1=v1+v2+v3+v4+v5w2=w1+v6v1w3=w2+v7v2w4=w3+v8v3

Пример 2: (иерархическая структура)

В предыдущем примере мы могли просто отслеживать итоговую сумму. Однако обычно нужно создать и сохранить дерево промежуточных результатов. Например, рассмотрим Можно эффективно вычислитьw=Mv,используя дерево промежуточных результатов:

M=[111111111111111111111111]
w=Mv
  1. Вычислите и w 7 и сложите их, чтобы получить w 3 .w5w7w3
  2. Вычислите и w 6 и сложите их, чтобы получить w 2 .w4w6w2
  3. Добавьте и w 3, чтобы получить w 1w2w3w1

Структуру в приведенных выше примерах легко увидеть, но для интересующих меня матриц структура не так проста.

Пример 3: (низкий ранг)

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

M=[111111111111111111111111].

Эта матрица может быть разложена как разность двух матриц ранга 1,

M=[111111111111111111111111111111][111111]

поэтому его действие на вектор может быть эффективно вычислено с помощью w 1w:=Mv

w1=v1+v2+v3+v4+v5+v6w2=w1w3=w2v5v6w4=w3w5=w4.

Мотивация:

Я работаю над численным методом для некоторой обработки изображений, и есть несколько больших плотных матриц с различными структурами, которые зафиксированы на все времена. Позже эти матрицы нужно будет применить ко многим неизвестным векторам v i, которые будут зависеть от ввода пользователя. Сейчас я использую карандаш и бумагу, чтобы придумать эффективный код для каждой матрицы, но мне интересно, можно ли автоматизировать этот процесс.01vi

Изменить: (постскриптум)

Все ответы здесь (по состоянию на 05.09.15) интересны, но ни один из них не отвечает на вопрос так же удовлетворительно, как я надеялся. Вероятно, получается, что это сложный исследовательский вопрос, и никто не знает хорошего ответа.

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

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

Теперь предположим, что для всех и всех n × n матриц Mnn0n×nM мы знаем алгоритм , который для всех векторов v вычисляет M v за действительно субквадратичное время, т.е. за время O ( n 2 - ε ) для некоторого ε > 0 .An,MvMvO(n2ε)ε>0

Существуют или нет субквадратичные алгоритмы для всех матриц, ортогонально вопросу о поиске алгоритма для конкретной матрицы, который будет максимально быстрым. Большинство матриц 0-1 выглядят как случайный шум и (если я угадал), вероятно, не имеют субквадратичных алгоритмов. Однако тот факт, что существуют действительно плохие матрицы, не мешает мне найти быстрый алгоритм на хорошей матрице, например, матрице «скользящего окна».

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

Ник Алджер
источник
1
Если ваша матрица имеет такую ​​форму, TDMA - это матрица полос, алгоритм Томаса. Еще не 0-1, но эта функция должна быть использована.
Зло
@ EvilJS матрица как раз попала в конкретный пример. В общем, оно не будет в полосе. Я добавил еще один пример, который не находится в полосе.
Ник Алджер
У вас много постоянных матриц N x M, которые являются двоичными, действительными векторами, и вы хотите предварительно вычислить оптимальный путь выполнения на этапе предварительной обработки для каждого экземпляра? Результатом такой операции является код с жестко закодированными операциями на матрицу, и вы хотите, чтобы метод сделал это? Под экземпляром я подразумеваю под матрицей. Просто проверяю.
Зло
@ EvilJS Этот вопрос касается ситуации, когда существует одна известная двоичная матрица , которая будет применена ко многим неизвестным действительным векторам v i позднее. Основываясь только на M , мы хотим предварительно вычислить код, который будет применять M максимально эффективно, чтобы позже, когда мы получили v i , мы могли вычислить M v i как можно быстрее. В конкретном приложении, которое мотивирует этот вопрос, у меня есть несколько таких бинарных матриц (на самом деле 12), которые фиксированы на все времена, тогда как векторы v i непредсказуемы и зависят от входных данных пользователя программы.MviMMviMvivi
Ник Алджер
1
Над полем из двух элементов задача вычисления минимальной схемы XOR-gate, которая имитирует данное линейное преобразование, является NP-сложной. См. Cstheory.stackexchange.com/a/32272/225
Райан Уильямс

Ответы:

5

Если это возможно, попробуйте использовать полосатую трехдиагональную природу матрицы.
В противном случае, если матрица содержит только постоянное число различных значений (что, безусловно, является двоичным), вам следует попробовать алгоритм Mailman (Эдо Либерти, Стивен У. Цукер, в техническом отчете Йельского университета # 1402): оптимизирован для конечного словаря.
Распространенное устранение общего выражения известно в течение некоторого времени, как множественное умножение констант, но вариант перехода на уровень гейта является опцией - используемые здесь шаблоны могут использоваться отдельно в качестве решения или объединяться с другими методами, статья для этого «Улучшение устранения общего подвыражения» Алгоритм с новым методом вычисления задержки на уровне затвора »Нин Ву, Сяоцян Чжан, Юньфэй Е. и Лидонг Лан, опубликованные в« Трудах Всемирного конгресса по инженерным наукам и информатике 2013, том II WCECS 2013, 23-25 ​​октября 2013 г., Сан-Франциско, США " CSE уровня ворот"

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

прототип нового алгоритма
Что вы сделали с суммой: Дает 10операций, и с моей первоначальной идеей использовать Томаса это эквивалентно. На данный момент я все еще пишу и тестирую новый алгоритм, также время выполнениянеприятно, но первый результат теста дал мне неожиданный ответ:

w1=v1+v2+v3+v4+v5w2=w1+v6v1w3=w2+v7v2w4=w3+v8v3


что дает 9операций, определяя их как + или - равно 1, а = равно 0.

tmp1=v2+v3+v4+v5w1=v1+tmp1w2=tmp1+v6w3=w2+v7v2w4=w3+v8v3

w1=v1+v2+v3+v4+v5+v6w2=w1w3=w2v5v6w4=w3w5=w4.

Это дает 7 операций , мой алгоритм дал результат:
Что дает 6операций. Пока я могу сказать, что использую расстояние Хэмминга, и и | побитовые операции, подсчет использований и создание чего-то вроде Cocke – Younger – Kasami (CYK) - «алгоритм синтаксического анализа для контекстно-свободных грамматик, названный в честь его изобретателей, John Cocke, Daniel Younger и Tadao Kasami. Он использует анализ снизу вверх и динамический анализ программирование «. - из Википедии Это та же техника, которую я использую для создания блоков переменных.

tmp1=v1+v2+v3+v4tmp2=v5+v6w1=tmp1+tmp2w2=w1w3=w2tmp2w4=w3w5=w4.

Зло
источник
(re rev5) Пожалуйста, дайте ссылку на "вечнозеленый метод". Кроме того, что такое SSA? CYK динамический алгоритм?
ВЗН
Я присудил награду за этот ответ и объяснил почему в редактировании моего оригинального вопроса.
Ник Алджер
8

Это связано с открытым вопросом исследования, который известен как «проблема умножения матриц-векторов (OMv) онлайн». Эта проблема гласит следующее (см. [1]): Учитывая двоичную матрицу M и n двоичных векторов столбцов v 1 , , v n , нам нужно вычислить M v i до того, как прибудет v i + 1 .n×nMnv1,,vnMvivi+1

Обратите внимание, что проблема из вопроса несколько более общая: она учитывает матрицы и действительные векторы. Заметьте, что проблема с n × n матрицами и булевыми векторами «проще», поскольку она представляет собой особый случай.m×nn×n

Ясно, что наивный алгоритм для задачи онлайн-булевого умножения матрицы на вектор (в котором просто используется стандартное умножение матрицы на вектор) занимает время . Существует предположение (см., Например, [1]), что это не может быть сделано действительно быстрее, чем O ( n 3 ) . (Более подробно, эта гипотеза выглядит следующим образом: не существует по-настоящему субкубического алгоритма, который решает проблему умножения матрицы на вектор в режиме онлайн, т. Е. Не существует алгоритма со временем O ( n 3 - ε ) для ε > 0 ).O(n3)O(n3)O(n3ε)ε>0

Известно, что алгоритм Уильямса решает эту проблему за время . Смотрите [2] для более подробной информации.O(n3/log2n)

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

[1] Унификация и усиление твердости для динамических задач с помощью онлайн-гипотезы умножения матрицы на вектор. Хензингер, Криннингер, Нанонгкай и Саранурак
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]

[2] Матрично-векторное умножение в субквадратичном времени: (требуется некоторая предварительная обработка). Уильямс
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]

Обновить

Один из вопросов в комментариях был следующим: мы знаем во время компиляции. Разве мы не можем настроить наш алгоритм в соответствии с M , поэтому проблема OMv (гипотеза) не применима? Мы увидим, что это не так, если только гипотеза OMv не удастся.MM

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


n0Nnn0n×nMAn,MvMvO(n2ε)ε>0n0×n0


Mn×nn=2kkn>n0MM1,M2,M3,M42k1×2k12k1n0A2k1,Min0

O(logn)nv1,,vnnO(n3εlogn)

ε~>0ε~<εO(n3ε~)

Mm×nmnnm

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

tranisstor
источник
Как указывает автор и vzn, это не тот случай, вектор не является двоичным, матрица не требуется N x N, и автор хочет выполнить предварительный расчет операций, и нет необходимости в оперативной обработке. На основании гипотезы недостаточно. Обе бумаги не имеют отношения к вопросу. Дело здесь в том, чтобы предварительно вычислить постоянную матрицу, чтобы обеспечить минимальное количество операций. Будут возможны разные подходы для полных, полосатых, симметричных случаев.
Зло
@EvilJS: Если вы разрешите любую матрицу M x N и действительные векторы, тогда проблема станет сложнее, чем та, которую я дал в ответе (то есть, умножение на булеву матрицу-вектор онлайн будет особым случаем). Если бы вы могли решить более общую проблему действительно быстрее, чем O (n ^ 3), то вы бы также усовершенствовали гипотезу (что было бы большой новостью!). Кроме того, автор говорит в комментарии к вопросу, что векторы изначально неизвестны. Если вы знали все векторы заранее, вы могли бы просто использовать быстрое матричное умножение (например, версию алгоритма Штрассена).
транзистор
Я просто указал авторам дела "настоящий вектор". Посмотрите на матрицу Томаса - только частный случай матриц в O (n). Я не имею в виду общий случай. И если Матрица постоянна, а векторы известны, вы жестко закодировали ответ, а не Штрассен; (
Зло
@EvilJS: я не уверен, что полностью понимаю, что вы пытаетесь сказать. Конечно, для специальных типов матриц, таких как матрица Томаса, вы можете значительно ускориться, но в целом это сложнее. Возможно, я должен также указать, что проблема, которую я представил, рассматривает шаг предварительной обработки (до того, как появится какой-либо вектор). Если бы вы могли сказать мне, как систематически «жестко» кодировать свой алгоритм для любой матрицы, которую я вам предоставил, вы также могли бы улучшить гипотезу (поскольку вы могли бы реализовать этот этап жесткого кодирования как этап предварительной обработки алгоритма).
транзистор
согласился, что работает; однако вторая ссылка Уильямса, похоже, вообще не рассматривает двоичные матрицы. К вашему сведению, здесь
vzn
-2

По сути, это КС исследовательского уровня, проблема изучается, по крайней мере, в двух вариантах: в одном умножение разреженных матриц (только что приведенный пример), а также частный случай «двоичных разреженных матриц». 2 - й случай , как известно, связаны с оптимизацией программ прямолинейные. минимальные программы также могут быть похожи на DAG с двумя типами «ворот», сложением и умножением, поэтому с этим может быть связана некоторая литература по минимизации схем, и, возможно, «готовое» программное обеспечение может быть адаптировано для этой цели. здесь есть конкретная ссылка на 2- й случай, а также тот же вопрос о теории с некоторым базовым начальным эмпирическим исследованием.

ВЗН
источник
1
O(n)O(n2)
ссылки указаны, как видно из заголовков, разреженных матриц . может быть, у вас есть какое-то иное определение, чем в газетах? если вы чувствительны к точному определению разреженности (большинство из них приблизительно коррелированы / почти взаимозаменяемы), это должно быть указано в вопросе.
ВЗН
1
Матрицы, которые меня интересуют, являются плотными матрицами. Кстати, хотя я не думаю, что это полностью отвечает моему вопросу, я ценю ответ.
Ник Алджер
хорошо извини перепутал, не понял точный вопрос. вкратце, ваш пример №2 заполнен менее чем на ½ и выглядит «разреженным» для меня и полагает, что некоторые из разреженных теорий будут, по крайней мере, несколько применимы. в основном, чем плотнее матрица, тем меньше можно оптимизировать операцию, поэтому, вероятно, большая часть теории об этом типе оптимизации ориентирована на разреженные матрицы.
vzn
-3

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

ВЗН
источник
2
Я не понимаю, как это связано с вопросом. Эта статья посвящена умножению матриц распределения между распределенными системами для параллельных вычислений, чтобы минимизировать объем межпроцессорной связи. Какое это имеет отношение к этому вопросу? Вопрос, кажется, не упоминает ничего о параллельных вычислениях или межпроцессорных коммуникациях. Я рекомендую вам отредактировать свой ответ, чтобы сделать связь более явной.
DW
afaik - та же проблема, и минимизация параллельных вычислений также сводит к минимуму реализацию на одном процессоре тех же вычислений. по крайней мере, спрашивающий не исключал параллельные реализации.
vzn
1
Спасибо за ссылку. Однако я скептически отношусь к способу решения этой проблемы, поскольку он не использует тот факт, что элементы матрицы содержат только нули и единицы, тогда как это свойство очень важно, насколько я могу судить. Например, алгоритм «промежуточного итога» в первом примере будет работать, только если все ненулевые записи в данном столбце матрицы имеют одинаковое значение.
Ник Алджер
Н.А. Ваше наблюдение / возражение рассматривается в ответе. дальнейшая оптимизация, вероятно, возможна при использовании свойства 0/1; кажется, что этот метод минимизирует общее количество операций сложения / умножения под видом распараллеливания. Операции сложения / умножения также могут рассматриваться как «ворота» в группе обеспечения доступности баз данных, и метод минимизирует ворота. Существенная сложность статьи раскрывает некоторые из более глубоких и существенных сложностей этого процесса оптимизации. поскольку заявленный ответ не предназначен быть окончательным в этой трудной проблеме, просто «лучше, чем ничего».
vzn