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 살레시오

댓글을 달아 주세요

 파이썬에서는 문자열끼리 더하거나 곱할 수 있다. 문자열끼리 연결하는데  덧셈 연산자를 사용하는 것은 다른 언어에서도 흔하지만 곱셈은 독특하다.  두 개의 문자열을 더하면 문자열이 하나로 합해진 새로운 문자열이 만들어진다.


>>> “My name is “+”Salesio.”
>>> q = “ipython”
>>> r = “ is useful.”
>>> s = q+r


이 예제에서 원래의 문자열 q와 r은 더하기 연산으로 변경되지 않는다. 앞에서도 밝혔듯이 문자열은 한 번 내용이 정해지면 그 다음에는 변경할 수 없다. (이러한 자료형을 immutable 자료형이라고 한다.)  다만 연산의 결과로 새로운 문자열이 생성되는 것이다.  만약


>>>s = ’Life is long.’


에서 long이라는 단어를 short로 바꾸고 싶다면 슬라이싱을 이용해서 다음과 같이 할 수 있다.


>>> s = s[:8] + ’short.’


이 경우 원래 문자열이 바뀌는 것이 아니라 기존의 문자열은 모두 삭제되고 새로 생성된 문자열이 다시 변수 s에 저장되는 것이다. (사실 변수 s 는 문자열에 대한 참조가 저장된다. 이 경우 참조, 즉 주소가 새로 생성된 문자열의 그것으로 바뀌는 것이다.)


 유사하게 문자열에 정수를 곱하면 정수만큼 반복되는 새로운 문자열을 생성한다.


>>> “blah “*5

blah blah blah blah blah

>>> ‘=’*50

==================================================


위에서 두 번째 예는 화면에 출력할 때 간단히 구분선을 만드는 용도로 사용된다.



Posted by 살레시오

댓글을 달아 주세요