´ÙÀ½ ÀÌÀü Â÷·Ê

4. ÇϳªÀÇ ·¹Áö½ºÅÍÀ§¿¡¼­ÀÇ SIMD(¿¹: MMX »ç¿ë)

´ÜÀÏ ·¹Áö½ºÅÍ ³»ÀÇ SIMD(SWAR)´Â »õ·Î¿î ¾ÆÀ̵ð¾î°¡ ¾Æ´Ï´Ù. k-ºñÆ® ·¹Áö½ºÅÍ, µ¥ÀÌÅÍ Æнº, ±×¸®°í ÇÔ¼ö À¯´Ö À» °¡Áö´Â ±â°è°¡ ÀÖÀ» ¶§ ÀÏ¹Ý ·¹Áö½ºÅÍ ¿¬»êµéÀÌ n°³ÀÇ k/n-ºñÆ®, Á¤¼ö ÇÊµå °ªµé À§¿¡¼­ SIMD º´·Ä ¿¬»êµé·Î ¼öÇàµÉ ¼ö ÀÖ´Ù´Â °ÍÀÌ ¿À·¡ÀüºÎÅÍ ¾Ë·ÁÁ® ¿Ô´Ù. ±×·¯³ª SWAR ±â¼úµé¿¡ ÀÇÇؼ­ Á¦°øµÇ´Â 2¹è¿¡¼­ 8¹è±îÁöÀÇ ¼Óµµ Áõ°¡°¡ ¸ÞÀνºÆ®¸² ÄÄÇ»Æÿ¡ ´ëÇÑ °ü½É»ç°¡ µÈ °ÍÀº ¿äÁòµé¾î ¸ÖƼ¹Ìµð¾î¿¡ ´ëÇÑ °­·ÄÇÑ Ãß¼¼¶§¹®ÀÌ´Ù. ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­µéÀÇ 1997 ¹öÀü ´ëºÎºÐÀº SWAR¿¡ ´ëÇÑ Çϵå¿þ¾î Áö¿øÀ» ´ã°í ÀÖ´Ù:

»õ·Î¿î ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­µé¿¡ ÀÇÇؼ­ Á¦°øµÇ´Â Çϵå¿þ¾î Áö¿ø¿¡´Â ¸î°¡Áö °áÇÔµéÀÌ ÀÖ°í ¾î¶² Çʵå Å©±âµé¿¡ ´ëÇؼ­ ¾î¶² ¿¬»êµé¸¸À» Áö¿øÇÏ´Â °Í°ú °°Àº ´ÜÁ¡ÀÌ ÀÖ´Ù. ±×·¯³ª ¸¹Àº SWAR ¿¬»êµéÀÌ È¿À²ÀûÀ̾î¾ß ÇÏ´Â Çϵå¿þ¾î Áö¿øÀÌ ÇÊ¿ä¾ø´Ù´Â °ÍÀ» ±â¾ïÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ¿¹¸¦ µé¾î¼­ ºñÆ®´ÜÀ§ ¿¬»êµéÀº ÇϳªÀÇ ·¹Áö½ºÅ͸¦ ³í¸®ÀûÀ¸·Î ºÐÇÒÇÏ´Â °Í¿¡ ÀÇÇؼ­ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù.

4.1 SWAR: ¾îµð¿¡ ÁÁÀº °ÍÀÌ°¡(What Is It Good For)?

ºñ·Ï ¸ðµç ÇöÀç ÇÁ·Î¼¼¼­µéÀÌ Àû¾îµµ ¾î´ø SWAR º´·Ä ±â´É(parallelism)°ú ÇÔ²² ¼öÇàÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù°í ÇÏ´õ¶óµµ °¡Àå ÁÁÀº SWAR-°³¼± ¸í·É ¼Âµéµµ ¾ÆÁÖ ÀϹÝÀûÀÎ-¸ñÀûÀÇ º´·Ä ±â´É(parallelism)À» Áö¿øÇÏÁö ¾Ê´Â´Ù´Â °ÍÀÌ ½½Ç »ç½ÇÀÌ´Ù. »ç½Ç, ¸¹Àº »ç¶÷µéÀÌ Pentium°ú "Pentium with MMX technology" »çÀÌÀÇ ¼öÇà ´É·Â Â÷ÀÌ°¡ ¿ì¿¬È÷µµ MMX¿Í µ¿½Ã¿¡ ³ªÅ¸³­ ´õ Å« L1 ij½¬¿Í °°Àº °Íµé ¶§¹®À̶ó°í »ý°¢ÇÑ´Ù. ±×·¸´Ù¸é SWAR(Áï MMX)´Â Çö½ÇÀûÀ¸·Î ¾îµð¿¡ ÁÁÀº °ÍÀΰ¡?

À̵éÀº ½É°¢ÇÑ Á¦¾àÁ¡µéÀÌÁö¸¸ ÀÌ·± ŸÀÔÀÇ º´·Ä 󸮴 ¸¹Àº º´·Ä ¾Ë°í¸®Áòµé¿¡¼­ ³ªÅ¸³ª´Â °ÍÀÌ´Ù - ¸ÖƼ¹Ìµð¾î ¾îÇø®ÄÉÀ̼ǵé»Ó¸¸ÀÌ ¾Æ´Ï°í. ¾Ë°í¸®ÁòÀÇ ÀûÀýÇÑ Å¸ÀÔ¿¡ ´ëÇؼ­ SWAR´Â SMP³ª Ŭ·¯½ºÅÍ º´·Ä 󸮺¸´Ù ÈξÀ È¿À²ÀûÀÌ´Ù... ±×¸®°í ÀÌ°ÍÀº ±×°ÍÀ» »ç¿ëÇÏ´Â µ¥ ¾î¶² Ãß°¡ ºñ¿ëµµ µéÁö ¾Ê´Â´Ù.

4.2 SWAR ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ¼Ò°³(Introduction To SWAR Programming)

SWARÀÇ ±âº» °³³ä(ÄÁ¼Á), ´ÜÀÏ ·¹Áö½ºÅÍ ¾È¿¡¼­ÀÇ SIMD, ´Â ¿öµå-±æÀÌ ·¹Áö½ºÅ͵é À§¿¡¼­ÀÇ ¿¬»êµéÀÌ n°³ÀÇ k/n-ºñÆ® ÇÊµå ¼öÄ¡µé¿¡ ´ëÇÑ SIMD º´·Ä ¿¬»êÀ» ¼öÇàÇÔÀ¸·Î½á °è»ê ¼Óµµ¸¦ ³ôÀÌ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ±×·¯³ª SWAR ±â¼úÀ» »ç¿ëÇÏ´Â °ÍÀº ´Ù¼Ò ¾î»öÇÒ ¼ö ÀÖÀ¸¸ç ¶ÇÇÑ ¾î¶² SWAR ¿¬»êµéÀº ½ÇÁ¦ ´ëÀÀµÇ´Â ÀÏ·ÃÀÇ ¼øÂ÷ÀûÀÎ ¿¬»êµéº¸´Ù, ±×µéÀÌ ÇÊµå ºÐÇÒÀ» ¼öÇàÇÏ´Â Ãß°¡ÀÇ ¸í·É¾îµéÀ» ¿ä±¸Çϱ⠶§¹®¿¡, ´õ °í ºñ¿ëÀÌ´Ù.

ÀÌ °üÁ¡À» ¿¹½ÃÇϱâ À§Çؼ­ »ó´çÈ÷ ´Ü¼øÈ­µÈ, °¢ 32-ºñÆ® ·¹Áö½ºÅÍ ¾È¿¡¼­ 4°³ÀÇ 8-ºñÆ® ÇʵåµéÀ» °ü¸®ÇÏ´Â, SWAR ¸ÞÄ«´ÏÁòÀ» »ý°¢Çغ¸µµ·Ï ÇÏÀÚ. µÎ ·¹Áö½ÃÅ͵é¾ÈÀÇ ¼öÄ¡µéÀº ´ÙÀ½°ú °°ÀÌ Ç¥ÇöµÉ ¼ö ÀÖ°Ú´Ù:


         PE3     PE2     PE1     PE0
      +-------+-------+-------+-------+
Reg0  | D 7:0 | C 7:0 | B 7:0 | A 7:0 |
      +-------+-------+-------+-------+
Reg1  | H 7:0 | G 7:0 | F 7:0 | E 7:0 |
      +-------+-------+-------+-------+

