Người giải thích: Biểu diễn số trong phần cứng máy tính

Như Shakespeare sẽ nói, “thứ mà chúng ta gọi là hoa hồng bằng bất kỳ tên nào khác sẽ có mùi ngọt ngào như vậy.” Nhưng trong thế giới máy tính, cách mà chúng ta biểu thị một con số trong phần cứng có thể có nghĩa là sự khác biệt giữa một cỗ máy cực nhanh hay một lỗi tốn kém 475 triệu đô la – Pentium 4 có ai không?

Chào mừng bạn đến với thành phần cơ bản nhất của thiết kế máy tính: cách các con số được thể hiện trong phần cứng! Tất cả chúng ta đều biết rằng các máy tính hiện đại hoạt động trên các số nhị phân và cực kỳ hiệu quả khi làm như vậy. Nhưng điều này không phải lúc nào cũng đúng. Và hơn thế nữa, nhiều gã khổng lồ công nghệ ngày nay, bao gồm Microsoft, Nvidia, Intel, Arm và Tesla đều đang xem xét lại cách họ mã hóa các con số trong phần cứng, nhằm tận dụng từng chút hiệu suất cuối cùng.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Nhưng chúng ta đang đi trước mình một chút. Trong bài viết này, chúng ta sẽ xem xét tất cả những điều này đã xảy ra như thế nào. Từ những ngày đầu ra đời của số nhị phân cho đến thế giới hiện đại của dấu chấm động, khái niệm dường như đơn giản này có thể trở nên khá phức tạp, vì vậy hãy bắt đầu lại từ đầu…

Khi chúng ta lần đầu tiên học về các con số ở trường tiểu học, chúng ta thường bắt đầu với các số tự nhiên (1, 2, 3, 4…). Các số tự nhiên được sử dụng trong tất cả các loại tình huống hàng ngày, từ đếm các mục đến giao dịch tiền tệ và vô số cách ở giữa. Cuối cùng, chúng ta tìm hiểu về khái niệm số 0 và theo thời gian làm quen với các khái niệm nâng cao hơn như số âm, số phức và biến đại số.

Khả năng thực hiện các phép tính trên các con số mở rộng tiện ích của chúng ngoài việc chỉ đếm các thứ. Các tính toán dựa trên giao dịch đơn giản sử dụng phép cộng và phép trừ; phép nhân và chia có thể được tận dụng để tăng tốc độ tính toán số học cơ bản; và cuối cùng là các phương trình và thuật toán phức tạp có thể giúp giải các ẩn số.

Con người có thể dễ dàng hiểu được những con số và toán học cơ bản, nhưng làm thế nào một cỗ máy có thể làm được tất cả những điều này, và có khả năng, thậm chí còn làm được nhanh hơn cả con người? Chà, đây chính xác là câu hỏi mà Gottried Lebniz sẽ dành cả đời để cố gắng trả lời, vào những năm 1600.

Leibniz (1646-1716) là một học giả người Đức, hoạt động trong lĩnh vực luật, triết học, toán học, ngôn ngữ, khoa học và thần học. Trong lĩnh vực toán học, ông nổi tiếng nhất với phát minh độc lập về phép tính cùng với Isaac Newton. Phát minh của ông về số học nhị phân và ký hiệu thập lục phân sẽ không được chú ý trong nhiều thế kỷ, cho đến khi cuối cùng nó dẫn đến nền tảng của thế giới điện toán và truyền thông kỹ thuật số ngày nay.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Khi không phát minh ra phép tính hoặc không tập trung vào nhiều nỗ lực trí tuệ của mình, Leibniz tập trung vào việc tìm ra cách thực hiện các phép tính một cách nhanh chóng. Anh ấy không muốn “lãng phí” thời gian để thực hiện các phép toán “đơn giản” như cộng và trừ, và tin chắc rằng phải có một cách để chắt lọc thông tin thành một dạng rất cơ bản để giải toán nhanh.

Là một người sùng đạo sâu sắc sống ở Đế chế La Mã thần thánh, Leibniz tin rằng các con số và toán học được thần thánh truyền cảm hứng, và bắt đầu tìm cách kết nối cả hai. Lần đầu tiên ông phát triển một hệ thống số vào năm 1679 trong một bản thảo có tên là “On the Binary Progression” để biểu diễn các số chỉ sử dụng các số 0 và 1. Mặc dù anh ấy có thể biểu diễn các số theo cách “đơn giản” bằng cách sử dụng ký hiệu nhị phân, nhưng anh ấy nhận thấy các phép tính nhị phân “dài hơn, mặc dù dễ dàng hơn”. Chuyển nhanh sang thế kỷ 20, và điều này thực sự sẽ trở thành đối tượng thuê cơ bản cho máy tính nhị phân.

Về mặt kỹ thuật, Leibniz đã nghĩ ra một cách để biểu diễn bất kỳ số thập phân nào (nghĩa là số cơ số 10 mà con người thường sử dụng) dưới dạng số nhị phân (cơ số 2), trong đó mỗi bit biểu thị lũy thừa của hai.

Ví dụ: số thập phân 5 có thể được biểu thị dưới dạng nhị phân là 101, với bit ngoài cùng bên phải biểu thị 2^0 (= 1), bit ở giữa biểu thị 2^1 (= 2) và bit ngoài cùng bên trái biểu thị 2^2 (= 4).

