C/C++의 double형은 수치 해석 분야의 기본적인 자료형이다. float형은 정밀도가 떨어지므로 주로 이 자료형이 사용되며 GPU도 이 자료형의 계산을 고속으로 수행하도록 설계된 것으로 알려져 있다.


 그런데 long long int 형은 8바이트 정수형 자료형인데 단순 곱셈의 경우 수행 속도에 시간 차가 많이 난다. 다음과 같은 간단한 c++ 프로그램을 내 노트북에서 실행시켜서 확인해 보았다.


#include  <stdio.h>
#include <time.h>
#define ITER 100000000 //1억번
int main() {
clock_t clkStart, clkEnd;
double dt1, dt2;
clkStart = clock();
double da = 10.1, db=11.2;
for (long k=0; k<ITER; k++) {da*=db;}
clkEnd = clock();
printf("%.3f sec\n", dt1=((double)clkEnd-clkStart)/CLOCKS_PER_SEC);

clkStart = clock();
long long lla = 101, llb=112;
for (long k=0; k<ITER; k++) {lla*=llb;}
clkEnd = clock();
printf("%.3f sec\n", dt2=((double)clkEnd-clkStart)/CLOCKS_PER_SEC);
printf("%.2f percent", dt2/dt1*100);
}


이 프로그램은 단순히 double형 두 개를 곱셈 후 대입하는 동작 1억 번과 long long 형 덧셈 후 대입하는 동작 1억 번의 수행 시간을 구하는 것이다.  결과는 다음과 같이 후자가 전자 대비 3%의 시간밖에 걸리지 않았다.



 문제는 GPU 기반의 라이브러리인 CUDA에서 정수형 연산도 실수형 만큼 효율적인가 하는 것이다. 하지만 그러지 않더라도 나름 의미가 있지 않을까.





Posted by 살레시오