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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Ê®·ÖÖÓ½ÌÄãÕÆÎÕCPU»º´æ
 
×÷ÕßêdzƣºÉñ¼¼È¦×Ó
  2068  次浏览      27
 2021-4-20 
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½²½âÁË»ù´¡ÖªÊ¶¡¢»º´æÃüÖС¢»º´æÒ»Ö¡¢³ÌÐòÐÔÄܵÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

Ò»¡¢ »ù´¡ÖªÊ¶

Ê×ÏÈ£¬´ó¼Ò¶¼ÖªµÀÏÖÔÚCPUµÄ¶àºË¼¼Êõ£¬¶¼»áÓм¸¼¶»º´æ£¬ÏÖÔÚµÄCPU»áÓÐÈý¼¶Äڴ棨L1£¬L2£¬ L3£©£¬ÈçÏÂͼËùʾ¡£

ÆäÖУº

L1»º´æ·Ö³ÉÁ½ÖÖ£¬Ò»ÖÖÊÇÖ¸Á´æ£¬Ò»ÖÖÊÇÊý¾Ý»º´æ¡£L2»º´æºÍL3»º´æ²»·ÖÖ¸ÁîºÍÊý¾Ý¡£

L1ºÍL2»º´æÔÚÿһ¸öCPUºËÖУ¬L3ÔòÊÇËùÓÐCPUºËÐĹ²ÏíµÄÄÚ´æ¡£

L1¡¢L2¡¢L3µÄÔ½ÀëCPU½ü¾ÍԽС£¬ËÙ¶ÈÒ²¾ÍÔ½¿ì£¬Ô½ÀëCPUÔ¶£¬ËÙ¶ÈÒ²Ô½Âý¡£

ÔÙÍùºóÃæ¾ÍÊÇÄڴ棬ÄÚ´æµÄºóÃæ¾ÍÊÇÓ²ÅÌ¡£ÎÒÃÇÀ´¿´Ò»Ð©ËûÃǵÄËÙ¶È¡£

L1µÄ´æÈ¡ËÙ¶È£º4¸öCPUʱÖÓÖÜÆÚ

L2µÄ´æÈ¡ËÙ¶È£º11¸öCPUʱÖÓÖÜÆÚ

L3µÄ´æÈ¡ËÙ¶È£º39¸öCPUʱÖÓÖÜÆÚ

RAMÄÚ´æµÄ´æÈ¡ËÙ¶È£º107¸öCPUʱÖÓÖÜÆÚ

ÎÒÃÇ¿ÉÒÔ¿´µ½£¬L1µÄËÙ¶ÈÊÇRAMµÄ27±¶£¬L1ºÍL2µÄ´æÈ¡´óС»ù±¾ÉÏÊÇKB¼¶µÄ£¬L3ÔòÊÇMB¼¶±ðµÄ¡£ÀýÈ磬Intel Core i7-8700K,ÊÇÒ»¸ö6ºËµÄCPU£¬Ã¿ºËÉϵÄL1ÊÇ64KB£¨Êý¾ÝºÍÖ¸Áî¸÷32KB£©,L2ÊÇ256K£¬L3ÓÐ2MB¡£

ÎÒÃǵÄÊý¾Ý´ÓÄÚ´æÏòÉÏ£¬Ïȵ½L3£¬ÔÙµ½L2£¬ÔÙµ½L1£¬×îºóµ½¼Ä´æÆ÷½øÐмÆËã¡£ÄÇô£¬ÎªÊ²Ã´»áÉè¼Æ³ÉÈý²ã£¿ÕâÀïÓÐÒÔϼ¸·½ÃæµÄ¿¼ÂÇ£º

ÎïÀíËÙ¶È£¬Èç¹ûÒª¸ü´óµÄÈÝÁ¿¾ÍÐèÒª¸ü¶àµÄ¾§Ìå¹Ü£¬³ýÁËоƬµÄÌå»ý»á±ä´ó£¬¸üÖØÒªµÄÊÇ´óÁ¿µÄ¾§Ìå¹Ü»áµ¼ÖÂËÙ¶ÈϽµ£¬ÒòΪ·ÃÎÊËٶȺÍÒª·ÃÎʵľ§Ìå¹ÜËùÔÚµÄλÖóɷ´±È¡£Ò²¾ÍÊǵ±ÐźÅ·¾¶±ä³¤Ê±£¬Í¨ÐÅËÙ¶È»á±äÂý£¬Õâ¾ÍÊÇÎïÀíÎÊÌâ¡£