ÀÌ°ÍÀº ´Ü¼øÇÏ°Ô °¢ ·¹Áö½ºÅÍ°¡ ±âº»ÀûÀ¸·Î 4°³ÀÇ µ¶¸³ 8-ºñÆ® Á¤¼ö ¼öÄ¡µéÀÇ º¤ÅÍ·Î º¼ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¶Ç´Â Ç׸ñ 0 (PE0)¸¦ ó¸®ÇÏ´Â Reg0¿Í Reg1¿¡ ÀÖ´Â ¼öÄ¡µé·Î½á A¿Í E¸¦, ±×¸®°í PE1ÀÇ ·¹Áö½ºÅ͵鿡 ÀÖ´Â ¼öÄ¡µé·Î½á B°ú F¸¦, ±×¸®°í °è¼Ó ÀÌ·± ½ÄÀ¸·Î »ý°¢ÇÒ ¼ö ÀÖ´Ù.

ÀÌ ¹®¼­ÀÇ ³ª¸ÓÁö ºÎºÐÀº ÀÌ·± Á¤¼ö º¤Å͵鿡 ´ëÇÑ SIMD º´·Ä ¿¬»êÀ» À§ÇÑ ±âº» Ŭ·¡½ºµé°ú À̵éÀÇ ÇÔ¼öµéÀÌ ¾î¶»°Ô ±¸ÇöµÉ ¼ö ÀÖ´Â °¡¿¡ ´ëÇؼ­ ´ë·«ÀûÀ¸·Î ¸®ºäÇÒ °ÍÀÌ´Ù.

´ÙÇü¼º ¿¬»ê(Polymorphic Operations)

¾î¶² SWAR ¿¬»êµéÀº, ÀÌ ¿¬»êÀÌ ½ÇÁ¦ ÀÌ·± 8-ºñÆ® Çʵåµé¿¡ º´·Ä·Î ¼­·Î µ¶¸³ÀûÀ¸·Î °è»êµÇµµ·Ï ÀǵµµÇ¾ú´Ù´Â »ç½Ç¿¡ ½Å°æ¾²Áö ¾Ê°í¼­ ÀÏ¹Ý 32-ºñÆ® Á¤¼ö ¿¬»êµéÀ» »ç¿ëÇؼ­ ½±°Ô ¼öÇàµÉ ¼ö ÀÖ´Ù. ¿ì¸®´Â ÀÓÀÇÀÇ ÀÌ·± SWAR ¿¬»êµéÀ» ´ÙÇü¼º(polymorphic)À̶ó°í ºÎ¸¥´Ù. ¿Ö³Ä¸é ÀÌ ±â´ÉÀÌ Çʵå ŸÀÔµé(Å©±âµé)¿¡ ÀÇÇؼ­ ¿µÇâÀ» ¹ÞÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

ÀÓÀÇÀÇ Çʵ尡 ¿µÀÌ ¾Æ´Ñ°¡¸¦ Å×½ºÆ®ÇÏ´Â °ÍÀº ´ÙÇü¼ºÀÌ´Ù. ±×¸®°í ¸ðµç ºñÆ®´ÜÀ§ ³í¸® ¿¬»êµéµµ ±×·¸´Ù. ¿¹¸¦ µé¾î¼­ ÀÏ¹Ý ºñÆ®´ÜÀ§ and ³í¸® ¿¬»ê(CÀÇ & ¿¬»êÀÚ)Àº ºñÆ®´ÜÀ§·Î ¼öÇàÇÏ°í ±× Çʵå Å©±â°¡ ¾ó¸¶³ª µÇ´ÂÁö¿¡ ½Å°æ¾²Áö ¾Ê´Â´Ù. À§ ·¹Áö½ºÅ͵éÀÇ ´Ü¼øÇÑ ºñÆ®´ÜÀ§ and ¿¬»ê °á°ú´Â ´ÙÀ½°ú °°Àº °á°ú¸¦ ¸¸µé¾î ³½´Ù:


          PE3       PE2       PE1       PE0
      +---------+---------+---------+---------+
Reg2  | D&H 7:0 | C&G 7:0 | B&F 7:0 | A&E 7:0 |
      +---------+---------+---------+---------+

ºñÆ®´ÜÀ§ and ¿¬»êÀº Ç×»ó ¿¬»ê´ë»ó ºñÆ® k ¼öÄ¡µé¿¡ ÀÇÇؼ­¸¸ ¿µÇâÀ» ¹Þ´Â °á°ú ºñÆ® kÀÇ ¼öÄ¡¸¦ °¡Áö±â ¶§¹®¿¡ ¾î¶² Çʵå Å©±â¶óµµ µ¿ÀÏÇÑ ´ÜÀÏ ¸í·É¿¡ ÀÇÇؼ­ Áö¿ø¹Þ´Â´Ù.

ºÐÇÒµÈ ¿¬»ê(Partitioned Operations)

ºÒÇàÇÏ°Ôµµ ¸¹Àº Áß¿äÇÑ SWAR ¿¬»êµéÀÌ ´ÙÇü¼ºÀÌ ¾Æ´Ï´Ù. ´õÇϱâ, »©±â, °öÇϱâ, ³ª´©±â µî°ú °°Àº »çÄ¢¿¬»êµéÀº ¸ðµÎ Çʵåµé°£ÀÇ ÀÚ¸®¿Ã¸²(carry)/ºô·Á¿È(borrow) »óÈ£ÀÛ¿ëÀ» ÇÒ ¼ö¹Û¿¡ ¾ø´Ù. ¿ì¸®´Â ÀÌ·± SWAR ¿¬»êµéÀ» ºÐÇÒµÈ(partitioned) °ÍÀ̶ó°í ºÎ¸¥´Ù. ¿Ö³Ä¸é °¢ ¿¬»êÀÌ ¹Ýµå½Ã ¿¬»ê´ë»óµéÀ» È¿À²ÀûÀ¸·Î ºÐÇÒÇØ¾ß ÇÏ°í Çʵåµé °£ÀÇ »óÈ£ÀÛ¿ëÀ» ¸·¾Æ¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×·¯³ª ÀÌ·± È¿°ú¸¦ ¾ò´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ´Â ¼¼°¡Áö ¼­·Î ´Ù¸¥ ¹æ¹ýµéÀÌ Á¸ÀçÇÑ´Ù.

ºÐÇÒµÈ ¸í·É¾î(Partitioned Instructions)

ºÐÇÒµÈ ¿¬»êµéÀ» ±¸ÇöÇÏ´Â °¡Àå ¸í¹éÇÑ Á¢±Ù¹ýÀº Çʵåµé °£ÀÇ carry/borrow ³í¸®¸¦ ÀÚ¸£´Â "ºÐÇÒµÈ º´·Ä ¸í·É¾î"¿¡ ´ëÇÑ Çϵå¿þ¾î Áö¿øÀ» Á¦°øÇÏ´Â °ÍÀÌ´Ù. ÀÌ·± Á¢±ÙÀº ÃÖ°íÀÇ ¼º´ÉÀ» ³»Áö¸¸ ÇÁ·Î¼¼¼­ÀÇ ¸í·É ÁýÇÕÀ» º¯°æÇØ¾ß ÇÏ°í ÀϹÝÀûÀ¸·Î Çʵå Å©±â¿¡ ¸¹Àº Á¦ÇѵéÀÌ ÀÖ´Ù(¿¹, 8-ºñÆ® ÇʵåµéÀÌ Áö¿øµÉ ¼ö ÀÖÁö¸¸ 12-ºñÆ® ÇʵåµéÀº ±×·¸Áö ¸øÇÑ °æ¿ì).

AMD/Cyrix/Intel MMX, Digital MAX, HP MAX, ±×¸®°í Sun VIS´Â ¸ðµÎ ºÐÇÒ ¸í·ÉµéÀÇ Á¦ÇÑµÈ ¹öÀüµéÀ» ±¸ÇöÇÑ °ÍµéÀÌ´Ù. ºÒÇàÇÏ°Ôµµ ÀÌ·± ¼­·Î ´Ù¸¥ ¸í·É ¼Â È®ÀåµéÀº Áß¿äÇÑ ´Ù¸¥ Á¦¾àµéÀ» °¡Áö±â ¶§¹®¿¡ ±×µé°£¿¡ ¾Ë°í¸®ÁòµéÀÌ ¼­·Î Æ÷ÆÃµÉ ¼ö ¾ø°Ô ¸¸µç´Ù. ¿¹¸¦ µé¾î¼­ ´ÙÀ½°ú °°Àº ºÐÇÒµÈ ¿¬»êÀÇ »ùÇøµÀ» »ý°¢Çغ¸ÀÚ:


  Instruction           AMD/Cyrix/Intel MMX   DEC MAX   HP MAX   Sun VIS
