Archive for January, 2007

정태영

오랫만에 ‘임금님 귀는 당나귀 귀~’ 라고 외치고 싶은 생각이 들어 글쓰기 버튼을 눌렀습니다.

제가 생각하는 저 자신과 남이 보는 나 자신은 큰 차이가 있는 것 같습니다. 뭐 물론 오해를 살만한 일들이 근래에 좀 많기도 하다보니 관련해서 할 말은 없지만 하튼 요새 신경쓰이는 일들이 좀 있네요.

전 개인적으로 누가 저한테 뭐라고 하는 걸 싫어하고, 해야할 일도 없는데, 의무감으로 제 시간을 낭비하도록 만드는 것을 좋아하지 않습니다. 집에 일찍 온다고 반겨주는 사람은 없지만 그래도 늦지 않은 시간에 귀가한 뒤 하루를 정리할 충분한 시간을 가지고 싶은데 요새 여건상 그게 잘 안되서 좀 속상합니다.

근래 제가 그리고 있는 꿈에 대해 많이 생각해보곤 합니다. 석사를 마치고 외국으로 나가 더 공부를 하고 싶은데, 아직 군대를 갔다오지 않았다보니 외국에서 박사를 할 경우 박사 특례를 받는 일이 어렵지 않을지라거나, 군대 연기가 가능한지… (삼수를 하다보니 나이가 아주 어리지만도 않아서) 집안 형편도 예전만큼 좋지 않은데 돈 문제는 어떻게 해결해야할 지 등 고민이 좀 많습니다. 군대 문제를 중간에 해결하기 위해 석사 특례를 하게 되면, 특례 기간이 끝나고 난 뒤 일을 그만두고 다시 공부를 시작하는게 쉽지 않을 거란 생각에 머릿 속이 더 복잡해지네요.

게다가 간섭 받는 것도 싫고 내 물건을 누가 건드리는 것도 싫고 해서 집을 나와 혼자 살고 있다보니 돈 들어가는 곳도 이래저래 많아서 그런 것 관련해서도 신경이 좀 쓰이고 있습니다.

저보다 먼저 대학원에 진학했던 형들의 얘기를 들었을 때 대부분 교수님께서 등록금을 지원해주시거나, 아니면 프로젝트비를 받으며 대학원을 다니는 것을 봐왔기 때문에 대학원 진학을 준비하면서 대학원에 붙고 나면 돈 걱정은 크게 안해도 되겠구나라고 생각하고 있었는데, 제가 들어온 랩의 경우는 등록금 지원이라거나 프로젝트비가 전혀 나오질 않아서 조금 아쉽네요. 사실 전 프로그래밍에 상당히 자신있고, 프로젝트를 하게 되면 배우는 것이 많다고 생각하기 때문에, 프로젝트비만 충분히 나온다면 정말 제 모든 걸 바쳐 열심히 프로젝트를 수행할 수 있는데 말이죠.

뭐 하튼 아직 대학원 진학에 대해선 후회도 없고, 제가 선택한 전공에 대해서도 후회는 없지만 하튼 이래저래 여러가지 아쉬운 점들이 있네요. 주위 사람들이 뒤에서 뭐라고 하건 크게 신경쓰지 않을 수 있도록 강해져야 겠습니다. -_-!

정태영

정말 요 근래 정신이 하나도 없는 것 같습니다. 이상하게 이래저래 저한테 이것 저것 부탁하시는 분들도 많고, 대학원 신입생 과제가 다음 주 월요일에 마감이라 그거 관련해서도 신경을 좀 쓰느라 머릿 속이 복잡하네요.

얼마 전에는 브릿지를 걸어놓은 앞니에 탈이 나서 씌워놓은 치아를 제거하고, 신경 치료에 들어갔습니다. 임시 치아를 붙여놓았지만, 떨어질까 무서워 앞니로 뭔가를 잘라먹지를 못하다보니 제약이 너무 많네요.

그리고 오늘 맥마당에 내보낼 특집 기사와 관련된 자료들을 마지막으로 넘겨줬는데, 마지막 디자인이 어떻게 나왔을 지 궁금하네요. 메일이 몇 번 유실되었기 때문이지만 저 때문에 잡지가 늦게 나오는 것 같아 왠지 모르게 죄송스럽습니다.

