2017-01-07 4 views
1

호출 루틴에서 서브 루틴을 인라인하게하려면 어디에 둘까요? 동일한 모듈 또는 파일에 있어야합니까? 다른 오브젝트 파일의 서브 루틴으로 인라이닝 할 수 있습니까? 대답은 컴파일러에 따라 다를 수 있습니까?서브 루틴/함수를 인라인으로 넣는 곳

+1

컴파일러의 결과가 다소 차이가 나는 경우 내부 절차 (CONTAINS)를 사용하십시오. 기본 설정의 ifort - 인라인 제한 설정에 따라 단일 컴파일 명령에 제공된 모든 소스 파일에서 자동으로 인라인으로 틱 (?)합니다. – tim18

+0

@ tim18 contains 문에 넣는 것은 재사용 및 이름 공간이 겹치기 때문에 불편합니다. 작은 루틴을 가진 모듈을 호출자와 동일한 컴파일 문에 넣으면 깨끗해 보인다. 그런 다음 모듈을 재사용 할 수 있으며 호출자가 호출하는 데 시간이 많이 걸리면 호출자와 동일한 줄에 make 파일에 넣을 수 있습니다. 나는 이것이 gfortran에서 작동하는지 궁금해하는데, 이것은 보통 내가 사용하는 컴파일러인가? –

답변

2

이것은 포트란 표준에 의해 제어되지 않습니다. 프로세서는 적합하다고 생각하는대로 처리 할 수 ​​있습니다.

확실히 컴파일러 설정에 따라 달라집니다.

일반적으로 내부 기능이 인라인됩니다. 하지만 다른 소스 파일이나 모듈에있는 경우 다른 많은 함수도 인라인됩니다.

하지만 다른 소스 파일/컴파일 된 오브젝트 파일에서 인라이닝하는 것은 문제가되지 않습니다. 그것은 링크 시간 최적화 (https://gcc.gnu.org/wiki/LinkTimeOptimization) 중에 종종 수행 할 수 있습니다. 이러한 최적화는 특정 컴파일러 플래그 (예 : -fast)에 포함되거나 별도로 활성화 될 수 있습니다 (-flto, -ipo).

+0

그리고 내부 함수는 호출자의'contains' 문에있는 함수를 의미합니까? 제품 간, 점 제품, 일부 기본 함수 등과 같이 일반적으로 사용되는 작은 루틴을 사용하여 별도의 파일에 모듈을 넣을 수 있고 인라인 될 것이라고 가정 할 수 있습니다. 아마 그런 모듈이 루틴을 사용하는 루틴과 같은 문장으로 컴파일되면 도움이 될 것입니다.'gfortran $ (flags) caller.f90 utils.f90' utils.f90에는 작은 루틴이있는 모듈이 들어 있습니다. –

+0

* 내부 절차 *는 정확히 정의 된 용어입니다. 그것들은 주 프로그램이나 다른 프로 시저 (일반적으로 호출자)의 contains 섹션에 있습니다. 플래그에'-flto'를 사용하고 컴파일러가 인라인으로 관리하는 것을 확인하십시오. 결과는 인라인 될 함수의 크기에 따라 달라집니다. –

+0

인라인이 성공했는지 어떻게 판단 할 수 있습니까? 나는 gfortran과 우분투에있어. 나는 프로파일 링을 위해'gprof' 나'perf'를 사용하고 있습니다. –