สายแคชทำงานอย่างไร


169

ฉันเข้าใจว่าตัวประมวลผลนำข้อมูลไปสู่แคชผ่านทางแคชบรรทัดซึ่งตัวอย่างเช่นบนตัวประมวลผล Atom ของฉันนำมาครั้งละประมาณ 64 ไบต์ไม่ว่าขนาดของข้อมูลจริงที่อ่านจะเป็นเท่าใด

คำถามของฉันคือ

ลองนึกภาพว่าคุณต้องอ่านหนึ่งไบต์จากหน่วยความจำ 64 ไบต์ใดที่จะถูกนำเข้าไปในแคช

ความเป็นไปได้สองอย่างที่ฉันเห็นคือทั้ง 64 ไบต์เริ่มต้นที่ขอบเขต 64 ไบต์ที่ใกล้เคียงที่สุดด้านล่างไบต์ที่น่าสนใจหรือ 64 ไบต์จะกระจายไปรอบ ๆ ไบต์ในวิธีที่กำหนดไว้ล่วงหน้า (ตัวอย่างเช่นครึ่งล่างครึ่งครึ่งบนหรือ ทั้งหมดข้างต้น).

มันคืออะไร


22
อ่าน: อะไรโปรแกรมเมอร์ทุกคนควรรู้เกี่ยวกับหน่วยความจำ จากนั้นอ่านอีกครั้ง ที่ดีขึ้น (PDF) แหล่งที่มาที่นี่
andersoj

คำตอบ:


129

หากบรรทัดแคชที่มีไบต์หรือคำที่คุณกำลังโหลดนั้นไม่มีอยู่ในแคช CPU ของคุณจะขอ 64 ไบต์ที่เริ่มต้นที่ขอบเขตบรรทัดแคช (ที่อยู่ที่ใหญ่ที่สุดด้านล่างที่อยู่ที่คุณต้องการที่มีหลาย 64) .

โมดูลหน่วยความจำเครื่องคอมพิวเตอร์ที่ทันสมัยโอน 64 บิต (8 ไบต์) ที่เวลาในการออกมาแปดถ่ายโอนดังนั้นหนึ่งทริกเกอร์คำสั่งอ่านหรือเขียนของสายแคชเต็มรูปแบบจากหน่วยความจำ (DDR1 / 2/3/4 SDRAM ระเบิดขนาดการถ่ายโอนจะขึ้นกำหนดให้ 64B; ซีพียูจะเลือกขนาดการถ่ายโอนออกมาให้ตรงกับขนาดเส้นแคชของพวกเขา แต่เป็นเรื่องธรรมดา 64B)

ตามกฎทั่วไปหากหน่วยประมวลผลไม่สามารถคาดการณ์การเข้าถึงหน่วยความจำ (และดึงข้อมูลล่วงหน้า) กระบวนการดึงข้อมูลอาจใช้เวลาประมาณ 90 นาโนวินาทีหรือ ~ 250 รอบนาฬิกา (จาก CPU ที่ทราบที่อยู่ไปยัง CPU ที่รับข้อมูล)

ในทางตรงกันข้ามการเข้าใช้แคช L1 มีเวลาแฝงในการใช้งาน 3 หรือ 4 รอบและการโหลดซ้ำของร้านค้ามีเวลาแฝงในการส่งต่อร้านค้า 4 หรือ 5 รอบในซีพียู x86 สมัยใหม่ สิ่งที่มีความคล้ายคลึงกับสถาปัตยกรรมอื่น ๆ

อ่านเพิ่มเติม: Ulrich Drepper ของอะไรทุกโปรแกรมเมอร์ควรรู้เกี่ยวกับหน่วยความจำ คำแนะนำซอฟต์แวร์ prefetch ค่อนข้างล้าสมัย: prefetchers HW สมัยใหม่ฉลาดขึ้นและการทำไฮเปอร์เธรดเป็นวิธีที่ดีกว่าใน P4 วัน (ดังนั้นเธรด prefetch จะเสียเปล่า) นอกจากนี้ยังมี tag wiki มีลิงก์ประสิทธิภาพจำนวนมากสำหรับสถาปัตยกรรมนั้น