Sử dụng công thức này, bạn có thể biểu thị bất kỳ số thập phân nào, như bảng trên cho thấy. Hơn nữa, bạn có thể giới thiệu một điểm nhị phân (không thể chỉ gọi chúng là điểm thập phân bây giờ, phải không?) và biểu diễn các phân số. Về mặt toán học, điều này sẽ giống như tăng giá trị số mũ âm. Số thập phân 0,6875 có thể được biểu thị ở dạng nhị phân là 0,1011, với bit ngoài cùng bên phải trong trường hợp biểu thị 2^-4 (= 0,0625).

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Leibniz đã xem xét lại các số nhị phân khoảng 20 năm sau, vào năm 1697, trong một cuộc thảo luận với Công tước Rudolph của Brunswick và Luneburg, người đã tạo ra mối liên hệ giữa các số nhị phân và khái niệm về sự sáng tạo ex nihilo , theo đó mọi thứ được tạo ra từ hư không bởi một Chúa. Quá phấn khích trước phát hiện này (thậm chí còn có thêm “bằng chứng” về sự biểu thị thiêng liêng của các con số từ các nhà truyền giáo Cơ đốc giáo ở Trung Quốc khi tìm hiểu về bản chất nhị phân của Âm và Dương), Leibniz đã dành phần đời còn lại của mình để thuyết phục công chúng về khám phá của mình.

Đọc thêm:  Nvidia DLSS 3: Khung giả hay Lợi nhuận lớn?

Mặc dù mối liên hệ thần học của ông không bao giờ được dư luận chú ý, nhưng ông đã phát hành nhiều bản viết tay về các hiện tượng thú vị khi sử dụng hệ nhị phân để biểu diễn các số tự nhiên.

Ví dụ, Leibniz lưu ý một tính chất thú vị của cấp số nhân (ví dụ: 1, 2, 4, 8, 16, 32, …) là trung tâm của số nhị phân, cụ thể là tổng của ba số hạng liên tiếp bất kỳ là luôn chia hết cho 7. Điều này, cùng với vô số khám phá “ngẫu nhiên” mà Leibniz tình cờ gặp, đã giúp thuyết phục ông về tầm quan trọng của biểu diễn nhị phân, nhưng nó chưa bao giờ thực sự trở thành một cách để giải toán thực sự cho đến thế kỷ 20 và thế kỷ XX. cuộc cách mạng kỹ thuật số vấp phải nó.

Trong những năm này, Leibniz cũng nghĩ về các định dạng số khác như cơ số 12 và 16, trong nỗ lực giải quyết bản chất “dài hơn, mặc dù dễ dàng hơn” của nhị phân, về mặt toán học. Khám phá về hệ thập lục phân của ông là người đầu tiên giới thiệu các chữ cái a, b, c, d, e và f để đại diện cho 10, 11, 12, 13, 14 và 15 mà ngày nay chúng ta thấy trong nhiều ứng dụng.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Để tóm tắt nhanh, cách sử dụng số “tự nhiên” của chúng tôi trong các tương tác hàng ngày sử dụng cơ số 10. Điều này về cơ bản có nghĩa là chúng tôi có 10 ký hiệu (0, 1, 2, …, 8 và 9) và một khi chúng tôi dùng hết của các ký hiệu, chúng tôi sử dụng lại các ký hiệu ở “địa điểm” tiếp theo để tiếp tục đếm. Với phương pháp này, chúng tôi có thể mã hóa bất kỳ giá trị tùy ý nào bằng cách sử dụng tập hợp các ký hiệu được xác định trước.

Trong hệ nhị phân, chỉ tồn tại hai ký hiệu: 0 và 1. Mặt khác, phương pháp giữ nguyên đối với hệ thập phân: 0 được mã hóa thành 0, 1 được mã hóa thành 1 và sau đó 2 được mã hóa thành 10 (vì chúng ta ” hết” các biểu tượng). Như Leibniz đã nói, điều này rất đơn giản về mặt kỹ thuật, nhưng sẽ dẫn đến nhiều “chữ số” hơn cho các số. Tuy nhiên, trước khi phát minh ra bóng bán dẫn trong thế kỷ 20, hệ thống nhị phân tự nhiên có bản chất bật/tắt của một công tắc.

Mặc dù việc chuyển đổi các số giữa số thập phân và số nhị phân không quá phức tạp, nhưng việc thực hiện các phép tính ở dạng nhị phân (đối với con người) có thể hơi khó sử dụng và dễ bị lỗi do định dạng mã hóa có nhiều chữ số. Toàn bộ lĩnh vực giao thoa giữa toán học và khoa học máy tính đã được tạo ra để nắm bắt tốt hơn bản chất của điện toán với số 0 và số 1.

Trong khi Leibniz có thể đã đưa ra khái niệm về số nhị phân, George Boole (sau đó được đặt tên là Đại số Boolean) đã chính thức hóa cách tính toán có thể được thực hiện chỉ bằng các số 0 và 1. Hãy coi đây là “khám phá” về cách thực hiện phép nhân dài (để đạt hiệu quả) sau khi tìm hiểu về phép cộng lặp lại, cho phép khái quát hóa và khả năng mở rộng của các số nhị phân.

Năm 1847, Boole đã xuất bản một bài báo có tên “Phân tích toán học của logic”, mô tả cách tiếp cận BẬT-TẮT có thể hình thành ba phép toán cơ bản nhất trong logic kỹ thuật số: AND, OR và NOT. Chỉ với ba thao tác này, toán tử Boolean cho phép nền tảng sử dụng hệ nhị phân để xử lý thông tin. Ngày nay, chúng ta tìm thấy ba toán tử này ở khắp mọi nơi bên trong các máy kỹ thuật số của mình, về cơ bản tạo thành Đơn vị logic số học (ALU) trong bộ xử lý hiện đại và nhiều hướng dẫn của Kiến trúc tập lệnh (ISA).

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Mặc dù điều này rất tuyệt, nhưng một trong những hạn chế cơ bản của số nhị phân là chúng có thể biểu thị bao nhiêu thông tin?

