กลับไปหน้าบทความ

อ่าน 3 นาที

การเพิ่มประสิทธิภาพลูป

ใน ทฤษฎีคอมไพเลอร์ การ เพิ่มประสิทธิภาพลูป คือกระบวนการเพิ่มความเร็วในการประมวลผลและลดค่าใช้จ่ายที่เกี่ยวข้องกับ ลูป มันมีบทบาทสำคัญในการปรับปรุง ประสิทธิภาพ ของแคช...

การเพิ่มประสิทธิภาพลูป

ในทฤษฎีคอมไพเลอร์การเพิ่มประสิทธิภาพลูปคือกระบวนการเพิ่มความเร็วในการประมวลผลและลดค่าใช้จ่ายที่เกี่ยวข้องกับลูปมันมีบทบาทสำคัญในการปรับปรุง ประสิทธิภาพ ของแคชและใช้ประโยชน์จาก ความสามารถ ในการประมวลผลแบบขนานได้ อย่างมีประสิทธิภาพ เวลาส่วนใหญ่ใน การประมวลผล โปรแกรมทางวิทยาศาสตร์ใช้ไปกับลูป ดังนั้นจึงมีการพัฒนาเทคนิค การเพิ่มประสิทธิภาพคอมไพเลอร์ มากมายเพื่อทำให้ลูปทำงานได้เร็วขึ้น

การแสดงถึงการคำนวณและการแปลง

เนื่องจากคำสั่งภายในลูปสามารถดำเนินการซ้ำได้ จึงมักไม่สามารถกำหนดขอบเขตของจำนวนการดำเนินการคำสั่งที่จะได้รับผลกระทบจากการเพิ่มประสิทธิภาพลูปได้ ซึ่งก่อให้เกิดความท้าทายในการให้เหตุผลเกี่ยวกับความถูกต้องและประโยชน์ของการเพิ่มประสิทธิภาพลูป โดยเฉพาะอย่างยิ่งการแสดงการคำนวณที่ได้รับการเพิ่มประสิทธิภาพและการเพิ่มประสิทธิภาพที่กำลังดำเนินการอยู่[ 1 ]

การปรับให้เหมาะสมผ่านลำดับของการแปลงแบบวนซ้ำ

การเพิ่มประสิทธิภาพลูปสามารถมองได้ว่าเป็นการประยุกต์ใช้ลำดับของการแปลงลูป เฉพาะ (แสดงไว้ด้านล่างหรือในการแปลงคอมไพเลอร์สำหรับการคำนวณประสิทธิภาพสูง[ 2 ] ) กับซอร์สโค้ดหรือการแสดงผลระดับกลางโดยการแปลง แต่ละครั้ง จะมีการทดสอบความถูกต้องตามกฎหมายที่เกี่ยวข้อง การแปลง (หรือลำดับของการแปลง) โดยทั่วไปต้องรักษาลำดับเวลาของการพึ่งพาอาศัย กันทั้งหมด หากต้องการรักษาผลลัพธ์ของโปรแกรม (กล่าวคือ เป็นการแปลงที่ถูกต้องตามกฎหมาย) การประเมินประโยชน์ของการแปลงหรือลำดับของการแปลงอาจทำได้ค่อนข้างยากในแนวทางนี้ เนื่องจากการประยุกต์ใช้การแปลงที่เป็นประโยชน์อย่างหนึ่งอาจต้องใช้การแปลงอื่น ๆ หนึ่งอย่างหรือมากกว่านั้นก่อนหน้านี้ ซึ่งการแปลงเหล่านั้นเองจะส่งผลให้ประสิทธิภาพลดลง

