เวลาแฝงของคำสั่ง CPU ในโปรเซสเซอร์ x86 และ x64


14

ฉันกำลังมองหาตารางหรือสิ่งที่คล้ายกันที่สามารถช่วยฉันในการคำนวณประสิทธิภาพของรหัสการประกอบ

อย่างที่ฉันรู้ว่าการขยับบิตจะใช้เวลา 1 นาฬิกาของ CPU แต่ฉันดูจริงๆว่าต้องใช้เวลาเพิ่มเท่าไหร่ (การลบควรเหมือนกัน) การคูณและวิธีการคำนวณเวลาหารถ้าฉันรู้ค่าที่หาร

ฉันต้องการข้อมูลเกี่ยวกับค่าจำนวนเต็ม แต่ยินดีต้อนรับเวลาดำเนินการลอยตัวเช่นกัน


เป็นไปได้เช่นเดียวกันกับ SO: stackoverflow.com/questions/692718/ …
Ciro Santilli 法轮功病毒审查审查事件事件法轮功

คำตอบ:


10

โดยทั่วไปการดำเนินการแต่ละอย่างจะใช้รอบสัญญาณนาฬิการอบเดียวและจะดำเนินการหากข้อโต้แย้งมีการลงทะเบียนในขั้นตอนต่างๆของไปป์ไลน์

ความหมายแฝงหมายถึงอะไร มีการใช้งานกี่รอบใน ALU

คุณอาจพบว่าตารางนี้มีประโยชน์: http://www.agner.org/optimize/instruction_tables.pdf

เนื่องจากตัวประมวลผลที่ทันสมัยเป็นซุปเปอร์สเกลาร์และสามารถดำเนินการตามคำสั่งได้คุณมักจะได้รับคำแนะนำทั้งหมดต่อรอบที่เกิน 1 อาร์กิวเมนต์สำหรับคำสั่งแมโครนั้นสำคัญที่สุด แต่การดำเนินการยังสำคัญเนื่องจากการหารใช้เวลานานกว่า XOR (<1 รอบแฝง)

คำแนะนำ x86 จำนวนมากสามารถใช้หลายรอบเพื่อดำเนินการบางขั้นตอนให้เสร็จสมบูรณ์หากเป็นคำสั่งที่ซับซ้อน (เช่นคำสั่ง REP หรือ MWAIT ที่แย่กว่านั้น)


3
จำนวนเต็มคูณอย่างน้อย 3c latency บน x86 CPUs ล่าสุดทั้งหมดและสูงกว่าสำหรับ CPU เก่าบางรุ่น ในซีพียูจำนวนมากมันถูกวางท่ออย่างเต็มที่ดังนั้นปริมาณงานจึงเท่ากับ 1 ต่อนาฬิกา แต่คุณสามารถทำได้สำเร็จหากคุณมีทวีคูณอิสระสามเที่ยวบิน (FP ทวีคูณบน Haswell คือ 5c latency, 0.5c throughput ดังนั้นคุณต้องใช้ 10 ในการบินเพื่อ throughput ที่อิ่มตัว) กอง ( divและidiv) เป็นยิ่งแย่ลง: มัน microcoded และมากแฝงสูงกว่าaddหรือshrและไม่ได้ไปป์ไลน์อย่างเต็มที่บน CPU ใด ๆ ทั้งหมดนี้ตรงจากตารางคำแนะนำของ Agner Fog ดังนั้นจึงเป็นเรื่องดีที่คุณจะเชื่อมโยงสิ่งนั้น
Peter Cordes

ดูเพิ่มเติมทำไมรหัส C ++ นี้เร็วกว่าชุดประกอบที่เขียนด้วยมือของฉันสำหรับการทดสอบการคาดคะเน Collatz สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพ asm
Peter Cordes

7

การคำนวณประสิทธิภาพของรหัสแอสเซมบลีไม่ใช่วิธีที่ดีที่สุดที่จะไปในยุคของการดำเนินการตามท่อ Super Scalar มันจะแตกต่างกันตามประเภทโปรเซสเซอร์ มันจะแตกต่างกันไปตามคำแนะนำทั้งก่อนและหลัง (คุณสามารถเพิ่มรหัสพิเศษและทำให้มันทำงานได้เร็วขึ้นในบางครั้ง!) การดำเนินการบางอย่าง (การแบ่งแยกอย่างเด่นชัด) สามารถมีช่วงเวลาในการประมวลผลแม้ในชิปที่คาดการณ์ได้มากกว่าเดิม การกำหนดเวลาซ้ำหลายครั้งจริง ๆ เป็นวิธีเดียวที่จะไป


ฉันรู้ว่า แต่ฉันต้องการที่ไม่ได้อยู่ในโครงการจริง แต่เป็นโครงการเขียนโปรแกรมที่สนุกชนิดหนึ่ง
ST3

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

3
แม้จะมีสเกลาร์ แต่การใช้ความผิดพลาดในการดำเนินการตามคำสั่งของสาขาและแคชที่หายไปอาจทำให้เกิดความแปรปรวนในเวลาทำงาน
Paul A. Clayton

สำหรับสิ่งที่ถูกผูกไว้กับ CPU อย่างหมดจด (ไม่พลาดแคชไม่มีการคาดคะเนสาขา) พฤติกรรมของ CPU นั้นมีรายละเอียดเพียงพอที่การวิเคราะห์แบบคงที่มักจะสามารถคาดการณ์ได้ว่าจำนวนรอบต่อการวนซ้ำจะวนบน CPU เฉพาะเท่าใด เช่นดูคำตอบ SO นี้เมื่อมองไปที่ asm ที่คอมไพเลอร์สร้างขึ้นให้ฉันอธิบายว่าทำไมรุ่น branchy จึงวิ่งเร็วกว่ารุ่น CMOV เกือบ 1.5 เท่าบน CPU Sandybridge CPU ของ OP แต่ใกล้กับ Skylake ของฉันมาก
Peter Cordes

หากคุณกำลังเขียนด้วยมือด้วยเหตุผลด้านประสิทธิภาพจริง ๆ แล้วมันมีประโยชน์มากที่จะมองหาคอขวดในการรับส่งข้อมูลและปริมาณงานบน CPU ของ Intel และ AMD แม้ว่าจะยากและบางครั้งสิ่งที่ดีที่สุดสำหรับเอเอ็มดีนั้นไม่ใช่สิ่งที่ดีที่สุดสำหรับ Intel
Peter Cordes

4

คุณสามารถค้นหาข้อมูลเกี่ยวกับอินเทลซีพียูที่คู่มือพัฒนาซอฟต์แวร์ Intel เช่นเวลาแฝงคือ 1 รอบสำหรับการเพิ่มจำนวนเต็มและ 3 รอบสำหรับการคูณจำนวนเต็ม

ฉันไม่รู้เกี่ยวกับการคูณ แต่ฉันคาดว่าการเพิ่มจะใช้เวลาหนึ่งรอบเสมอ


หนึ่งรอบยกเว้นเมื่อเป็น "ฟรี" (ในแบบขนานเมื่อเส้นท่อถูกต้อง) หรือใช้เวลานานกว่าเนื่องจากแคชพลาด :-)
Brian Knoblauch

2
ปัจจุบัน (2018) ข้อมูลนี้มีอยู่ในภาคผนวก C ชื่อ "Instruction Latency and throughput" ของเอกสาร 248966 "Intel® 64 และ IA-32 คู่มืออ้างอิงการเพิ่มประสิทธิภาพสถาปัตยกรรม" ยังมีอยู่ในหน้าเชื่อมโยงในคำตอบ
stefanct
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.