ภาคการผลิต พิชิตป ญหา ด านกระบวนการ ด วSiยxSigma · ของเสียได้ในระดับ Six Sigma
Introduction to Code Optimization - Kasetsart Universityparuj/204433/optimization.pdf · Local...
Transcript of Introduction to Code Optimization - Kasetsart Universityparuj/204433/optimization.pdf · Local...
บทนำเกี่ยวกับการปรับปรุงโค๊ด
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
a := sqr(x) b := 3 c := x d := c * c e := b * 2 f := a + d g := e * f
• เริ่มต้นจากส่วนของ LIR ด้านล่าง
ตัวอย่างการทำ Local Optimization
a := sqr(x) b := 3 c := x d := c * c e := b * 2 f := a + d g := e * f
• ทำ local optimization ที่เราได้กล่าวถึงมา – Algebraic simplification – Constant folding – Common Subexpression elimination – Copy propagation
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