18
Register Spilling กกกกกกกกกกกกกกกกกกก

Register Spilling

  • 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

Page 1: Register  Spilling

Register Spilling

การล้นจากรจีสิเตอร์

Page 2: Register  Spilling

Spilling (การล้นจากรจีสิเตอร)์

• เกิดอะไรขึ้นถ้าทกุๆ node มี neighbor มากกวา่ k• ตัวอยา่งเชน่ถ้าเราต้องการทำา 3-coloring ของ RIG ด้านล่างน้ี

Page 3: Register  Spilling

Spilling (การล้นจากรจีสิเตอร)์

• ถ้าเราลบ node หนึ่งออกไปตามขัน้ตอนheuristics เราจะไปต่อไปได้ดังแสดงด้วยรูป RIG ใหม่ต้านล่าง

• ในกรณีนี้เราจะทำาการเลือก node ท่ีจะ spill– ตัวแปรท่ีถกู spill “ไปจะไป lives” ในหน่วยความจำาหลักแทน– ใหว้า่เราเลือก f ท่ีจะต้องถกู spill ไปท่ีหน่วยความจำาหลัก

Page 4: Register  Spilling

Spilling (การล้นจากรจีสิเตอร)์

• หลังจากท่ีเรา spill f แล้ว เราสามารถกลับไปใช้heuristic ได้เหมอืนเดิม ( ดจูากภาพ RIG ด้านล่าง)

Page 5: Register  Spilling

Spilling (การล้นจากรจีสิเตอร)์

• ในท้ายท่ีสดุเราก็จะต้องใหค่้าสกัีบ f โดยความ คาดหวงัของเราก็คือจาก neighbor ทัง้ 4 ของ f

นัน้ บางทีอาจจะมสีท่ีีใชแ้ตกต่างกัน น้อยกวา่ 3 สีก็เป็นได้

Page 6: Register  Spilling

Spilling

• ในกรณีนี้ไมเ่ป็นเชน่ท่ีเราคาดหวงั– เราจะต้องทำาการจองตำาแหน่งในหน่วยความจำาหลักใหกั้บ f• สว่นใหญ่ใชพ้ื้นท่ีบน stack และจดัใหอ้ยูใ่น AR• เรยีกตำาแหน่งนี้วา่ fa

• ในกรณีท่ีมกีารใช้ f ใหเ้พิม่คำาสัง่ load เพื่อนำาขอ้มูลเขา้เขา้ มาท่ี f

f := load fa• ในกรณีท่ีมกีาร assign ค่าให้ f ( การ write ไปท่ี f) ใหใ้สค่ำา

สัง่ store ต่อไปน้ีstore f, fa

Page 7: Register  Spilling

ตัวอยา่ง Spilling

• โค๊ดใหมห่ลังจากการ spill ตัวแปร f

Page 8: Register  Spilling

ค่า Liveness เดิม

Page 9: Register  Spilling

คำานวณ Liveness ใหม่

Page 10: Register  Spilling

คำานวณ Liveness ใหม่• ขอ้มูล liveness ท่ีคำานวณได้ใหมม่คีวามใกล้เคียงกับ

liveness เดิมมาก ( สำาหรบั CFG ท่ีไมม่กีาร spill)• f จะ live ในชว่งต่อไปนี้– ระหวา่ง f := load fa และคำาสัง่ท่ีอยูถั่ดไป– ระหวา่ง f := load fa และคำาสัง่ท่ีอยูก่่อนหน้านี้

• การทำา spilling ลดชว่งชวีติ (live range) ของ f– เพราะฉะนัน้ทำาให้ interference (การทับหรอืรบกวนกันของตัวแปร) ลดลง

– ซึ่งทำาให้ node ของ f ใน RIG มี neighbor ท่ีน้อยลง

Page 11: Register  Spilling

คำานวณ RIG ใหมห่ลังจาก Spilling• Edge หลังจากท่ี node ท่ีทำาการ spill จะถกูกำาจดัออกจาก RIG เดิม• ตัวแปร f live range ยงัทับซอ้นกับ live range ของ c และ d• ได้ RIG ใหมท่ี่สามารถใชเ้พยีง 3 สใีนการใหส้ี RIG นี้ได้ (3-colorable)

