I have a Fortran subroutine which uses BLAS’ subroutines dgemm, dgemv and ddot, which calculate matrix * matrix, matrix * vector and vector * vector. I have m * m matrices and m * 1 vectors. In some cases m=1. It seems that those subroutines doesn’t work well in those cases. They doesn’t give errors, but there seems to be some numerical unstability in results. So I have to write something like:
if(m>1) then
vtuni(i,t) = yt(i,t) - ct(i,t) - ddot(m, zt(i,1:m,(t-1)*tvar(3)+1), 1, arec, 1)
else
vtuni(i,t) = yt(i,t) - ct(i,t) - zt(i,1,(t-1)*tvar(3)+1)*arec(1)
So my actual question is, am I right that those BLAS’ subroutines doesn’t work properly when m=1 or is there just something wrong in my code? Can the compiler affect this? I’m using gfortran.
BLAS routines are supposed to behave correctly with objects of size 1. I don’t think it can depend on compiler, but it could possible depend on the implementation of BLAS you’re relying on (though I’d consider it a bug of the implementation). The reference (read: not target-optimised) implementation of BLAS, which can be found on Netlib, handles that case fine.
I’ve done some testing on both arrays of size 1, and size-1 slices of larger array (as in your own code), and they both work fine:
Things I’d consider to debug this problem further:
ddotdefinition is correctddot.ffile I linked to earlier in my answer)