ÀÌ°ÍÀº 1999³â ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸¿¡ ¿Ã·È´ø °­Á ÀÔ´Ï´Ù.

#####################################################

¾È³çÇϼ¼¿ä.. ¾È¿µ±âÀÔ´Ï´Ù.

´Ù¸§ ¾Æ´Ï¶ó À̹ø¿¡´Â MMX Technology ¸¦ ÀÌ¿ëÇÏ¿© 3D ¿¡ »ç¿ëµÇ´Â °í¼Ó Çà·Ä
¿¬»êÀ» ¼³¸íÇÏ°íÀÚ ÇÕ´Ï´Ù.

ÈçÈ÷ 3D °ÔÀÓÀ» ¸¸µé ¶§ °¡Àå ±âº»ÀÌ µÇ´Â ¿¬»êÀ̸ç È®´ë, Ãà¼Ò, À̵¿, °¢µµ
º¯È­µîµî¿¡ °ÉÃÄ ´Ù¿ëµµ·Î ¾²ÀÌ´Â ºÎºÐÀÔ´Ï´Ù.

MMX °¡ ź»ýÇÑ ¹è°æÀÌ ºü¸¥ Multimedia Áö¿øÀÌ´Ï ¸¹Å­ ÀÌ·±ÂÊ¿¡¼­µµ Áö¿øÀÌ
µÇ´Âµ¥¿ä...

ÀÌ¿¡, Á¦°¡ ¼Ò°³ ÇÏ°íÀÚ ÇÏ´Â ÆÁÀº MMX ¸¦ Äڵ带 ÀÌ¿ëÇÏ¿© ±× Çà·Ä °è»êÀ»
ºü¸£°Ô Çغ¸ÀÚ´Â ÀǵµÀÔ´Ï´Ù.

Ç®¼Ò½º¿¡ µé¾î°¡±â Àü¿¡ ÇÙ½É ºÎºÐ¸¸ Ãß·Áº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.


-------------------------------------------------------------------------

 >> MMX ÀÌ·Ð

±¸Ã¼ÀûÀÎ ¹æ½ÄÀ̶ó°í ¸»ÇÑ´Ù¸é MMX ¸í·É¾îÀÎ 'pmaddwd'¶ó´Â ¸í·É¾î¿¡ ÀÖ½À´Ï´Ù.
ÀÌ ¸í·É¾î´Â ¿©Å¸ÀÇ DSP Ĩ¿¡¼­¿Í °°ÀÌ °öÇÏ°í µ¿½Ã¿¡ ´õÇÏ´Â ¿¬»êÀ» ÇÕ´Ï´Ù.
                                     ~~~~~~~~~~~~~~~~~~~~~~~~~
±×¸®°í Çѹø¿¡ ÇϳªÀÇ °ö¼ÀÀÌ ¾Æ´Ñ µ¿½Ã¿¡ word Çü µ¥ÀÌÅÍ 4°³¸¦ °öÇÏ°í
´õÇÕ´Ï´Ù.

±×·¸´Ù¸é °¨ÀÌ ¿À½Ã°ÚÁÒ ?

3D °ÔÀÓ¿¡¼­ »ç¿ëÇÏ´Â Çà·ÄÀº 4-3 ¸¦ ÁÖ·Î »ç¿ëÇÏ°í 4-3 ³¢¸® °öÇÏ´Â ¿¬»êÀ»
Çϱâ À§Çؼ­ 4-4 Çà·Ä·Î È®ÀåÀ» Çؼ­ »ç¿ëÇÏ°Ô µË´Ï´Ù. ¹°·Ð ¸¶Áö¸· °ªÀº
Ç×»ó { 0, 0, 0, 1 }·Î µÓ´Ï´Ù.

( 4-3 °ú 4-3 ³¢¸®´Â Àý´ë °öÇØÁú¼ö ¾øÁÒ. °í±³ Á¤¼® ¼öÇРåÀ» Âü°í ÇϽñæ..)

±×¸®°í Á¦°¡ À̹ø¿¡ ½ÇÇèÇÏ°íÀÚ ÇÏ´Â Çà·Ä½ÄÀ» º»´Ù¸é...

  | x' |     |  a1  a2  a3  a0  | | x |
  | y' |  =  |  b1  b2  b3  b0  | | y |
  | z' |     |  c1  c2  c3  c0  | | z |
  | w' |     |  p1  p2  p3  p0  | | 1 |

ÀÌ·¸½À´Ï´Ù.. ¶ÇÇÑ,

        x' = a1 * x +  a2 * y + a3 * z + a0

