行列の乗算の最適化

    この記事はで再現された行列乗算の最適化 2つのアイデアの間でそのテキスト要約行列の乗算を最適化するためには、地域のキャッシュヒット率や手続きの原則を使用することです。テキストが続きます。コードセクションの正しさは、個人確認されていません。

    行列の掛け算の定義は非常に簡単で、数学的な定義によれば、以下のプログラムを書くことができます。

    コンピュータサイエンスの観点から、上記のコードはナイーブです。主に:B [K] [j]は、メモリ内のデータを読み取るために、不連続です。サイクルの底部に、連続的増加とK 1と、B [K] [j]は、常にメモリにジャンプ。これは、サイクルプログラムは、継続的に減少し、効率を引き起こし、キャッシュメモリに転送し、キャッシュヒット率が低い原因になります。

 

    8.5sを必要なときに私のデスクトップで、2千オーダーの行列乗算は、(コンパイラとG ++ -O3です)。

    コンピュータシステムの特性をフルに活用が大幅にカーネギーメロン大学の学校の授業神の町で、プログラムのパフォーマンスを向上させることができ作るだけでオーダーサイクルを変更する方法を与え、「コンピュータシステムの深い理解」、大幅に向上させることができますプロパティ、次のように:

    まず、最も内側のループは、jを1としてインクリメントされ、C [I]は[J]とB [K] [j]は、空間的局所性の原理に沿って、1だけたびにインクリメントされる、すなわち、メモリそれぞれ実質的なジャンプを次々に読み取られます。第二に、A [i]が[k]は、中間層のスキップサイクルであるが、それほど下にある中間層が実行され、我々はAを有する[I] [k]はローカル変数rに割り当てられている、アセンブリコードは、コンパイラによって生成されますこのプロセスは、CPUのレジスタに格納されるローカル変数rで、底部のレジスタは、サイクルプログラム時間はほとんど無視できる読み取ります。

    使用1.57sは、驚くべきではないことをである私のデスクトップ、同じ2つの行列の乗算ステップ1000で、コードの行数がほとんど同じで、単にオーダーサイクルを変更、パフォーマンスのような大きな違いがあります。

 

    さらにパフォーマンスを向上させるために、マトリックスは、ブロック、各計算の一部であってもよいです。この計算は、CPUがムーブキャッシュメモリのより定期的な一部とすることができた場合、キャッシュヒット率を向上させることができます。ここで私が追加した後、コードブロックは次のとおりです。

    在我的台式机上,同样的两个1000阶矩阵相乘,只需要用时0.73s,相比于最开始的幼稚程序,性能已经提高1个数量级了,但代码行数并没有增加太多。可以得出结论:对于计算机体系结构有所了解的程序员写的程序,与菜鸟程序员相比,性能可能有相当大的差距,虽然工作量可能差不多。

   对于矩阵计算,有成熟的库可以使用,完全没必要从头自己写代码。对于高性能的 BLAS实现(线性代数基础计算)来说,其用到的技术远远比本文复杂,需要在分块计算中减少时间复杂度(Strassen算法),需要自动或手动编写大量的汇编程序。在我的台式机上,OpenBLAS执行两个1000阶矩阵相乘,可能只需要用时0.1s。

    但不管怎么说,为了写高性能程序,学习计算机系统的知识绝对有益。

发布了94 篇原创文章 · 获赞 31 · 访问量 9万+

おすすめ

転載: blog.csdn.net/gaoxueyi551/article/details/104595957