Sunday, June 7, 2009

컴퓨터는 정확한가?



컴퓨터는 일상적인 일에 많이 많이 사용되지만 실제로 하는 일은 계산하는 것. Computer니까.

실제로 전자회로를 이용한 컴퓨터가 사용되기 전에는 천문대나 군이나 연구소에서는 아래 그림 처럼 사람들이 계산을 했더랬다.


현대의 컴퓨터는 매우 성공적으로 각종 분야에서 사용되어 왔고 큰 발전을 이루어 왔지만, 기본적으로 하는 일은 그리 달라지지 않았다. 더하기 빼기 곱하기 나누기.

문제는 오래 전이나 지금이나 컴퓨터는 수를 정확히 표현하지 못한다는 것. 2진수표현을 사용하기 때문에 분모가 2의 지수가 아닌 유리수를 제외한 수는 정확히 표현하지 못한다.

사실 이것은 사람이 10진수를 사용한다고 해서 달라지는 것은 아니지만, 수학의 세계에서는 '무한히 긴' 소수를 감당할 수 있기 때문에 큰 문제가 되지 않는다. 그렇지만 컴퓨터는 그렇게 하지 못하는 것이 문제.

cuda 구현시 precision에 따른 문제가 있나 싶어 돌아다니다 본 흥미로운 발표자료.
http://www.mathematik.uni-dortmund.de/lsiii/static/showpdffile_GoeddekeStrzodka2006.pdf
막연히 갖고 있던 고정 관념 중 몇가지를 깨는 것이라 흥미롭다.

1) 컴퓨터가 부동소수점을 사용하여 계산한 결과는 언제나 어느 정도의 범위안에서라도 정확하다.

발표자료안에서 보여준 예. 다음과 같은 함수가 있다고 하자.
f(x,y) = (333.75-x^2)*y^6+x^2*(11*x^2*y^2-121*y^4-2)+5.5*y^8+x/(2y)
x=77617, y=33096일 때 함수값은?

아무 문제 없는 단순한 함수인데, 컴퓨터는 어떤 precision을 막론하고 1.17260~~~의 결과를 계산해낸다.
정답은 -0.82739605994682136814116509547981629….
부호마저 틀린 답을 계산했다.

컴퓨터는 항상 정확하지는 않다.

2) 더 많은 bit를 사용한 수 표현은 항상 더 정확하다.
결과의 정확도가 중요한 계산의 경우에는 double precision을 사용해야 한다는 것이 일반적인데, 해당 발표자료의 6페이지 결과는 이마저도 사실이 아님을 보여준다.
어떤 경우에는, double precision의 계산 결과가 single precision보다도 부정확한 경우가 있다는 것.

high precision이 더 나은 정확도를 항상 보장하는 것은 아니다.

그렇지만 보통 골라서 사용할 수 있는 경우에는 double precision이 더 나은 결과를 보여주는 경우가 많은 것도 사실이긴 하지만.

cuda의 경우에는, 32bit의 fpu를 사용하는 것이 일반적이므로 항상 single precision이라고 가정하는 것이 옳다. 최신의 gpu를 활용하는 경우 double precision을 지원하지만, double precision용의 fpu는 한 개만 들어있으므로 그 만큼의 속도 저하를 감수해야 한다. double형 계산은 serialize된다고 보아야 하므로.

cuda 결과를 cpu의 single precision 결과와 비교해볼때도 차이가 발생할 때가 있음에 주의하자.

1) MAD 최적화

계산 오차가 발생했다면 이 때문일 확률이 높다. cuda compiler는 매우 공격적으로 최적화를 수행하는데, 곱해서 더하는 operation을 대부분 MAD로 치환하는 것으로 보인다.
문제는 nvidia gpu의 fpu에 들어있는 레지스터 셋이 32비트라는 점인데, 곱하고 더하는 것을 한 번에 수행할 경우에는 미리 round-off되는 비트가 많다. 이것은 cuda 2.0 manual에 간단히 설명되어 있는데, 곱하기 연산을 해서 register에 넣었다가 다시 더하기 연산을 하는 것과 차이가 꽤나 크게 날 수 있다.

cpu의 경우에는 계산 레지스터의 길이가 80비트정도로 긴 경우가 많아서 이런 현상이 문제가 되지 않으므로 계산 결과가 중요하다면 확인해야 한다.

