[英]MATLAB Mex function isn't faster than regular function
我知道情況並非總是如此,但不是MEX函數不應該提高代碼效率,尤其是在計算方面嗎?
我已經使用編碼器工具包對MATLAB中的expm
函數進行了MEX。 我期望效率會大大提高,因為該函數執行了大量矩陣計算。
但是,我看不到時間的改善,如下圖所示:
X軸: expm
函數的另一次迭代
Y軸:該功能的運行時間
藍線:常規expm
函數調用
紅線: MEX的expm
函數調用
MEX版本與常規版本如此相似是有原因的嗎? 有沒有辦法提高速度? 我使用tic
和toc
收集了有關運行時間的數據。
大多數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.