在使用BLAS DGEMM矩阵乘法函数时,我注意到对于未初始化的结果矩阵C,我在结果中得到NaNs,就像我这样称呼它:
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库。
答案 0 :(得分:4)
如果您将alpha
和beta
作为双精度数值常量(例如1.d0
)传递,那么它会有效,但是您传递的是单精度常量,Fortran 77无法知道dgemm的参数列表并将实数提升到双精度。 (如果使用MKL的Fortran 95接口,它可能适用于单精度常量,但我不确定)。
因为你只传递指针4字节参数而库子程序正在查找8字节值,所以计算的其余部分搞砸了。