Hãy giải thích điều này bằng ví dụ: nếu chúng ta có một bit duy nhất, đại diện cho 0 hoặc 1, chúng ta có thể mã hóa tổng cộng 2 thứ khác nhau. Nghĩa là, chúng ta có thể ánh xạ giá trị “0” để biểu thị một đối tượng duy nhất và ánh xạ giá trị “1” cho một đối tượng khác. Tăng số bit lên 2 và bây giờ chúng ta có tổ hợp 00, 01, 10 và 11 hoặc tổng cộng 2^2 = 4 thứ có thể được biểu diễn.

Mẫu này tiếp tục theo cấp số nhân: nếu bạn có 8 bit (hoặc một byte), bạn có thể biểu diễn tối đa 2^8 = 256 thứ duy nhất. Và tất nhiên, với 32 bit, bạn có thể biểu diễn tới 4.294.967.296 thứ duy nhất.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Những “thứ” này là gì? Chà, trong lĩnh vực số, điều đó có nghĩa là bạn “chỉ” có thể biểu thị hơn 4 tỷ số duy nhất một chút với 32 bit. Hạn chế này biến thành một vấn đề phần cứng, vì các con số về cơ bản là vô hạn và vô tận.

Vì vậy, làm cách nào để bạn biểu diễn một tập hợp số vô hạn (bao gồm số nguyên, phân số, số âm và có lẽ là các số “đặc biệt” như vô hạn) một cách hiệu quả trong phần cứng? Đây là ý tưởng cơ bản đằng sau các biểu diễn số phần cứng.

Đọc thêm:  7 ứng dụng miễn phí để cài đặt trên PC Windows mới

Các con số là vô hạn trong tự nhiên. Nói một cách toán học, điều này có nghĩa là không thể biểu diễn trong phần cứng mọi số đơn lẻ từ số mũ lớn nhất đến số thập phân nhỏ nhất. Vì vậy, một câu hỏi thiết yếu mà một nhà thiết kế bộ xử lý cần phải giải quyết là “Phần cứng có thể/nên hỗ trợ những con số nào ?”

Từ góc độ lý thuyết thông tin, câu hỏi liên quan chặt chẽ về “Có bao nhiêu số có thể được biểu diễn?” được gắn với số lượng bit có sẵn. Đây là một câu hỏi thực tế mà nhà thiết kế có thể trả lời, đặc biệt là trong những ngày đầu của bộ vi xử lý khi tài nguyên ở mức cao.

Quay trở lại ví dụ của chúng tôi ở trên: giả sử bạn chọn biểu diễn các số bằng 8 bit. Điều đó có nghĩa là bạn có thể đại diện cho tối đa 2^8 số duy nhất hoặc 256 số. Số hai trăm năm mươi sáu mà bạn chọn đại diện là một câu hỏi khác.

Hơn nữa, bạn làm gì với các điểm cuối? Trong ví dụ trước, bạn chọn đại diện cho 0 hay 1? Bạn không có đủ bit để đại diện cho cả hai! Với 8 bit, bạn có thể biểu thị tối đa 256 giá trị duy nhất từ 0000 0000 đến 1111 1111. Nếu bạn bắt đầu ánh xạ chúng ở 0 (đối với 0000 0000), thì bạn chỉ có thể tăng tới 255/256 = 0,99609375 và bạn không có đại diện dự phòng cho giá trị “1”!

Một thách thức khác là làm thế nào để bạn xử lý các tình huống “kỳ lạ”, chẳng hạn như chia cho số không? Trong phần cứng, bạn có muốn nó được biểu thị là “vô cực” không? Hoặc có thể dành một đại diện bit cho “Không phải là số (NaN)”? Bạn dành chuỗi bit duy nhất nào cho những “bất thường” này?

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Chào mừng bạn đến với thế giới biểu diễn kỹ thuật số của các số, nơi bạn được cung cấp một quỹ bit cố định (ví dụ: 8, 16 hoặc 32) và được giao nhiệm vụ mã hóa các số một cách hiệu quả. Để làm phức tạp thêm vấn đề, trong một bộ xử lý có mục đích chung, bạn không biết ứng dụng nào sẽ chạy trên phần cứng này và cần xử lý tất cả các ngoại lệ và giá trị một cách khéo léo. Bạn làm nghề gì?

Trong những năm 1970 và đầu những năm 1980, điều này đã dẫn đến sự phát triển mạnh mẽ của các định dạng số. Hơn 50 cách thể hiện số khác nhau đã được triển khai trong các thiết kế phần cứng, với các quyết định thiết kế khác nhau dựa trên mục tiêu và nhu cầu của nhà sản xuất.

Điều này gây ra một vấn đề thực sự: hai máy tính có thể thực hiện cùng một phép toán (ví dụ: cộng, phụ, mul, div), nhưng lại tạo ra các kết quả khác nhau! Điều này đặc biệt nghiêm trọng trong các ứng dụng điện toán khoa học, nơi mà sự trôi dạt của các giá trị tính toán có nghĩa là các lỗi nhỏ cuối cùng sẽ kết hợp thành các khác biệt lớn.

