AMD ตัดสินใจปิดใช้งาน Loop Buffer ของ Zen 4
(chipsandcheese.com)- ใน BIOS ใหม่ของ ASRock B650 PG Lightning ไม่พบว่า loop buffer ของ Zen 4 เป็นแหล่งจ่าย micro-op อีกต่อไป และเมื่อย้อนกลับไปใช้ BIOS รุ่นเก่าก็กลับมาเปิดใช้งานอีกครั้ง
- โครงสร้างนี้ดูเหมือนเป็นฟีเจอร์ที่ช่วยลดพลังงานด้วยการประมวลผลลูปขนาดเล็กซ้ำใน frontend โดยประเมินว่ามี 144 entries สำหรับเธรดเดียว และเมื่อใช้ SMT 2 เธรดจะแบ่งเป็น 72 entries ต่อเธรด
- ใน SPEC CPU2017 คะแนนรวมระหว่างการเปิด/ปิด loop buffer ต่างกัน น้อยกว่า 1% จึงดูเหมือนส่งผลต่อประสิทธิภาพทั่วไปน้อยมาก
- เมื่อปิด loop buffer, Zen 4 จะจ่าย micro-op จาก op cache มากขึ้น และ bandwidth ของ op cache ก็เพียงพอเหนือกว่า throughput ของส่วน backend ทำให้ยากที่จะกลายเป็นคอขวดที่ frontend
- เหตุผลในการปิดใช้งานและผลต่อพลังงานจริงยังไม่แน่ชัด แต่เนื่องจากเป็นฟีเจอร์จำกัดที่ AMD แทบไม่ได้ทำเอกสารหรือโปรโมต ผู้ใช้และนักพัฒนาส่วนใหญ่จึงน่าจะไม่รู้สึกถึงความเปลี่ยนแปลง
บทบาทและข้อจำกัดของ Loop Buffer ใน Zen 4
- Loop buffer คือโครงสร้างใน frontend ของ CPU ที่เก็บคำสั่งจำนวนเล็กน้อยซึ่งถูกดึงมาแล้ว เพื่อให้สามารถปิดบางขั้นตอนของ frontend ได้เมื่อรันลูปขนาดเล็กซ้ำ
- อาจช่วยลดการใช้พลังงานได้
- มีโอกาสช่วยเพิ่มประสิทธิภาพโดยเลี่ยงข้อจำกัดของ frontend ส่วนหน้า
- เป็นเทคนิคที่ใช้กันมานานในคอร์ของ Intel, Arm และ AMD
- เท่าที่ทราบ Zen 4 เป็นกรณีเดียวในบรรดาคอร์ AMD ประสิทธิภาพสูงที่มี loop buffer
- Processor Programming Reference ของ Zen 4 ระบุว่า loop buffer เป็นแหล่ง dispatch micro-op ร่วมกับ op cache และ decoder
- จากการทดลองด้วย performance counter ประเมินความจุได้ดังนี้
- เมื่อรันเธรดเดียว 144 entries
- เมื่อเปิดใช้ SMT 2 เธรด จะแบ่งแบบคงที่เป็น 72 entries ต่อเธรด
- หากในลูปมี CALL/RET อยู่ loop buffer ของ Zen 4 จะไม่สามารถจับลูปนั้นได้
- คู่มือ optimization ของ AMD สำหรับ Zen 4 ไม่ได้กล่าวถึง loop buffer และให้เพียงคำแนะนำให้รักษา hot code region ให้อยู่ภายในความจุของ op cache
Loop Buffer ที่หายไปหลังอัปเดต BIOS
- หลังอัปเดต ASRock B650 PG Lightning เป็น BIOS 3.10 การ monitoring ประสิทธิภาพฮาร์ดแวร์แสดงว่า loop buffer ไม่ dispatch micro-op
- เมื่อย้อนกลับเป็น BIOS 1.21 loop buffer ก็กลับมาเปิดใช้งานอีกครั้ง
- การปิดใช้งานน่าจะเกิดขึ้นระหว่าง AGESA 1.0.0.6 ของ BIOS 1.21 และ AGESA 1.2.0.2a ของ BIOS 3.10
- AMD นำการเปลี่ยนแปลงนี้มาใช้โดยไม่มีการประกาศหรือโปรโมตแยกต่างหาก
- จากการพูดคุยเพิ่มเติมกับพนักงาน AMD ในงาน Hot Chips 2024 ระบุว่า loop buffer เป็นฟีเจอร์เพื่อ optimization ด้านพลังงาน เป็นหลัก
ความต่างด้านประสิทธิภาพเล็กน้อยที่เห็นใน SPEC CPU2017
- คะแนนรวมของ suite จำนวนเต็มและ floating-point ใน SPEC CPU2017 ต่างกันระหว่างเปิด/ปิด loop buffer เพียง น้อยกว่า 1%
- การเพิ่มประสิทธิภาพจาก SMT ก็ไม่ได้รับผลกระทบจากการปิด loop buffer
- เหตุผลที่ผลกระทบด้านประสิทธิภาพน้อย คือ op cache ของ Zen 4 ให้ bandwidth ได้มากกว่าที่ขั้นตอน rename/allocate ใน backend จะบริโภคได้อยู่แล้ว
- แม้เปิด loop buffer อยู่ จาก performance counter ก็พบว่ามี micro-op เพียงส่วนน้อยที่ถูกจ่ายจาก loop buffer
- ใน benchmark รายตัวก็ไม่พบการสูญเสียครั้งใหญ่
- 523.xalanbmk มี loop buffer รับผิดชอบสัดส่วนเล็กแต่มีนัยสำคัญของ instruction stream แต่คะแนนคือ BIOS ใหม่ 9.48 และ BIOS เก่า 9.44 ซึ่งอยู่ในช่วงความคลาดเคลื่อน
- 544.nab ได้รับ micro-op เกือบหนึ่งในสี่จาก loop buffer แต่ใน BIOS ใหม่ที่ปิด loop buffer คะแนนกลับเพิ่มเป็น 11.7 จากเดิม 11.5 หรือเพิ่มขึ้น 1.7%
- การเพิ่มขึ้นนี้อาจเป็น run-to-run variance
- ใน performance counter ของ BIOS ใหม่ op cache เข้ามารับส่วนของ loop buffer และประมวลผลสัดส่วนที่มากขึ้นของ instruction stream
- ใน 507.cactuBSSN พบรูปแบบที่ op cache coverage ลดลงบางส่วน และ decoder จ่าย micro-op ประมาณหนึ่งในสี่ของทั้งหมด
- performance counter เป็นเครื่องมือที่แสดงแนวโน้มโดยรวม มากกว่าจะเป็นการวัดที่แม่นยำ 100%
- frontend dispatch เป็น speculative event จึงอาจได้รับผลจากคำสั่งที่ถูกดึงมาผิดหลัง branch ที่ทำนายผิด
ความเป็นไปได้ในการประหยัดพลังงานและกิจกรรมของ Frontend
- เป้าหมายหลักของ loop buffer ไม่ใช่การเพิ่มประสิทธิภาพ แต่เป็นการปิด frontend ส่วนใหญ่ รวมถึง op cache เมื่อมีโอกาส
- ฟีเจอร์ performance monitoring ของ Zen 4 มี count mask ที่สามารถนับ cycle ที่จำนวน event เกิน threshold ได้
- หากตั้ง threshold เป็น 1 จะสามารถประเมินจำนวน cycle ที่แต่ละแหล่งจ่าย micro-op ได้จ่าย micro-op จริง
- วิธีนี้ช่วยประเมินได้ว่าเมื่อเปิด loop buffer จะสามารถปิด frontend ได้บ่อยเพียงใด
- ใน SPEC CPU2017 ความถี่ที่แต่ละแหล่งจ่ายทำงานโดยรวมสอดคล้องกับสัดส่วน micro-op ที่แหล่งนั้นส่งมอบ
- ใน workload บางส่วน มี cycle จำนวนมากที่ frontend ไม่ได้จ่ายอะไรเลย
- 502.gcc, 520.omnetpp ถูกจำกัดอย่างมากด้วย backend memory latency
- หาก out-of-order execution engine ไม่สามารถคงคำสั่งไว้ในสถานะ flight ได้มากพอที่จะซ่อน latency ได้ frontend ก็จะส่งต่อไปยัง backend ไม่ได้และเข้าสู่สถานะ idle
- ใน suite floating-point, 544.nab และ 508.namd ใช้ loop buffer เป็นเวลาค่อนข้างมากในหน่วย core cycle
- 508.namd เป็น workload แบบ high IPC โดยมีค่าเฉลี่ย 3.64 IPC จึงต้องการ frontend throughput สูง
- เป็น workload ที่เป็นมิตรกับ loop buffer ทำให้มีโอกาสปิด op cache และประหยัดพลังงาน
- เมื่อปิด loop buffer, op cache จะจ่ายงานให้คอร์เป็นจำนวน cycle ที่มากขึ้น
- ใน 523.xalanbmk หากไม่มี loop buffer, op cache ต้องทำงานเพิ่มอีก 12% ของ core cycle
- 548.exchange2 เป็น workload แบบ high IPC ที่มีค่าเฉลี่ย 4.31 IPC แต่แม้เปิด loop buffer ก็แทบไม่ได้ใช้ และ op cache ทำงานมากกว่า 85% ของ core cycle
- ใน 508.namd สัดส่วนการทำงานของ op cache เพิ่มจาก 56.67% เมื่อเปิด loop buffer เป็น 75.1% เมื่อปิด
- loop buffer ขนาด 144 entries เล็กเกินกว่าจะเก็บ instruction stream ได้เป็นส่วนใหญ่
- น่าจะให้ผลชัดเจนเฉพาะเมื่อโปรแกรมใช้เวลารันส่วนใหญ่ในลูปขนาดเล็ก และไม่ถูกจำกัดด้วย backend throughput หรือ latency
สิ่งที่สังเกตได้ใน Cyberpunk 2077
- ตรวจสอบผลของการปิด loop buffer ต่อประสิทธิภาพเกมด้วย benchmark ในตัวของ Cyberpunk 2077
- เพื่อเพิ่มความสม่ำเสมอ ได้ปิด Core Performance Boost บน Ryzen 9 7950X3D และจำกัดทุกคอร์ไว้ที่ 4.2GHz
- ตั้งค่า bit 25 ของ Hardware Configuration register MSR 0xC0010015
- จำกัด RX 6900 XT ไว้ที่ 2GHz
- ตั้งค่า benchmark เป็น 1080p, medium preset, ไม่ใช้ upscaling
- เมื่อตรึงเกมไว้บน VCache die การปิด loop buffer แทบไม่ส่งผลต่อประสิทธิภาพ
- เมื่อตรึงไว้บน non-VCache die พบว่าเมื่อปิด loop buffer มี ประสิทธิภาพลดลง 5% แต่ยังยืนยันสาเหตุไม่ได้
- benchmark ถูกรันซ้ำประมาณหกครั้ง
- โดยเฉลี่ย Cyberpunk 2077 มี loop buffer รับผิดชอบ instruction stream ราว 22% ซึ่งเป็นมิตรกับ loop buffer มากกว่าที่คาด
- หลังปิด loop buffer สัดส่วนการจ่าย micro-op ของ op cache เพิ่มจาก 62% เป็น 82%
- เกมนี้ไม่ใช่ workload แบบ high IPC โดยมีค่าเฉลี่ย 0.89 IPC เมื่อปิด loop buffer และ 1.02 IPC เมื่อเปิด
- frontend bandwidth ไม่ใช่ประเด็นสำคัญ
- อาจเป็น backend bound หรือถูกจำกัดด้วย branch predictor delay
- เมื่อรันบน VCache die, performance counter แสดงค่าเฉลี่ย 1.25 IPC เมื่อเปิด loop buffer และ 1.07 IPC เมื่อปิด
- พบประสิทธิภาพลดลงเล็กน้อยบน BIOS ใหม่ด้วย
- ที่ระดับประมาณ 155 FPS อาจเข้าใกล้คอขวดฝั่ง GPU มากขึ้น
ความไม่แน่นอนของผลลัพธ์จาก Core Power Counter
- เพื่อตรวจสอบว่าการรันผ่าน loop buffer ช่วยเพิ่มประสิทธิภาพด้านพลังงานหรือไม่ จึงดู core power counter ของ Zen 4 ด้วย
- instruction bandwidth benchmark ถูกปรับไม่ให้ใช้ CALL/RET ในช่วงทดสอบ
- เพราะหากมี CALL/RET, Zen 4 จะไม่ใช้ loop buffer
- การทดสอบถูกตรึงไว้บนหนึ่งคอร์ และอ่าน Core Energy Status MSR ก่อนและหลังการกระโดดไปยัง test array เพื่อคำนวณพลังงานเฉลี่ย
- ปิด Core Performance Boost เพราะค่าพลังงานที่อ่านได้แกว่งมาก
- ใน BIOS เก่า Core Energy Status MSR แสดงค่าเฉลี่ย 6W เมื่อนำ NOP จาก op cache และแสดงพลังงานต่ำกว่ามากเมื่อนำจาก loop buffer
- แม้เพิ่มขนาด test array ถึง 128KB ซึ่งพอดีกับความจุ L2 เพื่อลด op cache coverage ให้ต่ำกว่า 1% ก็ยังแสดงค่า core power เฉลี่ย 1.5W
- เป็นผลที่ไม่สอดคล้องกับสถานการณ์ที่ควรมีการใช้ decoder และ L2 fetch path เพิ่มขึ้น
- ใน BIOS ใหม่ การทดสอบ op cache แสดงค่าเฉลี่ย 1.68W และการทดสอบที่ให้ decoder จ่ายงานหลักจาก L2 ก็แสดงพลังงานแทบเท่ากัน
- ฟีเจอร์ power monitoring ของ AMD อาจเป็นการสร้างแบบจำลองพลังงาน ไม่ใช่การวัดจริง
- อาจมีการเปลี่ยนวิธี modeling ระหว่าง BIOS แต่ละเวอร์ชัน หรือ power model อาจไม่ตรง
- ไม่มีฮาร์ดแวร์สำหรับวัดโดยตรงที่ตัวเชื่อมต่อ 12V EPS เป็นต้น จึงไม่ได้ตรวจสอบเพิ่มเติม
เหตุผลในการปิดใช้งานและมุมมองของนักพัฒนา
- ยังไม่ทราบเหตุผลที่ AMD ปิดใช้งาน loop buffer ของ Zen 4
- ฟีเจอร์ของ CPU บางครั้งถูกปิดใช้งานเพราะบั๊กฮาร์ดแวร์
- มีกรณีที่ LSD ซึ่งเป็น loop buffer ของ Intel Skylake ถูกปิดใช้งานเพราะบั๊กเกี่ยวกับ partial register access ในลูปสั้นเมื่อเปิดใช้งาน SMT ทั้งสองเธรด
- Zen 4 เป็นความพยายามครั้งแรกของ AMD ในการใส่ loop buffer ลงใน CPU ประสิทธิภาพสูง และการตรวจสอบฟีเจอร์ที่เป็น implementation แรกนั้นทำได้ยาก
- AMD อาจพบบั๊กภายในที่ไม่เปิดเผยต่อภายนอก และปิด loop buffer เป็นมาตรการป้องกัน
- ผลต่อประสิทธิภาพดูเหมือนแทบไม่มีหรือมีน้อยมาก เพราะ bandwidth ของ op cache เพียงพอ
- ผลต่อพลังงานยังไม่ทราบ แต่อาจเล็กและวัดได้ยาก
- AMD แทบไม่ได้ทำเอกสารหรือโฆษณา loop buffer เลย นอกเหนือจากหนึ่งบรรทัดใน Processor Programming Reference
- ตรงข้ามกับ Intel ที่มักทำเอกสารเกี่ยวกับ loop buffer ของตน และแนะนำในคู่มือ optimization ให้นักพัฒนาใช้ประโยชน์
- loop buffer ของ Zen 4 เป็นฟีเจอร์จำกัดที่มีประโยชน์ไม่เท่า op cache เพราะความจุต่ำและข้อจำกัดเรื่อง CALL/RET
- หากจะ optimize โดยคำนึงถึง loop buffer ของ Zen 4 บน BIOS เก่า อาจพิจารณาเงื่อนไขต่อไปนี้
- รักษาลูปให้มีขนาดต่ำกว่า 144 micro-ops
- หากมีสองเธรดแชร์ physical core ให้พิจารณาความจุประมาณครึ่งหนึ่ง
- พิจารณา inline ฟังก์ชันที่ถูกเรียกในลูปขนาดเล็ก เพื่อหลีกเลี่ยง CALL/RET
- แม้ทำ optimization แบบนี้ ผลตอบแทนก็น่าจะไม่มีในกรณีส่วนใหญ่
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีการคาดเดาว่าฟีเจอร์นี้อาจถูกปิดใช้งานเพื่อพยายามป้องกัน ช่องโหว่ฮาร์ดแวร์ ที่ยังไม่ถูกเปิดเผย
ก็ไม่ใช่เรื่องเกินจริงที่จะจินตนาการว่า AMD พบข้อบกพร่องที่ไม่มีใครภายในเคยเจอ และปิดลูปบัฟเฟอร์ด้วยความระมัดระวังเกินเหตุ ในช่วงวงจรชีวิตของคอร์ ณ จุดนี้ นึกไม่ค่อยออกว่า AMD จะมีเหตุผลอื่นใดในการไปแตะฟรอนต์เอนด์ของ Zen 4
ส่วนตัวแล้วรู้สึกเหมือนเป็น มาตรการบรรเทาระดับไมโครโค้ด แต่แน่นอนว่าต้องรอดู CVE ก่อน
หากไม่เปิดเผยช่องโหว่ ฝ่ายที่ได้รับผลกระทบก็ไม่มีทางเริ่มรับมือได้ นอกจากความหวาดระแวงล้วน ๆ การเปิดเผยช่องโหว่ยังเป็นวิธีผลักความรับผิดชอบไปยังผู้ใช้ปลายทางด้วย ทำนองว่า ถ้าไม่อัปเดตก็อย่าบ่น การเปิดเผยมักไม่ค่อยนำไปสู่ความรับผิดชอบต่อผลิตภัณฑ์ และจำไม่ได้ว่ามีประเด็นความรับผิดแบบนั้นในกรณี Meltdown หรือ Spectre ด้วย ดังนั้นจึงไม่ขอฟันธงว่า AMD จงใจปกปิด
บทความดูเหมือนจะบอกเป็นนัยว่า ลูปบัฟเฟอร์ ไม่ได้ให้ประโยชน์ทั้งด้านประสิทธิภาพหรือพลังงาน
ถ้าเป็นเช่นนั้น ก็อาจเป็นกรณีคลาสสิกแบบ “ทีมวิศวกรใช้เวลาหลายเดือนสร้างฟีเจอร์ใหม่แวววาว แต่ไม่มีประโยชน์จริง ถึงอย่างนั้นก็ยังปล่อยออกมาเพราะมีใครบางคนอยากรักษาหน้า” ในทีมซอฟต์แวร์ก็เคยเห็นการเสนอให้เขียนโค้ดเบสใหม่เพื่อกำจัดความอุ้ยอ้ายแบบ legacy และเพิ่มประสิทธิภาพ แต่พอเสร็จแล้วจำนวนบรรทัดโค้ดกลับเพิ่มขึ้นและประสิทธิภาพแย่ลง ทั้งสองกรณีไม่ควรถูกปล่อยออกมาเลย
ยากที่จะมองว่าทีมวิศวกรรมของ AMD จะไร้หลักการถึงขั้นปล่อยให้ฟีเจอร์ฮาร์ดแวร์ที่ไร้ค่าใช้พื้นที่และพลังงานไปเปล่า ๆ และในกรณีนี้อยากให้น้ำหนักกับความเป็นไปได้ที่ Chips 'n Cheese วัดผลกระทบไม่พบมากกว่า
น่าหงุดหงิดมาก แต่ไม่มีใครอยากใช้เวลาทำการตรวจสอบล่วงหน้า การดันโปรเจกต์ใหม่มักทำให้ผู้บริหารระดับบนพอใจและถูกตั้งคำถามน้อยกว่า
ย่อหน้าที่น่าสนใจที่สุดในบทความคือส่วนนี้: มุมมองที่ดีที่สุดต่อการมีลูปบัฟเฟอร์ใน Zen 4 คือมันเป็นสัญญาณว่า AMD มี กำลังสำรอง ให้เหล่าวิศวกรได้ลองทำอะไรบางอย่าง
ครั้งนี้อาจไม่ประสบผลสำเร็จ แต่การให้วิศวกรได้ทดลองกับฟีเจอร์ที่มีความเสี่ยงต่ำและผลกระทบต่ำ เป็นวิธีที่ดีในการสร้างความมั่นใจ หวังว่าจะได้เห็นความมั่นใจแบบนั้นมากขึ้นในอนาคต
ส่วนที่ว่า “แปลกตรงที่ถ้าตรึงไว้กับได non-VCache การปิดลูปบัฟเฟอร์ทำให้ประสิทธิภาพเกมลดลง 5% ไม่รู้ว่าทำไม” นั้น ถ้ามีการวัดพลังงานที่ละเอียดกว่านี้ ก็น่าจะช่วยตัดสินได้ว่าเกี่ยวกับ งบประมาณด้านความร้อน/พลังงาน หรือไม่
ฟีเจอร์นี้ก็ดูเหมือนมีเจตนาเพื่อประหยัดพลังงานด้วย
ในชิป non-X3D ของผม คอร์ส่วนใหญ่ใน CCD0 ไปได้ถึง 5.6~5.75GHz แต่คอร์ใน CCD1 จบที่ 5.4~5.5GHz ชิป V-Cache ของ Zen 4 มีโทษด้านคล็อกมาก แต่แคชชดเชยได้เกินกว่านั้น ต้องดูว่าทดสอบทั้งสถานะเปิดและปิดฟีเจอร์บน CCD1 ของชิปเดียวกันหรือไม่ และพยายามแยกการเปลี่ยนแปลงอื่น เช่น การแก้ไขด้านความปลอดภัย ออกหรือไม่ ซึ่งบทความเองก็ยอมรับว่า “ไม่” หากจะทำให้ถูกต้อง ต้องหาวิธีปิดเฉพาะฟีเจอร์นี้ใน BIOS ที่ยังเปิดอยู่ แล้วทดสอบทั้งสองฝั่งบนชิปตัวเดียวกัน และถึงอย่างนั้นผลลัพธ์ก็อาจไม่แม่นยำเพราะเงื่อนไขการแตกแขนงอื่น ๆ ถ้ามีโปรไฟล์ประสิทธิภาพทั้งหมด ความแม่นยำจะสูงขึ้น แต่คงมีแค่วิศวกรของ AMD ที่ทำได้
ดูเหมือนมันเล็กเกินไปที่จะสร้างความแตกต่างจริง และมีความหมายเฉพาะในสถานการณ์ที่เจาะจงมาก ๆ เท่านั้น ถ้าทำให้ใหญ่กว่านี้ ต้นทุนการใช้งานน่าจะสูงเกินประโยชน์
ถึงอย่างนั้นก็คงมี regression เล็กน้อยในบาง workload แต่ AMD ก็เคยทำการปรับปรุงประสิทธิภาพเล็ก ๆ หลังวางจำหน่ายมาแล้ว ใน Zen 4 น่าจะทำให้เป็นตัวเลือกใน BIOS ไปเลย การที่ดูเหมือนไม่ได้ทำเช่นนั้นบ่งชี้ถึงความเป็นไปได้ของบั๊กหรือปัญหาด้านความปลอดภัย
เกร็ดหนึ่งคือ ความแตกต่างไม่กี่อย่างระหว่าง 68000 ปี 1979 กับ 68010 ปี 1982 มี “loop mode” หรือการเพิ่มบัฟเฟอร์ลูปขนาด 6 ไบต์อยู่ด้วย
คือให้ CPU สองตัวทำงานเหลื่อมกันหนึ่งไซเคิล แล้วฉีดอินเทอร์รัปต์ที่กู้คืนได้เข้าไปใน CPU ตัวที่สอง ถึงอย่างนั้น ถ้าต้องการ CPU ที่มี MMU, ชุดคำสั่ง 32 บิต และบัสแอดเดรส 24 บิต ตอนนั้นก็ดูเหมือนจะถูกกว่าทางเลือกอื่น ๆ คงเป็นยุคที่โหดจริง ๆ
คำสั่ง 4 คำสั่งอยู่ในเวิร์ด 18 บิตหนึ่งคำ และมี opcode หนึ่งตัวที่ลด loop counter แล้วกลับไปยังจุดเริ่มต้นของเวิร์ด แบบนั้นมันจึงทำงานได้เร็วขึ้นพอสมควร
หนึ่งในนั้นต้องเป็นคำสั่งลูป (DBcc) ดังนั้นตัวลูปจึงต้องเป็นคำสั่งเดียว สิ่งที่เร็วขึ้นได้จริง ๆ แทบจะมีแค่ memcpy ที่ไม่ได้ optimize เท่านั้น
น่าสนใจที่ใน Cortex-A15 สิ่งนี้เป็น ฟีเจอร์หลักของการออกแบบ อยากรู้ว่ามีตัวเลขผลลัพธ์ในชิปอื่น ๆ ไหม
ในอุปกรณ์อย่างคอนโซลที่มีอายุการออกแบบยาวกว่า อย่างน้อยก็น่าจะใช้เป็นเป้าหมายในการ optimize ได้
เพราะหัวใจของ RISC คือการ fetch และ decode คำสั่งนั้นง่ายกว่ามาก หรือแทบจะเป็นเรื่องเล็กน้อย
ผมมี 7950X3D ซึ่งอัปเกรดมาจาก Skylake 6700K ดูเหมือนโดยไม่รู้ตัวแล้วผมจะถูกดึงดูดเข้าหา ชิปที่บัฟเฟอร์ลูปฮาร์ดแวร์ถูกปิดใช้งานด้วยซอฟต์แวร์
เป็นบทความที่น่าสนใจ แต่ไม่รู้ว่าบัฟเฟอร์ลูปกิน พื้นที่บนได มากแค่ไหน
ถ้าตัดออกในชิปรุ่นถัดไป ก็สงสัยว่าจะเอาพื้นที่นั้นไปใช้กับสิ่งที่มีประโยชน์กว่าอย่าง L2 cache ที่ใหญ่ขึ้นได้หรือไม่
ในทางทฤษฎี บัฟเฟอร์ลูปช่วยประหยัดพลังงานหรือเพิ่มประสิทธิภาพในลูปที่แน่นมากได้ ในทางปฏิบัติดูเหมือนจะทำไม่ได้ทั้งสองอย่าง และ AMD ก็ถอดมันออกทั้งหมดใน Zen 5
ถ้าเป็นอย่างนั้นจริงก็สมเหตุสมผล และต้นทุนด้านพื้นที่ก็น่าจะเป็นเพียงลอจิกควบคุมเพิ่มเติม ส่วนที่แพงที่สุดน่าจะเป็นการตรวจจับลูปตั้งแต่แรก แต่ก็น่าจะค่อนข้างเล็กเมื่อเทียบกับขนาดคิว
การวิเคราะห์ในส่วน “พลังงาน” ดูเหมือนจะไม่ได้หารด้วยจำนวนคำสั่งที่รันต่อวินาที
ถ้าจะดูประโยชน์ของบัฟเฟอร์ลูปนี้ แทบจะแน่นอนว่าควรดู พลังงานต่อคำสั่ง ไม่ใช่พลังงานต่อวินาที หรือกำลังไฟ (วัตต์)
แม้แต่ลำดับและเนื้อหาใน RAM ก็เปลี่ยนทุกอย่างได้ การรันแบบเปิดและปิดหลายร้อยครั้งอาจช่วยแยกแยะได้บ้าง แต่จะใช้เวลามหาศาลและก็ยังไม่แม่น 100% อยู่ดี แค่การปิดฟีเจอร์ก็อาจทำให้โค้ดไปคนละ branch และทำให้การจัดวางทั้งหมดเปลี่ยนไป ผมไม่ได้รู้ปัญหานี้แบบเฉพาะเจาะจง แต่เคยเห็นกรณีที่พอปิดฟีเจอร์แล้วโหลดถูกย้ายจาก integer unit ไปยัง FPU หรือ GPU หรือมีคำสั่งหายไป 5 คำสั่งแต่เพิ่มเข้ามา 2 คำสั่งแทน