계산이 언제 끝나려나?

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

#include

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

#include

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 명령어를 사용하였다. 로그-로그 그래프인데도 지수함수적인 증가인 것 처럼 보이는 걸 보면, 로그로그-로그로그 그래프를 그려야 할지도 모른다는 생각이 든다. 아무튼, 연산 횟수가 늘어날수록 그 차이도 더 벌어지고 있다는 걸 볼 때, 아마 수천경 번 정도 연산해야 하는 계산은 엄청난 차이가 날 것이다. 지수함수보다 더 빨리 커지는 함수가 지수지수 함수이기 때문이다.(지수함수의 지수가 지수함수로 커지므로.)

코멘트

“계산이 언제 끝나려나?”에 대한 2개 응답

  1. 
                  snowall
                  아바타

    아마 10초는 오버헤드일 수도 있어요

    제대로 테스트 하려면 연산 횟수를 점점 바꿔가면서 해봐야 합니다.

  2. 
                 handrake
                 아바타

    그렇게 밖에 차이가 안나나요? 곱셈과 덧셈은 몇십배 정도는 차이나는 줄 알았네요.

handrake 에 응답 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.