Archive for January, 2007

정태영

요새 matrix 연산을 이용한 프로그램 조각 몇 가지를 짜보고 있는데, mmx 같은 SIMD instruction 을 사용하면 matrix 연산의 속도를 확 올릴 수 있지 않을까 싶은 생각이 들길래 inline asm 을 이용해서 간단한 mmx 코드를 만들어보았습니다.

C:
  1. #include <stdio .h>
  2.  
  3. short s1[4] = { 1, 2, 3, 4 };
  4. short s2[4] = { 5, 6, 7, 8 };
  5. short d[4];
  6.  
  7. int main( int argc, char** argv ){
  8.  
  9.     d[0] = s1[0] * s2[0];
  10.     d[1] = s1[1] * s2[1];
  11.     d[2] = s1[2] * s2[2];
  12.     d[3] = s1[3] * s2[3];
  13.  
  14.     fprintf( stderr, "c: %d %d %d %d\n", d[0], d[1], d[2], d[3] );
  15.  
  16.     d[0] = d[1] = d[2] = d[3] = 0;
  17.  
  18.     asm("movq (s1), %mm0");
  19.     asm("movq (s2), %mm1");
  20.     asm("pmullw %mm1, %mm0");
  21.     asm("movq %mm0, (d)");
  22.  
  23.     fprintf( stderr, "asm: %d %d %d %d\n", d[0], d[1], d[2], d[3] );
  24.  
  25.     return 0;
  26.  
  27. }

위와 같은 코드를 작성하고, gcc mmx.c 를 통해 컴파일해서 돌려보니 간단히 성공 -_-v

c 코드를 사용할 경우 s1[0] load, s2[0] load, multiply, save to d[0] 와 같은 인스트럭션을 네 번 반복해서 실행하는 반면 mmx 를 사용할 경우 movq 를 통해 연속된 WORD 네 개를 mmx register 로 복사하고, pmullw 를 이용 4 개의 값을 한 인스트럭션에 연산을 하는 것을 통해 속도를 확 끌어올릴 수 있는거죠. ;)

다만 헷갈리는게 인텔의 메뉴얼에 나와있는 인자 순서와, AT&T 방식이 달라서 좀 헷갈리는군요.

  • Intel: movq mm0, [s1]
  • AT&T: movq (s1), %mm0

Intel 메뉴얼에서 설명하는 바에 의하면 첫번째 operland 가 destination 이 되고, 두번째 operland 가 destination 이 되는 반면 AT&T 방식에서는 거꾸로 첫번째 operland 가 src, 두번째 operland 가 dst 가 됩니다.

또한 주소값을 넘겨줄 때 intel 방식은 [] 로 감싸주면 되지만, AT&T 에서는 () 로 감싸줘야하고, 레지스터 이름 앞에 %를 붙여줘야 하는 규칙도 있어서 뭔가 대빵 귀찮네요. -_-;

참고로 gcc 에서 -masm=intel 옵션을 사용하면 intel 방식으로 어셈블리 명령어를 작성하는 것도 가능합니다.

p.s) movq 는 4개의 WORD 를 mmx register 로 복사하는 명령인데 --;; mm0 ~ mm7 식으로 64bit register name 을 써줘야 하는데 xmm0~xmm7 같은 sse 용 register 이름을 쓰는 바람에 잘못된 인스트럭션 사용이라고 계속 에러가나서 한참 헤맸네요;

정태영

어제 저녁 즈음부터 앞니가 조금씩 시리기 시작하더니 새벽에는 이가 너무 아퍼서 잠을 잘 수 없는 지경에 이르렀습니다.

아침에 일어나자마자 세수를 하고 치과에 갔다왔는데 이런!! 앞니를 떼어내고 (현재 앞니는 가짜이빨 ㅠ_ㅠ) 신경치료를 한 다음에 다시 해 넣어야 한다는군요. 치과 너무 무서운데 ㅠ_ㅠ

마음의 준비를 하기 위해 내일 아침에 다시 간다고 하고 나왔는데... 아 하늘이 노랗고 세상이 모두 어두워보이기 시작했습니다. -_-;

정태영

내 체형이 변하고 있다. 가끔 니트입은 상태로 옆모습을 거울에 비쳐보면 깜짝깜짝 놀랄 때가 있다; 멀리서 거울에 비쳐볼 때랑 가까이서 부분부분 비쳐볼 떄는 참 느낌이 다른 것 같다.

뭐 하튼 상체에 살이 상당히 많이 붙은 것 같다.

집 나오고 워낙 잘해먹고 살다보니 더 그런 것 같긴 하지만;; 몸무게도 한 4키로 정도 더 뿔었고, 예전처럼 하루 15끼를 먹어도 살이 안찌던 그런 모습을 사라진 듯... 이제 정말 다시 몸에 신경쓰기 시작해야될 때가 아닐까 싶다. -_-;;

방심하지 말자!! 아자!!!

p.s) E.T 형 체형으로 변하가고 있다는 얘기는 절대 아님!!

정태영

요새 아파치가 제 속을 썩이고 있습니다. 아무 로그도 남기지 않고 아파치가 먹통이 되는 일이 간간히 있었는데 왜 그런건지 알 수가 없으니 조치를 취하는게 쉽지가 않네요.

하여튼 원인을 알 수 없는고로! 차선책으로 apache watchdog 스크립트를 만들어 넣었습니다.

BASH:
  1. #!/bin/sh
  2.  
  3. TEST_URL="http://unfix.net/test.html"
  4.  
  5. while [[ `/usr/bin/curl -m 5 -s ${TEST_URL}` != "working" ]];do
  6.     /etc/init.d/apache restart
  7.     sleep 3
  8. done

대략 위와 같은 코드를 사용했는데 아파치를 죽여놓은 후 스크립트를 실행시킬 경우 정상적으로 아파치를 실행시키는 것으로 보아 잘 작동하는 것 같습니다. 휴~

그래도 한 몇일은 좀 신경써서 지켜봐야겠습니다.