แคชจะเร็วขนาดนั้นได้อย่างไร?


37

นี่คือภาพหน้าจอของเกณฑ์มาตรฐานแคช:

ผลลัพธ์ของการวัดแคชและหน่วยความจำ AIDA64

ในเกณฑ์มาตรฐานความเร็วในการอ่าน L1 แคชอยู่ที่ประมาณ 186 GB / s โดยเวลาแฝงอยู่ที่ประมาณ 3-4 รอบนาฬิกา ความเร็วนั้นบรรลุผลเช่นไร?

พิจารณาหน่วยความจำที่นี่: ความเร็วสูงสุดทางทฤษฎีคือ 665 MHz (ความถี่หน่วยความจำ) x 2 (อัตราข้อมูลคู่) x 64 บิต (ความกว้างบัส) ซึ่งประมาณ 10.6 GB / s ซึ่งใกล้เคียงกับค่ามาตรฐาน 9.6 GB / s .

แต่ด้วยแคช L1 แม้ว่าเราจะสามารถอ่านได้ทุกรอบด้วยโปรเซสเซอร์ที่ความถี่สูงสุด (3 GHz) เราจะต้องใช้สายดาต้าประมาณ 496 เส้นเพื่อให้ได้ปริมาณงานที่ไม่สมจริง สิ่งนี้ใช้กับแคชอื่นเช่นกัน

ฉันพลาดอะไรไป เราจะคำนวณปริมาณงานของแคชจากพารามิเตอร์ได้อย่างไร


14
คุณได้พิจารณาแล้วว่าแคช L1,2,3 เล็กเพียงใดและเท่ากันกับที่มันมีอยู่จริง เคล็ดลับคุณไม่จำเป็นต้องกังวลกับมาตรฐานรถบัสหากคุณเป็นเจ้าของชิปทั้งหมด
JonRB

2
นอกจากนี้: เกณฑ์มาตรฐานรู้เพียงพอเกี่ยวกับสิ่งที่กำลังทำเพื่อให้แน่ใจว่าข้อมูลบางอย่างที่ทดสอบด้วยไม่ได้ถูกเก็บไว้ในทะเบียนหรือไม่
rackandboneman

7
@rackandboneman: AIDA64 เป็นมาตรฐานที่ได้รับการยอมรับอย่างดีไม่ใช่สิ่งที่ใครบางคนเพิ่งแฮ็คข้อมูลใน C และปล่อยให้คอมไพเลอร์ปรับแต่งโหลดให้เหมาะสม! ฉันคิดว่าชิ้นส่วน microbenchmark เขียนด้วยแอสเซมบลีด้วยรุ่น SSE หรือ AVX
Peter Cordes

1
@ Peter Cordes คำตอบที่น่าพอใจ - สำหรับคำถามที่จำเป็น
rackandboneman

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

คำตอบ:


35

ซีพียูนี้มี ...

2 คอร์คำสั่ง 32-KB และแคชข้อมูลระดับแรก 32-KB (L1) สำหรับแต่ละคอร์

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

Read   93 GB/s
Write  47 GB/s
Copy   90 GB/s

ตอนนี้ความจริง "สำเนา" เร็วกว่า "เขียน" 2 เท่าเป็นที่น่าสงสัยอย่างมาก มันจะคัดลอกเร็วกว่าที่จะเขียนได้อย่างไร? ฉันจะเดิมพันว่าสิ่งที่เกณฑ์มาตรฐานแสดงเป็น "คัดลอก" คือผลรวมของปริมาณการอ่าน + เขียนและในกรณีนี้มันทั้งอ่านและเขียนที่ 45 GB / s แต่แสดง 90 เพราะมันเป็นเกณฑ์มาตรฐานและ ใครที่เชื่อใจในการวัดประสิทธิภาพ? ดังนั้นเราจะไม่สนใจ "copy"

Read   93 GB/s => 30 bytes/clock
Write  47 GB/s => 15 bytes/clock

ตอนนี้การลงทะเบียน 128- บิตหนึ่งคือ 16 ไบต์ใกล้พอดังนั้นดูเหมือนว่าแคชนี้สามารถอ่าน 128- บิตสองบิตและเขียนหนึ่งต่อนาฬิกา

