หรือจะเงิบ!…ชิป NAVI 9, 10, 16 ที่พบในไฟล์ระบบของ macOS ไม่ใช่ชื่อ GPU แต่เป็นค่าตัวเลขฟังก์ชันใน C++

จากข่าวเก่า “ลือการ์ดจอใหม่ AMD อาจใช้ชื่อ Radeon X6000 Series พบชื่อ NAVI 16, 12, 10 และ 9 ในไฟล์ระบบของ macOS Mohave update” หลังจากข่าวนี้กระจายออกไปเว็บไซต์ netkas.org ซึ่งเป็นกลุ่มนักพัฒนาบน macOS ได้บอกว่าชื่อของชิป NAVI 9, 10 และ 16 ที่รายงานกันออกมาจากฟอรัมของ tonymacx86 นั้นที่จริงแล้วเป็นค่าตัวเลขของโค้คคำสั่งในภาษา C++

แต่ก่อนจะไปถึงเนื้อหาจากเว็บไซต์ netkas.org เราขออธิบายเพิ่มเติมสักนิดก่อนครับเพื่อความเข้าใจ คือในภาษา C++ เราสามารถเขียนฟังก์ชันหลายฟังก์ชันที่มีชื่อเดียวกันได้ เพื่อให้ง่ายต่อการจัดกลุ่มฟังก์ชัน โดยแต่ละฟังก์ชันนั้นจะใช้มีพารามิเตอร์เพื่อเป็นการบ่งบอกว่าถึงจะใช้ชื่อฟังก์ชันเดียวกันแต่จริง ๆ แล้วมันเป็นคนละฟังก์ชันกัน ยกตัวอย่างให้เข้าใจง่าย ๆ เรามีฟังก์ชันชื่อ Click:1 และฟังก์ชันชื่อ Click:2 ชื่อของฟังก์ชันเหมือนกันคือ Click ส่วนตัวเลข :1 กับ :2 นี้มันคือค่าพารามิเตอร์ที่ demagle หรือจะให้ใช้ศัพท์ที่ง่ายกว่าคือถูก decode มาแล้วหรือถอดรหัสมาแล้วเพื่อให้อ่านง่ายเป็น user-level name แต่เมื่อไปถึงกระบวนคอมไพล์ โดยใช้ C++filt ค่าตัวเลขนี้ก็จะถูกดำเนินการ name mangling ให้เป็นค่าที่เรียกว่า low-level name เพื่อให้ตัวคอมไพเลอร์ทำความเข้าใจได้และทำงานไปตามระบบต่อไป

มาต่อกันที่เนื้อหาจาก netkas.org ในเว็บไซต์นี้ระบุว่าตัวเลข NAVI 9, NAVI 10, NAVI 16 อะไรเหล่านี้ไม่ใช่ชื่อของกราฟิกชิปแต่เป็นตัวเลขของฟังก์ชัน อย่างที่เราได้อธิบายไป ซึ่งเขาก็ได้แสดงตัวอย่างของฟังก์ชันที่ใช้ในแบบ user-level name มาตั้งต้นให้เราดู แล้วแปลงไปเป็นฟังก์ชันแบบ low-level name ให้ดูตามรายละเอียดดังนี้ครับ

Function names as is: $nm AMDRadeonX6000HWServices | grep Navi

__GLOBAL__sub_I_AMDRadeonHWServicesNavi.cpp

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi10MatchTableE

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi10gMetaClassE

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi10superClassE

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi16ProjectNameTableE

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi16getMatchPropertyEv

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi9MetaClassC1Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi9MetaClassC2Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi9MetaClassD0Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi9MetaClassD1Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNavi9metaClassE

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNaviC1EPK11OSMetaClass

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNaviC1Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNaviC2EPK11OSMetaClass

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNaviC2Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNaviD0Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNaviD1Ev

__ZN38AMDRadeonX6000_AMDRadeonHWServicesNaviD2Ev

__ZNK38AMDRadeonX6000_AMDRadeonHWServicesNavi12getMetaClassEv

__ZNK38AMDRadeonX6000_AMDRadeonHWServicesNavi9MetaClass5allocEv

__ZTV38AMDRadeonX6000_AMDRadeonHWServicesNavi

__ZTVN38AMDRadeonX6000_AMDRadeonHWServicesNavi9MetaClassE

__ZZN38AMDRadeonX6000_AMDRadeonHWServicesNavi16getMatchPropertyEvE18PROJECT_NAME_COUNT

แล้วเมื่อใช้ c++ name demangling: $ nm AMDRadeonX6000HWServices | grep Navi | c++filt ก็จะเป็นดังนี้

__GLOBAL__sub_I_AMDRadeonHWServicesNavi.cpp
AMDRadeonX6000_AMDRadeonHWServicesNavi::MatchTable
AMDRadeonX6000_AMDRadeonHWServicesNavi::gMetaClass
AMDRadeonX6000_AMDRadeonHWServicesNavi::superClass
AMDRadeonX6000_AMDRadeonHWServicesNavi::ProjectNameTable
AMDRadeonX6000_AMDRadeonHWServicesNavi::getMatchProperty()
AMDRadeonX6000_AMDRadeonHWServicesNavi::MetaClass::MetaClass()
AMDRadeonX6000_AMDRadeonHWServicesNavi::MetaClass::MetaClass()
AMDRadeonX6000_AMDRadeonHWServicesNavi::MetaClass::~MetaClass()
AMDRadeonX6000_AMDRadeonHWServicesNavi::MetaClass::~MetaClass()
AMDRadeonX6000_AMDRadeonHWServicesNavi::metaClass
AMDRadeonX6000_AMDRadeonHWServicesNavi::AMDRadeonX6000_AMDRadeonHWServicesNavi(OSMetaClass const*)
AMDRadeonX6000_AMDRadeonHWServicesNavi::AMDRadeonX6000_AMDRadeonHWServicesNavi()
AMDRadeonX6000_AMDRadeonHWServicesNavi::AMDRadeonX6000_AMDRadeonHWServicesNavi(OSMetaClass const*)
AMDRadeonX6000_AMDRadeonHWServicesNavi::AMDRadeonX6000_AMDRadeonHWServicesNavi()
AMDRadeonX6000_AMDRadeonHWServicesNavi::~AMDRadeonX6000_AMDRadeonHWServicesNavi()
AMDRadeonX6000_AMDRadeonHWServicesNavi::~AMDRadeonX6000_AMDRadeonHWServicesNavi()
AMDRadeonX6000_AMDRadeonHWServicesNavi::~AMDRadeonX6000_AMDRadeonHWServicesNavi()
AMDRadeonX6000_AMDRadeonHWServicesNavi::getMetaClass() const
AMDRadeonX6000_AMDRadeonHWServicesNavi::MetaClass::alloc() const
vtable for AMDRadeonX6000_AMDRadeonHWServicesNav
vtable for AMDRadeonX6000_AMDRadeonHWServicesNavi::MetaClass

คุณผู้อ่านสามารถนำลองโค้ดที่เป็น user-level name ไปใส่ในเว็บไซต์ https://demangler.com/ เพื่อลอง Demangler ดูก็ได้ครับแล้วก็จะพบว่ามันจะถูกแปลงไปเป็น low-level name จริง ๆ

ถ้าเป็นไปตามนี้ก็ต้องบอกว่าฝันสลายสายมโนแล้วละครับ อย่างไรก็ตามเราลองย้อนกลับไปดูรายละเอียดในฟอรัมจาก tonymacx86 ที่เป็นต้นทางการพบชื่อ NAVI รุ่นต่าง ๆ ก็พบว่า ไม่มีการโต้แย้งรายละเอียดเรื่องนี้กันเพิ่มเติม แต่ที่เราเห็นเพิ่มก็คือมีการโพสต์รูปเพิ่มที่แสดงถึงชื่อ AMD Radeon X5000 เพิ่มเติมขึ้นมา ครั้งแรกเป็น AMD Radeon X6000

ในรายละเอียดของรูป AMD Radeon X5000 มีชื่อรุ่นย่อยของกราฟิกอย่าง Vega 10 และ Vega 12 ซึ่งดูกันจริง ๆ แล้ว ก็ไม่ถือว่าแปลกอะไรเพราะ Macbook Pro ในรุ่นปัจจุบันเราสามารถเลือก Radeon Pro Vega 16 และ Pro Vega 20 ได้อยู่แล้ว และก็ไม่แปลกถ้าจะมี Vega 10 และ Vega 12 เข้ามาเพิ่มเติมเป็นตัวเลือกสำหรับสเปคในระดับรอง ๆ ลงมาก็เป็นได้ครับ

เอาเป็นว่าตอนนี้เรื่องของกราฟิก NAVI รุ่นเล็กนั้นอาจจะต้องกลับไปเริ่มต้นสืบหาข้อมูลกันใหม่อีกครั้ง แต่ถ้าใครเบื่อไม่อยากติดตามแล้วก็รอไปลุ้นกันอีกทีช่วงเดือนมิถุนายนที่จะมีทั้งงาน E3 และงานคอมพิวเทค ครับ

You may also like...