Tiêu chuẩn dấu phẩy động IEEE-754 được thành lập vào năm 1985 để giải quyết vấn đề này. Cụ thể, tính di động của mã đã giúp mở ra việc áp dụng tiêu chuẩn này. Ngày nay, miễn là hai máy tính đều tuân thủ IEEE-754, thì phép toán tương tự được đảm bảo dẫn đến cùng một kết quả. (Chúng tôi vẫn chưa đề cập đến kết quả đó sẽ là – và IEEE-754 gần đúng nào sẽ trở thành tiêu chuẩn).

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Kể từ năm 1985, đã có hai lần làm mới định dạng số (vào năm 2008 và 2019) nhằm giải quyết một số lỗi thiết kế và giới thiệu các phần mở rộng khác nhau cho tiêu chuẩn. Các chi tiết của việc làm mới quá kỹ thuật, nhưng bạn có thể xem bài viết Wikipedia để biết chi tiết cụ thể. Ở đây, chúng tôi sẽ chỉ đưa ra tổng quan về các quyết định thiết kế đã được thực hiện cho tiêu chuẩn dấu chấm động và tại sao nó được gọi là dấu chấm động “.

Tiêu chuẩn dấu phẩy động được IEEE chính thức công bố vào năm 1985 và là đứa con tinh thần của William Kahan. Kahan đã giành được giải thưởng Turing danh giá (tương đương với giải thưởng Nobel về điện toán) vài năm sau đó vì những đóng góp của ông với tư cách là “Cha đẻ của dấu chấm động”. Giải thưởng sang một bên, Điểm nổi gì?

Không giống như khái niệm về dấu thập phân cố định , tiêu chuẩn Dấu phẩy động (FP) đã giới thiệu một cách diễn giải lại 32 bit một cách có hệ thống bằng cách cho phép “điểm” giữa toàn bộ phần của một số và phần phân số của một số thay đổi. Tương tự, nó có thể được coi là các ký hiệu khoa học, nhưng với một ràng buộc về số nào có thể biểu thị được trong phần cứng. Sự cân bằng và khác biệt cơ bản giữa định dạng dấu chấm cố định và định dạng dấu phẩy động là phạm viđộ chính xác của các số được biểu diễn.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Hãy xem qua điều này.

Nhớ lại từ phần sơ lược lý thuyết thông tin ở trên rằng với 32 bit, chúng ta có thể biểu diễn chính xác 2^32 = 4.294.967.296 số duy nhất. Định dạng điểm cố định, là cách truyền thống để mã hóa các số ở dạng nhị phân như Leibniz đã hình dung, chỉ có thể biểu thị một tập hợp các giá trị nhất định tùy thuộc vào vị trí của dấu thập phân.

Đọc thêm:  Tại sao xây dựng một PC chơi game ngay bây giờ là một ý tưởng tồi, Phần 2: Giá card đồ họa điên rồ

Ví dụ: giả sử chúng ta phân bổ 1 bit dấu, 15 bit số nguyên và 16 bit phân số (viết tắt là (1, 15, 16) ) như sau:

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Với biểu diễn này, số lớn nhất chúng ta có thể mã hóa là 32767.99998474121 và số nhỏ nhất chúng ta có thể mã hóa là -32768. Ngoài ra, có một số số nhất định trong phạm vi này không thể biểu thị được. Ví dụ: nếu chúng tôi muốn mã hóa 21845.33333333, chúng tôi thấy rằng 32 bit không cho phép điều đó. Nếu chúng tôi muốn sử dụng số này trên một máy có sơ đồ điểm cố định (1, 15, 16), chúng tôi sẽ phải làm tròn nó thành một thứ gì đó – ví dụ: phần phân số sẽ được biểu thị bằng .3333282470703125 là “hợp pháp” gần nhất giá trị. Và trong thời kỳ miền Tây hoang dã của các định dạng số, nhà thiết kế phần cứng thực sự phải tìm ra cách thức và thời điểm làm tròn.

Một giải pháp là chúng ta có thể di chuyển dấu thập phân và thay đổi cách triển khai của mình, có thể thành (1, 7, 24) hoặc 1 bit dấu, 7 bit nguyên và 24 bit phân số. Nhưng điều đó tạo ra một vấn đề mới: bằng cách tăng độ chính xác, chúng tôi phải giảm phạm vi các số có thể được biểu diễn. Với phân bổ bit (1, 7, 24), phạm vi của chúng tôi hiện chỉ đi từ 127,99999994039536 đến -128. Giá trị của 21845 thậm chí không gần được đại diện!

Về cơ bản, đây là vấn đề với việc sử dụng các biểu diễn số điểm cố định và trước tiêu chuẩn năm 1985, mọi nhà cung cấp phần cứng về cơ bản sẽ chọn bất kỳ phạm vi và độ chính xác nào mà họ cho là hữu ích cho các ứng dụng của mình. Cũng đề cập đến vấn đề làm tròn và chúng ta có thể chắc chắn rằng không phải tất cả các triển khai số 32 bit đều giống nhau.

Thay vì tuân theo biểu diễn nhị phân cơ bản, tiêu chuẩn Dấu phẩy động đã chọn cấu trúc dữ liệu phần cứng thay thế để giải quyết vấn đề này. Thay vì phân bổ 32 bit thành các phần nguyên và phân số (điều này trực quan đối với con người), tiêu chuẩn FP sử dụng vùng số mũphần định trị để mã hóa số.