+---------------------+---------------------+---------+--------+---------+
| Absolute Difference |                     |       8 |        |       8 |
+---------------------+---------------------+---------+--------+---------+
| Merge Maximum       |                     |   8, 16 |        |         |
+---------------------+---------------------+---------+--------+---------+
| Compare             |           8, 16, 32 |         |        |  16, 32 |
+---------------------+---------------------+---------+--------+---------+
| Multiply            |                  16 |         |        |    8x16 |
+---------------------+---------------------+---------+--------+---------+
| Add                 |           8, 16, 32 |         |     16 |  16, 32 |
+---------------------+---------------------+---------+--------+---------+

ÀÌ Å×ÀÌºí¿¡¼­ ¼ýÀÚµéÀº °¢ ¿¬»êÀÌ Áö¿øµÇ´Â Çʵå Å©±âµéÀ» ºñÆ® ´ÜÀ§·Î ³ªÅ¸³½ °ÍÀÌ´Ù. ºñ·Ï ÀÌ Å×À̺íÀÌ Á» ´õ ÈǸ¢ÇÑ °ÍµéÀ» Æ÷ÇÔÇÑ ¸¹Àº ¸í·ÉµéÀ» »ý·«ÇÑ °ÍÀ̱â´Â ÇÏÁö¸¸ ¸¹Àº Â÷ÀÌ°¡ ÀÖ´Ù´Â °ÍÀº ºÐ¸íÇÑ »ç½ÇÀÌ´Ù. ÀÌÀÇ Á÷Á¢ÀûÀÎ °á°ú´Â °í-¼öÁØ ¾ð¾îµé(High-Level Languages; HLLs)°¡ ½ÇÁ¦·Î ÇÁ·Î±×·¡¹Ö ¸ðµ¨·Î½á ¾ÆÁÖ ÀûÇÕÇÑ °ÍÀº ¾Æ´Ï´Ù¶ó´Â °Í°ú Æ÷ÆÃÀÌ ÀϹÝÀûÀ¸·Î ¾ÆÁÖ ³ª»Ú´Ù´Â °ÍÀÌ´Ù.

±³Á¤ Äڵ带 °¡Áö´Â ºÐÇÒµÇÁö ¾ÊÀº ¿¬»ê(Unpartitioned Operations With Correction Code)

ºÐÇÒ ¸í·É¾îµéÀ» »ç¿ëÇؼ­ ºÐÇÒ ¿¬»êµéÀ» ±¸ÇöÇÏ´Â °ÍÀº ºÐ¸íÈ÷ È¿À²ÀûÀÏ ¼ö ÀÖÁö¸¸ ÇÊ¿äÇÑ ºÐÇÒ ¿¬»êÀÌ Çϵå¿þ¾î¿¡ ÀÇÇؼ­ Áö¿øµÇÁö ¾ÊÀ¸¸é ¾î¶»°Ô ÇÒ °ÍÀΰ¡? ÇØ´äÀº Çʵ尣 carry/borrowÀ» °¡Áø ¿¬»êµéÀ» ÀÏ¹Ý ¸í·É¾îµéÀ» »ç¿ëÇؼ­ ¼öÇàÇÏ°í ¿øÇÏÁö ¾Ê´Â ÇÊµå »óÈ£ÀÛ¿ëÀ» ±³Á¤ÇÏ´Â °ÍÀÌ´Ù.

ÀÌ°ÍÀº ¼øÀüÈ÷ ¼ÒÇÁÆ®¿þ¾î·Î Á¢±ÙÇÏ´Â °ÍÀÌ°í ±³Á¤ÀÛ¾÷Àº ¿À¹öÇìµå¸¦ ÀÏÀ¸Å°Áö¸¸ ¿ÏÀüÈ÷ ÀϹÝÀûÀÎ ÇÊµå ºÐÇÒ·Î Àß ÀÛµ¿ÇÑ´Ù. ÀÌ·± Á¢±Ù¹ýÀº ºÐÇÒ ¸í·É¿¡ ´ëÇÑ Çϵå¿þ¾î Áö¿øÀÇ °¸µéÀ» ä¿ì´Â µ¥ »ç¿ëµÉ ¼ö Àְųª ¾Æ´Ï¸é Çϵå¿þ¾î Áö¿øÀ» ÀüÇô ÇÏÁö ¾Ê´Â Ÿ°Ù ±â°èµé¿¡ ´ëÇؼ­ ¿ÏÀüÇÑ ±â´ÉÀ» Á¦°øÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù´Â Á¡¿¡¼­ ¶ÇÇÑ ¿ÏÀüÈ÷ ÀϹÝÀûÀÌ´Ù. »ç½Ç C¿Í °°Àº ¾ð¾î·Î ÄÚµå ½ÃÄö½ºµéÀ» Ç¥ÇöÇÔÀ¸·Î½á ÀÌ·± Á¢±Ù¹ýÀº SWAR ÇÁ·Î±×·¥µéÀÌ ¿ÏÀüÈ÷ Æ÷Æà °¡´ÉÇÑ °ÍÀ¸·Î ¸¸µç´Ù.

±×·¸´Ù¸é ´ÙÀ½°ú °°Àº Áú¹®ÀÌ ¹Ù·Î »ý±ä´Ù: ºñºÐÇÒ ¿¬»êµéÀ» ±³Á¤ ÄÚµå·Î SWAR ºÐÇÒ ¿¬»êµéÀ» ½Ã¹°·¹À̼ÇÇÏ´Â °ÍÀÌ Á¤È®È÷ ¾ó¸¶³ª ºñÈ¿À²ÀûÀΰ¡? ±Û½ê ÀÌ°ÍÀº È®½ÇÈ÷ $64k ¹®Á¦ÀÌ´Ù... ÇÏÁö¸¸ ¸¹Àº ¿¬»êµéÀÌ ¿¹»óÇÏ´Â °Í¸¸Å­ ¾î·Á¿î °ÍÀº ¾Æ´Ï´Ù.

ÀϹÝÀûÀÎ 32-ºñÆ® ¿¬»êµéÀ» »ç¿ëÇؼ­ ³×°³ÀÇ ¼ººÐÀ» °¡Áö´Â 8-ºñÆ® Á¤¼ö º¤ÅÍµé µÎ°³¸¦ ´õÇÏ´Â °Í, x+yÀ» »ý°¢Çغ¸ÀÚ.

ÀϹÝÀûÀÎ 32-ºñÆ® µ¡¼ÀÀº ½ÇÁ¦·Î Á¤È®ÇÑ °á°ú¸¦ ¸¸µéÁö¸¸ 8-ºñÆ® Çʵåµé Áß Çϳª¶óµµ ´ÙÀ½ Çʵå·Î ij¸®(ÀÚ¸® ¿Ã¸²)¸¦ ¸¸µç´Ù¸é Á¤È®ÇÑ °á°ú¸¦ ¸¸µé¾î³»Áö ¸øÇÑ´Ù. ±×·¡¼­ ¿ì¸®ÀÇ ¸ñÀûÀº ´Ü¼øÇÏ°Ô ±×·± ij¸®°¡ ÀϾÁö ¾Êµµ·Ï º¸ÀåÇÏ´Â °ÍÀÌ´Ù. µÎ°³ÀÇ k-ºñÆ® ÇʵåµéÀ» ´õÇÏ´Â °ÍÀº ¸¹¾Æ¾ß k+1 ºñÆ® °á°ú¸¦ ¸¸µé¾î ³»±â ¶§¹®¿¡ ¿ì¸®´Â °¢ ÇʵåÀÇ msb(most significant bit)¸¦ ´Ü¼øÈ÷ "¸¶½ºÅ· Á¦°Å(masking out)"ÇÔÀ¸·Î½á ¾î¶² ij¸®µµ ¹ß»ýÇÏÁö ¾Êµµ·Ï º¸ÀåÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº 0x7f7f7f7f·Î °¢ ÇÇ¿¬»êÀÚ¸¦ ºñÆ®´ÜÀ§ and(bitwise anding)ÇÏ°í ³ª¼­ ÀÏ¹Ý 32-ºñÆ® ´õÇϱ⸦ ¼öÇàÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù.


