Đóng quảng cáo

Mike Ash dành riêng trên blog của mình ý nghĩa thực tế của việc chuyển sang kiến ​​trúc 64-bit trên iPhone 5S. Bài viết này dựa trên những phát hiện của ông.

Lý do cho văn bản này chủ yếu là do có một lượng lớn thông tin sai lệch được lan truyền về ý nghĩa thực sự của iPhone 5s mới với bộ xử lý ARM 64-bit đối với người dùng và thị trường. Ở đây chúng tôi sẽ cố gắng mang đến những thông tin khách quan về hiệu suất, khả năng và ý nghĩa của quá trình chuyển đổi này cho các nhà phát triển.

"64bit"

Có hai phần của bộ xử lý mà nhãn "X-bit" có thể đề cập đến - chiều rộng của các thanh ghi số nguyên và chiều rộng của con trỏ. May mắn thay, trên hầu hết các bộ xử lý hiện đại, các chiều rộng này đều giống nhau, vì vậy trong trường hợp của A7, điều này có nghĩa là các thanh ghi số nguyên 64 bit và các con trỏ 64 bit.

Tuy nhiên, điều quan trọng không kém là chỉ ra "64bit" KHÔNG có nghĩa là gì: Kích thước địa chỉ vật lý RAM. Số lượng bit để giao tiếp với RAM (do đó, dung lượng RAM mà thiết bị có thể hỗ trợ) không liên quan đến số lượng bit CPU. Bộ xử lý ARM có địa chỉ từ 26 đến 40 bit và có thể được thay đổi độc lập với phần còn lại của hệ thống.

  • Kích thước bus dữ liệu. Lượng dữ liệu nhận được từ RAM hoặc bộ nhớ đệm cũng độc lập tương tự với yếu tố này. Các lệnh của bộ xử lý riêng lẻ có thể yêu cầu lượng dữ liệu khác nhau nhưng chúng được gửi theo từng khối hoặc nhận được nhiều hơn mức cần thiết từ bộ nhớ. Nó phụ thuộc vào kích thước của lượng tử dữ liệu. IPhone 5 đã nhận được dữ liệu từ bộ nhớ ở lượng tử 64 bit (và có bộ xử lý 32 bit) và chúng ta có thể gặp kích thước lên tới 192 bit.
  • Bất cứ điều gì liên quan đến dấu phẩy động. Kích thước của các thanh ghi như vậy (FPU) một lần nữa lại độc lập với hoạt động bên trong của bộ xử lý. ARM đã sử dụng FPU 64 bit từ trước ARM64 (bộ xử lý ARM 64 bit).

Ưu điểm và nhược điểm chung

Nếu chúng ta so sánh kiến ​​trúc 32bit và 64bit giống hệt nhau thì nhìn chung chúng không khác nhau mấy. Đây là một trong những lý do khiến công chúng bối rối khi tìm kiếm lý do tại sao Apple cũng chuyển sang 64bit trên thiết bị di động. Tuy nhiên, tất cả đều đến từ thông số cụ thể của bộ xử lý A7 (ARM64) và cách Apple sử dụng nó chứ không chỉ đến từ việc bộ xử lý này có kiến ​​trúc 64-bit.

Tuy nhiên, nếu nhìn vào sự khác biệt giữa hai kiến ​​trúc này, chúng ta sẽ thấy một số điểm khác biệt. Điều hiển nhiên là các thanh ghi số nguyên 64 bit có thể xử lý số nguyên 64 bit hiệu quả hơn. Ngay cả trước đây, người ta vẫn có thể làm việc với chúng trên bộ xử lý 32 bit, nhưng điều này thường có nghĩa là phải chia chúng thành các phần dài 32 bit, khiến việc tính toán chậm hơn. Vì vậy, bộ xử lý 64 bit thường có thể tính toán với loại 64 bit nhanh như loại 32 bit. Điều này có nghĩa là các ứng dụng thường sử dụng loại 64 bit có thể chạy nhanh hơn nhiều trên bộ xử lý 64 bit.