ÁíÍâÒ»¸öÎÊÌâÊÇ£¬¶àºË¼¼ÊõÖУ¬Êý¾ÝµÄ״̬ÐèÒªÔÚ¶à¸öCPU½øÐÐͬ²½¡£ÎÒÃÇ¿ÉÒÔ¿´µ½£¬cacheºÍRAMµÄËٶȲî¾àÌ«´ó¡£ËùÒÔ£¬¶à¼¶²»Í¬³ß´çµÄ»º´æÓÐÀûÓÚÌá¸ßÕûÌåµÄÐÔÄÜ¡£

Õâ¸öÊÀ½çÓÀÔ¶ÊÇÆ½ºâµÄ£¬Ò»Ãæ±äµÃÓжà¹âÏÊ£¬ÁíÒ»·½ÃæÒ²»á±äµÃÓжàºÚ°µ£¬½¨Á¢¶à¼¶µÄ»º´æ£¬Ò»¶¨¾Í»áÒýÈëÆäËüµÄÎÊÌâ¡£ÕâÀïÓÐÁ½¸ö±È½ÏÖØÒªµÄÎÊÌâ¡£

Ò»¸öÊDZȽϼòµ¥µÄ»º´æÃüÖÐÂʵÄÎÊÌâ

ÁíÒ»¸öÊDZȽϸ´ÔӵĻº´æ¸üеÄÒ»ÖÂÐÔÎÊÌâ

ÓÈÆäÊǵڶþ¸öÎÊÌ⣬ÔÚ¶àºË¼¼ÊõÏ£¬Õâ¾ÍºÜÏñ·Ö²¼Ê½ÏµÍ³ÁË£¬ÒªÃæ¶Ô¶à¸öµØ·½½øÐиüС£

¶þ¡¢ »º´æÃüÖÐ

Ê×ÏÈ£¬ÎÒÃÇÐèÒªÁ˽âÒ»¸öÊõÓïCache Line¡£»º´æ»ù±¾ÉÏÀ´Ëµ¾ÍÊǰѺóÃæµÄÊý¾Ý¼ÓÔØµ½Àë×Ô¼º×î½üµÄµØ·½£¬¶ÔÓÚCPUÀ´Ëµ£¬ËüÊDz»»áÒ»¸ö×Ö½ÚÒ»¸ö×ֽڵļÓÔØµÄ¡£ÒòΪÕâ·Ç³£Ã»ÓÐЧÂÊ£¬Ò»°ãÀ´Ëµ¶¼ÊÇÒªÒ»¿éÒ»¿éµÄ¼ÓÔØµÄ£¬¶ÔÓÚÕâÑùÒ»¿éÒ»¿éµÄÊý¾Ýµ¥Î»£¬ÊõÓï½Ð¡°Cache Line¡±¡£Ò»°ãÀ´Ëµ£¬Ò»¸öÖ÷Á÷µÄCPUµÄCache LineÊÇ64 Bytes(Ò²ÓеÄCPUÓÃ32BytesºÍ128Bytes),64BytesÒ²¾ÍÊÇ16¸ö32λµÄÊý×Ö,Õâ¾ÍÊÇCPU´ÓÄÚ´æÖÐÀÌÊý¾ÝÉÏÀ´µÄ×îСÊý¾Ýµ¥Î»¡£±ÈÈ磺Cache LineÊÇ×îСµ¥Î»£¨64Bytes£©£¬ËùÒÔÏȰÑCache·Ö²¼¶à¸öCache Line¡£±ÈÈ磺L1ÓÐ32KB£¬ÄÇô 32KB/64B = 512¸öCache Line¡£

»º´æÐèÒª°ÑÄÚ´æÀïµÄÊý¾Ý·Å½øÀ´£¬Ó¢ÎĽÐCPU Associativity£¬CacheµÄÊý¾Ý·ÅÖòßÂÔ¾ö¶¨ÁËÄÚ´æÖеÄÊý¾Ý»á¿½±´µ½CPU CacheÖеÄÄĸöλÖÃÉÏ£¬ÒòΪCacheµÄ´óСԶԶСÓÚÄڴ棬ËùÒÔ£¬ÐèÒªÓÐÒ»ÖÖµØÖ·¹ØÁªËã·¨£¬Äܹ»ÈÃÄÚ´æÖеÄÊý¾Ý±»Ó³Éäµ½CacheÖС£Õâ¸ö¾ÍÓеãÏñÄÚ´æµØÖ·´ÓÂß¼­µØÖ·µ½ÎïÀíµØÖ·µÄÓ³Éä·½·¨¡£µ«ÊDz»ÍêȫһÑù¡£

