2012-08-31 7 views
1

포틀랜드 그룹 FORTRAN 90 컴파일러와 관련된 매우 이상한 문제가 있습니다. 이 배열 오버플로에 대해에 의존하여 올바르게 작동하도록 코드를 실행하려고합니다. 이 코드를 작성하지 않았습니다! 작성자는 "-tp = piii"플래그를 사용하여 컴파일러에서 컴파일러가 배열 오버플로를 무효로하는 최적화를 수행하지 못하도록 컴파일해야했습니다. 나는 오래된 P3 용으로 작성된 컴파일러가 이런 종류의 일을하기에는 너무 원시적이라는 생각을했다고 생각합니다. 이제 동일한 작업을 시도 할 때 "pgf90-Fatal --tp piii는이 설치에서 지원되지 않습니다."라는 메시지가 나타납니다. 그래서 나는 똑같은 일을 할 수 없다.배열 오버플로를 강제로 수행 할 수 있습니까?

So : pgf90은 기본 동작에서 코드에 필요한 일종의 배열 오버플로를 없앨 수 있습니까? 내가 함께 일하는 사람들이 분명히 그렇게 생각한다고. 그리고, 만약 그렇다면, "-p = piii"플래그로부터 필요한 것을 얻기 위해 사용할 수있는 다른 플래그가있을 수 있습니까?

당신이 이런 질문을하게 될 줄은 몰랐습니다. 어떻게 생각하니 나는 느낌. 그리고 네, 저에게 보관하도록 설득하는대로 곧 다시 쓰게 될 것입니다.

+0

의심의 여지가 없으므로 '배열 오버플로'는 무엇을 의미합니까? 선언 된 경계 밖의 요소를 주소 지정 하시겠습니까? 사용 가능한 힙 또는 스택을 초과하는 공간을 할당 하시겠습니까? –

+0

예, 선언 된 범위 밖에있는 요소를 주소 지정합니다. –

답변

2

필자는 더 이상 PGI 컴파일러에 익숙하지 않으며 직접 사용할 수있는 설명서가 없으므로 배열 경계 또는 경계 검사.

Fortran 90까지는 배열 경계를 무시하거나 무시한 코드를 작성하는 것이 일반적이었습니다. 그렇게 작성된 많은 코드는 여전히 야생 상태이며 대부분의 Fortran 프로그래머와 마찬가지로 규칙적으로 사용됩니다. 안타깝게도 (그것은 논쟁의 여지가있다) 코드를 작성하는 것이 허용 가능한 태도이다. 내가 야생에서 태도를 만나는 경우, 나는 그것을 극단적 인 편견으로 종결 짓습니다.

Rant over ... 현재 프로그램이 배열의 경계를 벗어날 때 런타임에 화를 낼 수있는 코드를 자동으로 생성하지 못하는 것은 Fortran 컴파일러 중 일부의 기본 동작입니다. 그러나 모두 런타임에 범위 검사를 포함하는 코드를 생성 할 수있는 옵션을 갖습니다.

런타임시 배열 경계를 확인하지 않으면 일반적으로 더 빠른 코드를 의미하며 대부분의 Fortran 사용자는 컴파일러의 기본 동작을 설명하는 더 빠른 코드에 관심이 많습니다.

결론적으로, 상속 한 코드의 필수 동작을 재현하는 데 너무 많은 어려움이 있어서는 안됩니다. PGI 컴파일러가 배열 경계를 체크하지 않는 것이 기본값이 아니라면 조금 놀랄 것이다. 기능을 켜거나 끌 수있는 옵션이 있습니다.

+0

PGI 자체의 훌륭한 사람들로부터 얻은 정보를 기반으로, 여러분의 기대는 옳으며 컴파일러는 어떤 종류의 배열 검사도하지 않습니다. PGI 사람들은 제 동료가 틀렸다는 의심을 품고 P3 플래그가 던져 질 때 만들어지지 않은 최적화를 코드를 깰 수있는 다른 최적화를 위해 배열 경계를 오인하고 있습니다. 감사. "-O0"및 "-tp = px-64"와 같은 다른 플래그를 실험 해보십시오. –

0

"piii"플래그로 동일한 문제가 발생하는 경우, 최근 PGI 컴파일러는 32 비트 라이브러리가 설치되어있는 경우이 플래그를 지원합니다. 그리고, 그것은 밝혀졌습니다.