Upload
suzy
View
36
Download
0
Embed Size (px)
DESCRIPTION
Register Spilling. การ ล้นจาก รีจิสเตอร์. Spilling (การล้นจากรีจิสเตอร์). เกิดอะไรขึ้นถ้าทุกๆ node มี neighbor มากกว่า k ตัวอย่างเช่นถ้าเราต้องการทำ 3-coloring ของ RIG ด้านล่างนี้. Spilling (การล้นจากรีจิสเตอร์). - PowerPoint PPT Presentation
Citation preview
Register Spilling
การล้นจากรจีสิเตอร์
Spilling (การล้นจากรจีสิเตอร)์
• เกิดอะไรขึ้นถ้าทกุๆ node มี neighbor มากกวา่ k• ตัวอยา่งเชน่ถ้าเราต้องการทำา 3-coloring ของ RIG ด้านล่างน้ี
Spilling (การล้นจากรจีสิเตอร)์
• ถ้าเราลบ node หนึ่งออกไปตามขัน้ตอนheuristics เราจะไปต่อไปได้ดังแสดงด้วยรูป RIG ใหม่ต้านล่าง
• ในกรณีนี้เราจะทำาการเลือก node ท่ีจะ spill– ตัวแปรท่ีถกู spill “ไปจะไป lives” ในหน่วยความจำาหลักแทน– ใหว้า่เราเลือก f ท่ีจะต้องถกู spill ไปท่ีหน่วยความจำาหลัก
Spilling (การล้นจากรจีสิเตอร)์
• หลังจากท่ีเรา spill f แล้ว เราสามารถกลับไปใช้heuristic ได้เหมอืนเดิม ( ดจูากภาพ RIG ด้านล่าง)
Spilling (การล้นจากรจีสิเตอร)์
• ในท้ายท่ีสดุเราก็จะต้องใหค่้าสกัีบ f โดยความ คาดหวงัของเราก็คือจาก neighbor ทัง้ 4 ของ f
นัน้ บางทีอาจจะมสีท่ีีใชแ้ตกต่างกัน น้อยกวา่ 3 สีก็เป็นได้
Spilling
• ในกรณีนี้ไมเ่ป็นเชน่ท่ีเราคาดหวงั– เราจะต้องทำาการจองตำาแหน่งในหน่วยความจำาหลักใหกั้บ f• สว่นใหญ่ใชพ้ื้นท่ีบน stack และจดัใหอ้ยูใ่น AR• เรยีกตำาแหน่งนี้วา่ fa
• ในกรณีท่ีมกีารใช้ f ใหเ้พิม่คำาสัง่ load เพื่อนำาขอ้มูลเขา้เขา้ มาท่ี f
f := load fa• ในกรณีท่ีมกีาร assign ค่าให้ f ( การ write ไปท่ี f) ใหใ้สค่ำา
สัง่ store ต่อไปน้ีstore f, fa
ตัวอยา่ง Spilling
• โค๊ดใหมห่ลังจากการ spill ตัวแปร f
ค่า Liveness เดิม
คำานวณ Liveness ใหม่
คำานวณ Liveness ใหม่• ขอ้มูล liveness ท่ีคำานวณได้ใหมม่คีวามใกล้เคียงกับ
liveness เดิมมาก ( สำาหรบั CFG ท่ีไมม่กีาร spill)• f จะ live ในชว่งต่อไปนี้– ระหวา่ง f := load fa และคำาสัง่ท่ีอยูถั่ดไป– ระหวา่ง f := load fa และคำาสัง่ท่ีอยูก่่อนหน้านี้
• การทำา spilling ลดชว่งชวีติ (live range) ของ f– เพราะฉะนัน้ทำาให้ interference (การทับหรอืรบกวนกันของตัวแปร) ลดลง
– ซึ่งทำาให้ node ของ f ใน RIG มี neighbor ท่ีน้อยลง
คำานวณ RIG ใหมห่ลังจาก Spilling• Edge หลังจากท่ี node ท่ีทำาการ spill จะถกูกำาจดัออกจาก RIG เดิม• ตัวแปร f live range ยงัทับซอ้นกับ live range ของ c และ d• ได้ RIG ใหมท่ี่สามารถใชเ้พยีง 3 สใีนการใหส้ี RIG นี้ได้ (3-colorable)
การตัดสนิใจเก่ียวกับ Spilling
• ในบางครัง้เราอาจจะต้อง spill มากกวา่หนึ่งครัง้ก่อนท่ีจะทำา coloring จากจำานวนสท่ีีกำาหนดใหอ้ยา่งจำากัดได้
• เราสามารถเลือกท่ีจะ spill ตัวแปรตัวใดก็ได้ อัลกอรทึิมท่ีกล่าวมายงัคงทำางานได้ถกูต้อง
• แต่การเลือกท่ีดีจะชว่ยเพิม่ประสทิธภิาพของโค๊ด assembly ท่ีผลิตได้– มี heuristics ท่ีใชใ้นการเลือกต่อไปนี้:
• Spill ตัวแปรท่ีทำาใหเ้กิด interference มากท่ีสดุ ( นัน่คือมี neighbor มากท่ีสดุ)
• Spill ตัวแปรท่ีใชง้านน้อย• หลีกเล่ียงการ spill ใน inner loop
ประเด็นหลักเก่ียวกับ Register Allocation
• คอมไพเลอรใ์นปัจจุบนัทำา optimization อันน้ีทัง้นัน้– เพราะสมรรถนะท่ีแตกต่างกันมากระหวา่ง CPU กับ
memory การคำานวณท่ีเก่ียวขอ้งกับตัวแปรท่ีอยูใ่นรจีสิ เตอรจ์ะทำาได้เรว็กวา่ตัวแปรท่ีอยูใ่น memory มาก
– การผลิตโค๊ดในสไตล์ stack machine จะมสีมรรถนะตำ่ามาก เพราะมกีารโต้ตอบกับ memory มาก
• การทำา register allocation สำาหรบั CISC จะยุง่ยาก มากกวา่ RISC
– รจีสิเตอรแ์ต่ละตัวมสีิง่ท่ีพเิศษเฉพาะตัว อาจจะไมส่ามารถนำามาใสตั่วแปรบางชนิดในทกุๆกรณีได้
ลำาดับชัน้ของระบบหน่วยความจำา(Memory Hierarchy)
การจดัการหน่วยความจำาลำาดับชัน้• ภาพของหน่วยความจำาท่ีโปรแกรมเมอรเ์หน็คือท่ีเก็บขอ้มูลท่ีมตีำาแหน่งติดกันและมคีวามจุเป็นอนันต์และมปีระสทิธภิาพสงู (Virtual Memory)
• CPU OS และคอมไพเลอรจ์ะทำาหน้าท่ีจดัการลำาดับชัน้ของหน่วยความจำาเพื่อใหภ้าพในอุดมคตินัน้กับโปรแกรมเมอร์– ในโลกความเป็นจรงิลำาดับชัน้ของหน่วยความจำามคีวามจำากัดทางด้านความจุและสมรรถนะ
– CPU OS “ ” “ ” และ คอมไพเลอรจ์ะต้อง ซอ่น ขอ้จำากัดน้ีและ หลอกโปรแกรมเมอรใ์หม้องเหน็แต่ในโลกเสมอืน
• CPU จดัการในสว่นท่ีเก่ียวขอ้งกับ main memory และ cache• คอมไพเลอรจ์ดัการในสว่นการบรหิารรจีสิเตอรแ์ละการติดต่อกับ main
memory• OS จดัการในสว่นท่ีเก่ียวขอ้งกับ main memory และ disc
Cache
• คอมไพเลอรเ์ก่งเรื่องการจดัการรจีสิเตอร์• ถ้าเราต้องการใหค้อมไพเลอรช์ว่ย CPU ในการจดัการ
cache– ทำาได้ระดับหน่ึงแต่คอมไพเลอรไ์มเ่ก่งมาก– หลายๆอยา่งโปรแกรมเมอรต้์องออกมาจากโลกเสมอืนเพื่อชว่ยคอมไพเลอร์
– เป็นหน่ึงในแนวทางการวจิยัทางด้านคอมไพเลอรใ์นปัจจุบนั
การ Optimize การใช้ Cache
• พจิารณา loop ด้านล่างน้ีfor(j := 1; j < 10; j++)
for(i=1; i<10000000; i++)a[i] *= b[i]
• Loop นี้มปีระสทิธภิาพตำ่าเพราะมกีารใชง้าน cache อยา่งไมม่ปีระสทิธภิาพ
• ทกุๆการอ้างถึงค่าใน a[i] หรอื b[i] เป็นการ miss ทัง้หมด ( ใหว้า่ cache block มขีนาดเท่ากับหนึ่ง
element ของ a และ b)
การ Optimize การใช้ Cache• พจิารณาการเขยีนโปรแกรมใหมจ่ากสไลด์ที่แล้วดังน้ี:
for(i=1; i<10000000; i++)for(j := 1; j < 10; j++)a[i] *= b[i]
– ใหผ้ลลัพธเ์หมอืนกันแต่สมรรถนะของโปรแกรมน้ีสงูขึ้นมาก– การใชป้ระโยชน์จาก cache ทำาได้สงูสดุ– สมรรถนะที่เพิม่ขึ้นอาจจะมากกวา่ 10 เท่า
• Optimization ในลักษณะนี้ ( เรยีกวา่ loop interchange) คอมไพเลอรส์ามารถทำาได้– อาจจะต้องทำาในระดับ high-level IR