»ù±¾ÉÏ»áÓÐÒÔϵÄһЩ·½·¨

ÈκÎÒ»¸öÄÚ´æµÄÊý¾Ý¿ÉÒÔ±»»º´æÔÚÈκÎÒ»¸öCache LineÀÕâÖÖ·½·¨ÊÇ×îÁé»îµÄ£¬µ«ÊÇ£¬Èç¹ûÎÒÃÇÒªÖªµÀÒ»¸öÄÚ´æÊÇ·ñ´æÔÚÓÚCacheÖС£ÎÒÃǾÍÐèÒª½øÐÐO(n)¸´ÔӶȵÄCache±éÀú£¬ÕâÊÇûÓÐЧÂʵġ£

ÁíÒ»ÖÖ·½·¨£¬ÎªÁ˽µµÍ»º´æËÑË÷Ëã·¨µÄʱ¼ä¸´ÔÓ¶È£¬ÎÒÃÇҪʹÓÃÏñhash tableÕâÑùµÄÊý¾Ý½á¹¹£¬×î¼òµ¥µÄhash table¾ÍÊÇ¡°ÇóÄ£ÔËË㡱¡£±ÈÈ磬ÎÒÃǵÄL1 CacheÓÐ512¸öCache Line,ÄÇô¹«Ê½¾ÍÊÇ(ÄÚ´æµØÖ· mod 512) *64¾Í¿ÉÒÔÖ±½ÓÕÒµ½ËùÔÚµÄCacheµØÖ·µÄÆ«ÒÆÁË¡£µ«ÊÇ£¬ÕâÑùµÄ·½Ê½ÐèÒª³ÌÐò¶ÔÄÚ´æµØÖ·µÄ·ÃÎʷdz£µÄƽ¾ù£¬²»È»»áÔì³ÉÑÏÖØµØ³åÍ»¡£ËùÒÔ£¬Õâ³ÉÁËÒ»¸ö·Ç³£ÀíÏëµÄÇé¿öÁË¡£

ΪÁ˱ÜÃâÉÏÊöµÄÁ½ÖÖ·½°¸µÄÎÊÌ⣬ÓÚÊǾÍÒªÈÝÈÌÒ»¶¨µÄhash³åÍ»£¬Ò²¾Í³öÏÖÁËN-Way¹ØÁª¡£Ò²¾ÍÊǰÑÁ¬ÐøµÄN¸öCache Line°ó³ÉÒ»×飬Ȼºó£¬ÏÈÕÒµ½Ïà¹ØµÄ×飬ȻºóÔÙÔÚ×éÄÚÕÒµ½Ïà¹ØµÄCache Line¡£Õâ½ÐSet Associativity¡£ÈçÏÂͼËùʾ

¶ÔÓÚ N-Way ×鹨Áª£¬¿ÉÄÜÓе㲻ºÃÀí½â¡£ÕâÀï¾Ù¸öÀý×Ó£¬²¢¶à˵һЩϸ½Ú£¨²»È»ºóÃæµÄ´úÂëÄã»á²»ÄÜÀí½â£©£¬Intel ´ó¶àÊý´¦ÀíÆ÷µÄL1 Cache¶¼ÊÇ32KB£¬8-Way ×éÏàÁª£¬Cache Line ÊÇ64 Bytes¡£ÕâÒâζ×Å

32KBµÄ¿ÉÒԷֳɣ¬32KB / 64 = 512 Ìõ Cache Line£»

ÒòΪÓÐ8 Way£¬ÓÚÊÇ»áÿһWay ÓÐ 512 / 8 = 64 Ìõ Cache Line£»

ÓÚÊÇÿһ·¾ÍÓÐ 64 x 64 = 4096 Byts µÄÄÚ´æ¡£

ΪÁË·½±ãË÷ÒýÄÚ´æµØÖ·

Tag£ºÃ¿Ìõ Cache Line ǰ¶¼»áÓÐÒ»¸ö¶ÀÁ¢·ÖÅäµÄ 24 bitsÀ´´æµÄ tag£¬Æä¾ÍÊÇÄÚ´æµØÖ·µÄǰ24bits£»