การแปลงลูปทั่วไป ได้แก่:

  • การแบ่งแยกหรือการกระจายลูป – การแบ่งแยกลูปพยายามแบ่งลูปออกเป็นหลายลูปในช่วงดัชนีเดียวกัน แต่ละลูปใหม่จะใช้เพียงส่วนหนึ่งของเนื้อหาลูปเดิมเท่านั้น ซึ่งสามารถปรับปรุงความเฉพาะที่ของการอ้างอิงได้ทั้งในส่วนของข้อมูลที่ถูกเข้าถึงในลูปและโค้ดภายในเนื้อหาของลูป
  • การผสานหรือการรวมกัน – วิธีนี้จะรวมเนื้อหาของลูปสองลูปที่อยู่ติดกัน ซึ่งจะวนซ้ำจำนวนครั้งเท่ากัน (ไม่ว่าจำนวนครั้งนั้นจะทราบหรือไม่ก็ตามในระหว่างการคอมไพล์) ตราบใดที่ลูปทั้งสองไม่อ้างอิงถึงข้อมูลของกันและกัน
  • การสลับตำแหน่งหรือการเรียงสับเปลี่ยน – การปรับปรุงเหล่านี้จะสลับลูปภายในกับลูปภายนอก เมื่อตัวแปรในลูปอ้างอิงถึงอาร์เรย์ การแปลงดังกล่าวสามารถปรับปรุงการเข้าถึงข้อมูลได้ ขึ้นอยู่กับโครงสร้างของอาร์เรย์
  • การกลับด้าน (Inversion ) – เทคนิคนี้เปลี่ยน ลูป while มาตรฐาน ให้เป็น ลูป do/while (หรือrepeat/until ) ที่ห่อหุ้มด้วย เงื่อนไข ifซึ่งช่วยลดจำนวนการกระโดดลงสองครั้งสำหรับกรณีที่ลูปทำงาน การทำเช่นนี้จะทำซ้ำการตรวจสอบเงื่อนไข (ทำให้ขนาดของโค้ดเพิ่มขึ้น) แต่มีประสิทธิภาพมากกว่าเนื่องจากการกระโดดมักทำให้เกิดการหยุดชะงักของไปป์ไลน์นอกจากนี้ หากทราบเงื่อนไขเริ่มต้นในระหว่างการคอมไพล์และทราบว่า ไม่มี ผลข้างเคียง ก็ สามารถข้ามการตรวจสอบเงื่อนไขifในตอนเริ่มต้นได้
  • การย้ายโค้ดที่ไม่เปลี่ยนแปลงในลูป – เทคนิคนี้สามารถเพิ่มประสิทธิภาพได้อย่างมาก โดยการย้ายการคำนวณจากภายในลูปไปอยู่ภายนอกลูป โดยคำนวณค่าเพียงครั้งเดียวก่อนเริ่มลูป หากผลลัพธ์ของการคำนวณนั้นเท่ากันทุกรอบการวนซ้ำ (กล่าวคือ เป็นค่าที่ไม่เปลี่ยนแปลงในลูป) เทคนิคนี้มีความสำคัญอย่างยิ่งสำหรับนิพจน์การคำนวณที่อยู่ซึ่งสร้างขึ้นโดยลูปที่ทำงานกับอาร์เรย์ สำหรับการใช้งานที่ถูกต้อง เทคนิคนี้ต้องใช้ร่วมกับการกลับด้าน เนื่องจากไม่ใช่ทุกโค้ดที่จะปลอดภัยหากย้ายไปอยู่ภายนอกลูป
  • การประมวลผลแบบขนาน – นี่คือกรณีพิเศษของการประมวลผลแบบขนานอัตโนมัติโดยเน้นที่ลูปและการปรับโครงสร้างลูปเพื่อให้ทำงานได้อย่างมีประสิทธิภาพบนระบบมัลติโปรเซสเซอร์ สามารถทำได้โดยอัตโนมัติด้วยคอมไพเลอร์ ( การประมวลผลแบบขนานอัตโนมัติ ) หรือทำด้วยตนเอง (การแทรกคำสั่งแบบขนาน เช่นOpenMP )
  • การกลับทิศทาง – การเพิ่มประสิทธิภาพอย่างละเอียดอ่อนที่กลับลำดับการกำหนดค่าให้กับตัวแปรดัชนี ซึ่งสามารถช่วยขจัดความสัมพันธ์และทำให้สามารถเพิ่มประสิทธิภาพอื่นๆ ได้ สถาปัตยกรรมบางอย่างใช้โครงสร้างการวนซ้ำใน ระดับ แอสเซมบลีที่นับในทิศทางเดียวเท่านั้น (เช่น ลด-กระโดด-ถ้าไม่ใช่ศูนย์ [DJNZ] [ 3 ] )
  • การจัดตารางเวลา – วิธีนี้จะแบ่งลูปออกเป็นหลายส่วน ซึ่งสามารถทำงานพร้อมกันบนโปรเซสเซอร์หลายตัวได้
  • การเบี่ยงเบน (Skewing) – เทคนิคนี้ใช้กับลูปซ้อนกันที่วนซ้ำในอาร์เรย์หลายมิติ โดยแต่ละรอบของการวนซ้ำภายในจะขึ้นอยู่กับรอบก่อนหน้า และจัดเรียงการเข้าถึงอาร์เรย์ใหม่เพื่อให้การพึ่งพาเกิดขึ้นเฉพาะระหว่างรอบของการวนซ้ำภายนอกเท่านั้น
  • การประมวลผล แบบไปป์ไลน์ในซอฟต์แวร์ – รูปแบบหนึ่ง ของการประมวลผลลูปแบบ ไม่เรียงลำดับเพื่อซ่อนความล่าช้าของหน่วยประมวลผล
  • การแยกหรือแบ่งลูป – วิธีนี้พยายามทำให้ลูปง่ายขึ้นหรือกำจัดความสัมพันธ์ระหว่างลูปโดยการแบ่งลูปออกเป็นหลายลูปที่มีเนื้อหาเหมือนกัน แต่ทำงานวนซ้ำในส่วนต่างๆ ของช่วงดัชนี กรณีพิเศษคือ การแยกส่วนลูป (loop peeling ) ซึ่งสามารถทำให้ลูปที่มีการวนซ้ำครั้งแรกที่มีปัญหาทำได้ง่ายขึ้นโดยการทำงานวนซ้ำนั้นแยกต่างหากก่อนที่จะเข้าสู่ลูป
  • การแบ่งข้อมูลเป็นบล็อก (Tiling or blocking) – จัดระเบียบวงวนใหม่เพื่อให้วนซ้ำไปตามบล็อกข้อมูลที่มีขนาดพอดีกับแคช
  • การประมวลผลแบบเวกเตอร์ (Vectorization) – พยายามเรียกใช้การวนซ้ำของลูปให้ได้มากที่สุดเท่าที่จะเป็นไปได้ในเวลาเดียวกันบนระบบSIMD
  • การคลายลูป (Unrolling ) – คือการทำซ้ำส่วนของลูปหลายๆ ครั้ง เพื่อลดจำนวนครั้งที่ตรวจสอบเงื่อนไขของลูปและจำนวนการกระโดด ซึ่งอาจทำให้ประสิทธิภาพลดลงโดยไปรบกวนไปป์ไลน์คำสั่ง การคลายลูปอย่างสมบูรณ์จะช่วยลดค่าใช้จ่ายส่วนเกินทั้งหมด (ยกเว้นการดึงคำสั่งหลายครั้งและเวลาในการโหลดโปรแกรมที่เพิ่มขึ้น) แต่จำเป็นต้องทราบจำนวนรอบการทำซ้ำในระหว่างการคอมไพล์ (ยกเว้นในกรณีของการคอมไพล์แบบ Just-in-time ) นอกจากนี้ยังต้องระมัดระวังเพื่อให้แน่ใจว่าการคำนวณซ้ำหลายครั้งของตัวแปรที่มีดัชนีจะไม่ก่อให้เกิดค่าใช้จ่ายส่วนเกินมากกว่าการเลื่อนตัวชี้ภายในลูปเดิม
  • การยกเลิกการสลับ – ย้ายเงื่อนไขจากภายในลูปไปไว้ภายนอกลูป โดยการคัดลอกเนื้อหาของลูป และวางไว้ในแต่ละส่วนของ คำสั่ง ifและelseของเงื่อนไขนั้น
  • การแบ่งส่วนหรือการขุดแบบแถบ – นำมาใช้สำหรับโปรเซสเซอร์เวกเตอร์การแบ่งส่วนลูปเป็นเทคนิคการแปลงลูปเพื่อเปิดใช้งาน การเข้ารหัส SIMD (คำสั่งเดียว ข้อมูลหลายรายการ) ของลูปและปรับปรุงประสิทธิภาพหน่วยความจำ ซึ่งเกี่ยวข้องกับการดำเนินการเวกเตอร์แต่ละครั้งที่ทำในขนาดที่น้อยกว่าหรือเท่ากับความยาวเวกเตอร์สูงสุดบนเครื่องเวกเตอร์ที่กำหนด[ 4 ] [ 5 ]

