Подтвердить что ты не робот

Почему быстрее выполнять float с помощью умножения на флоат-матрицу по сравнению с int по int?

Имея две матрицы int A и B с более чем 1000 строк и 10K столбцов, мне часто приходится преобразовывать их в матрицы с плавающей точкой, чтобы получить ускорение (4x или более).

Мне интересно, почему это так? Я понимаю, что существует много оптимизаций и векторизации, таких как AVX и т.д., С умножением на флоат-матрицу. Но все же есть инструкции, такие как AVX2, для целых чисел (если я не ошибаюсь). И нельзя ли использовать SSE и AVX для целых чисел?

Почему нет эвристики под библиотеками матричных алгебр, таких как Numpy или Eigen, чтобы захватить это и выполнить умножение целочисленной матрицы быстрее, как float?

О принятом ответе: Хотя ответ @sascha очень информативен и уместен, ответ @chatz является фактической причиной того, что int путем умножения int медленнее, независимо от того, существуют ли операции целочисленной матрицы BLAS.

4b9b3361

Ответ 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) может работать и с целыми типами. Этот разговор выглядит интересным (упоминается в этом форуме), хотя он короткий и, вероятно, более приближается к малым интегральным типам, полезным во встроенном глубоком обучении).