我试图实现一个简单的矩阵乘法,但我继续得到错误
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
test_performance. 00000000004708F1 Unknown Unknown Unknown
test_performance. 000000000046F047 Unknown Unknown Unknown
test_performance. 000000000043F544 Unknown Unknown Unknown
test_performance. 000000000043F356 Unknown Unknown Unknown
test_performance. 0000000000423DFF Unknown Unknown Unknown
test_performance. 000000000040384D Unknown Unknown Unknown
libpthread.so.0 00002AD8B44769F0 Unknown Unknown Unknown
test_performance. 00000000004034A8 Unknown Unknown Unknown
test_performance. 0000000000402ECE Unknown Unknown Unknown
libc.so.6 00002AD8B46A6BE5 Unknown Unknown Unknown
test_performance. 0000000000402DD9 Unknown Unknown Unknown
这是我的代码:
PROGRAM test_performance
IMPLICIT NONE
INTEGER :: DIM_M, DIM_L, DIM_N, index1, index2,index3,index4
INTEGER, DIMENSION(4,4) :: A,B,C
DIM_L=4
DIM_M=4
DIM_N=4
DO index1=1,DIM_M
DO index2=1,DIM_L
print *, 'here I am!'
A(index1,index2)=index1+index2
END DO
END DO
DO index3=1,DIM_L
DO index4=1,DIM_N
B(index3,index4)=index3+index4
END DO
END DO
print *,'A= ',A
print *,'B= ',B
CALL MATRIXMULTIPLICATION
PRINT *, 'C=', C
END PROGRAM test_performance
SUBROUTINE MATRIXMULTIPLICATION(A,B,C, DIM_M, DIM_L, DIM_N)
INTEGER, INTENT(IN) :: DIM_M, DIM_L, DIM_N
INTEGER, INTENT(IN) :: A(4,4), B(4,4)
INTEGER, INTENT(OUT) :: C(4,4)
INTEGER :: ii=1,jj=1, kk=1
DO ii=1, DIM_M
DO jj=1, DIM_N
DO kk=1, DIM_L
C(ii,jj)=C(ii,jj)+A(ii,ll)*B(ll,jj)
END DO
END DO
END DO
END SUBROUTINE MATRIXMULTIPLICATION
我不知道为什么会出现这个错误,因为Dimension和所有指数都应该没问题。我试图通过使用所有可能的东西找到错误,但我不再暗示任何错误可能是什么。
答案 0 :(得分:1)
声明
CALL MATRIXMULTIPLICATION
不包括调用例程时所需的参数。一个糟糕的解决方案是简单地用
替换该语句CALL MATRIXMULTIPLICATION(A,B,C, DIM_M, DIM_L, DIM_N)
然而,更好的解决方案是使子例程的接口显式。有很多方法可以做到这一点,一种方法是将它放入module
和use
模块中。对于一个可能有点矫枉过正的子程序,但随着程序变得越来越大,越来越复杂,这绝对是可行的方法。
对于您当前的目的解决方案,一个简单直接且令人满意的方法是移动
行END PROGRAM test_performance
按照
行END SUBROUTINE MATRIXMULTIPLICATION
并且,end program
行最初插入行
contains
如果您首先按照这些行编写了程序,编译器会看到您的恶劣错误并指出给您。由于子程序是程序的外部,编译器在编译时不能匹配其虚拟和实际参数;正如所写的那样,论证匹配是程序员的责任,而你却相当松散。
进一步的改进是使你的子程序处理任何大小的数组,而不是在通过参数列表传递数组维度。 Fortran数组随身携带它们的大小和形状信息,在极少数情况下,例程需要明确地知道它们可以进行查询。
更容易使用matmul
内在函数,并花时间编写其他代码,也许是更具挑战性和更有趣的代码部分。