Mặc dù 64bit không ảnh hưởng đến tổng dung lượng RAM mà bộ xử lý có thể sử dụng nhưng nó có thể giúp làm việc dễ dàng hơn với khối RAM lớn trong một chương trình. Bất kỳ chương trình nào chạy trên bộ xử lý 32 bit chỉ có khoảng 4 GB không gian địa chỉ. Do hệ điều hành và các thư viện tiêu chuẩn chiếm một phần nào đó, điều này khiến chương trình chỉ còn khoảng 1-3 GB để sử dụng ứng dụng. Tuy nhiên, nếu hệ thống 32 bit có RAM lớn hơn 4 GB thì việc sử dụng bộ nhớ đó sẽ phức tạp hơn một chút. Chúng ta phải dùng đến cách buộc hệ điều hành ánh xạ những khối bộ nhớ lớn hơn này cho chương trình của chúng ta (ảo hóa bộ nhớ) hoặc chúng ta có thể chia chương trình thành nhiều quy trình (trong đó về mặt lý thuyết, mỗi quy trình lại có 4GB bộ nhớ để đánh địa chỉ trực tiếp).

Tuy nhiên, những "thủ thuật" này khó và chậm đến mức rất ít ứng dụng sử dụng chúng. Trong thực tế, trên bộ xử lý 32 bit, mỗi chương trình sẽ chỉ sử dụng 1-3 GB bộ nhớ và có thể sử dụng nhiều RAM hơn để chạy nhiều chương trình cùng lúc hoặc sử dụng bộ nhớ này làm bộ đệm (caching). Những cách sử dụng này rất thiết thực nhưng chúng tôi muốn bất kỳ chương trình nào cũng có thể dễ dàng sử dụng các khối bộ nhớ lớn hơn 4GB.

Bây giờ chúng ta đi đến khẳng định thường xuyên (thực sự không chính xác) rằng nếu không có bộ nhớ lớn hơn 4GB thì kiến ​​trúc 64-bit là vô dụng. Không gian địa chỉ lớn hơn rất hữu ích ngay cả trên hệ thống có ít bộ nhớ hơn. Các tệp được ánh xạ bộ nhớ là một công cụ tiện dụng trong đó một phần nội dung của tệp được liên kết hợp lý với bộ nhớ của tiến trình mà không cần phải tải toàn bộ tệp vào bộ nhớ. Do đó, hệ thống có thể xử lý dần dần các tệp lớn lớn hơn nhiều lần so với dung lượng RAM. Trên hệ thống 32-bit, các tệp lớn như vậy không thể được ánh xạ bộ nhớ một cách đáng tin cậy, trong khi trên hệ thống 64-bit, điều đó thật dễ dàng nhờ không gian địa chỉ lớn hơn nhiều.

Tuy nhiên, kích thước con trỏ lớn hơn cũng mang lại một nhược điểm lớn: nếu không thì các chương trình giống hệt nhau cần nhiều bộ nhớ hơn trên bộ xử lý 64 bit (những con trỏ lớn hơn này phải được lưu trữ ở đâu đó). Vì con trỏ là một phần thường xuyên của các chương trình nên sự khác biệt này có thể tạo gánh nặng cho bộ nhớ đệm, từ đó khiến toàn bộ hệ thống chạy chậm hơn. Vì vậy, về mặt phối cảnh, chúng ta có thể thấy rằng nếu chúng ta chỉ thay đổi kiến ​​trúc bộ xử lý thành 64-bit, nó thực sự sẽ làm chậm toàn bộ hệ thống. Vì vậy yếu tố này phải được cân bằng bằng cách tối ưu hóa nhiều hơn ở những nơi khác.

ARM64

A7, bộ xử lý 64-bit cung cấp năng lượng cho iPhone 5s mới, không chỉ là bộ xử lý ARM thông thường với các thanh ghi rộng hơn. ARM64 chứa những cải tiến lớn so với phiên bản 32 bit cũ hơn.

Bộ xử lý Apple A7.

Đăng ký

ARM64 chứa số thanh ghi số nguyên nhiều gấp đôi so với ARM 32-bit (hãy cẩn thận để không nhầm lẫn giữa số lượng và chiều rộng của các thanh ghi - chúng ta đã nói về chiều rộng trong phần "64-bit". Vì vậy, ARM64 có cả hai thanh ghi rộng gấp đôi và nhiều gấp đôi số thanh ghi). sổ đăng ký). ARM 32 bit có 16 thanh ghi số nguyên: một bộ đếm chương trình (PC - chứa số lệnh hiện tại), một con trỏ ngăn xếp (một con trỏ tới một hàm đang được xử lý), một thanh ghi liên kết (một con trỏ trỏ tới kết quả trả về sau khi kết thúc của hàm) và 13 cái còn lại dành cho sử dụng ứng dụng. Tuy nhiên, ARM64 có 32 thanh ghi số nguyên, bao gồm một thanh ghi số 28, một thanh ghi liên kết, một con trỏ khung (tương tự như con trỏ ngăn xếp) và một thanh ghi dành riêng cho tương lai. Điều này khiến chúng tôi có 32 thanh ghi để sử dụng ứng dụng, nhiều hơn gấp đôi ARM 64 bit. Đồng thời, ARM16 đã tăng gấp đôi số lượng thanh ghi số dấu phẩy động (FPU) từ 32 lên 128 thanh ghi XNUMX bit.