Để thực hiện điều này, cần có phần cứng bổ sung để diễn giải lại 32 bit, như minh họa bên dưới. Một bit được dành riêng cho dấu (+1 hoặc -1), 8 bit được phân bổ cho số mũ và 23 bit được sử dụng cho phần định trị. Sau đó, bạn có thể chỉ cần cắm các giá trị vào công thức sau (trong đó độ lệch được đặt thành 127) và nhận giá trị từ 32 bit của 0 và 1.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Ý tưởng là giờ đây bạn có thể biểu diễn các số theo các bậc độ lớn lớn và nhỏ thông qua số mũ, sau đó có đủ bit (phần định trị) để có độ phân giải cao ở các độ lớn cụ thể đó. Dấu phẩy động (để khái quát hóa ngoài dấu thập phân hoặc dấu nhị phân) sẽ điều chỉnh theo độ lớn của một số số nhất định bằng cách sử dụng phép lũy thừa và phần định trị có thể tập trung vào số mong muốn trong vùng đó.

Nhớ lại cuộc thảo luận về độ chính xác so với phạm vi? Đây là nơi nó thể hiện: trong tiêu chuẩn IEEE-754, các số gần 0 có độ chính xác cao hơn nhiều so với các số ở xa 0 hơn. Điều đó nói rằng, bạn vẫn có thể biểu thị các số rất lớn và rất nhỏ (nghĩa là một phạm vi lớn ) vì bạn có 2^8 hoặc 256 giá trị số mũ có thể biểu thị khác nhau (tốt, không chính xác là 256, nhưng chúng tôi đang tiến tới điều đó).

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Hãy kết hợp tất cả lại với nhau! Làm thế nào chúng ta sẽ đại diện cho 5 trong IEEE-754?

Bit dấu là 0, vì đây là một số dương. Đối với vùng số mũ, chúng ta cần đạt đến lũy thừa gần nhất của 2, tức là 4 hoặc 2^(2). Vì có độ lệch ngầm định là 127 trong công thức nên chúng ta cần số mũ là 129 hoặc 10000001. Với điều đó, 129 – 127 = 2.

Cuối cùng, chúng ta cần 2^(2) x phần định trị bằng 5, vì vậy phần định trị cần mã hóa 5/4 hoặc 1,25. 1 được ngụ ý, để lại cho chúng tôi 010 0000 0000 0000 0000 0000. Biểu diễn 32 bit cuối cùng của chúng tôi là 0100 0000 1010 0000 0000 0000 0000 0000.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Đó là nó!

Ok, điều đó không đơn giản như ai đó nghĩ. Nhưng, giống như Leibniz đã đề xuất hơn 400 năm trước, điều này khá dễ dàng đối với máy tính và giờ đây chúng ta có thể biểu diễn nhiều số hơn với 32 bit so với khả năng trước đây bằng sơ đồ điểm cố định.

Để tiết kiệm thời gian cho bạn, đây là một máy tính tiện dụng để chơi xung quanh với các số dấu phẩy động.

Mặc dù về mặt kỹ thuật, số mũ cho phép có tới 2^8 hoặc 256 cách biểu diễn khác nhau, nhưng có một vài số đặc biệt dành riêng cho các số “khác”. Cụ thể, nếu tất cả các bit được đặt thành 1 (ví dụ: 1111 1111), thì số đặc biệt này biểu thị vô cùng nếu tất cả các bit phần định trị được đặt thành 0. Nếu các bit phần định trị là bất kỳ thứ gì khác 0, thì biểu diễn bit sẽ mã hóa “NaN “, hoặc “Không phải là số”. Điều này thường được sử dụng như một cách để báo hiệu một số lỗi nhất định trong phần cứng, trong đó các tính toán không mong muốn (chẳng hạn như chia cho 0) có thể được xác định khi vô cực hoặc NaN bật lên.

Đọc thêm:  Màn hình 4K: Bạn có thực sự thấy sự khác biệt không?

Tương tự, nếu tất cả các giá trị là 0 (ví dụ: 0000 0000), thì các bit định trị được hiểu là các số phụ. Trong hầu hết các biểu diễn số dấu phẩy động, các số bình thường được biểu diễn bằng một phần định trị khác không và một số mũ nằm trong một phạm vi cụ thể. Ngược lại, các số không bình thường có phần định trị không được chuẩn hóa, nghĩa là bit đầu của phần định trị bằng 0 và số mũ được đặt thành giá trị có thể biểu thị tối thiểu. Điều này cho phép các số không bình thường biểu thị các giá trị rất nhỏ với độ chính xác hạn chế.

Sau khi giới thiệu tiêu chuẩn, ngành công nghiệp điện toán hầu như đã áp dụng IEEE-754 làm đại diện định dạng số cho phần cứng. Không có thay đổi lớn hoặc thiết kế đáng chú ý nào xảy ra trong những năm này.

Có lẽ mục tin tức liên quan đến định dạng số đáng chú ý nhất là lỗi phân chia dấu chấm động năm 1994 của Intel, khiến công ty phải trả gần nửa tỷ đô la để giải quyết. Đây là một vấn đề triển khai trong bộ xử lý Pentium. Mặc dù Intel tuyên bố tuân thủ IEEE-754, một thiết kế bị lỗi đã dẫn đến lỗi tính toán trong hoạt động phân chia, điều này (như đã đề cập trước đó) gây ra sự cố trôi dạt tính toán.