그나저나 글을 쓰는 건 정말 쉽지 않은 것 같습니다. 처음엔 한 달동안 4페이지 정도 쓰는 것 정도야 라고 생각을 했었지만, 대강 18~20 일쯤까지 원고를 넘기고 1주일 정도 수정을 하다보면 월 말이 다가오고 그 후 다시 1~2 주 만에 다음 달 기사를 준비해야 하는데, 이게 생각만큼 쉽지가 않네요.

뭐 하튼 얼마 전부터 시작된 랩 생활도 이제 슬슬 분위기 파악이 되가는 것 같네요. 거기서도 의도한 건 아니지만 랩에 출근하기 시작하고 얼마 되지 않아 아버지가 쓰러지시고, 제 이빨에 탈이 나는 바람에 본의 아니게 일찍 빠져나오거나, 출근하지 않는 일들이 있었는데 그거가지고 뒤에서 뭐라고들 하고 있을 것 같네요. 관련해서 이래저래 신경이 좀 쓰이다보니 또 피부 트러블이 생기기 시작했습니다. -_-

이래저래 정신이 없고, 머릿 속이 복잡하단 얘기를 어딘가 하고 싶어서 오랫만에 블로그에 글을 남기는 것 같습니다. 사람들 앞에서는 그냥 웃고 있으려고 노력하는데, 맨날 웃고만 있으니까 전 항상 기분이 좋아서 그렇게 웃고 장난치고 하는 거라고 생각하는 것 같아서 가끔 서운하기도 하고…

다 써놓고 보니까 무슨 말을 하고 싶은건지 모르겠네요 -_-;

정태영

작년 생일에 adsense 한 번씩 클릭해주는 센스를 발휘해달라는 포스트를 남긴 후 벌써 일 년이 흘렀나보군요. 홍익대학교에서의 마지막 한 해가 이젠 정말 얼마 남지 않았네요. 이제 홍익대학교와의 인연은 2월 22일에 있을 졸업식이 마지막이 될런지 모르겠습니다.

하여튼 또 한 살을 먹네요. :)

생일 날 안좋은 일이 있었던 기억이 좀 있다보니 요번 생일에도 별다른 기분나쁜 일 없이 좋게 넘어갈 수 있었음 좋겠다는 생각을 살짝 해봅니다.

그럼 오늘도 제 블로그를 찾아주시는 모든 분들에게 행운이 가득하길… ;)

정태영

그냥 요새들어 이상하게 신이 나질 않는다. 옛날에 이럴 땐 “씨발놈아” 같은 노래를 무한반복으로 틀어놓고 있으면 좀 나아지기도 했었는데… 이젠 그것도 별로 잘 안듣는거 같고…

흠 정말 별다른 일 없는 하루하루의 일상인데 왠지 모르게 우울하다…

정태영

조금 늦었지만 올해에도 뭔가 다짐을 해야할 것 같아서 ;)

  1. 불필요한 하드웨어에 돈을 투자하지 말기
  2. 술 줄이기
  3. 아침형 인간이 되기
  4. 적어도 한 달에 한 권 이상은 비전공 분야 서적을 읽기

지난 몇 년을 되돌아보면 돈을 꽤 벌었던 거 같기도 한데 막상 모은 돈은 별로 되지가 않는 것 같다. 대부분의 지출이 술과 하드웨어에 있었으니 술을 좀 줄이고, 꼭 필요하다고 생각되지 않는 부품을 사지 않는다면 어느정도 저축을 할 수 있을 거 같다는 생각이 들었다.

사실 여러가지 이유로 맥북이라거나 24인치 델 LCD 등이 땡기기는 하지만 (게다가 델 LCD 는 CJMALL 에서 6개월 무이자 할부까지 되는데…) 예전만큼 집에서 컴퓨터를 잡고 있을 시간이 많지 않을 거 같으니 LCD 는 좀 참아봐야겠다; 맥북은? 알루미늄 바디의 12~13인치 맥북이 나오기 전에는 좀 더 참아보자 아자!!

뭐 하튼 올 해 말에 다시 이 글을 봤을 때 위에 얘기했던 내용을 지켰다는 사실로 뿌듯해 할 수 있기를~

p.s) 그래도 iSight 는 중고로 꼭 구하자 아자!!

정태영

