2013-08-02 2 views
4

프로그램을 실행하는 동안 상당히 많은 서브 루틴이 있습니다. 나는 가능한 한 많은 할당 가능한 배열을 사용하려고하고, 서브 루틴은 아무 문제없이 여러 번 호출하지만, 어떤 점에서, 그것은으로 종료 :이 서브 루틴의 시작 부분에 발생배열 할당 중 오류가 발생했습니다.

malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed. 

때 첫 번째 배열 할당되고있다. 대신 비 할당 가능한 배열을 사용

, 서브 루틴은 더 자주 여러 번이라고하지만 함께 지금, 다시 종료 : 내가 바로 후 일부 값을 쓰기 때문에, 그것은 호출에 종료한다고 가정

wait: 28674: Memory fault(coredump) 

어떤 계산도없이 변수 선언.
호출하는 'kreise가'1500까지 내가 인쇄 및 서브 루틴과 호출 후, 호출하기 전에, 전달 매개 변수의 값을 검사의 값을 가질 수

do k=1, kreise 
    write(*,*)k 

    call rundheit(n(k),kreis(k,1:n(k),3),kreis(k,1:n(k),2),outrnd) 

end do 

.

'kreise'를 제한하면 문제가 해결되지만 제한은 실용적인 해결책이 아닙니다. 모든 데이터를 평가해야합니다. 그것의 골절이 아닙니다.

내 환경에 대한 메모 :
내 프로그램은 인텔 포트란 컴파일러를 사용하여 FEM 시뮬레이션 소프트웨어로 컴파일 된 서브 루틴입니다. 내가 아는 한 나는 컴파일러 옵션을 변경할 기회가 없으며 FEM 소프트웨어에 의해 배치 된 서브 루틴에 많은 의존성이 있기 때문에 자체적으로 코드를 컴파일 할 수 없다.

이 서브 루틴을 다른 크기의 훨씬 작고 간단한 시뮬레이션에서 개발하여 실행해도 아무런 문제가 없습니다. 실제 "더 큰"시뮬레이션은이 특정 서브 루틴을 사용하지 않는 한 문제없이 실행됩니다 (차이점은 대부분 노드 밀도 및 계산 중에 고려되는 데이터의 양입니다). 다른 사용자 - 서브 루틴 작업 문제없이. 모든 서브 루틴은 일부 증분 사이에서 결과를 가져오고 시뮬레이션을 변경하지 않고 일부 분석을 수행하고 일부 보고서를 작성합니다.

문제는 메모리 처리와 관련이 있다고 생각합니다. 아무 것도 모릅니다.

감사합니다.

UPDATE
나는 -check all를 사용하여 서브 루틴을 컴파일 오류가 식으로 비난 서브 루틴 전에 발생했습니다. 두 개의 배열 중 하나 (n())는 여러 차례에 걸쳐 범위를 벗어나지 만 호출하는 동안 오류는 어떻게 든 더 중요합니다. 이상한 부분은 오류가 발생할 때 경계를 넘는 반복입니다. 예를 들어 두 배열의 크기가 모두 (1:72)이고 호출이 k = 135-267 인 경우 어딘가에서 중단됩니다 (일부 경우에 발견 된 가장 낮은 값과 가장 높은 값). 실행).

... 
allocate(n(l)) 
allocate(pos(l)) 
... 
do kreise = 1,l 
    pos(kreise)=minvalX+(Kreise-1)*IncX 
    if(pos(kreise).gt.maxvalX) exit 
end do 

에 allways kreise는 L + 1이된다 :

문제 루프 중에 설정 값 Kreise 정수이다. 왜?

참고 : pos(kreise).gt.maxvalX은 절대로 안됩니다.사실이된다는 것은 문제가 아니지만, l이 (큰 것으로) 잘못 계산 된 것으로 나타났습니다. 이 출구는 여러 루프의 반복을 줄임으로써 나중에 계산 시간을 절약 할 수 있습니다.

답변

3

프로그램은 쓰기하지 않도록 메모리에 기록 포트란하여 사용의 malloc의 메모리 관리의 구조를 손상 할당 될 수있다. 런타임 첨자 검사를 위해 Fortran 옵션을 사용하는 것이 좋습니다. ifort를 사용하여 -check all 또는 -check bounds을 시도하십시오.

+0

나는 이것이 쉽지 않을까 걱정된다. 컴파일은 FEM 소프트웨어에 의해 관리되며 컴파일러 옵션을 변경하는 것처럼 보이지 않습니다. –

+2

컴파일러에게이 옵션을 기본값으로 사용하도록 지시하는 방법이 있습니까? 편집 할 때 설정하지 않습니까? –

+0

컴퓨터에서 코드를 컴파일하는 경우 컴파일러 옵션을 변경하는 방법이 있어야합니다. 특히 자신의 소스 코드를 추가 할 수 있기 때문에 특히 그렇습니다. 어떤 특정 소프트웨어 패키지를 사용하고 있습니까? –

관련 문제