matmul_6.f90
来自「用于进行gcc测试」· F90 代码 · 共 67 行
F90
67 行
! { dg-do run }! PR 34566 - logical matmul used to give the wrong result.! We check this by running through every permutation in! multiplying two 3*3 matrices, and all permutations of multiplying! a 3-vector and a 3*3 matrices and checking against equivalence! with integer matrix multiply.program main implicit none integer, parameter :: ki=4 integer, parameter :: dimen=3 integer :: i, j, k real, dimension(dimen,dimen) :: r1, r2 integer, dimension(dimen,dimen) :: m1, m2 logical(kind=ki), dimension(dimen,dimen) :: l1, l2 logical(kind=ki), dimension(dimen*dimen) :: laux logical(kind=ki), dimension(dimen) :: lv integer, dimension(dimen) :: iv do i=0,2**(dimen*dimen)-1 forall (k=1:dimen*dimen) laux(k) = btest(i, k-1) end forall l1 = reshape(laux,shape(l1)) m1 = ltoi(l1) ! Check matrix*matrix multiply do j=0,2**(dimen*dimen)-1 forall (k=1:dimen*dimen) laux(k) = btest(i, k-1) end forall l2 = reshape(laux,shape(l2)) m2 = ltoi(l2) if (any(matmul(l1,l2) .neqv. (matmul(m1,m2) /= 0))) then call abort end if end do ! Check vector*matrix and matrix*vector multiply. do j=0,2**dimen-1 forall (k=1:dimen) lv(k) = btest(j, k-1) end forall iv = ltoi(lv) if (any(matmul(lv,l1) .neqv. (matmul(iv,m1) /=0))) then call abort end if if (any(matmul(l1,lv) .neqv. (matmul(m1,iv) /= 0))) then call abort end if end do end docontains elemental function ltoi(v) implicit none integer :: ltoi real :: rtoi logical(kind=4), intent(in) :: v if (v) then ltoi = 1 else ltoi = 0 end if end function ltoiend program main
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?