대강 생각을 해보니 정말 mmx 를 이용해서 빠르게 연산을 하려면 위와 같이 하는게 가장 빠르겠군요. 다만 레지스터를 많이 쓰고 완전히 asm 코딩을 해야한다는 게 조금 귀찮겠군요. ;)

위의 다이아그램에 있는 과정을 통해 4x4 matrix * 4x4 matrix 의 한 row 씩을 계산해낼 수 있습니다. 대강 계산했을 때 3배 이상의 속도 향상이 있을거라고 예상되던데 과연~

C:
  1. #include <stdio .h>
  2.  
  3. // A matrix
  4. short s1[16] = {
  5.      1234,
  6.      5678,
  7.      9, 10, 11, 12,
  8.     13, 14, 15, 16,
  9. };
  10.  
  11. // Transpose(B matrix)
  12. short s2[16] = {
  13.     17, 21, 25, 29,
  14.     18, 22, 26, 30,
  15.     19, 23, 27, 31,
  16.     20, 24, 28, 32
  17. };
  18.  
  19.  
  20. // Destination matrix
  21. short d[16];
  22.  
  23. int j, i;
  24. int main( int argc, char** argv ){
  25.  
  26.     __asm__("movq (s1), %mm0" );
  27.     __asm__("movq %mm0, %mm1" );
  28.     __asm__("movq %mm0, %mm2" );
  29.     __asm__("punpckhdq %mm2, %mm0" );
  30.     __asm__("punpckldq %mm2, %mm1" );
  31.  
  32.     __asm__("movq %mm0, %mm6");
  33.     __asm__("movq %mm1, %mm7");
  34.  
  35.     __asm__("movq (s2), %mm2" );
  36.     __asm__("mov $1, %eax" );
  37.     __asm__("movq s2(,%eax,8), %mm4");
  38.  
  39.     __asm__("movq %mm2, %mm3" );
  40.     __asm__("punpckhdq %mm4, %mm2");
  41.     __asm__("punpckldq %mm4, %mm3");
  42.  
  43.     __asm__("pmaddwd %mm2, %mm0");
  44.     __asm__("pmaddwd %mm3, %mm1");
  45.  
  46.     __asm__("paddw  %mm1, %mm0");
  47.  
  48.     __asm__("movq %mm6, %mm1");
  49.     __asm__("movq %mm7, %mm2");
  50.  
  51.     __asm__("mov $2, %eax" );
  52.     __asm__("movq s2(,%eax,8), %mm3" );
  53.     __asm__("mov $3, %eax" );
  54.     __asm__("movq s2(,%eax,8), %mm5");
  55.     __asm__("movq %mm3, %mm4" );
  56.     __asm__("punpckhdq %mm5, %mm3");
  57.     __asm__("punpckldq %mm5, %mm4");
  58.  
  59.     __asm__("pmaddwd %mm3, %mm1");
  60.     __asm__("pmaddwd %mm4, %mm2");
  61.     __asm__("paddw %mm2, %mm1");
  62.  
  63.     __asm__("packssdw %mm1, %mm0");
  64.     __asm__("movq %mm0, (d)");
  65.  
  66.     for( j = 0 ; j <4 ; j++ ){
  67.         for( i = 0 ; i <4 ; i++ ){
  68.             fprintf( stderr, "\t%3d", d[j*4+i] );
  69.         }
  70.         fprintf( stderr, "\n" );
  71.     }
  72.  
  73.     return 0;
  74.  
  75. }

코드로 옮기니 위와 같군요. 중간에 실수로 바이트오더를 헷갈려서 연산 결과가 뒤집혔었습니다. 정상적인 결과는 250 260 270 280 이 나와야 하는데 280 270 260 250 이 나와버리더군요. 아아 이거 다시 하고 싶은 작업이 아니네요;

흐흣 그래도 오랫만에 어셈블리 관련된 것들을 생각하고 있는데, 이것도 가끔 하니까 재밌네요. 근데 길어지면 할만하지 않다는거 -_-!

p.s) 전체 연산 코드를 보고 싶으시면 http://mytears.org/resources/mysrc/c/mmx.c 를 보시길 ;)

정태영

몇 일 전에 썼던 글에서 테스트를 해본 내용을 바탕으로 4x4 matrix multiply 연산을 mmx 를 이용해서 구현해봤습니다.

