2013-06-19 1 views
1

나는 difference between POINTER and ALLOCATABLEWhy does a Fortran POINTER require a TARGET?을 읽었으며 정말 좋은 답변을 가지고 있습니다.대상 속성이 Fortran 프로그램의 효율성에 영향을 줍니까?

는 는

그것은 가장 효율적인 선택은 내가 좋은 효율적으로 할당 가능한 변수가있는 경우, 지금 연결 등 목록, 나무,

같은 것들에 대한 큰 배열 allocatables 및 포인터를 사용하는 것 같다, 목표는 어떻게 든 속성 것 액세스 방식이나 컴파일러가 코드를 최적화하는 방법에 영향을 미칩니 까? 이것을하는 것이 바람직합니까?

real, dimension(:),allocatable :: x,y,z 

및 서브 루틴 내에서 내가 포인터를 사용하여 순환 방식으로 가리 싶습니다 :

예를 들어, 내 좌표 삼중 생각할 수 있습니다.

답변

0

방향 (예 : (x, y, z) -> (y, z, x))을 바꿀 경우 if-else 조건을 할당 가능 문자로 사용할 수 있으므로 포인터가 필요하지 않습니다.

당신은 항상 x에 평행 한 방향과 yz에 수직 방향이 있기 때문에
if(dir == 1) then 
     allocate(x(1:nx),y(1:ny),z(1:nz)) 
    elseif(dir == 2) then 
     allocate(x(1:ny),y(1:nz),z(1:nx)) 
    elseif(dir == 3) then 
     allocate(x(1:nz),y(1:nx),z(1:ny)) 
    endif 

이 코드의 재사용을 가능하게한다.

+0

답장을 보내 주셔서 감사합니다. 여전히 할당 가능한 변수에 대한 대상 속성의 영향을 알고 싶습니다. – Alejandro

+1

모든 컴파일러가 할당 가능한 변수에 대상 속성을 요구합니다. target 속성은 기본적으로 변수에 별명이 지정 될 수 있음을 컴파일러에 알리는 데 사용됩니다. 그런 다음 컴파일러는보다 효율적인 코드 생성에 대한 결정을 내릴 수 있습니다. 그것은 매우 컴파일러에 의존합니다. 가장 쉬운 방법은 코드에 중단 점을 설정하고 대상 속성이 있거나없는 코드 생성의 차이를 확인하는 것입니다. – cup

0

이것은 컴파일러에 의존하는 것으로 들리며 개인적으로 컴파일러 개발자가 실제로이 상황을 어떻게 처리하는지에 대해 전혀 알지 못합니다. 그러나 이것은 파생 된 데이터 유형의 크기/복잡성 및 서브 루틴에 사용 된 {intent (in), intent (out), intent (inout)} 유형에 따라 달라질 수 있습니다. 비교 다음과 같은 유형 :

type ex1 
    real :: a ! only one member 
end type ex1 

당신이 그것을 프로그램에서 "EX2 데이터 형식"으로 만들어진 객체를 가리 싶지 않아 가정

type ex2 
real, dimension(:), allocatable :: a ! member 1 
type(complicated), allocatable :: b(:) ! member 2 
type(more_complicated) :: c 
! : 
! : 
!       still has more 200 members! 
end type ex2 

, 나는 대상의 속성을 수 제거 생각 컴파일러는 런타임 중에 별칭이 없다는 가정하에 ex2의 내부 구조를 크게 최적화 할 수 있기 때문에 프로그램의 속도를 향상시킬 수 있습니다. 서브 루틴에 대한 인수로 사용될 때 intent()와 관련된 동일한 인수가 유지됩니다.

그러나 단순한 "ex1"유형의 경우 프로그램에서이를 가리킬 의도가 없으면 대상 속성의 유무에 관계없이 그대로 두어도 상관하지 않습니다.

관련 문제