2012-10-13 30 views
1

在使用BLAS DGEMM矩陣乘法功能,我注意到,對於未初始化的結果矩陣C,我得到的NaN在resultwhen我叫它像這樣:DGEMM和數值常量作爲參數傳遞

DGEMM('N', 'N', M, N, K, 1.0, A, LDA, B, LDB, 0.0, C, LDC) 

但是,如果我事先聲明ALPHA和BETA:

REAL*8 ALPHA, BETA 
PARAMETER (ALPHA=1.0) 
PARAMETER (BETA=0.0) 

DGEMM('N', 'N', M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC) 

然後乘法工作正常。有沒有人有任何想法爲什麼宣佈參數的作品?

請注意,我正在使用英特爾Fortran編譯器以及它的MKL庫。

回答

4

,如果你通過alphabeta雙精度數字常量(例如,1.d0),它的工作,但你傳遞單精度常量和Fortran 77無從得知DGEMM的參數列表和促進的方式實際上雙精度。 (如果您使用MKL的Fortran 95界面,它可能與單精度常量一起工作,但我不確定)。

由於您只傳遞指針4字節參數,並且庫子例程查找8字節值,所以計算的其餘部分會混亂。

+0

哦,我明白了。我傳錯了類型。是的,奇怪的是我沒有得到任何運行時錯誤。謝謝! – Salmonstrikes

+3

如果您想獲得編譯時錯誤,請使用顯式接口。使用MKL或Lapack90模塊(更好)或手動定義接口塊(更糟糕)。 –

+0

由於Fortran參數是通過地址傳遞的,所以不會有錯誤類型的參數會混淆它後面的所有參數。如果單精度參數恰好位於內存頁的最後4個字節之前,那麼運行時錯誤只會發生在未分配的內存區之前 - 這是相當罕見的事件。 –