SGEMM的意外结果

时间:2015-11-07 16:40:46

标签: fortran gfortran blas

我正在尝试在计算A * B'的代码中替换以下matmul实例:

print *, mat%A
print *, mat%B
print *, mat%dimsA
print *, mat%dimsB
C = matmul(mat%A,transpose(mat%B))
print *, C

与SGEMM:

print *, mat%A
print *, mat%B
print *, mat%dimsA
print *, mat%dimsB
call SGEMM('N', 'T', mat%dimsA(1), mat%dimsB(1), mat%dimsA(2), 1, mat%A, &
    mat%dimsA(1), mat%B, mat%dimsB(1), 0, C, mat%dimsA(1))
print *, C

其中mat是包含以下相关数据的类型:

integer :: dimsA(2), dimsB(2)
real, pointer :: A(:,:),B(:,:)

在A为:

的小型测试中运行代码
1 1 1 
2 2 2

和B是:

1 1 1

我得到了matmul的以下输出:

1.00000000       2.00000000       1.00000000       2.00000000       1.00000000       2.00000000    
1.00000000       1.00000000       1.00000000    
2           3
1           3
3.00000000       6.00000000

和SGEMM:

1.00000000       2.00000000       1.00000000       2.00000000       1.00000000       2.00000000    
1.00000000       1.00000000       1.00000000    
2           3
1           3
4.20389539E-45   8.40779079E-45

假设这两个代码块应该有相同的结果我错了吗?

1 个答案:

答案 0 :(得分:1)

这是因为您将alpha和beta的整数传递给lapack子例程。编译器没有SGEMM的接口可用,并且无法警告您产生的类型混淆...

只需使用(默认精度)实数表示法 - 1.代替10.代替0

call SGEMM('N', 'T', mat%dimsA(1), mat%dimsB(1), mat%dimsA(2), 1., mat%A, &
    mat%dimsA(1), mat%B, mat%dimsB(1), 0., C, mat%dimsA(1))