我正在尝试在计算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
假设这两个代码块应该有相同的结果我错了吗?
答案 0 :(得分:1)
这是因为您将alpha和beta的整数传递给lapack子例程。编译器没有SGEMM
的接口可用,并且无法警告您产生的类型混淆...
只需使用(默认精度)实数表示法 - 1.
代替1
,0.
代替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))