นี่คือสิ่งที่คุณต้องการปรับปรุงขั้นตอนการบดตัวเลข SSE เหล่านั้น: อ่านสองครั้งและเขียนหนึ่งครั้งต่อรอบ

สิ่งนี้น่าจะถูกนำไปใช้กับดาต้าไลน์ขนานจำนวนมากซึ่งเป็นวิธีปกติในการดึงข้อมูลจำนวนมากภายในชิปอย่างรวดเร็ว


4
ในหน้า 55 ของเอกสาร @ ลิงก์ถัดไปแฮ็กระบุว่า "ภายในการเข้าถึงสูงสุด 16 ไบต์ [... ] การดำเนินการโหลดสองครั้งและการดำเนินการหนึ่งร้านสามารถจัดการแต่ละรอบได้" นั่นอธิบายว่าเหตุใดการอ่านจึงเร็วกว่าสองเท่า - สามารถอ่านสองครั้งในการดำเนินการเดียวกันในขณะที่เขียนหนึ่งครั้ง
Tom Carpenter

2
ใช่มันนับได้อย่างชัดเจนคัดลอก BW = อ่านและเขียน ที่ดูเหมือนว่าถูกต้องเป็นทางเลือกเนื่องจากเป็นสิ่งสำคัญที่การอ่านและการเขียนสามารถดำเนินการในแบบคู่ขนาน โปรดสังเกตว่าหมายเลข OP สำหรับ L2 / L3 มีการคัดลอกไม่สูงกว่าการเขียนและหน่วยความจำต่ำกว่ามาก บัสหน่วยความจำ DDR3 ไม่ใช่แบบฟูลดูเพล็กซ์: จำเป็นต้องใช้สายข้อมูลเดียวกันในการอ่านและเขียน (สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแบนด์วิดท์ x86 memcpy / memset ที่มีร้านค้า NT เทียบกับร้านค้าทั่วไปดูstackoverflow.com/questions/43343231/… )
Peter Cordes

6
คุณคาดเดาว่า IvyBridge สามารถอ่านได้ 2 ครั้งและเขียน 1 ครั้งในรอบสัญญาณนาฬิกาเดียวกัน คุณถูกต้อง แต่ภายใต้สถานการณ์ที่ จำกัด มาก IvB มีเพียง 2 AGU พอร์ตเท่านั้นดังนั้นโดยปกติจะ จำกัด ไว้ที่ 2 ops หน่วยความจำต่อนาฬิกาซึ่งหนึ่งในนั้นสามารถเก็บได้ แต่โหลด / ร้านค้า 256b AVX ใช้เวลา 2 รอบในการดำเนินการในพอร์ตโหลด / เก็บในขณะที่ต้องการ AGU ในรอบแรกเท่านั้น ดังนั้นที่อยู่ร้านค้าสามารถเรียกใช้บนพอร์ต 2/3 ในระหว่างรอบที่ 2 ของโหลด 256b โดยไม่คิดต้นทุนแบนด์วิดท์โหลด (uops store-data ทำงานบนพอร์ต 4) ที่มา: agner.org/optimize microarch pdf
Peter Cordes

2
AMD Bulldozer-family หรือ Ryzen CPU จะให้ตัวเลข read = 2x write เหมือนกัน แต่จริง ๆ แล้วพวกเขาถูก จำกัด ไว้ที่ 2 หน่วยความจำ ops ต่อนาฬิกา (มากถึงหนึ่งสามารถเขียนได้) โดยไม่มีช่องโหว่ อ่าน / เขียน / คัดลอกไม่พบความแตกต่าง แต่ Triad สามารถ ( a[i] = b[i] + c[i]) BTW, Intel Haswell และหลังจากนั้นมี store-AGU บนพอร์ต 7 ที่สามารถจัดการกับโหมดการกำหนดแอดเดรสแบบง่าย ๆ (ที่ไม่ได้จัดทำดัชนี) ดังนั้นพวกเขาจึงสามารถรัน 2 load + 1 store uops ต่อนาฬิกา (และเส้นทางข้อมูลไปยัง L1D คือ 256b ดังนั้นจึงเพิ่มแบนด์วิดท์ L1D เป็นสองเท่า) ดูบทความของ David Kanter: realworldtech.com/haswell-cpu/5
Peter Cordes

