2017-07-28 8 views
23

Mit zwei int-Matrizen A und B, mit mehr als 1000 Zeilen und 10K Spalten, muss ich sie oft in Float-Matrizen konvertieren, um eine Beschleunigung (4x oder mehr) zu erhalten.Warum ist es schneller, float by float matrix multiplication im Vergleich zu int by int auszuführen?

Ich frage mich, warum ist das der Fall? Ich stelle fest, dass es viele Optimierungen und Vektorisierungen wie AVX usw. gibt, die mit der Multiplikation der Gleitkomma-Matrix fortfahren. Aber es gibt Anweisungen wie AVX2, für ganze Zahlen (wenn ich mich nicht irre). Und kann man SSE und AVX nicht für Ganzzahlen verwenden?

Warum gibt es keine Heuristik unter Matrixalgebra-Bibliotheken wie Numpy oder Eigen, um dies zu erfassen und ganzzahlige Matrixmultiplikation schneller auszuführen, genau wie float?

über akzeptierte Antwort: Während @ sascha Antwort sehr informativ und relevant ist, die Antwort von @ chatz ist der eigentliche Grund, warum der int durch int Multiplikation langsam ist unabhängig davon, ob BLAS ganzzahlige Matrix-Operationen existieren.

+5

Es würde helfen, die Frage spezifischer zu machen, aber da mehr Leute es für float benötigen, wurde mehr Mühe gemacht, es für float (in Software und Hardware) zu optimieren. –

+0

Diese Frage benötigt einen speziellen Beispielcode, um den Leistungsunterschied zu demonstrieren (siehe [mcve]). Insbesondere wenn der Code mit [C++] und [numpy] getaggt ist, ist völlig unklar, worauf Sie sich beziehen. – Zulan

Antwort

9

Wenn Sie diese beiden einfachen Funktionen zusammenstellen, die im Wesentlichen nur ein Produkt berechnen (die Eigen-Bibliothek)

#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); 
} 

die Flaggen mit -mavx2 -S -O3 Sie sehr ähnlich Assembler-Code sehen werden, für die Ganzzahl und dem Schwimmer-Version. Der Hauptunterschied ist jedoch, dass vpmulld hat 2-3 mal die Latenz und nur 1/2 oder 1/4 der Durchsatz von vmulps. (Auf aktuellen Intel-Architekturen)

Bezug: Intel Intrinsics Guide, "Durchsatz" bedeutet den reziproken Durchsatz, d. H. Wie viele Taktzyklen pro Operation verwendet werden, wenn keine Latenz auftritt (etwas vereinfacht).

+0

Sehr interessant! Ich dachte nie, 'vpmulld' und' vmulps' könnten sich hinsichtlich Durchsatz und Latenz unterscheiden. – NULL

+0

Unerwartet, aber nicht überraschend. Fließkomma-Matrixoperationen werden in der Computergrafik stark verwendet, was ein großes Interesse an einer Hardware-Optimierung hervorruft. Die Anwendungen reichen vom Offensichtlichen (Videospiele und Web-Apps) über forschungsorientierte Simulations-Engines bis hin zur mathematischen Modellierung. Auch wenn Sie denken, dass diese schnell sind, können Sie sogar noch mehr Gleitkomma-Operationen erhalten und diese Operationen auf einer Grafikkarte programmieren (ein gutes Beispiel ist die CUDA-Plattform von nVidia). Videokarten sind speziell für massiv parallele Gleitkommaoperationen ausgelegt. – user1258361

13

Alle diese Vektorvektor- und Matrixvektoroperationen verwenden intern BLAS. BLAS, über Jahrzehnte für verschiedene Archs, CPUs, Instruktionen und Cache-Größen optimiert, hat keinen Integer-Typ!

Here is some branch of OpenBLAS arbeitet daran (und einige tiny discussion at google-groups linking it).

Und ich denke, ich hörte Intels MKL (Intels BLAS-Implementierung) might be working on integer-types too. This talk sieht interessant aus (erwähnt in diesem Forum), obwohl es kurz ist und wahrscheinlich näher kleine integrale Typen nützlich in Embedded Deep-Learning).

+1

Sieht aus wie [Blaze] (https://bitbucket.org/blaze-lib/blaze) Ganzzahlen unterstützt – NathanOliver

+1

Eigen arbeitet mit Ganzzahlen, und wenn Sie es mit 'g ++ -O3 -march = somethingrecent 'kompilieren, wird es vektorisiert und Sie sehen Anweisungen wie 'vpmulld'. –

+0

Unterstützung und Vektorisierung von Ganzzahl-Ops ist möglich (und ich würde es in qualitativ hochwertigen Bibliotheken erwarten), sicher, aber die Frage ist: Kann es mit handgetuned BLAS-Code konkurrieren? – sascha