Bên cạnh đó, nhiều câu chuyện cười và meme giữa những người hành nghề khoa học máy tính đã nảy sinh trong thời gian này. Mặc dù là một tiêu chuẩn, vẫn/vẫn khó hiểu rằng một phép toán có thể cho kết quả khác với những gì con người mong đợi, nhưng phần cứng vẫn có thể hoàn toàn tuân thủ theo tiêu chuẩn (!).

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Tuy nhiên, trong thập kỷ qua, việc tiêu chuẩn hóa các định dạng số đã gặp phải một trở ngại lớn. Sự trỗi dậy của deep learning với tư cách là một miền ứng dụng đang hồi sinh đã dẫn đến việc suy nghĩ lại về cách các con số nên được biểu diễn trong phần cứng.

Rất ít người tìm hiểu về tiêu chuẩn IEEE-754 trong gần 30 năm. Và tại sao họ lại làm như vậy: nó đã giải quyết được một trong những vấn đề lớn nhất của điện toán thời kỳ đầu: tính di động. Nghĩa là, bất kỳ bộ xử lý nào tuân thủ IEEE-754 và được triển khai chính xác sẽ có cùng kết quả bằng số từ máy tính này sang máy tính tiếp theo. Điều này cho phép đóng gói các ứng dụng dễ dàng hơn và duy trì tính nhất quán trong các máy trên toàn thế giới.

Điều đó đã thay đổi gần như vào khoảng năm 2012, khi các mạng lưới thần kinh sâu (DNN) gây bão trên toàn thế giới. Đặc biệt, một sinh viên tốt nghiệp tại Đại học Toronto tên là Alex Krizhevsky đã sử dụng GPU Nvidia chơi game của mình để tăng tốc đào tạo mạng thần kinh và giành chiến thắng trong thử thách phân loại hình ảnh ImageNet. Kể từ đó, các công ty đã tranh nhau áp dụng trí tuệ nhân tạo trong vô số ứng dụng và đặc biệt là các công ty phần cứng quan tâm đến việc tối đa hóa hiệu suất của DNN.

Đặc biệt, các công ty như Nvidia, AMD, Intel và Google đã bắt đầu suy nghĩ lại về cách thể hiện các con số trong phần cứng. Cái nhìn sâu sắc là nếu có thông tin về ứng dụng đang chạy trên phần cứng, bạn có thể tối ưu hóa đáng kể phần cứng thay vì dựa vào các bộ xử lý có mục đích chung. Và một tối ưu hóa phần cứng cụ thể là thay đổi độ chính xác và phạm vi số cho DNN.

Hóa ra, DNN không cần 32 bit đầy đủ để biểu thị các giá trị điển hình được quan sát trong quá trình đào tạo hoặc suy luận. Hơn nữa, làm tròn thường được chấp nhận ở một mức độ nào đó (miễn là các giá trị không giảm xuống 0 trong quá trình đào tạo DNN). Sau đó, một tối ưu hóa hợp lý là giảm số lượng bit lũy thừa và bit định trị. May mắn thay, đã tồn tại một sự tối ưu hóa như vậy trong tiêu chuẩn IEEE-754, được gọi là Half Float.

Half Float chính xác là: 16 bit thay vì 32 bit. Hơn nữa, việc phân bổ số mũ và phần định trị cũng bị giảm: các bit số mũ giảm xuống 5 và các bit phần định trị giảm xuống 10.

Việc tối ưu hóa đơn giản này thường có thể tăng gấp đôi hiệu suất của bạn, vì giờ đây cần ít bit hơn để tính toán và một số bit phải được xáo trộn giữa bộ nhớ và bộ nhớ.

Tuy nhiên, từ góc độ ứng dụng, ít bit hơn đã làm giảm độ chính xác của DNN. Đối với một số miền ứng dụng quan trọng về an toàn, chẳng hạn như ô tô tự lái, việc giảm độ chính xác đó có thể không xứng đáng với hiệu suất tốt hơn. Những gì khác có thể được thực hiện?

Chà, ai nói 16 bit cần tuân theo tiêu chuẩn IEEE-754 ở định dạng (1, 5, 10)? Và đây là lúc các công ty bắt đầu chịu trách nhiệm và triển khai lại các định dạng số, nhằm cố gắng cân bằng giữa hiệu suất và độ chính xác.

Google là người đầu tiên. Họ đã sử dụng định dạng (1, 8, 7), đưa ra nhiều bit hơn về phía số mũ (ảnh hưởng đến phạm vi số có thể biểu thị) với chi phí chính xác bằng số. Nhìn nó từ một góc độ khác, định dạng này bắt chước phạm vi của FP32 đầy đủ, nhưng cắt giảm các bit lớp phủ, có thể được coi là không cần thiết cho ứng dụng này. Ra đời từ Google Brain, họ đã khéo léo đặt tên cho định dạng mới này là Brain Float, hay viết tắt là BFloat.

Đọc thêm:  Câu chuyện đằng sau ngôi nhà của trò chơi điện tử bị lãng quên

BFloat đã làm rất tốt, đặc biệt là trong quá trình đào tạo DNN khi các giá trị rất gần 0 và cần được biểu diễn. Các định dạng số khác đã sớm được các công ty khác theo sau, bao gồm IBM, Nvidia và AMD.

Định dạng 16 bit của IBM, được gọi là DeepFloat, phân bổ 6 bit cho số mũ và 9 bit cho phần định trị (1, 6, 9). Nvidia đã sử dụng một định dạng 20 bit thú vị có tên là TensorFloat32 (vì nó có mục đích đạt được độ chính xác của FP32 chỉ với 20 bit), gán 8 bit lũy thừa và 11 bit định trị (1, 8, 11). AMD tiến xa hơn một chút, phát triển AMD FP24, một định dạng có 7 bit lũy thừa và 16 bit cho phần định trị.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Mặc dù vậy, về cơ bản, tất cả các định dạng này không khác biệt quá nhiều so với tiêu chuẩn IEEE-754, về cách diễn giải các giá trị. Điều đã thay đổi là phạm vi và độ chính xác của các con số có thể đạt được như thế nào, như là một hàm của số lượng bit lũy thừa và phần định trị.