MAD최적화를 수행하지 않음으로써 cuda에서 이 문제를 해결할 수 있는데, 곱하기를 수행할 때 fmul_rz 함수를 불러서 하면 MAD최적화 없이 컴파일되어 오차가 크게 줄어든다.

2) summation순서

큰 수와 작은 수의 덧셈을 반복적으로 수행하는 경우에 더하기 순서에 따라 결과가 달라진다. 이는 cuda의 경우에도 마찬가지고, 32 bit 크기의 레지스터 내에서 이 영향을 줄이는 방법을 고려할 필요가 있다.

보통은 Kahan summation을 사용해서 오차를 줄인다.

Tuesday, June 2, 2009

허허허

어쩌라고? 밥숟갈을 놓으란 말인가?



흠... 닭집하려면 얼마나 필요할까?

Friday, May 29, 2009

두 이야기

이야기 하나...
누가복음 22장에서

예수를 잡아 끌고 대제사장의 집으로 들어갈새 베드로가 멀찍이 따라가니라
사람들이 뜰 가운데 불을 피우고 함께 앉았는지라 베드로도 그 가운데 앉았더니 한 여종이 베드로의 불빛을 향하여 앉은 것을 보고 주목하여 이르되 이 사람도 그와 함께 있었느니라 하니 베드로가 부인하여 이르되 이 여자여 내가 그를 알지 못하노라 하더라
조금 후에 다른 사람이 보고 이르되 너도 그 도당이라 하거늘 베드로가 이르되 이 사람아 나는 아니로라 하더라
한 시간쯤 있다가 또 한 사람이 장담하여 이르되 이는 갈릴리 사람이니 참으로 그와 함께 있었느니라
베드로가 이르되 이 사람아 나는 네가 하는 말을 알지 못하노라고 아직 말하고 있을 때에 닭이 곧 울더라
주께서 돌이켜 베드로를 보시니 베드로가 주의 말씀 곧 오늘 닭 울기 전에 네가 세 번 나를 부인하리라 하심이 생각나서 밖에 나가서 심히 통곡하니라

이야기 둘...
마태복음 27장에서

새벽에 모든 대제사장과 백성의 장로들이 예수를 죽이려고 함께 의논하고 결박하여 끌고 가서 총독 빌라도에게 넘겨 주니라
그 때에 예수를 판 유다가 그의 정죄됨을 보고 스스로 뉘우쳐 그 은 삼십을 대제사장들과 장로들에게 도로 갖다 주며 이르되 내가 무죄한 피를 팔고 죄를 범하였도다 하니 그들이 이르되 그것이 우리에게 무슨 상관이냐 네가 당하라 하거늘 유다가 은을 성소에 던져 넣고 물러가서 스스로 목매어 죽은지라.

-------------------------------
언뜻 비슷한 이야기. 그렇지만 이후는 너무도 달라진 이야기.

그리고 며칠간 실제 눈 앞에서 본 것같은 그런 이야기들.

그 선택을 하나님은 사람들 하나하나에게 맡기신다.

Friday, May 22, 2009



이 몸이 주거 가서 무어시 될고 하니,

蓬萊山 第一峯에 落落長松 되야 이셔,

白雪이 滿乾坤할 제 獨也靑靑 하리라.



그저 자꾸 눈물만 난다......

Friday, May 15, 2009

오야스미양~



숙면베개라는데, 사실 베개가 다 거기서 거기지 잠 잘 오는 베개가 어딨어.

라고 생각했지만, 이건 뭐... 사람을 아주 잠팅이로 만드는 베개.

여전히 좀 자다깨다 하기도 하고 잠 잘 못드는 날도 있긴 한데,

이게 아주 높이도 적당하고, 냄새도 살랑살랑 나줘서인지 자면 못일어난다.

아침에 못일어나는게 베개 때문이려나?

여튼 잠이 점점 늘어나는 듯. 환자처럼 잠만 잔다 -.- zzz

얘두 가끔 놀아주면 좋으련만, 하긴 얘는 맨날 자는 게 일이니까 뭐...

Thursday, May 14, 2009

인간과 상황

관찰자로 있는 것과 그 자리의 주역이 되는 것과는 완전히 다른 이야기다.

보고 있으면 왜 저러나 싶지만, 실제 그 상황에 놓이면 똑같이 행동하게 되는 것도 또 사람이네.

그다지 엄밀하게 구성된 실험들은 아닌 듯 하지만, 사실 이런 방송이 그럴 필요는 없겠지.

이런 면도 있다는 것을 보여주기만 하면 되니까.