Nhưng tại sao số lượng đăng ký lại quan trọng đến vậy? Bộ nhớ thường chậm hơn so với tính toán của CPU và việc đọc/ghi có thể mất một thời gian rất dài. Điều này sẽ khiến bộ xử lý nhanh phải liên tục chờ bộ nhớ và chúng ta sẽ đạt đến giới hạn tốc độ tự nhiên của hệ thống. Bộ xử lý cố gắng che giấu khuyết điểm này bằng các lớp bộ đệm, nhưng ngay cả bộ đệm nhanh nhất (L1) vẫn chậm hơn so với tính toán của bộ xử lý. Tuy nhiên, các thanh ghi là các ô nhớ trực tiếp trong bộ xử lý và việc đọc/ghi của chúng đủ nhanh để không làm chậm bộ xử lý. Số lượng thanh ghi thực tế có nghĩa là dung lượng bộ nhớ nhanh nhất để tính toán bộ xử lý, điều này ảnh hưởng lớn đến tốc độ của toàn bộ hệ thống.

Đồng thời, tốc độ này cần sự hỗ trợ tối ưu tốt từ trình biên dịch để ngôn ngữ có thể sử dụng các thanh ghi này và không phải lưu trữ mọi thứ trong bộ nhớ ứng dụng chung (bộ nhớ chậm).

Bộ hướng dẫn

ARM64 cũng mang đến những thay đổi lớn cho tập lệnh. Tập lệnh là một tập hợp các thao tác nguyên tử mà bộ xử lý có thể thực hiện (ví dụ: 'ADD register1 register2' cộng các số trong hai thanh ghi). Các chức năng có sẵn cho từng ngôn ngữ bao gồm các hướng dẫn này. Các hàm phức tạp hơn phải thực thi nhiều lệnh hơn nên chúng có thể chậm hơn.

Điểm mới trong ARM64 là hướng dẫn mã hóa AES, hàm băm SHA-1 và SHA-256. Vì vậy, thay vì triển khai phức tạp, chỉ có ngôn ngữ sẽ gọi hướng dẫn này - điều này sẽ mang lại sự tăng tốc đáng kể cho việc tính toán các hàm như vậy và hy vọng sẽ tăng thêm tính bảo mật trong các ứng dụng. Ví dụ. Touch ID mới cũng sử dụng các hướng dẫn này trong mã hóa, cho phép tốc độ thực và bảo mật (về lý thuyết, kẻ tấn công sẽ phải sửa đổi chính bộ xử lý để truy cập dữ liệu - không thực tế nếu nói là ít nhất với kích thước thu nhỏ của nó).

Khả năng tương thích với 32bit

Điều quan trọng cần đề cập là A7 có thể chạy hoàn toàn ở chế độ 32 bit mà không cần giả lập. Điều đó có nghĩa là iPhone 5s mới có thể chạy các ứng dụng được biên dịch trên ARM 32-bit mà không bị chậm. Tuy nhiên, nó không thể sử dụng các chức năng ARM64 mới, vì vậy việc tạo một bản dựng đặc biệt dành riêng cho A7 luôn là điều đáng giá, nó sẽ chạy nhanh hơn nhiều.

Thay đổi thời gian chạy

Thời gian chạy là mã bổ sung các chức năng cho ngôn ngữ lập trình mà nó có thể sử dụng trong khi ứng dụng đang chạy cho đến sau khi dịch. Vì Apple không cần duy trì khả năng tương thích của ứng dụng (hệ nhị phân 64 bit chạy trên 32 bit), nên họ có thể đủ khả năng thực hiện thêm một số cải tiến cho ngôn ngữ Objective-C.

