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