2017-07-28 36 views
23

2つのint行列AとBを持ち、1000行と10K列を超えるので、高速化(4倍以上)を得るためにfloat行列に変換する必要があることがよくあります。浮動小数点数の乗算で浮動小数点を浮動小数点数に比べて高速に行うのはなぜですか?

私はなぜこれが当てはまるのだろうか?私は浮動行列の乗算を続けるAVXなど、多くの最適化とベクトル化があることを認識しています。しかし、整数のためのAVX2のような命令があります(私が間違っていない場合)。そして、整数のためにSSEとAVXを使用することはできませんか?

NumpyやEigenなどの行列代数ライブラリの下にヒューリスティックが存在しないため、これをキャプチャしてfloatのように高速に整数行列の乗算を行うのはなぜですか?受け入れ答えについて

@のサシャの答えは非常に有益と関連しているが、@のchatzの答えは、int型の乗算によってintは関係なく、BLAS、整数行列演算が存在するかどうかの遅い理由は実際の理由です。

+5

問題をより具体的にするのに役立ちますが、フロートのためにそれを必要とする人が増えているため、ソフトウェアとハ​​ードウェアの両方でフロート用に最適化する努力が増えました。 –

+0

この質問には、パフォーマンスの違いを示すための具体的なコード例が必要です([mcve]を参照)。特に、コードに[C++]タグと[numpy]タグが付いているので、あなたが何を参照しているかは完全には不明です。 – Zulan

答えて

9

あなたは、整数と浮動小数点バージョンのために、非常によく似たアセンブラコードが表示されます-mavx2 -S -O3のフラグを使用して、これらの2つの単純な基本的にちょうど(固有のライブラリを使用して)製品を計算する機能

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

をコンパイルする場合。 しかし、主な違いは、vpmulldのスループットは2〜3倍で、スループットの1/2または1/4はvmulpsです。 (最近のインテル・アーキテクチャで)

参照:Intel Intrinsics Guide「スループット」は、レイテンシが発生しない(ある程度簡略化されている)場合、1回の操作で使用されるクロック・サイクルの数を示します。

+0

非常に興味深い! 'vpmulld'と' vmulps'は、スループットとレイテンシの点で違っているとは決して考えませんでした。 – NULL

+0

予期しない驚きはありません。浮動小数点行列演算はコンピュータグラフィックスで頻繁に使用され、ハードウェアの最適化に大きな関心が寄せられています。アプリケーションには、明らかな(ビデオゲームやWebアプリ)から、研究指向のシミュレーションエンジンや数学的なモデリングまでが含まれます。また、それらが高速だと思えば、ビデオカード上でこれらのタイプの演算をプログラミングする浮動小数点演算スループットをさらに増やすことができます(良い例はnVidiaのCUDAプラットフォームです)。ビデオカードは、大規模並列浮動小数点演算用に専用に設計されています。 – user1258361

13

これらのベクトルベクトル演算と行列ベクトル演算はすべて、内部でBLASを使用しています。さまざまなアーチ、CPU、命令、キャッシュサイズで数十年に渡って最適化されたBLASは整数型を持たない!

Here is some branch of OpenBLAS(一部はtiny discussion at google-groups linking it)です。

私はIntelのMKL(IntelのBLASの実装)を聞いたと思いますmight be working on integer-types tooThis talkは興味深いです(そのフォーラムで言及されています)。短く、おそらくもっと近づいています小さな整数型埋め込みディープラーニングで便利です)。

+1

[Blaze](https://bitbucket.org/blaze-lib/blaze)は整数をサポートしています – NathanOliver

+1

Eigenは整数で動作し、 'g ++ -O3 -march = somethingrecent'でコンパイルするとベクトル化されて表示されます'vpmulld'のような命令です。 –

+0

integer-opsをサポートしてベクトル化することは可能です(高品質のlibで期待しています)。しかし、疑問は:手で調整されたBLASコードと競合できますか? – sascha

関連する問題