Index£ºÄÚ´æµØÖ·ºóÐøµÄ6¸öbitsÔòÊÇÔÚÕâÒ»WayµÄÊÇCache Line Ë÷Òý£¬2^6 = 64 ¸ÕºÃ¿ÉÒÔË÷Òý64ÌõCache Line£»

Offset£ºÔÙÍùºóµÄ6bitsÓÃÓÚ±íʾÔÚCache Line ÀïµÄÆ«ÒÆÁ¿

Ë÷Òý¹ý³ÌÈçÏÂͼËùʾ£º

µ±Äõ½Ò»¸öÄÚ´æµØÖ·µÄʱºò£¬ÏÈÄóöÖмäµÄ 6bits À´£¬ÕÒµ½ÊÇÄÄ×飻

È»ºóÔÚÕâÒ»¸ö8×éµÄcache lineÖУ¬ÔÙ½øÐÐO(n) £¬n=8 µÄ±éÀú£¬Ö÷ÊÇҪƥÅäǰ24bitsµÄtag¡£Èç¹ûÆ¥ÅäÖÐÁË£¬¾ÍËãÃüÖУ¬Èç¹ûûÓÐÆ¥Åäµ½£¬ÄǾÍÊÇcache miss£¬Èç¹ûÊǶÁ²Ù×÷£¬¾ÍÐèÒª½øÏòºóÃæµÄ»º´æ½øÐзÃÎÊÁË¡£L2ºÍL3ͬÑùÊÇÕâÑùµÄËã·¨¡£¶øÌÔÌ­Ëã·¨ÓÐÁ½ÖÖ£¬Ò»ÖÖÊÇËæ»ú£¬ÁíÒ»ÖÖÊÇLRU¡£

ÕâÒ²Òâζ×Å£º

L1 Cache ¿ÉÓ³Éä 36bits µÄÄÚ´æµØÖ·£¬Ò»¹² 2^36 = 64GBµÄÄÚ´æ

µ±CPUÒª·ÃÎÊÒ»¸öÄÚ´æµÄʱºò£¬Í¨¹ýÕâ¸öÄÚ´æÖмäµÄ6bits ¶¨Î»ÊÇÄĸöset£¬Í¨¹ýǰ 24bits ¶¨Î»ÏàÓ¦µÄCache Line¡£

¾ÍÏñÒ»¸öhash TableµÄÊý¾Ý½á¹¹Ò»Ñù£¬ÏÈÊÇO(1)µÄË÷Òý£¬È»ºó½øÈë³åÍ»ËÑË÷¡£ ÒòΪÖмäµÄ 6bits¾ö¶¨ÁËÒ»¸öͬһ¸öset£¬ËùÒÔ£¬¶ÔÓÚÒ»¶ÎÁ¬ÐøµÄÄÚ´æÀ´Ëµ£¬Ã¿¸ô4096µÄÄÚ´æ»á±»·ÅÔÚͬһ¸ö×éÄÚ£¬µ¼Ö»º´æ³åÍ»¡£

´ËÍ⣬µ±ÓÐÊý¾ÝûÓÐÃüÖлº´æµÄʱºò£¬CPU¾Í»áÒÔ×îСΪCache LineµÄµ¥ÔªÏòÄÚ´æ¸üÐÂÊý¾Ý¡£µ±È»£¬CPU²¢²»Ò»¶¨Ö»ÊǸüÐÂ64Bytes£¬ÒòΪ·ÃÎÊÖ÷´æÊµÔÚÊÇÌ«ÂýÁË£¬ËùÒÔ£¬Ò»°ã¶¼»á¶à¸üÐÂһЩ¡£ºÃµÄCPU»áÓÐһЩԤ²âµÄ¼¼Êõ£¬Èç¹ûÕÒµ½Ò»ÖÖpatternµÄ»°£¬¾Í»áÔ¤ÏȼÓÔØ¸ü¶àµÄÄڴ棬°üÀ¨Ö¸ÁîÒ²¿ÉÒÔÔ¤¼ÓÔØ¡£Õâ½Ð Prefetching ¼¼Êõ¡£±ÈÈ磬ÄãÔÚfor-loop·ÃÎÊÒ»¸öÁ¬ÐøµÄÊý×飬ÄãµÄ²½³¤ÊÇÒ»¸ö¹Ì¶¨µÄÊý£¬ÄÚ´æ¾Í¿ÉÒÔ×öµ½prefetching¡£

