เหตุใดเครื่องยนต์จึงต้องปรับให้เหมาะสมสำหรับโปรเซสเซอร์ใหม่ที่มีสถาปัตยกรรมเดียวกัน


39

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


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Josh

14
"Need" เป็นถ้อยคำที่ผิดและการตลาดมากกว่าความจริงเช่นเดียวกับ Windows เช่นต้องสนับสนุน CPU รุ่นใหม่ (หรือไม่เช่นในกรณีของ Windows 7 ซึ่งโดยหลักการแล้วจะทำงานได้อย่างสมบูรณ์แบบ) ใช้ได้ดีกับ Ryzen ยกเว้นการใช้พลังงานมากกว่าที่จำเป็น 3-4%) การปรับแต่งนี้จะเกี่ยวกับการพยายามบีบ CPU ออกไปอีกเล็กน้อยเพื่อให้เข้าใกล้ระดับสูงสุด ในความเป็นจริงคุณอาจได้รับผลรวม 1-2% ในตัวอย่างที่ไม่มีข้อโต้แย้งเนื่องจากการตั้งเวลาที่แตกต่างกันและใช้คำแนะนำใหม่สองสามข้อ
เดมอน

2
เพียงเพราะสองโปรเซสเซอร์สามารถดำเนินการการดำเนินการเดียวกันที่ไม่ได้หมายความว่าการดำเนินการมีประสิทธิภาพการทำงานที่เหมือนกันในโปรเซสเซอร์ทั้งสอง ...
Mehrdad

ดูคำถามที่เกี่ยวข้องของฉันเกี่ยวกับ Stack Overflow: mtune ทำงานอย่างไร
Marc.2377

คำตอบ:


54

เพราะแตกต่างกันชั่วอายุของสถาปัตยกรรมเดียวกันสามารถมีชุดคำสั่งที่แตกต่างกัน

ตัวอย่างเช่นStreaming SIMD Extensionsอาจเป็นชุดคำสั่ง x86 ที่รู้จักกันดีที่สุด แต่ถึงแม้ว่าจะมีเพียงสถาปัตยกรรม x86 เพียงชุดเดียว แต่ก็มี SSE, SSE2, SSE3 และ SSE4 อยู่

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

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


1
@Panzercrisis - ขอบคุณสำหรับคำแนะนำการแก้ไข เพื่อความชัดเจน: คำถามเดิมไม่เกี่ยวกับรหัสของคุณมันเป็นเรื่องเกี่ยวกับรหัสเครื่องยนต์ดังนั้น "การเพิ่มประสิทธิภาพรหัสของคุณเอง" จึงไม่ใช่คำแนะนำการแก้ไขที่ดี อย่างไรก็ตามมันเน้นว่าฉันต้องชี้แจงว่าเมื่อฉันพูดว่า "การเพิ่มประสิทธิภาพ" ฉันหมายถึง "เพิ่มประสิทธิภาพของรหัสเครื่องยนต์" ดังนั้นฉันจึงได้ทำการแก้ไขเพื่อให้ได้
Maximus Minimus

37

คำตอบของ Maximus นั้นถูกต้องฉันแค่อยากเล่าเรื่องอื่น:

ฮาร์ดแวร์จะเปลี่ยนแปลงในแบบที่คุณต้องการในการเปลี่ยนวิธีการโค้ดของคุณโดยไม่คำนึงถึงคำแนะนำใหม่

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

  • ระดับแคชใหม่หมายความว่าคุณต้องคิดมากเกี่ยวกับวิธีจัดระเบียบชุดข้อมูลที่ใหญ่ขึ้น (L1, vs L2, vs L3 กับ L4)

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

  • นาฬิกาที่เร็วขึ้นหมายถึงคุณต้องเริ่มคิดเกี่ยวกับเวลาแฝงของหน่วยความจำมากกว่าที่คุณต้องคำนึงถึงความเร็วในการคำนวณของ CPU เป็นคอขวดของระบบของคุณ

  • จำนวน FPUs ในระบบอาจไม่ตรงกับจำนวน ALU จำนวนเต็มต่อคอร์อีกต่อไป (AMD มี / มีสถาปัตยกรรมแบบนี้)

  • จำนวนรอบสัญญาณนาฬิกาที่ใช้ในการคำนวณการทำงานของฉันลดลงหรือเพิ่มขึ้น

  • จำนวนของการลงทะเบียนที่มีการเปลี่ยนแปลง

ทั้งหมดนี้มีผลกระทบต่อประสิทธิภาพการทำงานจริงอย่างมากกับโปรแกรมที่สร้างข้อสันนิษฐานเกี่ยวกับสถาปัตยกรรมพื้นฐานในฮาร์ดแวร์ก่อนหน้านี้ด้วย ISA เดียวกันไม่ว่าจะเป็นค่าบวกหรือค่าลบ


"ระดับของแคชที่เพิ่มขึ้นหรือลดลงหมายความว่าคุณไม่ต้องกังวลเกี่ยวกับการเชื่อมโยงกันของแคช" - CPU แทบจะทุกตัวมีการเชื่อมโยงกันของแคช คุณหมายถึงการแบ่งปันเท็จหรือไม่ แม้กว่าความจริงใด ๆ CPU $ บรรทัดอยู่เกือบตลอดเวลา 64 B ...
Maciej Piechotka

