2014-12-04 9 views
3

제목으로 Fortran 의도 (inout)가 값의 복사본이나 RAM 주소에 대한 포인터/참조를 전달하는지 알고 싶습니까? 내가 이것을 알 필요가있는 이유는 (상대적으로) 큰 데이터 행렬을 전달해야한다는 것입니다. 문제가 발생할 로컬 복사본을 만드는 경우. 고맙습니다!Fortran 의도 (inout)가 값의 사본 또는 포인터/참조를 RAM 주소로 전달합니까?

+3

아마도 복사/포인터가 표준화되지 않았다는 것을주의하면서 http://stackoverflow.com/q/26573059/3157076을 참조하십시오. – francescalus

+1

나는 심지어 그걸 복제품으로서 깃발로 옮길 것이다. 그 게시물에서 모든 것을 반복 할 이유가 없습니다. 적어도 나에게는. 주된 메시지는 의도 된 크기, 명시 적 크기, 가정 된 모양 배열, 연속성 등과 관련하여 의도가 이차적 인 생각이라는 것입니다. –

답변

4

Fortran은 함수 및 서브 루틴 인수가 전달되는 방법에 대한 세부 정보를 지정하지 않지만 프로 시저가 intent(out) 또는 intent(inout) 인수를 수정하면 프로 시저가 반환 된 후에 변경 내용을 호출자가 볼 수 있어야합니다. 컴파일러는 인수를 참조로 전달하여이 요구 사항을 구현하는 것이 일반적이지만 유일한 방법은 아닙니다. copy in/copy out이 주요 대안입니다.

일반적으로 컴파일러를 사용하여 일반적으로 참조로 전달되는 가장 정확한 동작을 구현할 수 있습니다. 그러나 연속되지 않는 배열 섹션을 가정 된 더미 인수로 전달하는 것과 같이 작동하지 않는 경우가 있으며 복사 인/복사 아웃이 더 빠를 때가 있습니다 (어쩌면 특정 대형 멀티 프로세서 시스템에서 세그먼트 화 된 메모리 아키텍처).

결론은 좋은 질문이지만 일반적인 대답은 없습니다. 종종 그렇듯이, 먼저 작동하도록하는 것이 가장 좋으며 필요할 경우 더 빨리 수행 할 수 있습니다. 배열 복사 질문은 머리 뒤쪽에 두십시오. 그러나 테스트 할 위치에 올 때까지는 그다지 걱정하지 마십시오.

+0

매개 변수로 전달할 때 실제로 전체 배열을 복사하는 Fortran 구현에 대해 알고 있습니까? – Gabe

+0

아니요, 구체적으로는 아니지만 일반적으로 이러한 동작이 의미있는 수퍼 컴퓨터와 작동하지 않습니다. 나는 그것이 일어날지도 모른다고 빌려준 권위에 대해 말하고있다. –