t = ((x & 0x7f7f7f7f) + (y & 0x7f7f7f7f));

ÀÌ °á°ú´Â Á¤È®ÇÏ´Ù... °¢ ÇʵåÀÇ msb¸¦ Á¦¿ÜÇÏ°í ¸»ÀÌ´Ù. °¢ Çʵ忡 ´ëÇؼ­ ±³Á¤°ªÀ» °è»êÇغ¸ÀÚ. ÀÌ°ÍÀº, x¿Í yÀÇ msbµéÀ» t¿¡ ´ëÇؼ­ °è»êµÈ 7-ºñÆ® ij¸® °á°ú¿¡ µÎ °³ÀÇ 1-ºñÆ® ºÐÇÒµÈ µ¡¼ÀÀ» ÇÏ´Â ¹®Á¦¿¡ Áö³ªÁö ¾Ê´Â´Ù. ´ÙÇེ·´°Ôµµ 1-ºñÆ® ºÐÇÒ µ¡¼ÀÀº ÀÏ¹Ý exclusive or ¿¬»êÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Ù. ±×·¡¼­ ±× °á°ú´Â ´ÙÀ½°ú °°´Ù:


(t ^ ((x ^ y) & 0x80808080))

ÁÁ´Ù, ±Û½ê, ÀÌ°ÍÀº ±×·¸°Ô ´Ü¼øÇÑ °ÍÀÌ ¾Æ´Ò ¼ö ÀÖ´Ù. °á±¹ 4°³ÀÇ µ¡¼ÀÀ» À§Çؼ­ 6¹ø ¿¬»êÀ» ¼öÇàÇÑ´Ù. ±×·¯³ª ¿¬»êÀÌ È½¼ö´Â Çʵ尡 ¸î°³Àΰ¡¿¡ µû¶ó ´Ù¸£Áö ¾Ê´Ù´Â °ÍÀ» ÁÖ¸ñÇÏÀÚ. ±×·¡¼­ Á» ´õ ¸¹Àº ÇʵåµéÀÌ ÀÖÀ¸¸é ¿ì¸®´Â ¼Óµµ Çâ»óÀ» ¾òÀ» ¼ö ÀÖ´Ù. »ç½Ç ÇʵåµéÀÌ ´ÜÀÏ ¿¬»ê(Á¤¼ö º¤ÅÍ)À¸·Î ·ÎµåµÇ°í ÀúÀåµÇ¾ú±â ¶§¹®¿¡, ¿ì¸®´Â ¾î¶² ½ÄÀ¸·Îµç ´Ü¼øÇÏ°Ô ¼Óµµ Çâ»óÇÒ ¼ö ÀÖÀ¸¸ç, ·¹Áö½ºÅÍ °¡¿ë¼ºÀº °³¼±µÉ ¼ö ÀÖ°í, µ¿Àû ÄÚµå ½ºÄÉÁÙ¸µ Á¾¼Ó¼ºÀÌ ´õ Àû´Ù(ºÎºÐ ¿öµå ÂüÁ¶¸¦ ÇÇÇÒ ¼ö Àֱ⠶§¹®¿¡).

ÇÊµå ¼öÄ¡ Á¦¾î(Controlling Field Values)

ºÎºÐ ¿¬»ê ±¸Çö¿¡ ´ëÇÑ ´Ù¸¥ µÎ°¡Áö Á¢±Ù¹ý µÑ ´Ù ·¹Áö½ºÅ͵鿡 ´ëÇÑ °ø°£ È°¿ëÀ» ÃÖ´ëÈ­ÇÏ·Á°í ÇÏ´Â ¹Ý¸é¿¡, ´ë½Å ÇÊµå °ªµéÀ» Á¦¾îÇؼ­ ³»ºÎ-Çʵå ij¸®/ºô¸² À̺¥Æ®µéÀÌ Àý´ë ÀϾÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀÌ Á» ´õ °è»ê Ãø¸é¿¡¼± È¿À²ÀûÀÌ´Ù. ¿¹¸¦ µé¾î¼­ ¿ì¸®°¡ ´õÇØÁø ¸ðµç ÇÊµå °ªµéÀÌ ¾î¶² ÇÊµå ¿À¹öÇ÷ο쵵 ÀϾÁö ¾Ê´Â´Ù´Â °ÍÀ» ¾È´Ù¸é ºÎºÐ ´õÇϱ⠿¬»êÀº ÀϹÝÀûÀÎ ´õÇϱ⠸í·ÉÀ» »ç¿ëÇؼ­ ±¸ÇöµÉ ¼ö ÀÖ´Ù; »ç½Ç ÀÌ·± Á¦ÇÑÀÌ ÁÖ¾îÁö¸é ÀϹÝÀûÀÎ ´õÇϱ⠿¬»êÀÌ ´ÙÇü¼º(¿ªÀÚÁÖ: Çʵå Å©±â¿¡ µ¶¸³ÀÌ´Ù)ÀÎ °Íó·³ º¸ÀÌ°í ±³Á¤ ÄÚµå ¾øÀÌ ¾î¶² Çʵå Å©±âµé¿¡µµ »ç¿ë °¡´ÉÇÏ´Ù. ±×·¡¼­ ¾î¶»°Ô ÇÊµå °ªµéÀÌ Ä³¸®/ºô¸² À̺¥Æ®¸¦ ¹ß»ý½ÃÅ°Áö ¾Êµµ·Ï º¸ÀåÇÒ ¼ö Àִ°¡°¡ °ü°ÇÀÌ µÈ´Ù.

ÀÌ·± Ư¼ºÀ» º¸ÀåÇÏ´Â ÇÑ °¡Áö ¹æ¹ýÀº ÇÊµå °ªµéÀÇ ¹üÀ§¸¦ Á¦ÇÑÇÒ ¼ö ÀÖ´Â ºÎºÐÈ­µÈ ¸í·ÉµéÀ» ±¸ÇöÇÏ´Â °ÍÀÌ´Ù. Digital MAX º¤ÅÍ minimum°ú maximum ¸í·ÉµéÀº ³»ºÎ-Çʵå ij¸®/ºô¸²À» ÇÇÇϱâ À§Çؼ­ ÇÊµå °ªµéÀ» Ŭ¸³ÇÎ(¿ªÀÚÁÖ: ÀÚ¸§)ÇÏ´Â Çϵå¿þ¾îÀûÀÎ Áö¿øÀÌ´Ù.

±×·¯³ª ¿ì¸®°¡ ÇÊµå °ªµéÀÇ ¹üÀ§¸¦ È¿°úÀûÀ¸·Î Á¦ÇÑÇÒ ¼ö ¾ø´Â ºÎºÐÈ­µÈ ¸í·ÉµéÀ» °¡ÁöÁö ¸øÇÑ´Ù°í °¡Á¤ÇÏÀÚ... °©½Î°Ô ij¸®/ºô¸² À̺¥Æ®µéÀÌ ÀÎÁ¢ Çʵåµé »çÀÌ¿¡ °£¼·ÇÏÁö ¾Ê´Â´Ù°í º¸ÀåÇϵµ·Ï ÇÒ ¼ö ÀÖ´Â ÃæºÐÇÑ Á¶°ÇÀÌ Àִ°¡? ÀÌÀÇ ÇØ´äÀº »çÄ¢¿¬»ê Ư¼ºÀÇ ºÐ¼®¿¡ ÀÖ´Ù. µÎ k-ºñÆ® ¼ýÀÚµéÀ» ´õÇÏ´Â °ÍÀº ¸¹¾Æ¾ß k+1 ºñÆ®·Î µÈ ¼ýÀÚ¸¦ »ý¼ºÇÑ´Ù; ±×·¡¼­ k+1 ºñÆ®´Â ÀÏ¹Ý ¸í·ÉµéÀ» »ç¿ëÇÔ¿¡µµ ºÒ±¸ÇÏ°í ±×·± ¿¬»êÀ» ¾ÈÀüÇÏ°Ô ´ãÀ» ¼ö ÀÖ´Ù.

