500메가바이트 분량의 3차원 행렬 6개를 더하고 나누고 하는 삽질을 해야 하는데 시간이 얼마나 걸릴까 추정해 보려고 실험을 해 봤다.

#include<stdio.h>
int main(void){
    int i=2000000000;
    double sum = 1.0;
    double a = 1.0000001;
    while(i--){
        sum*=a;
    }
    printf("Answer = %lf\n", sum);
    return 1;
}

1.0000001을 20억번 곱하는 프로그램이다. 약 12초 걸렸다.

저기서 *=을 +=으로 바꾸면 20억번 더하는 프로그램이 되는데, 그 경우에는 약 10초정도 걸렸다. 즉, 곱셈이 20%정도 더 연산량이 많다는 뜻이다.

3차원 행렬에 있는 숫자들이 대략 500만개 정도 있고, 그거 6개를 더해야 하니까 덧셈은 3천만번. 그걸 평균을 내기로 했으니까 곱셈은 500만번정도. 오차를 계산해야 하니까 다시 덧셈 500만번 추가. 이 계산을 100번 반복하면 약 4억번 정도의 덧셈과 5천만번 정도의 곱셈이 필요하다. 단순히 위의 수치대로만 계산이 된다면 3초에 끝난다는 뜻인데...

만약 진짜 3초만에 끝나는 계산이라면, 500만개는 부족하니까 계산양을 좀 더 늘려야겠다.

----
추가.
곱셈과 덧셈의 차이를 발견하기 위해서 좀 더 실험을 해봤다.
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char **argv){
    int i=atoi(argv[1]);
    double sum = 1.0;
    double a = 1.0000001;
    while(i--){
        sum+=a;
    }
    printf("Answer = %lf\n", sum);
    return 1;
}
입력받은 수 만큼 더하거나 곱하는 프로그램이다. +=과 *=을 바꿔서 한번씩 해봤다.


그 결과를 보면 쥐꼬리만큼 차이가 나는 것을 발견할 수 있다. 이 그래프의 가로축은 연산 횟수, 세로축은 걸린 시간이다. 걸린 시간을 측정하는데에는 리눅스의 time 명령어를 사용하였다. 로그-로그 그래프인데도 지수함수적인 증가인 것 처럼 보이는 걸 보면, 로그로그-로그로그 그래프를 그려야 할지도 모른다는 생각이 든다. 아무튼, 연산 횟수가 늘어날수록 그 차이도 더 벌어지고 있다는 걸 볼 때, 아마 수천경 번 정도 연산해야 하는 계산은 엄청난 차이가 날 것이다. 지수함수보다 더 빨리 커지는 함수가 지수지수 함수이기 때문이다.(지수함수의 지수가 지수함수로 커지므로.)



by snowall 2010. 12. 24. 23:05