กลับไปหน้าบทความ

อ่าน 2 นาที

การเคลื่อนไหวของรหัส

ใน วิทยาการคอมพิวเตอร์ การ เคลื่อนย้ายโค้ด ซึ่งรวมถึงการยกโค้ดขึ้น (code hoisting), การลดโค้ดลง (code sinking), การเคลื่อนย้ายโค้ดที่ไม่ขึ้นกับลูป (loop-invariant code motion)...

การเคลื่อนไหวของรหัส

ในวิทยาการคอมพิวเตอร์การเคลื่อนย้ายโค้ดซึ่งรวมถึงการยกโค้ดขึ้น (code hoisting), การลดโค้ดลง (code sinking), การเคลื่อนย้ายโค้ดที่ไม่ขึ้นกับลูป (loop-invariant code motion) และการแยกตัวประกอบโค้ด (code factoring) เป็นคำรวมที่ใช้เรียกกระบวนการใดๆ ที่เคลื่อนย้ายโค้ดภายในโปรแกรม โดยทั่วไปแล้วจะทำเพื่อเพิ่มประสิทธิภาพและลดขนาดโปรแกรม และเป็นการเพิ่มประสิทธิภาพที่พบได้ทั่วไปในคอมไพเลอร์ที่เน้นการเพิ่มประสิทธิภาพ ส่วน ใหญ่

การใช้งาน

การเคลื่อนย้ายโค้ดมีประโยชน์และการใช้งานที่หลากหลาย ซึ่งหลายอย่างก็มีความคล้ายคลึงกันในแง่ของการนำไปใช้งาน

การลบการดำเนินการที่ไม่ได้ใช้/ไร้ประโยชน์

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

Code sinkingหรือที่รู้จักกันในชื่อlazy code motionเป็นคำที่ใช้เรียกเทคนิคที่ช่วยลดคำสั่งที่สูญเปล่าโดยการย้ายคำสั่งไปยังสาขาที่ใช้คำสั่งนั้น[ 1 ]หากมีการดำเนินการก่อนสาขา และมีเพียงเส้นทางสาขาเดียวที่ใช้ผลลัพธ์ของการดำเนินการนั้น Code sinking จะเกี่ยวข้องกับการย้ายการดำเนินการนั้นไปยังสาขาที่จะใช้

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

ลดขนาดของโปรแกรมลง

แผนภาพที่แสดงการเพิ่มประสิทธิภาพด้านขนาดโดยใช้การแยกส่วนโค้ด โดยสมมติว่าการดำเนินการทั้งหมดไม่ขึ้นอยู่กับการดำเนินการอื่นที่เกิดขึ้นก่อนหน้านั้น

การแยกตัวประกอบโค้ดเป็นคำที่ใช้เรียกเทคนิคการเพิ่มประสิทธิภาพขนาดที่รวมการพึ่งพาที่เหมือนกันในสาขาต่างๆ เข้ากับสาขาด้านบน[ 2 ]เช่นเดียวกับการแยกตัวประกอบจำนวนเต็มที่แยกตัวเลขออกเป็นรูปแบบที่เล็กที่สุดเท่าที่จะเป็นไปได้ (เป็นตัวประกอบ) การแยกตัวประกอบโค้ดจะแปลงโค้ดให้เป็นรูปแบบที่เล็กที่สุดเท่าที่จะเป็นไปได้ โดยการรวม "ตัวประกอบ" ที่เหมือนกันจนกว่าจะไม่มีส่วนที่ซ้ำกันเหลืออยู่

ลดปัญหาการหยุดชะงักเนื่องจากการพึ่งพา

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

การเคลื่อนย้ายโค้ดทั่วโลกการเคลื่อนย้ายโค้ดเฉพาะที่ การจัดตารางโค้ด การจัดตารางคำสั่ง และการยก/จมโค้ด ล้วนเป็นคำที่ใช้เรียกเทคนิคที่คำสั่งต่างๆ ถูกจัดเรียงใหม่ (หรือ "จัดตาราง") เพื่อปรับปรุงประสิทธิภาพการทำงานภายใน CPU [ 3 ] [ 4 ] CPUสมัยใหม่สามารถจัดตารางคำสั่งได้ห้าคำสั่งขึ้นไปต่อรอบสัญญาณนาฬิกา อย่างไรก็ตาม CPU ไม่สามารถจัดตารางคำสั่งที่ต้องอาศัยข้อมูลจากคำสั่งที่กำลังดำเนินการอยู่ (หรือยังไม่ได้ดำเนินการ) คอมไพเลอร์จะสลับการพึ่งพาในลักษณะที่เพิ่มจำนวนคำสั่งที่ CPU สามารถประมวลผลได้สูงสุดในแต่ละช่วงเวลา[ 5 ]