Á˽âÕâЩϸ½Ú£¬»áÓÐÀûÓÚÎÒÃÇÖªµÀÔÚʲôÇé¿öÏÂÓпÉÒÔµ¼Ö»º´æµÄʧЧ¡£

Èý¡¢»º´æÒ»ÖÂ

¶ÔÓÚÖ÷Á÷µÄCPUÀ´Ëµ£¬»º´æµÄд²Ù×÷»ù±¾ÉÏÊÇÁ½ÖÖ²ßÂÔ

Write Back£ºÐ´²Ù×÷Ö»ÔÚCacheÉÏ£¬È»ºóÔÙflushµ½ÄÚ´æÉÏ

Write Through£ºÐ´²Ù×÷ͬʱдµ½cacheºÍÄÚ´æÉÏ¡£

ΪÁËÌá¸ßдµÄÐÔÄÜ£¬Ò»°ãÀ´Ëµ£¬Ö÷Á÷µÄCPU£¨È磺Intel Core i7/i9£©²ÉÓõÄÊÇWrite BackµÄ²ßÂÔ£¬ÒòΪֱ½ÓдÄÚ´æÊµÔÚÊÇÌ«ÂýÁË¡£

ºÃÁË£¬ÏÖÔÚÎÊÌâÀ´ÁË£¬Èç¹ûÓÐÒ»¸öÊý¾Ý x ÔÚ CPU µÚ0ºËµÄ»º´æÉϱ»¸üÐÂÁË£¬ÄÇôÆäËüCPUºËÉ϶ÔÓÚÕâ¸öÊý¾Ý x µÄÖµÒ²Òª±»¸üУ¬Õâ¾ÍÊÇ»º´æÒ»ÖÂÐÔµÄÎÊÌâ¡£

Ò»°ãÀ´Ëµ£¬ÔÚCPUÓ²¼þÉÏ£¬»áÓÐÁ½ÖÖ·½·¨À´½â¾öÕâ¸öÎÊÌâ¡£

Directory ЭÒé¡£ÕâÖÖ·½·¨µÄµäÐÍʵÏÖÊÇÒªÉè¼ÆÒ»¸ö¼¯ÖÐʽ¿ØÖÆÆ÷£¬ËüÊÇÖ÷´æ´¢Æ÷¿ØÖÆÆ÷µÄÒ»²¿·Ö¡£ÆäÖÐÓÐÒ»¸öĿ¼´æ´¢ÔÚÖ÷´æ´¢Æ÷ÖУ¬ÆäÖаüº¬Óйظ÷ÖÖ±¾µØ»º´æÄÚÈݵÄÈ«¾Ö״̬ÐÅÏ¢¡£µ±µ¥¸öCPU Cache ·¢³ö¶ÁдÇëÇóʱ£¬Õâ¸ö¼¯ÖÐʽ¿ØÖÆÆ÷»á¼ì²é²¢·¢³ö±ØÒªµÄÃüÁÒÔÔÚÖ÷´æºÍCPU CacheÖ®¼ä»òÔÚCPU Cache×ÔÉíÖ®¼ä½øÐÐÊý¾Ýͬ²½ºÍ´«Êä¡£

Snoopy ЭÒé¡£ÕâÖÖЭÒé¸üÏñÊÇÒ»ÖÖÊý¾Ý֪ͨµÄ×ÜÏßÐ͵ļ¼Êõ¡£CPU Cacheͨ¹ýÕâ¸öЭÒé¿ÉÒÔʶ±ðÆäËüCacheÉϵÄÊý¾Ý״̬¡£Èç¹ûÓÐÊý¾Ý¹²ÏíµÄ»°£¬¿ÉÒÔͨ¹ý¹ã²¥»úÖÆ½«¹²ÏíÊý¾ÝµÄ״̬֪ͨ¸øÆäËüCPU Cache¡£Õâ¸öЭÒéÒªÇóÿ¸öCPU Cache ¶¼¿ÉÒÔ¡°¿ú̽¡±Êý¾ÝʼþµÄ֪ͨ²¢×ö³öÏàÓ¦µÄ·´Ó¦¡£ÈçÏÂͼËùʾ£¬ÓÐÒ»¸öSnoopy BusµÄ×ÜÏß¡£

