คลิกที่นี่

Download Report

Transcript คลิกที่นี่

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