ปิดโฆษณา

ไมค์ แอช ทุ่มเทในบล็อกของเขา ผลกระทบเชิงปฏิบัติของการเปลี่ยนไปใช้สถาปัตยกรรม 64 บิตใน iPhone 5S บทความนี้ใช้ข้อค้นพบของเขา

เหตุผลของข้อความนี้สาเหตุหลักมาจากการเผยแพร่ข้อมูลที่ผิดจำนวนมากเกี่ยวกับความหมายของ iPhone 5s ใหม่ที่ใช้โปรเซสเซอร์ ARM 64 บิตต่อผู้ใช้และตลาด ที่นี่เราจะพยายามนำเสนอข้อมูลที่เป็นกลางเกี่ยวกับประสิทธิภาพ ความสามารถ และผลกระทบของการเปลี่ยนแปลงนี้แก่นักพัฒนา

"64 บิต"

โปรเซสเซอร์มีสองส่วนที่ป้ายกำกับ "X-bit" สามารถอ้างถึงได้ - ความกว้างของการลงทะเบียนจำนวนเต็มและความกว้างของพอยน์เตอร์ โชคดีที่โปรเซสเซอร์สมัยใหม่ส่วนใหญ่ความกว้างเหล่านี้จะเท่ากัน ดังนั้นในกรณีของ A7 นี่หมายถึงการลงทะเบียนจำนวนเต็ม 64 บิตและพอยน์เตอร์ 64 บิต

อย่างไรก็ตาม สิ่งสำคัญพอๆ กันคือต้องชี้ให้เห็นว่า "64 บิต" ไม่ได้หมายความว่าอะไร: ขนาดที่อยู่จริงของ RAM- จำนวนบิตที่จะสื่อสารกับ RAM (ดังนั้นจำนวน RAM ที่อุปกรณ์สามารถรองรับได้) ไม่เกี่ยวข้องกับจำนวนบิตของ CPU โปรเซสเซอร์ ARM มีที่อยู่ตั้งแต่ 26 ถึง 40 บิตและสามารถเปลี่ยนแปลงได้โดยอิสระจากส่วนที่เหลือของระบบ

  • ขนาดบัสข้อมูล- จำนวนข้อมูลที่ได้รับจาก RAM หรือหน่วยความจำบัฟเฟอร์มีความเป็นอิสระจากปัจจัยนี้เช่นเดียวกัน คำสั่งของโปรเซสเซอร์แต่ละตัวอาจร้องขอข้อมูลในปริมาณที่แตกต่างกัน แต่จะถูกส่งเป็นชิ้น ๆ หรือได้รับมากกว่าที่จำเป็นจากหน่วยความจำ ขึ้นอยู่กับขนาดของควอนตัมข้อมูล iPhone 5 ได้รับข้อมูลจากหน่วยความจำในรูปแบบควอนตัม 64 บิตแล้ว (และมีโปรเซสเซอร์ 32 บิต) และเราสามารถพบขนาดสูงสุด 192 บิต
  • อะไรก็ได้ที่เกี่ยวข้องกับจุดลอยตัว- ขนาดของรีจิสเตอร์ (FPU) ดังกล่าวจะไม่ขึ้นอยู่กับการทำงานภายในของโปรเซสเซอร์อีกครั้ง ARM ใช้ FPU 64 บิตตั้งแต่ก่อน ARM64 (โปรเซสเซอร์ ARM 64 บิต)

ข้อดีและข้อเสียทั่วไป

หากเราเปรียบเทียบสถาปัตยกรรม 32 บิตและ 64 บิตที่เหมือนกัน โดยทั่วไปแล้วจะไม่แตกต่างกันมากนัก นี่เป็นหนึ่งในสาเหตุของความสับสนโดยทั่วไปของสาธารณชนที่มองหาเหตุผลว่าทำไม Apple จึงเปลี่ยนไปใช้ 64 บิตในอุปกรณ์พกพาเช่นกัน อย่างไรก็ตาม ทั้งหมดนี้มาจากพารามิเตอร์เฉพาะของโปรเซสเซอร์ A7 (ARM64) และวิธีที่ Apple ใช้ ไม่ใช่แค่จากข้อเท็จจริงที่ว่าโปรเซสเซอร์มีสถาปัตยกรรม 64 บิตเท่านั้น

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