ÒòΪDirectoryЭÒéÊÇÒ»¸öÖÐÐÄʽµÄ£¬»áÓÐÐÔÄÜÆ¿¾±£¬¶øÇÒ»áÔö¼ÓÕûÌåÉè¼ÆµÄ¸´ÔÓ¶È¡£¶øSnoopyЭÒé¸üÏñÊÇ΢·þÎñ+ÏûϢͨѶ£¬ËùÒÔ£¬ÏÖÔÚ»ù±¾¶¼ÊÇʹÓÃSnoopyµÄ×ÜÏßµÄÉè¼Æ¡£

ÔÚ·Ö²¼Ê½ÏµÍ³ÖÐÎÒÃÇÒ»°ãÓÃPaxos/RaftÕâÑùµÄ·Ö²¼Ê½Ò»ÖÂÐÔµÄËã·¨¡£¶øÔÚCPUµÄ΢¹ÛÊÀ½çÀÔò²»±ØÊ¹ÓÃÕâÑùµÄËã·¨¡£ÒòΪCPUµÄ¶à¸öºËµÄÓ²¼þ²»±Ø¿¼ÂÇÍøÂç»á¶Ï»áÑÓ³ÙµÄÎÊÌâ¡£ËùÒÔ£¬CPUµÄ¶àºËÐÄ»º´æ¼äµÄͬ²½µÄºËÐľÍÊÇÒª¹ÜÀíºÃÊý¾ÝµÄ״̬¾ÍºÃÁË¡£

ÕâÀï½éÉܼ¸¸ö״̬ЭÒ飬ÏÈ´Ó×î¼òµ¥µÄ¿ªÊ¼£¬MESIЭÒ飬Õâ¸öЭÒé¸úÄǸöÖøÃûµÄ×ãÇòÔ˶¯Ô±Ã·Î÷ûʲô¹ØÏµ£¬ÆäÖ÷Òª±íʾ»º´æÊý¾ÝÓÐËĸö״̬£ºModified£¨ÒÑÐ޸ģ©, Exclusive£¨¶ÀÕ¼µÄ£©,Shared£¨¹²ÏíµÄ£©£¬Invalid£¨ÎÞЧµÄ£©¡£

MESI ÕâÖÖЭÒéÔÚÊý¾Ý¸üк󣬻á±ê¼ÇÆäËü¹²ÏíµÄCPU»º´æµÄÊý¾Ý¿½±´ÎªInvalid״̬£¬È»ºóµ±ÆäËüCPUÔÙ´ÎreadµÄʱºò£¬¾Í»á³öÏÖ cache miss µÄÎÊÌ⣬´ËʱÔÙ´ÓÄÚ´æÖиüÐÂÊý¾Ý¡£´ÓÄÚ´æÖиüÐÂÊý¾ÝÒâζ×Å20±¶ËٶȵĽµµÍ¡£ÎÒÃÇÄܲ»ÄÜÖ±½Ó´ÓÎÒ¸ô±ÚµÄCPU»º´æÖиüУ¿Êǵģ¬Õâ¾Í¿ÉÒÔÔö¼ÓºÜ¶àËÙ¶ÈÁË£¬µ«ÊÇ״̬¿ØÖÆÒ²¾Í±äÂé·³ÁË¡£»¹ÐèÒª¶àÀ´Ò»¸ö״̬£ºOwner(ËÞÖ÷)£¬ÓÃÓÚ±ê¼Ç£¬ÎÒÊǸüÐÂÊý¾ÝµÄÔ´¡£ÓÚÊÇ£¬³öÏÖÁË MOESI ЭÒé¡£

MOESIЭÒéÔÊÐí CPU Cache ¼äͬ²½Êý¾Ý£¬ÓÚÊÇÒ²½µµÍÁ˶ÔÄÚ´æµÄ²Ù×÷£¬ÐÔÄÜÊǷdz£´óµÄÌáÉý£¬µ«ÊÇ¿ØÖÆÂß¼­Ò²·Ç³£¸´ÔÓ¡£

˳±ã˵һÏ£¬Óë MOESI ЭÒéÀàËÆµÄÒ»¸öЭÒéÊÇ MESIF£¬ÆäÖÐµÄ F ÊÇ Forward£¬Í¬ÑùÊǰѸüйýµÄÊý¾Ýת·¢¸ø±ðµÄ CPU Cache µ«ÊÇ£¬MOESI ÖÐµÄ Owner ״̬ ºÍMESIF ÖÐµÄ Forward ״̬ÓÐÒ»¸ö·Ç³£´óµÄ²»Ò»Ñù¡ª¡ª Owner״̬ϵÄÊý¾ÝÊÇdirtyµÄ£¬»¹Ã»ÓÐд»ØÄڴ棬Forward״̬ϵÄÊý¾ÝÊÇcleanµÄ£¬¿ÉÒÔ¶ªÆú¶ø²»ÓÃÁíÐÐ֪ͨ¡£

