2014-10-20 3 views
1

다음 코드 조각은 제대로 작동하지만 좀 더 효율적인 코드를 사용하려고합니다. 즉, 어쨌든 implied-do 루프를 사용하여 큰 배열을 처리 할 것입니다. 기본적으로 배열의 각 요소와 다음 순환 시프트 된 요소의 차이를 계산합니다. 의견 있으십니까 ? 이 경우 시프트는 정수 여야합니다.cshift가있는 포트란 배열

do i = 1, nb_imp-1 
    X_dist(:,i) = lattice_imp%x - cshift(lattice_imp%x, shift=i) 
    Y_dist(:,i) = lattice_imp%y - cshift(lattice_imp%y, shift=i) 
    Z_dist(:,i) = lattice_imp%z - cshift(lattice_imp%z, shift=i) 
end do 

lattice_imp%x, y, z는 정수 배열이며, X_dist 각 원 순열 요소 사이의 차이를 포함한다.

+0

정확하게 "더 나은 구문"이 무엇을 의미합니까? 더 짧습니까? 더 많은 런타임이 효율적입니까? 그것이 의미하는 바대로 서 있습니다. –

+0

Fortran이 아니 었으므로 stackexchange 코드 검토를 권장하지만 Fortran은 그다지 공통적이지 않습니다. –

+0

관련 유형을 나타내는 일부 선언은 어떻습니까? 코드에서 추론하는 데 어려움을 겪고 있습니다. –

답변

3

큰 배열의 경우이 구현을 후회할 수 있습니다. 루프의 모든 반복에서 일부 (큰) 배열을 cshifting한다는 것은 해당 루프의 모든 반복이 컴파일러가 길이가 SIZE(lattice_imp%x) 인 임시 변수를 할당하고, 이동 된 값을 할당 한 다음이를 버리는 것을 의미합니다. 즉, 스 니펫을 올바르게 읽는 경우입니다.

보통 이전 DO 루프에 대한 할당을 lattice_imp%x 등으로 바꾸면 코드가 더 빨라집니다.

- EDIT - 죄송합니다. 유형/배열에 대한 컨텍스트가 없어도 조금 까다 롭습니다. 어쩌면 :

do i = 1, nb_imp-1 
    do j = 1, ubound(lattice_imp%x,1) 
    k = mod(j + i, i) +1 ! or whatever the correct implementation for this shifted index is... 
    X_dist(j,i) = lattice_imp%x(j) - lattice_imp%x(k) 
    Y_dist(j,i) = lattice_imp%y(j) - lattice_imp%y(k) 
    Z_dist(j,i) = lattice_imp%z(j) - lattice_imp%z(k) 
    enddo 
end do 
+0

염두에 두어야 할 코드의 예를 보여 주겠니? –

+0

@listless 허허. 그러나 배열 크기를 확장 할 때 고유 함수가 효율적이지 않다는 것을 의미합니까? – Roland

+0

또한 X_Dist, Y_Dist 및 Z_Dist 각각에 대해 별도의 루프를 수행하면 데이터 캐시를보다 효율적으로 사용하여 성능을 향상시킬 수 있습니다. –