Register Allocation and Graph Coloring การจัดเข้าสู่รีจิสเตอร์และการให้สีกราฟ
ปัญหา Register Allocation IR ใช้ตัวแปร temporary ไม่จำกัดจำนวน ช่วยในเรื่อง optimization แต่จะยากต่อการผลิต assembly code ตัวแปร temporary มีจำนวนมากกว่ารีจิสเตอร์ที่ CPU มีให้ สิ่งที่ต้องทำ: เปลี่ยนให้ IR ไม่มีการใช้ตัวแปร temporary ไปมากกว่ารีจิสเตอร์ที่ CPU มีให้ จะต้องจัด temporary หลายๆตัวให้เข้าสู่รีจิสเตอร์หนึ่งตัว การจัดการนี้ต้องไปกระทบพฤติกรรมของโปรแกรม
ตัวอย่าง พิจารณาส่วนของโปรแกรมต่อไปนี้ ให้ว่า a และ e dead หลังจากใช้งานแล้ว ตัวแปร temporary a และ e สามารถนำกลับมาใช้งานได้อีกครั้งหนึ่ง สามารถจัดให้ค่าของ a e และ f ใส่ไว้ที่ register เพียงหนึ่งตัวได้ (r1) ตัวแปร temporary ที่ dead สามารถกำจัดทิ้งไปและนำมาใช้ใหม่ได้
แนวคิดหลัก ตัวแปร t1 และ t2 สามารถใช้รีจิสเตอร์เดียวกันได้ถ้า ณ จุดใดๆของโปรแกรม มีตัวแปรตัวใดตัวหนึ่งเท่านั้นที่ live (นั่นคือ live สองตัวพร้อมกันไม่ได้) พูดอีกแบบหนึ่งก็คือ ถ้า t1 และ t2 live ณ จุดเดียวกันของโปรแกรม ทั้งสองจะไม่สามารถใช้รีจิสเตอร์เดียวกันได้
อัลกอริทึม: คำนวณ Liveness
อัลกอริทึม: Register Interference Graph สร้าง undirected graph ที่ มี node เป็นตัวแปร temporary มี edge ระหว่าง node ที่แทนตัวแปร temporary t1 และ t2 ถ้าทั้งสอง live พร้อมกัน ณ จุดใดๆของโปรแกรม เรียก graph ที่สร้างขึ้นนี้ว่า register interference graph (RIG) ตัวแปร temporary 2 ตัว สามารถถูกจัดเข้าอยู่ที่รีจิสเตอร์ตัวเดียวได้ถ้าไม่มี edge ที่เชื่อมระหว่างตัวแปรสองตัวนี้
ตัวอย่าง จากตัวอย่างส่วนของโปรแกรม สร้าง RIG ได้ตามด้านล่างนี้ b และ c ไม่สามารถใช้รีจิสเตอร์เดียวกันได้ แต่ b และ d สามารถใช้รีจิสเตอร์เดียวกันได้
ข้อสังเกต Liveness และ RIG เป็นกรอบแนวคิดที่จะนำไปสู่การทำ register allocation ได้อย่างถูกต้อง เป็นข้อมูล global (หมายถึงครอบคลุมทั่วทั้ง control flow graph ของโค๊ดใน procedure) หลังจากเราสร้าง RIG ได้แล้ว ขั้นตอนการทำ register allocation จะขึ้นอยู่กับสถาปัตยกรรมของเครื่องที่เรา target ไปหา X86 มีรีจิสเตอร์ 8 ตัว แต่ละตัวมีการข้อตกลงการใช้งานเฉพาะ MIPS มีรีจิสเตอร์ 32 ตัว โดยแต่ละตัวเป็น general purpose (สามารถใช้งานในแบบใดๆก็ได้)
นิยาม การให้สีกราฟ (graph coloring) คือการให้สีแต่ละ node ของกราฟโดยที่ node สอง node ใดๆที่มี edge เชื่อมถึงกันมีสีที่แตกต่างกัน k-colorable graph หมายถึงกราฟที่สามารถใช้สี k สีในการทำ graph coloring ได้สำเร็จ
การทำ Register Allocation โดยใช้ Graph Coloring สีแต่ละสีก็คือรีจิสเตอร์แต่ละตัว เราจะต้องให้สี (รีจิสเตอร์) กับ node (ตัวแปร temporary) ให้ k เท่ากับจำนวนรีจิสเตอร์ที่ฮาร์ดแวร์มีให้ ถ้า RIG นั้น k-colorable แสดงว่าเราสามารถใช้รีจิสเตอร์ k ตัว หรือน้อยกว่าในการแทนตัวแปร temporary ทั้งหมดใน control flow graph ของ procedure ได้สำเร็จ
ตัวอย่าง Graph Coloring พิจารณา RIG ด้านล่าง สังเกตได้ว่าเราไม่สามารถจะให้สี RIG นี้โดยใช้สีน้อยกว่า 4 สีได้ จะต้องใช้สีมากกว่าหรือเท่ากับ 4
ตัวอย่างโปรแกรม
หลังจากการทำ Register Allocation
การคำนวณ Graph Coloring ไม่ใช่ปัญหาที่ง่าย ถามว่า “ยาก” ขนาดไหน “ยาก” ขนาด NP ปัญหา graph coloring เป็นปัญหา NP-Complete (นั่นคือเป็นปัญหา NP-Hard ด้วย) ในปัจจุบันยังไม่มีผู้สามารถหาอัลกอริทึมที่มีประสิทธิภาพ (มี runtime เป็น polynomial order) มาแก้ปัญหานี้ได้ ดังนั้นเราจะแก้ปัญหานี้โดยใช้ heuristics (ทางแก้ปัญหาที่พยายามเลือกทางออกที่ดีที่สุดในแต่ละขั้นโดยประเมินจากปัจจัยกระทบจากสภาวะแวดล้อมที่เป็นอยู่)
Heuristic ในการทำ Graph Coloring เลือก node t ที่มี neighbor (node อื่นๆที่เชื่อมกับ t ด้วย edge) น้อยกว่า k โดย k คือจำนวนสีหรือรีจิสเตอร์ที่มีอยู่ นำ node t และ edge ที่ติดอยู่กับ node t ออกจาก RIG เริ่มต้น ได้ RIG ใหม่ที่มี node น้อยกว่าเดิมหนึ่ง node ถ้า RIG ใหม่ k-colorable แสดงว่า RIG เริ่มต้นก็ k-colorable เช่นกัน นิสิตลองให้เหตุผลได้ไหมว่าทำไม heuristic ด้านบนที่ได้กล่าวมาสามารถทำ k coloring ได้ถูกต้อง ให้ c1,…,cn เป็นสีที่ให้กับ neighbor ของ t ใน RIG ใหม่ เนื่องาก n < k เราจึงสามารถหาสีที่แตกต่างจาก c1,…,cn มาใส่ให้กับ t ได้
การเขียนโปรแกรมเพื่อทำ Graph Coloring ทำตามขั้นตอนต่อไปนี้ เลือก node t ที่มี neighbor น้อยกว่า k เก็บ t ลงบน stack และนำ t และ edge ที่ติดกับ t ทั้งหมดออกจาก RIG เดิม ทำซ้ำจนกระทั่งเหลือ node ใน RIG เพียงหนึ่ง node จากนั้นเราจะให้สีกับแต่ละ node ที่อยู่บน stack เริ่มจาก node สุดท้ายที่ใส่เข้าไปใน stack และในแต่ละขั้นที่ pop node ออกมาเพื่อให้สี เลือกสีที่แตกต่างจากสีที่ได้ให้กับ neighbor ของ node นี้
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring • ณ จุดนี้เราได้ทุก node อยู่บน stack แล้ว เราจะเริ่มทำการให้สี node แต่ละ node
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring
ตัวอย่าง Graph Coloring