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