Comments 15
В случае zero_inputs умножались нулевые матрицы? Если так, то это заведомо неверный бенчмарк.
Почему? Алгоритм-то data-agnostic.
А что значит data-agnostic?
Значит, он не заглядывает внутрь тензоров.
Но вообще да, автору бы следовало доказать, что он исключил все другие возможные причины. Типа где-то вкралась техническая поэлементная операция, реализованная через таблицу предпросмотра, - и появляется кеш с ключами по данным, одинаковые данные - нет промахов.
Это почти то же самое как проверить производительность и корректность алгоритма сжатия на нулевых (или даже просто константных) данных.
Я не специалист в gpu-вычислениях. Но может, причина проще? Может, микроархитектура gpu-процессоров предусматривает проверку переменных на нули, и аппаратное умножение при этом не выполняется, сразу возвращается нуль? Тепловыделение при этом снижается и тактовая частота повышается. При сокращенном времени выполнении отдельных элементов матрицы, время выполнения обсчета всей матрицы обуславливается самым медленным элементом.
Я специально не тестировал, но заметил что у меня вычисления с целыми числами в вещественном формате проходят вроде как быстрее, чем если у них есть какой-то хвост после запятой. Всегда казалось это естественным.
Может, микроархитектура gpu-процессоров предусматривает проверку переменных на нули, и аппаратное умножение при этом не выполняется, сразу возвращается нуль?
Нет, тогда бы не было эффекта от использования целых чисел (из-за которого и началось расследование).
Нули в младших битах (целых чисел) приводят к тому, что фактически происходит умножение не 52-битных чисел (для double), а скажем всего лишь 20-битных. Т.е. больше половины разрядов просто не используется и всегда содержит нули. А динамическая часть потребляемой мощности тратится именно на переключение транзисторов из нуля в 1.
В статье же есть тест, когда матрицы заполнены числами пи и производительность такая же как с нулями или единицами. Так что ваша теория не верна.
При умножение целочисленных значений особенно с не большой амплитудой, умножение может быть ускоренно в несколько раз. Например можно в железе выполнять 2 умножения int8*int16 на железе предназначеном для int16*int16.
Может вычислитель (ALU) имеет свой собственный кеш где хранит результаты для часто встречающихся аргументов?
Невероятно, но факт: умножение матриц на GPU идёт быстрее на «предсказуемых» данных