1
@AliChen: OP กล่าวถึงความล่าช้าในการโหลด 4 รอบของ IvyBridge อย่างชัดเจนหลังจากแบนด์วิดท์ก่อนถามว่ามันจะเร็วขนาดไหน
Peter Cordes

27

คำตอบของ @ 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 แต่โหมดการกำหนดแอดเดรสใช้การลงทะเบียนจำนวนเต็มเสมอ

แผนภาพหน่วยความจำ SnB ของ David Kanter

ดังที่แสดงมีเพียง 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 ที่ไม่ได้แยกอย่างมีนัยสำคัญ


แหล่งข้อมูล :


1
ชัดเจนมากละเอียดถี่ถ้วนและเขียนได้ดี! +1!
next-

8

สำหรับซีพียูสมัยใหม่หน่วยความจำแคชตั้งอยู่ถัดจากซีพียูบนดาย (ชิป)เดียวกันโดยใช้SRAMซึ่งเร็วกว่าDRAMที่ใช้สำหรับโมดูล RAM ในพีซีมาก

หน่วยความจำต่อหน่วย (บิตหรือไบต์) SRAM มีราคาแพงกว่า DRAM มาก นั่นเป็นเหตุผลที่ DRAM ถูกนำมาใช้ในพีซีเช่นกัน

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


ขอบคุณที่ให้ความสนใจ ฉันเคยเห็นในหนังสือไม่กี่เล่มที่ระบุว่าความเร็วในการเข้าถึงการลงทะเบียนเกิน 300 GB / s ซึ่งในกรณีนี้สำหรับโปรเซสเซอร์ 3 GHz ความเร็วการลงทะเบียนคือ 100 B / รอบซึ่งเป็นไปไม่ได้เนื่องจากการลงทะเบียนมักจะมีความกว้าง 64/128 บิต พวกเขาไม่สามารถส่งออกมาก นี่คือสิ่งที่เกี่ยวข้องกับฉัน เป็น GB / sa ทางที่ถูกต้องในการแสดงปริมาณงาน
อัศวิน

3
@Knight โปรดทราบว่า IvB (เป็นโปรเซสเซอร์ประสิทธิภาพสูง) ดำเนินการหลายคำสั่งต่อรอบเช่น 3 ALU ops, 2 load และ 1 store ส่วนใหญ่เหล่านี้สามารถรับได้ 2 อินพุต (โหลดแม้สำหรับการกำหนดดัชนี) และโหลดใช้เวลา 3 นั่นคือ 13 รีจิสเตอร์ที่ 8 ไบต์ต่อ 104 104 ไบต์ (อาจเป็นกรณีที่ไม่อนุญาตให้มีการรวมกันของมหากาพย์ แต่มี ไม่มีข้อบ่งชี้ว่าเป็นกรณีของ IvB แม้ว่าจะไม่สามารถยั่งยืนได้) หากคุณพิจารณาการลงทะเบียนเวกเตอร์ด้วยจำนวนนั้นก็จะเพิ่มขึ้นอีก
แฮโรลด์

@harold: ที่เกี่ยวข้อง: Haswell และ Skylake ดูเหมือนจะมีข้อ จำกัด ในการอ่านลงทะเบียนต่อนาฬิกาแม้ว่ามันอาจจะอยู่ใน front-end และไม่ส่งผลกระทบต่อการประหารชีวิตหลังจากอินพุตบางส่วนพร้อมแล้ว อาจจะเป็นข้อ จำกัด ทางสถาปัตยกรรมขนาดเล็กอื่น ๆ แต่ฉันพบคอขวดในรหัสที่ควรจะรักษา ops เพิ่มเติมต่อนาฬิกา agner.org/optimize/blog/read.php?i=415#852 ใน Haswell สถานการณ์สมมติที่ดีที่สุดของฉันอ่านจำนวนเต็ม 6.5 6.5 ต่อรอบนาฬิกา (ยั่งยืน) ฉันจัดการเพื่อให้ได้อย่างยั่งยืน 7 uops ต่อการแจกจ่ายนาฬิกา / รันบน Skylake (ร้านค้าเป็นที่อยู่ร้านค้า + ร้านค้าข้อมูล)
Peter Cordes

