คลิกที่นี่

Download Report

Transcript คลิกที่นี่

บทนำเกี่ยวกับกำรปรับปรุ งโค๊ด
Introduction to Code Optimization
ภำพรวมกำรสร้ำงโค๊ด
ระดับกำรปรับปรุ งโค๊ด
ระดับกำรปรับปรุ งโค๊ด
• เราสามารถทา optimization ได้ ในหลายๆระดับ
– AST (HIR)
– LIR
– Assembly
• แต่ละระดับมีเทคนิค optimization ที่แตกต่างกันไป
• ระดับที่เหมาะสมที่สดุ คือ LIR
ระดับกำรปรับปรุ งโค๊ด
• การปรับปรุงระดับ AST
– ไม่ขึ ้นกับฮาร์ ดแวร์
– โอกาสในการปรับปรุงจากัดเนื่องจากอยูใ่ นระดับสูงเกินไป
• การปรับปรุงระดับ assembly
– ขึ ้นกับฮาร์ ดแวร์ มากไป
– ต้ องทาการปรับปรุงใหม่ทกุ ครัง้ ที่ retarget
• การปรับปรุงระดับ LIR
– ไม่ขึ ้นกับฮาร์ ดแวร์
– โอกาสในการปรับปรุงมีมาก
Basic Block (BB)
• Basic block คือจานวนชุดคาสัง่ ที่มากที่สดุ ที่เป็ นไปได้ ที่
– ไม่มี label ในชุดคาสัง่ นี ้ ยกเว้ น คาสัง่ แรกเท่านัน้
– ไม่มีคาสัง่ jump ในชุดคาสัง่ นี ้ ยกเว้ น คาสัง่ สุดท้ ายเท่านัน้
•
•
•
•
ไม่สามารถ jump ไปที่คาสัง่ ใน basic block ได้ ยกเว้ น เป็ นคาสัง่ แรก
ไม่สามารถ jump ออกจาก basic block ได้ ยกเว้ น ที่คาสัง่ สุดท้ าย
หนึง่ basic block ที่ทางเข้ าหนึ่งทางและทางออกหนึ่งทาง
ชุดคาสัง่ ใน basic block เป็ นโค๊ ดแบบ straight-line (ทางานเรี ยง
ตามลาดับที่มีมาในโค๊ ด)
ตัวอย่ำง Basic Block
• (3) ต้ องถูกประมวลผลหลัง (2) เสมอ
• สามารถเปลี่ยน (3) ให้ เป็ น w := 3 * x ได้
• แต่ไม่สามารถกาจัดคาสัง่ (2) ได้
– อาจมีสว่ นของโปรแกรมที่ไม่อยูใ่ น basic block นี ้ใช้ คา่ ของ t อีก
Control Flow Graph (CFG)
• CFG คือ directed graph ที่:
– มี basic block เป็ น node
– มี edge จาก block A ไปที่ block B ถ้ าการทางานของโปรแกรม
สามารถดาเนินจากคาสัง่ สุดท้ ายของ block A ไปถึง block B ได้
• คาสัง่ สุดท้ ายของ A เป็ นคาสัง่ jump ไปที่ label ที่เป็ นคาสัง่ แรกของ B
• คาสัง่ สุดท้ ายของ A สามารถ fall through ไปที่ B ได้
ตัวอย่ำง CFG
กำรปรับปรุ งโค๊ด
• อาจมีวตั ถุประสงค์หลักได้ หลายอย่าง
– เวลาในการรันน้ อยลง (reduce execution time)
– โค๊ ดขนาดเล็กลง
– สิ ้นเปลืองพลังงานน้ อยลง
– ใช้ หน่วยความจาน้ อยลง
• เราจะสนใจการปรับปรุงเพื่อให้ เวลาในการรันโปรแกรมน้ อยลง
• การปรับปรุงโค๊ ดจะต้ องไม่ทาให้ ผลลัพธ์ที่ได้ จากการรันจากโค๊ ดเดิม
เปลี่ยนไป
แบ่งประเภทกำรปรับปรุ งโค๊ด
• Local optimization
– Optimize ระดับ basic block แต่ละอัน
– เสมือน BB แต่ละอันเป็ นอิสระจากอันอื่นๆ
• Global optimization
– Optimize ในระดับ CFG
– เป็ นการ optimize ในระดับ procedure (หรื อ function หรื อ
method)
• Inter-procedural optimization
– Optimize ข้ าม procedure
• เราจะพูดถึงประสองประเภทแรกในชันเรี
้ ยนนี ้
Local Optimization
• เป็ นการปรับปรุงโค๊ ดที่ง่ายที่สดุ
• ทาการวิเคราะห์เฉพาะแต่ละ basic block เท่านัน้
• ตัวอย่างของการทา optimization แบบนี ้
– Algebraic simplification (การลดรูปการคานวณให้ ง่ายลง)
– Constant folding (การแทนที่ด้วยค่าคงที่)
– Common subexpression elimination (การกาจัดนิพจน์ที่
เหมือนกัน)
– Copy propagation (การแพร่ก๊อปปี ข้ องตัวแปร)
Algebraic Simplification
• Statement บางอย่างสามารถจะกาจัดทิ ้งไปได้ เลย
– x := x + 0
– x := x * 1
• Statement บางอย่างลดรูปให้ การคานวณง่ายลงได้
– x := x * 0 เป็ น x := 0
– y := sqr(y) เป็ น y := y * y
(ให้ sqr เป็ นฟั งก์ชนั่ ที่ return ผลลัพธ์เป็ นค่า input ยกกาลังสอง)
– x := x * 8 เป็ น x := x << 3
– x := x * 15 เป็ น t := x << 4; x := t – x
• การ optimize จากการคูณเป็ นการ shift อยูบ่ นพื ้นฐานที่ฮาร์ ดแวร์ การ
shift จะเร็ วกว่าฮาร์ ดแวร์ การคูณ
– ไม่เป็ นจริ งเสมอไปสาหรับฮาร์ ดแวร์ ในปั จจุบนั
Constant Folding
• การปฏิบตั ิการกี่ยวกับค่าคงที่สามารถทาการคานวณได้ ในขณะที่ทาการ
คอมไพล์โปรแกรม
– นัน่ คือสาหรับ x = y op z ใดๆ ถ้ า y และ z เป็ นค่าคงที่ เราสามารถหา
ผลลัพธ์ของ y op z ได้ ในเวลาคอมไพล์
• เช่น x = 2 + 2 เป็ น x = 4
• เช่น if (2 < 0) jump L เป็ น statement ที่สามารถกาจัดทิ ้ง
ได้ ทงหมด
ั้
Single Assignment Form
• การทา optimization บางอย่างสามารถทาได้ ง่ายขึ ้นถ้ าค่าตัวแปร
ด้ านซ้ ายมีปรากฏเพียงค่าเดียว
• ตัวอย่างการแปลงเป็ น SA Form
– เพิ่มตัวแปร b เข้ ามาใหม่
Common Subexpression Elimination
• ถ้ า
– โค๊ ดใน BB ถูกเขียนอยูใ่ น SA form
– การ assign ค่าเข้ าที่ตวั แปร x (definition of x) ในรูปแบบ x = … เป็ น
ประโยคแรกที่ตวั แปร x ปรากฏขึ ้น
• แล้ ว
– ถ้ ามีการ assign ใดมี expression ด้ านขวาที่เหมือนกันแล้ ว ผลลัพธ์ที่ได้ จะ
เหมือนกัน
• เช่น:
x=y+z
x=y+z
…
สามารถใช้ CSE แปลงให้ เป็ น …
w=y+z
w=x
Copy Propagation
• ถ้ ามีประโยค assignment w = x ใน BB ให้ แทนที่การใช้ w
ด้ วย x
– ให้ วา่ โค๊ ดใน BB อยูใ่ น SA form
• เช่น
• คุณค่าของ CP อยูท่ ี่การช่วยเปิ ดโอกาสให้ มีการทา optimization อื่นๆได้ มากขึ ้นเช่น
• Constant folding
• Dead code elimination
กำรทำ Local Optimization
• Optimization แต่ละแบบถ้ าใช้ แบบเดี่ยวแล้ วมีผลค่อนข้ างน้ อย
• แต่ optimization เหล่านี ้จะมีผลต่อกันและกัน
– การทา optimization อย่างหนึง่ จะทาให้ เกิดมีโอกาสทา
optimization อีกอย่างหนึง่
• คอมไพเลอร์ จะทาการ optimize โดยใช้ เทคนิคเหล่านี ้ไปเรื่ อยๆ
จนกระทัง่ ไม่สามารถจะ optimize โค๊ ดต่อไปได้
– คอมไพเลอร์ อาจหยุดการ optimize ณ จุดใดก็ได้ ในกรณีที่ต้องการจากัด
เวลาในการคอมไพล์โค๊ ด
ตัวอย่ำงกำรทำ Local Optimization
• เริ่ มต้ นจากส่วนของ LIR ด้ านล่าง
a := sqr(x)
b := 3
c := x
d := c * c
e := b * 2
f := a + d
g := e * f
ตัวอย่ำงกำรทำ Local Optimization
• ทา local optimization ที่เราได้ กล่าวถึงมา
–
–
–
–
Algebraic simplification
Constant folding
Common Subexpression elimination
Copy propagation
a := sqr(x)
b := 3
c := x
d := c * c
e := b * 2
f := a + d
g := e * f
a := x * x
b := 3
c := x
d := a
e := 6
f := a + a
g := 6 * f
Dead Code Elimination
• ถ้ า
– w := rhs อยู่ใน basic block
– ไม่มกี ารใช้ คา่ ของ w ในที่ไดๆเลยในโปรแกรม
• แล้ ว
– ประโยค w := rhs คือ dead code และสามารถกาจัดทิ ้งไปได้
– Dead หมายถึงไม่มีผลต่อผลลัพธ์ของโปรแกรม
• ตัวอย่างการทา DCE ถ้ าไม่มีการใช้ คา่ ของ a ณ ที่ใดๆของโปรแกรม
Dead Code Elimination
• จากตัวอย่างการทา local optimization ถ้ าเราทา DCE เพิ่ม
เราจะปรับปรุงโค๊ ดได้ เพิ่มเติมอีก
a := sqr(x)
b := 3
c := x
d := c * c
e := b * 2
f := a + d
g := e * f
a := x * x
b := 3
c := x
d := a
e := 6
f := a + a
g := 6 * f
a := x * x
f := a + a
g := 6 * f
กำรปรับปรุ งโค๊ดแบบ Global
Global Optimization
Global Optimization
• เป็ นการปรับปรุงโค๊ ดที่ขยายผ่าน basic block ไปทัง้ control
flow graph
Global Optimization
• เป็ นการปรับปรุงโค๊ ดที่ขยายผ่าน basic block ไปทัง้ control
flow graph
Global Optimization
• เป็ นการปรับปรุงโค๊ ดที่ขยายผ่าน basic block ไปทัง้ control
flow graph
ควำมถูกต้องในกำรทำ Copy Propagation
• พิจารณาสถานการณ์ตอ่ ไปนี ้:
• การทา CP โดยการแพร่ k ไปแทน x ให้ ถกู ต้ อง เราจะต้ องได้ วา่ ทุกๆ
เส้ นทาง (path) ที่จะนาไปหาประโยคที่มีการใช้ ตวั แประ x การทา
assignment ครัง้ สุดท้ ายคือ x := k
ตัวอย่ำงกำรพิจำรณำ path
ประเด็นเกี่ยวกับกำรทำ Global Optimization
• การตรวจสอบความถูกต้ องนันไม่
้ ได้ ทาได้ ง่ายๆ
• จะต้ องพิจารณาทุก path ที่เป็ นไปได้
– Path ที่เกิดจากการวน loop
– Path ที่เกิดจาก conditional branch
• ดังนันจะต้
้ องทาการวิเคราะห์ในระดับ global และวิเคราะห์ทงตั
ั้ ว
control flow graph
กำรวิเครำะห์แบบ Global
• คุณลักษณะของการทา global optimization:
– การทา optimization ขึ ้นอยู่กบั การทราบคุณสมบัติ X ของโปรแกรม ณ จุดใด
จุดหนึง่ ของการทางานของโปรแกรม
– การจะพิสจู น์คณ
ุ สมบัติ X ณ จุดใดๆ เราจะต้ องมีความรู้เกี่ยวกับโปรแกรมในส่วน
อื่นๆทังหมด
้
– การวิเคราะห์จะต้ องมีลกั ษณะ conservative ต้ องเลือกให้ ได้ อย่างใด อย่าง
หนึง่
• บอกได้ ว่า X เป็ นจริ งแน่นอน หรื อ
• ไม่ร้ ูเลยว่า X เป็ นจริ งหรื อไม่
• เทคนิคมาตรฐานที่ใช้ ในการวิเคราะห์แบบ global คือ global
dataflow analysis
Global Constant Propagation
• การทา CP โดยการแพร่ k ไปแทน x ให้ ถกู ต้ อง เราจะต้ องได้ วา่ ทุกๆ
เส้ นทาง (path) ที่จะนาไปหาประโยคที่มีการใช้ ตวั แประ x การทา
assignment ครัง้ สุดท้ ายคือ x := k
• เราจะพิจารณาการทา CP สาหรับตัวแปร x ใดๆ ในทุกๆจุดของ
โปรแกรม
– ตัวแปรอื่นๆก็จะทาซ ้าขันตอนที
้
่ทากับตัวแปร x
• พิจารณาการให้ คา่ ที่เป็ นไปได้ ของ x ในทุกๆจุดของโปรแกรม
Global Constant Propagation
ค่าที่เป็ นไปได้
ความหมาย
⊥
Statement นี ้ไม่ได้ รับการประมวลผล
C
x มีค่าเท่ากับค่าคงที่ c
⊤
ไม่ร้ ูว่า x เป็ นค่าคงที่หรื อไม่
• ⊥ อ่านว่า bottom
• ⊤ อ่านว่า top
ตัวอย่ำงกำรวิเครำะห์
กำรวิเครำะห์เพื่อทำ Constant Propagation
• เราต้ องการหาว่าในทุกๆจุดของโปรแกรม ค่า x ที่จดุ นันเป็
้ นเท่าใด
หรื อไม่สามารถจะรู้ได้ (คือหาคุณสมบัติของ x)
– อย่างลืมว่าคาว่า “รู้ได้ ” หมายถึงความรู้ที่มี ณ เวลาที่ทาการคอมไพล์
• ถ้ าเรามีความรู้ข้างต้ นแล้ ว เวลาเราพบการใช้ (การอ่านค่า x) ณ ที่ใดๆ
แล้ ว เราสามารถแทนที่ x ด้ วยค่าคงที่ได้
• ต่อไปนี ้เราจะกล่าวถึงวิธีการเคราะห์ในการหาคุณสมบัติ
(properties) ของ x ในทุกๆจุดของโปรแกรม
แนวคิดหลักในกำรวิเครำะห์
The analysis of a complicated program can be expressed as a
combination of simple rules relating the change in
information between adjacent statements
การวิเคราะห์โปรแกรมไม่วา่ จะซับซ้ อนเพียงใด สามารถทาได้ โดยการใช้ กฏง่ายๆที่
พูดถึงการเปลี่ยนแปลงของคุณลักษณะในระดับคาสัง่ ที่อยูต่ ิดกัน โดยกฏดังกล่าวจะ
พูดถึงความสัมพันธ์ระหว่างคุณลักษณะก่อนและหลังคาสัง่ นันๆ
้
กำรวิเครำะห์โปรแกรม
• สาหรับทุกๆคาสัง่ s ในระดับ LIR เราจะคานวณหาคุณสมบัติของ x ก่อน
และหลัง s
– ให้ C(s,x,in) = ค่าของ x ก่อน s
– ให้ C(s,x,out) = ค่าของ x หลัง s
• ข้ อมูลคุณลักษณะของ x จะถูกส่งผ่าน (transfer) จากคาสัง่ หนึ่งไปอีก
คาสัง่ หนึ่ง
• เราจะให้ นิยาม transfer function เพื่อบอกความสัมพันธ์ของ
C(s, x, in) กับ C(s, x, out)
– นิยามด้ วยกฏที่จะได้ กล่าวถึงต่อไปนี ้โดยให้ s มีคาสัง่ ที่มาก่อนหน้ าคือ p1 … pn
กฏที่ 1
กฏที่ 2
กฏที่ 3
กฏที่ 4
กฏที่เหลือ
• ที่ผา่ นมากฏที่ 1-4 บอกความสัมพันธ์จาก out ของคาสัง่ อื่นๆที่มา
ก่อนหน้ ามาสู่ in ของคาสัง่ ที่กาลังพิจารณา
• กฏที่เหลือจะพูดถึงความสัมพันธ์จาก in ของคาสัง่ หนึง่ ไปสู่ out ของ
คาสัง่ เดียวกัน
กฏที่ 5
กฏที่ 6
กฏที่ 7
กฏที่ 8
อัลกอริ ทึมในกำรวิเครำะห์
1. ณ ตาแหน่งที่ s เป็ นจุดที่เป็ น entry point ของฟั งก์ชนั่ หรื อ
โปรแกรม ให้ คา่ C(s, x, in) = ⊤
2. ให้ C(s, x, in) = C(s, x, out) = ⊥ ณ ตาแหน่งอื่นๆของ
โปรแกรม
3. ทาซ ้าจนกว่าทุกๆจุดจะเป็ นไปตามกฏทัง้ 8 ที่กล่าวมาและไม่สามารถ
จะใช้ กฏใดๆเพิ่มเติมได้ อีก
– ค่อยๆไล่คาสัง่ s ที่ละคาสัง่ ที่คณ
ุ ลักษณะก่อนและหลังยังไม่เป็ นไปตามกฏ
ทัง้ 8
ตัวอย่ำงกำรวิเครำะห์
ทำไมต้องมี Bottom
• พิจารณาโปรแกรมที่มี loop ดังต่อไปนี ้
สิ่ งที่ตอ้ งพิจำรณำ
• พิจารณาคาสัง่ Y := 0
– ถ้ าจะรุ้วา่ X เป็ นค่าคงที่หรื อไม่ เราจะต้ องรู้วา่ ทางที่จะเข้ ามาสู่ in ของคาสัง่ นี ้นัน้ x
เป็ นค่าคงที่หรื อไม่
– คาสัง่ นี ้มีทางที่จะเข้ าสูต่ วั มันอยูส่ องทางจากสองคาสัง่
• X := 3
• A := 2 * X
• แต่ข้อมูลจากคาสัง่ A := 2 * X จะได้ ก็ตอ่ เมื่อเรารู้คณ
ุ ลักษณะก่อนและ
หลังคาสัง่ Y := 0 อย่างถ่องแท้
• เราจะแก้ การขึ ้นต่อกันวงกลม (circular dependency) นี ้ได้ อย่างไร
กำรแก้ Circular Dependency
• ทุกๆจุดใน cycle ทุกๆจุดจะต้ องมีคา่ ที่แน่นอนในทุกๆเวลา
• ในการกาจัด cycle เพื่อจะแก้ circular dependency ทาได้
โดยการให้ คา่ เริ่มต้ น
• ค่าเริ่มต้ นที่เราจะให้ ก็คือค่า bottom
– เป็ นค่าที่เหมาะสมเพราะเริ่มต้ นจากการบอกว่า “ยังไม่มีการทางานมาถึง
คาสัง่ นี ้”
ตัวอย่ำงกำรวิเครำะห์ที่มี loop
ตัวอย่ำงกำรวิเครำะห์ที่มี loop
ตัวอย่ำงกำรวิเครำะห์ที่มี loop