·Î °è»êÀÌ µË´Ï´Ù.

»õ·Î¿î x ÁÂÇ¥ÀÎ x' ¸¦ °è»êÇϱâ À§Çؼ­´Â ÃÑ 8°³ÀÇ ÀÎÀÚ¸¦ ¦À» ¸ÂÃç
°öÇÏ°í ±× 4°³ÀÇ °ªÀ» ´õÇÏ´Â Çü½ÄÀÔ´Ï´Ù.

Áï ÀÌ ¹æ½ÄÀÌ ¹Ù·Î pmaddwd ¸í·É¾î¿Í µ¿ÀÏÇÏÁÒ ?

±×·³ pmaddwd ÀÇ ±¸Ã¼ÀûÀÎ µ¿ÀÛÀ» ¾ê±âÇØ º¸°Ú½À´Ï´Ù.

              1    2    3    4    5    6    7    8    <- °¢ byteº°

    mm0 =    (  w1  )  (  w2  )  (  w3  )  (  w4  )

    mm1 =    (  w1' )  (  w2' )  (  w3' )  (  w4' )

°¡ µé¾î ÀÖÀ» ¶§ ...

    pmaddwd mm0, mm1

À̶õ ¸í·ÉÀ» ½ÇÇàÇϸé..

              1    2    3    4    5    6    7    8    <- °¢ byteº°

    mm0 =    ( w1*w1' + w2*w2')  ( w3*w3' + w4*w4')

ÀÌ·¸°Ô word °¡ DWORD ·Î È®ÀåÀÌ µÇ¸é¼­ ´õÇØÁý´Ï´Ù.(mm0 ·¹Áö½ºÅÍ´Â 8bytesÂ¥¸®)

±×¸®°í »óÀ§ 4bytes ¿Í ÇÏÀ§ 4bytes ¸¦ ´õÇÏ¸é µÇ´Âµ¥..

    movq   mm1, mm0
    psrlq  mm1, 32
    paddd  mm0, mm1
    movd   eax, mm0

ÀÌ·¸°Ô Çϸé ÃÖÁ¾ °á°úÀÎ w1*w1' + w2*w2' + w3*w3' + w4*w4' °¡ eax ¿¡ µé¾î°¡°Ô
µË´Ï´Ù.

À§¿¡ ÀÖ´Â MMX ·¹Áö½ºÅͳ¢¸®ÀÇ ´ëÀÔÀ̳ª ½¬ÇÁÆ®´Â ¸ðµÎ 1 Ŭ·°¸¸ ¼ÒºñÇϹǷÎ
ºü¸¥ ¼Óµµ·Î Çà·Ä °è»êÀ» Çس¾¼ö°¡ ÀÖ´Â °ÍÀÔ´Ï´Ù.


-------------------------------------------------------------------------

 >> ±¸Ã¼ÀûÀÎ ÄÚµå·Î ¼³¸í

¾Æ·¡ÀÇ ÄÚµå´Â º¼·£µå C++ ºô´õ¿¡ ÀÇÇØ ÀÛ¼ºµÇ¾ú½À´Ï´Ù.
VC++ À¯ÀúµéÀº ¾à°£ÀÇ ¼öÁ¤À» ÇÏ¼Å¾ß ÇÒ°Ì´Ï´Ù.

À§ÀÇ ÇÔ¼ö´Â C = A * B ¶ó´Â Çà·ÄÀ» °è»êÇϱâ À§ÇØ ÀÓÀÇ·Î ¸¸µé¾îÁø ¿¹Á¦½ÄÀ̸ç
( A = 4*4,  B = 4*1,  C = 4*1 )

   short A[4][4];
   short B[4];
   short C[4];

   MMX_Matrix(A[0],B,C);

À§¿Í °°Àº ¹æ½ÄÀ¸·Î »ç¿ëÇϽøé C[] ¿¡ °á°ú°¡ µ¹¾Æ¿À´Â ¹æ½ÄÀÔ´Ï´Ù.

¿ø·¡ ¿ì¸®µéÀº ÀåȲÇÑ À̷к¸´Ù´Â ¼Ò½ºÄÚµåÀÇ ÁÖ¼®¿¡ ´õ »¡¸® ¸Ó¸®°¡ ¹ÝÀÀÇϹǷÎ
¹Ù·Î ¼Ò½º¿¡ ÁÖ¼®À» ´Ù´Â ½ÄÀ¸·Î ¼³¸íÇÏ°Ú½À´Ï´Ù.