บนสถาปัตยกรรมIntel Itanium ที่เลิกใช้งานแล้ว คำสั่ง ทำนายการแตกแขนง (BRP) จะถูกยกขึ้นเหนือการแตกแขนงโดยคอมไพเลอร์ด้วยตนเอง เพื่อให้ CPU สามารถดำเนินการแตกแขนงได้ทันที Itanium อาศัยการจัดกำหนดการโค้ดเพิ่มเติมจาก CPU เพื่อเพิ่มประสิทธิภาพสูงสุดในโปรเซสเซอร์[ 6 ]

การเคลื่อนรหัสที่ไม่เปลี่ยนแปลงในลูป

แผนภาพแสดงการเคลื่อนย้ายโค้ดที่ไม่เปลี่ยนแปลงระหว่างการทำงานของลูปบนกราฟการทำงาน โดยสมมติว่า D ไม่เปลี่ยนแปลงระหว่างการทำงานของลูป

การเคลื่อนย้ายโค้ดที่ไม่เปลี่ยนแปลงในลูป คือกระบวนการย้ายโค้ดที่ไม่เปลี่ยนแปลงในลูปไปยังตำแหน่งภายนอกลูป ซึ่งอาจช่วยลดเวลาในการทำงานของลูปได้ โดยป้องกันไม่ให้มีการคำนวณบางอย่างซ้ำกันเพื่อให้ได้ผลลัพธ์เดียวกัน

ตัวอย่างคอมไพเลอร์

LLVM

LLVMมี pass แบบ sinking ในรูปแบบการกำหนดค่าคงที่แบบเดี่ยว LLVM 15.0 จะไม่ sink การดำเนินการหากเส้นทางโค้ดใดๆ มีคำสั่ง store หรือหากอาจเกิดข้อผิดพลาด[ 7 ]นอกจากนี้ LLVM จะไม่ sink คำสั่งลงในลูป

จีซีซี

GNU Compiler Collectionใช้การย้ายโค้ดภายใต้ชื่อ "code factoring" โดยมีวัตถุประสงค์เพื่อลดขนาดของโปรแกรมที่คอมไพล์แล้ว[ 8 ] GCC จะย้ายโค้ดขึ้นหรือลงหาก "[ไม่] ทำให้การพึ่งพาที่มีอยู่เป็นโมฆะหรือแนะนำการพึ่งพาใหม่" [ 9 ]

ลูอาจิท

LuaJITใช้การจมโค้ดภายใต้ชื่อ "การจมการจัดสรร" เพื่อลดปริมาณเวลาที่โค้ดที่คอมไพล์ใช้ในการจัดสรรและรวบรวมวัตถุชั่วคราวภายในลูป[ 10 ]การจมการจัดสรรจะย้ายการจัดสรรไปยังเส้นทางการดำเนินการที่วัตถุที่จัดสรรอาจหลุดออกจากโค้ดที่กำลังทำงานอยู่ และจะต้องใช้การจัดสรรฮีปการจัดสรรที่ถูกลบทั้งหมดจะถูกเติมเต็มด้วยการส่งต่อการโหลดไปยังที่เก็บข้อมูลผ่านฟิลด์ของพวกมัน[ 11 ]

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Code_motion&oldid=1352684029 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การเคลื่อนไหวของรหัส

ใน วิทยาการคอมพิวเตอร์ การ เคลื่อนย้ายโค้ด ซึ่งรวมถึงการยกโค้ดขึ้น (code hoisting), การลดโค้ดลง (code sinking), การเคลื่อนย้ายโค้ดที่ไม่ขึ้นกับลูป (loop-invariant code motion)...

การใช้งาน

การเคลื่อนย้ายโค้ดมีประโยชน์และการใช้งานที่หลากหลาย ซึ่งหลายอย่างก็มีความคล้ายคลึงกันในแง่ของการนำไปใช้งาน

การลบการดำเนินการที่ไม่ได้ใช้/ไร้ประโยชน์

Code sinking หรือที่รู้จักกันในชื่อ lazy code motion เป็นคำที่ใช้เรียกเทคนิคที่ช่วยลดคำสั่งที่สูญเปล่าโดยการย้ายคำสั่งไปยังสาขาที่ใช้คำสั่งนั้น [ 1 ] หากมีการดำเนินการก่อนสาขา และมีเพียงเส้นทางสาขาเดียวที่ใช้ผลลัพธ์ของการดำเนินการนั้น Code sinking...

ลดขนาดของโปรแกรมลง

การแยกตัวประกอบโค้ด เป็นคำที่ใช้เรียกเทคนิคการเพิ่มประสิทธิภาพขนาดที่รวมการพึ่งพาที่เหมือนกันในสาขาต่างๆ เข้ากับสาขาด้านบน [ 2 ] เช่นเดียวกับ การแยกตัวประกอบจำนวนเต็มที่ แยกตัวเลขออกเป็นรูปแบบที่เล็กที่สุดเท่าที่จะเป็นไปได้ (เป็นตัวประกอบ)...