คำตอบของ @ peufeu ชี้ให้เห็นว่านี่เป็นแบนด์วิดธ์รวมทั้งระบบ L1 และ L2 เป็นแคชส่วนตัวต่อคอร์ในตระกูล Intel Sandybridge ดังนั้นตัวเลขจึงเป็น 2 เท่าของแกนเดี่ยวที่สามารถทำได้ แต่นั่นยังทำให้เรามีแบนด์วิดท์สูงที่น่าประทับใจและเวลาแฝงต่ำ
แคช L1D อยู่แล้วในตัว CPU หลักและเป็นคู่แน่นมากกับหน่วยปฏิบัติโหลด (และบัฟเฟอร์ร้าน) ในทำนองเดียวกันแคช L1I ตั้งอยู่ถัดจากคำสั่งดึง / ถอดรหัสส่วนหนึ่งของแกน (จริง ๆ แล้วฉันยังไม่ได้ดูที่แท่นซิลิคอนซิลิคอน Sandybridge ดังนั้นนี่อาจไม่เป็นความจริงแท้จริงปัญหา / การเปลี่ยนชื่อส่วนหนึ่งของส่วนหน้าน่าจะใกล้กับแคช Lop ที่ถอดรหัส "L0" ซึ่งช่วยประหยัดพลังงานและแบนด์วิดธ์ที่ดีกว่า ดีกว่าตัวถอดรหัส)
แต่ด้วยแคช L1 แม้ว่าเราจะอ่านได้ทุกรอบ ...
หยุดที่นั่นทำไม Intel ตั้งแต่ Sandybridge และ AMD ตั้งแต่ K8 สามารถประมวลผลได้ 2 ครั้งต่อรอบ แคชแบบหลายพอร์ตและ TLB นั้นเป็นเรื่องสำคัญ
การเขียนเชิงจุลภาคแบบ Sandybridgeของ David Kanter มีไดอะแกรมที่ดี (ซึ่งใช้กับ IvyBridge CPU ของคุณด้วย):
("unified scheduler" ถือ ALU และหน่วยความจำ uops รออินพุตของพวกเขาให้พร้อมและ / หรือรอพอร์ตการดำเนินการของพวกเขา (เช่นvmovdqa ymm0, [rdi]
ถอดรหัสเป็น load uop ที่ต้องรอrdi
ถ้าadd rdi,32
ยังไม่ได้ดำเนินการก่อนหน้านี้สำหรับ ตัวอย่าง) Intel กำหนดเวลาให้กับพอร์ตที่เวลาออก / เปลี่ยนชื่อไดอะแกรมนี้แสดงเฉพาะพอร์ตการดำเนินการสำหรับหน่วยความจำ uops แต่ ALU uops ที่ไม่ถูกเรียกใช้งานจะทำการแข่งขันเช่นกันขั้นตอนปัญหา / เปลี่ยนชื่อเพิ่ม uops ใน ROB และตัวกำหนดตารางเวลา พวกเขาอยู่ใน ROB จนกว่าจะถึงวัยเกษียณ แต่อยู่ในตัวจัดตารางเวลาเท่านั้นจนกระทั่งส่งไปยังพอร์ตดำเนินการ (นี่คือคำศัพท์ของ Intel คนอื่น ๆ ใช้ปัญหาและส่งออกต่างกัน)) AMD ใช้ตัวกำหนดตารางเวลาแยกต่างหากสำหรับจำนวนเต็ม / FP แต่โหมดการกำหนดแอดเดรสใช้การลงทะเบียนจำนวนเต็มเสมอ
ดังที่แสดงมีเพียง 2 พอร์ต AGU (หน่วยการสร้างที่อยู่ซึ่งใช้โหมดการกำหนดแอดเดรสเช่น[rdi + rdx*4 + 1024]
และสร้างที่อยู่เชิงเส้น) มันสามารถดำเนินการหน่วยความจำ 2 ops ต่อนาฬิกา (จาก 128b / 16 ไบต์แต่ละ) ถึงหนึ่งในนั้นเป็นร้านค้า
แต่มีเคล็ดลับ: SnB / IvB รัน 256b AVX load / stores เป็น uop เดียวที่ใช้ 2 รอบในพอร์ต load / store แต่ต้องการ AGU ในรอบแรกเท่านั้น ที่ช่วยให้ที่อยู่ร้านค้าทำงานบน AGU บนพอร์ต 2/3 ในระหว่างรอบที่สองนั้นโดยไม่สูญเสียปริมาณงานใด ๆ ดังนั้นด้วย AVX (ซึ่ง Intel Pentium / Celeron CPUs ไม่สนับสนุน: /), SnB / IvB สามารถ (ในทางทฤษฎี) สามารถรองรับ 2 โหลดและ 1 ร้านค้าต่อรอบ
CPU IvyBridge ของคุณคือ Sandybridge ที่ลดขนาดลง (ด้วยการปรับปรุงสถาปัตยกรรมขนาดเล็กเช่นการกำจัด mov , ERMSB (memcpy / memset) และการดึงฮาร์ดแวร์ล่วงหน้าในหน้าถัดไป) การสร้างหลังจากนั้น (Haswell) เพิ่มแบนด์วิดท์ L1D ต่อนาฬิกาเป็นสองเท่าโดยขยายเส้นทางข้อมูลจากหน่วยการดำเนินการเป็น L1 จาก 128b เป็น 256b ดังนั้นการโหลด AVX 256b สามารถทำได้ 2 ต่อนาฬิกา นอกจากนี้ยังเพิ่มพอร์ต store-AGU พิเศษสำหรับโหมดการกำหนดแอดเดรสอย่างง่าย
ปริมาณสูงสุดที่ได้รับของ Haswell / Skylake คือ 96 ไบต์ + ที่เก็บต่อนาฬิกา แต่คู่มือการเพิ่มประสิทธิภาพของ Intel แสดงให้เห็นว่าปริมาณงานเฉลี่ยที่ยั่งยืนของ Skylake (ยังคงสมมติว่าไม่มี L1D หรือ TLB พลาด) อยู่ที่ ~ 81B ต่อรอบ (สเกลาร์จำนวนเต็มสเกลาร์สามารถรองรับ 2 โหลด + 1 ที่เก็บต่อนาฬิกาตามการทดสอบของฉันใน SKL ดำเนินการ 7 (ไม่ได้ใช้โดเมน) uops ต่อนาฬิกาจาก 4 fused-domain uops แต่มันช้าลงเล็กน้อยด้วยตัวถูกดำเนินการ 64 บิตแทน แบบ 32 บิตดังนั้นจึงเห็นได้ชัดว่ามีข้อ จำกัด ของทรัพยากรสถาปัตยกรรมขนาดเล็กและไม่ใช่เพียงแค่การกำหนดตารางที่อยู่ uops ไปยังพอร์ต 2/3 และขโมยรอบจากการโหลด)
เราจะคำนวณปริมาณงานของแคชจากพารามิเตอร์ได้อย่างไร
คุณไม่สามารถทำได้ยกเว้นว่าพารามิเตอร์จะมีหมายเลขผลผลิตที่ใช้ได้จริง ดังที่ได้กล่าวไว้ข้างต้นแม้แต่ L1D ของ Skylake ก็ไม่สามารถติดตามหน่วยประมวลผลการโหลด / จัดเก็บสำหรับเวกเตอร์ 256b ได้ แม้ว่ามันจะปิดไปและมันก็สามารถทำได้สำหรับจำนวนเต็ม 32 บิต (มันคงไม่มีเหตุผลที่จะมีหน่วยโหลดมากกว่าแคชที่อ่านพอร์ตหรือในทางกลับกันคุณเพียง แต่ละทิ้งฮาร์ดแวร์ที่ไม่สามารถใช้งานได้อย่างเต็มที่โปรดทราบว่า L1D อาจมีพอร์ตเพิ่มเติมเพื่อส่ง / รับสายไปยัง / จากคอร์อื่นเช่นเดียวกับการอ่าน / เขียนจากภายในคอร์)
เพียงแค่ดูความกว้างและนาฬิกาของบัสข้อมูลไม่ได้ให้เรื่องราวทั้งหมดแก่คุณ
แบนด์วิดท์ L2 และ L3 (และหน่วยความจำ) สามารถถูก จำกัด โดยจำนวนการพลาดที่ค้างที่ L1 หรือ L2 สามารถติดตามได้ แบนด์วิดธ์ต้องไม่เกิน latency * max_concurrency และชิปที่มีเวลาแฝงที่สูงกว่า L3 (เช่น Xeon แบบหลายคอร์) จะมีแบนด์วิดท์ L3 แบบ Single-Core ที่น้อยกว่า CPU แบบ dual / quad core ของ microarchitecture เดียวกัน ดูส่วน "แพลตฟอร์มที่มีความล่าช้าในการตอบสนอง" ของคำตอบ SOนี้ ซีพียู Sandybridge ตระกูลมีบัฟเฟอร์สาย 10 บรรทัดเพื่อติดตาม L1D ที่พลาด (ใช้โดยร้านค้า NT)
(รวมแบนด์วิดท์ L3 / หน่วยความจำที่มีหลายคอร์ที่ใช้งานอยู่มีขนาดใหญ่มากใน Xeon ขนาดใหญ่ แต่โค้ดแบบเธรดเดียวจะเห็นแบนด์วิดท์ที่แย่กว่าใน Quad Core ที่ความเร็วสัญญาณนาฬิกาเดียวกันเพราะแกนเพิ่มเติม เวลาแฝง L3)
เวลาแฝงของแคช
ความเร็วนั้นบรรลุผลเช่นไร?
เวลาในการตอบสนองการโหลด 4 รอบของแคช L1D ค่อนข้างน่าทึ่งโดยเฉพาะเมื่อพิจารณาว่าต้องเริ่มต้นด้วยโหมดการกำหนดแอดเดรสเช่น[rsi + 32]
นั้นจึงต้องทำการเพิ่มก่อนที่จะมีที่อยู่เสมือน จากนั้นจะต้องแปลสิ่งนั้นเป็นฟิสิคัลเพื่อตรวจสอบแคชแท็กสำหรับการจับคู่
(การกำหนดโหมดอื่นนอกเหนือจาก[base + 0-2047]
ใช้วงจรเพิ่มเติมในตระกูล Intel Sandybridge ดังนั้นจึงมีทางลัดใน AGU สำหรับโหมดการกำหนดแอดเดรสอย่างง่าย (โดยทั่วไปสำหรับเคสตัวชี้การไล่ล่าซึ่งมีความหน่วงแฝงในการใช้โหลดต่ำเป็นสิ่งที่สำคัญที่สุด . (ดูคู่มือการเพิ่มประสิทธิภาพของ Intel , Sandybridge Section 2.3.5.2 L1 DCache.) ซึ่งจะถือว่าไม่มีการแทนที่กลุ่มและที่อยู่พื้นฐานของเซ็กเมนต์0
ซึ่งเป็นเรื่องปกติ)
นอกจากนี้ยังมีการตรวจสอบบัฟเฟอร์การจัดเก็บเพื่อดูว่ามันทับซ้อนกับร้านค้าก่อนหน้านี้ และต้องคิดให้ดีแม้ว่าที่อยู่ร้านค้า (ตามลำดับโปรแกรม) ก่อนหน้านี้ uop ยังไม่ได้ดำเนินการดังนั้นยังไม่ทราบที่เก็บร้านค้า แต่สันนิษฐานว่าอาจเกิดขึ้นควบคู่ไปกับการตรวจสอบการโจมตี L1D หากปรากฎว่าไม่จำเป็นต้องใช้ข้อมูล L1D เนื่องจากการส่งต่อข้อมูลสามารถให้ข้อมูลจากบัฟเฟอร์ของร้านค้านั่นก็ไม่ใช่การสูญเสีย
Intel ใช้แคช VIPT (ดัชนีที่ติดแท็กด้วยตนเอง) เกือบทุกคนใช้เคล็ดลับมาตรฐานในการทำให้แคชมีขนาดเล็กพอและมีความสัมพันธ์ที่สูงพอที่จะทำงานเหมือนแคช PIPT (ไม่มีนามแฝง) ด้วยความเร็วของ VIPT (สามารถทำดัชนีใน ขนานกับ TLB virtual-> การค้นหาทางกายภาพ)
แคช L1 ของ Intel คือ 32kiB ซึ่งเชื่อมโยงได้ 8 ทิศทาง ขนาดหน้าคือ 4kiB ซึ่งหมายความว่าบิต "ดัชนี" (ซึ่งเลือกชุดที่ 8 วิธีสามารถแคชบรรทัดใด ๆ ที่กำหนด) อยู่ด้านล่างของหน้าออฟเซต; นั่นคือบิตที่อยู่เหล่านั้นคือการชดเชยลงในหน้าและมักจะเหมือนกันในที่อยู่เสมือนและทางกายภาพ
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับที่และรายละเอียดอื่น ๆ ว่าทำไมขนาดเล็ก / แคชอย่างรวดเร็วมีประโยชน์ / เป็นไปได้ (และทำงานได้ดีเมื่อจับคู่กับแคชช้าขนาดใหญ่) ดูคำตอบของฉันในทำไม L1D ขนาดเล็ก / เร็วกว่า L2
แคชขนาดเล็กสามารถทำสิ่งต่าง ๆ ที่แพงเกินไปในแคชที่ใหญ่กว่าเช่นดึงข้อมูลอาร์เรย์จากชุดในเวลาเดียวกันกับการดึงแท็ก ดังนั้นเมื่อผู้เปรียบเทียบพบว่าแท็กใดที่ตรงกับมันเพียงแค่ต้อง mux หนึ่งในแปดบรรทัดแคช 64- ไบต์ที่ถูกดึงมาจาก SRAM
(มันไม่ง่ายอย่างนั้น: Sandybridge / Ivybridge ใช้แคช L1D แบบ banked โดยมีแปดธนาคารขนาด 16 ไบต์คุณสามารถรับข้อขัดแย้งของแคชธนาคารได้หากมีสองคนเข้าถึงธนาคารเดียวกันในสายแคชที่แตกต่างกัน (มีธนาคาร 8 แห่งดังนั้นสิ่งนี้สามารถเกิดขึ้นได้กับที่อยู่หลาย ๆ 128 แยกกันคือ 2 แคชไลน์)
IvyBridge ยังไม่มีบทลงโทษสำหรับการเข้าถึงที่ไม่ได้ลงทะเบียนตราบใดที่ไม่ข้ามขอบเขตแคช 64B ฉันเดาว่าตัวเลขใดที่จะดึงข้อมูลธนาคารตามบิตที่อยู่ต่ำและตั้งค่าสิ่งที่จะต้องเกิดขึ้นเพื่อให้ได้ข้อมูลที่ถูกต้อง 1 ถึง 16 ไบต์
สำหรับการแบ่งแคชนั้นยังคงเป็นเพียง uop เดียว แต่สามารถเข้าถึงแคชได้หลายรายการ โทษยังเล็กอยู่ยกเว้นใน 4k-splits Skylake ทำให้ราคาถูกถึง 4k และค่อนข้างแฝงด้วยความล่าช้าประมาณ 11 รอบเหมือนกับการแบ่งสายแคชปกติด้วยโหมดการกำหนดแอดเดรสที่ซับซ้อน แต่ปริมาณงาน 4k-split นั้นแย่กว่า cl-split ที่ไม่ได้แยกอย่างมีนัยสำคัญ
แหล่งข้อมูล :