최적화 할 fortran90 코드가 있습니다. 이제 외부 루프에서 구조체의 메모리 위치에 액세스 한 다음 중첩 루프에서 가장 깊은 구조체에 액세스하려고합니다. 이 같은 뭔가 : -fortran90 : 주소 지정 메모리 위치
샘플 포트란 루프 기존 버전
do i = 1, N
ii = some integer
jj = some other integer
do j = 1, M
c = a(ii, jj)%b(i)
enddo
enddo
가되고 있습니다
초 포트란 루프 - 나는 이것을 가지고
do i = 1, N
ii = some integer
jj = some other integer
pointertoa = &a(ii, jj) !I know it's not correct in fortran, that is the question!
do j = 1, M
c = pointertoa%b(i)
enddo
enddo
을 쓰고 싶은 것이 (샘플) 예상대로 작동하는 C 코드 :
W orking 메모리의 주소 C
#include <stdio.h>
struct mem{
int a;
struct mm{
int b;
float v;
} mmm;
};
void main(){
struct mem *m, dum;
dum.a = 12;
dum.mmm.b = 5;
dum.mmm.v = 3.2;
m = &dum; //m is given dum memory address
printf("dum.a = %d\n", dum.a);
printf("dum.mmm.b = %d\n", dum.mmm.b);
printf("dum.mmm.v = %f\n", dum.mmm.v);
printf("m.a = %d\n", m->a);
printf("m.mmm.b = %d\n", m->mmm.b);
printf("m.mmm.v = %f\n", m->mmm.v);
}
질문의 몇 :
- 어떻게 당신은 내가 fortran90에서 C에서와 동일한 기능을 수행 할 것인가?
- 두 번째 포트란 루프가 코드 속도를 높일 것이라고 생각합니까?
(2) 어떻게 코드 속도를 높일 수 있습니까? –
Fortran에서 포인터는'&'대신'=>'에 의해 설정됩니다! –
@JohnZwinck, 속도 향상은 일종의 _prefetching_ 일 것입니다 : 여러분은'ii'와'jj' 인덱스가 외부주기에 저장되어 있음을 볼 수 있습니다. 따라서'a (ii, jj) '를 같은 값에로드하는 것이 명백합니다 장소. @AlexanderVogt, 포인터가 간단히 작동하지 않습니다. 내부 사이클에서 (ii, jj)의 메모리 위치가 필요합니다. 값에 대한 참조가 아닙니다. 어쨌든 C 코드에서 포인터로 시도해 보았습니다. 설정 잘못 :). – bio