1
Maciej เพิ่งจดแจ้งเกี่ยวกับการเชื่อมโยงกันของแคช :) คุณอาจหมายถึง "การเพิ่มประสิทธิภาพแคช" หรือบางอย่าง การเชื่อมโยงกันของแคชคือความสามารถของระบบในการรักษามุมมองที่สอดคล้องกันของหน่วยความจำอย่างโปร่งใสกับซอฟต์แวร์แม้ว่าจะอยู่ในแคชN อิสระ นี่คือมุมฉากของขนาด TBH คำสั่งไม่เกี่ยวข้องจริงๆ แต่คำตอบของคุณ (โดยเฉพาะอย่างยิ่งจุดที่ 5 และ 6) ตอบคำถามได้ดีกว่า IMO ที่ยอมรับ :) บางทีการเน้นความแตกต่างระหว่างสถาปัตยกรรมและ u-architecture จะทำให้โดดเด่นกว่า
Margaret Bloom

4
"เหมือนกับการเพิ่มจำนวนทวีคูณใช้เวลามากกว่าการเติมซึ่งในวันนี้เกี่ยวกับ intel ที่ทันสมัยและ amd CPUS ใช้เวลาเท่ากัน" นั่นไม่จริงทั้งหมด ในสถาปัตยกรรมแบบ pipelined คุณต้องแยกความแตกต่างระหว่างเวลาแฝง (เมื่อผลลัพธ์พร้อม) และปริมาณงาน (จำนวนที่คุณสามารถทำได้ต่อรอบ) การเพิ่มตัวประมวลผล Intel รุ่นใหม่มีอัตราความเร็ว 4 และเวลาแฝงที่ 1 คูณด้วยอัตราความเร็ว 1 และเวลาแฝง 3 (หรือ 4) สิ่งเหล่านี้เป็นสิ่งที่เปลี่ยนแปลงไปตามสถาปัตยกรรมและต้องการการปรับให้เหมาะสม เช่นpdepใช้เวลาหนึ่งรอบใน intel แต่ 6 ใน Ryzen ดังนั้นอาจไม่ต้องการใช้กับ Ryzen
Christoph

2
@ Clearer ฉันรู้ว่าเรากำลังพูดถึงซีพียูที่นี่ แต่คุณไม่เคยตั้งโปรแกรมให้กับ GPU มาก่อนหรือไม่? รหัสเดียวกันก่อให้เกิดผลลัพธ์ที่แตกต่างกันอย่างดุเดือดซึ่งบ่อยครั้งที่คุณถูกบังคับให้ต้องคำนึงถึงความสามารถของฮาร์ดแวร์ใน CUDA นั่นคือที่มาของฉันด้วยขนาดแคช (หน่วยความจำที่ใช้ร่วมกัน, แคช L1 ที่มีการจัดการ) จะต้องนำมาพิจารณาด้วยในการที่คุณจะเขียนโค้ดสำหรับบางสิ่งใน CUDA
opa

2
@Christoph ถูกต้อง มาตรฐานที่คุณเชื่อมโยงนั้นมีไว้สำหรับวนรอบอาร์เรย์c[i] = a[i] OP b[i](เช่น 2 โหลดและ 1 ที่เก็บต่อการดำเนินการ) ดังนั้นเวลาจึงถูกครอบงำโดยแบนด์วิดธ์หน่วยความจำเนื่องจากความเข้มในการคำนวณต่ำมาก ขนาดอาร์เรย์ไม่แสดงดังนั้น IDK ถ้ามันพอดีกับ L1D ( gcc4.9 -Ofastน่าจะเป็นอัตโนมัติเวกเตอร์ลูปเหล่านั้นดังนั้นคุณไม่ได้วัดค่าใช้จ่ายของการดำเนินการสเกลาร์ปกติเป็นส่วนหนึ่งของรหัสจำนวนเต็มที่ซับซ้อน บรรทัดแรกของหน้านั้นสำคัญ: ข้อเสนอแนะที่เป็นประโยชน์เปิดเผยว่ามาตรการเหล่านี้บางข้อบกพร่องอย่างจริงจัง การปรับปรุงที่สำคัญอยู่ในทาง
Peter Cordes

2

นอกเหนือจากการเปลี่ยนแปลงขั้นต้นเช่นการสนับสนุนคำสั่งใหม่ผู้ผลิตไมโครโปรเซสเซอร์ยังคงปรับเปลี่ยนการออกแบบเพื่อปรับปรุงประสิทธิภาพอย่างต่อเนื่องและการออกแบบใหม่ทุกครั้งสามารถมีประสิทธิภาพสัมพัทธ์ที่แตกต่างกันสำหรับแต่ละคำแนะนำหรือเทคนิค บางทีคุณอาจเขียนโค้ด branchless ที่ปรับให้เหมาะสมบางอย่างสำหรับ Model X แต่ Model Y มีตัวทำนายสาขาที่ได้รับการปรับปรุงซึ่งจะช่วยลดการลงโทษที่ผิดสำหรับรหัสที่ไม่ใช่สาขา (ซึ่งทำให้การลงทะเบียนใช้งานที่อื่น) . บางที Model Y สนับสนุนการขนานที่มากขึ้นของคำสั่งเวลาแฝงสูงดังนั้นตอนนี้การวนซ้ำที่ไม่ได้ควบคุมของคำสั่งนั้นจะทำให้คุณได้รับปริมาณงานที่ดีขึ้นในขณะที่ Model X ลำดับที่สั้นกว่าก็ดีกว่า

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.