void __fastcall MMX_Matrix(short *A, short *B, short *C)
{

   asm  mov     esi, eax        // A ÀÇ Æ÷ÀÎÅÍ ÁÖ¼Ò¸¦ esi¿¡

   asm  mov     ebx, edx        // B ÀÇ Æ÷ÀÎÅÍ ÁÖ¼Ò¸¦ ebx¿¡
   asm  movq    mm2, [ebx]      // mm2 ¿¡ B[]ÀÇ wordÇü Àμö 4°³¸¦ ÀúÀå

   asm  mov     edi, ecx        // C ÀÇ Æ÷ÀÎÅ͸¦ edi¿¡

   asm  pxor    mm4, mm4        // mm4 ·¹Áö½ºÅÍ ÃʱâÈ­
   asm  mov     eax, 0000FFFFh
   asm  movd    mm4, eax        // mm4 <- 0000 0000 0000 FFFF

   // 1 Çà
  asm  movq    mm0, [esi]      // A[0]ÀÇ 4°³ÀÇ wordÇü Àμö¸¦ ÀúÀå
   asm  movq    mm1, mm2        // mm1 À» B ÀÇ °ªÀ¸·Î

   asm  pmaddwd mm0, mm1        // ¹®Á¦ÀÇ ¿¬»ê, ¼³¸íÀº À§¿¡¼­ Çß´Ù..
   asm  movq    mm1, mm0        // ÇöÀç °öÇÏ°í ´õÇÑ °á°ú°¡ 4bytes¾¿ ºÐ¸®µÇ¾î
   asm  psrlq   mm1, 32         // ÀÖÀ¸¹Ç·Î »óÀ§¿Í ÇÏÀ§ 4bytes ¸¦ ´õÇؼ­
   asm  paddd   mm0, mm1        // mm0 ·¹Áö½ºÅÍ¿¡ ÀúÀå
   asm  pand    mm0, mm4        // mm3 ´Â ÇÏÀ§ 2bytes ¸¸ ³²°ÔÇÔ
   asm  movq    mm3, mm0        // mm3 ÀÇ C[0] À§Ä¡¿¡ ÀúÀå

   // 2 Çà
   asm  movq    mm0, [esi+8]    // A[2]ÀÇ 4°³ÀÇ wordÇü Àμö¸¦ ÀúÀå
   asm  movq    mm1, mm2

   asm  pmaddwd mm0, mm1
   asm  movq    mm1, mm0
   asm  psrlq   mm1, 32
   asm  paddd   mm0, mm1
   asm  pand    mm0, mm4
   asm  psllq   mm0, 16
   asm  por     mm3, mm0        // mm3 ÀÇ C[1] À§Ä¡¿¡ ÀúÀå

   // 3 Çà
   asm  movq    mm0, [esi+16]
   asm  movq    mm1, mm2

   asm  pmaddwd mm0, mm1
   asm  movq    mm1, mm0
   asm  psrlq   mm1, 32
   asm  paddd   mm0, mm1
   asm  pand    mm0, mm4
   asm  psllq   mm0, 32
   asm  por     mm3, mm0        // mm3 ÀÇ C[2] À§Ä¡¿¡ ÀúÀå

   // 3 Çà
   asm  movq    mm0, [esi+24]
   asm  movq    mm1, mm2

   asm  pmaddwd mm0, mm1
   asm  movq    mm1, mm0
   asm  psrlq   mm1, 32
   asm  paddd   mm0, mm1
   asm  pand    mm0, mm4
   asm  psllq   mm0, 48
   asm  por     mm3, mm0        // mm3 ÀÇ C[3] À§Ä¡¿¡ ÀúÀå

   asm  movq    [edi], mm3      // mm3 ÀÇ ³»¿ëÀ» C[] ¿¡ º¹»ç

   asm  emms                    // FPU »óÅ ºñ¿ò

}

pmaddwd ¸í·ÉÀÇ ¿ëµµ¸¸ ¾Ë¸é ½±°Ô ÀÌÇØ°¡ µÉ¸¸ÇÑ ³»¿ëÀ̶ó µû·Î ¼³¸íÀº ÇÏÁö
¾Ê°Ú°í 4°³ÀÇ ÇàÀ» °¢°¢ Ç®¾î¾´°ÍÀº ±×³ª¸¶ ¼Óµµ°¡ Á¶±ÝÀ̳ª¸¶ »¡¶óÁöÁö
¾Ê°Ú³ª¶ó´Â »ý°¢¿¡ ÇÑ°ÍÀ̸ç Æò¼Ò¶§ÀÇ °æÇèÀ¸·Î º¼¶§ 4¹øÀÇ ·çÇÁ·Î µ¹·Áµµ
¼Óµµ ÀúÇÏ´Â °ÅÀÇ ¾øÀ» °ÍÀ¸·Î º¸¾ÆÁý´Ï´Ù.


