Pull to refresh

Comments 15

UFO landed and left these words here

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

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

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

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

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

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

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

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

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

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

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

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

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

Может вычислитель (ALU) имеет свой собственный кеш где хранит результаты для часто встречающихся аргументов?

Sign up to leave a comment.