±×·¡¼­ ¿ì¸®ÀÇ ÀÌÀü ¿¹Á¦¾È¿¡¼­ 8-ºñÆ® ÇʵåµéÀÌ ÀÌÁ¦´Â 1-ºñÆ®ÀÇ "ij¸®/ºô¸² ¿ÏÃæ±â(spacers)"¸¦ °¡Áö´Â 7-ºñÆ® ÇʵåµéÀ̶ó°í °¡Á¤ÇÏÀÚ:


              PE3          PE2          PE1          PE0
      +----+-------+----+-------+----+-------+----+-------+
Reg0  | D' | D 6:0 | C' | C 6:0 | B' | B 6:0 | A' | A 6:0 |
      +----+-------+----+-------+----+-------+----+-------+

7-ºñÆ® µ¡¼ÀÀÇ º¤ÅÍ´Â ´ÙÀ½°ú °°ÀÌ ¼öÇàµÈ´Ù. ¾î¶² ºÎºÐ ¿¬»êÀ» ½ÃÀÛÇϱâ ÀÌÀü¿¡ ¸ðµç ij¸® ¿ÏÃæ ºñÆ®µé(A', B', C', ±×¸®°í D')°¡ 0À̶ó´Â °ªÀ» °®´Â´Ù°í °¡Á¤ÇÏÀÚ. ´Ü¼øÇÏ°Ô ÀÏ¹Ý µ¡¼À ¿¬»êÀ» ¼öÇàÇÔÀ¸·Î½á ¸ðµç ÇʵåµéÀº Á¤È®ÇÑ 7-ºñÆ® °ªµéÀ» ¾ò´Â´Ù; ±×·¯³ª ¾î¶² ¿ÏÃæ ºñÆ® °ªµéÀº ÀÌÁ¦ 1ÀÌ µÉ ¼ö ÀÖ´Ù. ¿ì¸®´Â ÀÌ°ÍÀ» ÀüÅëÀûÀÎ ¿¬»êÀÎ ¿ÏÃæ ºñÆ®µé¿¡ ´ëÇÑ ¸¶½ºÅ©-Á¦°Å¸¦ Çѹø ´õ ¼öÇàÇÔÀ¸·Î½á ±³Á¤ÇÒ ¼ö ÀÖ´Ù. ¿ì¸®ÀÇ 7-ºñÆ® Á¤¼ö º¤ÅÍ µ¡¼À, x+yÀº ±×·¡¼­ ´ÙÀ½°ú °°´Ù:


((x + y) & 0x7f7f7f7f)

ÀÌ°ÍÀº ³×°³ÀÇ µ¡¼ÀÀ» µÎ ¸í·É¾î·Î ÁÙÀÎ °ÍÀÌ´Ù. ±×·¡¼­ ÀÌ°ÍÀº ÁÁÀº ¼Óµµ Çâ»óÀ» ºÐ¸íÈ÷ °¡Á®¿Ã °ÍÀÌ´Ù.

ÁÖÀÇ ±íÀº µ¶ÀÚ(sharp reader)´Â ¿ÏÃæ ºñÆ®µéÀ» 0À¸·Î ¼³Á¤ÇÏ´Â °ÍÀº »©±â ¿¬»ê¿¡¼­ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ´«Ä¡Ã«À» °ÍÀÌ´Ù. ±×·¯³ª ±× ±³Á¤ ¹æ¹ýÀÌ ¾ÆÁÖ ´Ü¼øÇÏ´Ù. x-y¸¦ °è»êÇϱâ À§Çؼ­ ¿ì¸®´Â x¿¡ ÀÖ´Â ¿ÏÃæ ºñÆ®µéÀº ¸ðµÎ 1ÀÌ°í y¿¡ ÀÖ´Â ¿ÏÃæ ºñÆ®µéÀº ¸ðµÎ 0À̶ó´Â Ãʱâ Á¶°ÇÀ» È®½ÇÇÏ°Ô ÇÑ´Ù. °¡Àå ³ª»Û °æ¿ì¿¡ ¿ì¸®´Â ´ÙÀ½°ú °°Àº °ÍÀ» ¾òÀ» °ÍÀÌ´Ù:


(((x | 0x80808080) - y) & 0x7f7f7f7f)

±×·¯³ª Ãß°¡ÀÇ ºñÆ®º° or ¿¬»êÀº Á¾Á¾, xÀÇ °ªÀ» »ý¼ºÇÏ´Â ¿¬»êÀÌ & 0x7f7f7f7f ´ë½Å¿¡ | 0x80808080À» ¸¶Áö¸· ½ºÅÜÀ¸·Î½á »ç¿ëÇÑ´Ù´Â °ÍÀ» È®½ÇÇÏ°Ô ÇÔÀ¸·Î½á, ÃÖÀûÈ­µÉ ¼ö ÀÖ´Ù.

¾î¶² ¹æ¹ýÀÌ SWAR ºÎºÐÈ­µÈ ¿¬»êµé¿¡ ´ëÇؼ­ »ç¿ëµÇ¾î¾ß ÇÒ °ÍÀΰ¡? ±× ´äÀº ´Ü¼øÇÏ°Ôµµ "°¡Àå ºü¸¥ ¼Óµµ(Çâ»ó)À» ³»´Â °ÍÀÌ¸é ¹«¾ùÀÌµç µÈ´Ù"´Â °ÍÀÌ´Ù. Èï¹Ì·Ó°Ôµµ »ç¿ëÇϱâ À§ÇÑ ÀÌ»óÀûÀÎ ¹æ¹ýÀº µ¿ÀÏÇÑ ±â°èÀ§¿¡¼­ µ¿ÀÛÇÏ´Â µ¿ÀÏÇÑ ÇÁ·Î±×·¥ ³»¿¡¼­(µµ) ¼­·Î ´Ù¸¥ Çʵå Å©±âµé¿¡ ´ëÇؼ­ ¼­·Î ´Ù¸¦ ¼ö ÀÖ´Ù.

Åë½Å°ú ŸÀÔ º¯È¯ ¿¬»ê(Communication & Type Conversion Operations)

ºñ·Ï, À̹ÌÁö Çȼ¿µé¿¡ ´ëÇÑ ¸¹Àº ¿¬»êµéÀ» Æ÷ÇÔÇؼ­, ¾î¶² º´·Ä °è»êÀº ÇÑ º¤ÅÍÀÇ i¹ø° °ªÀº ÇÇ¿¬»êÀÚ º¤Å͵éÀÇ i¹ø° À§Ä¡¿¡ ³ªÅ¸³ª´Â °ªµé¸¸ÀÇ ÇÔ¼öÀ̶ó´Â ¼Ó¼ºÀ» °®°í ÀÖÁö¸¸, ÀÌ°ÍÀº ÀϹÝÀûÀ¸·Î ±×·± °æ¿ì°¡ ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î¼­ ºÎµå·´°Ô Çϱâ(smoothing)¿Í °°Àº Çȼ¿ ¿¬»êµéÁ¶Â÷ ÀÎÁ¢ Çȼ¿µéÀ» ÇÇ¿¬»êÀÚµé·Î ¿ä±¸ÇÏ°í FFTµé°ú °°Àº º¯È¯µéµµ Á» ´õ º¹ÀâÇÑ(´ú Áö¿ªÈ­µÈ) Åë½Å ÆÐÅϵéÀ» ¿ä±¸ÇÑ´Ù.

SWAR¸¦ À§ÇÑ, ºÎºÐÈ­µÇÁö ¾ÊÀº ½¬ÇÁÆ® ¿¬»êµéÀ» »ç¿ëÇÑ, 1-Â÷¿ø °¡Àå ±ÙÁ¢ÇÑ ÀÌ¿ô Åë½ÅÀ» È¿À²ÀûÀ¸·Î ±¸ÇöÇÏ´Â °ÍÀº ¾î·Á¿î ÀÏÀÌ ¾Æ´Ï´Ù. ¿¹¸¦ µé¾î¼­, PEi·ÎºÎÅÍ PE(i+1)·Î °ªÀ» À̵¿Çϱâ À§Çؼ­ ´Ü¼øÇÑ ½¬ÇÁÆ® ¿¬»êÀ¸·Îµµ ÃæºÐÇÏ´Ù. ÇʵåµéÀÌ 8-ºñÆ®ÀÇ ±æÀ̸¦ °¡Áø´Ù¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ °ÍÀÌ´Ù:


(x << 8)