กรอบการแปลงแบบโมดูลาร์เดียว

แนวทางการแปลงแบบยูนิโมดูลาร์[ 6 ] ใช้ เมทริกซ์ยูนิโมดูลาร์เดียวเพื่ออธิบายผลลัพธ์รวมของลำดับการแปลงข้างต้นจำนวนมาก หัวใจสำคัญของแนวทางนี้คือมุมมองของเซตของการดำเนินการทั้งหมดของคำสั่งภายใน ลูป nลูปในฐานะเซตของจุดจำนวนเต็มใน พื้นที่ nมิติ โดยที่จุดต่างๆ จะถูกดำเนินการตามลำดับพจนานุกรมตัวอย่างเช่น การดำเนินการของคำสั่งที่ซ้อนอยู่ภายในลูปภายนอกที่มีดัชนีiและลูปภายในที่มีดัชนีjสามารถเชื่อมโยงกับคู่ของจำนวนเต็มได้การประยุกต์ใช้การแปลงแบบยูนิโมดูลาร์สอดคล้องกับการคูณจุดภายในพื้นที่นี้ด้วยเมทริกซ์ ตัวอย่างเช่น การสลับลูปสองลูปสอดคล้องกับเมทริกซ์

การแปลงแบบยูนิโมดูลาร์นั้นถูกต้องตามกฎหมายหากรักษาลำดับเวลาของการพึ่งพาอาศัย กันทั้งหมด ไว้ได้ อย่างไรก็ตาม การวัดผลกระทบต่อประสิทธิภาพของการแปลงแบบยูนิโมดูลาร์นั้นทำได้ยากกว่า ลูปที่ซ้อนกันไม่สมบูรณ์และการแปลงบางอย่าง (เช่น การเรียงต่อกัน) ไม่เหมาะสมกับกรอบนี้โดยง่าย