Trong một nỗ lực gần đây nhằm “tiêu chuẩn hóa” các định dạng số giữa các công ty, Nvidia, Arm và Intel đã đưa ra một tiêu chuẩn mới cho FP8, một định dạng số 8 bit. FP8 thú vị hơn một chút so với các định dạng đã đề cập trước đó, bởi vì nó thực sự là 2 định dạng cơ bản: cấu hình (1,5,2) và cấu hình (1,4,3). Ý tưởng là để tuân thủ tiêu chuẩn này, phần cứng sẽ có thể chuyển đổi giữa và cho phép cả hai định dạng số hoạt động, có tính đến tính di động.

Tại sao chỉ dừng lại ở việc thay đổi ý nghĩa của các con số trong phần cứng? Điều gì sẽ xảy ra nếu bạn có thể thực hiện một số thay đổi về phần cứng để giúp mọi thứ chạy nhanh hơn?

Đây là con đường mà Microsoft đã thực hiện với Block Float. Trực giác đằng sau Block Float là trong nhiều ứng dụng DNN, nhiều giá trị thực sự có cùng giá trị số mũ, nhưng khác nhau về giá trị định trị của chúng. Nói cách khác, các giá trị không trải rộng trên một phạm vi rộng. Vì vậy, tại sao không trích xuất các bit lũy thừa và chia sẻ chúng trên một loạt các giá trị và chỉ lưu trữ các bit định trị?

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Hình trên minh họa cách khối float hoạt động. Tùy thuộc vào độ lớn của một khối (chẳng hạn như 8, 16, 32 giá trị), bạn có thể tiết kiệm đáng kể dung lượng lưu trữ và băng thông liên lạc bằng cách xáo trộn ít bit hơn xung quanh. Cần một chút thông minh để tìm ra mức độ chi tiết phù hợp cho chia sẻ số mũ và bạn có thể cần một thanh ghi chuyên dụng (hoặc một vài) trong phần cứng để hỗ trợ nhiều khối đồng thời, nhưng lợi ích hiệu suất tự nói lên điều đó.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Đáng ngạc nhiên là khái niệm Block Float thực sự xuất hiện vào những năm 1970, trong thời kỳ Miền Tây hoang dã của các định dạng số. Sự hồi sinh của nó ngày nay chủ yếu liên quan đến việc tối ưu hóa phần cứng dành riêng cho miền, nhắm mục tiêu vào AI. Bằng cách biết một chút gì đó về chương trình đang chạy (nghĩa là các giá trị đó thường hoạt động trong cùng một phạm vi giá trị), bạn có thể thực hiện tối ưu hóa tập trung vào phần cứng để tăng tốc hiệu suất.

Một định dạng số thú vị khác mới xuất hiện gần đây được gọi là AdaptivFloat. Định dạng số này đến từ một phòng thí nghiệm nghiên cứu của Harvard vào năm 2020 và được Tesla áp dụng độc lập cho kiến trúc Dojo của họ, được gọi là CFloat.

Ý tưởng cơ bản đằng sau AdaptivFloat là giới thiệu một định dạng số có thể tự động thích ứng với các giá trị trong mỗi lớp của DNN. Các giá trị trong một lớp thường không trải rộng trong phạm vi rộng, nhưng giữa các lớp, chúng có thể khác nhau. Do đó, việc điều chỉnh biểu diễn số trong phần cứng thành các giá trị phần mềm một cách hiệu quả sẽ mang lại hiệu suất tốt nhất cho cả hai thế giới (thông qua băng thông bit ngắn hơn) và độ chính xác (bằng cách trung thực hơn với độ chính xác của số).

Làm thế nào để AdaptivFloat thực hiện điều đó? Bằng cách thay đổi thích ứng độ lệch số mũ trong tiêu chuẩn dấu phẩy động. Hãy nhớ lại rằng ở định dạng IEEE-754, có một độ lệch ngầm định là 127 được áp dụng cho các giá trị số mũ. Điều này cũng xuất hiện trong công thức, trong đó giá trị số mũ được biểu thị ở dạng nhị phân cần được trừ đi 127, sau đó giá trị này được sử dụng cho số mũ.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Điều gì xảy ra nếu bạn thay đổi 127 ẩn thành 125? Về cơ bản, bạn di chuyển dấu phẩy động sang một phạm vi giá trị khác, vì số mũ đã thay đổi (trong hình trên, ExpBias sẽ là -2). Theo trực giác, AdaptivFloat điều khiển phạm vi động của các giá trị ở mức độ chi tiết của lớp, sử dụng chi phí phần cứng tối thiểu để thay đổi độ lệch số mũ. Do đó, bằng cách thêm một thanh ghi đơn giản để bù đắp và thích ứng với các số bạn muốn biểu thị, ít nhiều bạn có thể giữ lại nhiều phần cứng giống nhau, nhưng thay đổi phạm vi động.

Đọc thêm:  Khởi động kép: Windows và Ubuntu