±×·¯³ª ÀÌ°ÍÀº Ç×»ó ±×·¸°Ô ´Ü¼øÇÏÁö ¾Ê´Ù. ¿¹¸¦ µé¾î¼­ PEi·ÎºÎÅÍ PE(i-1)·Î °ªÀ» À̵¿ÇÏ·Á¸é, ´Ü¼øÇÑ ½¬ÇÁÆ® ¿¬»êÀ¸·Îµµ ÃæºÐÇÏ´Ù. ±×·¯³ª C ¾ð¾î´Â ¿À¸¥ÂÊ ½¬ÇÁÆ®°¡ ºÎÈ£ ºñÆ®¸¦ º¸Á¸ÇÏ´ÂÁö ¾ÊÇÏ´ÂÁö¸¦ ÁöÁ¤ÇÏÁö ¾Ê°í ¾î¶² ±â°èµéÀº ºÎÈ£ ºÙÀº ¿À¸¥ÂÊ ½¬ÇÁÆ®¸¸À» Áö¿øÇÑ´Ù. ±×·¡¼­ ÀϹÝÀûÀÎ °æ¿ì ¿ì¸®´Â ¹Ýµå½Ã ¸í½ÃÀûÀ¸·Î, ÀáÀçÀûÀÎ º¹»çµÈ(replicated) ºÎÈ£ ºñÆ®µéÀ» 0À¸·Î ¸¸µé¾î¾ß ÇÑ´Ù:


((x >> 8) & 0x00ffffff)

"wrap-around Ä¿³Ø¼Çµé"À» ´õÇÏ´Â °Íµµ ¶ÇÇÑ ºÎºÐÈ­µÇÁö ¾ÊÀº ½¬ÇÁÆ®¸¦ »ç¿ëÇؼ­ »ó´çÈ÷ È¿À²ÀûÀÌ´Ù. ¿¹¸¦ µé¾î¼­ PEi·ÎºÎÅÍ °ªÀ» PE(i+1)·Î wraparound¸¦ ÀÌ¿ëÇؼ­ ¿Å±â·Á¸é:


((x << 8) | ((x >> 24) & 0x000000ff))

½ÇÁúÀûÀÎ ¹®Á¦´Â Á» ´õ ÀϹÝÀûÀÎ Åë½Å ÆÐÅÏÀÌ ¹Ýµå½Ã ±¸ÇöµÇ¾î¾ß ÇÑ´À °æ¿ì¿¡ ¹ß»ýÇÑ´Ù. ´ÜÁö HP MAX ¸í·É¾î ÁýÇÕ¸¸ÀÌ ´ÜÀÏ ¸í·ÉÀ¸·Î ÇʵåµéÀÇ ÀÓÀÇ Àç¹èÄ¡¸¦ Áö¿øÇÑ´Ù. ÀÌ°ÍÀº Permute¶ó°í ºÒ¸°´Ù. ÀÌ Permute ¸í·ÉÀº ½ÇÁ¦·Î À̸§ÀÌ À߸ø Áö¾îÁ³´Ù; ÀÌ°ÍÀº ÇʵåµéÀÇ ÀÓÀÇÀÇ permutation

¿ªÀÚÁÖ: ¼ø¿­À̶ó°í ¹ø¿ªÇÏÁö¸¸ ¼öÇп¡¼­´Â ÀÏÁ¤ °³¼öÀÇ °´Ã¼µéÀÇ ÀÚ¸® À̵¿À» ¸»ÇÑ´Ù
¸¸ ¼öÇàÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¹Ýº¹(repetition)µµ Çã¿ëÇÑ´Ù. °£´ÜÈ÷ ¸»Çؼ­ ÀÌ°ÍÀº ÀÓÀÇÀÇ x[y] ¿¬»êÀ» ¼öÇàÇÑ´Ù.

ºÒÇàÇÏ°Ôµµ x[y]´Â ±×·± ¸í·É¾øÀÌ ±¸ÇöÇϱⰡ ¾ÆÁÖ ¾î·Æ´Ù. ÄÚµå ½ÃÄö½º´Â ÀϹÝÀûÀ¸·Î ±æ¸é¼­µµ ºñÈ¿À²ÀûÀÌ´Ù; »ç½Ç ÀÌ°ÍÀº ¼øÂ÷ÀûÀÎ ÄÚµåÀÌ´Ù. ÀÌ°ÍÀº ¾ÆÁÖ ½Ç¸Á½º·¯¿î °ÍÀÌ´Ù. MasPar MP1/MP2¿Í Thinking Machines CM1/CM2/CM200 SIMD ½´ÆÛÄÄÇ»ÅÍ¿¡¼­ÀÇ x[y]ÀÇ »ó´ëÀûÀ¸·Î ³ôÀº ¿¬»ê ¼Óµµ´Â ÀÌ·± ±â°èµéÀÇ ¼º´ÉÀÌ ÁÁ¾Ò´ø ÁÖ¿ä ÀÌÀ¯µé ÁßÀÇ ÇϳªÀ̾ú´Ù. ±×·¯³ª x[y]´Â Ç×»ó °¡Àå ±ÙÁ¢ÇÑ ÀÌ¿ô Åë½Åº¸´Ùµµ, ½ÉÁö¾î ±×·± ½´ÆÛÄÄÇ»Å͵鿡¼­Á¶Â÷, ´õ ´À¸®±â ¶§¹®¿¡ ¸¹Àº ¾Ë°í¸®ÁòµéÀÌ x[y] ¿¬»êµé¿¡ ´ëÇÑ ¼ö¿ä¸¦ ÃÖ¼ÒÈ­Çϱâ À§Çؼ­ °í¾ÈµÇ¾î ¿Ô¾ú´Ù. °£´ÜÇÏ°Ô ¸»Çؼ­ Çϵå¿þ¾î Áö¿ø¾øÀÌ ÀÌ°ÍÀº x[y]°¡ ÇÕ¹ýÀûÀÌÁö ¾ÊÀº °Íó·³ ¶Ç´Â Àû¾îµµ ½Ñ °ÍÀÌ ¾Æ´Ñ°Íó·³ SWAR ¾Ë°í¸®ÁòµéÀ» °³¹ßÇÏ´Â °ÍÀÌ °¡Àå ÁÁÀ» °ÍÀÌ´Ù.

¼øȯ ¿¬»ê(Recurrence Operations) (Ãà¼Ò, ½ºÄµ µî)

¼øȯÀ̶õ °è»êµÇ´Â °ªµé°£ÀÇ ¿Ü¸é»ó ¼øÂ÷ÀûÀÎ °ü°è°¡ ÀÖ´Â °è»êÀ» ¸»ÇÑ´Ù. ±×·¯³ª ÀÌ·± ¼øȯÀÌ °áÇÕÀûÀÎ ¿¬»êµéÀ» Æ÷ÇÔÇÑ´Ù¸é ¼¼°³ÀÇ ±¸Á¶È­µÈ º´·Ä ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿© ±× °è»êÀ» ÀçÄÚµùÇÏ´Â °ÍÀÌ °¡´ÉÇÒ ¼ö ÀÖ´Ù.

º´·ÄÈ­°¡ °¡´ÉÇÑ ¼øȯ(recurrence)ÀÇ ´ëºÎºÐÀÇ ÀϹÝÀûÀΠŸÀÔÀº ¾Æ¸¶µµ °áÇÕ Ãà¼Ò(associative reduction)À¸·Î ¾Ë·ÁÁø Ŭ·¡½ºÀÏ °ÍÀÌ´Ù. ¿¹¸¦ µé¾î¼­ ¾î¶² º¤ÅÍ °ªµéÀÇ µ¡¼ÀÀ» °è»êÇϱâ À§Çؼ­ ´ÙÀ½°ú °°Àº ¿ÏÀüÈ÷ ¼øÂ÷ÀûÀÎ C Äڵ带 ÀÛ¼ºÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù:


t = 0;
for (i=0; i<MAX; ++i) t += x[i];