กรอบรูปทรงหลายเหลี่ยมหรือกรอบที่อิงตามข้อจำกัด

แบบจำลองโพลีเฮดรัล[ 7 ]จัดการกับคลาสของโปรแกรมและการแปลงที่กว้างกว่ากรอบงานยูนิโมดูลาร์ ชุดของการดำเนินการของชุดคำสั่งภายในชุดลูปที่อาจซ้อนกันไม่สมบูรณ์นั้นถือเป็นการรวมกันของชุดโพลีโทปที่แสดงถึงการดำเนินการของคำสั่งการแปลงเชิงเส้นจะถูกนำไปใช้กับโพลีโทปเหล่านี้ ทำให้เกิดคำอธิบายของลำดับการดำเนินการใหม่ ขอบเขตของโพลีโทป การพึ่งพาข้อมูล และการแปลงมักจะถูกอธิบายโดยใช้ระบบข้อจำกัด และวิธีการนี้มักถูกเรียกว่า วิธีการเพิ่มประสิทธิภาพลูปแบบ อิงข้อจำกัดตัวอย่างเช่น คำสั่งเดียวภายในลูปภายนอก ' for i := 0 to n ' และลูปภายใน ' for j := 0 to i+2 ' จะถูกดำเนินการหนึ่งครั้งสำหรับแต่ละ คู่ (i, j)โดยที่0 <= i <= n และ 0 <= j <= i+ 2

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

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Loop_optimization&oldid=1217570678 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การเพิ่มประสิทธิภาพลูป

ใน ทฤษฎีคอมไพเลอร์ การ เพิ่มประสิทธิภาพลูป คือกระบวนการเพิ่มความเร็วในการประมวลผลและลดค่าใช้จ่ายที่เกี่ยวข้องกับ ลูป มันมีบทบาทสำคัญในการปรับปรุง ประสิทธิภาพ ของแคช...

การแสดงถึงการคำนวณและการแปลง

เนื่องจากคำสั่งภายในลูปสามารถดำเนินการซ้ำได้ จึงมักไม่สามารถกำหนดขอบเขตของจำนวนการดำเนินการคำสั่งที่จะได้รับผลกระทบจากการเพิ่มประสิทธิภาพลูปได้ ซึ่งก่อให้เกิดความท้าทายในการให้เหตุผลเกี่ยวกับความถูกต้องและประโยชน์ของการเพิ่มประสิทธิภาพลูป...

การปรับให้เหมาะสมผ่านลำดับของการแปลงแบบวนซ้ำ

การเพิ่มประสิทธิภาพลูปสามารถมองได้ว่าเป็นการประยุกต์ใช้ลำดับของ การแปลงลูป เฉพาะ (แสดงไว้ด้านล่างหรือใน การแปลงคอมไพเลอร์สำหรับการคำนวณประสิทธิภาพสูง [ 2 ] ) กับซอร์สโค้ดหรือ การแสดงผลระดับกลาง โดย การแปลง แต่ละครั้ง...

กรอบการแปลงแบบโมดูลาร์เดียว

แนวทางการแปลงแบบยูนิโมดูลาร์ [ 6 ] ใช้ เมทริกซ์ยูนิโมดูลาร์ เดียวเพื่ออธิบายผลลัพธ์รวมของลำดับการแปลงข้างต้นจำนวนมาก หัวใจสำคัญของแนวทางนี้คือมุมมองของเซตของการดำเนินการทั้งหมดของคำสั่งภายใน ลูป n ลูปในฐานะเซตของจุดจำนวนเต็มใน พื้นที่ n มิติ โดยที่จุดต่างๆ...