병렬 프로그래밍을 배워보고자 이번 학기에 병렬 프로그래밍 수업을 신청했는데, 프로그래밍, 특히 C언어에 익숙하지 않은 학생들을 위해서 지난주부터 이번주까지는 기본적인 C 문법을 다루고 있다. 이번주는 행렬 곱 연산에서 알고리즘에 따라 계산시간이 얼마나 차이가 나느지 비교해보는 숙제가 있었다. 친절하게도 header file은 제공하고 source file은 각자 구현하여 가급적 학생들이 동일한 인터페이스를 이용하여 프로그램을 작성하도록 하고 있었다. 그동안 메모리 할당문은 편의상 new & delete 문을 사용해오다가 막상 malloc & free 문을 사용하려고 하니 좀 어색한 감은 있었는데 조금 헤맨끝에 어렵지 않게 동적할당에 적응하였다. 난 2차원 배열을 할당할 때 그동안 loop문을 돌면서 아래와 같은 방식으로 메모리를 할당하였다.
double ** M;
M = (double**)malloc(m*sizeof(double*))
for(int i=0; i<m; ++m) {
M[i] = (double*)malloc(n*sizeof(double));
}
이 방법이 틀린 건 아닌데 교수님이 동적할당에 애먹는 학생들을 위해 2차월 배열작성 함수를 제공하길래 봤더니
double ** M;
M = (double**)malloc(m*sizeof(double*));
if(M[0] == NULL) {
for(int i=1; i<m; ++m) {
M[i] = M[0] + i*n;
}
이 코드를 보는 순간, 내가 그동안 별 생각없이 편의위주로 배열을 만들어 사용하고 있었다는 것을 알 수 있었다. 처음 C언어를 배울 무렵에만 포인터 계산을 신경써서 했지 언제부턴가 포인터 연산을 할 생각을 전혀하지 않고 살았던 것이다. 교수님이 작성한 방식으로 하면 좋은 점이, 첫째로 메모리 해제할 때 단순히 free(M)만 하면되는데 비해서 내가 만든 코드는 메모리를 만든 순서의 반대로 메모리를 해제해주어야한다. 즉,
for(int i=0; i<m; ++i) {
free(M[i]);
}
free(M);
이렇게 두번 메모리 해제를 해주어야 한다. 행렬의 크기가 작다면 큰 문제가 되지않겠지만, 그 반대라면 메모리 할당, 해제하는데 그만큼의 오버로드가 걸리므로 비효율적이라는 생각이 든다. 그리고 교수님의 코드에서는 한번에 사용할 메모리 전체를 할당해서 사용하기 때문에 가능한 연속적인 메모리 공간을 할당할 것이기 때문에 행렬연산할 때도 보다 유리할 것으로 생각된다.
double ** M;
M = (double**)malloc(m*sizeof(double*))
for(int i=0; i<m; ++m) {
M[i] = (double*)malloc(n*sizeof(double));
}
이 방법이 틀린 건 아닌데 교수님이 동적할당에 애먹는 학생들을 위해 2차월 배열작성 함수를 제공하길래 봤더니
double ** M;
M = (double**)malloc(m*sizeof(double*));
if(M[0] == NULL) {
for(int i=1; i<m; ++m) {
M[i] = M[0] + i*n;
}
이 코드를 보는 순간, 내가 그동안 별 생각없이 편의위주로 배열을 만들어 사용하고 있었다는 것을 알 수 있었다. 처음 C언어를 배울 무렵에만 포인터 계산을 신경써서 했지 언제부턴가 포인터 연산을 할 생각을 전혀하지 않고 살았던 것이다. 교수님이 작성한 방식으로 하면 좋은 점이, 첫째로 메모리 해제할 때 단순히 free(M)만 하면되는데 비해서 내가 만든 코드는 메모리를 만든 순서의 반대로 메모리를 해제해주어야한다. 즉,
for(int i=0; i<m; ++i) {
free(M[i]);
}
free(M);
이렇게 두번 메모리 해제를 해주어야 한다. 행렬의 크기가 작다면 큰 문제가 되지않겠지만, 그 반대라면 메모리 할당, 해제하는데 그만큼의 오버로드가 걸리므로 비효율적이라는 생각이 든다. 그리고 교수님의 코드에서는 한번에 사용할 메모리 전체를 할당해서 사용하기 때문에 가능한 연속적인 메모리 공간을 할당할 것이기 때문에 행렬연산할 때도 보다 유리할 것으로 생각된다.
'프로그래밍' 카테고리의 다른 글
| how to compile boost library with Mingw (0) | 2012/03/31 |
|---|---|
| STL debug 메시지 출력을 위한 GDB 세팅 (0) | 2012/01/10 |
| C언어 2차원 배열 선언 (1) | 2011/09/04 |
| Notice between pgf90 and gfortran (0) | 2011/07/26 |
| 소스분석도구 (0) | 2011/02/26 |
| Fortran 90 study note (0) | 2011/02/09 |