±×·¯³ª, ÀÌ·± µ¡¼ÀÀÇ ¼ø¼­´Â ´Ù¼ö º°·Î Áß¿äÇÏÁö ¾Ê´Ù. ºÎµ¿ ¼Ò¼ýÁ¡°ú ±ØÇÑ(saturation) ¼öÇÐÀº µ¡¼ÀÀÇ ¼ø¼­°¡ ¹Ù²î¸é ´Ù¸¥ ´äµéÀ» ³¾ ¼ö ÀÖÁö¸¸ ÀϹÝÀûÀÎ wrap-around Á¤¼ö µ¡¼ÀµéÀº µ¡¼ÀÀÇ ¼ø¼­¿¡ °ü°è¾øÀÌ µ¿ÀÏÇÑ °á°úµéÀ» ³¾ °ÍÀÌ´Ù. ±×·¡¼­ ¿ì¸®´Â ÀÌ·± ½ÃÄö½º¸¦, ù¹ø° µÎ °ªµé ½ÖµéÀ» ´õÇÏ°í, ±×´ÙÀ½¿¡ ÀÌ·± ºÎºÐÇÕµéÀ» ´õÇÏ°í ÀÌ·±½ÄÀ¸·Î ´ÜÀÏ ¸¶Áö¸· µ¡¼ÀÀÌ ³ª¿Ã ¶§±îÁö °è¼ÓÇÏ´Â, ¼¼°³ÀÇ-±¸Á¶È­µÈ º´·Ä µ¡¼ÀÀ¸·Î ÀçÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ³×°³ÀÇ 8-ºñÆ® °ªµéÀÇ º¤ÅÍ¿¡ ´ëÇؼ­ µÎ µ¡¼À ´Ü°èµéÀÌ ÇÊ¿äÇÏ´Ù; ù¹ø° ´Ü°è´Â µÎ°³ÀÇ 8-ºñÆ® µ¡¼ÀÀ» ¼öÇàÇÏ°í, ±×´ÙÀ½ µÎ°³ÀÇ 16-ºñÆ® °á°ú ÇʵåµéÀ» »ý¼ºÇÑ´Ù(°¢°¢Àº 9-ºñÆ® °á°ú¸¦ ´ã°í ÀÖ´Ù):


t = ((x & 0x00ff00ff) + ((x >> 8) & 0x00ff00ff));

µÎ¹ø° ½ºÅÜÀº ÀÌ·± µÎ°³ÀÇ 9-ºñÆ® °ªµéÀ» 16-ºñÆ® Çʵåµé¾È¿¡¼­, ´ÜÀÏ 10-ºñÆ® °á°ú¸¦ ¸¸µé±â À§ÇØ, ´õÇÑ´Ù:


((t + (t >> 16)) & 0x000003ff)

½ÇÁ¦, µÎ¹ø° ½ºÅÜÀº µÎ°³ÀÇ 16-ºñÆ® ÇÊµå µ¡¼ÀµéÀ» ¼öÇàÇÑ´Ù... ±×·¯³ª ¸Ó¸® 16-ºñÆ® µ¡¼ÀÀº Àǹ̰¡ ¾ø´Ù. ÀÌ°ÍÀÌ ¹Ù·Î ¿Ö °á°ú°¡ ´ÜÀÏ 10-ºñÆ® °á°ú °ª¿¡ ´ëÇؼ­ ¸¶½ºÅ·µÇ´Â°¡¿¡ ´ëÇÑ ÀÌÀ¯ÀÌ´Ù.

"º´·Ä Á¢µÎ¾î(parallel prefix)" ¿¬»êÀ¸·Î ¾Ë·ÁÁø ½ºÄµÀº ´Ù¼Ò È¿À²ÀûÀ¸·Î ±¸ÇöÇϱⰡ ´õ ¾î·Æ´Ù. ÀÌ°ÍÀº ¿Ö³Ä¸é, Ãà¼Ò(reduction)°ú ´Ù¸£°Ô, ½ºÄµÀÌ ºÎºÐÀûÀÎ(partitioned) °á°ú¸¦ ³»±â ¶§¹®ÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î ½ºÄµÀº ¾ÆÁÖ ¸í¹éÇÑ, ºÎºÐÀûÀÎ ¿¬»êµéÀÇ ½ÃÄö½º¸¦ »ç¿ëÇؼ­ ±¸ÇöµÉ ¼ö ÀÖ´Ù.

4.3 ¸®´ª½º¿¡¼­ÀÇ MMX SWAR

¸®´ª½ºÀÌ °æ¿ì IA32 ÇÁ·Î¼¼¼­µéÀÌ ¿ì¸®ÀÇ ÁÖ¿ä °ü½É»çÀÌ´Ù. AMD, Cyrix, ±×¸®°í Intel ¸ðµÎ µ¿ÀÏÇÑ MMX ¸í·É¾îµéÀ» ±¸ÇöÇÑ´Ù°í ÇÏ´Â °ÍÀº ±Â´º½ºÀÌ´Ù. ±×·¯³ª MMX ¼º´ÉÀº ¼­·Î ´Ù¸£´Ù; ¿¹¸¦ µé¾î¼­ K6´Â MMX ÆÄÀÌÇÁ¶óÀÎÀ» ´ÜÁö Çϳª¸¸ °¡Áø´Ù - (ÀÌ¿¡ ¹ÝÇؼ­)Pentium with MMX´Â µÎ°³¸¦ °¡Áø´Ù. IntelÀÌ ¾ÆÁ÷µµ ÀÌ·± ¸ÛûÇÑ MMX ±¤°í¸¦ °è¼ÓÇÏ°í ÀÖ´Ù´Â °ÍÀÌ À¯ÀÏÇÑ ¹èµå´º½ºÀÌ´Ù. ;-)

SWAR¸¦ À§ÇÏ¿© MMX¸¦ »ç¿ëÇÏ´Â µ¥´Â ½ÇÁ¦ ´ÙÀ½°ú °°Àº ¼¼°¡Áö Á¢±Ù¹ýÀÌ ÀÖ´Ù:

  1. MMX ¶óÀ̺귯¸® ·çƾµéÀ» »ç¿ëÇÏ´Â °Í. Ưº°È÷ IntelÀº ¸î°¡Áö "¼º´É ¶óÀ̺귯¸®µéÀ»(performance libraries)", http://developer.intel.com/drg/tools/ad.htm °³¹ßÇß´Ù. ÀÌ°ÍÀº ÀÏ¹Ý ¸ÖƼ¹Ìµð¾î ÀÛ¾÷µé¿¡ ´ëÇؼ­ ¼ÕÀ¸·Î-ÃÖÀûÈ­µÈ ´Ù¾çÇÑ ·çƾµéÀ» Á¦°øÇÑ´Ù. ÀûÀº ³ë·ÂÀ¸·Î ¸¹Àº ºñ-¸ÖƼ¹Ìµð¾î ¾Ë°í¸®ÁòµéÀÌ ´ëºÎºÐÀÇ ÄÄÇ»ÅÍ-ÁýÁß Æ÷¼ÇµéÀÇ ÀϺΰ¡ ÀÌ·± ¶óÀ̺귯¸® ·çƾµéÀ» Çϳª ¶Ç´Â ±×ÀÌ»ó »ç¿ëÇؼ­ ±¸ÇöµÉ¼ö ÀÖµµ·Ï ÀçÀÛ¾÷µÉ ¼ö ÀÖ´Ù. ÀÌ·± ¶óÀ̺귯¸®µéÀº ÇöÀç ¸®´ª½º¿¡ ´ëÇؼ­ »ç¿ëºÒ°¡´ÉÀÌÁö¸¸ Æ÷Æà °¡´ÉÇÒ ¼ö ÀÖ´Ù.
  2. MMX ¸í·É¾îµéÀ» Á÷Á¢ »ç¿ëÇÏ´Â °Í. ÀÌ°ÍÀº ´Ù¼Ò µÎ°¡Áö Á¡µé¿¡ ÀÇÇؼ­ º¹ÀâÇÏ´Ù. ù¹ø° ¹®Á¦´Â MMX°¡ ÇÁ·Î¼¼¼­¿¡¼­ »ç¿ë°¡´ÉÇÏÁö ¾ÊÀ» ¼ö À־ ´ëü ±¸Çö¹°ÀÌ ¹Ýµå½Ã Á¦°øµÇ¾î¾ß ÇÒ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. µÎ¹ø° ¹®Á¦´Â ¸®´ª½º¿¡¼­ ÀϹÝÀûÀ¸·Î »ç¿ëµÇ´Â IA32 ¾î¼Àºí·¯°¡ ÇöÀç MMX ¸í·É¾îµéÀ» ÀÌÇØÇÏÁö ¸øÇÑ´Ù´Â °ÍÀÌ´Ù.
  3. ÀûÀýÇÑ MMX ¸í·É¾îµéÀ» Á÷Á¢ »ý¼ºÇÒ ¼ö ÀÖ´Â °í-¼öÁØ ¾ð¾î³ª ¸ðµâ ÄÄÆÄÀÏ·¯(module compiler)¸¦ »ç¿ëÇÏ´Â °Í. ±×·± ÅøµéÀº ÇöÀç °³¹ß Áß¿¡ ÀÖÁö¸¸ ¾î¶² °Íµµ ¾ÆÁ÷ ¸®´ª½º¿¡¼­ ¿ÏÀüÇÑ ±â´ÉÀ» °¡Áø °ÍÀÌ ¾ø´Ù. ¿¹¸¦ µé¾î¼­ ÆÛµà ´ëÇб³ ( http://dynamo.ecn.purdue.edu/~hankd/SWAR/)¿¡¼­ ¿ì¸®´Â ÇöÀç ¸í½ÃÀûÀ¸·Î º´·Ä C ¹æ¾ðÀ¸·Î ÀÛ¼ºµÈ ÇÔ¼öµéÀ» ÃëÇؼ­ C ÇÔ¼öµé·Î °¡´ÉÇÑ SWAR ¸ðµâµéÀ» »ý¼ºÇÒ ÄÄÆÄÀÏ·¯¸¦ °³¹ßÇÏ°í ÀÖÁö¸¸, ¾ÆÁ÷ MMX¸¦ Æ÷ÇÔÇؼ­ SWAR Áö¿øÀÌ °¡´ÉÇÑ °ÍÀÌ¸é ¹«¾ùÀÌµç »ç¿ëÇÑ´Ù. ù¹ø° ÇÁ·ÎÅäŸÀÔ ¸ðµâ ÄÄÆÄÀÏ·¯´Â 1996³â °¡À»¿¡ ¸¸µé¾îÁ³´Ù. ±×·¯³ª ÀÌ ±â¼úÀ» »ç¿ë°¡´ÉÇÑ »óűîÁö ¸¸µå´Â °ÍÀº óÀ½¿¡ ¿¹»óÇÑ °Íº¸´Ù ´õ ¿À·¡ °É¸®°í ÀÖ´Ù.

¿ä¾àÇϸé MMX SWAR´Â ¿©ÀüÈ÷ »ç¿ëÇϱ⿡ ¾î·Æ´Ù. ±×·¯³ª ¿©ºÐÀÇ ³ë·ÂÀ» Á¶±Ý ´õÇϸé À§¿¡¼­ ÁÖ¾îÁø µÎ¹ø° Á¢±Ù¹ýÀº Áö±Ýµµ »ç¿ëµÉ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ±× ±âº»ÀÌ´Ù:

  1. ÇÁ·Î¼¼¼­°¡ MMX¸¦ Áö¿øÇÏÁö ¾ÊÀ¸¸é MMX¸¦ ¾µ ¼ö ¾ø´Ù. ´ÙÀ½ GCC ÄÚµå´Â MMX°¡ ¿©·¯ºÐÀÇ ÇÁ·Î¼¼¼­¿¡¼­ Áö¿øµÇ´ÂÁö ¾ÈµÇ´ÂÁö¸¦ Å×½ºÆ®ÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. Áö¿ø¾ÈµÇ¸é 0ÀÌ ¸®Åϵǰí Áö¿øµÇ¸é 0ÀÌ ¾Æ´Ñ °ªÀÌ ¸®ÅϵȴÙ.
    inline extern
    int mmx_init(void)
    {
            int mmx_available;
    
            __asm__ __volatile__ (
                    /* Get CPU version information */
                    "movl $1, %%eax\n\t"
                    "cpuid\n\t"
                    "andl $0x800000, %%edx\n\t"
                    "movl %%edx, %0"
                    : "=q" (mmx_available)
                    : /* no input */
            );
            return mmx_available;
    }
    

  2. MMX ·¹Áö½ºÅÍ´Â ±âº»ÀûÀ¸·Î GCC°¡ unsigned long long¶ó°í ºÎ¸£´Â °Í Áß Çϳª¸¦ °®°í ÀÖ´Ù. ±×·¡¼­ ÀÌ·± ŸÀÔÀÇ ¸Þ¸ð¸®-±â¹Ý º¯¼öµéÀº ¿©·¯ºÐÀÇ MMX ¸ðµâµé°ú ±×µéÀ» È£ÃâÇÏ´Â C ÇÁ·Î±×·¥µé°£ÀÇ Åë½Å ¸ÞÄ«´ÏÁòÀÌ µÈ´Ù. ¶Ç´Â MMX µ¥ÀÌÅ͸¦ ÀÓÀÇÀÇ 64-ºñÆ® Á¤·ÄµÈ µ¥ÀÌÅÍ ½ºÆ®·°ÃÄ·Î ¼±¾ðÇÒ¼öµµ ÀÖ´Ù (¿©·¯ºÐÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» unsigned long long Çʵ带 °¡Áö´Â unionÀÇ Å¸ÀÔÀ¸·Î ¼±¾ðÇÔÀ¸·Î½á 64-ºñÆ® Á¤·ÄÀÌ µÇµµ·Ï ÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù).
  3. MMX°¡ »ç¿ë°¡´ÉÀ̶ó¸é ¿©·¯ºÐÀº, °¢ ¸í·ÉÀ» ÀÎÄÚµåÇÏ´Â .byte ¾î¼Àºí¸® Áö½Ã¾î¸¦ »ç¿ëÇÑ ¿©·¯ºÐÀÇ MMX Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ MMX ¸í·É¾î PADDB MM0,MM1´Â ´ÙÀ½°ú °°ÀÌ GCC ÀÎ-¶óÀÎ ¾î¼Àºí¸® ÄÚµå·Î ÀÎÄÚµùµÉ ¼ö ÀÖ´Ù:
    __asm__ __volatile__ (".byte 0x0f, 0xfc, 0xc1\n\t");
    

    MMX´Â ºÎµ¿ ¼Ò¼ýÁ¡ ¿¬»êµé¿¡ ´ëÇؼ­ »ç¿ëµÇ´Â Çϵå¿þ¾î¿Í µ¿ÀÏÇÑ °ÍµéÀ» »ç¿ëÇÑ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ. ±×·¡¼­ MMX ÄÚµå¿Í ¼­·Î ¼¯ÀÎ ÄÚµå´Â ºÎµ¿ ¼Ò¼ýÁ¡ ¿¬»êµéÀ» È£ÃâÇؼ­´Â ¾ÈµÈ´Ù. ºÎµ¿ ¼Ò¼ýÁ¡ ½ºÅõµ ¶ÇÇÑ MMX Äڵ带 ½ÇÇàÇϱâ Àü¿¡ ºñ¿öÁ®¾ß ÇÑ´Ù; ºÎµ¿ ¼Ò¼ýÁ¡ ½ºÅÃÀº ÀϹÝÀûÀ¸·Î ºÎµ¿ ¼Ò¼ýÁ¡À» »ç¿ëÇÏÁö ¾Ê´Â C ÇÔ¼öÀÇ ½ÃÀÛÁ¡¿¡¼­ ºñ¿öÁø´Ù.
  4. ´ÙÀ½°ú °°ÀÌ ÄÚµùµÉ ¼ö ÀÖ´Â °Íó·³, EMMS ¸í·ÉÀ» ½ÇÇàÇÔÀ¸·Î½á, MMX Äڵ带 Á¾·áÇÏÀÚ:
    __asm__ __volatile__ (".byte 0x0f, 0x77\n\t");
    

À§ÀÇ °ÍÀÌ ¾ÆÁÖ ÀÌ»óÇÏ°í Á¶ÀâÇÏ°Ô º¸ÀÎ´Ù¸é ±×·¸´Ù. ±×·¯³ª MMX´Â ¿©ÀüÈ÷ ²Ï Àþ´Ù... ÀÌ ¹®¼­ÀÇ ³ªÁß ¹öÀüÀº MMX SWAR¸¦ ÇÁ·Î±×·¥ÇÏ´Â Á» ´õ ³ªÀº ¹æ¹ýµéÀ» Á¦°øÇÒ °ÍÀÌ´Ù.


´ÙÀ½ ÀÌÀü Â÷·Ê