Как стать автором
Обновить

Невероятно, но факт: умножение матриц на GPU идёт быстрее на «предсказуемых» данных

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров11K
Всего голосов 36: ↑35 и ↓1+55
Комментарии14

Комментарии 14

Так-то уже давно используется тактика хранения предвычисленных значений для наиболее статистически частых выражений. Ещё был баг в первом Пентиуме когда в этой таблице хранилось ошибочное значение. С умножением на 1 и 0 наверно тоже применяются аппаратные оптимизации не тратить время и энергию впустую.

В случае zero_inputs умножались нулевые матрицы? Если так, то это заведомо неверный бенчмарк.

Почему? Алгоритм-то data-agnostic.

А что значит data-agnostic?

Значит, он не заглядывает внутрь тензоров.

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

Всё равно не пойму.

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

А, понял. Но компиляторы и процессоры сейчас это отдельные системы, которые могут творить чудеса)

Это почти то же самое как проверить производительность и корректность алгоритма сжатия на нулевых (или даже просто константных) данных.

Я не специалист в gpu-вычислениях. Но может, причина проще? Может, микроархитектура gpu-процессоров предусматривает проверку переменных на нули, и аппаратное умножение при этом не выполняется, сразу возвращается нуль? Тепловыделение при этом снижается и тактовая частота повышается. При сокращенном времени выполнении отдельных элементов матрицы, время выполнения обсчета всей матрицы обуславливается самым медленным элементом.

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

Может, микроархитектура gpu-процессоров предусматривает проверку переменных на нули, и аппаратное умножение при этом не выполняется, сразу возвращается нуль?

Нет, тогда бы не было эффекта от использования целых чисел (из-за которого и началось расследование).

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

В статье же есть тест, когда матрицы заполнены числами пи и производительность такая же как с нулями или единицами. Так что ваша теория не верна.

При умножение целочисленных значений особенно с не большой амплитудой, умножение может быть ускоренно в несколько раз. Например можно в железе выполнять 2 умножения int8*int16 на железе предназначеном для int16*int16.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий