Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Ç¿ÕߺãÇ¿£ºx86¸ßÐÔÄܱà³Ì¼ã×¢Ö®·ÖÖ§
 
×÷ÕߣºÕÅÅÊ À´Ô´£ºÔÆÉ¼ÍøÂç ·¢²¼ÓÚ£º 2017-6-7
  2338  次浏览      27
 
  • µÚÒ»²¿·Ö£º½éÉÜ
    • ѰÕÒÈí¼þÖеÄHotspot
    • x86 CPU¼Ü¹¹
    • Good/Bad examples
  • µÚ¶þ²¿·Ö£ºÐÔÄÜÒòËØ
    • ÄÚ´æ
      • »º´æ
      • Êý¾Ý¶ÔÆë
      • Prefetch
      • NUMA
      • ´óÒ³
      • ʵÀý
    • Ñ­»·
      • Êý¾ÝÒÀÀµ
      • Ñ­»·Õ¹¿ª
      • pointer aliasing
      • ʵÀý
    • ·ÖÖ§
      • Á÷Ë®Ïß
      • ·ÖÖ§Ô¤²â
      • Branch-less±à³Ì
      • ʵÀý
    • ¶àÏß³Ì
      • Ëø/×èÈû
      • CPUºË°ó¶¨
      • ÎÞËø²Ù×÷
  • ¸½£º
    • ÐÔÄܲâÊÔ¹¤¾ß

ÐòÑÔ

ÒÔÁ÷Ë®ÏßµÄÑÛ¹âÀ´¿´£¬·ÖÖ§²¢²»ÊǸßËÙ¹«Â·ÉÏÁ½¸öÄ¿µÄµØµÄÑ¡Ôñ£¬Èç¹ûÔ¤²âʧ°Ü£¬½«ÊÇÖ±½Ó¹ÕÏò³ö¿Ú´¦µÄÊÕ·ÑÕ¾£¬»¹ÊDz»´øETCµÄ¡£Ô½ÊǸ߼¶µÄÁ÷Ë®Ïߣ¬ÊÜ·ÖÖ§µÄÓ°ÏìÒ²¾ÍÔ½Éî¡£ÎÒÃÇÔÚ¹Û²ì¸÷ÖÖÐÔÄܲâÊÔ¹¤¾ßÌṩ¸øÎÒÃǵĽá¹ûµÄʱºò£¬¾­³£»á¿´µ½¡°stalled¡±Õâ¸öµ¥´Ê£¬Õâ¸ö´ÊÓë¡°·¢¶¯»ú¡±ÕâÀà´ÊÒ»ÆðÁ¬ÓõÄʱºò£¬¾ÍÊÇ¡°Ï¨»ð¡±µÄÒâ˼¡£¶østalled-cycles-frontend£¬×÷Ϊһ¸öºâÁ¿Á÷Ë®Ïßǰ¶Ë(Fetch & Decode)ÔËÐÐˮƽµÄÖ¸±ê£¬Óë´íÎóµÄ·ÖÖ§Ô¤²â(Branch Misprediction)ÓÐÃÜÇеĹØÏµ¡£

Óкܶà°ì·¨¿ÉÒÔ°ïÖúÎÒÃÇÓÅ»¯·ÖÖ§£¬³ýÁËÌ×ÓÃÒ»¸ölikely()/unlikely()ÕâÖÖÊìÖªµÄ·½Ê½Ö®Í⣬»¹ÓкܶàÐèÒªÉîÈëÁ˽âµÄ֪ʶ¡£Ï뾡Á¿Ïû³ý·ÖÖ§¶ÔÐÔÄܵÄÓ°Ï죬ÏÈ´ÓÁ˽â·ÖÖ§¿ªÊ¼°É¡£

·ÖÖ§µÄÀàÐÍ

·ÖÖ§·ÖΪÌõ¼þ·ÖÖ§(Conditional Branch)ºÍ·ÇÌõ¼þ·ÖÖ§(Unconditional Branch)¡£¿ÉÒÔºÜÈÝÒ׵ĴÓ×ÖÒåÇø·Ö£º

Ìõ¼þ·ÖÖ§¶ÔÐÔÄܵÄÓ°Ïì×îΪÏÔÖø¡£´ÓÇ°ÃæÒ»½Ú¹ØÓÚÁ÷Ë®ÏßµÄÃèÊöÖÐÎÒÃÇÒÑÄܵÃÖª£¬ÔÚÅжÏÌõ¼þµÄÖ¸ÁîûÓо­¹ýÖ´ÐÐ(EXE)½×¶Î֮ǰ£¬ÊÇÎÞ·¨È·¶¨ÕýÈ·µÄ·ÖÖ§µÄ¡£µ«µÈ´ýÏÔÈ»²»ÊÇ×îÓŵķ½°¸£¬CPU»¹ÊÇ»á¼ÌÐøÑ¡È¡Ä³Ò»¸ö·ÖÖ§µÄÖ¸Áî¼ÌÐøËÍÈëÁ÷Ë®Ïß¡£µ±·¢ÏÖÕâÒ»·ÖÖ§ÊÇ´íÎó·ÖÖ§µÄʱºò£¬Á÷Ë®Ïß²»µÃ²»Í£Ö¹ËùÓÐÏÖÓеŤ×÷£¬Çå¿Õ´íÎó·ÖÖ§µÄÖ¸Á²¢´Ó·ÖÖ§ÕýÈ·µÄµØ·½ÖØÐ¿ªÊ¼£¬ÐÔÄܵÄËðʧҲ¾Í²»¿É±ÜÃâ¡£
¶ÔÓÚ·ÇÌõ¼þ·ÖÖ§£¬Ò²ÐèҪעÒâ³ýÁËgotoÕâÖÖרÃŵÄ×ªÌøÖ¸ÁîÖ®Í⣬µ÷ÓÃijһ¸öº¯Êý£¬»òÊǺ¯ÊýÖ¸Õ룬ÒÔ¼°´Ó×Óº¯ÊýÖзµ»ØÒ²¶¼ÊôÓÚ·ÇÌõ¼þ·ÖÖ§µÄ·¶³ë¡£

·ÖÖ§ÓÅ»¯µÄÔ­Ôò

¼òµ¥À´Ëµ£¬¾ÍÊÇ¿¿²Â¡£µ±È»£¬ÔÚѧÊõÉϽС°Ô¤²â¡±£¬Æäʵ½Ð¡°¿´ÈËÆ·¡±Ò²Ã»´í¡£Èç¹ûÄÜÒ»Ö±²Â¶ÔÕýÈ·µÄ·ÖÖ§£¬ÄÇôÕⲿ·Ö´úÂëÔËÐÐÆðÀ´ºÍÎÞ·ÖÖ§´úÂëÒ²Ã»Ê²Ã´Çø±ð¡£Õâ¸ö¹¤×÷Ö÷ÒªÓÉCPU¼Ü¹¹ÖеķÖÖ§Ô¤²âµ¥Ôª(Branch Prediction Unit, BPU»òBranch Predictor)Íê³É¡£²»¹ýÄØ£¬BPU²»ÖÀ÷»×Ó£¬ËùÓеÄÔ¤²â¶¼ÊÇ»ùÓÚÀúÊ·½á¹ûµÄ¼Ç¼ºÍ·ÖÎö¡£

Side Note: ·ÖÖ§Ô¤²â(Branch Prediction)ºÍ·ÖÖ§Ä¿±êÔ¤²â(Branch Target Prediction)ÓÐÇø±ð¡£·ÖÖ§Ô¤²âÊÇÔÚÈ·¶¨£¨Ìõ¼þ£©·Ö֧֮ǰÅжÏÄÄÒ»·ÖÖ§¸üÓпÉÄÜ£»·ÖÖ§Ä¿±êÔ¤²âÊÇÔÚÈ·¶¨Ä³Ò»Ìõ¼þ·ÖÖ§»òÎÞÌõ¼þ·ÖÖ§Ö®ºóÔ¤²âÆä×ªÌøÄ¿±êÒÔ±ãԤȡ¡£²»¹ýÕâÁ½Õßͨ³£ÓÉͬһ´¦CPUµç·Íê³É¡£

ÔÚÕâÀï¼òµ¥µØ½²Ò»Ï·ÖÖ§Ô¤²âµÄÔ­Àí¡£2-bit Saturating CounterÊÇÒ»ÖÖ¹ÅÀϵļ¼Êõ£¬µ«×÷ΪÏÖ´ú·ÖÖ§Ô¤²âÆ÷Ö®ÀÄõü£¬ÈÔȻֵµÃÎÒÃÇ·ÖÎöһϡ£

ÈçÏÂͼËùʾµÄ״̬»ú£¬¹²´æÔÚ4ÖÖ״̬¡£Æä״̬ת»»µÄÌõ¼þ£¬ÊDZ¾´Î¸Ã·ÖÖ§ÊÇ·ñ±»Ñ¡Ôñ¡£Èç¹ûÒÔ1´ú±í±»Ñ¡Ôñ(taken)£¬0´ú±íûÓÐ(not taken)£¬ÄÇô1ÏòÓÒ±ßÒÆ¶¯£¬0Ïò×ó±ßÒÆ¶¯¡£µ±¸Ã·Ö֧ȷʵÊÇ´ó¸ÅÂÊ×ªÌøµÄ·ÖÖ§(taken)£¬ÄÇô״̬»á´ó²¿·Öʱ¼äά³ÖÔÚstrongly taken¸½½ü£¬Èç´Ë¿ÉΪÏÂÒ»´ÎµÄÔ¤²âÌṩԤ²â¡£·´Ö®£¬Ôò״̬»áά³ÖÔÚstrongly not taken¸½½ü£¬Ò²¿ÉÒÔ×÷ΪԤ²âµÄƾ¾Ý¡£

Side Note: ¸÷¸ö·ÖÖ§µÄSaturating Counter×éÖ¯ÔÚÒ»¸ö±íÖУ¬²¢ÒÔÖ¸ÁîµÄµØÖ·×÷Ϊindex£¬ÄÇôCPU¾Í¿ÉÒÔÔÚFetch½×¶ÎÈ¡µÃ¸ÃÖ¸ÁîµÄSaturating Counter״̬¡£

Saturating Counterȷʵ°ïÖúÎÒÃǽâ¾öÁËÒ»²¿·ÖÎÊÌâ¡£µ«ÕâÖÖ»úÖÆÒ²´æÔÚȱÏÝ¡£Ëü¶Ô°´Ä³ÖÖ¹æÂÉÖØ¸´³öÏֵķÖÖ§´¦Àí½á¹ûȱ·¦Á¼ºÃµÄÖ§³Ö£¬¶øÕâÖÖÇé¿öÔÚÎÒÃǵijÌÐòÖÐÒ²¾­³£³öÏÖ£¬¿¼ÂÇÈçÏ´úÂ룺

for (i = 0; i < 1000; i++) {
if (i & 1) { /* If i is odd num */
count++;
}
}

ÆæÊý×ÜÊǼä¸ô³öÏÖ£¬ifµÄ·ÖÖ§Ò²ÊÇÿ¸ôÒ»´ÎÑ­»·Ö´ÐÐÒ»´Î¡£Èç¹û¼ÌÐø²ÉÓÃÈçÉϵķ½Ê½£¬ÄÇôSaturating Counter×ÜÊÇ»áÔÚÁ½¸öÏàÁÚ״̬֮¼äÒ¡°Ú£¬²¢ÇÒ×ÜÊÇÌṩ´íÎóµÄÔ¤²â¡£¶Ô´Ë£¬ÓÖÒýÈëÁ˶þ¼¶×ÔÊÊÓ¦Ô¤²âÆ÷(Two-level adaptive predictor)¡£

¸Ã»úÖÆ¿ÉÒÔÀí½âΪ£¬ÎªÒ»¸ö·ÖÖ§·ÖÅä¶à¸öSaturating Counter£¬ÒÔÀúÊ·µÄÇé¿ö¾ö¶¨Ê¹ÓÃÄÄÒ»¸öSaturating Counter¡£ÒÔÉÏÃæµÄ´úÂë¾ÙÀý£¬if·ÖÖ§¹²·ÖÅäÓÐ4¸öSaturating Counter£¬Table Entry Index·Ö±ðΪ00,01,10ºÍ11¡£Óɸ÷ÖÖ§µÄ×îºóÁ½´Îѡȡ½á¹û¾ö¶¨Ê¹ÓÃÄÄÒ»¸öSaturating Counter¡£ÔÚÉÏÃæµÄ´úÂëÖУ¬Ñ¡È¡½á¹ûΪ01010101010....µ±×îºóÁ½´Î½á¹ûΪ01µÄʱºò£¬Index 01µÄSaturating Counter½ÓÊܱ¾´ÎµÄѡȡ½á¹û0£¬²¢ÏòStrongly not takenÒÆ¶¯ÇÒά³Ö¸Ã״̬£»µ±×îºóÁ½´Î½á¹ûΪ10µÄʱºò£¬Index 10µÄSaturating Counter½ÓÊܱ¾´ÎµÄѡȡ½á¹û1£¬²¢ÏòStrongly takenÒÆ¶¯ÇÒά³Ö¸Ã״̬¡£¹Êµ±10Õâһѡȡ¹æÂÉÔٴγöÏÖµÄʱºò£¬¶ÔÓ¦µÄStrongly taken״̬±ã¿É°ïÖúCPUÔ¤²â±¾´Î¸Ã·ÖÖ§½«»á±»Ñ¡È¡¡£Èç´Ë£¬±ã¿ÉÒÔΪ°´Ä³Ò»¹æÂɳöÏֵķÖÖ§ÌṩԤ²â¡£

´ÓÉÏÃæµÄ·ÖÎöÖпÉÒԵóö£¬·ÖÖ§ÓÅ»¯µÄÔ­Ôò¾ÍÊÇÈóÌÐòÖзÖÖ§µÄѡȡ¸ü¼Ó¹æÂÉ£¬ÕâÊÇÒ»¼þÊ®·ÖºÏ·ÖÖ§Ô¤²âÆ÷θ¿ÚµÄÊÂÇé¡£±ÈÈçÎÒÃÇÔÚµÚÒ»½ÚÖÐËù¾ÙµÄÀý×Ó£¬¶ÔÊäÈëµÄËæ»úÊý¾ÝÊ×ÏÈÅÅÐòÔÙ½øÐÐÅжϣ¬¾ÍÊÇÀûÓõÄÕâÒ»Ô­Ôò¡£µ«·ÖÖ§ÓÅ»¯µÄ×îÖØÒªµÄÔ­Ôò£¬²¢²»ÊÇÕâÒ»Ìõ£¬¶øÊÇÔÚÄܲ»Ó÷ÖÖ§µÄʱºò£¬¾¡Á¿²»ÒªÓ÷ÖÖ§¡£±ÈÈ罫ÉÏÃæµÄ´úÂë¸Ä³É£º

for (i = 0; i < 1000; i++) { /* Ignore the optimization of loop*/
count += (i & 1);
}

ÐÔÄÜÏà¹ØµÄ·ÖÖ§ÀàÐÍ

´ÓÐÔÄÜÓÅ»¯µÄ½Ç¶ÈÀ´¿´£¬³ÌÐòÖеķÖÖ§´óÖ¿ɷÖΪÈçϼ¸Àࣺ

µÚÒ»´ÎÖ´ÐеÄÌõ¼þ·ÖÖ§

Ëùν¡°µÚÒ»´Î¡±Ö´ÐУ¬¿ÉÒÔÕæµÄÊǵÚÒ»´Î£¬Ò²¿ÉÒÔÊÇÒòΪ»º´æ¸üеÈÔ­Òòµ¼Ö·ÖÖ§Ô¤²âÆ÷ÖÐûÓб£´æÆäÀúÊ·Êý¾Ý¡£ÒòΪÊǵÚÒ»´ÎÖ´ÐУ¬ËùÒÔºÜÄѶԷÖÖ§µÄÇé¿ö×÷³öÓÐЧµÄÔ¤²â¡£ÀýÈçCÓïÑÔÖеÄif,while,forÒÔ¼°»ã±àÖеÄjz,jneµÈÖ¸ÁCPUËäÈ»ÔÚÕâÖÖÇé¿öÏÂÒ²»áÓÐÒ»Ì×Ö´Ðеıê×¼£¬µ«ÕâÈ¡¾öÓÚ²»Í¬CPUµÄ²»Í¬ÊµÏÖ¡£³ýÁËʹÓÃlikely()/unlikely()ÈËΪ±ê×¢Ö®Í⣬»¹¿ÉÒÔʹÓÃһЩÏû³ý·ÖÖ§µÄͨÓ÷½·¨¡£µ«ÕâÖÖÇé¿ö·Ç³£º±¼û£¬ÓÅ»¯µÄЧ¹ûÒ²ÄѾ¡ÈçÈËÒâ¡£¶ÔÓÚ·ÖÖ§ÓÅ»¯£¬ºÍÆäËûËùÓеÄÓÅ»¯Ò»Ñù£¬Ê×ÒªÊÇץס¾­³£¶à´ÎÖ´ÐеĹؼü´úÂë¶Î£¬ÒÔÆÚÈ¡µÃÓÅ»¯Ð§¹ûµÄ×î´ó»¯¡£

ÖØ¸´Ö´ÐеķÖÖ§

ÖØ¸´Ö´ÐеķÖÖ§¿ÉÒÔÀí½âΪ·ÖÖ§Ô¤²âÆ÷ÖдæÓÐÆäÏà¹ØÀúÊ·µÄ·ÖÖ§¡£·ÖÖ§Ô¤²âÆ÷Äܹ»ÒÔÀúʷΪÒÀ¾Ý£¬¶ÔÏÂÒ»´ÎµÄ·ÖÖ§Ñ¡Ôñ×ö³öÅжϡ£¶ÔÕâÒ»ÀàÐ͵ķÖÖ§£¬¿ÉÒÔÓòâÊÔ¹¤¾ß²é¿´ÆäBranch Misprediction Rate¡£³ÌÐòÔ±ÐèÒª×öµÄ£¬ÊǾ¡¿ÉÄÜÈôËÀà·ÖÖ§³ÊÏÖ³ö¹æÂÉÐÔ£¬Ïû³ýËæ»úÐÔ´øÀ´µÄ¸ºÃæÓ°Ïì¡£ÏÖ´úµÄ·ÖÖ§Ô¤²âÆ÷ÒѾ­Ô¶Ô¶±ÈÉÏÎÄÖнéÉܵĸ´ÔÓ£¬·¢ÏÖ·ÖÖ§ÖÐÒþ²ØµÄ¹æÂɲ¢²»ÊÇÒ»¸öÓÐÌØ±ðÄѶȵÄÎÊÌ⣬µ±Ç°£¬Ç°ÌáÊǹæÂÉÕæµÄ´æÔÚ:D

¼ä½Ó×ªÌø·ÖÖ§

³ýÁËif,whileÖ®Í⻹ÓÐÀûÓú¯ÊýÖ¸Õë»òÕßJump Table½øÐеļä½Ó×ªÌø·ÖÖ§¡£¼ä½Ó×ªÌøÓëif whileÕâÀà×ªÌøµÄ²»Í¬Ö®´¦ÔÚÓÚ£¬Æä×ªÌøÄ¿±ê(Branch Targets)´æÔÚÎÞÏÞ¶àÖÖ¿ÉÄÜ£¨º¯ÊýÖ¸Õë¿ÉÖ¸ÏòÈÎÒ⺯Êý£©¡£¶øif whileÖ»´æÔÚÁ½ÖÖ¿ÉÄÜ£ºÏÂÒ»ÌõÖ¸Á»òÕß×ªÌø·ÖÖ§µÄµÚÒ»ÌõÖ¸Áî¡£ÏÖ´úµÄCPUͬÑù¶Ô·ÖÖ§Ä¿±ê×¼±¸ÁËÔ¤²â»úÖÆ£¬µ«ºÍ·ÖÖ§Ô¤²âÀàËÆ£¬¸Ã»úÖÆÒ²Í¬ÑùÒÀÀµÓÚ¡°¹æÂÉ¡±¶þ×Ö¡£

·ÇÌõ¼þÖ±½Ó×ªÌø·ÖÖ§

´ËÀà·ÖÖ§ÊôÓÚ×îÉÙÈÃÈ˲ÙÐĵķÖÖ§¡£·ÖÖ§Ô¤²â£¬100%ÕýÈ·£¬·ÖÖ§Ä¿±êÔ¤²â100%ÕýÈ·£¬ºÜÄÑÒý·¢ÐÔÄÜϽµ¡£

·ÖÖ§ÓÅ»¯µÄ¼¼Êõ

ʹÓÃSetcc¼°CMOVxÖ¸Áî

ʹÓÃSETcc¼°CMOVxÖ¸Áî¿ÉÒÔ°ïÖúÏû³ý·ÖÖ§¡£²»¹ýÕâÆäʵÊÇÒ»ÖÖÀàËÆÓÚ¡°¿Õ¼ä»»Ê±¼ä¡±µÄ½»»»¡£ÕâÁ½¸öÖ¸ÁîÏû³ýÁË·ÖÖ§ÔÚÖ¸ÁîÁ÷³ÌÉϵÄÒÀÀµ£¬µ«ÒýÈëÁËÊý¾ÝÒÀÀµ£¬²¢½«½øÒ»²½Ó°ÏìÂÒÐòÖ´ÐкËÐÄ(OOO Core)µÄ²Ù×÷¡£²¢ÇÒÕâÁ½ÌõÖ¸ÁîÏ൱ÓÚ½«Á½¸ö·ÖÖ§¶¼Ö´ÐÐÁËÒ»´Î£¬¶ÔÓÚ¿ÉÒÔÔ¤²âµÄ·ÖÖ§£¬Ò»¶¨²»Òª²ÉÈ¡ÕâÖÖ¼¼Êõ¡£

Side Notes: ÏÖ´úx86 CPUÍùÍùÓµÓкܸߵķÖÖ§Ô¤²âÕýÈ·ÂÊ¡£³ÖÐøµÄÎÞ·¨Ô¤²âµÄ·ÖÖ§ÊDZȽϺ±¼ûµÄÇé¿ö¡£¶ÔÓÚÊÇ·ñ²ÉÓÃÕâÁ½¸öÖ¸Áһ¶¨ÒªÒÔʵ¼Ê²âÊÔÊý¾ÝΪÒÀ¾Ý¡£

  • SETcc

¾ÙÒ»¸ö¾­µäµÄÀý×Ó£º

R = (A < B) ? NUM1 : NUM2;

R×îÖÕµÄȡֵȡ¾öÓÚAÓëBÏà½ÏµÄ½á¹û¡£µ±AÓëBÖ®¼äÎÞÉõ¹ØÁªµÄʱºò£¬CPUºÜÄÑÔ¤²â½á¹û¡£¸ÃÌõÖ¸Áî±È½Ï¡°Õýͳ¡±µÄ»ã±àÖ¸ÁîÈçÏ£º

cmp a, b ; Condition
jbe L30 ; Conditional branch
mov ebx num1 ; ebx holds R
jmp L31 ; Unconditional branch
L30:
mov ebx, num2
L31:

ÔÚjbe L30´¦²úÉú·ÖÖ§£¬×îÖÕebxµÄȡֵ£¬È¡¾öÓÚAÓëBµÄ±È½Ï½á¹û¡£Ê¹ÓÃSETccÖ¸Áî¿ÉÒÔÓÃÈçϵķ½Ê½Ïû³ý·ÖÖ§£º

xor ebx, ebx ; Clear ebx (R in the C code)
cmp A, B
setge bl ; When ebx = 0 or 1
; OR the complement condition
sub ebx, 1 ; ebx=11...11 or 00...00
and ebx, NUM3 ; NUM3 = NUM1-NUM2
add ebx, NUM2 ; ebx=NUM1 or NUM2

setge²¢Ã»ÓÐÕæÕý±ÜÃâAÓëBµÄ±È½Ï£¬¶øÊÇÒÀ¾Ý±È½Ï½á¹ûÐÞ¸ÄÁ˼ĴæÆ÷ebxµÄÖµ¡£Ö®ºóÓÖÀûÓÃÁ˲¹ÂëµÄÒ»¸öÊýѧÔËËãÉϵÄС¼¼ÇÉ£¬Ïû³ýÁË·ÖÖ§¡£

  • CMOVx

CMOVxËù²ÉÓõÄ˼·£¬Êǽ«Á½ÖÖ¿ÉÄܵĽá¹û¶¼ÏȼÆËã³öÀ´£¬È»ºó¸ù¾ÝÌõ¼þÅжϽá¹û(EFLAGS)¾ö¶¨²ÉÓÃÄÄÒ»½á¹û¡£

¿¼ÂÇÈçÏ´úÂ룺

if (x < 0) {
x = -x;
}
mov edx, eax ;¼ÙÉèxµÄÖµÔÚeax¼Ä´æÆ÷,¸ÃÖ¸Áîʹedx=eax
neg eax ;eax=-eax ¸ÃÖ¸ÁîµÄ½á¹û½«ÉèÖÃÌõ¼þ¼Ä´æÆ÷µÄ״̬
cmovs eax,edx ;Èç¹û״̬Ϊ¸º,½«edxµÄÖµ´«µÝ¸øeax

ÕâÁ½¸öÖ¸Áî±íÃæ¿´À´²»´æÔÚ·ÖÖ§£¬µ«ÆäʵÊǽ«·ÖÖ§ÅжÏÒþ²ØÔÚÁ˶ÔÌõ¼þ¼Ä´æÆ÷£¨EFLAGS)µÄ״̬ÅжÏÖС£Ö»²»¹ýÕâЩָÁîµÄÅжÏÓÐCPUÓ²¼þµç·֧³Ö£¬ËùÒÔºÍͨ³£ÒâÒåµÄÈí¼þ·ÖÖ§ÅжÏÓÐËùÇø±ð¡£µ±·ÖÖ§Ô¤²âÕýÈ·Âʲ»ÀíÏëµÄʱºò£¬²ÉÓÃÕâÁ½¸öÖ¸Áî»á´øÀ´Ò»¶¨µÄÐÔÄÜÌáÉý¡£

ʹÓÃlikely()/unlikely()

likely()/unlikely()ÊÇ×î³£¼ûµÄ°ïÖú·ÖÖ§Ô¤²âµÄ·½·¨¡£ÆäΪGCC±àÒëÆ÷ÌṩµÄÁ½¸öÄÚ½¨º¯Êý£¨ÆäËû±àÒëÆ÷Ò²ÓÐÀàËÆµÄ¹¦ÄÜ£©µÄºê£º

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)

³ÌÐòÔ±¿ÉÒÔͨ¹ýÕâÁ½¸öºê½«·ÖÖ§Ô¤²âµÄÐÅÏ¢Ìṩ¸ø±àÒëÆ÷£¬ÓɱàÒëÆ÷¸ù¾ÝCPUÖ´ÐдúÂëµÄ±ê×¼Éú³É»ã±à´úÂ룬½«¿ÉÄÜ×ªÌø(likely())»ò¿ÉÄܲ»×ªÌø(unlikely())µÄ·ÖÖ§µÄ´úÂë·ÅÖÃÓÚºÏÊʵÄλÖã¬ÒÔ´ïµ½ÈËΪÌṩ·ÖÖ§Ô¤²âÐÅÏ¢µÄÄ¿µÄ¡£ÕâÁ½¸öÓï¾äºÜ³£¼û£¬Ö»ÒªÊÇÉÔ΢ÓеãÐÔÄÜÓÅ»¯µÄÒâʶ£¬¾Í»áÓõ½ÕâÁ½¸öºê¡£±È½ÏºÃÆæµÄÇé¿öÊÇ£¬µ±Êµ¼ÊÔËÐÐÇé¿öÓë³ÌÐòÔ±±ê×¢µÄÇé¿öÏà×óʱ£¬CPUÊÇ·ñ»á×Ô¼º¾ÀÕý£¿Õâ¾ÍÒªÁô¸ø¶ÁÕß×Ô¼º¶¯ÊÖÈ¥ÑéÖ¤ÁË:D

ʹÓÃÎÞ·ÖÖ§´úÂë

»¹¼ÇµÃ·ÖÖ§ÓÅ»¯µÄµÚÒ»Ô­ÔòÂ𣿾ÍÊǾ¡Á¿Ïû³ý·ÖÖ§¡£SETccºÍCMOVxÖ¸ÁîÊÇÒ»ÖÖÏû³ý·ÖÖ§µÄ·½·¨£¬µ«Ò²»¹ÓкܶàÆäËûµÄ·½·¨¡£ÀýÈçÎÒÃÇÔÚµÚÒ»½ÚËù¾ÙµÄÀý×Ó£º

if (data[i] > 128) {
sum += data[i];
}

¶ÔÓÚÓ°Ïì·ÖÖ§Ô¤²âµÄËæ»úÊäÈ룬³ýÁËÏÈÅÅÐòÖ®Í⣬µ±ÎÒÃÇÏë²ÉÓÃCMOVxÖ¸ÁîµÄʱºò£¬¿ÉÒÔдΪ£º

int t = data[i];
sum += (t > 128) ? t : 0;

CMOVxÖ¸Áî¹ÌÈ»¿ÉÒÔÏû³ý·ÖÖ§£¬µ«²¢·ÇÊÇûÓдú¼Û¡£µ±ÎÒÃÇÏë±ÜÃâÕâÖÖ´ú¼ÛµÄʱºò£¬»¹¿ÉÒÔʹÓÃÈçÏÂÎÞ·ÖÖ§´úÂë(Branch-less Code)²Ù×÷£º

int t = (data[i] - 128) >> 31;
sum += ~t & data[i];

ÎÞ·ÖÖ§µÄ´úÂëÊÇÒ»ÖÖ±àÂë·ç¸ñ£¬ËäÈ»Ëü³¹µ×Ïû³ýÁË·ÖÖ§¶ÔCPUÁ÷Ë®ÏßµÄÓ°Ï죬µ«ËüÒ²´æÔÚÔö¼Ó¼ÆËãÁ¿£¬½µµÍ´úÂë¿É¶ÁÐÔµÄÎÊÌâ¡£ÏÖ´úCPUµÄ·ÖÖ§Ô¤²âÕýÈ·ÂÊÒѾ­¿ÉÒÔÔÚÒ»°ãÇé¿öÏÂά³ÖÔÚ95%ÒÔÉÏ£¬ËùÒÔµ±·ÖÖ§´æÔÚ¿ÉÔ¤²âµÄ¹æÂɵÄʱºò£¬»¹ÊÇÒÔÐÔÄܲâÊԵĽá¹ûΪ×îÖÕµÄÓÅ»¯ÒÀ¾Ý¡£

   
2338 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

¹È¸è½ÌÄãÈçºÎ¹¹½¨Ò»¸öÓÅÐãµÄÒÆ¶¯ÍøÕ¾
ÈçºÎ¸ßЧµØ¹ÜÀíÍøÕ¾¾²Ì¬×ÊÔ´
¸ßÐÔÄÜÍøÕ¾½¨ÉèµÄ×î¼Ñʵ¼ù
Ïл°ÍøÕ¾×ó²àµ¼º½µÄʵÏÖ
 
Ïà¹ØÎĵµ

ÍøÕ¾½¨Éè·½°¸Á÷³Ì
ÍøÕ¾½¨Éècss½Ì³Ì
ÆóÒµÍøÕ¾½¨ÉèÓëÍÆ¹ã
ÍøÕ¾½¨Éè·½°¸Êé
Ïà¹Ø¿Î³Ì

Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
´ÓÐèÇó¹ý¶Éµ½Éè¼Æ
Èí¼þÉè¼ÆÔ­ÀíÓëʵ¼ù
ÈçºÎ±àд¸ßÖÊÁ¿´úÂë