1
คำตอบนี้ไม่สมเหตุสมผลเลย แบนด์วิดท์หน่วยความจำ 64 บิต (ซึ่งเป็นสิ่งที่ผิดในเรื่องนั้น) ทำอะไรกับ 64 ไบต์ (!) ไม่น่าสนใจ? นอกจากนี้ยังมี 10-30 NS นอกจากนี้ยังมีที่ผิดโดยสิ้นเชิงถ้าคุณตีราม อาจเป็นจริงสำหรับแคช L3 หรือ L2 แต่ไม่เหมาะสำหรับ RAM ที่มีขนาดมากกว่า 90ns สิ่งที่คุณหมายถึงคือเวลาที่ถ่ายภาพต่อเนื่อง - เวลาในการเข้าถึงคำศัพท์ถัดไปในโหมดถ่ายภาพต่อเนื่อง (ซึ่งจริงๆแล้วเป็นคำตอบที่ถูกต้อง)
Martin Kersten

5
@MartinKersten: ช่องทางหนึ่งใน DDR1 / 2/3/4 SDRAM ไม่ใช้แบบ 64 บิตความกว้างของบัสข้อมูล การโอนการระเบิดของสายแคชทั้งหมดจะใช้เวลาแปดโอน 8B แต่ละและเป็นสิ่งที่เกิดขึ้นจริง อาจยังคงถูกต้องว่ากระบวนการนี้ได้รับการปรับให้เหมาะสมโดยการถ่ายโอนก้อนขนาด 8B ที่ประกอบด้วยไบต์ที่ต้องการก่อนเช่นเริ่มการระเบิดที่นั่น (และล้อมรอบหากไม่ใช่ 8B แรกของขนาดการถ่ายโอนระเบิด) CPU สมัยใหม่ที่มีแคชหลายระดับอาจไม่ทำเช่นนั้นอีกต่อไปเพราะมันหมายถึงการถ่ายทอดบล็อกแรกของการระเบิดไปจนถึงแคช L1 ก่อน
Peter Cordes

2
Haswell มีเส้นทาง 64B ระหว่างแคช L2 และ L1D (เช่นความกว้างบรรทัดแคชแบบเต็ม) ดังนั้นการถ่ายโอน 8B ที่มีไบต์ที่ร้องขอจะทำให้ใช้งานบัสไม่ได้ผล @ มาร์ตินยังแก้ไขเกี่ยวกับเวลาในการเข้าถึงสำหรับโหลดที่ต้องไปยังหน่วยความจำหลัก
Peter Cordes

3
คำถามที่ดีเกี่ยวกับว่าข้อมูลไปถึงลำดับชั้นหน่วยความจำพร้อมกันหรือไม่หรือ L3 รอสายเต็มจากหน่วยความจำก่อนที่จะเริ่มส่งถึง L2 มีบัฟเฟอร์การโอนระหว่างระดับแคชที่ต่างกันและแต่ละมิสที่อ้างสิทธิ์จะมีหนึ่งตัว ดังนั้น (การคาดเดาทั้งหมด ) อาจ L3 ทำให้ไบต์จากตัวควบคุมหน่วยความจำลงในบัฟเฟอร์การรับของตัวเองในเวลาเดียวกันกับการใส่ลงในบัฟเฟอร์การโหลดที่เหมาะสมสำหรับแคช L2 ที่ต้องการ เมื่อสายถูกถ่ายโอนจากหน่วยความจำอย่างเต็มที่ L3 จะแจ้งให้ L2 ทราบว่าสายพร้อมและคัดลอกลงในอาร์เรย์ของตัวเอง
Peter Cordes

2
@ มาร์ติน: ฉันตัดสินใจที่จะไปข้างหน้าและแก้ไขคำตอบนี้ ฉันคิดว่ามันแม่นยำกว่าตอนนี้และยังง่าย ผู้อ่านในอนาคต: ดูคำถามของ Mike76 และคำตอบของฉัน: stackoverflow.com/questions/39182060/…
Peter Cordes

22

หากบรรทัดแคชมีความกว้าง 64 ไบต์แล้วพวกเขาจะสอดคล้องกับบล็อกของหน่วยความจำซึ่งเริ่มต้นจากที่อยู่ที่หารด้วย 64 อย่างน้อย 6 บิตที่สำคัญอย่างยิ่งของที่อยู่ใด ๆ จะถูกชดเชยเข้าไปในบรรทัดแคช

ดังนั้นสำหรับไบต์ที่กำหนดไว้บรรทัดแคชที่จะต้องดึงข้อมูลสามารถพบได้โดยการล้างที่อยู่ที่มีความหมายน้อยหกบิตของที่อยู่ซึ่งสอดคล้องกับการปัดเศษลงไปยังที่อยู่ที่ใกล้ที่สุดซึ่งหารด้วย 64

