프로그램을 실행하는 동안 상당히 많은 서브 루틴이 있습니다. 나는 가능한 한 많은 할당 가능한 배열을 사용하려고하고, 서브 루틴은 아무 문제없이 여러 번 호출하지만, 어떤 점에서, 그것은으로 종료 :이 서브 루틴의 시작 부분에 발생배열 할당 중 오류가 발생했습니다.
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
이 (큰 것으로) 잘못 계산 된 것으로 나타났습니다. 이 출구는 여러 루프의 반복을 줄임으로써 나중에 계산 시간을 절약 할 수 있습니다.
나는 이것이 쉽지 않을까 걱정된다. 컴파일은 FEM 소프트웨어에 의해 관리되며 컴파일러 옵션을 변경하는 것처럼 보이지 않습니다. –
컴파일러에게이 옵션을 기본값으로 사용하도록 지시하는 방법이 있습니까? 편집 할 때 설정하지 않습니까? –
컴퓨터에서 코드를 컴파일하는 경우 컴파일러 옵션을 변경하는 방법이 있어야합니다. 특히 자신의 소스 코드를 추가 할 수 있기 때문에 특히 그렇습니다. 어떤 특정 소프트웨어 패키지를 사용하고 있습니까? –