แม้ว่า 64 บิตจะไม่ส่งผลต่อจำนวน RAM ทั้งหมดที่โปรเซสเซอร์สามารถใช้ได้ แต่ก็ช่วยให้ทำงานกับ RAM ชิ้นใหญ่ในโปรแกรมเดียวได้ง่ายขึ้น โปรแกรมใด ๆ ที่ทำงานบนโปรเซสเซอร์ 32 บิตจะมีพื้นที่ที่อยู่ประมาณ 4 GB เท่านั้น เมื่อพิจารณาว่าระบบปฏิบัติการและไลบรารีมาตรฐานใช้งานบางอย่าง จะทำให้โปรแกรมเหลือพื้นที่ประมาณ 1-3 GB สำหรับการใช้งานแอปพลิเคชัน อย่างไรก็ตาม หากระบบ 32 บิตมี RAM มากกว่า 4 GB การใช้หน่วยความจำนั้นจะซับซ้อนกว่าเล็กน้อย เราต้องใช้วิธีบังคับให้ระบบปฏิบัติการแมปหน่วยความจำขนาดใหญ่เหล่านี้สำหรับโปรแกรมของเรา (การจำลองเสมือนหน่วยความจำ) หรือเราสามารถแบ่งโปรแกรมออกเป็นหลายกระบวนการได้ (โดยที่แต่ละกระบวนการในทางทฤษฎีอีกครั้งจะมีหน่วยความจำ 4 GB สำหรับการระบุที่อยู่โดยตรง)

อย่างไรก็ตาม "แฮ็ก" เหล่านี้ยากและช้ามากจนมีแอปพลิเคชันขั้นต่ำใช้ ในทางปฏิบัติ บนโปรเซสเซอร์ 32 บิต แต่ละโปรแกรมจะใช้หน่วยความจำเพียง 1-3 GB เท่านั้น และ RAM ที่มีอยู่มากกว่านั้นสามารถใช้เพื่อรันหลายโปรแกรมพร้อมกัน หรือใช้หน่วยความจำนี้เป็นบัฟเฟอร์ (แคช) การใช้งานเหล่านี้ใช้งานได้จริง แต่เราต้องการให้โปรแกรมใดๆ สามารถใช้หน่วยความจำขนาดใหญ่กว่า 4GB ได้อย่างง่ายดาย

ตอนนี้เรามาถึงการกล่าวอ้างบ่อยครั้ง (ไม่ถูกต้องจริง ๆ ) ว่าหากไม่มีหน่วยความจำมากกว่า 4GB สถาปัตยกรรม 64 บิตก็ไม่มีประโยชน์ พื้นที่ที่อยู่ขนาดใหญ่จะมีประโยชน์แม้ในระบบที่มีหน่วยความจำน้อย ไฟล์ที่แมปหน่วยความจำเป็นเครื่องมือที่มีประโยชน์ซึ่งเนื้อหาบางส่วนในไฟล์จะเชื่อมโยงทางตรรกะกับหน่วยความจำของกระบวนการโดยไม่ต้องโหลดไฟล์ทั้งหมดลงในหน่วยความจำ ตัวอย่างเช่น ระบบสามารถค่อยๆ ประมวลผลไฟล์ขนาดใหญ่ที่มีขนาดใหญ่กว่าความจุ RAM ได้หลายเท่า บนระบบ 32 บิต ไฟล์ขนาดใหญ่ดังกล่าวไม่สามารถแมปหน่วยความจำได้อย่างน่าเชื่อถือ ในขณะที่ระบบ 64 บิต เป็นเรื่องง่ายมาก เนื่องจากพื้นที่ที่อยู่มีขนาดใหญ่กว่ามาก

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

ARM64

A7 ซึ่งเป็นโปรเซสเซอร์ 64 บิตที่ขับเคลื่อน iPhone 5s ใหม่ ไม่ได้เป็นเพียงโปรเซสเซอร์ ARM ทั่วไปที่มีรีจิสเตอร์ที่กว้างขึ้น ARM64 มีการปรับปรุงที่สำคัญจากเวอร์ชัน 32 บิตที่เก่ากว่า

โปรเซสเซอร์แอปเปิ้ล A7

รีจิสทรี