แม้ว่านี้จะกระทำโดยฮาร์ดแวร์เราสามารถแสดงการคำนวณโดยใช้บางส่วนอ้างอิง C นิยามแมโคร:

#define CACHE_BLOCK_BITS 6
#define CACHE_BLOCK_SIZE (1U << CACHE_BLOCK_BITS)  /* 64 */
#define CACHE_BLOCK_MASK (CACHE_BLOCK_SIZE - 1)    /* 63, 0x3F */

/* Which byte offset in its cache block does this address reference? */
#define CACHE_BLOCK_OFFSET(ADDR) ((ADDR) & CACHE_BLOCK_MASK)

/* Address of 64 byte block brought into the cache when ADDR accessed */
#define CACHE_BLOCK_ALIGNED_ADDR(ADDR) ((ADDR) & ~CACHE_BLOCK_MASK)

1
ฉันมีเวลายากที่จะเข้าใจสิ่งนี้ ผมรู้ก็คือ 2 ปีต่อมา แต่คุณสามารถให้ฉันรหัสตัวอย่างสำหรับนี้หรือไม่? หนึ่งหรือสองบรรทัด
นิค

1
@Nick เหตุผลวิธีการนี้ใช้งานได้ในระบบเลขฐานสอง กำลังของ 2 ใด ๆ ที่มีการตั้งค่าเพียงหนึ่งบิตและบิตที่เหลือทั้งหมดดังนั้นสำหรับ 64 คุณได้0b1000000สังเกตว่าตัวเลข 6 ตัวสุดท้ายเป็นศูนย์ดังนั้นแม้ว่าคุณจะมีจำนวนที่มี 6 ชุดใด ๆ (ซึ่งเป็นตัวแทนของตัวเลข % 64) การล้างข้อมูลจะทำให้ที่อยู่หน่วยความจำที่มีการจัดตำแหน่ง 64- ไบต์ใกล้ที่สุด
ตำนาน 2k

21

ประการแรกการเข้าถึงหน่วยความจำหลักมีราคาแพงมาก ปัจจุบันซีพียู 2GHz (ช้าที่สุดหนึ่งครั้ง) มี 2G ticks (รอบ) ต่อวินาที CPU (คอร์เสมือนในปัจจุบัน) สามารถดึงค่าจากการลงทะเบียนหนึ่งครั้งต่อหนึ่งขีด เนื่องจากแกนประมวลผลเสมือนประกอบด้วยหน่วยประมวลผลหลายหน่วย (ALU - หน่วยคำนวณทางคณิตศาสตร์, FPU ฯลฯ ) จึงสามารถประมวลผลคำสั่งบางอย่างพร้อมกันได้ถ้าเป็นไปได้

การเข้าถึงหน่วยความจำหลักมีค่าใช้จ่ายประมาณ 70ns ถึง 100ns (DDR4 เร็วกว่าเล็กน้อย) เวลานี้โดยทั่วไปแล้วมองหาแคช L1, L2 และ L3 และกว่ากดหน่วยความจำ (ส่งคำสั่งไปยังตัวควบคุมหน่วยความจำซึ่งส่งไปยังหน่วยความจำธนาคาร) รอการตอบสนองและทำ

100ns หมายถึงประมาณ 200 เห็บ ดังนั้นโดยทั่วไปหากโปรแกรมมักจะพลาดแคชที่แต่ละหน่วยความจำเข้าถึง CPU จะใช้เวลาประมาณ 99,5% ของเวลา (หากเป็นเพียงการอ่านหน่วยความจำเท่านั้น) ว่างเพื่อรอหน่วยความจำ

เพื่อเร่งความเร็วสิ่งต่าง ๆ นั่นคือ L1, L2, L3 แคช พวกเขาใช้หน่วยความจำวางโดยตรงบนชิปและใช้วงจรทรานซิสเตอร์ชนิดอื่นเพื่อเก็บบิตที่กำหนด ใช้พลังงานมากขึ้นและมีราคาแพงกว่าหน่วยความจำหลักเนื่องจาก CPU มักจะผลิตโดยใช้เทคโนโลยีขั้นสูงและความล้มเหลวในการผลิตในหน่วยความจำ L1, L2, L3 จึงมีโอกาสทำให้ CPU ไร้ค่า (ข้อบกพร่อง) ดังนั้น L1 ขนาดใหญ่, L2, L3 แคชเพิ่มอัตราความผิดพลาดซึ่งจะลดผลตอบแทนที่ลดลง ROI โดยตรง ดังนั้นจึงมีการแลกเปลี่ยนขนาดใหญ่เมื่อมันมาถึงขนาดแคชที่มีอยู่