시간내서 쭈욱 한 번 보아도 좋을 것같은, 어쩌면 '대하고 싶지 않은' 진실.



하지만, 꼭 그렇게 하지 않은 사람들도 분명히 있다.

'상황'이란 건 사람의 반응을 정하는 것이기도 하지만, 좋은 '핑계거리'일 수도 있어.

'어쩔 수 없이 그리 되어 버렸다고' 말이지

"행복해 보이나요?"

사람들은 정말 비슷한 것 같으면서도 의외의 곳에서 다르다.



글쎄, 웃고 있는 것만으로는 행복한지 아닌지 알기 어렵겠지만.

그닥 행복하게 느끼지 않는다해도 하루에 한 번 쯤은 크게 웃어주는 게 좋을 것 같긴하다.

기분이 너무 좋으면, 그냥 '흐흐흐'하고 웃어도 좋겠고,

기분이 좋지 않다면, 힘들더라도 입을 쫘악 벌리고 웃어봐야지.

'하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하하'

이렇게... ^_____________________________________________^




그래야 살지.

Wednesday, May 13, 2009

노예의 쇠사슬 자랑

노예가 노예로서의 삶에 너무 익숙해지면
놀랍게도 자신의 다리를 묶여있는 쇠사슬을 서로 자랑하기 시작한다.
어느 쪽의 쇠사슬이 빛나는가, 더 무거운가 등.

그리고 쇠사슬에 묶여있지 않은 자유인을 비웃기까지 한다.
하지만 노예들을 묶고 있는 것은 사실 한 줄에 쇠사슬에 불과하다.
그리고 노예는 어디까지나 노예에 지나지 않는다.

과거의 노예는, 자유인이 힘에 의하여 정복당해 어쩔 수 없이 노예가 되어버렸다.
그들은 일부 특혜를 받거나 한 자를 제외하면
노예가 되더라도 결코 그 정신의 자유까지도 양도하지는 않았다.
그 혈통을 자랑하고 선조들이 구축한 문명의 위대함을 잊지 않은 채, 빈틈만 생기면 도망쳤다.
혹은 반란을 일으키거나, 노동으로 단련된 강인한 육체로 살찐 주인을 희생의 제물로 삼았다.

그러나 현대의 노예는, 스스로 노예의 옷을 입고 목에 굴욕의 끈을 휘감는다.
그리고 무엇보다 놀랍게도, 현대의 노예는 스스로가 노예라는 자각이 없다.
뿐만 아니라 그들은 노예인 것을 스스로의 유일한 자랑거리로 삼기까지 한다.

(by 리로이 존스 1968년, NY할렘에서)

-----------------------------------------------
요 며칠사이에 이 곳 저 곳에서 여러 번 보게 된 글. 무슨 이유인지는 모르겠지만.

때로는... 그냥 자각하지 못하거나, 모르는 편이 낫기도 할 때도 있다.

그러면 쇠사슬 따위는 그냥 장식품에 지나지 않을 테니.

그게 노예의 쇠사슬임을 자각한 순간부터의 끝나지 않을 절망은, 몰랐을 때는 없으니까.

그래도, 알고도 모른 척 해야하는 것보다는 더 나을지도.

Thursday, April 30, 2009

April come she will

4월은 잔인한 달이라 했던가
무슨 징크스인지는 몰라도, 항상 4월은 힘들었던 기억.
지나고 나서 보면 4월이었던 것 같다.

올해 4월의 마지막 날.
풀먹인 듯 무거운 몸을 질질 끌면서 집에 와
멍하니 누워서 이런저런 잡생각.

누군가는 이 한 달이 행복했겠지.
누군가는 이 한 달이 지옥과도 같았으리라.
그저 이렇게 흘러가버린 것이 다행이려나.

이제 곧 5월.
어딘가의 블로그에서 본 "무서운" 이야기.
'벌써 올해의 삼분의 일이 지났다...'

아무 의미 없이 보낸 하루하루니까.
아마 내일도 모레도 그렇겠지만.
그것도 언젠가는 끝이 나겠지.


Sunday, April 26, 2009

That's What Friends Are For

가사가 참 좋은 노래.

노래 가사를 빌려서 하고 싶은 말.

늘 그렇게 행복하게 밝게 웃으렴
좋을 때나 나쁠 때나 항상 네 편일테니
늘 널 사랑하는 네 친구니까.

Dionne Warwick, Stevie Wonder, Luther Vandross & Whitney Houston