ARM64 เก็บจำนวนเต็มรีจิสเตอร์เป็นสองเท่าของ ARM 32 บิต (ระวังอย่าให้จำนวนและความกว้างของรีจิสเตอร์สับสน - เราพูดถึงความกว้างในส่วน "64 บิต" ดังนั้น ARM64 จึงมีรีจิสเตอร์กว้างเป็นสองเท่าและมีมากเป็นสองเท่า ลงทะเบียน) ARM 32 บิตมีการลงทะเบียนจำนวนเต็ม 16 ตัว: ตัวนับโปรแกรมหนึ่งตัว (PC - มีจำนวนคำสั่งปัจจุบัน), ตัวชี้สแต็ก (ตัวชี้ไปยังฟังก์ชันที่กำลังดำเนินการ), การลงทะเบียนลิงค์ (ตัวชี้ไปยังการส่งคืนหลังจากสิ้นสุด ของฟังก์ชัน) และอีก 13 รายการที่เหลือเป็นการใช้งานแอปพลิเคชัน อย่างไรก็ตาม ARM64 มีรีจิสเตอร์จำนวนเต็ม 32 รีจิสเตอร์ รวมถึงรีจิสเตอร์ศูนย์หนึ่งตัว รีจิสเตอร์ลิงค์ ตัวชี้เฟรม (คล้ายกับตัวชี้สแต็ก) และอีกหนึ่งตัวที่สงวนไว้สำหรับอนาคต นี่ทำให้เรามีการลงทะเบียน 28 รายการสำหรับการใช้งานแอปพลิเคชัน ซึ่งมากกว่า ARM 32 บิตมากกว่าสองเท่า ในเวลาเดียวกัน ARM64 เพิ่มจำนวนการลงทะเบียนเลขทศนิยม (FPU) เป็นสองเท่าจาก 16 เป็น 32 การลงทะเบียน 128 บิต

แต่เหตุใดจำนวนการลงทะเบียนจึงมีความสำคัญมาก โดยทั่วไปหน่วยความจำจะช้ากว่าการคำนวณของ CPU และการอ่าน/การเขียนอาจใช้เวลานานมาก สิ่งนี้จะทำให้โปรเซสเซอร์ที่รวดเร็วต้องรอหน่วยความจำต่อไป และเราจะถึงขีดจำกัดความเร็วตามธรรมชาติของระบบ โปรเซสเซอร์พยายามซ่อนแต้มต่อนี้ด้วยชั้นบัฟเฟอร์ แต่แม้แต่บัฟเฟอร์ที่เร็วที่สุด (L1) ก็ยังช้ากว่าการคำนวณของโปรเซสเซอร์ อย่างไรก็ตาม รีจิสเตอร์คือเซลล์หน่วยความจำโดยตรงในโปรเซสเซอร์ และการอ่าน/การเขียนนั้นเร็วพอที่จะไม่ทำให้โปรเซสเซอร์ช้าลง จำนวนการลงทะเบียนในทางปฏิบัติหมายถึงจำนวนหน่วยความจำที่เร็วที่สุดสำหรับการคำนวณโปรเซสเซอร์ซึ่งส่งผลกระทบอย่างมากต่อความเร็วของทั้งระบบ

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

ชุดคำสั่ง

ARM64 ยังนำการเปลี่ยนแปลงที่สำคัญมาสู่ชุดคำสั่งด้วย ชุดคำสั่งคือชุดของการดำเนินการแบบอะตอมมิกที่โปรเซสเซอร์สามารถทำได้ (เช่น 'ADD register1 register2' จะเพิ่มตัวเลขในสองรีจิสเตอร์) ฟังก์ชั่นที่มีให้ในแต่ละภาษาประกอบด้วยคำแนะนำเหล่านี้ ฟังก์ชันที่ซับซ้อนมากขึ้นจะต้องดำเนินการตามคำสั่งมากขึ้น ดังนั้นจึงอาจทำงานช้าลงได้

สิ่งใหม่ใน ARM64 คือคำแนะนำสำหรับการเข้ารหัส AES, ฟังก์ชันแฮช SHA-1 และ SHA-256 ดังนั้น แทนที่จะเป็นการใช้งานที่ซับซ้อน มีเพียงภาษาเท่านั้นที่จะเรียกคำสั่งนี้ ซึ่งจะช่วยเร่งความเร็วอย่างมากในการคำนวณฟังก์ชันดังกล่าว และหวังว่าจะเพิ่มความปลอดภัยในแอปพลิเคชัน เช่น. Touch ID ใหม่ยังใช้คำแนะนำเหล่านี้ในการเข้ารหัส ทำให้ได้รับความเร็วและความปลอดภัยที่แท้จริง (ในทางทฤษฎี ผู้โจมตีจะต้องแก้ไขโปรเซสเซอร์เองเพื่อเข้าถึงข้อมูล ซึ่งเป็นไปไม่ได้ที่จะพูดให้น้อยที่สุดด้วยขนาดที่เล็กที่สุด)

ความเข้ากันได้กับ 32 บิต

สิ่งสำคัญคือต้องพูดถึงว่า A7 สามารถทำงานได้อย่างสมบูรณ์ในโหมด 32 บิตโดยไม่จำเป็นต้องจำลอง หมายความว่า iPhone 5s ใหม่สามารถเรียกใช้แอปพลิเคชันที่คอมไพล์บน ARM 32 บิตได้โดยไม่ทำให้ช้าลง อย่างไรก็ตาม ไม่สามารถใช้ฟังก์ชัน ARM64 ใหม่ได้ ดังนั้นจึงคุ้มค่าเสมอที่จะสร้างโครงสร้างพิเศษเฉพาะสำหรับ A7 ซึ่งน่าจะทำงานได้เร็วกว่ามาก

การเปลี่ยนแปลงรันไทม์

Runtime คือโค้ดที่เพิ่มฟังก์ชันให้กับภาษาการเขียนโปรแกรม ซึ่งสามารถใช้งานได้ในขณะที่แอปพลิเคชันกำลังทำงานอยู่ จนกระทั่งหลังการแปล เนื่องจาก Apple ไม่จำเป็นต้องรักษาความเข้ากันได้ของแอปพลิเคชัน (ซึ่งไบนารี 64 บิตทำงานบน 32 บิต) พวกเขาจึงสามารถปรับปรุงภาษา Objective-C เพิ่มเติมได้อีกเล็กน้อย

หนึ่งในนั้นคือสิ่งที่เรียกว่า ตัวชี้ที่ติดแท็ก (ตัวบ่งชี้ที่ทำเครื่องหมายไว้) โดยปกติ วัตถุและตัวชี้ไปยังวัตถุเหล่านั้นจะถูกจัดเก็บไว้ในส่วนที่แยกจากกันของหน่วยความจำ อย่างไรก็ตาม ตัวชี้ชนิดใหม่อนุญาตให้คลาสที่มีข้อมูลเพียงเล็กน้อยสามารถจัดเก็บออบเจ็กต์ในตัวชี้ได้โดยตรง ขั้นตอนนี้ไม่จำเป็นต้องจัดสรรหน่วยความจำให้กับออบเจ็กต์โดยตรง เพียงสร้างพอยน์เตอร์และออบเจ็กต์ที่อยู่ภายใน พอยน์เตอร์ที่ติดแท็กได้รับการสนับสนุนในสถาปัตยกรรม 64 บิตเท่านั้น เนื่องจากตัวชี้แบบ 32 บิตมีพื้นที่ไม่เพียงพอที่จะจัดเก็บข้อมูลที่เป็นประโยชน์เพียงพออีกต่อไป ดังนั้น iOS ซึ่งต่างจาก OS X จึงไม่รองรับคุณสมบัตินี้ อย่างไรก็ตาม ด้วยการมาถึงของ ARM64 สิ่งนี้กำลังเปลี่ยนแปลง และ iOS ก็ทันกับ OS X ในเรื่องนี้เช่นกัน

แม้ว่าพอยน์เตอร์จะมีความยาว 64 บิต แต่ใน ARM64 มีเพียง 33 บิตเท่านั้นที่ใช้สำหรับที่อยู่ของพอยน์เตอร์ และหากเราสามารถเปิดโปงบิตพอยน์เตอร์ที่เหลือได้อย่างน่าเชื่อถือ เราก็สามารถใช้พื้นที่นี้เพื่อจัดเก็บข้อมูลเพิ่มเติมได้ เช่นเดียวกับในกรณีของพอยน์เตอร์ที่ติดแท็กดังกล่าว ตามแนวคิดแล้ว นี่เป็นหนึ่งในการเปลี่ยนแปลงครั้งใหญ่ที่สุดในประวัติศาสตร์ของ Objective-C แม้ว่าจะไม่ใช่ฟีเจอร์ที่วางตลาด ดังนั้นผู้ใช้ส่วนใหญ่จะไม่รู้ว่า Apple ขับเคลื่อน Objective-C ไปข้างหน้าอย่างไร

