日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

發(fā)布時(shí)間:2025/5/22 c/c++ 105 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

比較OpenBLAS,Intel MKL和Eigen的矩陣相乘性能


? ??? ? 對(duì)于機(jī)器學(xué)習(xí)的很多問題來說,計(jì)算的瓶頸往往在于大規(guī)模以及頻繁的矩陣運(yùn)算,主要在于以下兩方面:

  • (Dense/Sparse) Matrix – Vector product
  • (Dense/Sparse) Matrix – Dense Matrix product

? ??? ??如何使機(jī)器學(xué)習(xí)算法運(yùn)行更高效擺在我們面前,很多人都會(huì)在代碼中直接采用一個(gè)比較成熟的矩陣運(yùn)算數(shù)學(xué)庫,面對(duì)繁多的數(shù)學(xué)庫,選擇一個(gè)合適的庫往往會(huì)令人頭疼,這既跟你的運(yùn)算環(huán)境有關(guān),也跟你的運(yùn)算需求有關(guān),不是每個(gè)庫都能完勝的。

? ??? ??這篇文章的主要目的就是比較幾個(gè)常見的BLAS庫的矩陣運(yùn)算性能,分別是

  • EIGEN: 是一個(gè)線性算術(shù)的C++模板庫。功能強(qiáng)大、快速、優(yōu)雅以及支持多平臺(tái),可以使用該庫來方便處理一些矩陣的操作,達(dá)到類似matlab那樣的快捷。 需要定義?EIGEN_NO_DEBUG 阻止運(yùn)行時(shí)assertion。編譯單線程版本需要開啟 -DEIGEN_DONT_PARALLELIZE. 在試驗(yàn)中,我們采用 EIGEN 原生 BLAS 實(shí)現(xiàn)。
  • Intel MKL: 英特爾數(shù)學(xué)核心函數(shù)庫是一套經(jīng)過高度優(yōu)化和廣泛線程化的數(shù)學(xué)例程,專為需要極致性能的科學(xué)、工程及金融等領(lǐng)域的應(yīng)用而設(shè)計(jì)。它可以為當(dāng)前及下一代英特爾處理器提供性能優(yōu)化,包括更出色地與 Microsoft Visual Studio、Eclipse和XCode相集成。英特爾 MKL 支持完全集成英特爾兼容性 OpenMP 運(yùn)行時(shí)庫,以實(shí)現(xiàn)更出色的 Windows/Linux 跨平臺(tái)兼容性。在試驗(yàn)中的多線程版本需要鏈接到 mkl_gnu_thread,而不是 mkl_intel_thread,單線程版本需要鏈接到 mkl_sequential_thread。
  • OpenBLAS: 是一個(gè)高性能多核 BLAS 庫,是 GotoBLAS2 1.13 BSD 版本的衍生版。OpenBLAS 的編譯依賴系統(tǒng)環(huán)境,并且沒有原生單線程版本,在實(shí)驗(yàn)這哦那個(gè),通過設(shè)置?OMP_NUM_THREADS=1 來模擬單線程版本,可能會(huì)帶來一點(diǎn)點(diǎn)的性能下降。
  • ? ??? ??每個(gè)測(cè)試程序的編譯都采用?“-O4 -msse2 -msse3 -msse4” 優(yōu)化, 通過設(shè)置 OMP_NUM_THREADS 來控制使用的線程數(shù)量. 除了 OpenBLAS,其他兩個(gè)庫的測(cè)試程序都分別有單線程和多線程的編譯版本。

    ? ? ? ? 如果MKL編譯出現(xiàn)問題,建議參考Intel Math Kernel Library Link Line Advisor

    • 單線程版本

    ? ??? ??我在實(shí)驗(yàn)中進(jìn)行了一系列的非稀疏矩陣相乘運(yùn)算,矩陣規(guī)模也逐漸增大,單線程的運(yùn)行時(shí)間如下表所示,其中采用的測(cè)試輪數(shù)為5輪,其中紅色表示性能最好的一組實(shí)驗(yàn)結(jié)果。

    Matrix-Dimension Eigen MKL OpenBLAS
    500 0.04159 0.03122 0.03058
    1000 0.31789 0.24339 0.23730
    1500 1.04589 0.81445 0.79869
    2000 2.37567 1.92036 1.87102
    2500 4.68266 3.78569 3.64548
    3000 8.28073 6.42630 6.29797
    3500 13.07470 10.25096 9.98417
    4000 19.34550 15.21931 14.87500
    4500 27.52767 21.45024 21.18227
    5000 37.67552 ?29.31631 29.07229

    ?

    ? ??? ??從圖中可以看出,OpenBLAS的性能最好,MKL的表現(xiàn)也很不錯(cuò),而EIGEN的表現(xiàn)卻很糟糕。

    • 多線程版本

    ? ??? ??在多線程的測(cè)試中,我們采用多個(gè)CPU核心來做矩陣乘法運(yùn)算,所有的結(jié)果也同樣采用5輪訓(xùn)練,我們采用的CPU核數(shù)分別是8,16,32,48。

    • Cores = 8
    Matrix-Dimension Eigen MKL OpenBLAS
    1000 0.05658 0.03955 0.06468
    2000 0.34981 0.26200 0.23879
    3000 1.20781 0.85449 0.80737
    4000 2.65490 1.90273 1.88366
    5000 5.03304 3.73005 3.67966
    6000 8.78654 6.52766 6.31980
    7000 13.55611 10.13758 10.07120
    8000 19.81634 15.03530 14.89440
    9000 29.11329 21.54359 21.26992
    10000 39.01563 29.93075 29.22034

    • Cores = 16
    Matrix-Dimension Eigen MKL OpenBLAS
    1000 0.05708 0.02185 0.03897
    2000 0.26694 0.13807 0.30461
    3000 0.70686 0.43692 0.93511
    4000 1.45129 0.97720 2.06761
    5000 2.59477 1.90665 2.49280
    6000 5.43438 3.30945 7.01299
    7000 8.01124 5.17896 6.84496
    8000 11.22280 7.81439 12.99240
    9000 15.15625 11.08906 21.82488
    10000 19.91151 15.22039 30.86908

    • Cores = 32
    Matrix-Dimension Eigen MKL OpenBLAS
    1000 0.04003 0.02792 0.02244
    2000 0.51213 0.14363 0.16990
    3000 1.13647 0.51105 0.54635
    4000 1.58793 1.10219 1.26401
    5000 2.88341 2.07923 2.48735
    6000 5.92779 3.42785 4.26794
    7000 7.91650 5.32176 6.69391
    8000 11.96467 7.65395 9.98951
    9000 17.45420 10.28328 14.14108
    10000 23.31314 15.10077 19.34171

    • Cores = 40
    Matrix-Dimension Eigen MKL OpenBLAS
    1000 0.03691 0.02877 0.01779
    2000 0.37739 0.14037 0.13655
    3000 0.61183 0.41057 0.44113
    4000 2.43670 1.02625 1.01414
    5000 3.18099 1.91092 1.97898
    6000 8.24002 2.96157 3.40685
    7000 11.59889 4.68312 5.38634
    8000 9.50613 6.98434 7.95971
    9000 14.83066 9.60891 11.37585
    10000 23.67187 15.52151 15.52680

    • Cores = 48
    Matrix-Dimension Eigen MKL OpenBLAS
    1000 0.03635 0.02398 0.01548
    2000 0.36417 0.13408 0.11496
    3000 2.32388 0.39291 0.36669
    4000 2.32030 1.13244 0.85790
    5000 2.08269 1.75812 1.66785
    6000 8.70766 2.98694 2.85609
    7000 8.23543 4.62340 4.53257
    8000 21.18603 6.68886 6.72820
    9000 19.86504 9.59635 9.50597
    10000 16.10920 13.13038 13.04432

    可以看出,MKL和OpenBLAS都提供了比較好的性能,MKL性能還更好一點(diǎn),在各別多線程條件下了,可能某些原因或者我機(jī)器設(shè)置的問題,出現(xiàn)了各別性能異常,比如小矩陣運(yùn)算時(shí)間反倒比大矩陣運(yùn)算長(zhǎng),或者更多的線程卻不能提供更好的性能。這些情況后面可能還需要查一查。

    • 伸縮性

    ? ??? ??另外,我也測(cè)試了使用不同的cpu核數(shù)對(duì)性能的影響,下面兩個(gè)圖描述了把cpu從1增加到20的條件下,5000×5000的矩陣相乘的時(shí)間開銷和加速比。

    • 結(jié)論

    ? ??? ??就我的測(cè)試環(huán)境而言,Intel MKL 和 OpenBLAS 似乎是矩陣相乘運(yùn)算方面性能最佳的 BLAS 庫,在多核以及不同規(guī)模的矩陣方面都具有較好的伸展性和穩(wěn)定性,而對(duì)于單線程情況,OpenBLAS相比 MKL 在性能上有一定提升。

    ? ??? ??本文參考gcdart的文章,代碼可以下載。

    轉(zhuǎn)載于:https://www.cnblogs.com/huty/p/8517892.html

    總結(jié)

    以上是生活随笔為你收集整理的【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。