(ปัจจุบันมีการสร้างแคช L1, L2 และ L3 มากขึ้นเพื่อให้สามารถปิดการใช้งานบางส่วนเพื่อลดโอกาสที่ข้อบกพร่องในการผลิตจริงคือพื้นที่หน่วยความจำแคชทำให้หน่วยความจำแคชแสดงผลข้อบกพร่องทั้งหมด)

เพื่อให้แนวคิดเกี่ยวกับเวลา (แหล่งที่มา: ต้นทุนในการเข้าถึงแคชและหน่วยความจำ )

  • L1 cache: 1ns ถึง 2ns (2-4 รอบ)
  • L2 Cache: 3ns ถึง 5ns (6-10 รอบ)
  • L3 cache: 12ns ถึง 20ns (24-40 รอบ)
  • RAM: 60ns (120 รอบ)

เนื่องจากเราผสมประเภท CPU ที่แตกต่างกันสิ่งเหล่านี้เป็นเพียงการประมาณ แต่ให้ความคิดที่ดีว่าเกิดอะไรขึ้นเมื่อค่าหน่วยความจำถูกดึงออกมาและเราอาจได้รับผลกระทบหรือพลาดในชั้นแคชบางอย่าง

โดยทั่วไปแคชจะเพิ่มความเร็วในการเข้าถึงหน่วยความจำอย่างมาก (60ns เทียบกับ 1ns)

การดึงค่ามาเก็บไว้ในแคชเพื่อโอกาสในการอ่านซ้ำนั้นดีสำหรับตัวแปรที่เข้าถึงได้บ่อย แต่สำหรับการดำเนินการคัดลอกหน่วยความจำมันจะยังคงช้าเนื่องจากมีคนอ่านค่าเขียนค่าที่อื่นและไม่เคยอ่านค่า อีกครั้ง ... ไม่พบแคช, ช้าตาย (นอกจากนี้อาจเกิดขึ้นพร้อมกันเนื่องจากเราไม่ได้ดำเนินการตามคำสั่ง)

การคัดลอกหน่วยความจำนี้สำคัญมากที่จะมีวิธีการที่แตกต่างกันในการเพิ่มความเร็ว ในหน่วยความจำวันแรกมักจะสามารถคัดลอกหน่วยความจำนอก CPU มันถูกจัดการโดยตัวควบคุมหน่วยความจำโดยตรงดังนั้นการดำเนินการคัดลอกหน่วยความจำจึงไม่ก่อให้เกิดมลพิษกับแคช

แต่นอกเหนือจากการคัดลอกหน่วยความจำธรรมดาการเข้าถึงหน่วยความจำแบบอนุกรมเป็นเรื่องปกติ ตัวอย่างคือการวิเคราะห์ชุดข้อมูล การมีอาร์เรย์ของจำนวนเต็มและผลรวมของการคำนวณค่าเฉลี่ยค่าเฉลี่ยหรือแม้แต่การค้นหาค่าที่แน่นอน (ตัวกรอง / การค้นหา) เป็นอีกระดับหนึ่งที่สำคัญมากของอัลกอริทึมที่ทำงานทุกครั้งบน CPU ที่มีวัตถุประสงค์ทั่วไป

ดังนั้นจากการวิเคราะห์รูปแบบการเข้าถึงหน่วยความจำจึงเห็นได้ชัดว่าข้อมูลอ่านตามลำดับบ่อยมาก มีความน่าจะเป็นสูงที่หากโปรแกรมอ่านค่าที่ดัชนีฉันว่าโปรแกรมจะอ่านค่า i + 1 ด้วย ความน่าจะเป็นนี้สูงกว่าความน่าจะเป็นที่โปรแกรมเดียวกันจะอ่านค่า i + 2 และอื่น ๆ

ดังนั้นเมื่อกำหนดที่อยู่หน่วยความจำแล้ว (และยังคงเป็น) เป็นความคิดที่ดีที่จะอ่านล่วงหน้าและดึงค่าเพิ่มเติม นี่คือเหตุผลว่าทำไมมีโหมดเพิ่ม

การเข้าถึงหน่วยความจำในโหมดเพิ่มประสิทธิภาพหมายถึงว่าที่อยู่นั้นถูกส่งและมีหลายค่าที่ส่งต่อเนื่องกัน แต่ละค่าเพิ่มเติมที่ส่งจะใช้เวลาประมาณ 10ns เพิ่มเติม (หรือต่ำกว่า)

