簡體   English   中英

MATLAB Mex函數並不比常規函數快

[英]MATLAB Mex function isn't faster than regular function

我知道情況並非總是如此,但不是MEX函數不應該提高代碼效率,尤其是在計算方面嗎?

我已經使用編碼器工具包對MATLAB中的expm函數進行了MEX。 我期望效率會大大提高,因為該函數執行了大量矩陣計算。

但是,我看不到時間的改善,如下圖所示:

在此處輸入圖片說明

X軸: expm函數的另一次迭代

Y軸:該功能的運行時間

藍線:常規expm函數調用

紅線: MEX的expm函數調用

MEX版本與常規版本如此相似是有原因的嗎? 有沒有辦法提高速度? 我使用tictoc收集了有關運行時間的數據。

大多數matlab函數都是簡單的包裝程序,它們調用FORTRAN庫代碼,其中大多數來自LAPACK / EISPACK / LINPACK。 換句話說,內置的matlab函數調用已在調用已編譯的代碼,而不是已解釋的matlab代碼(.m源代碼)。 因此,MEX在提高那些函數調用的性能上無能為力。

僅當您在Matlab源代碼中直接進行大量工作時,在matlab中編譯代碼才有好處。 如果您的代碼主要是調用一堆內置的matlab函數,尤其是矩陣函數(都是LAPACK函數),那么您不會看到太多改進,只有當您擁有“手動”代碼時,即完全用matlab代碼(在.m文件中)實現“ expm”之類的東西,那么用MEX編譯時它將更快。 如果您自己擁有大量的matlab代碼,那么您只會看到編譯matlab代碼的好處,而僅是對內置函數進行了幾次調用,則不會看到。

試想一下,為什么Mathworks會隨帶Matlab的內置函數實現為解釋的Matlab代碼? 即使他們使用matlab代碼實現了一些內置函數(這只是很小的一部分,因為大多數情況是FORTRAN / C / C ++),他們也會在發貨之前編譯這些函數,以便您作為用戶獲得其中最好的表現。

這是對expm(A)的調用分解的方式,其中A = rand(500,500);

在此處輸入圖片說明

時間在矩陣乘法( F = F*F; )和對PadeApproximantOfDegree的調用之間平均分配。 使用 mkl.dll中非常快的LAPACK函數 (使用Intel MKL的MATLAB的線性代數函數)來建立矩陣乘法

這是所有時間都花在PadeApproximantOfDegree

在此處輸入圖片說明

那不是一個循環 內置矩陣數學函數的所有調用。 如果有迭代,那么我希望MATLAB會慢一些,但是只有幾行, 每次調用都占用了所有時間。 僅父級中的矩陣乘法( F*F )被調用多次。

實際上,如果Coder不能使用MATLAB可以訪問的優化的多線程庫,那么MEX的版本變慢不會令我感到驚訝。 顯然,編碼器進行管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM