The Beginner’s Guide: CPU-Z มีแล้ว ดูยังไง (ตอนที่ 2) เรื่องของแคช

มาดูแท็บที่สองของโปรแกรม CPU-Z กันต่อครับ ในแท็บที่ชื่อว่า “Caches” หรือแคชนั่นเอง ในตอนที่ 1 เราได้พูดถึงหน่วยความจำแคชกันแบบคร่าว ๆ ไปบ้างแล้ว ในตอนที่ 2 นี้เราจะมาลงลึกเรื่องราวของหน่วยความจำแคชกันอีกสักนิดนะครับ เพราะหน่วยความจำแคชเองก็มีความสำคัญไม่น้อยต่อประสิทธิภาพในการทำงานของซีพียู (สำหรับบทความตอนที่ 1 ของ GPU-Z สามารถอ่านได้ที่นี่)

แท็บแรกของโปรแกรม CPU-Z ที่ใช้แสดงรายละเอียดต่าง ๆ ของซีพียู

 

แท็บที่สองของโปรแกรม CPU-Z จะแสดงรายละเอียดของหน่วยความจำแคชที่อยู่ภายในตัวซีพียู ประกอบไปด้วยขนาดของแคชทั้ง L1, L2 และ L3 รวมไปถึงรูปแบบในการจัดการข้อมูลของแคชด้วย

Cache หรือ แคช ก็คือหน่วยความจำความเร็วสูงที่อยู่ภายในตัวของซีพียูทำงานด้วยความเร็วที่ใกล้เคียงกับคอร์ประมวลผลของซีพียู และภายในซีพียูหนึ่งตัวก็จะมีแคชอยู่หลายระดับด้วยกัน ดังในภาพด้านล่างนี้ก็จะเห็นได้ว่ามีหน่วยความจำแคชอยู่ 3 ระดับ Cache Level 1, Cache Level 2 และ Cache Level 3 หรือบางทีเราก็จะเรียกกันย่อ ๆ ว่า Cache L1 หรือแคช L1 แบบไทย ๆ แต่จำนวน Level หรือลำดับชั้นของหน่วยความจำแคชในซีพียูอาจจะมีไม่เท่ากันครับ บางรุ่นก็จะมีแค่แคช L1 กับ L2 เท่านั้น หรือบางรุ่นก็จะมีมากถึงระดับ L4 ก็มี ซีพียูส่วนใหญ่ในปัจจุบันจะมีแคชอยู่ 3 ระดับ ส่วนขนาดของแคชไม่ว่าจะเป็น L1, L2 หรือ L3 ก็จะขึ้นอยู่กับรุ่นและสถาปัตยกรรมของซีพียูครับ

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

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

สำหรับหน่วยความจำแคช L1 นั้นจะมีความพิเศษหน่อยตรงที่จะมีการแยกการทำงานเป็นสองส่อนคือ Instruction Cache หรือแคชคำสั่ง และสองคือ Data Cache เป็นแคชสำหรับการเก็บข้อมูล และหน่วยความจำแคช L1 ก็จะเป็นพื้นที่หลักในการจัดเก็บข้อมูลในระหว่างการประมวลผลของซีพียู ส่วนแคช L2 นั้นส่วนมากก็จะทำหน้าที่ในการพักข้อมูลชั่วคราวสำหรับการถูกนำไปประมวลผลต่อ และ L3 นั้นเป็นการเก็บข้อมูลแบบทั่วไปที่ไม่เฉพาะเจาะจง โดย L3 ในหน่วยประมวลผลรุ่นใหม่ ๆ นั้นจะทำหน้าที่หลักเลยก็คือใช้แชร์ข้อมูลระหว่างคอร์ประมวลผลแต่ละคอร์ภายในซีพียู การทำงานต่าง ๆ ของหน่วยความจำแคช จะมีส่วนที่เรียกว่า “Cache Controller” หรือตัวควบคุมการทำงานของแคช การจัดการกับข้อมูลต่าง ๆ ในหน่วยความจำแคชก็เป็นอีกส่วนหนึ่งที่สำคัญที่ส่งผลต่อประสิทธิภาพในการทำงานของซีพียูด้วย

ทีนี้เมื่อย้อนกลับมาดูในรูปแท็บที่สองของ CPU-Z ซึ่งเป็นภาพที่ได้จากการตรวจสอบซีพียู Core i7-4690X จะว่าไปแล้วภาพในหน้าแท็บที่ 2 นี้ก็เป็นการขยายความเรื่อง Cache ที่อยู่ตรงมุมล่างขวาของแท็บแรกนั่นเองครับ และในซีพียู Core i7-4690X ก็จะมีแคชอยู่ด้วยกันสามระดับ โดยแบ่งออกเป็นแคชต่าง ๆ ดังนี้

  • L1 D-Cache (Data Cache) มีขนาด 32KB ส่วนข้อความ x6 หมายถึงจำนวนชุดของ Data Cache ที่มีในซีพียูทั้งหมด 6 ชุด ตามจำนวนคอร์ของซีพียู ในช่อง Descriptor อันนี้เป็นการอธิบายลักษณะการทำงานของแคชว่าเป็นแบบ 8-way set associative และมีขนาด 64-byte line size
  • L1 I-Cache (Instruction Cache) มีขนาด 32KB มีจำนวน 6 ชุด และมีการทำงานแบบ 8-way set associative มีขนาด 64-byte line size
  • L2 Cache (หน่วยความจำแคชระดับที่ 2) มีขนาด 256KฺB จำนวน 6 ชุด เท่ากับจำนวนคอร์ของซีพียู มีการทำงานแบบ 8-way set associative มีขนาด 64-byie line size
  • L3 Cache (หน่วยความจำแคชระดับที่ 3) มีขนาด 15MB มีเพียงชุดเดียวและเป็นการแชร์การใช้งานร่วมกับของคอร์ประมวลผลทุกคอร์ที่อยู่ในซีพียู มีการทำงานแบบ 20-way set associative มีขนาด 64-byte line size

*** ขนาดของหน่วยความจำแคชนั้นจะมีขนาดที่แตกต่างกันไปแล้วแต่รุ่นของซีพียูครับ ร่วมไปถึงพวกจำนวน way ต่าง ๆ ก็จะแตกต่างกันไปด้วยเช่นกัน ***

ในแท็บ Caches มีแค่ 4 หัวข้อที่ดูซ้ำไป ซ้ำมา และไม่มีรายละเอียดอะไรมาก แต่ถ้าจะให้อธิบายอย่างละเอียดก็ต้องใช้พื้นที่อีกมากพอสมควรเลยจะขอเล่าย่อ ๆ พอสังเขปดังนี้

ในเรื่องขนาดของแคช (Cache Size) ไม่ว่าจะเป็น L1D-Cache, L1I-Cache, L2 Cache และ L3 Cache เราคิดว่าคงไม่ต้องอธิบายอะไรมากเพราะมันก็คือขนาดหรือความจุในการจัดเก็บข้อมูลนั่นเอง แต่ที่ต้องพูดกันยาว ๆ ก็คือ “8-way/20-way set associative” กับ “64-byte line size” นี่หล่ะครับ

และเราก็ต้องแยกคำว่า 8-way ออกจากคำว่า set associative กันก่อนครับ

“set associative” นั้นเป็นชื่อเรียกของกระบวนการแคชข้อมูลชนิดหนึ่งครับ ซึ่งโดยปกติแล้วการทำงานของหน่วยความจำแคชโดยทั่วไปจะมีอยู่สามรูปแบบด้วยกัน ได้แก่

  1. Direct Mapping
  2. Associative Mapping
  3. Set Associative Mapping

 

Direct Mapping: การทำงานของการแคชข้อมูลในแบบนี้ก็คือเป็นการทำสำเนาข้อมูลกันโดยตรงระหว่างหน่วยความจำแคชที่อยู่ในตัวซีพียูกับหน่วยความจำหลักของเครื่อง (RAM, Main Memory)

Direct Mapping

Source: https://staff.fnwi.uva.nl/a.d.pimentel/apr/node12.html

จากในรูปจะเห็นได้ว่าตำแหน่งของบล็อกในหน่วยความจำหลักจะถูกกำหนดตายตัวไปกับตำแหน่งบล็อกของแคช เช่นตัวอย่างในรูปนี้แคชมีทั้งหมด 8 entries (0-7) และข้อมูลในหน่วยความจำหลักมี 16 บล็อก (0-15) เวลาจะทำสำเนาข้อมูลจากหน่วยความจำหลักมาไว้ในแคชก็จะมีการทำครั้งละ 8 entries  ในรูปเป็นยกตัวอย่างของการทำแคชข้อมูลสองครั้งครั้งแรก ทำบล็อก 0-7 ก่อน ครั้งที่สองจะทำบล็อก 9-15 ในรูปเราจะเห็นได้ว่าการแคชข้อมูลก็ยังคงจัดเรียงตำแหน่งของบล็อก ไม่มีการสลับตำแหน่ง แต่ว่าการใช้งานในแบบ Direct Mapping นั้นจะเหมาะกับการทำงานที่ไม่มีความซับซ้อน มีข้อมูลในระบบไม่มาก เพราะถ้ามีข้อมูลเป็นจำนวนมากก็จะมีปัญหาในเรื่องของการชี้ตำแหน่งข้อมูลของหน่วยความจำแคชกับหน่วยความจำหลักของระบบ ซึ่งถ้ามีข้อผิดพลาดตรงนี้มาก ๆ ก็เท่ากับว่าหน่วยความจำแคชไม่มีประโยชน์อะไรเลยเพราะมีข้อมูลแต่ก็ไม่ใช่ข้อมูลที่ต้องการใช้งาน

 

Associative Mapping:  หรือ Full Associative Mapping แล้วแต่ตำราแต่ก็ให้เข้าใจว่าเป็นแบบเดียวกันครับ การจัดการแคชในลักษณะนี้จะมีความอิสระในการทำสำเนาของข้อมูล

Full-associative cach

Source: https://staff.fnwi.uva.nl/a.d.pimentel/apr/node13.html

จากในรูปตัวอย่างจะเห็นได้ว่าข้อมูลในบล็อก 0-15 ของหน่วยความจำหลัก สามารถถูกนำไปสำเนาไว้ในตำแหน่งใด ๆ ของแคชก็ได้ใน 8 entries (หรือ 8 บล็อก) ที่มี วิธีการนี้มีข้อดีตรงที่สามารถแคชข้อมูลที่ต้องการใช้งานมาไว้ในแคชได้อย่างอิสระ แต่ก็มีปัญหาตามมาอีก…คือเวลาจะค้นหาข้อมูลในแคชจำเป็นต้องไล่หาข้อมูลในแคชไปทีละบล็อกจนกว่าจะเจอ ในขณะที่แบบ Direct Mapping เราจะรู้ตำแหน่งที่แน่นอนของข้อมูลได้เลย ถ้าดูรูปแคชข้อมูลแบบ Direct Mapping กับ Associative Mapping เทียบกันก็จะเห็นได้ว่าตัวชี้ตำแหน่งข้อมูลของ Direct Mapping สามารถชี้ตำแหน่งได้โดยตรงจาก Tag และ Block ในขณะที่ Associative Mapping จะใช้วิธีระบุตำแหน่งด้วยการ Tag แล้วคอยมาเปรียบเทียบข้อมูลอีกครั้งว่าใช่หรือไม่ใช่ข้อมูลที่ต้องการ นั่นคือต้อง Tag หาข้อมูลไปทุก ๆ entries จนกว่าจะเจอ เสียเวลาไปซิ

 

Set Associative Mapping: ซึ่งมีประสิทธิภาพและแก้ไขข้อบกพร่องของการทำงานแบบ Direct Mapping และ Associative Mapping มาเรียบร้อยแล้วนั่นเอง การทำงานของ Set Associative Mapping ก็คือการใช้ทั้งสองเทคนิคมารวมกันครับ

Set-associative cache

Source: https://staff.fnwi.uva.nl/a.d.pimentel/apr/node14.html

โดยการใช้เทคนิคการนำข้อมูลจากบล็อกของหน่วยความจำหลักมาไว้ในตำแหน่งใด ๆ ของหน่วยความจำแคชก็ได้ อันนี้ดีเหมือนกับ Associative Mapping จากนั้นก็จะใช้วิธีในการชี้ตำแหน่งข้อมูลในแบบ Direct Mapping ผสมกับ Associative Mapping เพียงแต่ตัวแคชเองก็ต้องมีการจัดระบบขึ้นมาใหม่ด้วยการกำหนดตัวเองให้เป็น Set หรือเป็นชุด ๆ เพื่อให้ง่ายต่อการค้นหาข้อมูลนั่นเอง สังเกตดูวิธีการชี้ตำแหน่งของ Set Associative Mapping จะมีการใช้ Tag และ Set แทน Tag และ Block เมื่อเทียบกับ Direct Mapping

 

สำหรับการทำงานของ Direct Mapping โดยทั่วไปจะทำงานในลักษณะของ 1-way เท่านั้นครับ แต่ถ้าเป็นการจัดหน่วยความจำแคชแบบ Associative Mapping และ Set Associative Mapping จะมีการจัดการหน่วยความจำได้ในแบบหลาย n-Way อธิบายอาจจะงง ไปดูภาพด้านล่างนี้ครับ

Direct Mapping ก็จะมีตำแหน่งและ Block หรือบางครั้งก็เรียกว่า Cache Line ได้ Set ละ 1 Block เท่านั้น แต่การจัดหน่วยความจำแบบ Associative Mapping ที่สามารถนำข้อมูลจากหน่วยความจำหลักมาไว้ในตำแหน่งใด ๆ ของแคชก็ได้นั้นเราก็สามารถออกแบบให้เป็นแบบ Direct Mapping ก็ได้ หรือจะออกแบบให้เป็น 1 Set ใหญ่ ๆ แล้วมีจำนวน Block (Cache Line) เท่ากับความจุของแคชไปเลย (ถึงได้เรียกอีกอย่างว่า Full Associative Mapping)  ส่วนการทำงานของ Set Associative Mapping การทำงานของแคชจะถูกกำหนดเป็น Set หรือชุด ซึ่งเป็นที่มาของชื่ออีกนั่นแหละ โดยในแต่ละชุดก็จะมีจำนวน Block (Cache Line) แล้วแต่จะออกแบบครับ

อ่านมาถึงตรงนี้เชื่อว่าคงจะมีหลายคนที่ยังงง ๆ อยู่กับเรื่องเทคนิคการ Mapping ข้อมูลในหน่วยความจำแคชทั้งสามแบบ จริง ๆ แล้วก็ไม่ต้องไปทำความเข้าใจกับมันก็ได้ครับ เพียงแต่ต้องการแสดงให้เห็นให้ถึงที่มาและรู้จักกับคำว่า 16-way set associative หรือ 20-way set associative มันมีที่มาที่ไปเป็นอย่างไรเท่านั้นเองครับ

 

ข้อมูลอ้างอิง:

สำหรับใครที่ต้องการรู้ในแบบเชิงลึกจริง ๆ ก็ไปอ่านกันได้ที่ https://en.wikipedia.org/wiki/Cache_memory

ส่วนภาพประกอบการทำงานของหน่วยความจำแคชทั้งสามแบบเรานำมาจาก https://staff.fnwi.uva.nl/a.d.pimentel/apr/apr.html

You may also like...