สำหรับข้อมูลที่เป็นประโยชน์ที่สามารถจัดเก็บไว้ในพื้นที่ที่เหลือของตัวชี้ที่ติดแท็กนั้นได้ ตัวอย่างเช่น Objective-C กำลังใช้เพื่อจัดเก็บข้อมูลที่เรียกว่า จำนวนอ้างอิง (จำนวนการอ้างอิง) ก่อนหน้านี้ จำนวนการอ้างอิงถูกจัดเก็บไว้ในตำแหน่งอื่นในหน่วยความจำ ในตารางแฮชที่เตรียมไว้ แต่อาจทำให้ทั้งระบบช้าลงในกรณีของการเรียก alloc/dealloc/retain/release จำนวนมาก ตารางต้องถูกล็อคเนื่องจากความปลอดภัยของเธรด ดังนั้นจำนวนการอ้างอิงของสองอ็อบเจ็กต์ในสองเธรดจึงไม่สามารถเปลี่ยนแปลงได้ในเวลาเดียวกัน อย่างไรก็ตาม ค่านี้จะถูกแทรกเข้าไปในส่วนที่เหลือของสิ่งที่เรียกว่าใหม่ ISA ตัวชี้วัด นี่เป็นอีกข้อได้เปรียบและความเร่งที่รวดเร็วที่ไม่เด่นชัด แต่มีมากในอนาคต อย่างไรก็ตาม สิ่งนี้ไม่สามารถทำได้ในสถาปัตยกรรม 32 บิต

ข้อมูลเกี่ยวกับอ็อบเจ็กต์ที่เกี่ยวข้อง ไม่ว่าจะเป็นการอ้างอิงอ็อบเจ็กต์อย่างไม่ชัดเจน หรือจำเป็นต้องสร้าง destructor สำหรับอ็อบเจ็กต์ ฯลฯ จะถูกแทรกใหม่ในตำแหน่งที่เหลือของพอยน์เตอร์ไปยังอ็อบเจ็กต์ ด้วยข้อมูลนี้ Objective-C รันไทม์สามารถเพิ่มความเร็วของรันไทม์โดยพื้นฐาน ซึ่งสะท้อนให้เห็นในความเร็วของแต่ละแอปพลิเคชัน จากการทดสอบ นี่หมายถึงการเร่งความเร็วประมาณ 40-50% ของการโทรการจัดการหน่วยความจำทั้งหมด เพียงเปลี่ยนมาใช้พอยน์เตอร์แบบ 64 บิตและใช้พื้นที่ใหม่นี้

ข้อสรุป

แม้ว่าคู่แข่งจะพยายามเผยแพร่แนวคิดที่ว่าการเปลี่ยนไปใช้สถาปัตยกรรม 64 บิตนั้นไม่จำเป็น แต่คุณจะรู้แล้วว่านี่เป็นเพียงความคิดเห็นที่ไม่มีความรู้มากนัก เป็นเรื่องจริงที่การเปลี่ยนไปใช้ 64 บิตโดยไม่ปรับภาษาหรือแอปพลิเคชันของคุณไม่ได้มีความหมายอะไรเลย มันยังทำให้ทั้งระบบช้าลงด้วยซ้ำ แต่ A7 ใหม่ใช้ ARM64 ที่ทันสมัยพร้อมชุดคำสั่งใหม่และ Apple ได้ประสบปัญหาในการปรับปรุงภาษา Objective-C ทั้งหมดให้ทันสมัย ​​และใช้ประโยชน์จากความสามารถใหม่ - ด้วยเหตุนี้การเร่งความเร็วที่สัญญาไว้

เราได้กล่าวถึงเหตุผลหลายประการว่าทำไมสถาปัตยกรรม 64 บิตจึงเป็นก้าวที่ถูกต้อง ถือเป็นการปฏิวัติอีกครั้ง "ภายใต้ฝากระโปรง" ซึ่ง Apple จะพยายามอยู่ในระดับแนวหน้าไม่เพียงแต่ในด้านการออกแบบ ส่วนต่อประสานกับผู้ใช้ และระบบนิเวศที่สมบูรณ์เท่านั้น แต่ส่วนใหญ่จะใช้เทคโนโลยีที่ทันสมัยที่สุดในตลาด

แหล่งที่มา: mikeash.com
.