错误forrtl:严重(174):SIGSEGV,分段错误发生矩阵乘法

时间:2016-10-25 05:05:53

标签: fortran matrix-multiplication

我试图实现一个简单的矩阵乘法,但我继续得到错误

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和所有指数都应该没问题。我试图通过使用所有可能的东西找到错误,但我不再暗示任何错误可能是什么。

1 个答案:

答案 0 :(得分:1)

声明

CALL MATRIXMULTIPLICATION

不包括调用例程时所需的参数。一个糟糕的解决方案是简单地用

替换该语句
CALL MATRIXMULTIPLICATION(A,B,C, DIM_M, DIM_L, DIM_N)

然而,更好的解决方案是使子例程的接口显式。有很多方法可以做到这一点,一种方法是将它放入moduleuse模块中。对于一个可能有点矫枉过正的子程序,但随着程序变得越来越大,越来越复杂,这绝对是可行的方法。

对于您当前的目的解决方案,一个简单直接且令人满意的方法是移动

END PROGRAM test_performance

按照

END SUBROUTINE MATRIXMULTIPLICATION 

并且,end program行最初插入行

contains

如果您首先按照这些行编写了程序,编译器会看到您的恶劣错误并指出给您。由于子程序是程序的外部,编译器在编译时不能匹配其虚拟和实际参数;正如所写的那样,论证匹配是程序员的责任,而你却相当松散。

进一步的改进是使你的子程序处理任何大小的数组,而不是在通过参数列表传递数组维度。 Fortran数组随身携带它们的大小和形状信息,在极少数情况下,例程需要明确地知道它们可以进行查询。

更容易使用matmul内在函数,并花时间编写其他代码,也许是更具挑战性和更有趣的代码部分。