By Arnon Puitrakul - 02 สิงหาคม 2024
หลังจากข่าวที่เกิดขึ้นกับ CPU ของ Intel ใน Generation ที่ 13 และ 14 ที่ว่ามีปัญหา Failure Rate สูงมาก ๆ ล่าสุดตอนนี้ Intel บอกว่า เจอแล้วว่าเรื่องเกิดจาก Microcode วันนี้เราจะมาเล่าให้อ่านกันว่า มันคืออะไร มันจำเป็นอย่างไรกับ CPU
Microcode คือ ชุดคำสั่งอันนึงที่อยู่ใน CPU ทำหน้าที่เป็นโปรแกรมขนาดเล็กที่ควบคุมการทำงานของ CPU หากเราเคยเขียนโปรแกรม เราจะเข้าใจว่า หากเราเขียน Source Code ด้วย Programming Language สักตัวหนึ่ง เราไม่สามารถใช้งานกับ CPU ได้ตรง ๆ เพราะมันไม่รู้เรื่อง
เราจะต้องแปลงมันให้กลายเป็น Machine Code ด้วยวิธีใดวิธีหนึ่งเช่น Compile หรือ Interpret อันนี้ก็แล้วแต่ภาษาแต่ละตัวละว่าจะใช้วิธีการแบบใด เช่น C++ เราใช้ Compiler และ Python ส่วนใหญ่ เราจะใช้ Python Interpretator ในการทำงาน ซึ่งส่วนใหญ่ คนจะเข้าใจว่า CPU สามารถทำงานกับ Machine Language ได้ตรง ๆ
เช่น เราสั่ง FETCH มันก็จะเข้าใจทันทีว่าต้องเข้าไปเรียกข้อมูลออกมาจาก Address ที่เราเรียก แต่ในความเป็นจริงนั้นมันไม่จำเป็นต้องเป็นแบบนั้นเสมอไป
สำหรับในเครื่องคอมพิวเตอร์ที่ใช้ CPU บนสถาปัตยกรรมแบบ RISC (Reduced Instruction Set Computer) อย่างอุปกรณ์เคลื่อนที่ที่รัน ARM และพวก Apple Silicon ทั้งหลาย การทำงานมันเรียบง่ายมาก คือ มันอ่าน Machine Code และทำงานได้ตรง ๆ ตามวงจรที่กำหนดไว้ อย่างที่เราเข้าใจกันปกติ ทำให้ลักษณะสำคัญหนึ่งของ RISC คือ ในทุก ๆ คำสั่งบน ชุดคำสั่ง (Instruction Set) จะทำงานจบภายใน 1 Clock Cycle เสมอ ทำให้ใน RISC เขาไม่มี Microcode เหมือนกับฝั่ง CISC ที่กำลังจะเล่าต่อไป
กลับกันในเครื่องคอมพิวเตอร์ที่ใช้ชุดคำสั่งแบบ CISC (Complex Instruction Set Computer) ซึ่งคือ คอมพิวเตอร์ที่เราใช้งานกันทั่ว ๆ ไปบนระบบ x86 เช่นพวก PC ในบ้าน จนไปถึงระดับ Server และ Supercomputer จะทำงานในอีกรูปแบบหนึ่งคือ ภายในคำสั่งของมัน จะมีคำสั่งย่อย ๆ อยู่ด้านในอีกที ตัวอย่างเช่น เมื่อ CPU อ่านเจอคำสั่ง FETCH ภายในนั้นอาจจะมี 2 คำสั่งย่อย ๆ ที่ต้องทำอยู่ในนั้น กินสัก 2 Clock Cycle ทำให้แต่ละคำสั่งบน CPU ของ CISC นั้นใช้จำนวน Clock Cycle ในการทำงานที่ไม่เท่ากัน เจ้าคำสั่งที่อยู่ด้านใน CPU นั่นแหละ คือ Microcode ที่เรากำลังพูดถึง
ดังนั้น Microcode ที่เรากำลังพูดถึงอยู่ตอนนี้ ทำตัวเหมือนคนกลางระหว่าง CPU และ ISA (Instruction Set Architecture) ของ CPU คอยแปลงคำสั่งที่อยู่ใน Machine Code ให้กลายเป็นขั้นตอนที่ CPU จะต้องทำจริง ๆ เช่น การเปิดปิดวงจรตำแหน่งนั้นนี้ เพื่อให้ CPU ทำงานได้อย่างถูกต้อง
การทำงานของมัน ถ้าให้เล่าทั้งหมดมันจะลึกเกินไป ใครอยากรู้ไปเรียนในวิชา Computer Architecture เอาละกัน แต่ขั้นตอนการทำงานง่าย ๆ คือ Source Code เราจะถูกแปลงให้เป็น Machine Code เตรียมไว้ก่อน
เมื่อเราเปิดโปรแกรมขึ้นมา มันจะถูกเรียกจาก Secondary Storage ไปที่ Primary Storage แล้วค่อยโดน CPU สั่ง Fetch เข้าไปทีละคำสั่งไปเรื่อย ๆ เมื่อคำสั่งมาถึง CPU แล้ว มันจะต้องโดน Decode หรือขั้นตอนที่ CPU มันจะอ่านว่า มันจะต้องทำอะไรบ้าง
เช่น CPU Fetch คำสั่งขึ้นมา อ่านแล้วปรากฏว่า มันคือ คำสั่ง XADD (Exchange and Add) มันจะไปเรียกหาอ่าน Microcode ภายใน ROM หรือ EEPROM ว่า เห้ย ๆ XADD ต้องทำอะไรบ้างวะ ?
XADD Op
-------------
TEMP := SRC + DEST;
SRC := DEST;
DEST := TEMP;
พอเปิดเจอ มันก็จะรู้ว่า มันมี 3 ขั้นตอนนะ แล้วมันถึงจะเริ่มรันทีละขั้นตอนตามที่ Microcode ได้กำหนดไว้ หากเราสมมุติว่า ทุกคำสั่งภายใน CPU ตัวนี้ใช้ 1 Clock Cycle ต่อคำสั่ง แปลว่า การทำ XADD ใน CPU ตัวนี้ควรจะใช้อย่างน้อย 3 Clock Cycle นั่นเอง
อ่านมาถึงตรงนี้ อาจจะสงสัยว่า อ้าว ถ้าเราบอกว่า XADD บน CISC ต้องใช้อย่างน้อย 3 Clock Cycle ในการทำงาน งั้น RISC ที่ทุกคำสั่งใช้ 1 Clock Cycle ไม่เร็วกว่าเหรอ คำตอบคือ ไม่เสมอไปนะ และการออกแบบ CPU เป็น RISC มันมีข้อเสียอยู่
ข้อดีที่สำคัญของ การใช้ Microcode บน CISC คือ การที่ผู้พัฒนา CPU สามารถสร้างคำสั่งภายใน Machine Code ได้มากขึ้น โดยที่ไม่ต้องมานั่งเขียนแผงวงจรใหม่ เขาสามารถอัพเดทผ่านการเขียนทับลงไปใน EEPROM ได้เลย ลดความซับซ้อนในการทำงาน และลดต้นทุนได้มหาศาล แต่แลกมากกับการทำงานที่ซับซ้อนกว่ามาก ๆ และมี Overhead ในการทำงานเพิ่มขึ้นอีก อันนี้ก็อยู่ที่การออกแบบ CPU แต่ละตัวละว่า เขาจะ Overcome ปัญหานี้ได้อย่างไรบ้าง
หลังจากเกิดเรื่องสักพัก Intel ออกมาประกาศว่า เขาพบสาเหตุของปัญหาในครั้งนี้แล้ว คือ Microcode ที่อยู่ใน CPU มันมีบัค ทำงานผิดพลาด ทำให้มันดึงไฟมากกว่าที่ควรจะเป็น อยู่ในระดับที่อันตราย ทำให้เมื่อไฟมากเกินไป ทำให้ CPU สูญเสียเสถียรภาพในการทำงาน จนไปถึงการล้มเหลวของระบบในกรณีที่แย่ที่สุด สิ่งที่แย่กว่านั้นคือ ไฟที่ว่าเกิน มันเกินกว่าขีดจำกัดที่วงจรภายใน CPU จะรับไหว ทำให้ วงจรเกิดความเสียหายได้เลยละ
ให้เราคิดภาพง่าย ๆ ว่า มันเหมือนกับเวลา เราจ่ายไฟเยอะ ๆ จนส่วนประกอบบางอย่างในแผงวงจรมันไหม้ หรือเสื่อมจนใช้งานไม่ได้แบบนั้นเลย มันคือความเสียหายถาวร แต่ในกรณีนี้มันเกิดกับวงจรที่มีขนาดเล็กมาก ๆ ระดับนาโนเมตรเท่านั้น ทำให้การซ่อมเรียกว่าเป็นไปไม่ได้เลยทิ้งอย่างเดียว
ณ ตอนที่เขียนนี้ Intel ออกมาประกาศแล้วว่า จะออก Microcode Update ออกมาแก้ไขเรื่องนี้ โดยการแก้ไข Microcode ที่มีปัญหาให้เรียกการจ่ายไฟระดับที่ถูกต้องเป็นปกติ ไม่เป็นอันตรายอีก ทำให้เราเป็นห่วงอยู่ 2 ประเด็นใหญ่ ๆ ด้วยกันคือ ถ้าเราปรับลดไฟลง Performance มันจะต่ำลงกว่านี้หรือไม่ เหมือนกับเวลาเราจะ Overclock เราก็ต้องเพิ่มไฟเลี้ยง ดังนั้น หากเราลดไฟเลี้ยงลง ก็อาจจะส่งผลต่อ Performance ด้วย (เรื่องนี้ Intel ยืนยันว่า ไม่ส่งผลแบบนั้นแน่นอน ก็รอมันออกมา แล้วดูผล Benchmark ก่อนละกัน) และอีกปัญหาคือ สำหรับผู้ที่ซื้อไปแล้ว และ วงจรภายใน CPU มันแตกไปเรียบร้อยแล้ว จะทำยังไงต่อ ถ้ารับเคลม ถามว่า แล้วจะแยกยังไงว่า คนนี้แตกเพราะความผิดพลาดของ Intel เอง และอันไหนแตกที่เอาไป Overclock จนพัง
หลังจากดูงาน Google I/O 2024 ที่ผ่านมา เรามาสะดุดเรื่องของการใส่ Watermark ลงไปใน Content ที่ Generate จาก AI วันนี้เราจะมาเล่าให้อ่านกันว่า วิธีการทำ Watermark ใน Content ทำอย่างไร...
ก่อนหน้านี้เราทำ Content เล่าความแตกต่างระหว่าง CPU, GPU และ NPU ทำให้เราเกิดคำถามขึ้นมาว่า เอาเข้าจริง เราจำเป็นต้องมี NPU อยู่ในตลาดจริง ๆ รึเปล่า หรือมันอาจจะเป็นแค่ Hardware ตัวนึงที่เข้ามาแล้วก็จากไปเท่านั้น วันนี้เราจะมาเล่าให้อ่านกัน...
บทความนี้ เราเขียนสำหรับมือใหม่ หรือคนที่ไม่ได้เรียนด้านนี้แต่อยากรู้ละกัน สำหรับวันนี้เรามาพูดถึงคำที่ถ้าเราทำงานกับพวก Developer เขาคุยกันบ่อย ๆ ใช้งานกันเยอะ ๆ อย่าง Database กันว่า มันคืออะไร ทำไมเราต้องใช้ และ เราจะมีตัวเลือกอะไรในการใช้งานบ้าง...
หากใครที่อายุใกล้ ๆ 30 ต้องเคยผ่านประสบการณ์โลกออนไลน์ในยุค 90s' มาไม่มากก็น้อย เป็นยุคที่เราเน้นใช้โปรแกรมเถื่อน ขายกันอยู่ในห้างพั____พ กันฉ่ำ ๆ ตำรวจตรวจแล้วเราไม่มีขายตัว แต่เคยสงสัยถึงที่มาของโปรแกรมเหล่านี้มั้ยว่า เขา Crack กันอย่างไร วันนี้เราจะมาเล่าให้อ่านกัน...