-------------------------------------------------------------------------

 >> ÆÛÆ÷¸Õ½º

ÀÏ´Ü °¡Àå Áß¿äÇÑ°Ô ¾ó¸¶³ª ºü¸£³Ä ? ¶ó´Â °ÍÀÔ´Ï´Ù.
ºü¸£Áö ¾Ê´Ù¸é ±¸Å¿© ÀÌ·±°ÍÀ» »ç¿ëÇÒ ÇÊ¿äµµ ¾ø°í »ç¿ëÇؼ­µµ ¾ÈµÉ°ÍÀÔ´Ï´Ù.

À§ÀÇ ÄÚµåÀÇ MMX_Matrix()¸¦ »ç¿ëÇÑ ·çƾÀº

   short A[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
   short B[4]    = {11,22,33,44};
   short C[4];

   DWORD StartTime = timeGetTime();

   for (int i = 0; i < 1000000; i++)
      MMX_Matrix(A[0],B,C);         // ±¸Ã¼ÀûÀÎ ¿ë¹ýÀÓ....

   Edit1->Text = IntToStr(timeGetTime() - StartTime);

¶ó´Â Äڵ带 ÅëÇØ (4*4) * (4*1) °è»êÀ» µ¿½Ã¿¡ 1000000¹ø ¼öÇà ÇÏ¿³°í,

ÀÏ¹Ý Çà·Ä°è»êÀº

void __fastcall Matrix(short *_A, short *B, short *C)
{

   short *A = _A;

   for (int i = 0; i < 4; i++) {
      C[i] = A[0] * B[0] + A[1] * B[1] + A[2] * B[2] + A[3] * B[3];
      A += 4;
   }
}

¶ó´Â ÇÔ¼ö·Î È£ÃâÇÏ°Ô Çß½À´Ï´Ù.
( ¿Ö ÃÖÀûÈ­°¡ ¾ÈµÇ¾ú³Ä±¸¿ä ? ´ç¿¬È÷ MMX¿Í ÃÖ´ëÇÑ ¼ÓµµÂ÷°¡ ³ª°Ô Çϱâ À§Çؼ­! )

±×¸®°í °á°ú´Â ´ÙÀ½°ú °°½À´Ï´Ù.

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


ÀÏ¹Ý Çà·Ä °è»ê½ÄÀ¸·Î °è»ê    :  1000000 ¹ø È£ÃâÇϴµ¥  Æò±Õ 0.483 ÃÊ
                                                       ~~~~~~~~~~~~~

MMX Çà·Ä °è»ê½ÄÀ¸·Î °è»ê:  1000000 ¹ø È£ÃâÇϴµ¥  Æò±Õ 0.222 ÃÊ
                                                       ~~~~~~~~~~~~~

( ÆæƼ¾ö 2 266MHz ¿¡¼­ Å×½ºÆ®.. )

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


¾à 2 ¹è ÀÌ»óÀÇ ¼º´É Çâ»óÀ» º¸ÀÌ´Â °ÍÀ¸·Î °á°ú°¡ ³ª¿Ô½À´Ï´Ù.

ÀÌÁ¦´Â ´Ü¼ø Çà·Ä °è»ê½ÄÀÎ À§ÀÇ ¹æ½ÄÀ» Àڽſ¡°Ô ¸Â´Â 3D ¿ë Çà·Ä °è»ê¿¡
Àû¿ë½ÃÅ°´Â ÀÏÀÌ ³²¾Ò±º¿ä..


±×¸®°í Æ®·çÄ÷¯¿¡¼­ MMX ¾ËÆÄ ºí·£µù ¿ª½Ãµµ À§ÀÇ ¼Ò½º¿Í °ÅÀÇ °°Àº °ÍÀ̹ǷÎ
±×°Í¿¡ ´ëÇÑ °­Á´ »ý·«Çϵµ·Ï ÇÏ°Ú½À´Ï´Ù..

±×·¸´Ù¸é ´ÙÀ½ °­Á´ Direct Music ÀÌ µÇ°Ú±º¿ä...

----------------------------------------------------------------------------

             " A Mountain is a mountain, Water is water "


                                              copyright SMgal 1999/05/28