본문 바로가기
Engineer/코드최적화

1. 효율적인 배열데이터 참조

by _제이빈_ 2020. 3. 12.

본 게시글은 원본1원본2 를 따라가며 이해한 내용들을 기록한 문서이다.

코드 최적화 관련 글 목록

 

 과학계산에서의 코드 최적화

 

    Fortran 및 C는 과학계산용 프로그램을 작성할때 자주 사용되는 언어이다. 계산속도를 높이기 위해서는 데이터의 저장방법이나, 반복계산 등의 세부 사항을 이해하고 최적화 시켜야한다. 몇 가지 일반적인 효율성 문제를 해결할수 있지만, Donald E. Knuth (1974)의 말을 항상 명심해야 한다. 

 

We should forget about small efficiencies,

say about 97% of the time: premature optimization is the root of all evil.

 

프로그램을 최적화도 적기에 해야한는 말이다. 섣불리 했다가 오히려 시간만 잡아먹을 수 있다고 이해할 수 있겠다.

 

 

■ 데이터 저장방법에 따른 최적화

 

     대표적인 Fortran 및 C에 대해서 얘기해 보겠다. 메모리에 어떤 순서로 접근하느냐도 프로그램의 성능에 영향을 줄 수 있다. 저장된 순서로 액세스하는 것이 더 빠르다. 일반적인 2차월 배열 저장방법을 생각해보면, 포트란은 열부터 C는 행부터 데이터를 저장한다. 아래 설명 그림을 보면 쉽게 이해가 갈 것이다.

 

 

위 그림과 같이 열 먼저 저장되어 있는데 행 순서로 데이터를 읽으려고 하면 왔다갔다하면서 데이터를 읽어야하기 때문에 읽어오는 처리가 느려진다. 이때, 데이터의 위치(메모리 주소)를 일일이 기억해야하고 이를 찾기 위해 더 많은 계산을 수행되어 복잡해진다. 이러한 저장순서는 사용하는 컴파일러나 언어표준에 따라 달라지니, 사용설명서를 읽고 적절히 사용해야할 것이다.

    여하튼 포트란과 C의 예시를 들고왔다. 아래와 같이 데이터가 저장된 순서대로 코드 내에서 요소를 참조해야한다. Fortran과 C의 A 데이터를 읽어오는 반복문은 다음과 같다.

 

!! Fortran
do j = 1, n
    do i = 1, n
        ! operate on A(i,j) ...
    enddo
enddo

 

// C
for (i = 0; i < n; i++ {
    for (j = 0; j < n; j++) {
        /* operate on A[i][j] ... */
    }
}

 

2중 반복문을 사용하는거 가뜩이나 느린데, 이런거로라도 줄여보는게 어떨런지! 데이터 로딩 뿐만아니라 반복문이 효율적으로 쓰였는지도 성능을 좌우할 수 있다. 다음 게시글에서 이에대해 다뤄 보도록 하겠다.

반응형

'Engineer > 코드최적화' 카테고리의 다른 글

3. 인텔포트란 최적화 옵션 정리  (0) 2020.03.12
2. 효율적인 반복문(loop) 작성  (0) 2020.03.12
코드 최적화  (0) 2020.03.12

댓글