Một trong số đó là cái gọi là con trỏ được gắn thẻ (con trỏ được đánh dấu). Thông thường, các đối tượng và con trỏ tới các đối tượng đó được lưu trữ trong các phần bộ nhớ riêng biệt. Tuy nhiên, các kiểu con trỏ mới cho phép các lớp có ít dữ liệu lưu trữ các đối tượng trực tiếp trong con trỏ. Bước này loại bỏ nhu cầu cấp phát bộ nhớ trực tiếp cho đối tượng, chỉ cần tạo một con trỏ và đối tượng bên trong nó. Con trỏ được gắn thẻ chỉ được hỗ trợ trong kiến ​​trúc 64 bit do thực tế là không còn đủ dung lượng trong con trỏ 32 bit để lưu trữ đủ dữ liệu hữu ích. Do đó, iOS, không giống như OS X, chưa hỗ trợ tính năng này. Tuy nhiên, với sự xuất hiện của ARM64, điều này đang thay đổi và iOS cũng đã bắt kịp OS X về mặt này.

Mặc dù con trỏ dài 64 bit nhưng trên ARM64 chỉ có 33 bit được sử dụng cho địa chỉ riêng của con trỏ. Và nếu chúng ta có thể vạch mặt phần còn lại của các bit con trỏ một cách đáng tin cậy, chúng ta có thể sử dụng không gian này để lưu trữ dữ liệu bổ sung – như trong trường hợp các con trỏ được gắn thẻ đã đề cập. Về mặt khái niệm, đây là một trong những thay đổi lớn nhất trong lịch sử của Objective-C, mặc dù nó không phải là một tính năng có thể bán được trên thị trường - vì vậy hầu hết người dùng sẽ không biết Apple đang phát triển Objective-C như thế nào.

Ví dụ, đối với dữ liệu hữu ích có thể được lưu trữ trong không gian còn lại của con trỏ được gắn thẻ như vậy, Objective-C hiện đang sử dụng nó để lưu trữ cái gọi là số lượng tham chiếu (số tài liệu tham khảo). Trước đây, số lượng tham chiếu được lưu trữ ở một vị trí khác trong bộ nhớ, trong bảng băm được chuẩn bị sẵn cho nó, nhưng điều này có thể làm chậm toàn bộ hệ thống trong trường hợp có một số lượng lớn lệnh gọi phân bổ/dealloc/giữ lại/giải phóng. Bảng phải được khóa do an toàn luồng, do đó số lượng tham chiếu của hai đối tượng trong hai luồng không thể thay đổi cùng một lúc. Tuy nhiên, giá trị này mới được chèn vào phần còn lại của cái gọi là isa các chỉ số. Đây là một lợi thế và khả năng tăng tốc không dễ thấy nhưng rất lớn trong tương lai. Tuy nhiên, điều này không bao giờ có thể đạt được trong kiến ​​trúc 32-bit.

Thông tin về các đối tượng liên quan, đối tượng có được tham chiếu yếu hay không, có cần tạo hàm hủy cho đối tượng hay không, v.v., cũng mới được chèn vào vị trí còn lại của con trỏ tới đối tượng. về cơ bản có thể tăng tốc thời gian chạy, điều này được phản ánh qua tốc độ của từng ứng dụng. Từ thử nghiệm, điều này có nghĩa là tất cả lệnh gọi quản lý bộ nhớ sẽ tăng tốc khoảng 40-50%. Chỉ bằng cách chuyển sang con trỏ 64 bit và sử dụng không gian mới này.

Phần kết luận

Mặc dù các đối thủ cạnh tranh sẽ cố gắng truyền bá ý tưởng rằng việc chuyển sang kiến ​​trúc 64-bit là không cần thiết nhưng bạn sẽ biết rằng đây chỉ là một ý kiến ​​​​rất thiếu hiểu biết. Đúng là việc chuyển sang 64-bit mà không điều chỉnh ngôn ngữ hoặc ứng dụng của bạn không thực sự có ý nghĩa gì - nó thậm chí còn làm chậm toàn bộ hệ thống. Nhưng A7 mới sử dụng ARM64 hiện đại với bộ hướng dẫn mới và Apple đã gặp khó khăn trong việc hiện đại hóa toàn bộ ngôn ngữ Objective-C và tận dụng các khả năng mới - do đó tốc độ được hứa hẹn sẽ tăng lên.

Ở đây chúng tôi đã đề cập đến một số lượng lớn lý do tại sao kiến ​​trúc 64-bit là bước tiến đúng đắn. Đó là một cuộc cách mạng "dưới mui xe" khác, nhờ đó Apple sẽ cố gắng đi đầu không chỉ về thiết kế, giao diện người dùng và hệ sinh thái phong phú mà chủ yếu là với những công nghệ hiện đại nhất trên thị trường.

Nguồn: mikeash.com
.