ÐèҪ˵Ã÷µÄÊÇ£¬AMDÓÃMOESI£¬IntelÓÃMESIF¡£ËùÒÔ£¬F ״̬Ö÷ÒªÊÇÕë¶Ô CPU L3 Cache Éè¼ÆµÄ£¨Ç°ÃæÎÒÃÇ˵¹ý£¬L3ÊÇËùÓÐCPUºËÐĹ²ÏíµÄ£©¡£

ËÄ¡¢³ÌÐòÐÔÄÜ

Á˽âÁËÎÒÃÇÉÏÃæµÄÕâЩ¶«Î÷ºó£¬ÎÒÃÇÀ´¿´Ò»Ï¶ÔÓÚ³ÌÐòµÄÓ°Ïì¡£

ʾÀýÒ»

Ê×ÏÈ£¬¼ÙÉèÎÒÃÇÓÐÒ»¸ö64M³¤µÄÊý×飬ÉèÏëÒ»ÏÂÏÂÃæµÄÁ½¸öÑ­»·£º

const int LEN = 64*1024*1024;
int *arr = new int[LEN];
for (int i = 0; i < LEN; i += 2) arr[i] *= i;
for (int i = 0; i < LEN; i += 8) arr[i] *= i;

°´ÎÒÃǵÄÏë·¨£¬µÚ¶þ¸öÑ­»·Òª±ÈµÚÒ»¸öÑ­»·ÉÙ4±¶µÄ¼ÆËãÁ¿¡£ÆäÓ¦¸ÃÒª¿ì4±¶µÄ¡£µ«Êµ¼ÊÅÜÏÂÀ´²¢²»ÊÇ£¬ÔÚÎҵĻúÆ÷ÉÏ£¬µÚÒ»¸öÑ­»·ÐèÒª128ºÁÃ룬µÚ¶þ¸öÑ­»·ÔòÐèÒª122ºÁÃ룬Ïà²îÎÞ¼¸¡£ÕâÀï×îÖ÷ÒªµÄÔ­Òò¾ÍÊÇ Cache Line£¬ÒòΪCPU»áÒÔÒ»¸öCache Line 64Bytes×îСʱµ¥Î»¼ÓÔØ£¬Ò²¾ÍÊÇ16¸ö32bitsµÄÕûÐÍ£¬ËùÒÔ£¬ÎÞÂÛÄã²½³¤ÊÇ2»¹ÊÇ8£¬¶¼²î²»¶à¡£¶øºóÃæµÄ³Ë·¨ÆäʵÊDz»ºÄCPUʱ¼äµÄ¡£

ʾÀý¶þ

½ÓÏÂÀ´£¬ÎÒÃÇÔÙÀ´¿´¸öʾÀý¡£ÏÂÃæÊÇÒ»¸ö¶þάÊý×éµÄÁ½ÖÖ±éÀú·½Ê½£¬Ò»¸öÖðÐбéÀú£¬Ò»¸öÊÇÖðÁбéÀú£¬ÕâÁ½ÖÖ·½Ê½ÔÚÀíÂÛÉÏÀ´Ëµ£¬Ñ°Ö·ºÍ¼ÆËãÁ¿¶¼ÊÇÒ»ÑùµÄ£¬Ö´ÐÐʱ¼äÓ¦¸ÃÒ²ÊÇÒ»ÑùµÄ¡£

const int row = 1024;
const int col = 512
int matrix[row][col];
//ÖðÐбéÀú
int sum_row=0;
for(int _r=0; _r<row; _r++) {
for(int _c=0; _c<col; _c++){
sum_row += matrix[_r][_c];
}
}
//ÖðÁбéÀú
int sum_col=0;
for(int _c=0; _c<col; _c++) {
for(int _r=0; _r<row; _r++){
sum_col += matrix[_r][_c];
}
}

È»¶ø£¬²¢²»ÊÇ£¬ÔÚÎҵĻúÆ÷ÉÏ£¬µÃµ½ÏÂÃæµÄ½á¹û¡£

ÖðÐбéÀú£º0.083ms

ÖðÁбéÀú£º1.072ms

