애완동물을 좋아하는 것은 아니다. 아니 싫어한다고 하는 편이 맞을까.
아마도 어릴 적에 놀란 기억이 마음 속에 조그만 상처로 남아 그런지 모르겠다.
멀리 사바나의 초원을 달리는 사자나 코끼리가, 동물원에서 멀리 있는 기린이나 곰이,
어쩌면 눈 앞을 지나가는 강아지보다 더 친근할지도 모르는 그런 사람이 바로 나.
애완동물 프로그램도 그래서 잘 보진 않는데, 어쩌다 보게된 동물농장.
동물들과 커뮤니케이션한다는 '하이디'가 나오는 코너를 보고 정말일까 싶어서 보게 된 거지만.
덕분에 아주 오랫만에 눈물 대폭발.
텔레비전을 보고 훌쩍거리는 건 그닥 좋아하진 않지만 눈물이 줄줄 나는 건 어쩔 수 없었다.
'하이디'가 하고 있는 건 동물과 교감하는 특별한 능력이지만,
다른 사람과 이렇게 교감하는 건 더 어려운 일일지도 모르겠다.
마음 속에 상처를 가진 동물들의 마음을 열게 하는 것이 그녀의 특별한 능력.
하지만, 다른 사람들과 대화를 쉽게 할 수 있는 사람의 마음이란 게, 더 쉽게 열리는 건 아닌것 같다.
하이디가 특별한 능력을 가져서 그런 거겠지만.
커뮤니케이션의 기본은, 상대를 존중하고 먼저 마음을 열고 귀를 열고 듣는 것.
그렇지 않고 나는 이래 너는 이래야돼 라고 하는 것은 진짜 커뮤니케이션이 아니다.
마음이 열리지 않으면 기다리고, 상대를 먼저 이해하려고 애쓰는 것이 첫걸음인가보다.
쉽지 않은 일.
꽃님이 얘기를 보면서 또 한번 주룩주룩...
Monday, April 13, 2009
동물 커뮤니케이터
Sunday, April 12, 2009
Mac OS X/Eclipse CDT에서 CUDA 환경 설정
며칠동안 Mac OSX위에서 CUDA 작업환경을 만들려고 이리저리 해보았는데, 역시나 처음이라 그런지 이런저런 문제가 겹친다. 일단 하고 보니 그리 어려운 것은 아닌데, 역시나 처음 하는 일은 무엇이든 그리 쉽지가 않다. 다음에 같은 일을 또 하게 될 것 같은 불길한 예감에 잊지 않고자 posting해둔다.
OSX위에서 사용할 수 있는 C++ IDE는 Xcode나 Eclipse CDT 둘 중에 하나인 것 같은데, (물론 Vi나 emacs가 능숙하다면 그 쪽이 편하겠지만 항상 windows에서만 작업하다보니 둘 다 그리 편하지 않네.) Eclipse를 사용하기로 결정. 이유는, 우선 mac에서만 동작하는 GUI를 만들 생각이 없고, 차후에 linux위에서도 작업하게 될 것 같아서, 이왕이면 같은 IDE를 사용하는게 좋지 않을까 하는 생각에서다.
0. 컴파일러 설치
대부분의 경우에는 gcc, g++등의 컴파일러, 디버거들이 이미 설치되어 있겠지만 osx를 처음 설치했다면 깔려있지 않을 수도 있다. OSX DVD에 XCODE와 같이 들어있으므로 설치해주자. 최신의 xcode 패키지가 필요하다면 https://connect.apple.com/ 에서 다운로드 받는다. (등록필요)
1. CUDA 설치
아래의 링크에서 Toolkit과 sdk를 받아서 설치한다.
http://www.nvidia.com/object/cuda_get.html
MAC OSX의 경우에는 CUDA 전용의 드라이버가 없으므로 신경쓸 필요는 없다. (windows나 linux의 경우에는 같은 다운로드 페이지에서 내려 받아 툴킷 설치전에 설치.)
terminal작업을 위해 .bashrc나 .bash_profile에 library path를 설정한다. (설치 위치를 확인하고 알맞게 설정. 이 경우에는 toolkit이 /usr/local/cuda/에 설치 되었다. 필요하다면 sdk library위치도 확인해서 더 넣어주자.
export LD_LIBRARY_PATH=/usr/local/cuda/lib/
export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
1.1 sdk설치
sdk가 설치된 위치에 가서 (내 경우에는 /Developer/CUDA/) sample이 잘 만들어지는지 확인한다. make가 잘 되면 /Developer/CUDA/bin/darwin/release/에 executable이 주루룩 생긴다. 몇 개 실행해보아서 잘 되는지 확인하자.
2 CMAKE 설치
CMAKE는 cross platform build tool로 주어진 시스템에 적합한 makefile이나 IDE에 맞는 프로젝트를 생성한다. http://www.cmake.org/
설치방법은 위 링크를 따라가서 확인. 내 경우에는 macport로 설치했음.
sudo port install cmake
2.1 findCUDA.cmake 설치
아래의 링크를 참고해서 findCUDA.cmake파일을 받는다.
http://www.sci.utah.edu/~abe/FindCuda.html
svn repository에서 받은 후 ccmake로 makefile을 생성해본다. ccmake는 cmake를 메뉴 스타일로 활용할 수 있는 툴인데, 테스트를 위해서 CMAKE_BUILD_TYPE을 Release, CUDA_BUILD_TYPE은 Device로 setting하고 makefile을 만들어 본다. make가 제대로 되면 src밑에 test executable이 생기므로 동작하는지 확인. (아무 에러메시지도 안나오면 성공)
이제 cuda를 사용할 수 있는 cmake환경이 생겼으므로 테스트 프로젝트를 수정하든지 해서 작업을 할 수 있다.
3. Eclipse CDT 프로젝트 생성
cmake는 Eclipse CDT를 위한 프로젝트를 생성할 수 있으므로 다음과 같이 프로젝트와 makefile을 새성한다. (해당 디렉토리에 있는 경우)
ccmake -G"Eclipse CDT4 - Unix Makefiles" .
makefile이 잘 만들어졌는지 보고 make해본다. 문제가 안생기면 OK.
3.1 Eclipse로 import
Eclipse에서 File--Import--Select root directory로 생성된 프로젝트를 import한다. 빌드 후에 실행을 시켜보아서 잘 되면 OK.
하지만 다이나믹 라이브러리를 못찾는 에러가 발생하면, Project proerties -- Run/Debug Settings에 가서, launch configuration을 Edit. Environment탭에서 New를 누르고 "New Environment Variable"창이 뜨면 name에 DYLD_LIBRARY_PATH, value에 cuda library 위치를 넣는다. (여기서는 /usr/local/cuda/lib)
실행시켜보아 잘 되는지 확인. 실행도 잘되면 OK.
3.2 이미 만들어져있는 프로젝트에 findCUDA.cmake 설정
때로는 c로 작업을 한참 하던 프로젝트에 cuda feature를 넣고 싶은 경우가 생긴다. Visual studio의 경우에는 custom rule file을 설정하는 것으로 간단히 할 수 있는데, 이 경우에는 CMakeLists.txt파일을 고쳐서 사용한다. 이건 너무 당연한 거긴 하지만, 테스트 예제를 보고 따라하자.
간단히 설명하면 위에서 받은 findCUDA예제에서 /CMake 디렉토리를 통채로 복사하고, CMakeList.txt에
INCLUDE(${CMAKE_SOURCE_DIR}/CMake/cuda/FindCuda.cmake)
를 적당한 위치에 삽입해준다.
cuda를 라이브러리형태로 링크하게 되는 경우가 많은데 이때는 CMakeList.txt에
CUDA_ADD_LIBRARY(xxx_cuda_lib xxx_cuda.cu )
라는 식으로 라이브러리를 만들고
TARGET_LINK_LIBRARIES(xxx xxx_cuda_lib) 식으로 링크해주자.
Eclipse CDT 프로젝트 생성 및 다이나믹 링크 설정은 위와 동일.
Wednesday, April 8, 2009
신뢰
믿음, 신뢰라는 것은 아주 얇게 만들어진 크리스탈 글라스와 같아서
예쁘게 가꾸어 만들어 내는 것은 정말 오래 걸리고 힘들지만, 다 만들어지면 번쩍이며 빛이난다.
그렇지만, 너무도 사소한 실수로도 산산조각나 원래 어떤 모양이었는지 상상조차 하기가 힘들게 된다.
티없이 맑은 크리스탈을 만들어 내듯 조심조심 쌓아올렸던 신뢰가 깨어져 유리조각이 되는 건 한 순간.
그리고, 더 이상 다시 만들어 낼 수 없다.
크리스탈 잔과 다른 점은,
때로는 깨어지는 줄도 모르는 중 깨져버린다는 것.
가끔은 남아있는 잔 받침대만으로도 가치가 있을지 모르겠지만, 용도 폐기된 것에는 변함이 없어.
그렇게 하루하루 자신도 모르게 쌓아 나가고, 또 깨어 버리고 있는 것.
캔디
집에 오는 길에 문득 떠올라 부르면서 걸어온 노래. '들장미소녀 캔디'
아무 생각없이 부르다가 어... 이게 정말 은근 무서운 노래다.
가사를 보면서...
외로워도 슬퍼도 나는 안 울어
외롭고 슬프면 가끔 울어도 된다. 운다고 약한 사람인 건 아니니까.
참고 참고 또 참지 울긴 왜 울어
자꾸 참으면, 병생긴다. 홧병에는 약도 없다.
얘기해서 해결되는 건 얘기하고 자꾸 참는건 정신 건강에 좋지 않다.
스트레스가 만병의 근원임.
웃으면서 달려보자 푸른 들을
이 장면을 상상해보면 그저 정신이 나간 듯. 동막골의 강혜정이 생각나는...
푸른 하늘 바라보며 노래하는
머 노래정도는 봐 주기로 하자.
내 이름은 내 이름은 내 이름은 캔디
네네.
나 혼자 있으면 어쩐지 쓸쓸해 지지만
현실 인식. 친구가 있으면 같이 놀자. 눈이 얼굴 반만해서 잘생긴 남자도 많잖아.
그럴 땐 얘기를 나누자. 거울 속의 나하고
절대 금기 사항. 정신병의 시초임.
혼자 메신저 두 개 띄워놓고 한 두 시간동안 혼자 띠링띠링 나랑 챗하고 있으면 아 이렇게 사람이 미치는구나 하는 생각이 들지.
웃어라 웃어라 웃어라 캔디야
머 웃는 건 좋지만, 좋아서 웃어야지 억지로 웃는건 또 스트레스.
울면은 바보다 캔디 캔디야
아니라니까!!!
울고싶음 울어도 돼
그치?
쪼끔만 울지 머.
Monday, March 30, 2009
노희경 - 지금 사랑하지 않는 자
지금 사랑 하지 않는 자, 모두 유죄
나는 한때 나 자신에 대한 지독한 보호본능에 시달렸다.
사랑을 할 땐 더 더욱이 그랬다.
사랑을 하면서도 나 자신이 빠져나갈 틈을
여지없이 만들었던 것이다.
가령, 죽도록 사랑한다거나, 영원히 사랑한다거 나,
미치도록 그립다는 말은 하지 않았다.
내게 사랑은 쉽게 변질되는 방부제를 넣지 않은 빵과같고,
계절처럼 반드시 퇴색하며,
늙은 노인의 하루처럼 지루했다.
책임질 수 없는 말은 하지 말자.
내가 한 말에 대한 책임 때문에 올가미를 쓸 수도 있다.
가볍게 하자, 가볍게.
보고는 싶지 라고 말하 고,
지금은 사랑해라고 말하고, 변할 수도 있다고
끊임없이 상대와 내게 주입 시키자.
그래서 헤어질 땐 울고불고 말고 깔끔하게, 안녕.
나는 그게 옳은 줄 알았다.
그것이 상처받지 않고 상처주지 않는 일이라고 진정 믿었다.
그런 데, 어느 날 문득 드는 생각.
너, 그리 살아 정말 행복하느냐?
나는 행복하지 않았다.
죽도록 사랑하지 않았기 때문에 살만큼만 사랑했고,
영원 을 믿지 않았기 때문에 언제나 당장 끝이 났다.
내가 미치도록 그리워하지 않았기 때문에,
아무도 나를 미치게 보고싶어 하지 않았고,
그래서, 나는 행복하 지 않았다.
사랑은 내가 먼저 다 주지 않으면 아무것도 주지 않았다.
버리지 않으면 채워지지 않는 물잔과 같았다.
내가 아는 한 여자,
그 여잔 매번 사랑 할 때마다 목숨을 걸었다.
처음엔 자신의 시간을 온통 그에게 내어주고,
그 다음엔 웃음을 미래를 몸을 정신을 주었다.
나는 무모하다 생각했다.
그녀가 그렇게 모든 걸 내어주고 어찌 버틸까,
염려스러웠다.
그런데, 그렇 게 저를 다 주고도 그녀는 쓰러지지 않고,
오늘도 해맑게 웃으며 연애를 한다.
나보다 충만하게.
그리고 내게 하는 말,
나를 버리니, 그가 오더라.
그녀는 자신을 버리고 사랑을 얻었는데,
나는 나를 지키느라 나이만 먹었다.
사랑하지 않는 자는 모두 유죄다.
자신에게 사랑받을 대상 하나를 유기했으니
변명의 여지가 없다.
속죄하는 기분으로 이번 겨울도 난 감옥같은 방에 갇혀,
반성문 같은 글이나 쓰련다.
-------
어떤 이들에게는 가슴이 아린 고백이 될 글이지만,
또 어떤 이들에게는 멋들어진 수사들로 또 다시 자신을 감춘 그저 그런 잡문에 지나지 않을 글.
사실... 새로울 것은 하나도 없지 않은가?
공감하지 못했다면, 그런 경험이 없기 때문일 것이고, 진부하다 느꼈다면, 어쩌면, 기억하고 싶지 않은 기억이 얽혀있었거나, 너무 당연하다 생각할만큼 시니컬해져 버렸거나 그런 게 아닐까.
너무도 직설적으로 표현해서 보는 이를 불편하게하는 드라마와는 달리, 너무도 장식이 주렁주렁 달린 듯한 문체가 역시나 조금 불편하긴 하지만...
그래도... 얕은 눈이 내리는 3월 말의 어느 잠 못든 밤에는 왠지 어울려서 센치해져버렸네.
뭐가 그리도 두려웠는지, 이제야 조금은 이해가 갈 듯 말 듯.
모든 것을 걸고 도박을 하지 못하면 아무 것도 얻을 수 있는 게 없었던 거야.
공돌이스럽게 말하자면 all or nothing의 Trade-off랄까.
지나고 생각해보면, 애초에 블러핑이라 nothing or nothing인것 같지만...
행복이 손 끝에 왔다면, 손을 뻗어 잡아야 해.
항상 그 자리에 있는 것은 아니니까.
벼랑 끝에서 떨어질 위험은 감수해야하고서라도 잡아야지.
어짜피 도박이니까.
그래두 언젠가 그 말은 꼭 한번 하고 싶기도 하네... 민망할지도 모르겠지만.
네가 있어서 정말 다행이라고.
Thursday, March 26, 2009
Wednesday, March 25, 2009
그 자리에 없어서는 안 될 사람
서울고 한켠에 놓여진 김원규 교장 어록비.
'어디 가서나 그 자리에 없어서는 안 될 사람이 되라'
좌우명으로 삼아도 좋을 만한 좋은 글귀.
그런데... 어디 가서나 없어서는 안 될 사람은 커녕, 어디 한 곳에서라도 필요한 사람도 되지 못했네...
Tuesday, March 17, 2009
Monday, March 16, 2009
cudaMemcpy2D를 이용한 초간단 zero-padding
오랫만에 cuda 관련 포스트(지만 그닥 쓸모는 없어보인다.)
어떤 알고리즘을 구현하다보면 (특히 dsp알고리즘) 뒤에 0을 붙여주는 과정이 필요할 때가 생기는데, 이를 zero-padding이라 한다. 예를 들어 rgb데이터를 rgba데이터로 표시하고 싶다하면, 메모리상에는 linear로 rgbrgbrgbrgb... 이렇게 가지만, rgb0rgb0rgb0rgb0...이렇게 한 바이트씩 더 주고 싶은 경우라던가.
cpu에서 한다면 for문을 한개 돌려서 이런 식으로 할 수 있다.
mem=0, src=0;
for (int i=0; i< n; i++)
{
tempimg[mem++] = img1[src++];
tempimg[mem++] = img1[src++];
tempimg[mem++] = img1[src++];
tempimg[mem++] = 0; // padding zeros
}
cudaMemcpy2D를 이용하면 이것을 한 줄로 쓸 수 있다. 일단 cudaMemcpy2D 함수의 문법을 보면,
cudaError_t cudaMemcpy2D(void* dst, size_t dpitch, const void* src, size_t spitch, size_t width, size_t height, enum cudaMemcpyKind kind);
여기서 spitch와 dpitch를 다르게 주는 것으로 가능. 위의 for문은 간단히 이렇게 쓸 수 있다.
cudaMemcpy2D(tempimg, 4, img1, 3, 3, n, cudaMemcpyHostToHost);
주의할 점은, 한 줄로 간단히 쓴다고 해서 더 빠르다는 것은 아니라는 점. 실제로 for문을 돌리는 것이 더 빨랐더랬다. 그치만 gpu메모리에 다시 memcpy를 해야하는 경우라면 좀 다를지도 모르겠다.
(cuda 포럼에 가보면 cudaMemcpy2D 함수가 느리다는 불평이 꽤나 많음.)