C:
  1. #include <stdio .h>
  2.  
  3. // A matrix
  4. short s1[16] = {
  5.      1234,
  6.      5678,
  7.      9, 10, 11, 12,
  8.     13, 14, 15, 16,
  9. };
  10.  
  11. // Transpose(B matrix)
  12. short s2[16] = {
  13.     17, 21, 25, 29,
  14.     18, 22, 26, 30,
  15.     19, 23, 27, 31,
  16.     20, 24, 28, 32
  17. };
  18.  
  19.  
  20. // Destination matrix
  21. short d[16];
  22. short t[4];
  23.  
  24. int i, j;
  25.  
  26. long start, end;
  27.  
  28. int main( int argc, char** argv ){
  29.  
  30.     int k;
  31.  
  32.     for( j = 0 ; j <4 ; j++ ){
  33.         for( i = 0 ; i <4 ; i++ ){
  34.             d[j*4+i] = 0;
  35.             for( k = 0 ; k <4 ; k++ ){
  36.                 d[j*4+i] += s1[j*4+k] * s2[i*4+k];
  37.             }
  38.         }
  39.     }
  40.  
  41.     fprintf( stderr, "c version\n\n" );
  42.     for( j = 0 ; j <4 ; j++ ){
  43.         for( i = 0 ; i <4 ; i++ ){
  44.             fprintf( stderr, "\t%3d", d[j*4+i] );
  45.         }
  46.         fprintf( stderr, "\n" );
  47.     }
  48.     return 0;
  49.  
  50. }

위와 같은 c version 의 코드를 작성한 후 아래와 같은 asm version 으로 컨버팅을 해봤는데, 100000 번 반복해서 연산을 하도록 해본 결과 mmx 버젼이 c 버젼보다 3배 정도 빠르게 연산을 하는 것을 확인할 수 있었습니다. (-O0 옵션과 함께 컴파일 했을 경우)

하지만 -O3 옵션과 함께 컴파일하게 되면 asm 버젼은 무한룹에 빠진 듯한 모습을 보여줬고, c 버젼의 수행속도가 -O0 로 컴파일한 asm 버젼보다 빠른 현상이 발생했습니다. 이유는 알 수 없음 -_-;

C:
  1. #include <stdio.h>
  2. #include <asm /mmx.h>
  3.  
  4. // A matrix
  5. short s1[16] = {
  6.      1234,
  7.      5678,
  8.      9, 10, 11, 12,
  9.     13, 14, 15, 16,
  10. };
  11.  
  12. // Transpose(B matrix)
  13. short s2[16] = {
  14.     17, 21, 25, 29,
  15.     18, 22, 26, 30,
  16.     19, 23, 27, 31,
  17.     20, 24, 28, 32
  18. };
  19.  
  20.  
  21. // Destination matrix
  22. short d[16];
  23. short t[4];
  24.  
  25. int i, j;
  26.  
  27. int main( int argc, char** argv ){
  28.     int loop;
  29.  
  30.     for( loop = 0 ; loop <10000; loop++ ){
  31.         for( j = 0 ; j <4 ; j++ ){
  32.  
  33.             for( i = 0 ; i <4 ; i++ ){
  34.  
  35.                 __asm__("mov j, %eax");
  36.                 __asm__("movq s1(,%eax,8), %mm0" );
  37.  
  38.                 __asm__("mov i, %eax");
  39.                 __asm__("movq s2(,%eax,8), %mm1" );
  40.  
  41.                 __asm__("pmullw %mm1, %mm0");
  42.                 __asm__("movq %mm0, (t)" );
  43.  
  44.                 d[j*4+i] = t[0] + t[1] + t[2] + t[3];
  45.             }
  46.         }
  47.     }
  48.     for( j = 0 ; j <4 ; j++ ){
  49.         for( i = 0 ; i <4 ; i++ ){
  50.             fprintf( stderr, "\t%3d", d[j*4+i] );
  51.         }
  52.         fprintf( stderr, "\n" );
  53.     }
  54.  
  55.     return 0;
  56.  
  57. }

8x8 matrix 는 뭔가 좀 더 생각해야할 것 같으니 나중에 정말 필요한 일 있을 때 구현을 해봐야겠습니다. -_-;

inline asm 작업을 하면서 eax 레지스터 값을 백업하지 않고 저렇게 사용해도 되는지는 잘 모르겠지만 --;; 하여튼 저 코드에 한해서는 별 문제 없으니 패스~ 꺄홋!!