Ö´ÐÐʱ¼äÓÐÊ®¼¸±¶µÄ²î¾à¡£ÆäÖеÄÔ­Òò£¬¾ÍÊÇÖðÁбéÀú¶ÔÓÚCPU Cache µÄÔË×÷·½Ê½²¢²»ÓѺã¬ËùÒÔ£¬¸¶³ö¾Þ´óµÄ´ú¼Û¡£

ʾÀýÈý

½ÓÏÂÀ´£¬ÎÒÃÇÀ´¿´Ò»Ï¶àºËϵÄÐÔÄÜÎÊÌ⣬²Î¿´ÈçϵĴúÂë¡£Á½¸öÏß³ÌÔÚ²Ù×÷Ò»¸öÊý×éµÄÁ½¸ö²»Í¬µÄÔªËØ£¨ÎÞÐè¼ÓËø£©£¬Ïß³ÌÑ­»·1000Íò´Î£¬×ö¼Ó·¨²Ù×÷¡£ÔÚÏÂÃæµÄ´úÂëÖУ¬ÎÒ¸ßÁÁÁËÒ»ÐУ¬¾ÍÊÇp2Ö¸Õ룬ҪôÊÇp[1]£¬»òÊÇ p[30]£¬ÀíÂÛÉÏÀ´Ëµ£¬ÎÞÂÛ·ÃÎÊÄÄÁ½¸öÊý×éÔªËØ£¬¶¼Ó¦¸ÃÊÇÒ»ÑùµÄÖ´ÐÐʱ¼ä¡£

void fn (int* data) {
for(int i = 0; i < 10*1024*1024; ++i)
*data += rand();
}
int p[32];
int *p1 = &p[0];
int *p2 = &p[1]; // int *p2 = &p[30];
thread t1(fn, p1);
thread t2(fn, p2);

 

È»¶ø£¬²¢²»ÊÇ£¬ÔÚÎҵĻúÆ÷ÉÏÖ´ÐÐÏÂÀ´µÄ½á¹ûÊÇ£º

¶ÔÓÚ p[0] ºÍ p[1] £º570ms

¶ÔÓÚ p[0] ºÍ p[30]£º105ms

ÕâÊÇÒòΪ p[0] ºÍ p[1] ÔÚͬһÌõ Cache Line ÉÏ£¬¶ø p[0] ºÍ p[30] Ôò²»¿ÉÄÜÔÚͬһÌõCache Line ÉÏ £¬CPUµÄ»º´æ×îСµÄ¸üе¥Î»ÊÇCache Line£¬ËùÒÔ£¬Õâµ¼ÖÂËäÈ»Á½¸öÏß³ÌÔÚд²»Í¬µÄÊý¾Ý£¬µ«ÊÇÒòΪÕâÁ½¸öÊý¾ÝÔÚͬһÌõCache LineÉÏ£¬¾Í»áµ¼Ö»º´æÐèÒª²»¶Ï½øÔÚÁ½¸öCPUµÄL1/L2ÖнøÐÐͬ²½£¬´Ó¶øµ¼ÖÂÁË5±¶µÄʱ¼ä²îÒì¡£

 

 

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

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
»ùÓÚFPGAµÄÒì¹¹¼ÆËãÔÚ¶àýÌåÖеÄÓ¦ÓÃ
ÉîÈëLinuxÄں˼ܹ¹¡ª¡ª¼ò½éÓë¸ÅÊö
LinuxÄÚºËϵͳ¼Ü¹¹½éÉÜ
dzÎöǶÈëʽCÓÅ»¯¼¼ÇÉ
½ø³Ì¼äͨÐÅ£¨IPC£©½éÉÜ
×îпγÌ
ǶÈëʽLinuxÇý¶¯¿ª·¢
´úÂëÕû½àÖ®µÀ-̬¶È¡¢¼¼ÒÕÓëϰ¹ß
ǶÈëʽÈí¼þ²âÊÔ
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
ǶÈëʽÈí¼þ¿É¿¿ÐÔÉè¼Æ
³É¹¦°¸Àý
ij¾ü¹¤Ëù ǶÈëʽÈí¼þ¼Ü¹¹
Öк½¹¤ÒµÄ³Ñо¿Ëù ǶÈëʽÈí¼þ¿ª·¢Ö¸ÄÏ
ij¹ìµÀ½»Í¨ ǶÈëʽÈí¼þ¸ß¼¶Éè¼ÆÊµ¼ù
ÉîÛÚ Ç¶ÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
ijÆóÒµ »ùÓÚIPDµÄǶÈëʽÈí¼þ¿ª·¢