ค้นหาบล็อกนี้

วันอาทิตย์ที่ 14 สิงหาคม พ.ศ. 2554

Pipeline

Pipeline คือ เทคนิคทำให้คำสั่งหลายๆ คำสั่งทำงานพร้อมๆ กัน แต่ละส่วนจะทำงานให้เสร็จในส่วนของมัน แต่ละส่วนจะทำงานต่างกัน แต่ละส่วนเรียกว่า "Pipe Stage" และแต่ละส่วนจะทำงานต่อเนื่องเป็นทอด ๆ เขาเลยเปรียบเทียบ pipeline กับสายพานเครื่องจักรไงครับ เวลาที่ใช้เคลื่อนที่จากส่วนหนึ่ง (Pipe Stage) ไปยังอีกส่วนหนึ่ง เราเรียกว่า "Machine Cycle" เนืองจากทุกๆ ส่วนทำงานพร้อมกันดังนั้น ค่า Machine Cycle จะดูจากเวลาที่ใช้ใน Pipe Stage ที่ช้าที่สุด

เป้าหมายสูงสุดของ Pipeline ก็คือ ต้องการให้ความยาวของ Pipeline แต่ละขั้นตอนเกิดความสมดุล ถ้าขั้นตอนแต่ละขั้นตอนสมดุลกันแล้วเวลาที่ใช้ต่อ 1 คําสั่งใน Pipeline จะเท่ากับการใช้ Pipeline จะส่งผลทําให้เวลาการทํางานต่อคําสั่ง 1 คําสั่งลดลง

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

จริงๆ มันก็คือ การออกแบบขั้นตอนการประมวลต่อ 1 คำสั่งให้ใช้เวลาน้อยที่สุดอ่ะครับ จะได้ไม่เปลือง Clock และถ้ามีหลายๆ Pipeline มันก็จะช่วยประมวลผลพร้อมๆ กัน ทำให้เพิ่มความเร็วในการประมวลได้ครับ ไม่จำเป็นต้องเพิ่มความถี่สัญญาณนาฬิกา (Clock) ให้สูงเสมอไป

pipeline จะแบ่งการทำงาน 1 งาน ออกเป็นงานย่อยแล้วทำพร้อมๆกัน เช่นการทำงานของ CPU แบ่งเป็นสมมติว่าแบ่งเป็น 5 ขั้นตอน
1. อ่านคำสั่ง
2. แปลคำสั่ง
3. ประมวลผล
4. อ่านข้อมูลจากหน่วยความจำ
5. เขียนค่ากลับไปยังรีจิสเตอร์
พออ่านคำสั่งที่ไปแล้วก็จะเริ่มแปลคำสั่งในขณะที่แปลคำสั่งก็อ่านคำสั่งต่อไปเลย (เหมือนที่คุณ PSNR อธิบายแหละ) สมมติว่าแต่ละงานใช้เวลาอย่างละ 1 วินาที ถ้าทำทีละอย่าง 1 คำสั่งจะใช้เวลา 5 วินาที แต่พอใช้ pipeline จะทำให้โดยรวมแล้ว(ไม่นับ 4 วินาทีแรก) ทำได้ 1 คำสั่งใน 1 วินาที ทีนี้มันมีปัญหาตรงที่ว่าการทำงานแต่ละงานบางครั้ง(จริงๆแล้วส่วนใหญ่)มันไม่ได้ทำคำสั่งตามลำดับ 1 2 3 .. เช่นการเขียนโปรแกรมโดยใช้เงื่อนไข IF คือพอ pipeline ประมวลผลเสร็จสรุปได้ว่าต้องกระโดดไปทำงานที่คำสั่งอื่น แต่ว่าไอ้คำสั่งที่มันอ่านเข้ามาแล้วมันเป็นคำสั่งถัดไปซึ่งไม่ใช่คำสั่งที่ต้องการ (เพราะตอนที่อ่านเข้ามามันยังไม่รู้เลยว่าจะต้องกระโดดไปเนื่องจากคำสั่ง IF ที่เป็นเงื่อนไขยังทำงานไม่เสร็จ) ทีนี้จะแก้ยังไงดี ก็แก้โดยการล้างท่อทิ้ง แล้วเริ่มอ่านคำสั่งที่ถูกต้อง(ที่จะใช้งาน) เข้ามาแทน ซึ่งจะทำให้เสียเวลามากขึ้นเพราะต้องไปเริ่มกระบวนการใหม่ (คือเริ่มตั้งแต่ 1 อ่านคำสั่ง สรุปแล้วจะมี 5 วินาทีที่ทำได้แค่คำสั่งเดียวเกิดขึ้นอีกครั้ง) ถ้ามีคำสั่งที่เป็นเงื่อนไขมากๆ การทำงานของ pipeline ก็จะลดประสิทธิภาพลงเพราะต้องกลับไปเริ่มกระบวนการใหม่ตั้งแต่ขั้นตอนที่ 1 มากขึ้น ก็เลยมีการแก้ปัญหานี้โดยการเพิ่มจำนวน pipeline ให้มากขึ้น เพื่อให้แต่ละ pipeline เดาว่าคำสั่งถัดไปมันน่าจะเป็นคำสั่งอะไรดีแล้วอ่านเข้ามาถ้าโชคดีก็จะมี pipeline สักอันนึงที่เดาถูกว่าคำสั่งถัดไปเป็นอะไร แล้วก็ใช้ผลจาก pipeline ที่เดาถูกอันนั้น แต่ถ้าโชคร้ายไม่มีอันไหนเดาถูกเลยต้องล้างท่อทิ้งทั้งหมดอยู่ดี

ดังนั้นการมีหลาย pipeline จึงไม่ได้ช่วยกันทำงานพร้อมๆ กัน ตัวอย่างเช่น เดิมมี 1 pipeline ทำ 1 คำสั่งเสร็จใน 1 วินาที(โดยเฉลี่ย) ถ้าเพิ่มเป็น 2 pipeline จะทำได้เสร็จใน ครึ่งวินาที มันจะไม่เป็นอย่างนั้นครับ แต่มันจะช่วยลดปริมาณการล้างท่อลง           

ไม่มีความคิดเห็น:

แสดงความคิดเห็น