Почему быстрее выполнять float с помощью умножения на флоат-матрицу по сравнению с int по int?
Имея две матрицы int A и B с более чем 1000 строк и 10K столбцов, мне часто приходится преобразовывать их в матрицы с плавающей точкой, чтобы получить ускорение (4x или более).
Мне интересно, почему это так? Я понимаю, что существует много оптимизаций и векторизации, таких как AVX и т.д., С умножением на флоат-матрицу. Но все же есть инструкции, такие как AVX2, для целых чисел (если я не ошибаюсь). И нельзя ли использовать SSE и AVX для целых чисел?
Почему нет эвристики под библиотеками матричных алгебр, таких как Numpy или Eigen, чтобы захватить это и выполнить умножение целочисленной матрицы быстрее, как float?
О принятом ответе: Хотя ответ @sascha очень информативен и уместен, ответ @chatz является фактической причиной того, что int путем умножения int медленнее, независимо от того, существуют ли операции целочисленной матрицы BLAS.
Ответы
Ответ 1
Если вы скомпилируете эти две простые функции, которые по сути просто вычисляют произведение (используя библиотеку Eigen)
#include <Eigen/Core>
int mult_int(const Eigen::MatrixXi& A, Eigen::MatrixXi& B)
{
Eigen::MatrixXi C= A*B;
return C(0,0);
}
int mult_float(const Eigen::MatrixXf& A, Eigen::MatrixXf& B)
{
Eigen::MatrixXf C= A*B;
return C(0,0);
}
используя флаги -mavx2 -S -O3
, вы увидите очень похожий код ассемблера для целочисленной и плавающей версий.
Главное отличие состоит в том, что vpmulld
имеет в 2-3 раза латентность и только 1/2 или 1/4 пропускную способность vmulps
. (На последних архитектурах Intel)
Ссылка: Руководство Intel Intrinsics Guide, "Пропускная способность" означает обратную пропускную способность, то есть, сколько тактовых циклов используется для каждой операции, если нет задержка (несколько упрощена).
Ответ 2
Все эти векторные и матрично-векторные операции используют BLAS внутри. BLAS, оптимизированный в течение десятилетий для разных арков, процессоров, команд и размеров кеша, не имеет целочисленного типа!
Вот какая-то ветвь OpenBLAS, работающая над ней (и некоторые крошечные обсуждение в группах google, связывающих его).
И я думаю, что я слышал, что Intel MKL (реализация Intel BLAS) может работать и с целыми типами. Этот разговор выглядит интересным (упоминается в этом форуме), хотя он короткий и, вероятно, более приближается к малым интегральным типам, полезным во встроенном глубоком обучении).