ÀÌ°ÍÀº 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