vectores una suma programacion multiplicacion matriz matrices funciones filas con columnas codigo clase c++ numpy matrix eigen

c++ - una - ¿Por qué es más rápido realizar flotación mediante la multiplicación de la matriz flotante en comparación con int por int?



suma de matrices en c++ con funciones (2)

Si compila estas dos funciones simples que básicamente solo calculan un producto (usando la biblioteca 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); }

usando las banderas -mavx2 -S -O3 verá un código ensamblador muy similar, para el número entero y la versión flotante. Sin embargo, la diferencia principal es que vpmulld tiene 2-3 veces la latencia y solo 1/2 o 1/4 del rendimiento de vmulps . (En arquitecturas recientes de Intel)

Referencia: Intel Intrinsics Guide , "Throughput" significa el rendimiento recíproco, es decir, cuántos ciclos de reloj se usan por operación, si no ocurre latencia (algo simplificado).

Al tener dos matrices int A y B, con más de 1000 filas y 10K columnas, a menudo necesito convertirlas a matrices flotantes para obtener una aceleración (4x o más).

Me pregunto por qué es este el caso? Me doy cuenta de que hay una gran cantidad de optimizaciones y vectorizaciones, como AVX, etc., que continúan con la multiplicación de la matriz de flotación. Pero, sin embargo, hay instrucciones como AVX2, para enteros (si no me equivoco). Y, ¿no se puede usar SSE y AVX para enteros?

¿Por qué no hay una heurística debajo de las bibliotecas de álgebra matricial como Numpy o Eigen para capturar esto y realizar una multiplicación de matriz entera más rápido como flotar?

Acerca de la respuesta aceptada: Si bien la respuesta de @sascha es muy informativa y relevante, la respuesta de @ chatz es la razón real por la cual la multiplicación int por int. Es lenta, independientemente de si existen operaciones de matriz entera BLAS.


Todas esas operaciones vector-vector y matriz-vector están usando BLAS internamente. ¡BLAS, optimizado durante décadas para diferentes archios, CPU, instrucciones y tamaños de caché, no tiene ningún tipo de entero!

Aquí hay una rama de OpenBLAS trabajando en ella (y una pequeña discusión en google-groups que la vincula ).

Y creo que escuché que el MKL de Intel (implementación de BLAS de Intel) también podría estar funcionando en tipos enteros . Esta charla parece interesante (mencionada en ese foro), aunque es corta y probablemente se está acercando a los pequeños tipos integrales útiles en Deep-Learning integrado.