Page 12: Register  Spilling

การตัดสนิใจเก่ียวกับ Spilling

• ในบางครัง้เราอาจจะต้อง spill มากกวา่หนึ่งครัง้ก่อนท่ีจะทำา coloring จากจำานวนสท่ีีกำาหนดใหอ้ยา่งจำากัดได้

• เราสามารถเลือกท่ีจะ spill ตัวแปรตัวใดก็ได้ อัลกอรทึิมท่ีกล่าวมายงัคงทำางานได้ถกูต้อง

• แต่การเลือกท่ีดีจะชว่ยเพิม่ประสทิธภิาพของโค๊ด assembly ท่ีผลิตได้– มี heuristics ท่ีใชใ้นการเลือกต่อไปนี้:

• Spill ตัวแปรท่ีทำาใหเ้กิด interference มากท่ีสดุ ( นัน่คือมี neighbor มากท่ีสดุ)

• Spill ตัวแปรท่ีใชง้านน้อย• หลีกเล่ียงการ spill ใน inner loop

Page 13: Register  Spilling

ประเด็นหลักเก่ียวกับ Register Allocation

• คอมไพเลอรใ์นปัจจุบนัทำา optimization อันน้ีทัง้นัน้– เพราะสมรรถนะท่ีแตกต่างกันมากระหวา่ง CPU กับ

memory การคำานวณท่ีเก่ียวขอ้งกับตัวแปรท่ีอยูใ่นรจีสิ เตอรจ์ะทำาได้เรว็กวา่ตัวแปรท่ีอยูใ่น memory มาก

– การผลิตโค๊ดในสไตล์ stack machine จะมสีมรรถนะตำ่ามาก เพราะมกีารโต้ตอบกับ memory มาก

• การทำา register allocation สำาหรบั CISC จะยุง่ยาก มากกวา่ RISC

– รจีสิเตอรแ์ต่ละตัวมสีิง่ท่ีพเิศษเฉพาะตัว อาจจะไมส่ามารถนำามาใสตั่วแปรบางชนิดในทกุๆกรณีได้

Page 14: Register  Spilling

ลำาดับชัน้ของระบบหน่วยความจำา(Memory Hierarchy)

Page 15: Register  Spilling

การจดัการหน่วยความจำาลำาดับชัน้• ภาพของหน่วยความจำาท่ีโปรแกรมเมอรเ์หน็คือท่ีเก็บขอ้มูลท่ีมตีำาแหน่งติดกันและมคีวามจุเป็นอนันต์และมปีระสทิธภิาพสงู (Virtual Memory)

• CPU OS และคอมไพเลอรจ์ะทำาหน้าท่ีจดัการลำาดับชัน้ของหน่วยความจำาเพื่อใหภ้าพในอุดมคตินัน้กับโปรแกรมเมอร์– ในโลกความเป็นจรงิลำาดับชัน้ของหน่วยความจำามคีวามจำากัดทางด้านความจุและสมรรถนะ

– CPU OS “ ” “ ” และ คอมไพเลอรจ์ะต้อง ซอ่น ขอ้จำากัดน้ีและ หลอกโปรแกรมเมอรใ์หม้องเหน็แต่ในโลกเสมอืน

• CPU จดัการในสว่นท่ีเก่ียวขอ้งกับ main memory และ cache• คอมไพเลอรจ์ดัการในสว่นการบรหิารรจีสิเตอรแ์ละการติดต่อกับ main

memory• OS จดัการในสว่นท่ีเก่ียวขอ้งกับ main memory และ disc

Page 16: Register  Spilling

Cache

• คอมไพเลอรเ์ก่งเรื่องการจดัการรจีสิเตอร์• ถ้าเราต้องการใหค้อมไพเลอรช์ว่ย CPU ในการจดัการ

cache– ทำาได้ระดับหน่ึงแต่คอมไพเลอรไ์มเ่ก่งมาก– หลายๆอยา่งโปรแกรมเมอรต้์องออกมาจากโลกเสมอืนเพื่อชว่ยคอมไพเลอร์

– เป็นหน่ึงในแนวทางการวจิยัทางด้านคอมไพเลอรใ์นปัจจุบนั

Page 17: Register  Spilling

การ 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)

Page 18: Register  Spilling

การ 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