ปัญหาอื่นคือที่อยู่ การส่งที่อยู่ต้องใช้เวลา เพื่อส่งหน่วยความจำส่วนใหญ่จะต้องส่งที่อยู่ขนาดใหญ่ ในวันแรกมันหมายความว่าที่อยู่บัสไม่ใหญ่พอที่จะส่งที่อยู่ในรอบเดียว (ติ๊ก) และมากกว่าหนึ่งรอบจะต้องส่งที่อยู่เพิ่มล่าช้ามากขึ้น

อินไลน์แคชขนาด 64 ไบต์หมายความว่าหน่วยความจำจะถูกแบ่งออกเป็นบล็อกขนาดต่าง ๆ (ไม่ทับซ้อนกัน) ของหน่วยความจำที่มีขนาด 64 ไบต์ 64bytes หมายถึงที่อยู่เริ่มต้นของแต่ละบล็อกมีบิตที่อยู่หกที่ต่ำที่สุดที่จะเป็นศูนย์เสมอ ดังนั้นการส่งบิตหกศูนย์เหล่านี้ในแต่ละครั้งจึงไม่จำเป็นต้องเพิ่มพื้นที่ที่อยู่ 64 เท่าสำหรับความกว้างของบัสแอดเดรสใด ๆ (เอฟเฟกต์ต้อนรับ)

ปัญหาอีกประการหนึ่งที่บรรทัดแคชจะแก้ไข (ข้างการอ่านล่วงหน้าและการบันทึก / เพิ่มหกบิตบนบัสแอดเดรส) คือวิธีการจัดระเบียบแคช ตัวอย่างเช่นหากแคชจะแบ่งออกเป็น 8 ไบต์ (64 บิต) บล็อก (เซลล์) หนึ่งต้องเก็บที่อยู่ของเซลล์หน่วยความจำเซลล์แคชนี้เก็บค่าไว้พร้อมกับมัน หากที่อยู่จะเป็น 64 บิตนั่นหมายความว่าครึ่งหนึ่งของขนาดแคชจะถูกใช้โดยที่อยู่ซึ่งทำให้เกิดค่าใช้จ่าย 100%

เนื่องจากบรรทัดแคชคือ 64bytes และ CPU อาจใช้ 64 บิต - 6 บิต = 58 บิต (ไม่จำเป็นต้องเก็บบิตศูนย์ให้ถูกต้องเกินไป) หมายความว่าเราสามารถแคช 64 ไบต์หรือ 512 บิตด้วยค่าใช้จ่าย 58 บิต (11% ค่าใช้จ่าย) ในความเป็นจริงที่อยู่ที่เก็บไว้มีขนาดเล็กกว่านี้ แต่มีข้อมูลสถานะ (เช่นเป็นบรรทัดแคชที่ถูกต้องและถูกต้องสกปรกและจำเป็นต้องเขียนกลับในหน่วยความจำ ฯลฯ )

อีกแง่มุมหนึ่งคือเรามีแคชแบบเชื่อมโยงไว้ ไม่ใช่ทุกเซลล์แคชสามารถจัดเก็บที่อยู่ที่แน่นอน แต่เป็นชุดย่อยของที่อยู่เหล่านั้นเท่านั้น สิ่งนี้ทำให้บิตแอดเดรสที่เก็บไว้ที่จำเป็นมีขนาดเล็กลงทำให้สามารถเข้าถึงแคชแบบขนานได้ (แต่ละเซ็ตย่อยสามารถเข้าถึงได้ครั้งเดียว แต่เป็นอิสระจากเซ็ตย่อยอื่น ๆ )

โดยเฉพาะอย่างยิ่งเมื่อมีการซิงโครไนซ์การเข้าถึงแคช / หน่วยความจำระหว่างคอร์เสมือนที่แตกต่างกันหน่วยประมวลผลหลายหน่วยที่เป็นอิสระต่อหนึ่งคอร์และในที่สุดโปรเซสเซอร์หลายตัวบนเมนบอร์ดหนึ่งตัว

นี่เป็นแนวคิดพื้นฐานที่ว่าทำไมเราถึงมีแคช ประโยชน์จากการอ่านล่วงหน้าสูงมากและกรณีที่เลวร้ายที่สุดในการอ่านไบต์เดียวจากแคชไลน์และไม่เคยอ่านส่วนที่เหลืออีกเลยจะบางมากเนื่องจากความน่าจะเป็นนั้นแคบมาก