@PeterCordes ที่ต้องเป็น front-end แต่ใช่มั้ย IIRC ที่เป็นปัญหาในอดีต (PPro ถึง Core2) และฉันไม่แน่ใจว่าตัวเลขที่เป็นเศษส่วนมีความหมายเป็นอย่างไร แม้ว่าตัวเลขของฉันจะออกไปเล็กน้อย
แฮโรลด์

@ ฮาโรลด์: ใช่ฉันค่อนข้างแน่ใจว่ามันเป็นคอขวดส่วนหน้าของการเรียงลำดับบางอย่างอาจจะเปลี่ยนชื่อ คอขวดที่อ่านลงทะเบียนของ P6 นั้นอยู่ในรีจิสเตอร์ "เย็น" ที่ต้องอ่านจากไฟล์รีจิสเตอร์ถาวรไปยัง ROB ที่มีปัญหา รีจิสเตอร์ที่แก้ไขล่าสุดยังคงอยู่ใน ROB และไม่มีคอขวดในเรื่องนั้น ฉันไม่ได้ตรวจสอบอะไรมากนักกับความเย็นและร้อนแรงของ HSW / SKL เนื่องจากด้วยเหตุผลบางอย่างที่ฉันไม่คิดว่าจะทำให้ลูปของฉันใหญ่กว่า 4 uops / นึกคิด 1c ต่อการทำซ้ำ อุ่ย IDK มีความแตกต่างกันมากเพียงใดระหว่างการส่งต่อกับการอ่าน PRF (ซึ่งจะต้องเกิดขึ้นในเวลาดำเนินการไม่ใช่การออก / เปลี่ยนชื่อ)
Peter Cordes

4

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

ตารางที่ 2-17 (ส่วน 2.3.5.1) ระบุว่าในการโหลด (อ่าน) แบนด์วิดธ์แคชคือ 2x16 = 32 ไบต์ต่อหลักต่อวงจร เพียงอย่างเดียวนี้ให้แบนด์วิดท์ตามทฤษฎีของ 96 Gb / s บนแกน 3GHz ยังไม่ชัดเจนว่ารายงานเกณฑ์มาตรฐานที่อ้างถึงเป็นอย่างไรดูเหมือนว่ามันวัดสองคอร์ที่ทำงานแบบขนานดังนั้นมันจึงทำให้ 192 Gbps สำหรับสองคอร์


2

ความล่าช้าของประตูคืออะไร 10 picoseconds? รอบเวลาสำหรับการดำเนินการไปป์ไลน์ทั้งหมดคือ 333 picoseconds โดยมีการถอดรหัสและกิจกรรมบัสต่างๆและการหยิบข้อมูลพลิกก่อนที่จะเริ่มรอบนาฬิกาถัดไป

ฉันคาดหวังว่ากิจกรรมที่ช้าที่สุดในการอ่านแคชกำลังรอให้ดาต้าไลน์เคลื่อนย้ายห่างกันพอสมควร (น่าจะเป็นสิ่งที่ต่างกัน: การอ้างอิงหนึ่งรายการและหนึ่งประจุที่เกิดขึ้นจริงจาก read-bit) ที่ comparator / latch ข้อเสนอแนะการดำเนินการในการแปลงแรงดันไฟฟ้าขนาดเล็กเป็นแกว่งแรงดันไฟฟ้าระดับตรรกะรถไฟไปยังรถไฟขนาดใหญ่ (ประมาณ 1 โวลต์)


1
โปรดทราบว่าการหน่วงเวลา L1D 4 รอบรวมถึงการสร้างที่อยู่ (สำหรับโหมดการกำหนดที่อยู่อย่างง่าย ๆ[reg + 0-2047]) และการค้นหา TLB และการเปรียบเทียบแท็ก (การเชื่อมโยง 8 ทิศทาง) และการวางไบต์ที่ไม่ได้จัดแนวขึ้นเป็น 16 พอร์ตเอาต์พุตของโหลดยูนิตสำหรับการส่งต่อไปยังยูนิตการดำเนินการอื่น มันแฝง 4c mov rax, [rax]สำหรับห่วงชี้ไล่เหมือน
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.