AdaptivFloat là một thủ thuật phần cứng nhỏ thông minh chắc chắn lấy cảm hứng từ ứng dụng. Bằng cách giải nén tiêu chuẩn IEEE-754 và thay đổi các giả định cơ bản (trong trường hợp này là sai lệch số mũ ngầm), AdaptivFloat cho thấy cả độ chính xác và hiệu suất tốt so với Block Float và các định dạng số khác, như đã khám phá trong tài liệu nghiên cứu. Hơn nữa, nó có thể được kết hợp với các phân bổ bit khác (chẳng hạn như, nên sử dụng bao nhiêu bit số mũ và phần định trị?), dẫn đến các phiên bản khác nhau như CFloat16 và CFloat8, được Tesla sử dụng.

Định dạng số cuối cùng chúng tôi trình bày là vị trí. Các vị trí thực sự không lấy cảm hứng từ DNN và khái niệm này đã được phát triển trong một vài năm như một giải pháp thay thế dấu phẩy động. Ưu điểm chính của chúng là chúng có thể tạo ra dải động thậm chí còn lớn hơn so với dấu phẩy động, đối với một băng thông nhất định.

svg+xml,%3Csvg%20xmlns= Người giải thích: Biểu diễn số trong phần cứng máy tính

Một trong những tính năng chính của định dạng posit là việc sử dụng “số mũ có độ dài thay đổi” cho phép biểu diễn các số nhỏ hiệu quả hơn và dải động rộng hơn so với các định dạng điểm cố định. Ngoài ra, định dạng posit có nền tảng toán học chặt chẽ và được xác định rõ ràng, khiến nó rất phù hợp để sử dụng trong các ứng dụng khoa học và kỹ thuật.

So với tiêu chuẩn FP32 truyền thống, các vị trí có thêm một trường cho chế độ. Các bit chế độ được sử dụng để xác định độ lớn của một số và để phân biệt giữa các phạm vi giá trị khác nhau.

Ở định dạng xác định, các bit chế độ được sử dụng để chỉ định vị trí của bit khác không quan trọng nhất của số, xác định độ lớn của số. Số lượng bit chế độ được sử dụng có thể khác nhau tùy thuộc vào cách triển khai cụ thể, nhưng thường nằm trong khoảng từ 1 đến 3 bit. Giá trị của các bit chế độ xác định phạm vi của số và vị trí của trường số mũ trong mã hóa tổng thể.

Các bit chế độ là một phần quan trọng của định dạng vị trí, vì chúng cho phép biểu diễn các số nhỏ hiệu quả hơn và dải động rộng hơn so với các định dạng điểm cố định truyền thống. Chúng cũng đóng một vai trò quan trọng đối với độ chính xác và hiệu suất của các phép toán số học được thực hiện ở định dạng xác thực.

Vị trí cho thấy tiềm năng to lớn, đặc biệt là trong các ứng dụng máy tính khoa học. Mặc dù vậy, họ vẫn chưa phát triển hoàn toàn về phần cứng, chủ yếu là do cần phải có một cơn địa chấn nào đó xảy ra để thuyết phục các nhà cung cấp rời bỏ tiêu chuẩn IEEE. Tuy nhiên, nó đưa ra một giải pháp thay thế cho dấu phẩy động và nhiều công ty phần cứng đang giữ nó trong tầm ngắm của họ.

Ai có thể nghĩ rằng các biểu diễn số trong phần cứng lại có thể đa dạng đến vậy và được những người chơi lớn trong ngành xem xét lại ngày nay? Cuộc cách mạng trí tuệ nhân tạo chắc chắn xứng đáng nhận được rất nhiều tín nhiệm cho sự thay đổi gần đây này, nhưng cũng là lợi nhuận giảm dần của định luật Moore và quy mô của Dennard, vốn đòi hỏi sự khéo léo hơn về mặt kiến trúc để tận dụng tối đa hiệu năng của phần cứng.

Ngoài các cải tiến về hiệu suất thời gian chạy và độ chính xác của DNN, một vấn đề quan trọng khác gần đây đã được đưa ra là độ tin cậy của các định dạng số mới trong bối cảnh đảo lộn một bit. Google và Meta gần đây đã đưa ra lời kêu gọi hành động từ các công ty phần cứng để xem xét các lỗi ngẫu nhiên trong trung tâm dữ liệu của họ, bắt nguồn từ quá trình sản xuất và lỗi lật bit tạm thời. Với rất nhiều định dạng số mới được giới thiệu, nó đặt ra câu hỏi bit nào dễ bị tổn thương nhất và liệu một số định dạng số nhất định (chẳng hạn như AdaptivFloat) có mạnh mẽ hơn trước tác động của việc lật bit do triển khai chúng hay không.

Tác động đến tính di động của mã cũng sẽ rất thú vị để theo dõi. Toàn bộ quan điểm của IEEE-754 là chính thức hóa và tiêu chuẩn hóa những gì mong đợi khi một đoạn mã được chạy trên các thiết bị phần cứng khác nhau. Với AI, người ta khẳng định rằng tồn tại một số điểm mờ trong tính toán có thể bị lợi dụng để tăng hiệu suất, và do đó dẫn đến nhiều cách diễn giải lại tiêu chuẩn. Điều này sẽ tác động như thế nào đến thiết kế bộ xử lý và máy gia tốc trong tương lai?

Nhưng bên cạnh các xu hướng thiết kế gần đây cho các biểu diễn số trong phần cứng, vẫn còn là một điều ngạc nhiên khi thấy mọi thứ đã thay đổi nhiều như thế nào kể từ khi Leibniz say mê cách làm toán “nhanh”. Và sẽ rất thú vị để xem mọi thứ sẽ đưa chúng ta đến đâu trong 10-15 năm tới trong lĩnh vực này.

Có gì trong một số? Chà, chắc chắn là nhiều hơn những gì xuất hiện ở mệnh giá.