ขนาดของแคชไลน์ (64) คือการแลกเปลี่ยนที่เลือกอย่างชาญฉลาดระหว่างแคชไลน์ขนาดใหญ่ทำให้ไม่สามารถอ่านไบต์สุดท้ายของมันได้ในอนาคตอันใกล้ระยะเวลาที่ใช้ในการดึงแคชไลน์ที่สมบูรณ์ จากหน่วยความจำ (และเพื่อเขียนกลับ) และค่าใช้จ่ายในองค์กรแคชและการขนานของการเข้าถึงแคชและหน่วยความจำ


1
แคชชุดเชื่อมโยงใช้บิตที่อยู่บางอย่างเพื่อเลือกชุดดังนั้นแท็กอาจสั้นกว่าตัวอย่างของคุณได้ แน่นอนแคชยังต้องติดตามว่าแท็กใดที่ไปพร้อมกับอาร์เรย์ข้อมูลในชุด แต่โดยทั่วไปจะมีชุดมากกว่าวิธีภายในชุด (เช่นแคช L1D แบบเชื่อมโยง 32kB 8 ทิศทางกับ 64B บรรทัดใน Intel x86 CPUs: offset 6 บิต, ดัชนี 6 บิตแท็กจะต้องมีความกว้าง 48-12 บิตเนื่องจาก x86-64 (สำหรับตอนนี้) มี 48- เท่านั้น บิตที่อยู่ทางกายภาพในฐานะที่ฉันแน่ใจว่าคุณรู้ว่ามันไม่ใช่เรื่องบังเอิญที่ต่ำ 12 บิตคือหน้าที่ชดเชยดังนั้น L1 สามารถ VIPT โดยไม่ต้อง aliasing)..
ปีเตอร์ Cordes

คำตอบที่น่าตื่นตา ... มีปุ่ม "ถูกใจ" ที่ไหนบ้าง?
Edgard Lima

@EggardLima ไม่ใช่ปุ่ม upvote ใช่ไหม
Pacerier

6

โปรเซสเซอร์อาจมีแคชหลายระดับ (L1, L2, L3) และสิ่งเหล่านี้แตกต่างกันตามขนาดและความเร็ว

แต่เพื่อให้เข้าใจถึงสิ่งที่จะเข้าสู่แคชแต่ละอย่างคุณจะต้องศึกษาตัวพยากรณ์สาขาที่ใช้โดยโปรเซสเซอร์เฉพาะนั้นและวิธีการใช้งานคำแนะนำ / ข้อมูลของโปรแกรมของคุณ

อ่านข้อมูลเกี่ยวกับการทำนายสาขา , แคช CPUและนโยบายการเปลี่ยนนโยบายการเปลี่ยน

นี่ไม่ใช่งานง่าย ถ้าตอนท้ายของวันทั้งหมดที่คุณต้องการคือการทดสอบประสิทธิภาพการทำงานคุณสามารถใช้เครื่องมือเช่นCachegrind อย่างไรก็ตามเนื่องจากเป็นแบบจำลองผลลัพธ์อาจแตกต่างกันในระดับหนึ่ง


4

ฉันไม่สามารถบอกได้อย่างแน่นอนว่าฮาร์ดแวร์ทุกตัวแตกต่างกัน แต่โดยทั่วไปแล้ว "64 ไบต์เริ่มต้นที่ 64 ไบต์ที่ใกล้เคียงที่สุดด้านล่าง" เนื่องจากเป็นการดำเนินการที่รวดเร็วและง่ายดายสำหรับซีพียู


2
ฉันสามารถพูดได้อย่างแน่นอน การออกแบบแคชที่สมเหตุสมผลใด ๆ จะมีบรรทัดที่มีขนาดกำลัง 2 และมีการจัดตำแหน่งตามธรรมชาติ (เช่นจัดแนว 64B) มันไม่ได้เร็วและง่ายมันฟรีอย่างแท้จริง: คุณแค่เพิกเฉยที่อยู่ต่ำ 6 บิตตัวอย่างเช่น แคชมักจะทำสิ่งต่าง ๆ ด้วยช่วงที่อยู่ต่างกัน (เช่นแคชใส่ใจเกี่ยวกับแท็กและดัชนีสำหรับการตรวจจับการเข้าชมเทียบกับมิสแล้วใช้การชดเชยภายในแคชบรรทัดสำหรับการแทรก / แยกข้อมูล)
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.