You are on page 1of 1412

Ca ngợi Tổ chức và thiết kế máy tính: Phần cứng / Giao diện phần

mềm, Phiên bản thứ sáu

Lựa chọn sách giáo khoa thường là một hành động bực bội của sư phạm, phạm vi
bảo hiểm nội dung, chất lượng giải trình, mức độ nghiêm ngặt, chi phí. Tổ chức
máy tính và Thiết kế là cuốn sách hiếm hoi đánh tất cả các ghi chú đúng trên
bảng, mà không có thỏa hiệp. Nó không chỉ là sách giáo khoa tổ chức máy tính
hàng đầu, nó là một ví dụ sáng chói về tất cả những gì sách giáo khoa khoa học
máy tính có thể và nên có.Giáo dục
CẩuMichael Goldweber , Đại học Xavier

Tôi đã sử dụng Tổ chức và thiết kế máy tính trong nhiều năm, từ phiên bản đầu
tiên. Phiên bản mới này là một cải tiến nổi bật khác trên một văn bản đã cổ điển.
Sự phát triển từ máy tính để bàn sang điện toán di động sang Dữ liệu lớn mang
đến phạm vi phủ sóng mới của các bộ xử lý nhúng như ARM, tài liệu mới về cách
phần mềm và phần cứng tương tác để tăng hiệu suất và điện toán đám mây. Tất cả
điều này mà không hy sinh các nguyên tắc cơ bản.Giáo dục
Giáo sư Harcourt , Thánh. Đại học Lawrence

Đến Millennials : Tổ chức và thiết kế máy tính là cuốn sách kiến trúc máy tính
bạn nên giữ trên giá sách (ảo) của bạn. Cuốn sách vừa cũ vừa mới, bởi vì nó phát
triển các nguyên tắc đáng kính, Luật Moore Moore, trừu tượng, trường hợp
chung nhanh, dư thừa, phân cấp bộ nhớ, song song và đường ống nhưng minh
họa chúng với các thiết kế đương đại.Giáo dục
Đồi D. Hill , Đại học Wisconsin-Madison

Phiên bản mới của Tổ chức và thiết kế máy tính theo kịp những tiến bộ trong các hệ
thống nhúng và nhiều lõi (GPU) mới nổi, nơi máy tính bảng và điện thoại thông minh
sẽ / nhanh chóng trở thành máy tính để bàn mới của chúng tôi. Văn bản này thừa nhận
những thay đổi này, nhưng vẫn tiếp tục cung cấp một nền tảng phong phú về các
nguyên tắc cơ bản trong tổ chức và thiết kế máy tính sẽ cần thiết cho các nhà thiết kế
phần cứng và phần mềm cung cấp năng lượng cho loại thiết bị và hệ thống mới
này.Giáo dục
CẩuDave Kaeli , Đại học Đông Bắc

CúcTổ chức và thiết kế máy tính cung cấp nhiều hơn một giới thiệu về kiến trúc máy
tính. Nó chuẩn bị cho người đọc những thay đổi cần thiết để đáp ứng nhu cầu hiệu
suất ngày càng tăng của các hệ thống di động và xử lý dữ liệu lớn tại thời điểm khó
khăn trong việc nhân rộng chất bán dẫn đang khiến tất cả các hệ thống bị hạn chế về
sức mạnh. Trong kỷ nguyên mới này về điện toán, phần cứng và phần mềm phải
được đồng thiết kế và kiến trúc cấp hệ thống cũng quan trọng như tối ưu hóa cấp
thành phần.Giáo dục
Giáo sư Kozyrakis , Đại học Stanford
Sau đó, Patterson và Hennessy giải quyết một cách xuất sắc các vấn đề trong kiến trúc
phần cứng máy tính luôn thay đổi, nhấn mạnh vào sự tương tác giữa các thành phần phần
cứng và phần mềm ở các mức độ trừu tượng khác nhau. Bằng cách xen kẽ các khái niệm I
/ O và song song với nhiều cơ chế phần cứng và phần mềm trong suốt cuốn sách, phiên
bản mới đạt được một bản trình bày tổng thể tuyệt vời về kiến trúc máy tính cho thời kỳ
hậu PC. Cuốn sách này là một hướng dẫn thiết yếu cho các chuyên gia phần cứng và phần
mềm đối mặt với các thách thức về hiệu quả năng lượng và song song trong Máy tính
bảng với Điện toán đám mây.Giáo dục
CẩuJae C. Ồ , Đại học Syracuse
R TÔI S C - V E D TÔI T TÔI Ôi N

Tổ chức và thiết kế máy tính


CÁC PHẦN MỀM PHẦN MỀM Giao diện

PHIÊN BẢN THỨ HAI


David A. Patterson đã được giảng dạy kiến trúc máy tính tại Đại học California,
Berkeley, kể từ khi gia nhập khoa vào năm 1977, nơi ông giữ chức Chủ tịch Khoa học
Máy tính Pardee. Giáo lý của ông đã được vinh danh bởi Giải thưởng giảng dạy xuất sắc
từ Đại học California, Giải thưởng Karlstrom từ ACM, và Huy chương Giáo dục Mulligan
và Giải thưởng Giảng dạy Đại học từ IEEE. Patterson đã nhận được Giải thưởng Thành
tựu Kỹ thuật của IEEE và Giải thưởng ACM Eckert-Mauchly cho những đóng góp cho
RISC, và ông đã chia sẻ Giải thưởng lưu trữ thông tin của IEEE Johnson cho những đóng
góp cho RAID. Ông cũng đã chia sẻ Huân chương IEEE John von Neumann và Giải
thưởng C & C với John Hennessy. Giống như đồng tác giả của mình, Patterson là thành
viên của cả hai tổ chức AAAS, Bảo tàng Lịch sử Máy tính, ACM và IEEE, và ông được
bầu vào Học viện Kỹ thuật Quốc gia, Viện Hàn lâm Khoa học Quốc gia và Đại sảnh Danh
vọng Kỹ thuật Thung lũng Silicon. Ông từng là chủ tịch của bộ phận CS trong bộ phận
Berkeley EECS, là chủ tịch của Hiệp hội nghiên cứu máy tính, và là Chủ tịch của ACM.
Kỷ lục này đã dẫn đến Giải thưởng Dịch vụ Xuất sắc từ ACM, CRA, và TÌM KIẾM. Ông
đã nhận được giải thưởng Thành tựu Tapia cho Khoa học công dân và Điện toán đa dạng
hóa và chia sẻ Giải thưởng ACM A. M. Turing 2017 với Hennessy.
Tại Berkeley, Patterson đã lãnh đạo việc thiết kế và triển khai RISC I, có khả năng máy
tính tập lệnh giảm VLSI đầu tiên và nền tảng của kiến trúc SPARC thương mại. Ông là
người lãnh đạo dự án Redundant Array of Inspens Disks (RAID), dẫn đến hệ thống lưu
trữ đáng tin cậy từ nhiều công ty. Ông cũng tham gia vào dự án Mạng lưới máy trạm
(NOW), dẫn đến công nghệ cụm được sử dụng bởi các công ty Internet và sau đó là điện
toán đám mây. Các dự án này đã giành được bốn giải thưởng luận án từ ACM. Năm 2016,
anh trở thành Giáo sư danh dự tại Berkeley và là Kỹ sư xuất sắc tại Google, nơi anh làm
việc về kiến trúc cụ thể tên miền cho học máy. Ông cũng là Phó Chủ tịch của RISC-V
International và Giám đốc Phòng thí nghiệm Nguồn mở Quốc tế RISC-V.
John L. Hennessy là giáo sư kỹ thuật điện và khoa học máy tính tại Đại học
Stanford, nơi ông là thành viên của khoa từ năm 1977 và từ năm 2000 đến 2016, là
Chủ tịch thứ mười của nó. Hennessy là thành viên của IEEE và ACM; một thành
viên của Viện Hàn lâm Kỹ thuật Quốc gia, Viện Hàn lâm Khoa học Quốc gia và
Hiệp hội Triết học Hoa Kỳ; và là thành viên của Viện Hàn lâm Khoa học và Nghệ
thuật Hoa Kỳ. Trong số nhiều giải thưởng của ông có Giải thưởng Eckert-Mauchly
năm 2001 vì những đóng góp của ông cho công nghệ RISC, Giải thưởng Kỹ thuật
Máy tính Seymour Cray năm 2001 và Giải thưởng John von Neumann năm 2000, mà
ông đã chia sẻ với David Patterson. Năm 2017, họ đã chia sẻ Giải thưởng ACM A. M.
Turing. Ông cũng đã nhận được bảy bằng tiến sĩ danh dự.
Năm 1981, ông bắt đầu dự án MIPS tại Stanford với một số ít sinh viên tốt nghiệp. Sau khi
hoàn thành dự án vào năm 1984, anh rời trường đại học để đồng sáng lập MIPS Computer
Systems (nay là MIPS Technologies), công ty đã phát triển một trong những bộ vi xử lý RISC
thương mại đầu tiên. Tính đến năm 2006, hơn 2 tỷ bộ vi xử lý MIPS đã được chuyển đến các
thiết bị khác nhau, từ trò chơi video và máy tính palmtop đến máy in laser và công tắc mạng.
Hennessy sau đó đã lãnh đạo dự án DASH (Giám đốc Kiến trúc cho Bộ nhớ dùng chung), tạo
mẫu cho bộ đa xử lý kết hợp bộ đệm có thể mở rộng đầu tiên; nhiều ý tưởng chính đã được áp
dụng trong bộ đa xử lý hiện đại. Ngoài các hoạt động kỹ thuật và trách nhiệm đại học, ông còn
tiếp tục làm việc với nhiều công ty khởi nghiệp, cả với tư cách là cố vấn giai đoạn đầu và nhà
đầu tư.
Ông hiện là Giám đốc của các học giả Knight-Hennessy và là chủ tịch không điều
hành của Alphabet.
R TÔI S C - V E D TÔI T TÔI Ôi N

Tổ chức và thiết kế máy tính


CÁC PHẦN MỀM PHẦN MỀM Giao diện

PHIÊN BẢN THỨ HAI

David A. Patterson
Đại học California, Berkeley
Google, Inc

John L. Hennessy
Đại học Stanford
Morgan Kaufmann là một dấu ấn của Elsevier
50 Hampshire Street, Tầng 5, Cambridge, MA 02139, Hoa Kỳ

Bản quyền © 2021 Elsevier Inc. Đã đăng ký Bản quyền.


Không có phần nào của ấn phẩm này có thể được sao chép hoặc truyền đi dưới bất kỳ hình thức nào hoặc bằng bất kỳ phương tiện nào,
điện tử hoặc cơ khí, bao gồm sao chụp, ghi âm hoặc bất kỳ hệ thống lưu trữ và truy xuất thông tin nào, mà không được phép viết từ nhà
xuất bản. Chi tiết về cách xin phép, thông tin thêm về các chính sách quyền của Nhà xuất bản và các thỏa thuận của chúng tôi với các tổ
chức như Trung tâm giải phóng mặt bằng bản quyền và Cơ quan cấp phép bản quyền, có thể được tìm thấy tại trang web của chúng tôi :
www.elsevier.com/permissions.
Cuốn sách này và những đóng góp cá nhân có trong nó được Nhà xuất bản bảo vệ theo bản quyền (ngoài những gì có thể được ghi
chú ở đây).
Thông báo
Kiến thức và thực hành tốt nhất trong lĩnh vực này liên tục thay đổi. Khi nghiên cứu và kinh nghiệm mới mở rộng hiểu biết của chúng tôi,
những thay đổi trong phương pháp nghiên cứu, thực hành chuyên môn hoặc điều trị y tế có thể trở nên cần thiết.
Các học viên và nhà nghiên cứu phải luôn dựa vào kinh nghiệm và kiến thức của chính họ trong việc đánh giá và sử dụng bất kỳ thông
tin, phương pháp, hợp chất hoặc thí nghiệm nào được mô tả trong tài liệu này. Khi sử dụng thông tin hoặc phương pháp như vậy, họ nên
chú ý đến sự an toàn của chính họ và sự an toàn của người khác, bao gồm cả các bên mà họ có trách nhiệm nghề nghiệp.
Trong phạm vi tối đa của luật pháp, cả Nhà xuất bản và tác giả, người đóng góp hoặc biên tập viên đều không chịu bất kỳ trách nhiệm nào
đối với bất kỳ thương tích nào và /
hoặc thiệt hại cho người hoặc tài sản là vấn đề trách nhiệm pháp lý của sản phẩm, sơ suất hoặc cách khác, hoặc từ bất kỳ việc sử dụng
hoặc vận hành của bất kỳ phương pháp, sản phẩm, hướng dẫn hoặc ý tưởng nào có trong tài liệu này.
RISC-V và logo RISC-V là các nhãn hiệu đã đăng ký được quản lý bởi RISC-V Foundation, được sử dụng dưới sự cho phép của
RISC-V Foundation. Đã đăng ký Bản quyền.
Ấn phẩm này độc lập với RISC-V Foundation, không liên kết với nhà xuất bản và RISC-V Foundation không cho phép, tài trợ, chứng
thực hoặc phê duyệt ấn phẩm này.
Tất cả các tài liệu liên quan đến công nghệ ARM® đã được sao chép với sự cho phép của ARM Limited và chỉ nên được sử dụng cho mục đích giáo
dục. Tất cả các mô hình dựa trên ARM được hiển thị hoặc được đề cập trong văn bản không được sử dụng, sao chép hoặc phân phối cho mục đích
thương mại, và trong mọi trường hợp sẽ không mua sách giáo khoa này được hiểu là cấp cho bạn hoặc bất kỳ bên thứ ba nào, rõ ràng hoặc bằng ngụ
ý, estoppel hay cách khác, giấy phép sử dụng bất kỳ công nghệ ARM nào khác hoặc biết cách. Tài liệu do ARM cung cấp có bản quyền © ARM
Limited (hoặc các tài liệu liên kết của nó).
Thư viện Anh Danh mục dữ liệu xuất bản
Một bản ghi danh mục cho cuốn sách này có sẵn từ Thư viện Anh
Thư viện dữ liệu lập danh mục của Quốc hội
Một bản ghi danh mục cho cuốn sách này có sẵn từ Thư viện Quốc hội
Sê-ri: 980-0-12-820331-6

Để biết thông tin về tất cả các ấn phẩm của Morgan Kaufmann


truy cập trang web của chúng tôi tại https://www.elsevier.com/books-and-journalals

Nhà xuất bản: Katey Birtcher


Biên tập viên mua lại cao cấp : Stephen R. Merken
Chuyên gia phát triển nội dung : Beth LoGiudice
Quản lý dự án: Paul Janish
Nhà thiết kế: Patrick Ferguson
Các loại bởi TNQ Technologies
Gửi Linda ,
người đã, đang và sẽ luôn là tình yêu của đời tôi
Nội dung

Lời nói đầu xi

CHƯƠNG

1 Trừu tượng máy tính và công nghệ 2

1.1 Giới thiệu 3


1.2 Bảy ý tưởng tuyệt vời trong kiến trúc máy tính 10
Dưới chương trình của
1.3 bạn 13
1.4 Dưới vỏ bọc 16
1.5 Công nghệ cho bộ xử lý xây dựng và bộ nhớ 25
1.6 Hiệu suất 29
1.7 Bức tường điện 40
1.8 Thay đổi biển: Chuyển từ bộ vi xử lý sang bộ đa xử lý 43
1.9 Real Stuff: Điểm chuẩn Intel Core i7 46
1.10 Nhanh hơn: Ma trận nhân trong Python 49
1.11 Ngụy biện và Cạm bẫy 50
1.12 Kết luận 53
1.13 Quan điểm lịch sử và đọc thêm 55
1.14 Tự học 55
1.15 Bài tập 59
2
Hướng dẫn: Ngôn ngữ của máy tính 66

2.1 Giới thiệu 68


2.2 Hoạt động của phần cứng máy tính 69
2.3 Hoạt động của Phần cứng máy tính 73
2.4 Số đã ký và chưa ký 80
2.5 Hướng dẫn đại diện trong máy tính 87
2.6 Hoạt động logic 95
2.7 Hướng dẫn đưa ra quyết định 98
2.8 Quy trình hỗ trợ trong phần cứng máy tính 104
2.9 Giao tiếp với mọi người 114
2.10 Địa chỉ RISC-V cho các địa chỉ và địa chỉ rộng 120
2.11 Song song và hướng dẫn: Đồng bộ hóa 128
2.12 Dịch và bắt đầu một chương trình 131
Một ví dụ sắp xếp C để đặt tất cả lại với
2.13 nhau 140
Nội dung vii

2.14 Mảng so với con trỏ 148


2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151
2.16 Đồ thật : Hướng dẫn MIPS 152
2.17 Đồ thật : Hướng dẫn ARMv7 (32 bit) 153
2,18 Đồ thật : Hướng dẫn ARMv8 (64 bit) 157
2.19 Đồ thật : hướng dẫn x86 158
2,20 Đồ thật : Phần còn lại của Bộ hướng dẫn RISC-V 167
2,21 Nhanh hơn: Ma trận nhân trong C 168
2.22 Ngụy biện và Cạm bẫy 170
2.23 Kết luận 172
2.24 Quan điểm lịch sử và đọc thêm 174
2.25 Tự học 175
2.26 Bài tập 178

3 Số học cho máy tính 188

3.1 Giới thiệu 190


3.2 Phép cộng và phép trừ 190
3.3 Phép nhân 193
3.4 Sư đoàn 199
3.5 Điểm nổi 208
3.6 Song song và số học máy tính: Phép song song Subword 233
Real Stuff: Truyền phát tiện ích mở rộng SIMD và tiện ích mở rộng
3.7 Vector nâng cao
trong x86 234
3.8 Nhanh hơn: Song song Subword và Ma trận nhân 236
3.9 Ngụy biện và Cạm bẫy 238
3.10 Kết luận 241
3.11 Quan điểm lịch sử và đọc thêm 242
3.12 Tự học 242
3.13 Bài tập 246
4
Bộ xử lý 252

4.1 Giới thiệu 254


4.2 Công ước thiết kế logic 258
Xây dựng một
4.3 Datapath 261
4.4 Một kế hoạch thực hiện đơn giản 269
4.5 Thực hiện nhiều loại 282
4.6 Tổng quan về đường ống 283
4.7 Datapath đường ống và điều khiển 296
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình trệ 313
Kiểm soát các mối
4.9 nguy hiểm 325
4.10 Ngoại lệ 333
Song song thông qua Hướng
4.11 dẫn 340
4.12 Kết hợp tất cả lại với nhau: Intel Core i7 6700 và ARM
Cortex-A53 354
viii Nội dung

4.13 Nhanh hơn: Thuyết song song cấp độ hướng dẫn và ma trận nhân 363
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số bằng phần cứng
Thiết kế ngôn ngữ để mô tả và mô hình hóa một đường ống và nhiều
đường ống khác
Minh họa 365
4.15 Ngụy biện và Cạm bẫy 365
4.16 Kết luận 367
4.17 Quan điểm lịch sử và đọc thêm 368
4.18 Tự học 368
4.19 Bài tập 369
5
Lớn và nhanh: Khai thác phân cấp bộ nhớ 386

5.1 Giới thiệu 388


5.2 Công nghệ bộ nhớ 392
Những điều cơ bản của
5.3 bộ nhớ cache 398
5.4 Đo lường và cải thiện hiệu suất bộ đệm 412
5.5 Phân cấp bộ nhớ đáng tin cậy 431
5.6 Máy ảo 436
5.7 Bộ nhớ ảo 440
5,8 Một khung chung cho phân cấp bộ nhớ 464
Sử dụng máy trạng thái hữu hạn để điều khiển bộ đệm đơn
5.9 giản 470
5.10 Phân cấp song song và bộ nhớ: Sự kết hợp 475
5.11 Song song và phân cấp bộ nhớ: Mảng dư thừa không tốn kém
Đĩa 479
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480
5.13 Đồ thật : Bộ nhớ ARM Cortex-A8 và Intel Core i7
Phân cấp 480
5.14 Đồ thật : Phần còn lại của Hệ thống RISC-V và Hướng dẫn đặc biệt 486
5.15 Nhanh hơn: Chặn bộ nhớ cache và Ma trận nhân 488
5.16 Ngụy biện và Cạm bẫy 489
5.17 Kết luận 494
5,18 Quan điểm lịch sử và đọc thêm 495
6 5.19 Tự học 495
5.20 Bài tập 499
Bộ xử lý song song từ máy khách đến đám
mây 518

6.1 Giới thiệu 520


Khó khăn trong việc tạo ra các chương trình xử lý song
6.2 song 522
6.3 SISD, MIMD, SIMD, SPMD và Vector 527
6.4 Đa phần cứng 534
6.5 Bộ đa bộ nhớ chia sẻ và đa bộ nhớ khác 537
6.6 Giới thiệu về Đơn vị xử lý đồ họa 542
6.7 Kiến trúc đặc trưng miền 549
6,8 Các cụm, Máy tính quy mô kho và Truyền tin nhắn khác
Bộ đa xử lý 552
Nội dung ix

6,9 Giới thiệu về cấu trúc liên kết mạng đa bộ xử lý 557


6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm 561
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 561
6.12 Real Stuff: Điểm chuẩn của siêu máy tính Google TPUv3 và an
Cụm GPU NVIDIA Volta 572
6.13 Nhanh hơn: Nhiều bộ xử lý và ma trận nhân 580
6.14 Ngụy biện và Cạm bẫy 583
6.15 Kết luận 585
6.16 Quan điểm lịch sử và đọc thêm 587
6.17 Tự học 588
6.18 Bài tập 590

PHỤ LỤC

Những điều cơ bản của thiết kế


A logic A-2
A.1 Giới thiệu A-3
A.2 Cổng, Bàn sự thật và Phương trình logic A-4
A.3 Logic kết hợp A-9
A.4 Sử dụng ngôn ngữ mô tả phần cứng A-20
A.5 Xây dựng một đơn vị logic số học cơ bản A-26
Bổ sung nhanh hơn: Mang theo
A.6 Lookahead A-37
A.7 Đồng hồ A-47
A.8 Các yếu tố bộ nhớ: Flip-Flops, Latches và Register A-49
A.9 Các yếu tố bộ nhớ: SRAM và DRAM A-57
Máy móc nhà nước hữu
A.10 hạn A-66
A.11 Phương pháp thời gian A-71
A.12 Thiết bị lập trình hiện trường A-77
A.13 Kết luận A-78
A.14 Bài tập A-79
Chỉ số I-1

TRỰC TUYẾN NỘI DUNG

B Đồ họa và GPU điện toán B-2


B.1 Giới thiệu B-3
B.2 Kiến trúc hệ thống GPU B-7
B.3 Lập trình GPU B-12
B.4 Kiến trúc đa bộ xử lý đa luồng B-25
B.5 Hệ thống bộ nhớ song song B-36
B.6 Số học điểm nổi B-41
x Nội dung

B.7 Đồ thật : NVIDIA GeForce 8800 B-46


B.8 Đồ thật : Ánh xạ ứng dụng tới GPU B-55
B.9 Ngụy biện và Cạm bẫy B-72
B.10 Kết luận B-76
B.11 Quan điểm lịch sử và đọc thêm B-77

C Kiểm soát ánh xạ tới phần cứng C-2


C.1 Giới thiệu C-3
C.2 Thực hiện các đơn vị kiểm soát kết hợp C-4
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-8
C.4 Triển khai Chức năng trạng thái tiếp theo với Trình sắp xếp C-22
C.5 Dịch một chương trình vi mô sang phần cứng C-28
C.6 Nhận xét kết luận C-32
C.7 Bài tập C-33

D Khảo sát các kiến trúc tập lệnh hướng dẫn D-2

D.1 Giới thiệu D-3


D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Nhúng
Máy tính D-4
D.3 Intel 80 × 86 D-30
D.4 Kiến trúc VAX D-50
D.5 Kiến trúc IBM 360/370 cho Máy tính Mainframe D-68
D.6 Quan điểm lịch sử và tài liệu tham khảo D-74
Thuật ngữ G-1
Đọc thêm FR-1
Lời nói đầu

Điều đẹp nhất chúng ta có thể trải nghiệm là bí ẩn. Nó là nguồn


gốc của tất cả nghệ thuật và khoa học thực sự.
Albert Einstein , Những gì tôi tin, 1930

Về cuốn sách này


Chúng tôi tin rằng học tập trong khoa học máy tính và kỹ thuật sẽ phản ánh tình
trạng hiện tại của lĩnh vực này, cũng như giới thiệu các nguyên tắc đang định
hình điện toán. Chúng tôi cũng cảm thấy rằng độc giả trong mọi chuyên ngành
của điện toán cần đánh giá cao các mô hình tổ chức xác định khả năng, hiệu suất,
năng lượng và cuối cùng là sự thành công của các hệ thống máy tính.
Công nghệ máy tính hiện đại đòi hỏi các chuyên gia của mọi chuyên ngành
điện toán phải hiểu cả phần cứng và phần mềm. Sự tương tác giữa phần cứng và
phần mềm ở nhiều cấp độ khác nhau cũng cung cấp một khuôn khổ để hiểu các
nguyên tắc cơ bản của điện toán. Cho dù mối quan tâm chính của bạn là phần
cứng hay phần mềm, khoa học máy tính hay kỹ thuật điện, các ý tưởng trung tâm
trong tổ chức và thiết kế máy tính là như nhau. Do đó, sự nhấn mạnh của chúng
tôi trong cuốn sách này là thể hiện mối quan hệ giữa phần cứng và phần mềm và
tập trung vào các khái niệm làm cơ sở cho các máy tính hiện tại.
Việc chuyển đổi gần đây từ bộ vi xử lý sang bộ vi xử lý đa lõi đã khẳng định tính
đúng đắn của viễn cảnh này, được đưa ra kể từ phiên bản đầu tiên. Mặc dù các lập
trình viên có thể bỏ qua lời khuyên và dựa vào các kiến trúc sư máy tính, nhà văn biên
dịch và kỹ sư silicon để làm cho chương trình của họ chạy nhanh hơn hoặc tiết kiệm
năng lượng hơn mà không thay đổi, thời đại đó đã kết thúc. Để các chương trình chạy
nhanh hơn, chúng phải trở thành song song. Mặc dù mục tiêu của nhiều nhà nghiên
cứu là làm cho các lập trình viên có thể không biết về bản chất song song cơ bản của
phần cứng mà họ đang lập trình, sẽ mất nhiều năm để hiện thực hóa tầm nhìn này.
Quan điểm của chúng tôi là trong ít nhất thập kỷ tới, hầu hết các lập trình viên sẽ phải
hiểu giao diện phần cứng / phần mềm nếu họ muốn các chương trình chạy hiệu quả
trên các máy tính song song.
Đối tượng của cuốn sách này bao gồm những người có ít kinh nghiệm về ngôn
ngữ lắp ráp hoặc thiết kế logic, những người cần hiểu về tổ chức máy tính cơ bản
cũng như độc giả có nền tảng về ngôn ngữ lắp ráp và / hoặc thiết kế logic muốn
học cách thiết kế máy tính hoặc hiểu cách thức hệ thống hoạt động và tại sao nó
thực hiện như nó làm.
xii Lời nói đầu

Về cuốn sách khác


Một số độc giả có thể quen thuộc Kiến trúc máy tính: Một định lượng Cách tiếp
cận, thường được gọi là Hennessy và Patterson. (Cuốn sách này lần lượt là
thường được gọi là Patterson và Hennessy.) Động lực của chúng tôi trong việc
viết cuốn sách trước đó là mô tả các nguyên tắc của kiến trúc máy tính bằng cách
sử dụng các nguyên tắc cơ bản về kỹ thuật vững chắc và sự đánh đổi chi phí / hiệu
suất định lượng. Chúng tôi đã sử dụng một cách tiếp cận kết hợp các ví dụ và
phép đo, dựa trên các hệ thống thương mại, để tạo ra trải nghiệm thiết kế thực tế.
Mục tiêu của chúng tôi là chứng minh rằng kiến trúc máy tính có thể được học
bằng các phương pháp định lượng thay vì phương pháp mô tả. Nó được dành cho
các chuyên gia điện toán nghiêm túc, những người muốn hiểu chi tiết về máy tính.
Phần lớn độc giả cho cuốn sách này không có kế hoạch trở thành kiến trúc sư
máy tính. Hiệu suất và hiệu quả năng lượng của các hệ thống phần mềm trong
tương lai sẽ bị ảnh hưởng đáng kể, tuy nhiên, bằng cách các nhà thiết kế phần
mềm hiểu rõ các kỹ thuật phần cứng cơ bản đang hoạt động trong một hệ thống.
Do đó, các nhà văn biên dịch, nhà thiết kế hệ điều hành, lập trình viên cơ sở dữ
liệu và hầu hết các kỹ sư phần mềm khác cần một nền tảng vững chắc trong các
nguyên tắc được trình bày trong cuốn sách này. Tương tự, các nhà thiết kế phần
cứng phải hiểu rõ tác động của công việc của họ đối với các ứng dụng phần mềm.
Vì vậy, chúng tôi biết rằng cuốn sách này phải nhiều hơn một tập hợp con của tài
liệu Kiến trúc máy tínhvà tài liệu đã được sửa đổi rộng rãi để phù hợp với các đối
tượng khác nhau. Chúng tôi rất hài lòng với kết quả là các phiên bản tiếp theo Kiến
trúc máy tính đã được sửa đổi để loại bỏ hầu hết các tài liệu giới thiệu; do đó, ngày
nay có ít sự chồng chéo hơn so với các phiên bản đầu tiên của cả hai cuốn sách.

Tại sao một phiên bản RISC-V?


Việc lựa chọn kiến trúc tập lệnh rõ ràng rất quan trọng đối với phương pháp sư
phạm của sách giáo khoa kiến trúc máy tính. Chúng tôi đã không muốn một bộ
hướng dẫn yêu cầu mô tả các tính năng baroque không cần thiết cho ai đó Tập
lệnh đầu tiên, bất kể nó phổ biến đến mức nào. Lý tưởng nhất, bộ hướng dẫn ban
đầu của bạn nên là một ví dụ, giống như tình yêu đầu tiên của bạn. Đáng ngạc
nhiên, bạn nhớ cả hai.
Vì có rất nhiều sự lựa chọn vào thời điểm đó, cho phiên bản đầu tiên của Máy
vi tính Kiến trúc: Cách tiếp cận định lượng, chúng tôi đã phát minh ra hướng dẫn
theo phong cách RISC của riêng mình bộ. Với sự phổ biến ngày càng tăng và sự
thanh lịch đơn giản của bộ hướng dẫn MIPS, chúng tôi đã chuyển sang nó cho
phiên bản đầu tiên của cuốn sách này và các phiên bản sau của cuốn sách khác.
MIPS đã phục vụ chúng tôi và độc giả của chúng tôi tốt.
Nó đã được nhiều năm kể từ khi chúng tôi thực hiện chuyển đổi đó và trong khi
hàng tỷ chip sử dụng MIPS tiếp tục được vận chuyển, chúng thường ở trong các thiết
bị nhúng được tìm thấy trong đó tập lệnh gần như vô hình. Do đó, trong một thời
gian, nó rất khó tìm thấy một máy tính thực sự mà người đọc có thể tải xuống và
chạy các chương trình MIPS.
Tin tốt là một bộ hướng dẫn mở tuân thủ chặt chẽ các nguyên tắc RISC gần đây đã
ra mắt và nó đang nhanh chóng đạt được một số điều sau đây. RISC-V, được phát
triển ban đầu tại UC Berkeley, không chỉ làm sạch các điều kỳ quặc của MIPS
Lời nói đầu xiii

tập lệnh, nhưng nó cung cấp một cách đơn giản, thanh lịch, hiện đại về những bộ
hướng dẫn sẽ trông như thế nào vào năm 2020.
Ngoài ra, vì nó không phải là độc quyền, nên có các trình giả lập, trình biên dịch,
trình gỡ lỗi mã nguồn mở, v.v., trên các triển khai RISC-V dễ dàng có sẵn và thậm
chí có sẵn bằng các ngôn ngữ mô tả phần cứng. Hơn nữa, Năm 2020 chứng kiến sự
ra đời của các bảng giá rẻ dựa trên RISC-V tương đương với Raspberry Pi, đó không
phải là trường hợp của MIPS. Độc giả sẽ không chỉ được hưởng lợi từ việc nghiên
cứu các thiết kế RISC-V này, họ sẽ có thể sửa đổi chúng và trải qua quá trình thực
hiện để hiểu tác động của những thay đổi giả định của họ đối với hiệu suất, kích
thước chết, và năng lượng.
Đây là một cơ hội thú vị cho ngành công nghiệp điện toán cũng như giáo dục, và
do đó tại thời điểm viết bài này, hơn 300 công ty đã tham gia vào nền tảng RISC-V.
Danh sách nhà tài trợ này bao gồm hầu như tất cả những người chơi chính ngoại trừ
ARM và Intel, bao gồm Alibaba, Amazon, AMD, Google, Hewlett Packard
Enterprise, IBM, Microsoft, NVIDIA, Qualcomm, Samsung và Western Digital.
Chính vì những lý do này mà chúng tôi đã viết một phiên bản RISC-V của
cuốn sách này và chúng tôi đã chuyển đổi Kiến trúc máy tính: Cách tiếp cận định
lượng đến RISC-V là tốt.
Với phiên bản RISC-V này, chúng tôi đã chuyển từ RV64 64 bit sang RV32 32 bit.
Các giảng viên nhận thấy rằng sự phức tạp thêm của một bộ hướng dẫn 64 bit khiến
học sinh khó khăn hơn. RV32 làm giảm kiến trúc lõi bằng 10 hướng dẫn, thả ld, sd,
lwu, addw, subw, addwi, sllw, sllwiw, srliw và họ không phải hiểu các hoạt động trên
32 bit thấp hơn của 64- đăng ký bit. Chúng tôi cũng có thể bỏ qua phần lớn từ khóa
và chỉ sử dụng các từ trong văn bản. trong phiên bản này, chúng tôi cũng đã ẩn các
định dạng SB và UJ trông kỳ lạ cho đến khi Chương 4Chúng tôi giải thích sự tiết
kiệm phần cứng của các đơn đặt hàng bit xoáy trong các lĩnh vực ngay lập tức của SB
và UJ sau đó vì chương đó là nơi chúng tôi hiển thị phần cứng datapath. Giống như
chúng tôi đã làm cho phần bổ sung MIPS thứ sáu, chúng tôi đã thêm một phần trực
tuyến cho thấy việc triển khai nhiều chu kỳ cho phiên bản này, nhưng chúng tôi đã
sửa đổi nó để phù hợp với RISC-V. Một số giảng viên thích trải qua việc thực hiện
nhiều xe đạp sau khi thực hiện một chu kỳ trước khi giới thiệu đường ống.
Những thay đổi duy nhất cho phiên bản RISC-V từ phiên bản MIPS là những
thay đổi liên quan đến thay đổi trong tập lệnh, chủ yếu ảnh hưởng Chương 2,
Chương 3, các phần bộ nhớ ảo trong Chương 5, và ví dụ VMIPS ngắn trong
Chương 6 Trong. Chương 4, chúng tôi đã chuyển sang các hướng dẫn RISC-V,
thay đổi một số số liệu và thêm một vài phần Xây dựng của Google, nhưng
những thay đổi đơn giản hơn chúng tôi sợ. Chương 1 và hầu hết các phụ lục hầu
như không thay đổi. Tài liệu trực tuyến rộng rãi và kết hợp với cường độ của
RISC-V khiến việc đưa ra một sự thay thế cho phiên bản MIPS trở nên khó khăn
Phụ lục A (Trình biên dịch, Trình liên kết và Trình mô phỏng SPIM trong Phiên
bản thứ sáu của MIPS). Thay vào đó, Chương 2 , 3 , và 5 bao gồm tổng quan
nhanh về hàng trăm hướng dẫn RISC-V bên ngoài các hướng dẫn RISC-V cốt lõi
mà chúng tôi đề cập chi tiết trong phần còn lại của cuốn sách.
Kế hoạch hiện tại là tiếp tục xem xét lại cả hai phiên bản MIPS và RISC-V
của cuốn sách này, như chúng tôi đã làm vào năm 2020.
xiv Lời nói đầu

Thay đổi cho phiên bản thứ hai


Có thể có nhiều thay đổi trong công nghệ và kinh doanh kiến trúc máy tính kể từ
phiên bản thứ năm so với năm đầu tiên :
● Sự chậm lại của Định luật Moore MooreSau 50 năm nhân đôi số lượng
bóng bán dẫn trên mỗi chip, dự đoán của Gordon Moore không còn giữ
được nữa. Công nghệ bán dẫn vẫn sẽ cải thiện, nhưng chậm hơn và ít dự
đoán hơn so với trước đây.
● Sự trỗi dậy của Kiến trúc cụ thể miền (DSA)Một phần do sự chậm lại của
Định luật Moore Moore và một phần do sự kết thúc của Quy mô Dennard,
các bộ xử lý mục đích chung chỉ cải thiện một vài phần trăm mỗi năm.
Hơn nữa, Luật Amdahl giới hạn lợi ích thiết thực của việc tăng số lượng
bộ xử lý trên mỗi chip. Năm 2020, người ta tin rằng con đường hứa hẹn
nhất phía trước là DSA. Nó không cố gắng chạy mọi thứ giống như bộ xử
lý mục đích chung, nhưng tập trung vào chạy các chương trình của một
miền tốt hơn nhiều so với các CPU thông thường.
● Kiến trúc vi mô như một bề mặt tấn công an ninhSpectre đã chứng minh
rằng việc thực thi theo thứ tự đầu cơ và đa luồng phần cứng làm cho các
cuộc tấn công kênh phụ dựa trên thời gian trở nên thiết thực. Hơn nữa, đây
không phải là do các lỗi có thể được sửa, mà là một thách thức cơ bản đối
với phong cách thiết kế bộ xử lý này.
● Tập lệnh mở và triển khai nguồn mởCác cơ hội và tác động của phần mềm
nguồn mở đã đến với kiến trúc máy tính. Các bộ hướng dẫn mở như RISC-
V cho phép các tổ chức xây dựng bộ xử lý của riêng họ mà không cần đàm
phán giấy phép trước. đã cho phép triển khai nguồn mở được chia sẻ để tự
do tải xuống và sử dụng cũng như triển khai RISC-V độc quyền. Phần
mềm và phần cứng nguồn mở là một lợi ích cho nghiên cứu và hướng dẫn
học thuật, cho phép sinh viên nhìn thấy và tăng cường công nghệ sức
mạnh công nghiệp,
● Sự tái sinh của ngành công nghệ thông tinĐiện toán đám mây đã dẫn đến
không quá nửa tá công ty cung cấp cơ sở hạ tầng điện toán cho mọi người
sử dụng. Giống như IBM trong những năm 1960 và 1970, các công ty này
xác định cả ngăn xếp phần mềm và phần cứng mà họ triển khai. Những
thay đổi ở trên đã dẫn đến một số siêu cường này, phát triển chip DSA và
RISC-V của riêng họ để triển khai trên các đám mây của họ.
Lời nói đầu xv

Tập trung phần Tập trung phần


Chương hoặc Phụ lục Các phần mềm cứng

1. Trừu tượng máy tính 1.1 đến 1.12


và Công nghệ 1.13 (Lịch sử)
2.1 đến 2.14
2.15 (Bộ biên dịch &
2. Hướng dẫn: Ngôn ngữ Java)
của máy tính 2.16 đến 2.22
2.23 (Lịch sử)
D. Kiến trúc hướng dẫn RISC D.1 đến D.6
3.1 đến 3.5
3.6 đến 3.8 (Song song Subword)
3.9 đến 3.10 (Fallacy)
3. Số học cho máy tính
3.11 (Lịch sử)
A. Những điều cơ bản của thiết
kế logic A.1 đến A.13
4.1 (Tổng quan)
4.2 (Công ước logic)
4.3 đến 4.4 (Thực hiện đơn giản)
4.5 (Thực hiện nhiều xe đạp)
4.6 (Tổng quan về đường
ống)
4. Bộ xử lý 4.7 (Datapath đường ống)
4,8 đến 4,10 (Nguy cơ, ngoại lệ)
4.11 đến 4.13 (Song song, Real Stuff)
4.14 (Điều khiển đường ống Verilog)
4.15 đến 4.16 (Fallacy)
4.17 (Lịch sử)
C. Kiểm soát ánh xạ tới phần
cứng C.1 đến C.6

5.1 đến 5.10

5.11 (Mảng dư thừa của


Đĩa rẻ tiền)
5. Lớn và nhanh: Khai thác
Phân cấp bộ nhớ
5.12 (Bộ điều khiển bộ đệm Verilog)
5.13 đến 5.16
5.17 (Lịch sử)
6.1 đến 6.9
6. Quy trình song song từ khách
hàng 6.10 (Các cụm)
lên mây 6.11 đến 6.15
6.16 (Lịch sử)
B. Đơn vị xử lý đồ họa B.1 đến B.11

Đọc kỹ Đọc nếu có thời gian Tham khảo


Xem lại hoặc đọc Đọc cho văn hóa
xvi Lời nói đầu

Phiên bản thứ hai của COD (phiên bản RISC-V) phản ánh những thay đổi gần
đây, cập nhật tất cả các ví dụ và số liệu, đáp ứng yêu cầu của người hướng dẫn,
cộng với thêm một cải tiến sư phạm lấy cảm hứng từ sách giáo khoa mà tôi đã sử
dụng để giúp cháu tôi học lớp toán.
● Phần Nhanh hơn hiện có trong mỗi chương. Nó bắt đầu với một phiên bản Python
trong Chương 1, người có hiệu suất kém truyền cảm hứng cho việc học C và sau
đó viết lại ma trận nhân với C Chương 2Các chương còn lại tăng tốc ma trận nhân
lên bằng cách tận dụng song song cấp dữ liệu, song song cấp độ lệnh, song song
cấp độ luồng và bằng cách điều chỉnh truy cập bộ nhớ để phù hợp với hệ thống
phân cấp bộ nhớ của máy chủ hiện đại. Máy tính này có các hoạt động SIMD 512
bit, thực thi không theo thứ tự đầu cơ, ba cấp độ bộ nhớ cache và 48 lõi. Tất cả bốn
tối ưu hóa chỉ thêm 21 dòng mã C nhưng ma trận tăng tốc nhân với gần 50.000.
cắt nó từ gần 6 giờ ở Python xuống dưới 1 giây trong C. Nếu tôi là học sinh một
lần nữa, ví dụ chạy này sẽ truyền cảm hứng cho tôi sử dụng C và tìm hiểu các khái
niệm phần cứng cơ bản của cuốn sách này,
● Với phiên bản này, mỗi chương có phần Tự học hỏi các câu hỏi kích thích
tư duy và cung cấp câu trả lời sau đó để giúp bạn đánh giá nếu bạn tự
mình làm theo tài liệu.
● Bên cạnh việc giải thích rằng Định luật Moore và Quy mô Dennard không
còn tồn tại, chúng tôi đã nhấn mạnh Luật Moore Moore như một tác nhân
thay đổi nổi bật trong phiên bản thứ năm.
● Chương 2 có nhiều tài liệu để nhấn mạnh rằng dữ liệu nhị phân không có ý
nghĩa vốn có, chương trình xác định kiểu dữ liệu không phải là một khái
niệm dễ dàng cho người mới bắt đầu nắm bắt.
● Chương 2 cũng bao gồm một mô tả ngắn về MIPS dưới dạng một lệnh
tương phản được đặt thành RISC-V cùng với ARMv7, ARMv8 và x86.
(Ngoài ra còn có phiên bản đồng hành của cuốn sách này dựa trên MIPS
thay vì RISC-V và chúng tôi cũng đang cập nhật nó với những thay đổi
khác.)
● Ví dụ chuẩn của Chương 2 được nâng cấp lên ĐẶC BIỆT 2017 từ ĐẶC BIỆT.

● Theo yêu cầu của người hướng dẫn, chúng tôi đã khôi phục việc triển khai
RISC-V nhiều chu kỳ như một phần trực tuyến Chương 4 giữa việc thực
hiện một chu kỳ và thực hiện đường ống. Một số người hướng dẫn tìm
thấy ba bước này là một con đường dễ dàng hơn để dạy đường ống.
● Đặt tất cả các ví dụ cùng nhau của Chương 4 và 5 đã được cập nhật lên kiến
trúc vi mô ARM A53 gần đây và kiến trúc vi mô Intel i7 6700 Skyelake.
● Các phần Fallacy và Pit thác của Chương 5 và 6 thêm cạm bẫy xung quanh
các cuộc tấn công bảo mật phần cứng của Row Hammer và Spectre.
● Chương 6 có phần mới giới thiệu DSA bằng cách sử dụng Đơn vị xử lý kiểm
duyệt (TPU) của Google phiên bản 1. Chương 6Phần s Đặt tất cả cùng nhau
Lời nói đầu xvii

được cập nhật để so sánh siêu máy tính Google TP TPUv3 DSA với một
cụm GPU NVIDIA Volta.
Cuối cùng, chúng tôi cập nhật tất cả các bài tập trong cuốn sách.
Trong khi một số yếu tố thay đổi, chúng tôi đã bảo tồn các yếu tố sách hữu ích từ
các phiên bản trước. Để làm cho cuốn sách hoạt động tốt hơn như một tài liệu tham
khảo, chúng tôi vẫn đặt các định nghĩa về các thuật ngữ mới trong lề ở lần xuất hiện
đầu tiên của chúng. Phần tử sách có tên là Tìm hiểu về Chương trình Hiệu suất Phần
mềm giúp người đọc hiểu hiệu suất của các chương trình của họ và cách cải thiện nó,
giống như phần tử sách Phần cứng / Giao diện phần mềm đã giúp người đọc hiểu
được sự đánh đổi tại giao diện này. Phần hình ảnh lớn Phần còn lại để người đọc nhìn
thấy khu rừng bất chấp tất cả các cây. Phần Kiểm tra bản thân Phần mềm giúp người
đọc xác nhận sự hiểu biết của họ về tài liệu lần đầu tiên thông qua các câu trả lời được
cung cấp ở cuối mỗi chương. Phiên bản này vẫn bao gồm thẻ tham chiếu RISC-V
màu xanh lá cây, được lấy cảm hứng từ Thẻ xanh Green của Hệ thống IBM / 360. Thẻ
này đã được cập nhật và phải là một tài liệu tham khảo hữu ích khi viết các chương
trình ngôn ngữ lắp ráp RISC-V.

Hỗ trợ giảng viên


Chúng tôi đã thu thập rất nhiều tài liệu để giúp các giảng viên dạy các khóa học
bằng cuốn sách này. Giải pháp cho các bài tập, số liệu từ cuốn sách, slide bài
giảng và các tài liệu khác có sẵn cho các giảng viên đăng ký với nhà xuất bản.
Ngoài ra, trang web đồng hành cung cấp các liên kết đến phần mềm RISC-V
miễn phí. Kiểm tra trang web của nhà xuất bản để biết thêm thông tin :
https://textbooks.elsevier.com/web/manuals.aspx?isbn = 9780128203316

Kết luận
Nếu bạn đọc phần xác nhận sau đây, bạn sẽ thấy rằng chúng tôi đã cố gắng hết
sức để sửa lỗi. Vì một cuốn sách trải qua nhiều bản in, chúng tôi có cơ hội để sửa
chữa nhiều hơn nữa. Nếu bạn phát hiện ra bất kỳ lỗi còn lại, kiên cường, xin vui
lòng liên hệ với nhà xuất bản.
Phiên bản này là sự phá vỡ thứ tư trong sự hợp tác lâu dài giữa Hennessy và
Patterson, bắt đầu vào năm 1989. Yêu cầu điều hành một trong những trường đại
học lớn của thế giới có nghĩa là Tổng thống Hennessy không còn có thể có cam
kết đáng kể để tạo ra một phiên bản mới. Tác giả còn lại cảm thấy một lần nữa
giống như một người đi bộ chặt chẽ mà không có mạng lưới an toàn. Do đó,
những người trong các xác nhận và các đồng nghiệp Berkeley đã đóng một vai trò
thậm chí còn lớn hơn trong việc định hình nội dung của cuốn sách này. Tuy nhiên,
lần này chỉ có một tác giả đổ lỗi cho tài liệu mới trong những gì bạn sắp đọc.

Lời cảm ơn cho phiên bản thứ hai


Với mỗi phiên bản của cuốn sách này, chúng tôi rất may mắn nhận được sự giúp
đỡ từ nhiều độc giả, nhà phê bình và người đóng góp. Mỗi người trong số họ đã
giúp làm cho cuốn sách này tốt hơn.
xviii Lời nói đầu

Chúng tôi rất biết ơn sự giúp đỡ của Khaled Benkrid và các đồng nghiệp của
ông tại ARM Ltd., người đã xem xét cẩn thận các tài liệu liên quan đến ARM và
cung cấp phản hồi hữu ích.
Cảm ơn đặc biệt đến Dr. Rimas Avizenis, người đã phát triển các phiên bản khác
nhau của ma trận nhân lên và cung cấp số hiệu suất. Tôi đánh giá cao sự giúp đỡ liên
tục của anh ấy sau khi anh ấy tốt nghiệp UC Berkeley. Khi tôi làm việc với cha anh
ấy khi tôi còn là một sinh viên tốt nghiệp tại UCLA, việc làm việc với Rimas khi anh
ấy còn là một sinh viên tốt nghiệp tại UC Berkeley là một đối xứng tốt.
Tôi cũng muốn cảm ơn cộng tác viên lâu năm của tôi Randy Katz của UC
Berkeley, người đã giúp phát triển khái niệm về những ý tưởng tuyệt vời trong
kiến trúc máy tính như là một phần của việc sửa đổi rộng rãi một lớp đại học mà
chúng tôi đã làm cùng nhau.
Tôi muốn cảm ơn David Kirk, John Nickollsvà các đồng nghiệp của họ tại
NVIDIA (Michael Garland, John Montrym, Doug Voorhies, Lars Nyland, Erik
Lindholm, Paulius Micikevicius, Massimiliano Fatica, Stuart Oberman và Vasily
Volkov) để viết phụ lục chuyên sâu đầu tiên về GPU. Tôi muốn bày tỏ một lần
nữa sự đánh giá cao của tôi Jim Larus, gần đây được đặt tên là Trưởng khoa
Khoa học Máy tính và Truyền thông tại EPFL, vì sẵn sàng đóng góp chuyên môn
về lập trình ngôn ngữ lắp ráp, cũng như để chào đón độc giả của cuốn sách này
liên quan đến việc sử dụng trình giả lập mà ông đã phát triển và duy trì.
Tôi cũng rất biết ơn Jason Bakos của Đại học South Carolina, người đã cập nhật
và tạo ra các bài tập mới, dựa trên các bài tập được tạo ra bởi Perry Alexander (Đại
học Kansas); Javier Bruguera (Đại học de Santiago de Compostela); Matthew
Farrens (Đại học California, Davis); Zachary Kurmas (Đại học bang Grand
Valley); David Kaeli (Đại học Đông Bắc); Nicole Kaiyan (Đại học Adelaide); John
Oliver (Cal Poly, San Luis Obispo); Milos Prvulovic (Công nghệ Georgia); J
Xuyên Chang (Google); Jacob Leverich (Stanford); Kevin Lim (Hewlett-Packard);
và Partha Ranganathan (Google).
Cảm ơn thêm đến Jason Bakos để cập nhật các slide bài giảng, dựa trên các
slide cập nhật từ Peter Ashenden (Công ty TNHH Thiết kế Ashenden).
Tôi biết ơn nhiều người hướng dẫn đã trả lời các cuộc khảo sát của nhà xuất bản,
xem xét các đề xuất của chúng tôi và tham dự các nhóm tập trung. Họ bao gồm các
cá nhân sau: Nhóm tập trung: Bruce Barton (Trường cao đẳng cộng đồng hạt Suffolk),
Jeff Braun (Montana Tech), Ed Gehringer (Bang Bắc Carolina), Michael Goldweber
(Đại học Xavier), Ed Harcourt (St. Đại học Lawrence) Đồi Mark (Đại học Wisconsin,
Madison) Patrick Homer (Đại học Arizona) Norm Jouppi (Phòng thí nghiệm HP)
Dave Kaeli (Đại học Đông Bắc) Christos Kozyrakis (Đại học Stanford) Jae C. Oh
(Đại học Syracuse) Lu Bành (LSU) Milos Prvulovic (Công nghệ Georgia) Partha
Ranganathan (Phòng thí nghiệm HP) David Gỗ (Đại học Wisconsin) Craig Zilles
(Đại học Illinois tại Urbana-Champaign). Khảo sát và đánh giá: Mahmoud Abou-
Nasr (Đại học bang Wayne) Perry Alexander (Đại học Kansas) Behnam Arad (Đại
học bang Sacramento) Hakan Aydin (Đại học George Mason) Hussein Badr (Đại học
bang New York tại Stony Brook) Mac Baker (Học viện quân sự Virginia) Ron
Barnes (Đại học George Mason) Douglas Blough (Viện Công nghệ Georgia) Kevin
Bolding (Đại học Seattle Thái Bình Dương) Biodrag Bolic (Đại học Ottawa) John
Bonomo
Lời nói đầu xix

Cao đẳng Westminster) Jeff Braun (Công nghệ Montana) Tom Briggs (Đại học
Shippensburg) Mike Sáng (Đại học thành phố Grove) Scott Burgess (Đại học bang
Humboldt) Fazli Can (Đại học Bilkent) Warren R. Carithers (Học viện Công nghệ
Rochester) Bruce Carlton (Cao đẳng cộng đồng Mesa) Nicholas Carter (Đại học
Illinois tại Urbana-Champaign) Anthony Cocchi (Đại học thành phố New York) Don
Cooley (Đại học bang Utah) Gene Cooperman (Đại học Đông Bắc) Robert D. Cupper
(Cao đẳng Allegheny) Amy Csizmar Dalal (Đại học Carleton) Daniel Dalle (Đại học
de Sherbrooke) Edward W. Davis (Đại học bang Bắc Carolina) Nathaniel J. Davis
(Viện Công nghệ Không quân) Molisa Derk (Đại học thành phố Oklahoma) Andrea
Di Blas (Đại học Stanford) Nathan B. Doge (Đại học Texas tại Dallas) Derek Eager
(Đại học Saskatchewan) Ata Elahi (Đại học bang Souther Connecticut) Ernest
Ferguson (Đại học bang Tây Bắc Missouri) Rhonda Kay Gaede (Đại học Alabama)
Etienne M. Gagnon (L hèUniversité du Québec à Montréal) Costa Gerousis (Đại học
Christopher Newport) Paul Gillard (Đại học Tưởng niệm Newfoundland) Michael
Goldweber (Đại học Xavier) Cấp Georgia (Đại học San Mateo) Paul V. Gratz (Đại
học Texas A & M) Hội trường Merrill (Trường Cao đẳng Master Master) Hội trường
Tyson (Đại học Cơ Đốc Phục Lâm miền Nam) Ed Harcourt (Thánh. Đại học
Lawrence), Justin E. Harlow (Đại học Nam Florida), Paul F. Hemler (Đại học
Hampden-Sydney), Jayantha Herath (St. Đại học Cloud State), Martin Herbordt (Đại
học Boston), Steve J. Hodges (Cabrillo College), Kenneth Hopkinson (Đại học
Cornell), Bill Hsu (Đại học bang San Francisco), Dalton Hunkins (St. Đại học
Bonavoji) Baback Izadi (Đại học Bang New York—Paltz mới) Reza Jafari, Abbas
Javadtalab (Đại học Concordia) Robert W. Johnson (Đại học Kỹ thuật Colorado)
Bharat Joshi (Đại học Bắc Carolina, Charlotte) Nagarajan Kandasamy (Đại học
Drexel) Rajiv Kapadia, Ryan Kastner (Đại học California, Santa Barbara) E.J. Kim
(Đại học Texas A & M) Kim Kim (Đại học Quốc gia Seoul) Jim Kirk (Đại học công
đoàn) Geoffrey S. Knauth (Cao đẳng Ly sắp) Manish M. Kochhal (Bang Wayne)
Suzan Koknar-Tezel (Đại học Saint Joseph) Angkul Kongmunvattana (Đại học bang
Columbus) Tháng Tư Kontostathis (Đại học Ursinus) Christos Kozyrakis (Đại học
Stanford) Daniel Krizanc (Đại học Wesleyan) Ashok Kumar, S. Kumar (Đại học
Texas) Zachary Kurmas (Đại học bang Grand Valley) Adrian Lauf (Đại học
Louisville) Robert N. Lea (Đại học Houston) Alvin Lebeck (Đại học Duke) Baoxin Li
(Đại học bang Arizona) Li Liao (Đại học Del biết) Gary Livingston (Đại học
Massachusetts) Michael Lyle, Douglas W. Lynn (Viện Công nghệ Oregon) Yashwant
K Malaiya (Đại học bang Colorado) Stephen Mann (Đại học Waterloo) Bill Mark
(Đại học Texas tại Austin) Ananda Mondal (Đại học Claflin) Euripedes Montagne
(Đại học Trung tâm Florida) Tali Moreshet (Đại học Boston) Alvin Moser (Đại học
Seattle) Walid Najjar (Đại học California, Bờ sông) Vijaykrishnan Narayanan (Đại
học bang Pennsylvania) Danial J. Neebel (Cao đẳng Loras) Victor Nelson (Đại học
Auburn) John Nestor (Cao đẳng Lafayette) Jae C. Oh (Đại học Syracuse) Joe Oldham
(Trung tâm đại học) Timour Paltashev, James Parkerson (Đại học Arkansas) Shaunak
Pawagi (SUNY tại Stony Brook) Steve Pearce,
xx Lời nói đầu

Ted Pedersen (Đại học Minnesota) Lu Bành (Đại học bang Louisiana) Gregory D.
Peterson (Đại học Tennessee) William Pierce (Hood College) Milos Prvulovic
(Công nghệ Georgia) Partha Ranganathan (Phòng thí nghiệm HP) Dejan Raskovic
(Đại học Alaska, Fairbanks) Brad Richards (Đại học Puget Sound) La Mã
Rozanov, Louis Rubinfield (Đại học Villanova) Md Abdus Salam (Đại học Nam)
Augustine Samba (Đại học bang Kent) Robert Schaefer (Đại học Daniel Webster)
Carolyn J. C. Schauble (Đại học bang Colorado) Keith Schubert (CSU San
Bernardino) William L. Schultz, Kelly Shaw (Đại học Richmond) Shahram
Shirani (Đại học McMaster) Scott Sigman (Đại học Drury) Shai Simonson (Cao
đẳng Stonehill) Bruce Smith, David Smith, Jeff W. Smith (Đại học Georgia,
Athens) Đánh dấu Smotherman (Đại học Clemson) Philip Snyder (Đại học Johns
Hopkins) Alex Sprintson (Texas A & M) Timothy D. Stanley (Đại học trẻ
Brigham) Trưởng khoa Stevens (Đại học Morningside) Nozar Tabrizi (Đại học
Kettering) Yuval Tamir (UCLA) Alexander Taubin (Đại học Boston) Thacker
(Đại học Winthrop) Mithuna Thottethodi (Đại học Purdue) Mạnh Thủy Tu (Đại
học Nam Utah) Trưởng khoa Tullsen (UC San Diego) Steve VanderLeest (Cao
đẳng Calvin) Christopher Vickery (Đại học Nữ hoàng của CUNY) Rama
Viswanathan (Cao đẳng Beloit) Ken Vollmar (Đại học bang Missouri) Vương
Vương (Đại học Indiana-Purdue) Patricia Wenner (Đại học Bucknell) Kent
Wilken (Đại học California, Davis) David Wolfe (Đại học Gustavus Adolphus)
David Gỗ (Đại học Wisconsin, Madison) Ki Hwan Yum (Đại học Texas, San
Antonio) Mohamed Zahran (Đại học thành phố New York) Amr Zaky (Đại học
Santa Clara) Gerald D. Zarnett (Đại học Ryerson) Nian Zhang (Trường Mỏ &
Công nghệ Nam Dakota) Xiaoyu Zhang (Đại học bang California San Marcos)
Kinh hoàng (Đại học Troy) Huiyang Chu (Đại học bang Bắc Carolina) Weiyu
Zhu (Đại học Illinois Wesleyan).
Một lời cảm ơn đặc biệt cũng đi đến Đánh dấu Smotherman để thực hiện
nhiều đường chuyền để tìm các trục trặc kỹ thuật và viết giúp cải thiện đáng kể
chất lượng của phiên bản này.
Chúng tôi muốn cảm ơn gia đình Morgan Kaufmann mở rộng đã đồng ý xuất
bản cuốn sách này một lần nữa dưới sự lãnh đạo có thể Katey Birtcher, Steve
Merken, và Beth LoGiudice: Tôi chắc chắn không thể hoàn thành cuốn sách mà
không có chúng. Chúng tôi cũng muốn mở rộng nhờ Paul Janish, người quản lý
quá trình sản xuất sách, và Patrick Ferguson, người đã làm thiết kế bìa.
Cuối cùng, tôi nợ một khoản nợ lớn Yunsup Lee và Andrew Waterman để
thực hiện chuyển đổi phiên bản đầu tiên thành RISC-V trong thời gian rảnh rỗi
khi thành lập công ty khởi nghiệp. Kudos đến Eric Yêu đồng thời, người đã tạo
ra các phiên bản RISC-V ban đầu của các bài tập mà cuốn sách này trong khi
hoàn thành bằng tiến sĩ của mình. Chúng tôi rất vui mừng khi thấy những gì sẽ
xảy ra với RISC-V trong học viện và hơn thế nữa.
Sự đóng góp của gần 150 người mà chúng tôi đề cập ở đây đã giúp tạo ra
phiên bản mới này mà tôi hy vọng sẽ là cuốn sách hay nhất của chúng tôi.
Thưởng thức!

David A. Patterson
TRANG NÀY TUYỆT VỜI TRÁI CÂY

?? ?? ??
1
Trừu tượng và
công nghệ máy
Nền văn minh tiến bộ tính
bằng cách mở rộng
1.1 Giới thiệu 3
số lượng các hoạt
1.2 Bảy ý tưởng tuyệt vời trong
động quan trọng mà kiến trúc máy tính 10
chúng ta có thể thực 1.3 Dưới chương trình của bạn 13
hiện mà không cần 1.4 Dưới vỏ bọc 16
suy nghĩ về chúng. 1.5 Công nghệ xây dựng bộ xử lý và bộ nhớ
25
Alfred Bắc Whitehead ,
Giới thiệu về Toán học , 1911

Tổ chức máy tính và thiết kế Phiên bản RISC-V. DOI: http://dx.doi.org/10.1016/B978-0-12-820331-6.00001-6 ©


2021 Elsevier Inc. Đã đăng ký Bản quyền.
1.6 Hiệu suất 29
1.7 Bức tường điện 40
1.8 Thay đổi biển: Chuyển từ bộ vi xử lý sang bộ đa xử
lý 43
1.9 Real Stuff: Điểm chuẩn Intel Core i7 46
1.10 Nhanh hơn: Ma trận nhân trong Python 49
1.11 Ngụy biện và Cạm bẫy 50
1.12 Kết luận 53

1.13 Quan điểm lịch sử và đọc thêm 55


1.14 Tự học 55
1.15 Bài tập 59

1.1 Giới thiệu

Chào mừng đến với cuốn sách này! Chúng tôi rất vui mừng khi có cơ hội này để
truyền tải sự phấn khích của thế giới hệ thống máy tính. Đây không phải là một
lĩnh vực khô khan và thê lương, nơi tiến bộ là băng hà và là nơi những ý tưởng
mới teo đi sự bỏ bê. Không! Máy tính là sản phẩm của ngành công nghệ thông tin
vô cùng sôi động, tất cả các khía cạnh chịu trách nhiệm cho gần 10% tổng sản
phẩm quốc gia của Hoa Kỳ và nền kinh tế của họ đã phụ thuộc một phần vào sự
cải tiến nhanh chóng của công nghệ thông tin. Ngành công nghiệp bất thường này
bao trùm sự đổi mới với tốc độ ngoạn mục. Trong 40 năm qua, đã có một số máy
tính mới có phần giới thiệu xuất hiện để cách mạng hóa ngành công nghiệp điện
toán; những cuộc cách mạng này đã bị cắt ngắn chỉ vì một người khác chế tạo
một máy tính thậm chí còn tốt hơn.
Cuộc đua đổi mới này đã dẫn đến những tiến bộ chưa từng có kể từ khi bắt đầu
điện toán điện tử vào cuối những năm 1940. Nếu ngành công nghiệp vận tải theo
kịp với ngành công nghiệp máy tính, ví dụ, hôm nay chúng ta có thể đi từ New
York đến London trong một giây để kiếm một xu. Chỉ dành một chút thời gian để
suy ngẫm về sự cải thiện như thế nào sẽ thay đổi xã hội sống ở Tahiti khi làm
việc ở San Francisco, đến Moscow vào một buổi tối tại Bolshoi ballet và bạn có
thể đánh giá cao ý nghĩa của sự thay đổi đó.
4 Chương 1 Trừu tượng và công nghệ máy tính

Máy tính đã dẫn đến một cuộc cách mạng thứ ba cho nền văn minh, với cuộc
cách mạng thông tin diễn ra cùng với các cuộc cách mạng nông nghiệp và công
nghiệp. Sự nhân lên kết quả của sức mạnh trí tuệ và tầm với của loài người một
cách tự nhiên đã ảnh hưởng sâu sắc đến cuộc sống hàng ngày của chúng ta và
thay đổi cách thức tìm kiếm kiến thức mới. Hiện nay đã có một mạch điều tra
khoa học mới, với các nhà khoa học tính toán tham gia cùng các nhà khoa học lý
thuyết và thực nghiệm trong việc khám phá các biên giới mới trong thiên văn học,
sinh học, hóa học và vật lý, trong số những người khác.
Cuộc cách mạng máy tính vẫn tiếp tục. Mỗi khi chi phí điện toán cải thiện
theo hệ số 10 khác, cơ hội cho máy tính sẽ nhân lên. Các ứng dụng không kinh tế
đột nhiên trở nên thiết thực. Trong thời gian gần đây, các ứng dụng sau đây là
khoa học viễn tưởng máy tính.Giáo dục
■ Máy tính trong ô tô: Cho đến khi bộ vi xử lý được cải thiện đáng kể về giá
cả và hiệu suất vào đầu những năm 1980, việc điều khiển máy tính của ô tô
là lố bịch. Ngày nay, máy tính giảm ô nhiễm, cải thiện hiệu quả nhiên liệu
thông qua điều khiển động cơ và tăng tính an toàn thông qua lạm phát lái xe
và túi khí gần như tự động để bảo vệ người ngồi trong một vụ tai nạn.
■ Điện thoại di động: Ai có thể mơ rằng những tiến bộ trong máy tính các hệ
thống sẽ dẫn đến hơn một nửa hành tinh có điện thoại di động, cho phép
giao tiếp giữa người với người với hầu hết mọi người ở mọi nơi trên thế
giới?

■ Dự án bộ gen người: Chi phí của thiết bị máy tính để lập bản đồ và phân
tích trình tự DNA của con người là hàng trăm triệu đô la. Nó không chắc
rằng bất cứ ai cũng đã xem xét dự án này có chi phí máy tính cao hơn 10
đến 100 lần, vì chúng sẽ có từ 15 đến 25 năm trước. Hơn nữa, chi phí tiếp
tục giảm; bạn sẽ sớm có thể có được bộ gen của riêng bạn, cho phép chăm
sóc y tế được điều chỉnh phù hợp với bạn.
■ World Wide Web: Không tồn tại tại thời điểm phiên bản đầu tiên của cuốn
sách này , web đã thay đổi xã hội của chúng ta. Đối với nhiều người, web
đã thay thế các thư viện và báo chí.
■ Công cụ tìm kiếm: Khi nội dung của web tăng kích thước và giá trị, tìm
kiếm thông tin liên quan ngày càng trở nên quan trọng. Ngày nay, nhiều
người dựa vào các công cụ tìm kiếm cho một phần lớn cuộc sống của họ
đến mức sẽ khó khăn nếu không có họ.
Rõ ràng, những tiến bộ trong công nghệ này hiện ảnh hưởng đến hầu hết mọi
khía cạnh của xã hội chúng ta. Những tiến bộ phần cứng đã cho phép các lập
trình viên tạo ra phần mềm hữu ích tuyệt vời, điều này giải thích tại sao máy tính
có mặt ở khắp mọi nơi. Hôm nay, khoa học viễn tưởng của Nhật Bản gợi ý các
ứng dụng giết người ngày mai: đang trên đường đến là những chiếc kính làm
tăng thực tế, xã hội không tiền mặt và những chiếc xe có thể tự lái.
1.1 Giới thiệu 5

Các lớp ứng dụng điện toán truyền thống và đặc điểm
của chúng
Mặc dù một bộ công nghệ phần cứng phổ biến (xem Phần 1.4 và 1.5) được sử
dụng trong các máy tính từ thiết bị gia dụng thông minh đến điện thoại di động máy tính cá nhân (PC)
Một cái máy tính được
đến siêu máy tính lớn nhất, các ứng dụng khác nhau này có yêu cầu thiết kế riêng
thiết kế để sử dụng bởi
biệt và sử dụng các công nghệ phần cứng cốt lõi theo những cách khác nhau. Nói một cá nhân, thường kết
rộng ra, máy tính được sử dụng trong ba lớp ứng dụng không giống nhau. hợp màn hình đồ họa,
Máy tính cá nhân (PC) ở dạng máy tính xách tay có thể là nổi tiếng nhất hình bàn phím và chuột.
thức điện toán, mà độc giả của cuốn sách này có thể đã sử dụng rộng rãi. Máy máy chủ Một cái máy tính
tính cá nhân nhấn mạnh việc cung cấp hiệu suất tốt cho người dùng đơn lẻ với chi được sử dụng để chạy các
phí thấp và thường thực hiện phần mềm của bên thứ ba. Lớp điện toán này đã chương trình lớn hơn cho
thúc đẩy sự phát triển của nhiều công nghệ điện toán, chỉ mới 40 tuổi! nhiều người dùng, thường là
Máy chủ là hình thức hiện đại của những gì đã từng là máy tính lớn hơn nhiều, đồng thời và thường chỉ
và thường chỉ được truy cập thông qua một mạng. Các máy chủ được định hướng được truy cập qua mạng.
để mang khối lượng công việc khá lớn, có thể bao gồm một trong hai ứng dụng siêu máy tính Một lớp
phức tạp duy nhất, thường là một ứng dụng khoa học hoặc kỹ thuật, hoặc xử lý học của máy tính có hiệu
nhiều công việc nhỏ, chẳng hạn như sẽ xảy ra trong việc xây dựng một máy chủ suất và chi phí cao nhất;
web lớn. Các ứng dụng này thường dựa trên phần mềm từ một nguồn khác (như chúng được cấu hình dưới
cơ sở dữ liệu hoặc hệ thống mô phỏng), nhưng thường được sửa đổi hoặc tùy dạng máy chủ và thường
chỉnh cho một chức năng cụ thể. Máy chủ được xây dựng từ cùng một công nghệ có giá hàng chục đến
cơ bản như máy tính để bàn, nhưng cung cấp khả năng tính toán, lưu trữ và đầu hàng trăm triệu đô la.
vào / đầu ra lớn hơn. Nói chung, các máy chủ cũng chú trọng cao hơn vào độ tin terabyte (TB) Ban đầu
cậy, vì sự cố thường tốn kém hơn so với PC của một người dùng . 1.099.511.627.776 (240)
Máy chủ trải rộng phạm vi rộng nhất về chi phí và khả năng. Ở cấp thấp, một máy chủ byte, mặc dù các nhà phát
triển hệ thống lưu trữ thứ
có thể ít hơn một máy tính để bàn mà không có màn hình hoặc bàn phím và có giá một
cấp và truyền thông bắt đầu
nghìn đô la. Các máy chủ cấp thấp này thường được sử dụng để lưu trữ tệp, ứng dụng sử dụng thuật ngữ này có
kinh doanh nhỏ hoặc phục vụ web đơn giản. Ở cực đoan khác là siêu máy tính, mà hiện nghĩa là 1.000.000.000.000
tại bao gồm hàng trăm ngàn bộ xử lý và nhiều terabyte bộ nhớ, và có giá hàng chục đến (1012) byte. Để giảm nhầm
hàng trăm triệu đô la. Siêu máy tính thường được sử dụng cho các tính toán khoa học và lẫn, bây giờ chúng tôi sử
kỹ thuật cao cấp, chẳng hạn như dự báo thời tiết, thăm dò dầu, xác định cấu trúc protein dụng thuật ngữ này
và các vấn đề quy mô lớn khác. Mặc dù các siêu máy tính như vậy đại diện cho khả năng tebibyte (TiB) cho
240 byte, xác định terabyte
tính toán cao nhất, nhưng chúng chiếm một phần tương đối nhỏ trong các máy chủ và do
(TB) có nghĩa là 1012 byte.
đó là một phần rất nhỏ của thị trường máy tính nói chung về tổng doanh thu.
Hình 1.1 cho thấy đầy đủ
Máy tính nhúng là lớp máy tính lớn nhất và trải rộng phạm vi rộng nhất của các phạm vi của các giá trị thập
ứng dụng và hiệu suất. Các máy tính nhúng bao gồm các bộ vi xử lý được tìm thấy phân và nhị phân và tên.
trong xe hơi của bạn, các máy tính trong TV và mạng lưới bộ xử lý điều khiển một
chiếc máy bay hoặc tàu chở hàng hiện đại. Một thuật ngữ phổ biến ngày nay là
máy tính nhúng Một
Internet of Things (IoT) gợi ý các thiết bị nhỏ có thể giao tiếp không dây qua Internet. máy tính bên trong một
Các hệ thống máy tính nhúng được thiết kế để chạy một ứng dụng hoặc một bộ ứng thiết bị khác được sử
dụng liên quan thường được tích hợp với phần cứng và được phân phối dưới dạng dụng để chạy một ứng
một hệ thống duy nhất; do đó, mặc dù số lượng lớn máy tính nhúng, hầu hết người dụng hoặc bộ sưu tập
dùng không bao giờ thực sự thấy rằng họ đang sử dụng máy tính! phần mềm được xác định
trước.
6 Chương 1 Trừu tượng và công nghệ máy tính

kilobyte KB 103 kibibyte KiB 210 2%


megabyte MB 106 mebibyte MiB 220 5%
gigabyte GB 109 gibibyte GiB 230 7%
terabyte Lao 1012 tebibyte TiB 240 10%
petabyte PB 1015 pebibyte PiB 250 13%
exabyte EB 1018 exbibyte EiB 260 15%
zettabyte ZB 1021 zebibyte ZiB 270 18%
yottabyte YB 1024 yobibyte YiB 280 21%
ronnabyte RB 10 27 robibyte RiB 2 90 24%
queccabyte QB 10 30 quebibyte Khí công 2 100 27%

HÌNH 1.1 2X so với. 10Y byte mơ hồ đã được giải quyết bằng cách thêm một ký hiệu nhị
phân cho tất cả các thuật ngữ kích thước phổ biến. Trong cột cuối cùng, chúng tôi lưu ý thuật
ngữ nhị phân lớn hơn bao nhiêu so với thuật ngữ nhị phân của nó thuật ngữ thập phân tương ứng, được
gộp khi chúng ta đi xuống biểu đồ. Các tiền tố này hoạt động cho các bit cũng như byte, vì vậy gigabit (Gb)
là 109 bit trong khi vượn (Gib) là 230 bit. Xã hội điều hành hệ thống số liệu đã tạo ra các tiền tố thập phân,
với hai tiền tố cuối cùng chỉ được đề xuất vào năm 2019 với dự đoán về khả năng toàn cầu của các hệ
thống lưu trữ. Tất cả các tên được bắt nguồn từ entymology trong tiếng Latin của sức mạnh 1000 mà
chúng đại diện.

Các ứng dụng nhúng thường có các yêu cầu ứng dụng độc đáo kết hợp hiệu suất
tối thiểu với các hạn chế nghiêm ngặt về chi phí hoặc sức mạnh. Ví dụ: xem xét một
trình phát nhạc: bộ xử lý chỉ cần nhanh nhất có thể để xử lý chức năng hạn chế của
nó và hơn thế nữa, giảm thiểu chi phí và sức mạnh là mục tiêu quan trọng nhất. Mặc
dù chi phí thấp, các máy tính nhúng thường có khả năng chịu lỗi thấp hơn, vì kết quả
có thể thay đổi từ khó chịu (khi truyền hình mới của bạn gặp sự cố) đến tàn phá
(chẳng hạn như có thể xảy ra khi máy tính trong máy bay hoặc tàu chở hàng gặp sự
cố). Trong các ứng dụng nhúng hướng đến người tiêu dùng, chẳng hạn như thiết bị
gia dụng kỹ thuật số, độ tin cậy đạt được chủ yếu thông qua sự đơn giản, trọng tâm là
thực hiện một chức năng một cách hoàn hảo nhất có thể. Trong các hệ thống nhúng
lớn, các kỹ thuật dự phòng từ thế giới máy chủ thường được sử dụng. Mặc dù cuốn
sách này tập trung vào các máy tính đa năng, hầu hết các khái niệm áp dụng trực tiếp
hoặc với các sửa đổi nhỏ đối với các máy tính nhúng.

Xây dựng: Xây dựng là các phần ngắn được sử dụng trong toàn bộ văn bản để
cung cấp thêm chi tiết về một chủ đề cụ thể có thể được quan tâm. Độc giả không
quan tâm có thể bỏ qua một Xây dựng, vì các tài liệu tiếp theo sẽ không bao giờ phụ
thuộc vào nội dung của Xây dựng.
Nhiều bộ xử lý nhúng được thiết kế bằng cách sử dụng lõi xử lý, một phiên bản
của bộ xử lý được viết bằng ngôn ngữ mô tả phần cứng, chẳng hạn như Verilog hoặc
VHDL (xem Chương 4). Lõi cho phép một nhà thiết kế tích hợp phần cứng dành riêng
cho ứng dụng khác với lõi bộ xử lý để chế tạo trên một chip duy nhất.

Chào mừng đến với Thời đại hậu PC


Cuộc tuần hành liên tục của công nghệ mang lại những thay đổi thế hệ trong phần
cứng máy tính làm rung chuyển toàn bộ ngành công nghệ thông tin. Kể từ phiên bản
thứ tư của cuốn sách, chúng tôi đã trải qua một sự thay đổi như vậy, có ý nghĩa trong
1.1 Giới thiệu 7

đó, các lập trình viên


1600 thường tuân theo một
Điện thoại thông minh tín dụng đơn giản:
1400
giảm thiểu không
1200
gian bộ nhớ để làm
cho các chương trình
Hàng triệu

1000 nhanh chóng. Trong

800

600
Điện thoại di động
(không bao gồm điện
400 thoại thông minh)
PC (không bao gồm máy
tính bảng)
200
Máy tính bảng
0
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017

201
8
HÌNH 1.2 Số lượng sản xuất mỗi năm máy tính bảng và điện thoại thông minh, phản ánh
thời kỳ hậu PC, so với máy tính cá nhân và điện thoại di động truyền thống. Thông minh
điện thoại đại diện cho sự phát triển gần đây trong ngành công nghiệp điện thoại di động và họ đã vượt qua
PC vào năm 2011. PC, máy tính bảng và các loại điện thoại di động truyền thống đang giảm dần. Năm khối
lượng cao nhất là năm 2011 cho điện thoại di động, 2013 cho PC và 2014 cho máy tính bảng. PC đã giảm
từ 20% tổng số đơn vị được vận chuyển trong năm 2007 xuống còn 10% vào năm 2018.

quá khứ khi công tắc bắt đầu từ 40 năm trước với máy tính cá nhân. Thay thế PC là
thiết bị di động cá nhân (PMD) PMD được vận hành bằng pin với kết nối không
dây với Internet và thường có giá hàng trăm đô la, và giống như PC, người dùng có
thể tải xuống phần mềm (ứng dụng ứng dụng trực tuyến) để chạy trên chúng. Không
giống như PC, chúng không còn có bàn phím và chuột và có nhiều khả năng dựa vào
màn hình cảm ứng hoặc thậm chí là đầu vào giọng nói. Hôm nay, PMD là một chiếc
điện thoại thông minh hoặc máy tính bảng, nhưng ngày mai nó có thể bao gồm kính
điện tử. Hình 1.2 cho thấy sự tăng trưởng nhanh chóng theo thời gian của máy tính
bảng và điện thoại thông minh so với PC và điện thoại di động truyền thống.
Tiếp quản từ máy chủ thông thường là Điện toán đám mây, dựa trên các trung tâm dữ
liệu khổng lồ hiện được gọi là Máy tính quy mô kho (WSC). Các công ty như Amazon và
Google xây dựng các WSC này chứa 50.000 máy chủ và sau đó cho phép các công ty
thuê các phần của chúng để họ có thể cung cấp dịch vụ phần mềm cho PMD mà không
phải tự xây dựng WSC. Thật, Phần mềm dưới dạng dịch vụ (SaaS) được triển khai
thông qua Đám mây đang cách mạng hóa ngành công nghiệp phần mềm giống như các
PMD và WSC đang cách mạng hóa ngành công nghiệp phần cứng. Ngày nay, các nhà
phát triển phần mềm của Lốc thường sẽ có một phần ứng dụng của họ chạy trên PMD và
một phần chạy trong Đám mây.

Những gì bạn có thể học trong cuốn sách này


Các lập trình viên thành công luôn quan tâm đến hiệu suất của các chương trình
của họ, bởi vì việc nhanh chóng đạt được kết quả cho người dùng là rất quan
trọng trong việc tạo ra phần mềm phổ biến. Trong những năm 1960 và 1970, một
hạn chế chính đối với hiệu suất máy tính là kích thước của bộ nhớ máy tính. Do
Thiết bị di động cá nhân (PMD) là các thiết bị không dây nhỏ để kết nối Internet; họ dựa vào
pin để lấy năng lượng và phần mềm được cài đặt bằng cách tải xuống ứng dụng. Ví dụ thông
thường là điện thoại thông minh và máy tính bảng.
Điện toán đám mây đề cập đến các bộ sưu tập lớn các máy chủ cung cấp dịch vụ qua
Internet; một số nhà cung cấp thuê số lượng máy chủ thay đổi linh hoạt như một tiện ích.
Phần mềm dưới dạng dịch vụ (SaaS) cung cấp phần mềm và dữ liệu dưới dạng dịch vụ qua
Internet, thường thông qua một chương trình mỏng như trình duyệt chạy trên các thiết bị máy
khách cục bộ, thay vì mã nhị phân phải được cài đặt và chạy hoàn toàn trên thiết bị đó. Ví dụ bao
gồm tìm kiếm web và mạng xã hội.
số 8 Chương 1 Trừu tượng và công nghệ máy tính

hai thập kỷ qua, những tiến bộ trong thiết kế máy tính và công nghệ bộ nhớ đã
làm giảm đáng kể tầm quan trọng của kích thước bộ nhớ nhỏ trong hầu hết các
ứng dụng khác ngoài các ứng dụng trong các hệ thống máy tính nhúng.
Các lập trình viên quan tâm đến hiệu suất bây giờ cần phải hiểu các vấn đề đã
thay thế mô hình bộ nhớ đơn giản của những năm 1960: bản chất song song của
bộ xử lý và bản chất phân cấp của bộ nhớ. Chúng tôi chứng minh tầm quan trọng
của sự hiểu biết này trong Chương 3 đến 6 bằng cách chỉ ra cách cải thiện hiệu
suất của chương trình C với hệ số 200. Hơn nữa, như chúng tôi giải thích trong
Mục 1.7, ngày nay các lập trình viên của nhóm cần phải lo lắng về hiệu quả năng
lượng của các chương trình của họ chạy trên PMD hoặc trên Đám mây, điều này
cũng đòi hỏi phải hiểu những gì bên dưới mã của bạn. Do đó, các lập trình viên
tìm cách xây dựng các phiên bản cạnh tranh của phần mềm sẽ cần tăng cường
kiến thức về tổ chức máy tính.
Chúng tôi rất vinh dự khi có cơ hội giải thích những gì bên trong cỗ máy
mang tính cách mạng này, làm sáng tỏ phần mềm bên dưới chương trình của bạn
và phần cứng dưới vỏ máy tính của bạn. Khi bạn hoàn thành cuốn sách này,
chúng tôi tin rằng bạn sẽ có thể trả lời các câu hỏi sau :
■ Làm thế nào các chương trình được viết bằng ngôn ngữ cấp cao, chẳng hạn
như C hoặc Java, được dịch sang ngôn ngữ của phần cứng và cách phần
cứng thực thi chương trình kết quả? Hiểu các khái niệm này tạo thành cơ sở
để hiểu các khía cạnh của cả phần cứng và phần mềm ảnh hưởng đến hiệu
suất của chương trình.
■ Giao diện giữa phần mềm và phần cứng là gì và phần mềm hướng dẫn phần
cứng thực hiện các chức năng cần thiết như thế nào? Những khái niệm này
rất quan trọng để hiểu cách viết nhiều loại phần mềm.
■ Điều gì quyết định hiệu suất của một chương trình và làm thế nào một lập trình
viên có thể cải thiện hiệu suất? Như chúng ta sẽ thấy, điều này phụ thuộc vào
chương trình gốc, phần mềm dịch chương trình đó sang ngôn ngữ máy tính và
hiệu quả của phần cứng trong việc thực hiện chương trình.
■ Những kỹ thuật có thể được sử dụng bởi các nhà thiết kế phần cứng để cải thiện
hiệu suất? Cuốn sách này sẽ giới thiệu các khái niệm cơ bản của thiết kế máy
tính hiện đại. Người đọc quan tâm sẽ tìm thấy nhiều tài liệu hơn về chủ đề này
trong cuốn sách nâng cao của chúng tôi , Kiến trúc máy tính: Cách tiếp cận định
lượng.
■ Những kỹ thuật nào có thể được sử dụng bởi các nhà thiết kế phần cứng để cải
thiện hiệu quả năng lượng? Lập trình viên có thể làm gì để giúp đỡ hoặc cản trở
hiệu quả năng lượng?
vi xử lý đa lõi
A bộ vi xử lý chứa nhiều ■ Các lý do và hậu quả của việc chuyển đổi từ xử lý tuần tự sang xử lý song
bộ xử lý (môi lõi) trong song là gì? Cuốn sách này đưa ra động lực, mô tả các cơ chế phần cứng hiện
một mạch tích hợp duy tại để hỗ trợ song song và khảo sát thế hệ mới Bộ vi xử lý đa lõi của người
nhất. Viking (xem Chương 6).
■ Kể từ máy tính thương mại đầu tiên vào năm 1951, những kiến trúc sư máy
tính đã nghĩ ra những ý tưởng tuyệt vời nào đặt nền tảng của điện toán hiện
đại?
1.1 Giới thiệu 9

Không hiểu câu trả lời cho những câu hỏi này, cải thiện hiệu suất của chương
trình của bạn trên một máy tính hiện đại hoặc đánh giá những tính năng nào có
thể làm cho một máy tính tốt hơn một máy tính khác cho một ứng dụng cụ thể sẽ
là một quá trình thử nghiệm và lỗi phức tạp, thay vì một quy trình khoa học được
thúc đẩy bởi cái nhìn sâu sắc và phân tích.
Chương đầu tiên này đặt nền tảng cho phần còn lại của cuốn sách. Nó giới
thiệu các ý tưởng và định nghĩa cơ bản, đặt các thành phần chính của phần mềm
và phần cứng trong quan điểm, cho thấy cách đánh giá hiệu suất và năng lượng,
giới thiệu các mạch tích hợp (công nghệ thúc đẩy cuộc cách mạng máy tính) và
giải thích sự chuyển đổi sang đa lõi.
Trong chương này và những cái sau, bạn có thể sẽ thấy nhiều từ mới, hoặc
những từ mà bạn có thể đã nghe nhưng không chắc chúng có nghĩa gì. Don lồng
hoảng loạn! Vâng, có rất nhiều thuật ngữ đặc biệt được sử dụng để mô tả các máy
tính hiện đại, nhưng thuật ngữ thực sự có ích, vì nó cho phép chúng tôi mô tả
chính xác một chức năng hoặc khả năng. Ngoài ra, các nhà thiết kế máy tính (bao
gồm cả các tác giả của bạn) yêu và quý sử dụng từ viết tắt, đó là dễ dàng để hiểu từ viết tắt Một từ được
một khi bạn biết những gì các chữ cái đại diện cho! Để giúp bạn nhớ và xác định xây dựng bằng cách lấy
vị trí các điều khoản, chúng tôi đã bao gồm a nhấn mạnh định nghĩa của mọi các chữ cái ban đầu của
một chuỗi các từ. Ví dụ:
thuật ngữ trong lề lần đầu tiên nó xuất hiện trong văn bản. Sau một thời gian
RAM là từ viết tắt của
ngắn làm việc với thuật ngữ này, bạn sẽ thông thạo và bạn bè của bạn sẽ bị ấn Bộ nhớ truy cập ngẫu
tượng khi bạn sử dụng chính xác các từ viết tắt như BIOS, CPU, DIMM, DRAM, nhiên và CPU là từ viết
PCIe, SATA và nhiều từ khác. tắt của Đơn vị xử lý
Để củng cố cách các phần mềm và hệ thống phần cứng được sử dụng để chạy trung tâm.
chương trình sẽ ảnh hưởng đến hiệu suất, chúng tôi sử dụng một phần đặc biệt ,
Hiểu hiệu suất chương trình, trong suốt cuốn sách để tóm tắt những hiểu biết
quan trọng về hiệu suất chương trình. Cái đầu tiên xuất hiện dưới đây.

Hiệu suất của chương trình phụ thuộc vào sự kết hợp hiệu quả của các thuật toán
được sử dụng trong chương trình, các hệ thống phần mềm được sử dụng để tạo và
dịch chương trình thành hướng dẫn máy và hiệu quả của máy tính trong việc thực
hiện các hướng dẫn đó, có thể bao gồm đầu vào / đầu ra (I / O) hoạt động. Bảng này
tóm tắt cách phần cứng và phần mềm ảnh hưởng đến hiệu suất.

Phần cứng hoặc phần


mềm Đây là đâu
Làm thế nào thành phần này ảnh hưởng chủ đề được bảo
thành phần đến hiệu suất hiểm?
Những cuốn sách
Thuật toán Xác định cả số lượng cấp nguồn khác!
báo cáo và số lượng hoạt động I / O
thực hiện
Ngôn ngữ lập trình , Xác định số lượng hướng dẫn máy tính Chương 2 và 3
trình biên dịch, và kiến trúc cho mỗi tuyên bố cấp nguồn
Xác định làm thế nào hướng dẫn nhanh có thể
Bộ xử lý và bộ nhớ được Chương 4, 5, và 6
hệ thống thực hiện
Hệ thống I / O (phần cứng
và Xác định tốc độ hoạt động của I / O Chương 4, 5, và 6
hệ điều hành) thực hiện
Hiểu hiệu suất chương trình
10 Chương 1 Trừu tượng và công nghệ máy tính

Kiểm tra Kiểm tra bản thân các phần được thiết kế để giúp người đọc đánh giá xem chúng
Bản hiểu các khái niệm chính được giới thiệu trong một chương và hiểu ý nghĩa của
thân bạn các khái niệm đó. Một số Kiểm tra bản thân câu hỏi có câu trả lời đơn giản;
những người khác là để thảo luận giữa một nhóm. Câu trả lời cho các câu hỏi cụ
thể có thể được tìm thấy ở cuối chương. Kiểm tra bản thân các câu hỏi chỉ xuất
hiện ở cuối phần, giúp bạn dễ dàng bỏ qua chúng nếu bạn chắc chắn rằng bạn
hiểu tài liệu.
1. Số lượng bộ xử lý nhúng được bán hàng năm vượt xa số lượng PC và thậm
chí cả bộ xử lý sau PC. Bạn có thể xác nhận hoặc từ chối cái nhìn sâu sắc
này dựa trên kinh nghiệm của riêng bạn? Cố gắng đếm số lượng bộ xử lý
nhúng trong nhà của bạn. Làm thế nào để nó so sánh với số lượng máy tính
thông thường trong nhà của bạn?
2. Như đã đề cập trước đó, cả phần mềm và phần cứng đều ảnh hưởng đến
hiệu suất của một chương trình. Bạn có thể nghĩ về các ví dụ trong đó mỗi
điều sau đây là nơi thích hợp để tìm kiếm một nút cổ chai hiệu suất?
■ Thuật toán đã chọn
■ Ngôn ngữ lập trình hoặc trình biên dịch
■ Hệ điều hành
■ Bộ xử lý
■ Hệ thống I / O và các thiết bị

Bảy ý tưởng tuyệt vời trong


máy tính
1.2
Kiến trúc

Bây giờ chúng tôi giới thiệu bảy ý tưởng tuyệt vời mà các kiến trúc sư máy tính
đã phát minh ra trong 60 năm qua của thiết kế máy tính. Những ý tưởng này
mạnh mẽ đến mức chúng tồn tại rất lâu sau khi máy tính đầu tiên sử dụng chúng,
với các kiến trúc sư mới hơn thể hiện sự ngưỡng mộ của họ bằng cách bắt chước
những người tiền nhiệm của họ. Những ý tưởng tuyệt vời này là những chủ đề
mà chúng ta sẽ dệt qua chương này và các chương tiếp theo khi các ví dụ phát
sinh. Để chỉ ra ảnh hưởng của chúng, trong phần này, chúng tôi giới thiệu các
biểu tượng và thuật ngữ nổi bật đại diện cho những ý tưởng tuyệt vời và chúng
tôi sử dụng chúng để xác định gần 100 phần của cuốn sách có tính năng sử dụng
các ý tưởng tuyệt vời.
1.2 Bảy ý tưởng tuyệt vời trong kiến trúc máy tính 11

Sử dụng Trừu tượng hóa để Đơn giản hóa Thiết kế


Cả kiến trúc sư máy tính và lập trình viên đều phải phát minh ra các kỹ thuật để
làm cho bản thân hiệu quả hơn, vì nếu không thời gian thiết kế sẽ kéo dài đáng
kể khi tài nguyên tăng lên. Một kỹ thuật năng suất chính cho phần cứng và phần
mềm là sử dụng trừu tượng để mô tả thiết kế ở các cấp độ đại diện khác nhau;
chi tiết cấp thấp hơn được ẩn để cung cấp một mô hình đơn giản hơn ở cấp cao
hơn. Chúng tôi sẽ sử dụng biểu tượng hội họa trừu tượng để thể hiện ý tưởng
tuyệt vời thứ hai này.

Làm cho trường hợp chung nhanh chóng


Làm cho trường hợp phổ biến nhanh sẽ có xu hướng tăng cường hiệu suất tốt hơn
so với tối ưu hóa trường hợp hiếm. Trớ trêu thay, trường hợp phổ biến thường đơn
giản hơn trường hợp hiếm và do đó thường dễ dàng hơn để tăng cường. Lời khuyên
thông thường này ngụ ý rằng bạn biết trường hợp phổ biến là gì, điều này chỉ có thể
với thử nghiệm và đo lường cẩn thận (xem Mục 1.6). Chúng tôi sử dụng một chiếc xe
thể thao làm biểu tượng để làm cho trường hợp chung nhanh chóng, vì chuyến đi phổ
biến nhất có một hoặc hai hành khách, và nó chắc chắn dễ dàng tạo ra một chiếc xe
thể thao nhanh hơn một chiếc minivan nhanh!

Hiệu suất thông qua song song


Kể từ buổi bình minh của máy tính, các kiến trúc sư máy tính đã cung cấp các
thiết kế có hiệu suất cao hơn bằng các hoạt động điện toán song song. Chúng tôi
sẽ thấy nhiều ví dụ về song song trong cuốn sách này. Chúng tôi sử dụng nhiều
động cơ phản lực của một chiếc máy bay làm biểu tượng của chúng tôi hiệu suất
song song.

Hiệu suất thông qua Pipeling


Một mô hình song song đặc biệt rất phổ biến trong kiến trúc máy tính đến nỗi nó
xứng đáng với tên riêng của nó : đường ốngVí dụ, trước khi có xe cứu hỏa, một
lữ đoàn bucket của người Hồi giáo sẽ phản ứng với một đám cháy, mà nhiều bộ
phim cao bồi thể hiện để đáp lại hành động đê tiện của nhân vật phản diện. Người
dân thị trấn tạo thành một chuỗi con người để mang một nguồn nước để bắn, vì
họ có thể nhanh chóng di chuyển các xô lên chuỗi thay vì các cá nhân chạy đi
chạy lại. Biểu tượng đường ống của chúng tôi là một chuỗi các đường ống, với
mỗi phần đại diện cho một giai đoạn của đường ống.

Hiệu suất thông qua Dự đoán


Theo câu nói rằng có thể tốt hơn để yêu cầu sự tha thứ hơn là xin phép, ý tưởng tuyệt vời
tiếp theo là dự đoánTrong một số trường hợp, trung bình có thể đoán và bắt đầu làm việc
nhanh hơn là đợi cho đến khi bạn biết chắc chắn, giả sử rằng cơ chế phục hồi từ một dự
đoán sai không quá tốn kém và dự đoán của bạn là tương đối chính xác. Chúng tôi sử
dụng quả cầu pha lê thầy bói làm biểu tượng dự đoán của chúng tôi.
12 Chương 1 Trừu tượng và công nghệ máy tính

Phân cấp ký ức
Các lập trình viên muốn bộ nhớ nhanh, lớn và rẻ, vì tốc độ bộ nhớ thường định hình hiệu
suất, công suất giới hạn kích thước của các vấn đề có thể giải quyết và chi phí bộ nhớ
ngày nay thường là phần lớn chi phí máy tính. Các kiến trúc sư đã phát hiện ra rằng họ có
thể giải quyết những nhu cầu mâu thuẫn này với a thứ bậc của ký ức, với bộ nhớ nhanh
nhất, nhỏ nhất và đắt nhất trên mỗi bit ở đầu phân cấp và chậm nhất, lớn nhất và rẻ nhất
trên mỗi bit ở phía dưới. Như chúng ta sẽ thấy trong Chương 5, bộ nhớ cache tạo cho lập
trình viên ảo tưởng rằng bộ nhớ chính gần như nhanh bằng đỉnh của hệ thống phân cấp và
gần như lớn và rẻ như đáy của hệ thống phân cấp. Chúng tôi sử dụng biểu tượng tam giác
xếp lớp để thể hiện hệ thống phân cấp bộ nhớ. Hình dạng cho biết tốc độ, chi phí và kích
thước: càng gần đỉnh, bộ nhớ càng nhanh và đắt hơn; cơ sở của lớp càng rộng, bộ nhớ
càng lớn.

Độ tin cậy thông qua dự phòng


Máy tính không chỉ cần nhanh; họ cần phải đáng tin cậy. Vì bất kỳ thiết bị vật lý nào
cũng có thể bị lỗi, chúng tôi tạo ra các hệ thống đáng tin cậy bằng cách bao gồm các
thành phần dư thừa có thể tiếp quản khi xảy ra lỗi và để giúp phát hiện thất bại. Chúng tôi
sử dụng xe đầu kéo làm biểu tượng của chúng tôi, vì lốp kép ở mỗi bên của trục sau cho
phép xe tải tiếp tục lái ngay cả khi lốp xe bị hỏng. (Có lẽ, tài xế xe tải ngay lập tức đến
một cơ sở sửa chữa để lốp xe phẳng có thể được sửa chữa, do đó khôi phục lại sự dư
thừa!)
Trong phiên bản trước, chúng tôi đã liệt kê một ý tưởng tuyệt vời thứ tám, đó
là Thiết kế cho Luật Moore Moore.Gordon Gordon Moore, một trong những
người sáng lập Intel, đã đưa ra một dự đoán đáng chú ý vào năm 1965: tài
nguyên mạch tích hợp sẽ tăng gấp đôi mỗi năm. Một thập kỷ sau, ông sửa đổi dự
đoán của mình thành gấp đôi cứ sau hai năm.
Dự đoán của ông là chính xác, và trong 50 năm kiến trúc máy tính hình luật Moore
Moore. Vì các thiết kế máy tính có thể mất nhiều năm, các tài nguyên có sẵn trên mỗi
chip (các bóng bán dẫn của Google, xem trang 25) có thể dễ dàng tăng gấp đôi hoặc gấp
ba giữa lúc bắt đầu và kết thúc dự án. Giống như một game bắn súng xiên, các kiến trúc
sư máy tính đã phải dự đoán công nghệ sẽ ở đâu khi thiết kế hoàn thành thay vì thiết kế
khi nó bắt đầu.
Than ôi, không có sự tăng trưởng theo cấp số nhân có thể tồn tại mãi mãi và
luật Moore Moore không còn chính xác nữa. Sự chậm chạp của luật Moore
Moore gây sốc cho các nhà thiết kế máy tính đã tận dụng nó từ lâu. Một số người
không muốn tin rằng nó đã kết thúc mặc dù có bằng chứng đáng kể ngược lại.
Một phần lý do là sự nhầm lẫn giữa việc nói rằng Moore dự đoán tỷ lệ nhân đôi
hai năm một lần hiện không chính xác và cho rằng chất bán dẫn sẽ không còn cải
thiện. Công nghệ bán dẫn sẽ tiếp tục cải thiện nhưng chậm hơn so với trước đây.
Bắt đầu với phiên bản này, chúng tôi sẽ thảo luận về ý nghĩa của việc làm chậm
luật Moore Moore, đặc biệt là trong Chương 6.

Xây dựng: Trong thời hoàng kim của luật Moore Moore, chi phí cho mỗi tài nguyên
chip giảm với mỗi thế hệ công nghệ mới. Đối với các công nghệ mới nhất, chi phí cho
mỗi tài nguyên có thể bằng phẳng hoặc thậm chí tăng với mỗi thế hệ mới do chi phí
của thiết bị mới, các quy trình phức tạp được phát minh để làm cho chip hoạt động ở
kích thước tính năng tốt hơn và giảm số của các công ty đầu tư vào các công nghệ
mới này để thúc đẩy tình trạng của nghệ thuật. Ít cạnh tranh tự nhiên dẫn đến giá cao
hơn.
1.3 Dưới chương trình của bạn 13

Ở Paris, họ chỉ đơn


giản nhìn chằm chằm
1.3 Dưới chương trình của bạn khi tôi nói chuyện với
họ bằng tiếng Pháp;
Tôi chưa bao giờ thành
Một ứng dụng điển hình, chẳng hạn như bộ xử lý văn bản hoặc hệ thống cơ sở dữ công trong việc làm
liệu lớn, có thể bao gồm hàng triệu dòng mã và dựa vào các thư viện phần mềm tinh cho những kẻ ngốc đó
vi thực hiện các chức năng phức tạp để hỗ trợ ứng dụng. Như chúng ta sẽ thấy, phần
hiểu ngôn ngữ của họ.
cứng trong máy tính chỉ có thể thực hiện các hướng dẫn cấp thấp cực kỳ đơn giản. Để
Đánh dấu Twain , Các
đi từ một ứng dụng phức tạp sang các hướng dẫn nguyên thủy bao gồm một số lớp
Vô tội ở nước ngoài,
phần mềm diễn giải hoặc dịch các hoạt động cấp cao thành các hướng dẫn máy tính
đơn giản, một ví dụ về ý tưởng tuyệt vời trừu tượng. 1869
Hình 1.3 cho thấy các lớp phần mềm này được tổ chức chủ yếu trong a thời
trang phân cấp, với các ứng dụng là vòng ngoài cùng và một loạt các phần mềm
hệ thống ngồi giữa phần cứng và phần mềm ứng dụng.
Có nhiều loại phần mềm hệ thống, nhưng hai loại phần mềm hệ thống là trung
tâm của mọi hệ thống máy tính hiện nay: hệ điều hành và trình biên dịch. An hệ
điều hành giao diện giữa chương trình người dùng và phần cứng và cung cấp
nhiều dịch vụ và chức năng giám sát. Trong số các chức năng quan trọng nhất là :
■ Xử lý các hoạt động đầu vào và đầu ra cơ bản
■ Phân bổ lưu trữ và bộ nhớ
■ Cung cấp cho việc chia sẻ bảo vệ máy tính giữa nhiều ứng dụng sử dụng phần mềm hệ thống
Phần mềm cung cấp các
đồng thời
dịch vụ thường hữu ích,
Ví dụ về các hệ điều hành được sử dụng ngày nay là Linux, iOS, Android và bao gồm hệ điều hành,
Windows. trình biên dịch, bộ tải và
trình biên dịch.

hệ điều hành Chương


WLRQV R trình giám sát quản lý tài
T nguyên của máy tính vì lợi
Ô ích của các chương trình
D
I chạy trên máy tính đó.
F W
CV Z
D
S U
S H

$ VR
V
P IW
W Z

D
H

V
\ U
H
6

+ DUGZDUH

HÌNH 1.3 Một cái nhìn đơn giản về phần cứng và phần mềm dưới dạng các lớp phân cấp,
được hiển thị dưới dạng các vòng tròn đồng tâm với phần cứng ở trung tâm và phần
mềm ứng dụng ngoài cùng. Trong các ứng dụng phức tạp, thường có nhiều lớp phần mềm ứng dụng.
Ví dụ: một hệ thống cơ sở dữ liệu có thể chạy trên phần mềm hệ thống lưu trữ một ứng dụng, lần lượt chạy
trên cơ sở dữ liệu.
14 Chương 1 Trừu tượng và công nghệ máy tính

trình biên dịch Một Trình biên dịch thực hiện một chức năng quan trọng khác: bản dịch của một
chương trình dịch các chương trình được viết trong một ngôn ngữ cấp cao, chẳng hạn như C, C ++,
tuyên bố ngôn ngữ cấp Java hoặc Visual Basic thành các hướng dẫn mà phần cứng có thể thực thi. Với
cao thành các tuyên bố sự tinh vi của các ngôn ngữ lập trình hiện đại và sự đơn giản của các hướng dẫn
ngôn ngữ lắp ráp.
được thực hiện bởi phần cứng, việc dịch từ chương trình ngôn ngữ cấp cao sang
hướng dẫn phần cứng rất phức tạp. Chúng tôi cung cấp một cái nhìn tổng quan
ngắn gọn về quá trình ở đây và sau đó đi sâu hơn vào Chương 2.

Từ một ngôn ngữ cấp cao đến ngôn ngữ của phần cứng
Để nói trực tiếp với phần cứng điện tử, bạn cần gửi tín hiệu điện. Các tín hiệu dễ
hiểu nhất cho máy tính để hiểu là trên và tắt, và vì vậy bảng chữ cái máy tính chỉ
là hai chữ cái. Giống như 26 chữ cái của bảng chữ cái tiếng Anh không giới hạn
số lượng có thể được viết, hai chữ cái của bảng chữ cái máy tính không giới hạn
những gì máy tính có thể làm. Hai ký hiệu cho hai chữ cái này là số 0 và 1 và
chúng ta thường nghĩ ngôn ngữ máy tính là số trong cơ sở 2 hoặc số nhị
chữ số nhị phân Cũng phânChúng tôi đề cập đến mỗi chữ cái của người Viking là một. chữ số nhị
được gọi a bitMột trong phân hoặc là bitMáy tính là. nô lệ cho các mệnh lệnh của chúng tôi, được gọi
hai số trong cơ sở 2 (0 hướng dẫnCác hướng dẫn, chỉ là bộ sưu tập các bit mà máy tính hiểu và tuân
hoặc 1) là các thành phần
theo, có thể được coi là các số. Ví dụ, các bit.
của thông tin.

chỉ dẫn Một mệnh lệnh 1001010100101110


phần cứng máy tính đó
nói với một máy tính để thêm hai số. Chương 2 giải thích tại sao chúng tôi sử
hiểu và tuân theo.
dụng số cho hướng dẫn và dữ liệu; chúng tôi không muốn đánh cắp chương đó
sấm sét, nhưng sử dụng số cho cả hướng dẫn và dữ liệu là nền tảng của điện toán.
Các lập trình viên đầu tiên giao tiếp với máy tính với số nhị phân, nhưng điều này
rất tẻ nhạt đến nỗi họ nhanh chóng phát minh ra những ký hiệu mới gần với cách nghĩ
của con người. Lúc đầu, những ký hiệu này được dịch sang nhị phân bằng tay, nhưng
quá trình này vẫn mệt mỏi. Sử dụng máy tính để giúp lập trình máy tính, những người
tiên phong đã phát minh ra phần mềm để dịch từ ký hiệu tượng trưng sang nhị phân.
lắp ráp Một chương Chương trình đầu tiên trong số này được đặt tên là an lắp rápChương trình này
trình dịch một phiên bản
chuyển một phiên bản tượng trưng của một hướng dẫn thành phiên bản nhị phân. Ví
tượng trưng của hướng
dẫn vào phiên bản nhị
dụ, lập trình viên sẽ viết.
phân. thêm A, B
và nhà lắp ráp sẽ dịch ký hiệu này thành

1001010100101110
Hướng dẫn này cho máy tính thêm hai số A và B Tên được đặt ra cho ngôn ngữ tượng
ngôn ngữ lắp ráp trưng này, vẫn được sử dụng ngày nay, là. ngôn ngữ lắp ráp Ngược lại, ngôn ngữ
Một đại diện mang tính nhị phân mà máy hiểu là. ngôn ngữ máy móc.
biểu tượng của hướng dẫn Mặc dù là một cải tiến to lớn, ngôn ngữ lắp ráp vẫn còn xa các ký hiệu mà một
máy. nhà khoa học có thể muốn sử dụng để mô phỏng dòng chất lỏng hoặc một kế
ngôn ngữ máy móc toán viên có thể sử dụng để cân bằng các cuốn sách. Ngôn ngữ lắp ráp yêu cầu
Một đại diện nhị phân của lập trình viên viết một dòng cho mọi hướng dẫn mà máy tính sẽ tuân theo, buộc
hướng dẫn máy. lập trình viên phải suy nghĩ như máy tính.
1.3 Dưới chương trình của bạn 15

Sự thừa nhận rằng một chương trình có thể được viết để dịch một ngôn ngữ
mạnh hơn thành các hướng dẫn máy tính là một trong những bước đột phá lớn
trong những ngày đầu của điện toán. Các lập trình viên ngày nay nợ năng suất
của họ và sự tỉnh táo của họ đối với việc tạo ra ngôn ngữ lập trình cấp cao và
trình biên dịch dịch các chương trình bằng các ngôn ngữ đó thành hướng dẫn.
Hình 1.4 cho thấy mối quan hệ giữa các chương trình và ngôn ngữ này, đó là
những ví dụ về sức mạnh của trừu tượng.

Cấp cao hoán đổi (size_t v [], size_t k) cấp cao


ngôn ngữ { lập trình
chương trình size_t temp; ngôn ngữ Một chiếc di
(bằng C) temp = v [k]; động
v [k] = v [k + 1]; ngôn ngữ như C, C ++ ,
v [k + 1] = temp; Java, hoặc Visual Basic
} đó
bao gồm các từ
và ký hiệu đại số
Trình có thể được dịch bởi
biên dịch một trình biên dịch vào
lắp ráp
ngôn ngữ.

Hội hoán đổi:


ngôn ngữ slli x6, x11, 3
chương trình thêm x6, x10, x6
(đối với RISC-V) lw x5, 0 (x6)
lw x7, 4 (x6)
sw x7, 0 (x6)
sw x5, 4 (x6)
jalr x0, 0 (x1)

Lắp ráp

Máy nhị phân 00000000011011001001100010010011


ngôn ngữ 0000000011001010000001100110011
chương trình 0000000000000110011001010000011
(đối với RISC-V) 00000001000011001100110000011
0000000110010010010001000001000000000
00000100001000100100100001000000

Chương trình hình 1.4 C được biên dịch thành ngôn ngữ lắp ráp và sau đó được lắp ráp
thành ngôn ngữ máy nhị phân. Mặc dù bản dịch từ ngôn ngữ cấp cao sang ngôn ngữ máy nhị phân là
được hiển thị trong hai bước, một số trình biên dịch cắt bỏ người trung gian và sản xuất ngôn ngữ máy nhị
phân trực tiếp. Những ngôn ngữ và chương trình này được kiểm tra chi tiết hơn trong Chương 2.
16 Chương 1 Trừu tượng và công nghệ máy tính

Trình biên dịch cho phép lập trình viên viết biểu thức ngôn ngữ cấp cao này :

A+B

Trình biên dịch sẽ biên dịch nó vào câu lệnh ngôn ngữ lắp ráp này :

thêm A, B
Như đã trình bày ở trên, trình biên dịch sẽ dịch câu lệnh này thành các hướng dẫn
nhị phân cho máy tính thêm hai số A và B.
Ngôn ngữ lập trình cấp cao cung cấp một số lợi ích quan trọng. Đầu tiên, họ cho
phép lập trình viên suy nghĩ bằng ngôn ngữ tự nhiên hơn, sử dụng các từ tiếng Anh
và ký hiệu đại số, dẫn đến các chương trình trông giống văn bản hơn nhiều so với các
bảng ký hiệu mật mã (xem Hình 1.4). Hơn nữa, họ cho phép các ngôn ngữ được thiết
kế theo mục đích sử dụng của họ. Do đó, Fortran được thiết kế để tính toán khoa học,
Cobol để xử lý dữ liệu kinh doanh, Lisp để thao tác biểu tượng, v.v. Ngoài ra còn có
các ngôn ngữ dành riêng cho tên miền cho các nhóm người dùng thậm chí hẹp hơn,
chẳng hạn như những ngôn ngữ quan tâm đến học máy chẳng hạn.
Ưu điểm thứ hai của ngôn ngữ lập trình là cải thiện năng suất lập trình viên.
Một trong số ít các lĩnh vực thỏa thuận rộng rãi trong phát triển phần mềm là mất
ít thời gian hơn để phát triển các chương trình khi chúng được viết bằng các ngôn
ngữ đòi hỏi ít dòng hơn để thể hiện ý tưởng. Sự đồng nhất là một lợi thế rõ ràng
của các ngôn ngữ cấp cao hơn ngôn ngữ lắp ráp.
Ưu điểm cuối cùng là các ngôn ngữ lập trình cho phép các chương trình độc
lập với máy tính mà chúng được phát triển, vì các trình biên dịch và trình biên
dịch có thể dịch các chương trình ngôn ngữ cấp cao sang hướng dẫn nhị phân của
bất kỳ máy tính nào. Ba lợi thế này mạnh đến mức ngày nay lập trình nhỏ được
thực hiện bằng ngôn ngữ lắp ráp.

1.4 Dưới vỏ bọc

Bây giờ chúng tôi đã xem bên dưới chương trình của bạn để khám phá phần mềm
cơ bản, hãy để mở các trang bìa của máy tính của bạn để tìm hiểu về phần cứng
thiết bị đầu vào cơ bản. Phần cứng cơ bản trong bất kỳ máy tính nào thực hiện các chức năng cơ
Một cơ chế thông qua đó bản giống nhau: nhập dữ liệu, xuất dữ liệu, xử lý dữ liệu và lưu trữ dữ liệu. Làm
máy tính được cung cấp thế nào các chức năng này được thực hiện là chủ đề chính của cuốn sách này và
thông tin, chẳng hạn như các chương tiếp theo liên quan đến các phần khác nhau của bốn nhiệm vụ này.
bàn phím. Khi chúng ta đến một điểm quan trọng trong cuốn sách này, một điểm rất quan
thiết bị đầu ra Một
trọng mà chúng tôi hy vọng bạn sẽ nhớ nó mãi mãi, chúng tôi nhấn mạnh nó bằng
cơ chế truyền kết quả cách xác định nó là a Lớn Hình ảnh mục. Chúng tôi có khoảng một chục bức ảnh
tính toán cho người lớn trong cuốn sách này, đầu tiên là năm thành phần của máy tính thực hiện các
dùng, chẳng hạn như nhiệm vụ nhập, xuất, xử lý và lưu trữ dữ liệu.
màn hình hoặc máy Hai thành phần chính của máy tính là thiết bị đầu vào, chẳng hạn như micrô, và
tính khác. thiết bị đầu ra, chẳng hạn như loa. Như tên cho thấy, đầu vào cung cấp cho
1.4 Dưới vỏ bọc 17

máy tính và đầu ra là kết quả của tính toán được gửi đến người dùng. Một số
thiết bị, chẳng hạn như mạng không dây, cung cấp cả đầu vào và đầu ra cho máy
tính.
Chương 5 và 6 mô tả đầu vào / đầu ra Các thiết bị (I / O) chi tiết hơn, nhưng
hãy để một chuyến tham quan giới thiệu qua phần cứng máy tính, bắt đầu với các
thiết bị I / O bên ngoài.

Năm thành phần cổ điển của máy tính là đầu vào, đầu ra, bộ nhớ,
datapath và điều khiển, với hai phần cuối đôi khi được kết hợp và gọi là Các
bộ xử lý. Hình 1.5 cho thấy tổ chức tiêu chuẩn của một máy tính. Tổ
chức này độc lập với công nghệ phần cứng: bạn có thể đặt mọi phần của
mọi máy tính, quá khứ và hiện tại, vào một trong năm loại này. Để giúp
LỚN
bạn giữ tất cả những điều này trong phối cảnh, năm thành phần của một Hình ảnh
máy tính được hiển thị trên trang nhất của mỗi chương sau, với phần
quan tâm đến chương đó được tô sáng.

HÌNH 1.5 Tổ chức của một máy tính, hiển thị năm thành phần cổ điển. Các bộ xử lý nhận được hướng
dẫn và dữ liệu từ bộ nhớ. Đầu vào ghi dữ liệu vào bộ nhớ và đầu ra đọc dữ liệu từ bộ nhớ. Điều khiển gửi các tín
hiệu xác định các hoạt động của datapath, bộ nhớ, đầu vào và đầu ra.
18 Chương 1 Trừu tượng và công nghệ máy tính

Qua kính nhìn


màn hình tinh thể Thiết bị I / O hấp dẫn nhất có lẽ là màn hình đồ họa. Hầu hết các thiết bị di động
lỏng (LCD) Một màn cá nhân sử dụng màn hình tinh thể lỏng (LCD) để có được một màn hình mỏng,
hình công nghệ sử dụng công suất thấp. LCD không phải là nguồn sáng; thay vào đó, nó điều khiển việc
một lớp mỏng các truyền ánh sáng. Một màn hình LCD điển hình bao gồm các phân tử hình que
polyme lỏng có thể được trong chất lỏng tạo thành một chuỗi xoắn uốn cong ánh sáng vào màn hình, từ
sử dụng để truyền hoặc một nguồn sáng phía sau màn hình hoặc ít thường xuyên hơn từ ánh sáng phản xạ.
chặn ánh sáng tùy theo
Các thanh thẳng ra khi dòng điện được áp dụng và không còn uốn cong ánh sáng.
việc sử dụng điện tích.
Vì vật liệu tinh thể lỏng nằm giữa hai màn hình phân cực ở 90 độ, ánh sáng
hiển thị ma trận hoạt không thể đi qua trừ khi nó bị uốn cong. Ngày nay, hầu hết các màn hình LCD sử
động Một màn hình dụng một ma trận hoạt động có một công tắc bóng bán dẫn nhỏ ở mỗi pixel để
tinh thể lỏng sử dụng điều khiển dòng điện chính xác và tạo ra hình ảnh sắc nét hơn. Mặt nạ màu đỏ-
bóng bán dẫn để điều
xanh-xanh lam được liên kết với mỗi chấm trên màn hình xác định cường độ của
khiển việc truyền ánh
sáng ở mỗi pixel riêng lẻ. các thành phần ba màu trong hình ảnh cuối cùng; trong màn hình LCD ma trận
hoạt động màu, có ba công tắc bóng bán dẫn tại mỗi điểm.
pixel Nhỏ nhất yếu tố Hình ảnh được tạo thành từ một ma trận các yếu tố hình ảnh, hoặc pixel, có
hình ảnh cá nhân. Màn
thể được biểu diễn dưới dạng ma trận bit, được gọi là a bản đồ bitTùy thuộc vào
hình bao gồm hàng
trăm ngàn đến hàng
kích thước của màn hình và độ phân giải, ma trận hiển thị trong một máy tính
triệu pixel, được sắp bảng thông thường có kích thước từ 1024 × 768 đến 2048 × 1536. Một màn hình
xếp theo ma trận. màu có thể sử dụng 8 bit cho mỗi ba màu (đỏ, xanh dương và xanh lục), cho 24
bit cho mỗi pixel, cho phép hàng triệu màu khác nhau được hiển thị.
Thông qua màn hình
Hỗ trợ phần cứng máy tính cho đồ họa bao gồm chủ yếu là a làm mới raster
máy tính, tôi đã hạ
đệm, hoặc là đệm khung, để lưu trữ bản đồ bit. Hình ảnh được thể hiện trên màn
cánh một chiếc máy
bay trên boong tàu hình được lưu trữ trong bộ đệm khung và mẫu bit trên mỗi pixel được đọc ra màn
sân bay đang di hình đồ họa ở tốc độ làm mới. Hình 1.6 hiển thị bộ đệm khung với thiết kế đơn
chuyển, quan sát thấy giản chỉ 4 bit cho mỗi pixel.
một hạt hạt nhân đâm Mục tiêu của bản đồ bit là thể hiện trung thực những gì trên màn hình. Những
vào một cái giếng thách thức trong hệ thống đồ họa phát sinh vì mắt người rất giỏi trong việc phát
tiềm năng, bay trong hiện những thay đổi thậm chí tinh tế trên màn hình.
một tên lửa với tốc độ
gần bằng tốc độ ánh
sáng và xem một máy
tính
Bộ đệm khung
tiết lộ hoạt động
trong cùng của nó. Raster quét màn hình CRT
Ivan Sutherland, cha
1
đẻ của đồ họa máy 1
tính , Khoa học 1 Y0
Y0 00 0
Người Mỹ, 1984 Y1
1
Y1 1

X0 X1
X0 X1

HÌNH 1.6 Mỗi tọa độ trong bộ đệm khung bên trái xác định bóng của tọa độ tương ứng cho màn
hình CRT quét raster ở bên phải. Pixel (X0, Y0) chứa mẫu bit 0011, là một màu sáng hơn trên màn hình so
với mẫu bit 1101 tính bằng pixel (X1, Y1).
1.4 Dưới vỏ bọc 19

Màn hình cảm ứng


Mặc dù PC cũng sử dụng LCD, máy tính bảng và điện thoại thông minh thời hậu
PC đã thay thế bàn phím và chuột bằng màn hình cảm ứng, có lợi thế giao diện
người dùng tuyệt vời của người dùng chỉ trực tiếp vào những gì họ quan tâm thay
vì gián tiếp bằng chuột.
Mặc dù có nhiều cách để thực hiện màn hình cảm ứng, nhiều máy tính bảng
ngày nay sử dụng cảm biến điện dung. Vì con người là dây dẫn điện, nếu một
chất cách điện như thủy tinh được phủ một dây dẫn trong suốt, chạm vào làm biến
dạng trường tĩnh điện của màn hình, dẫn đến thay đổi điện dung. Công nghệ này
có thể cho phép nhiều lần chạm đồng thời, nhận ra các cử chỉ có thể dẫn đến giao
diện người dùng hấp dẫn.

Mở hộp
Hình 1.7 hiển thị nội dung của điện thoại thông minh Apple iPhone XS Max. Không có gì mạch tích hợp Cũng
đáng ngạc nhiên , trong số năm thành phần cổ điển của máy tính, I / O thống trị thiết bị thế gọi là a con chipMột
này. Danh sách các thiết bị I / O bao gồm màn hình LCD cảm ứng đa điểm điện dung, thiết bị kết hợp hàng chục
camera phía trước, camera phía sau, micrô, giắc cắm tai nghe, loa, gia tốc kế , đến hàng triệu bóng bán
dẫn.

HÌNH 1.7 Các thành phần của điện thoại di động Apple iPhone XS Max. Ở bên trái là cảm ứng đa điện
dung màn hình và màn hình LCD. Bên cạnh nó là pin. Ở phía bên phải là khung kim loại gắn LCD vào mặt
sau của iPhone. Các thành phần nhỏ ở trung tâm là những gì chúng ta nghĩ về máy tính; chúng không phải
là hình chữ nhật đơn giản để vừa vặn bên trong vỏ bên cạnh pin. Hình 1.8 hiển thị cận cảnh của bảng bên
trái của vỏ kim loại, đó là bảng mạch in logic có chứa bộ xử lý và bộ nhớ. (Lịch sự TechIngishts ,
www.techIngishts.com)
20 Chương 1 Trừu tượng và công nghệ máy tính

bộ xử lý trung tâm con quay hồi chuyển, mạng Wi-Fi và mạng Bluetooth. Datapath, điều khiển và
(CPU) Cũng được gọi bộ nhớ là một phần rất nhỏ của các thành phần.
bộ xử lý. Phần hoạt động Các hình chữ nhật nhỏ trong Hình 1.8 chứa các thiết bị thúc đẩy công nghệ
của máy tính, chứa
tiên tiến của chúng tôi, được gọi mạch tích hợp và biệt danh khoai tây chiên
datapath và điều khiển và
thêm số, kiểm tra số, tín Gói A12 nhìn thấy ở giữa. Hình 1.8 chứa hai bộ xử lý ARM lớn và bốn nhỏ hoạt
hiệu thiết bị I / O để kích động với tốc độ xung nhịp 2,5 GHz. Các bộ xử lý là phần hoạt động của máy tính,
hoạt, v.v. làm theo hướng dẫn của chương trình gửi thư. Nó thêm số, số kiểm tra, thiết bị I /
O tín hiệu để kích hoạt, v.v. Thỉnh thoảng, mọi người gọi bộ xử lý là CPU, cho
âm thanh quan liêu hơn bộ xử lý trung tâm đơn vị.
datapath Các thành Giảm dần thậm chí thấp hơn vào phần cứng , Hình 1.9 tiết lộ chi tiết của một
phần của bộ xử lý thực bộ vi xử lý. Bộ xử lý bao gồm hai thành phần chính: datapath và điều khiển,
hiện các phép toán số brawn và não tương ứng của bộ xử lý. Các datapath thực hiện các phép toán số
học. học, và điều khiển nói với datapath ,

Táo
338S00456 PMIC

Apple A12 APL1W81 +


Micron MT53D512M64D4SB-046 XT: E
SDRAM LPDDR4x di động 4GB

STMicroeletonics Táo
STB601A0 PMIC 338S00375 PMIC

Texas Dụng cụ Apple 338S00411


Bộ khuếch đại
SN2600B1 âm thanh
Bộ sạc pin

HÌNH 1.8 Bảng logic của Apple iPhone XS Max Hình 1.7Mạch tích hợp lớn ở giữa là Apple A12. chip, chứa hai lõi xử lý
ARM lớn và bốn nhỏ chạy ở tốc độ 2,5 GHz, cũng như 2 GiB bộ nhớ chính bên trong gói. Hình 1.9 hiển thị một bức ảnh của chip
xử lý bên trong gói A12. Một con chip có kích thước tương tự trên một bảng đối xứng gắn vào mặt sau là chip nhớ flash 64 GiB để
lưu trữ không bay hơi. Các chip khác trên bo mạch bao gồm bộ điều khiển tích hợp quản lý năng lượng và chip khuếch đại âm
thanh. (Courtesy TechIngishts , www.techIngishts.com)
1.4 Dưới vỏ bọc 21

bộ nhớ và thiết bị I / O phải làm gì theo mong muốn của hướng dẫn của chương
trình. Chương 4 giải thích datapath và điều khiển cho một thiết kế hiệu suất cao điều khiển Các thành
hơn. phần của bộ xử lý ra
Gói iPhone XS Max trong Hình 1.8 cũng bao gồm một chip bộ nhớ với lệnh cho các thiết bị dữ
liệu, bộ nhớ và I / O
32 gibibits hoặc 2 GiB công suất. Các ký ức là nơi các chương trình được giữ khi
theo hướng dẫn của
chúng đang chạy; nó cũng chứa dữ liệu cần thiết bằng cách chạy các chương chương trình.
trình. Bộ nhớ là chip DRAM. DRAM viết tắt của truy cập ngẫu nhiên động ký
ứcDRAM được sử dụng cùng nhau để chứa các hướng dẫn và dữ liệu của a. ký ức Việc lưu trữ khu
chương trình. Trái ngược với bộ nhớ -access tuần tự, chẳng hạn như băng từ, the vực mà các chương trình
RAM một phần của thuật ngữ DRAM có nghĩa là các truy cập bộ nhớ về cơ bản được lưu giữ khi chúng
cùng một lượng thời gian cho dù phần nào của bộ nhớ được đọc. đang chạy và chứa dữ
liệu cần thiết cho các
Giảm dần vào độ sâu của bất kỳ thành phần nào của phần cứng cho thấy
chương trình đang chạy.
những hiểu biết sâu sắc về máy tính. Bên trong bộ xử lý là một loại bộ nhớ bộ
nhớ cache bộ nhớ cache khác. Bộ nhớ cache bao gồm bộ nhớ nhỏ, nhanh hoạt bộ nhớ truy cập ngẫu
động như bộ đệm DRAM. (Định nghĩa phi kỹ thuật của bộ nhớ cache là một nơi nhiên động (DRAM)
an toàn để che giấu mọi thứ.) Bộ nhớ cache được xây dựng bằng công nghệ bộ Bộ nhớ được xây dựng
nhớ khác , bộ nhớ truy cập ngẫu nhiên tĩnh (SRAM)SRAM nhanh hơn nhưng như một mạch tích hợp;
ít dày đặc hơn, và do đó nhiều hơn. đắt hơn DRAM (xem Chương 5). SRAM và nó cung cấp quyền truy
DRAM là hai lớp cập ngẫu nhiên vào bất kỳ
các hệ thống phân cấp bộ nhớ. vị trí nào. Thời gian truy
cập là 50 nano giây và chi
Như đã đề cập ở trên, một trong những ý tưởng tuyệt vời để cải thiện thiết kế là phí cho mỗi gigabyte
trừu tượng. Một trong những điều quan trọng nhất trừu tượng là giao diện giữa phần trong năm 2012 là $ 5 đến
cứng và phần mềm cấp thấp nhất. Phần mềm giao tiếp với phần cứng thông qua một $ 10.
từ vựng. Các từ của từ vựng được gọi là hướng dẫn, và từ vựng chính nó là
gọi là hướng dẫn đặt kiến trúc, hoặc đơn giản kiến trúc, của một máy tính.
Kiến trúc tập lệnh bao gồm mọi thứ mà lập trình viên cần biết để làm cho chương
trình ngôn ngữ máy nhị phân hoạt động chính xác, bao gồm các hướng dẫn, thiết
bị I / O, v.v. Thông thường, hệ điều hành sẽ gói gọn các chi tiết thực hiện I / O,
phân bổ bộ nhớ và các chức năng hệ thống cấp thấp khác để các lập trình viên
ứng dụng không cần phải lo lắng về các chi tiết đó. Sự kết hợp của tập lệnh cơ
bản và giao diện hệ điều hành được cung cấp cho các lập trình viên ứng dụng
được gọi là giao diện nhị phân ứng dụng (ABI).
Kiến trúc tập lệnh cho phép các nhà thiết kế máy tính nói về các chức năng bộ nhớ cache Một nhỏ ,
độc lập với phần cứng thực hiện chúng. Ví dụ: chúng ta có thể nói về các chức bộ nhớ nhanh hoạt động
năng của đồng hồ kỹ thuật số (giữ thời gian, hiển thị thời gian, đặt báo thức) tách như một bộ đệm cho bộ
nhớ chậm hơn, lớn hơn.
biệt với phần cứng đồng hồ (tinh thể thạch anh, màn hình LED, nút nhựa). Nhà
thiết kế máy tính phân biệt kiến trúc với an thực hiện của một kiến trúc dọc theo
cùng một dòng: một triển khai là phần cứng tuân theo sự trừu tượng của kiến trúc. bộ nhớ truy cập ngẫu
Những ý tưởng này đưa chúng ta đến một bức tranh lớn khác. nhiên tĩnh (SRAM)
Cũng thế bộ nhớ được
xây dựng dưới dạng
mạch tích hợp, nhưng
nhanh hơn và ít dày đặc
hơn DRAM .
22 Chương 1 Trừu tượng và công nghệ máy tính

hướng dẫn đặt kiến


trúc Cũng thế gọi kiến
trúcGiao diện trừu tượng
giữa phần cứng và phần
mềm cấp thấp nhất bao
gồm tất cả thông tin cần
thiết để viết chương trình
ngôn ngữ máy sẽ chạy
chính xác, bao gồm
hướng dẫn, thanh ghi,
truy cập bộ nhớ, I / O, v.v.

giao diện nhị phân ứng


dụng (ABI) Người dùng
một phần của tập lệnh cộng
với các giao diện hệ điều
hành được sử dụng bởi các
lập trình viên ứng dụng. Nó
xác định một tiêu chuẩn
cho tính di động nhị phân
trên các máy tính.

thực hiện Phần cứng


tuân theo sự trừu tượng
của kiến trúc.

HÌNH 1.9 Bộ xử lý tích hợp mạch bên trong gói A12. Kích thước của chip là 8.4 x 9,91 mm , và nó
được sản xuất ban đầu trong một quy trình 7nm (xem Mục 1.5). Nó có hai bộ xử lý ARM hoặc lõi giống
hệt nhau ở giữa dưới của chip, bốn lõi nhỏ ở phía dưới bên phải của chip, một bộ xử lý đồ họa (GPU) ở
phía bên phải (xem Mục 6.6) và một máy gia tốc dành riêng cho miền cho các mạng thần kinh (xem Mục
6.7) được gọi là NPU ở phía bên trái. Ở giữa là các ngân hàng bộ nhớ cache cấp hai (L2) cho lõi lớn và nhỏ
(xem Chương 5). Ở trên cùng và dưới cùng của chip là các giao diện đến bộ nhớ chính (DDR DRAM).
(Lịch sự TechInsights , www.techinsights.com)

Các
Cả phần cứng và phần mềm đều bao gồm các lớp phân cấp sử dụng trừu
LỚN tượng, với mỗi chi tiết ẩn lớp dưới từ cấp trên. Một giao diện quan trọng
Hình ảnh giữa các cấp độ trừu tượng là hướng dẫn đặt kiến trúcGiao diện giữa
phần cứng và phần mềm cấp thấp. Giao diện trừu tượng này cho phép
nhiều thực hiện chi phí và hiệu suất khác nhau để chạy phần mềm giống
hệt nhau.
1.4 Dưới vỏ bọc 23

Một nơi an toàn cho dữ liệu bộ nhớ dễ bay hơi


Lưu trữ, chẳng hạn như
Cho đến nay, chúng ta đã thấy cách nhập dữ liệu, tính toán bằng dữ liệu và hiển DRAM, chỉ giữ lại dữ
thị dữ liệu. Tuy nhiên, nếu chúng ta mất điện cho máy tính, mọi thứ sẽ bị mất vì liệu nếu nó nhận được
bộ nhớ bên trong máy tính dễ bay hơiĐó là khi nó mất sức mạnh, nó quên mất. điện.
Ngược lại, một đĩa DVD không quên bộ phim khi bạn tắt nguồn cho đầu DVD và
do đó là a bộ nhớ không bay hơi công nghệ. bộ nhớ không bay hơi
Một dạng bộ nhớ giữ lại dữ
Để phân biệt giữa bộ nhớ dễ bay hơi được sử dụng để chứa dữ liệu và chương liệu ngay cả khi không có
trình trong khi chúng đang chạy và bộ nhớ không bay hơi này được sử dụng để nguồn điện và được sử
lưu trữ dữ liệu và chương trình giữa các lần chạy, thuật ngữ này bộ nhớ chính dụng để lưu trữ các chương
trình giữa các lần chạy.
hoặc là bộ nhớ chính được sử dụng cho trước đây, và bộ nhớ thứ cấp cho cái Một đĩa DVD không bay
sau. Bộ nhớ thứ cấp tạo thành lớp dưới tiếp theo của hệ thống phân cấp bộ nhớ hơi.
DRAM đã thống trị bộ nhớ chính từ năm 1975, nhưng. đĩa từ thống trị bộ nhớ
thứ cấp bắt đầu thậm chí sớm hơn. Do kích thước và yếu tố hình thức của chúng,
các thiết bị di động cá nhân sử dụng bộ nhớ flash , một bộ nhớ bán dẫn không
bay hơi, thay vì đĩa. Hình 1.8 hiển thị chip chứa bộ nhớ flash 64 GiB của iPhone
Xs. Mặc dù chậm hơn DRAM, nhưng nó rẻ hơn nhiều so với DRAM ngoài việc
không bay hơi. Mặc dù chi phí nhiều hơn mỗi bit so với đĩa, nhưng nó nhỏ hơn,
nó có dung lượng nhỏ hơn nhiều, nó gồ ghề hơn và hiệu quả năng lượng hơn đĩa.
Do đó, bộ nhớ flash là bộ nhớ thứ cấp tiêu chuẩn cho PMD. Than ôi, không giống
như đĩa và DRAM, các bit bộ nhớ flash bị hao mòn sau 100.000 đến 1.000.000
lần ghi. Do đó, các hệ thống tệp phải theo dõi số lượng ghi và có chiến lược để bộ nhớ chính Cũng thế
tránh hao mòn bộ lưu trữ, chẳng hạn như bằng cách di chuyển dữ liệu phổ biến. gọi bộ nhớ chínhBộ nhớ
Chương 5 mô tả đĩa và bộ nhớ flash chi tiết hơn. được sử dụng để giữ các
chương trình trong khi
chúng đang chạy; thường
Giao tiếp với các máy tính khác bao gồm DRAM trong các
máy tính ngày nay.
Chúng tôi đã giải thích cách chúng tôi có thể nhập, tính toán, hiển thị và lưu dữ
liệu, nhưng vẫn còn một mục còn thiếu được tìm thấy trong các máy tính ngày
bộ nhớ thứ cấp Bộ nhớ
nay: mạng máy tính. Giống như bộ xử lý được hiển thị trong Hình 1.5 được kết không bay hơi được sử
nối với bộ nhớ và thiết bị I / O, mạng kết nối toàn bộ máy tính, cho phép người dụng để lưu trữ các
dùng máy tính mở rộng sức mạnh của điện toán bằng cách bao gồm cả giao tiếp. chương trình và dữ liệu
Mạng đã trở nên phổ biến đến mức chúng là xương sống của các hệ thống máy giữa các lần chạy; thường
bao gồm bộ nhớ flash
tính hiện tại; một thiết bị di động cá nhân hoặc máy chủ mới không có giao diện trong PMD và đĩa từ trong
mạng sẽ bị chế giễu. Máy tính nối mạng có một số lợi thế lớn : máy chủ.
■ Giao tiếp: Thông tin được trao đổi giữa các máy tính ở mức cao tốc độ.
đĩa từ Cũng thế gọi đĩa
■ Chia sẻ tài nguyên: Thay vì mỗi máy tính có thiết bị I / O riêng , máy tính
cứngMột dạng bộ nhớ thứ
trên mạng có thể chia sẻ thiết bị I / O. cấp không bay hơi bao
gồm các đĩa xoay được phủ
■ Truy cập không cục bộ: Bằng cách kết nối máy tính trên một khoảng cách bằng vật liệu ghi từ tính.
dài, người dùng không cần ở gần máy tính họ đang sử dụng. Bởi vì chúng là các thiết bị
cơ khí quay, thời gian truy
cập khoảng 5 đến 20 mili
giây và chi phí cho mỗi
gigabyte vào năm 2020 là
0,01 đến 0,02 đô la.
24 Chương 1 Trừu tượng và công nghệ máy tính

bộ nhớ flash Mạng khác nhau về chiều dài và hiệu suất, với chi phí liên lạc tăng theo cả tốc
Một bộ nhớ bán dẫn không độ liên lạc và khoảng cách mà thông tin truyền đi. Có lẽ loại mạng phổ biến nhất
bay hơi. Nó rẻ hơn và
chậm hơn DRAM nhưng là Ethernet Nó có thể dài tới một km và chuyển với tốc độ lên tới 100 gigabit
đắt hơn mỗi bit và nhanh mỗi giây. Độ dài và tốc độ của nó làm cho Ethernet hữu ích để kết nối các máy
hơn đĩa từ. Thời gian truy tính trên cùng một tầng của tòa nhà; do đó, nó là một ví dụ về cái được gọi chung
cập khoảng 5 đến 50 micro là a. khu vực địa phương mạngMạng cục bộ được kết nối với các công tắc cũng
giây và chi phí cho mỗi
gigabyte vào năm 2020 là có thể. cung cấp dịch vụ định tuyến và bảo mật. Mạng diện rộng xuyên lục địa
0,06 đô la đến 0,12 đô la. và là xương sống của Internet, nơi hỗ trợ web. Chúng thường dựa trên sợi quang
mạng cục bộ (LAN) và được thuê từ các công ty viễn thông.
Một mạng lưới được
thiết kế để mang dữ liệu Mạng đã thay đổi bộ mặt của điện toán trong 40 năm qua, cả hai bằng cách trở
trong một khu vực giới nên phổ biến hơn nhiều và bằng cách tăng hiệu suất đáng kể. Vào những năm
hạn địa lý, thường là 1970, rất ít cá nhân có quyền truy cập vào thư điện tử, Internet và web không tồn
trong một tòa nhà. tại và băng từ gửi thư là cách chính để truyền một lượng lớn dữ liệu giữa hai địa
điểm. Mạng cục bộ gần như không có, và một số mạng diện rộng hiện có có khả
mạng diện rộng năng hạn chế và quyền truy cập hạn chế.
(WAN) Một mạng Khi công nghệ mạng được cải thiện, nó trở nên rẻ hơn đáng kể và có công suất
lưới mở rộng hơn hàng cao hơn đáng kể. Ví dụ, công nghệ mạng cục bộ được tiêu chuẩn hóa đầu tiên,
trăm km có thể trải dài được phát triển khoảng 40 năm trước, là phiên bản Ethernet có công suất tối đa
trên một lục địa.
(còn gọi là băng thông) là 10 triệu bit mỗi giây, thường được chia sẻ bởi hàng
chục, nếu không phải là một trăm, máy tính . Ngày nay, công nghệ mạng khu vực
địa phương cung cấp công suất từ 1 đến 100 gigabit mỗi giây, thường được chia
sẻ bởi nhiều nhất một vài máy tính. Công nghệ truyền thông quang học đã cho
phép tăng trưởng tương tự về năng lực của các mạng diện rộng, từ hàng trăm
kilobit đến gigabits và từ hàng trăm máy tính được kết nối với mạng trên toàn thế
giới đến hàng triệu máy tính được kết nối. Sự gia tăng mạnh mẽ trong việc triển
khai mạng kết hợp với tăng công suất đã khiến công nghệ mạng trở thành trung
tâm trong cuộc cách mạng thông tin trong 30 năm qua.

Trong 15 thập kỷ qua, một sự đổi mới khác trong mạng đang định hình lại
cách thức máy tính giao tiếp. Công nghệ không dây là phổ biến, cho phép thời kỳ
hậu PC. Khả năng tạo ra một đài phát thanh trong cùng công nghệ bán dẫn chi
phí thấp (CMOS) được sử dụng cho bộ nhớ và bộ vi xử lý cho phép cải thiện
đáng kể giá cả, dẫn đến sự bùng nổ trong triển khai. Các công nghệ không dây
hiện có, được gọi theo tên tiêu chuẩn IEEE 802.11ac cho phép tốc độ truyền từ 1
đến 1300 triệu bit mỗi giây. Công nghệ không dây khá khác biệt so với các mạng
dựa trên dây, vì tất cả người dùng trong một khu vực ngay lập tức đều chia sẻ
sóng phát thanh.

Kiểm tra ■ Bộ nhớ DRAM bán dẫn, bộ nhớ flash và bộ lưu trữ đĩa khác nhau
Bản thân bạn đáng kể. Đối với mỗi công nghệ, hãy liệt kê mức độ biến động của nó, thời
gian truy cập tương đối gần đúng và chi phí tương đối gần đúng so với
DRAM .
1.5 Công nghệ để xây dựng bộ xử lý và bộ nhớ 25

Công nghệ cho bộ xử lý xây dựng


1.5
và Ký ức

Bộ xử lý và bộ nhớ đã được cải thiện với tốc độ đáng kinh ngạc, bởi vì các nhà
thiết kế máy tính từ lâu đã nắm bắt công nghệ điện tử mới nhất để cố gắng giành
chiến thắng trong cuộc đua thiết kế một máy tính tốt hơn. Hình 1.10 cho thấy các
công nghệ đã được sử dụng theo thời gian, với ước tính hiệu suất tương đối trên
mỗi đơn vị chi phí cho mỗi công nghệ. Vì công nghệ này định hình những gì
máy tính sẽ có thể làm và chúng sẽ phát triển nhanh như thế nào, chúng tôi tin
rằng tất cả các chuyên gia máy tính nên làm quen với những điều cơ bản của các bóng bán dẫn Bật /
mạch tích hợp. tắt công tắc được điều
A bóng bán dẫn chỉ đơn giản là một công tắc bật / tắt được điều khiển bởi điện. khiển bởi tín hiệu điện.
Cácmạch tích hợp (IC) kết hợp hàng chục đến hàng trăm bóng bán dẫn vào một con chip mạch tích hợp (VLSI)
duy nhất. Khi Gordon Moore dự đoán việc nhân đôi tài nguyên liên tục, ông đã dự báo quy mô rất lớn Một
tốc độ tăng trưởng của số lượng bóng bán dẫn trên mỗi chip. Để mô tả sự gia tăng to lớn thiết bị chứa hàng trăm
về số lượng bóng bán dẫn từ hàng trăm đến hàng triệu, tính từ quy mô rất lớn được thêm ngàn đến hàng triệu
vào thuật ngữ, tạo ra chữ viết tắt VLSI, cho mạch tích hợp quy mô rất lớn. bóng bán dẫn.
Tốc độ hội nhập ngày càng tăng này đã ổn định đáng kể.Hình 1.11 cho thấy sự
tăng trưởng về công suất DRAM kể từ năm 1977. Trong 35 năm, ngành công
nghiệp đã tăng gấp bốn lần công suất cứ sau 3 năm, dẫn đến sự gia tăng vượt quá silicon Một điều
16.000 lần! Hình 1.11 cho thấy sự chậm lại do sự chậm lại của Định luật Moore tự nhiên phần tử
Moore; tăng gấp bốn lần năng lực đã mất sáu năm gần đây. là một chất bán
Để hiểu làm thế nào để sản xuất các mạch tích hợp, chúng tôi bắt đầu từ đầu. dẫn.
Việc sản xuất một con chip bắt đầu với silicon, một chất được tìm thấy trong cát.
Bởi vì silicon không dẫn điện tốt, nó được gọi là a chất bán dẫnVới một quy chất bán dẫn
trình hóa học đặc biệt, có thể thêm vật liệu vào silicon cho phép các khu vực nhỏ Một chất không dẫn điện
biến thành một trong ba thiết bị :. tốt.
■ Dây dẫn điện tuyệt vời (sử dụng dây đồng hoặc nhôm siêu nhỏ)
■ Cách điện tuyệt vời từ điện (như vỏ nhựa hoặc thủy tinh)
■ Các khu vực có thể tiến hành hoặc cách điện trong các điều kiện cụ thể
(dưới dạng công tắc)
Transitor rơi vào loại cuối cùng. Sau đó, một mạch VLSI chỉ là hàng tỷ tổ hợp
dây dẫn, chất cách điện và công tắc được sản xuất trong một gói nhỏ duy nhất.

1951 Ống chân không 1


Năm
1965 Transitor 35
1975 Mạch tích hợp 900
1995 Mạch tích hợp quy mô rất lớn 2.400.000
2020 Mạch tích hợp siêu quy mô lớn 500.000.000.000

HÌNH 1.10 Hiệu suất tương đối trên mỗi đơn vị chi phí của các công nghệ được sử dụng trong
máy tính theo thời gian. Nguồn: Bảo tàng máy tính, Boston, với năm 2013 được ngoại suy bởi các tác giả.
Xem Mục 1.13.
26 Chương 1 Trừu tượng và công nghệ máy tính

100.000.000

10.000.000 16G
8G
1.000.000 4G
1G 2G
Kibibit năng lực

512M
100.000 16M 128M 256M
10.000 4M 64M

1M
1000 256K
64K
100
16K
10
1976 1978 1980 1982 1984 1986 1988 1990 1992 1994 1998 2000 2002 2004 2006 2008 2010 2012 201
Năm giới thiệu

HÌNH 1.11 Tăng trưởng công suất trên mỗi chip DRAM theo thời gian. Các y-axis được đo bằng kibibits (210 bit). Ngành công
nghiệp DRAM công suất tăng gấp bốn lần gần như cứ sau ba năm, tăng 60% mỗi năm, trong 20 năm. Trong những năm gần đây, tỷ lệ đã
chậm lại và có phần gần hơn với việc tăng gấp đôi cứ sau ba năm. Với sự chậm lại của Định luật Moore Moore và những khó khăn trong
việc sản xuất các tế bào DRAM nhỏ hơn đáng tin cậy với các tỷ lệ khung hình đầy thách thức của cấu trúc ba chiều của chúng.

phôi tinh thể silicon Quá trình sản xuất cho các mạch tích hợp là rất quan trọng đối với chi phí của
Một thanh bao gồm một
chip và do đó rất quan trọng đối với các nhà thiết kế máy tính. Hình 1.12 cho thấy
tinh thể silicon có đường
kính từ 8 đến 12 inch và
quá trình đó. Quá trình bắt đầu với a phôi tinh thể silicon, trông giống như một
dài khoảng 12 đến 24 chiếc xúc xích khổng lồ. Ngày nay, thỏi có đường kính 81212 inch và dài khoảng
inch. 1224 inch. Một thỏi được cắt nhỏ thành tấm wafer dày không quá 0,1 inch. Các tấm
wafer Một lát từ a thỏi
wafer này sau đó trải qua một loạt các bước xử lý, trong đó các mẫu hóa chất được
silicon dày không quá 0,1 đặt trên mỗi wafer, tạo ra các bóng bán dẫn, dây dẫn và chất cách điện được thảo
inch, được sử dụng để tạo luận trước đó. Ngày nay, các mạch tích hợp chỉ chứa một lớp bóng bán dẫn nhưng có
chip. thể có từ hai đến tám cấp độ dây dẫn kim loại, cách nhau bởi các lớp cách điện.
Trống
Khỏi silicon tấm wafer
20 đến 40
Máy thái
các bước xử lý

Đã thử nghiệm Tấm wafer hoa văn


chết Đã kiểm tra
wafer
wafer
Trái phiếu chết người thử nghiệm
Dicer
gói

Đóng gói chết Đã thử nghiệm đóng gói chết

Một phần Tàu đến


người thử khách
nghiệm hàng
HÌNH 1.12 Quá trình sản xuất chip. Sau khi được cắt từ thỏi silicon, tấm wafer trống được đặt qua 20 đến 40
bước để tạo các tấm wafer có hoa văn (xem Hình 1.13). Những tấm wafer có hoa văn này sau đó được thử
nghiệm với một người thử wafer và bản đồ của các bộ phận tốt được tạo ra. Tiếp theo, các tấm wafer được thái
hạt lựu thành khuôn (xem Hình 1.9). Trong hình này, một wafer đã tạo ra 20 khuôn, trong đó 17 đã vượt qua thử
nghiệm. (X có nghĩa là cái chết là xấu.) Năng suất chết tốt trong trường hợp này là 17/20, hoặc 85%. Những cái
chết tốt này sau đó được liên kết thành các gói và thử nghiệm thêm một lần nữa trước khi vận chuyển các bộ phận
đóng gói cho khách hàng. Một phần đóng gói xấu đã được tìm thấy trong thử nghiệm cuối cùng này.
1.5 Công nghệ để xây dựng bộ xử lý và bộ nhớ 27

Một lỗ hổng siêu nhỏ duy nhất trong chính wafer hoặc trong một trong hàng khiếm khuyết Một kính
chục bước tạo mẫu có thể dẫn đến khu vực của wafer bị hỏng. Những cái này hiển vi lỗ hổng trong một
khiếm khuyết, như chúng được gọi, làm cho hầu như không thể sản xuất một wafer hoặc trong các bước
wafer hoàn hảo. Cách đơn giản nhất để đối phó với sự không hoàn hảo là đặt tạo mẫu có thể dẫn đến sự
thất bại của khuôn chứa
nhiều thành phần độc lập trên một wafer. Các wafer có hoa văn sau đó được cắt
khuyết điểm đó.
nhỏ, hoặc thái hạt lựu, vào các thành phần này, được gọi chết và được biết đến
nhiều hơn như là khoai tây chiên.Hình 1.13 cho thấy một bức ảnh của một wafer chết Cá nhân phần hình
có chứa bộ vi xử lý trước khi chúng được thái hạt lựu; sớm hơn , Hình 1.9 cho chữ nhật được cắt từ một
thấy một bộ vi xử lý riêng lẻ chết. wafer, được biết đến
Đóng băng cho phép bạn loại bỏ chỉ những cái chết không may mắn để chứa nhiều hơn như là khoai
các lỗ hổng, thay vì toàn bộ wafer. Khái niệm này được định lượng bởi năng suất tây chiên.
của một quá trình, được định nghĩa là tỷ lệ phần trăm của hàng hóa chết từ tổng
năng suất Tỷ lệ phần
số số người chết trên wafer.
trăm của tốt chết từ
Chi phí của một mạch tích hợp tăng nhanh khi kích thước khuôn tăng lên, do tổng số người chết trên
cả năng suất thấp hơn và do ít khuôn hơn phù hợp với wafer. Để giảm chi phí, sử wafer.
dụng quy trình thế hệ tiếp theo thu nhỏ một khuôn lớn vì nó sử dụng kích thước
nhỏ hơn cho cả bóng bán dẫn và dây. Điều này cải thiện năng suất và số lượng
chết trên mỗi wafer. Một quy trình 7 nanomet (nm) là tiên tiến nhất vào năm 2020,
điều đó có nghĩa là về cơ bản kích thước tính năng nhỏ nhất trên khuôn là 7nm.

HÌNH 1.13 Một wafer 12 inch (300mm) này có bộ xử lý Intel® Core ™ thế hệ thứ 10, có tên mã là
Ice Ice Lake (Courtesy Intel). Số lượng khuôn trên 300 mm này (12 inch) wafer với năng suất 100% là 506.
Theo AnandTech1, mỗi khuôn Ice Lake là 11,4 x 10,7 mm. Vài chục con chip tròn một phần ở ranh giới của wafer
là vô dụng; chúng được bao gồm bởi vì nó dễ dàng hơn để tạo ra các mặt nạ được sử dụng để tạo mẫu silicon.
Khuôn này sử dụng công nghệ 10 nanomet, có nghĩa là các tính năng nhỏ nhất có kích thước xấp xỉ 10nm, mặc dù
chúng thường nhỏ hơn một chút so với kích thước tính năng thực tế, trong đó đề cập đến kích thước của các bóng
bán dẫn khi được vẽ ra so với sản xuất cuối cùng kích thước.
28 Chương 1 Trừu tượng và công nghệ máy tính

Khi bạn đã tìm thấy các khuôn tốt, chúng được kết nối với các chân đầu vào / đầu
ra của một gói, sử dụng một quy trình được gọi liên kếtNhững bộ phận đóng gói này
được kiểm tra lần cuối, vì những sai lầm có thể xảy ra trong bao bì, và sau đó chúng
được chuyển đến khách hàng.
Trong khi chúng ta đã nói về chi phí của chip, có một sự khác biệt giữa chi phí
và giá cả. Các công ty tính phí nhiều như thị trường sẽ chịu để tối đa hóa lợi tức
đầu tư, phải trả chi phí như nghiên cứu và phát triển (R & D) của công ty, tiếp thị,
bán hàng, bảo trì thiết bị sản xuất, cho thuê tòa nhà, chi phí tài chính, lợi nhuận
trước thuế và thuế. Lợi nhuận có thể cao hơn trên các chip độc đáo chỉ đến từ
một công ty, như bộ vi xử lý, so với các chip là hàng hóa được cung cấp bởi một
số công ty, như DRAM. Giá dao động dựa trên tỷ lệ cung và cầu, và dễ dàng cho
nhiều công ty xây dựng nhiều chip hơn nhu cầu thị trường.

Xây dựng: Chi phí của một mạch tích hợp có thể được thể hiện bằng ba đơn giản
phương trình :
Chi phí cho mỗi
Chi phí cho mỗi lần
wafer
chết
Chết trên mỗi năng
wafer suất
Khu vực
Chết trên mỗi
wafer
wafer
Khu vực chết
Năng 1
suất
(1 (Khiếm khuyết trên mỗi khu vực Khu
N
vực chết))
Phương trình đầu tiên là đơn giản để rút ra. Thứ hai là một xấp xỉ, vì nó không trừ
khu vực gần biên giới của wafer tròn không thể chứa các khuôn hình chữ nhật (xem
Hình 1.13). Phương trình cuối cùng dựa trên các quan sát thực nghiệm về sản lượng
tại các nhà máy mạch tích hợp, với số mũ liên quan đến số bước xử lý quan trọng.
Do đó, tùy thuộc vào tỷ lệ khuyết tật và kích thước của khuôn và wafer, chi phí
Kiểm tra thường không tuyến tính trong khu vực chết.
Bản
thân bạn
Một yếu tố quan trọng trong việc xác định chi phí của một mạch tích hợp là khối
lượng. Những lý do sau đây là lý do tại sao một con chip được sản xuất với khối
lượng lớn nên chi phí ít hơn?
1. Với khối lượng lớn, quy trình sản xuất có thể được điều chỉnh theo một
thiết kế cụ thể, làm tăng năng suất.
2. Việc thiết kế một phần có khối lượng lớn ít hơn một phần có khối lượng
thấp.
3. Các mặt nạ được sử dụng để làm cho chip là đắt tiền, vì vậy chi phí cho
mỗi chip thấp hơn cho khối lượng cao hơn.
4. Chi phí phát
triển kỹ thuật
cao và phần lớn
không phụ
thuộc vào khối
lượng; do đó,
chi phí phát
triển cho mỗi
lần chết thấp
hơn với các
phần có khối
lượng lớn.
5. Các bộ phận có
khối lượng lớn
thường có kích
thước khuôn
nhỏ hơn các bộ
phận có khối
lượng thấp và
do đó, có năng
suất cao hơn
trên mỗi wafer.
1.6 Hiệu suất 29

1.6 Hiệu suất

Đánh giá hiệu suất của máy tính có thể khá khó khăn. Quy mô và sự phức tạp của
các hệ thống phần mềm hiện đại, cùng với một loạt các kỹ thuật cải tiến hiệu suất
được sử dụng bởi các nhà thiết kế phần cứng, đã khiến việc đánh giá hiệu suất trở
nên khó khăn hơn nhiều.
Khi cố gắng lựa chọn giữa các máy tính khác nhau, hiệu suất là một thuộc tính
quan trọng. Đo lường và so sánh chính xác các máy tính khác nhau là rất quan
trọng đối với người mua và do đó, đối với các nhà thiết kế. Những người bán
máy tính cũng biết điều này. Thông thường, nhân viên bán hàng muốn bạn nhìn
thấy máy tính của họ ở mức ánh sáng tốt nhất có thể, cho dù ánh sáng này có
phản ánh chính xác nhu cầu của ứng dụng người mua hay không. Do đó, hiểu
cách tốt nhất để đo lường hiệu suất và các hạn chế của các phép đo đó là rất quan
trọng trong việc lựa chọn máy tính.
Phần còn lại của phần này mô tả các cách khác nhau trong đó hiệu suất có thể
được xác định; sau đó, chúng tôi mô tả các số liệu để đo hiệu suất theo quan
điểm của cả người dùng máy tính và nhà thiết kế. Chúng tôi cũng xem xét các số
liệu này có liên quan như thế nào và trình bày phương trình hiệu suất bộ xử lý cổ
điển, mà chúng tôi sẽ sử dụng trong toàn bộ văn bản.

Xác định hiệu suất


Khi chúng ta nói một máy tính có hiệu suất tốt hơn máy tính khác, chúng ta có ý
nghĩa gì? Mặc dù câu hỏi này có vẻ đơn giản, một sự tương đồng với máy bay chở
khách cho thấy câu hỏi về hiệu suất có thể tinh tế đến mức nào. Hình 1.14 liệt kê một
số máy bay chở khách điển hình, cùng với tốc độ, phạm vi và công suất bay của
chúng. Nếu chúng ta muốn biết máy bay nào trong bảng này có hiệu suất tốt nhất,
trước tiên chúng ta sẽ cần xác định hiệu suất. Ví dụ, xem xét các biện pháp hiệu suất
khác nhau, chúng ta thấy rằng chiếc máy bay có tốc độ bay cao nhất là chiếc
Concorde (đã nghỉ hưu từ năm 2003), chiếc máy bay có tầm bắn xa nhất là Boeing
777-200LR và chiếc máy bay có công suất lớn nhất là Airbus A380-800.

Hành Thông lượng hành


Máy bay khách Phạm vi du lịch Tốc độ bay khách
năng lực (dặm) (m.p.h.) (hành khách × m.p.h.)
Máy bay Boeing 737 240 3000 0564 135.360
BAC / Sud Concorde 132 4000 01350 178.200
Boeing 777-200LR 301 9395 554 166.761
Máy bay A380-800 853 8477 0587 500.711

HÌNH 1.14 Công suất, phạm vi và tốc độ cho một số máy bay thương mại. Cuối cùng cột cho
thấy tốc độ máy bay vận chuyển hành khách, đó là công suất nhân với tốc độ bay (bỏ qua phạm vi và thời
gian cất cánh và hạ cánh).
Hãy giả sử chúng tôi xác định hiệu suất theo tốc độ. Điều này vẫn để lại hai
định nghĩa có thể. Bạn có thể xác định máy bay nhanh nhất là máy bay có mức
cao nhất
30 Chương 1 Trừu tượng và công nghệ máy tính

thời gian đáp ứng Cũng tốc độ bay, đưa một hành khách duy nhất từ điểm này sang điểm khác trong thời gian
thế gọi thời gian thực ngắn nhất. Tuy nhiên, nếu bạn quan tâm đến việc vận chuyển 500 hành khách từ điểm
hiệnTổng thời gian cần này sang điểm khác, Airbus A380-800 rõ ràng sẽ là nhanh nhất, như cột cuối cùng của
thiết để máy tính hoàn hình cho thấy. Tương tự, chúng ta có thể xác định hiệu suất máy tính theo nhiều cách
thành một tác vụ, bao gồm riêng biệt.
truy cập đĩa, truy cập bộ
nhớ, hoạt động I / O, chi
Nếu bạn đang chạy một chương trình trên hai máy tính để bàn khác nhau, bạn sẽ
phí hệ điều hành, thời gian nói rằng máy tính để bàn càng nhanh thì công việc được hoàn thành trước. Nếu bạn
thực hiện CPU, v.v. đang chạy một trung tâm dữ liệu có nhiều máy chủ đang chạy công việc được gửi bởi
nhiều người dùng, bạn sẽ nói rằng máy tính nhanh hơn là máy tính hoàn thành nhiều
thông lượng Cũng được công việc nhất trong một ngày. Là một người dùng máy tính cá nhân, bạn quan tâm
gọi băng thôngKhác. đo đến việc giảm phản ứng thời gianThời gian giữa lúc bắt đầu và hoàn thành một
lường hiệu suất, đó là số nhiệm vụ, còn được gọi là thời gian thực hiệnCác nhà quản lý trung tâm dữ liệu
lượng nhiệm vụ hoàn thường quan tâm đến việc tăng. thông lượng hoặc là băng thôngTổng số lượng công
thành trên mỗi đơn vị thời việc được thực hiện trong một thời gian nhất định. Do đó, trong hầu hết các trường
gian. hợp , chúng ta sẽ cần các số liệu hiệu suất khác nhau cũng như các bộ ứng dụng khác
nhau để đánh giá các thiết bị di động cá nhân, tập trung hơn vào thời gian phản hồi,
so với các máy chủ, tập trung hơn vào thông lượng.

Thông lượng và thời gian đáp ứng

Thực hiện các thay đổi sau đây đối với hệ thống máy tính tăng thông lượng,
VÍ DỤ giảm thời gian phản hồi hoặc cả hai?
1. Thay thế bộ xử lý trong máy tính bằng phiên bản nhanh hơn
2. Thêm bộ xử lý bổ sung vào một hệ thống sử dụng nhiều bộ xử lý cho
các tác vụ riêng biệt, ví dụ, tìm kiếm trên web
Giảm thời gian đáp ứng hầu như luôn luôn cải thiện thông lượng. Do đó,
TRẢ LỜI trong trường hợp 1, cả thời gian đáp ứng và thông lượng đều được cải thiện.
Trong trường hợp 2, không có nhiệm vụ nào được thực hiện nhanh hơn, do
đó chỉ có thông lượng tăng.

Tuy nhiên, nếu nhu cầu xử lý trong trường hợp thứ hai lớn gần bằng thông
lượng, hệ thống có thể buộc các yêu cầu phải xếp hàng. Trong trường hợp này,
việc tăng thông lượng cũng có thể cải thiện thời gian phản hồi, vì nó sẽ giảm
thời gian chờ trong hàng đợi. Do đó, trong nhiều hệ thống máy tính thực, việc
thay đổi thời gian thực hiện hoặc thông lượng thường ảnh hưởng đến hệ thống
khác.

Khi thảo luận về hiệu suất của máy tính, chúng tôi sẽ chủ yếu quan tâm đến thời
gian phản hồi cho một vài chương đầu tiên. Để tối đa hóa hiệu suất, chúng tôi
muốn giảm thiểu thời gian phản hồi hoặc thời gian thực hiện cho một số tác vụ.
Do đó, chúng ta có thể liên quan đến hiệu suất và thời gian thực hiện cho máy
tính X :
1
Hiệu suấtX 5
Thời gian thực
hiệnX
Điều này có nghĩa
là đối với hai máy
tính X và Y, nếu
hiệu suất của X
lớn hơn hiệu suất
của Y, chúng tôi

1.6 Hiệu suất 31

Trong ví dụ
trên, chúng ta
Hiệu suất X . Hiệu suấtY cũng có thể nói
1 .
1 rằng máy tính B là
1,5 lần chậm hơn
Thời gian thực hiện X Thời gian thực hiệnY
máy tính A, kể từ
đó
Nghĩa là, thời gian thực hiện trên Y dài hơn thời gian trên X, nếu X nhanh hơn
Y.
Khi thảo luận về thiết kế máy tính, chúng ta thường muốn liên quan đến hiệu
suất của hai máy tính khác nhau một cách định lượng. Chúng tôi sẽ sử dụng cụm
từ X X n nhanh hơn gấp nhiều lần so với Y X hay tương đương n nhanh gấp đôi
so với Yv - có nghĩa là
Hiệu suấtX n
Hiệu suấtY
5

Nếu X là n nhanh gấp đôi Y, sau đó thời gian thực hiện trên Y là n thời gian
miễn là trên X :
Thời gian thực
Hiệu suấtX 5 hiệnY 5 n
Thời gian thực
Hiệu suấtY hiệnX

Hiệu suất tương đối

Nếu máy tính A chạy chương trình trong 10 giây và máy tính B chạy cùng
một chương trình trong 15 giây, A nhanh hơn B bao nhiêu?

Chúng tôi biết rằng A là n nhanh gấp B lần nếu


Thời gian thực
Hiệu suất A 5 hiệnB 5n
Thời gian thực
Hiệu suấtB hiệnA
Do đó, tỷ lệ hiệu suất là
15
10 51.5

và A do đó nhanh gấp 1,5 lần B .


VÍ DỤ

TRẢ LỜI
32 Chương 1 Trừu tượng và công nghệ máy tính

có nghĩa là
Hiệu suất
A 5 Hiệu suấtB
1.5

Để đơn giản, chúng ta thường sẽ sử dụng thuật ngữ nhanh như khi chúng ta cố
gắng so sánh máy tính một cách định lượng. Bởi vì hiệu suất và thời gian thực
hiện là đối ứng, tăng hiệu suất đòi hỏi phải giảm thời gian thực hiện. Để tránh sự
nhầm lẫn tiềm năng giữa các điều khoản tăng và giảm dần, chúng tôi thường nói
rằng cải thiện hiệu suất của cải tiến và cải thiện thời gian thực hiện khi chúng tôi
có nghĩa là tăng hiệu suất của Cameron và giảm thời gian thực hiện.Giáo dục

Đo lường hiệu suất


Thời gian là thước đo hiệu suất của máy tính: máy tính thực hiện cùng một lượng
công việc trong thời gian ít nhất là nhanh nhất. Chương trình thời gian thực hiện
được đo bằng giây cho mỗi chương trình. Tuy nhiên, thời gian có thể được xác
định theo những cách khác nhau, tùy thuộc vào những gì chúng ta đếm. Định
nghĩa đơn giản nhất của thời gian được gọi thời gian đồng hồ treo tường, thời
gian đáp ứng, hoặc là thời gian trôi quaNhững thuật ngữ này có nghĩa là tổng
thời gian. để hoàn thành một nhiệm vụ, bao gồm truy cập đĩa, truy cập bộ nhớ ,
đầu vào / đầu ra (I / O) hoạt động, hệ điều hành trên mọi thứ.
Tuy nhiên, máy tính thường được chia sẻ và bộ xử lý có thể hoạt động đồng thời trên
một số chương trình. Trong những trường hợp như vậy, hệ thống có thể cố gắng tối ưu
hóa thông lượng thay vì cố gắng giảm thiểu thời gian trôi qua cho một chương trình. Do
Thực hiện CPU đó, chúng tôi có thể muốn phân biệt giữa thời gian trôi qua và thời gian mà bộ xử lý đang
thời gian Cũng được gọi làm việc thay mặt chúng tôi. Thời gian thực hiện CPU hoặc đơn giản Thời gian CPU,
Thời gian CPUThời nhận ra sự khác biệt này, là thời gian CPU dành tính toán cho nhiệm vụ này và không bao
gian thực tế. CPU dành
gồm thời gian chờ I / O hoặc chạy các chương trình khác. (Tuy nhiên, hãy nhớ rằng thời
tính toán cho một nhiệm
vụ cụ thể.
gian phản hồi mà người dùng trải qua sẽ là thời gian trôi qua của chương trình, không
phải là thời gian CPU.) Thời gian CPU có thể được chia thành thời gian CPU dành cho
thời gian CPU chương trình, được gọi thời gian CPU người dùngvà thời gian CPU dành cho hệ điều
người dùng Các hành thực hiện các tác vụ thay mặt cho chương trình, được gọi thời gian CPU hệ
Thời gian CPU dành thốngSự khác biệt giữa thời gian CPU của hệ thống và người dùng rất khó thực hiện
cho một chương
chính xác, bởi vì thường khó phân công trách nhiệm cho các hoạt động của hệ điều hành
trình.
cho một chương trình người dùng hơn là một chương trình khác và vì sự khác biệt về
thời gian CPU hệ chức năng giữa các hệ điều hành.
thống Các Thời gian Để thống nhất, chúng tôi duy trì sự khác biệt giữa hiệu suất dựa trên thời gian
CPU dành cho hệ điều
đã trôi qua và dựa trên thời gian thực hiện CPU. Chúng tôi sẽ sử dụng thuật ngữ
hành thực hiện các
nhiệm vụ thay mặt cho này hệ thống hiệu suất để chỉ thời gian trôi qua trên một hệ thống không tải và
chương trình. Hiệu suất CPU để tham khảo thời gian CPU của người dùng. Chúng tôi sẽ tập
trung vào hiệu suất CPU trong chương này, mặc dù các cuộc thảo luận của chúng
tôi về cách tóm tắt hiệu suất có thể được áp dụng cho các phép đo thời gian trôi
qua hoặc thời gian CPU.

Hiểu hiệu suất Các ứng dụng khác nhau rất nhạy cảm với các khía cạnh khác nhau về hiệu suất của
một hệ thống máy tính. Nhiều ứng dụng, đặc biệt là những ứng dụng chạy trên máy
chương trình chủ, phụ thuộc nhiều vào hiệu suất I / O, do đó, phụ thuộc vào cả phần cứng và phần
mềm. Tổng thời gian
trôi qua được đo bằng
đồng hồ treo tường là
phép đo lãi suất. Trong
1.6 Hiệu suất 33

một số môi trường ứng dụng, người dùng có thể quan tâm đến thông lượng, thời
gian phản hồi hoặc kết hợp phức tạp của cả hai (ví dụ:., thông lượng tối đa với
thời gian phản hồi trong trường hợp xấu nhất). Để cải thiện hiệu suất của một
chương trình, người ta phải có một định nghĩa rõ ràng về những gì số liệu hiệu
suất quan trọng và sau đó tiến hành tìm các nút thắt hiệu suất bằng cách đo lường
thực hiện chương trình và tìm kiếm các nút thắt có khả năng. Trong các chương
sau, chúng tôi sẽ mô tả cách tìm kiếm các nút thắt cổ chai và cải thiện hiệu suất
trong các phần khác nhau của hệ thống.

chu kỳ đồng hồ Cũng


Mặc dù là người dùng máy tính, chúng tôi quan tâm đến thời gian, nhưng khi được gọi đánh dấu,
chúng tôi kiểm tra các chi tiết của máy tính, nó rất thuận tiện để suy nghĩ về hiệu đồng hồ tích tắc, thời
suất trong các số liệu khác. Cụ thể, các nhà thiết kế máy tính có thể muốn nghĩ về gian đồng hồ, đồng hồ,
hoặc là chu kỳ. Thời
một máy tính bằng cách sử dụng một biện pháp liên quan đến việc phần cứng có
gian cho một khoảng
thể thực hiện các chức năng cơ bản nhanh như thế nào. Hầu như tất cả các máy thời gian đồng hồ,
tính được xây dựng bằng đồng hồ xác định khi nào các sự kiện diễn ra trong thường là của đồng hồ bộ
phần cứng. Các khoảng thời gian riêng biệt được gọi chu kỳ đồng hồ (hoặc bọ xử lý, chạy ở tốc độ
ve, đồng hồ tích tắc, đồng hồ, đồng hồ, chu kỳ ). Các nhà thiết kế đề cập đến không đổi.
chiều dài của a thời gian đồng hồ cả hai như thời gian cho một hoàn thành chu
kỳ đồng hồ (ví dụ:., 250 picos giây, hoặc 250 ps) và dưới dạng tốc độ đồng hồ (ví thời gian đồng hồ Chiều
dụ:., 4 gigahertz hoặc 4 GHz), là nghịch đảo của chu kỳ đồng hồ. Trong tiểu mục dài của mỗi chu kỳ đồng
tiếp theo, chúng tôi sẽ chính thức hóa mối quan hệ giữa các chu kỳ đồng hồ của hồ.
nhà thiết kế phần cứng và giây của người dùng máy tính.

1. Giả sử chúng ta biết rằng một ứng dụng sử dụng cả thiết bị di động cá Kiểm tra
nhân và Đám mây bị giới hạn bởi hiệu suất mạng. Đối với các thay đổi sau, Bản thân bạn
hãy nêu xem chỉ có thông lượng cải thiện, cả thời gian phản hồi và thông
lượng cải thiện hay không cải thiện.
a. Một kênh mạng bổ sung được thêm vào giữa PMD và Đám mây, tăng
tổng thông lượng mạng và giảm độ trễ để có được quyền truy cập
mạng (vì hiện có hai kênh).
b. Phần mềm mạng được cải thiện, do đó giảm độ trễ giao tiếp mạng,
nhưng không tăng thông lượng.
c. Thêm bộ nhớ được thêm vào máy tính.
2. Hiệu suất của Máy tính Ciên nhanh gấp bốn lần hiệu suất của máy tính B,
chạy một ứng dụng nhất định trong 28 giây. Máy tính C sẽ mất bao lâu để
chạy ứng dụng đó?

Hiệu suất CPU và các yếu tố của nó


Người dùng và nhà thiết kế thường kiểm tra hiệu suất bằng các số liệu khác nhau.
Nếu chúng tôi có thể liên quan đến các số liệu khác nhau này, chúng tôi có thể xác
định ảnh hưởng của thay đổi thiết kế đối với hiệu suất mà người dùng có kinh
nghiệm. Vì chúng tôi đang giới hạn hiệu suất CPU vào thời điểm này, nên biện pháp
hiệu suất đường dưới cùng là CPU
34 Chương 1 Trừu tượng và công nghệ máy tính

thời gian thực hiện. Một công thức đơn giản liên quan đến các số liệu cơ bản nhất
(chu kỳ đồng hồ và thời gian chu kỳ đồng hồ) với thời gian CPU :

Thời gian thực hiện


CPU Chu kỳ đồng hồ CPU
cho một chương 5 cho một chương trình 3 Thời
trình gian chu kỳ đồng hồ

Ngoài ra, vì tốc độ đồng hồ và thời gian chu kỳ đồng hồ là nghịch đảo ,

Thời gian thực hiện Đồng hồ CPU chu kỳ cho một


CPU chương trình
cho một chương
trình 5
Tỷ lệ đồng hồ

Công thức này cho thấy rõ rằng nhà thiết kế phần cứng có thể cải thiện hiệu suất
bằng cách giảm số chu kỳ đồng hồ cần thiết cho một chương trình hoặc độ dài của
chu kỳ đồng hồ. Như chúng ta sẽ thấy trong các chương sau, nhà thiết kế thường
phải đối mặt với sự đánh đổi giữa số chu kỳ đồng hồ cần thiết cho một chương
trình và độ dài của mỗi chu kỳ. Nhiều kỹ thuật làm giảm số chu kỳ đồng hồ cũng
có thể làm tăng thời gian chu kỳ đồng hồ.

VÍ DỤ

Cải thiện hiệu suất

Chương trình yêu thích của chúng tôi chạy trong 10 giây trên máy tính A, có
đồng hồ 2 GHz. Chúng tôi đang cố gắng giúp một nhà thiết kế máy tính xây
dựng một máy tính, B, sẽ chạy chương trình này trong 6 giây. Nhà thiết kế
đã xác định rằng tốc độ đồng hồ tăng đáng kể là có thể, nhưng mức tăng này
TRẢ LỜI sẽ ảnh hưởng đến phần còn lại của thiết kế CPU, khiến máy tính B yêu cầu
số chu kỳ đồng hồ nhiều gấp 1,2 lần so với máy tính A cho chương trình này.
Tốc độ đồng hồ nào chúng ta nên nói với nhà thiết kế để nhắm mục tiêu?

Trước tiên, hãy tìm số chu kỳ đồng hồ cần thiết cho chương trình trên A :

Chu kỳ đồng hồ
Thời gian
CPUA
CPUA 5
Tỷ lệ đồng hồA
Chu kỳ đồng hồ
CPUA
10 giây 5
9 chu kỳ
2 310
thứ hai
chu kỳ
Chu kỳ đồng hồ CPUA 5 10 giây 3 2 3109 thứ hai 5 20 3109 chu kỳ
1.6 Hiệu suất 35

Thời gian CPU cho B có thể được tìm thấy bằng phương trình này :
Thời gian
1.2 chu kỳ đồng hồ CPUA
CPUB
Tỷ lệ đồng hồB
9
1.2 20 10 chu kỳ
6 giây
Tỷ lệ đồng hồB
Tỷ lệ đồng 9 9 9
1 .2 20 10 chu kỳ 0.2 20 10 chu kỳ 4 10 chu kỳ
hồB 4 GHz
6 giây thứ hai thứ hai
Để chạy chương trình trong 6 giây, B phải có tốc độ xung nhịp gấp đôi A .

Hiệu suất hướng dẫn


Các phương trình hiệu suất ở trên không bao gồm bất kỳ tham chiếu nào đến số
lượng hướng dẫn cần thiết cho chương trình. Tuy nhiên, do trình biên dịch tạo rõ
ràng các hướng dẫn để thực thi và máy tính phải thực hiện các hướng dẫn để chạy
chương trình, thời gian thực hiện phải phụ thuộc vào số lượng hướng dẫn trong
chương trình. Một cách để suy nghĩ về thời gian thực hiện là nó bằng số lượng hướng
dẫn được thực hiện nhân với thời gian trung bình trên mỗi lệnh. Do đó, số chu kỳ
đồng hồ cần thiết cho một chương trình có thể được viết là

Chu kỳ trung bình


Chu kỳ đồng hồ CPU 5 Hướng dẫn cho một chương trình 3 mỗi
hướng dẫn
chu kỳ đồng hồ trên
mỗi hướng dẫn (CPI)
Thuật ngữ chu kỳ đồng hồ trên mỗi hướng dẫn, là số chu kỳ đồng hồ trung Số trung bình của chu kỳ
bình mà mỗi lệnh thực hiện, thường được viết tắt là CPIVì các hướng dẫn khác đồng hồ trên mỗi hướng
nhau có thể mất nhiều thời gian khác nhau tùy thuộc vào những gì họ làm, CPI là dẫn cho một đoạn
trung bình của tất cả các hướng dẫn được thực hiện trong chương trình. CPI cung chương trình hoặc
chương trình.
cấp một cách để so sánh hai cách triển khai khác nhau của kiến trúc tập lệnh
giống hệt nhau, vì số lượng hướng dẫn được thực hiện cho một chương trình, tất
nhiên, sẽ giống nhau.

Sử dụng phương trình hiệu suất

Giả sử chúng ta có hai triển khai của cùng một kiến trúc tập lệnh.
Máy tính A có thời gian chu kỳ đồng hồ là 250 ps và CPI là 2.0 cho một số chương trình , VÍ DỤ và máy tính B có thời
gian chu kỳ đồng hồ là 500 ps và CPI là 1,2 cho cùng
chương trình. Máy tính nào nhanh hơn cho chương trình này và bao nhiêu?
36 Chương 1 Trừu tượng và công nghệ máy tính

Chúng tôi biết rằng mỗi máy tính thực hiện cùng một số hướng dẫn cho
TRẢ LỜI chương trình; hãy để số gọi số này TÔIĐầu tiên, tìm số chu kỳ đồng hồ của
bộ xử lý cho mỗi máy tính :.
Chu kỳ đồng hồ CPUA 5 TÔI 3 2.0
Chu kỳ đồng hồ CPUB 5 TÔI 31.2
Bây giờ chúng ta có thể tính thời gian CPU cho mỗi máy tính :
Thời gian CPUA 5 Chu kỳ đồng hồ CPUA 3 Thời

gian chu kỳ đồng hồ 5 TÔI 3 2.0 3 250


ps 5 500 3 TÔI ps
Tương tự như vậy, đối với B :
Thời gian CPUB 5 TÔI 31.2 3 500 ps 5 600 3 TÔI ps

Rõ ràng, máy tính A nhanh hơn. Số tiền nhanh hơn được đưa ra theo tỷ lệ
thời gian thực hiện :
Thời gian thực 600 3 TÔI
Hiệu suất CPUA hiệnB ps
5 5 5 1.2
Thời gian thực 3 TÔI
Hiệu suất CPUB hiệnA 500 ps
Chúng ta có thể kết luận rằng máy tính A nhanh gấp 1,2 lần máy tính B cho
chương trình này.

Phương trình hiệu suất CPU cổ điển


số lượng hướng dẫn Bây giờ chúng ta có thể viết phương trình hiệu suất cơ bản này về mặt số lượng
Các số lượng hướng dẫn
hướng dẫn (số lượng hướng dẫn được thực hiện bởi chương trình), CPI và thời
được thực hiện bởi
chương trình.
gian chu kỳ đồng hồ :
Thời gian CPU 5 Hướng dẫn 3 CPI 3 Thời gian chu kỳ đồng hồ

hoặc, vì tốc độ đồng hồ là nghịch đảo của thời gian chu kỳ đồng hồ :

Thời gian CPU 5 Hướng dẫn 3 CPI


Tỷ lệ đồng hồ

Các công thức này đặc biệt hữu ích vì chúng tách ba yếu tố chính ảnh hưởng đến
hiệu suất. Chúng ta có thể sử dụng các công thức này để so sánh hai triển khai
khác nhau hoặc để
đánh giá một sự thay
thế thiết kế nếu
chúng ta biết tác
động của nó đối với
ba tham số này.
1.6 Hiệu suất 37

CPI
2

So sánh các phân đoạn mã

Một nhà thiết kế trình biên dịch đang cố gắng quyết định giữa hai chuỗi mã
cho một máy tính. Các nhà thiết kế phần cứng đã cung cấp các sự kiện sau :
CPI cho mỗi lớp hướng dẫn
A B C
CPI 1 2 3

Đối với một câu lệnh ngôn ngữ cấp cao cụ thể, người viết trình biên dịch đang
xem xét hai chuỗi mã yêu cầu số lượng lệnh sau :
Chỉ thị được tính cho mỗi lớp hướng dẫn
Trình tự mã A B C
1 2 1 2
2 4 1 1

Trình tự mã nào thực hiện hầu hết các hướng dẫn? Mà sẽ nhanh hơn?
CPI cho mỗi chuỗi là gì?

Trình tự 1 thực hiện 2 + 1 + 2 = 5 hướng dẫn. Trình tự 2 thực hiện 4 + 1 + 1


= 6 hướng dẫn. Do đó, trình tự 1 thực hiện ít hướng dẫn hơn.
Chúng ta có thể sử dụng phương trình cho các chu kỳ đồng hồ CPU dựa
trên số lượng lệnh và CPI để tìm tổng số chu kỳ đồng hồ cho mỗi chuỗi :
n
CT
Chu kỳ đồng hồ CPU ∑ (CPITôi ôi )
Tôi =1

Sản lượng này


Chu kỳ đồng hồ CPU1 5 (2 31) 1 (1 3 2) 1 (2 3 3) 5 2 1 2 1 6 5 Chu kỳ
đồng hồ CPU 10 chu kỳ2 5 (4 31) 1 (1 3 2) 1 (1 3 3) 5 4 1 2 1 3 5 9 chu
kỳ

Vì vậy, chuỗi mã 2 nhanh hơn, mặc dù nó thực thi thêm một lệnh. Vì chuỗi
mã 2 mất ít chu kỳ xung nhịp tổng thể hơn nhưng có nhiều hướng dẫn hơn,
nên nó phải có CPI thấp hơn. Các giá trị CPI có thể được tính bằng
CPI 5 Chu kỳ đồng hồ CPU
Số lượng hướng dẫn
Chu kỳ đồng hồ
CPI 5 CPU1 510 5 2.0
1 Số lượng hướng
dẫn1 5
VÍ DỤ

TRẢ LỜI
38 Chương 1 Trừu tượng và công nghệ máy tính

Hình 1.15 cho thấy các phép đo cơ bản ở các mức khác nhau trong máy
tính và những gì đang được đo lường trong từng trường hợp. Chúng ta
có thể thấy các yếu tố này được kết hợp như thế nào để mang lại thời
gian thực hiện được đo bằng giây cho mỗi chương trình :

Đồng hồ chu
Hướng dẫn kỳ Giây
Giây thời gian / Chương trình
Các Chương Chu kỳ
trình Hướng dẫn đồng hồ
LỚN Luôn luôn nhớ rằng thước đo duy nhất đầy đủ và đáng tin cậy về hiệu
Hình ảnh suất máy tính là thời gian. Ví dụ: thay đổi tập lệnh để giảm số lượng lệnh
có thể dẫn đến một tổ chức có thời gian chu kỳ đồng hồ chậm hơn hoặc
CPI cao hơn bù đắp cho sự cải thiện về số lượng lệnh. Tương tự, vì CPI
phụ thuộc vào loại hướng dẫn được thực thi, mã thực thi số lượng hướng
dẫn ít nhất có thể không phải là nhanh nhất.

Thời gian thực hiện CPU cho một chương trình Giây cho chương trình
Số lượng hướng dẫn Hướng dẫn thực hiện cho chương trình
Chu kỳ đồng hồ trên mỗi hướng dẫn (CPI) Số chu kỳ đồng hồ trung bình trên mỗi hướng dẫn
Thời gian chu kỳ đồng hồ Giây trên mỗi chu kỳ đồng hồ

HÌNH 1.15 Các thành phần cơ bản của hiệu suất và cách đo từng thành phần.

Làm thế nào chúng ta có thể xác định giá trị của các yếu tố này trong phương
trình hiệu suất? Chúng ta có thể đo thời gian thực hiện CPU bằng cách chạy
chương trình và thời gian chu kỳ đồng hồ thường được xuất bản như một phần
của tài liệu cho máy tính. Số lượng hướng dẫn và CPI có thể khó lấy hơn. Tất
nhiên, nếu chúng ta biết tốc độ xung nhịp và thời gian thực hiện CPU, chúng ta
chỉ cần một trong số các số lệnh hoặc CPI để xác định cái kia.
Chúng ta có thể đo số lượng hướng dẫn bằng cách sử dụng các công cụ phần
mềm cấu hình thực thi hoặc bằng cách sử dụng trình giả lập kiến trúc. Ngoài ra,
chúng ta có thể sử dụng bộ đếm phần cứng, được bao gồm trong hầu hết các bộ
xử lý, để ghi lại nhiều phép đo khác nhau, bao gồm số lượng hướng dẫn được
thực hiện, CPI trung bình và thường là nguồn mất hiệu suất. Vì số lượng hướng
dẫn phụ thuộc vào kiến trúc, nhưng không phụ thuộc vào việc thực hiện chính
xác, chúng tôi có thể đo số lượng hướng dẫn mà không cần biết tất cả các chi tiết
của việc thực hiện. Tuy nhiên, CPI phụ thuộc vào nhiều chi tiết thiết kế trong
máy tính, bao gồm cả hệ thống bộ nhớ và cấu trúc bộ xử lý (như chúng ta sẽ thấy
Chương 4 và Chương 5), cũng như về sự pha trộn của các loại lệnh được thực
hiện trong một ứng dụng. Do đó, CPI thay đổi tùy theo ứng dụng, cũng như giữa
các triển khai với cùng một tập lệnh.
1.6 Hiệu suất 39

Ví dụ trên cho thấy sự nguy hiểm của việc chỉ sử dụng một yếu tố (số lượng
hướng dẫn) để đánh giá hiệu suất. Khi so sánh hai máy tính, bạn phải xem cả ba
thành phần, kết hợp với thời gian thực hiện. Nếu một số yếu tố giống hệt nhau, như
tốc độ xung nhịp trong ví dụ trên, hiệu suất có thể được xác định bằng cách so sánh
tất cả các yếu tố không xác định. Vì CPI thay đổi theo hướng dẫn trộn, cả số lượng hướng dẫn trộn
lệnh và CPI phải được so sánh, ngay cả khi tốc độ xung nhịp bằng nhau. Một số bài Một thước đo tần số động
của các hướng dẫn trên
tập ở cuối chương này yêu cầu bạn đánh giá một loạt các cải tiến máy tính và trình
một hoặc nhiều chương
biên dịch ảnh hưởng đến tốc độ đồng hồ, CPI và số lượng hướng dẫn. Trong Mục trình.
1.10, chúng tôi sẽ kiểm tra một phép đo hiệu suất chung mà không kết hợp tất cả
các điều khoản và do đó có thể gây hiểu lầm.

Hiệu suất của một chương trình phụ thuộc vào thuật toán, ngôn ngữ, trình biên dịch,
kiến trúc và phần cứng thực tế. Bảng sau đây tóm tắt cách các thành phần này ảnh
hưởng đến các yếu tố trong phương trình hiệu suất CPU.

Phần cứng
hoặc phần
mềm
Ảnh hưởng đến
thành phần những gì? Làm sao?
Số lượng hướng
Thuật toán dẫn , Thuật toán xác định số lượng chương trình nguồn
CPI hướng dẫn thực hiện và do đó số lượng bộ xử lý
hướng dẫn thực hiện. Thuật toán cũng có thể ảnh hưởng đến
CPI ,
bằng cách ủng hộ hướng dẫn chậm hơn hoặc nhanh hơn. Ví
dụ, nếu
thuật toán sử dụng nhiều phân chia hơn, nó sẽ có xu hướng
có CPI cao hơn .
Số lượng hướng
Lập trình dẫn , Ngôn ngữ lập trình chắc chắn ảnh hưởng đến hướng dẫn
ngôn ngữ CPI đếm, vì các câu trong ngôn ngữ được dịch sang
hướng dẫn xử lý, trong đó xác định số lượng hướng dẫn. Các
ngôn ngữ cũng có thể ảnh hưởng đến CPI vì các tính năng
của nó; cho
ví dụ, một ngôn ngữ có hỗ trợ nặng nề cho việc trừu tượng
hóa dữ liệu
(ví dụ:., Java) sẽ yêu cầu các cuộc gọi gián tiếp, sẽ sử dụng
CPI cao hơn
hướng dẫn.
Số lượng hướng
Trình biên dịch dẫn , Hiệu quả của trình biên dịch ảnh hưởng đến cả hướng dẫn
đếm và chu kỳ trung bình trên mỗi hướng dẫn, kể từ trình biên
CPI dịch
xác định bản dịch của các hướng dẫn ngôn ngữ nguồn
vào hướng dẫn máy tính. Vai trò của trình biên dịch có thể rất
phức tạp và ảnh hưởng đến CPI theo nhiều cách khác nhau.
Số lượng hướng
Bộ hướng dẫn dẫn , Kiến trúc tập lệnh ảnh hưởng đến cả ba khía cạnh của
kiến trúc tốc độ đồng hồ, CPI Hiệu suất CPU, vì nó ảnh hưởng đến các hướng dẫn cần thiết
cho một chức năng, chi phí theo chu kỳ của mỗi hướng dẫn và
tốc độ đồng hồ tổng thể của bộ xử lý.
Hiểu hiệu suất chương trình

Xây dựng: Mặc dù bạn có thể mong đợi rằng CPI tối thiểu là 1.0, như chúng ta sẽ
thấy Chương 4, một số bộ xử lý tìm nạp và thực hiện nhiều hướng dẫn cho mỗi chu
kỳ đồng hồ. Đến phản ánh cách tiếp cận đó, một số nhà thiết kế đảo ngược CPI để
nói về IPC, hoặc là hướng dẫn mỗi chu kỳ đồng hồNếu một bộ xử lý thực hiện trung
bình hai hướng dẫn cho mỗi chu kỳ đồng hồ, thì nó. có IPC là 2 và do đó CPI là 0,5.
40 Chương 1 Trừu tượng và công nghệ máy tính

Xây dựng: Mặc dù thời gian chu kỳ đồng hồ theo truyền thống đã được cố định, để tiết kiệm
năng lượng hoặc tạm thời tăng hiệu suất, ngày nay bộ xử lý có thể thay đổi tốc độ đồng hồ của
chúng, vì vậy chúng tôi sẽ cần sử dụng trung bình tốc độ đồng hồ cho một chương trình. Ví dụ,
Intel Core i7 sẽ tạm thời tăng tốc độ xung nhịp khoảng 10% cho đến khi chip quá ấm. Intel gọi
đây là Chế độ Turbo.
Kiểm tra
Bản Một ứng dụng nhất định được viết bằng Java chạy 15 giây trên bộ xử lý máy tính
thân bạn để bàn. Một trình biên dịch Java mới được phát hành chỉ cần 0,6 hướng dẫn
nhiều như trình biên dịch cũ. Thật không may, nó làm tăng CPI thêm 1.1. Làm
thế nào nhanh chóng chúng ta có thể mong đợi ứng dụng chạy bằng trình biên
dịch mới này? Chọn câu trả lời đúng từ ba lựa chọn dưới đây :
15 0.6
a. 8.2 giây
1.1
9,9
b. 15 0,6 1.1 giây
1.5 1.1
c. 27,5 giây
0,6

1.7 Bức tường điện

Hình 1.16 cho thấy sự gia tăng tốc độ đồng hồ và sức mạnh của chín thế hệ Intel bộ vi
xử lý hơn 36 năm. Cả tốc độ đồng hồ và sức mạnh đều tăng nhanh trong nhiều thập
kỷ và sau đó bị san phẳng hoặc giảm xuống gần đây. Lý do họ phát triển cùng nhau là
vì chúng có mối tương quan với nhau và lý do cho sự chậm lại gần đây của họ là vì
chúng tôi đã chạy vào giới hạn công suất thực tế để làm mát các bộ vi xử lý hàng hóa.

10.000 120
2000 3600 2667 3300 3500 3500 3600
Tốc độ đồng hồ ( MHz)

100
1000 103
Tỷ lệ đồng hồ 200 95 91 95 Sức mạnh (watts)
75.3 87 84 80
100 66 60
25
16
Quyền
12,5 lực 40
10
10.1 29.1 20
3.3 4.1 4.9
1 0
Pentium 4 Willamette

Lõi 2 Kentsfield (2007)

Lõi i5 Clarkdale (2010)

Lõi i5 Haswell (2013)

Lõi i5 Skylake (2016)


Core i5 Coffee Lake
Pentium 4 Prescott
Pentium (1993)
Pentium Pro
80286 (1982)

80386 (1985)

80486 (1989)

(2001)
(1997)

(2004)

(2018)

HÌNH 1.16 Tốc độ đồng hồ và công suất cho bộ vi xử lý Intel x86 qua chín thế hệ và 36 năm.
Pentium 4 đã tạo ra một bước nhảy mạnh mẽ về tốc độ và sức mạnh của đồng hồ nhưng hiệu suất thấp hơn. Các
Các vấn đề nhiệt đã dẫn đến việc từ bỏ dòng Pentium 4. Dòng Core 2 trở lại một đường ống đơn giản hơn với tốc
độ xung nhịp thấp hơn và nhiều bộ xử lý trên mỗi chip. Các đường ống Core i5 theo bước chân của nó.
1.7 Bức tường điện 41

Mặc dù sức mạnh cung cấp một giới hạn cho những gì chúng ta có thể làm
mát, nhưng trong thời kỳ hậu PC, tài nguyên thực sự có giá trị là năng lượng.
Tuổi thọ pin có thể tăng hiệu suất trong thiết bị di động cá nhân và các kiến trúc
sư của máy tính quy mô kho cố gắng giảm chi phí cung cấp năng lượng và làm
mát 50.000 máy chủ vì chi phí cao ở quy mô này. Giống như thời gian đo tính
bằng giây là đánh giá hiệu suất chương trình an toàn hơn so với tốc độ như MIPS
(xem Phần 1.10), joules số liệu năng lượng là thước đo tốt hơn tốc độ năng lượng
như watt, chỉ là joules / giây.
Công nghệ thống trị cho các mạch tích hợp được gọi là CMOS (bổ sung bán dẫn
oxit kim loại). Đối với CMOS, nguồn tiêu thụ năng lượng chính được gọi là năng
lượng động, nghĩa là năng lượng được tiêu thụ khi bóng bán dẫn chuyển trạng thái từ
0 đến 1 và ngược lại. Năng lượng động phụ thuộc vào tải điện dung của từng bóng
bán dẫn và điện áp được áp dụng :

Năng lượng ∝ Tải điện dung Điện áp2

Phương trình này là năng lượng của một xung trong quá trình chuyển đổi logic là
0 → 1 → 0 hoặc 1 → 0 → 1. Năng lượng của một quá trình chuyển đổi là sau đó
Năng lượng ∝ 1/2 Tải điện dung Điện áp2

Công suất cần thiết cho mỗi bóng bán dẫn chỉ là sản phẩm của năng lượng của sự
chuyển đổi và tần số chuyển đổi :
Quyền lực ∝ 1/2 Tải điện dung Điện áp2 Tần số chuyển đổi

Tần số chuyển đổi là một chức năng của tốc độ đồng hồ. Tải điện dung trên mỗi
bóng bán dẫn là một hàm của cả số lượng bóng bán dẫn được kết nối với một đầu
ra (được gọi là quạt ra) và công nghệ, xác định điện dung của cả hai dây và bóng
bán dẫn.
Liên quan đến Hình 1.16, làm thế nào tốc độ đồng hồ có thể tăng lên theo hệ
số 1000 trong khi công suất chỉ tăng 30 lần? Năng lượng và do đó năng lượng có
thể được giảm bằng cách hạ thấp điện áp, xảy ra với mỗi thế hệ công nghệ mới
và năng lượng là một chức năng của bình phương điện áp. Thông thường, điện áp
giảm khoảng 15% mỗi thế hệ. Trong 20 năm, điện áp đã tăng từ 5 V lên 1 V, đó
là lý do tại sao sự gia tăng sức mạnh chỉ 30 lần.

Sức mạnh tương đối


Giả sử chúng tôi đã phát triển một bộ xử lý mới, đơn giản hơn, có 85% điện dung
tải của bộ xử lý cũ phức tạp hơn. Hơn nữa, giả định rằng nó có thể điều chỉnh VÍ DỤ điện áp để
nó có thể giảm điện áp 15% so với bộ xử lý B, dẫn đến tần số co lại 15%. Tác động đến sức mạnh
động là gì?
42 Chương 1 Trừu tượng và công nghệ máy tính

Quyền
lực Tải điện dung 0,85 Điện áp 0,85 2 Tần số chuyển đổi 0,85
TRẢ LỜI mới

Quyền
lực Tải điện áp điện áp2 Tần số chuyển đổi

Do đó, tỷ lệ công suất là

0,854 5 0,52
Do đó, bộ xử lý mới sử dụng khoảng một nửa sức mạnh của bộ xử lý cũ.

Vấn đề hiện đại là việc hạ thấp điện áp hơn nữa dường như làm cho các bóng bán
dẫn quá rò rỉ, giống như vòi nước không thể tắt hoàn toàn. Thậm chí ngày nay,
khoảng 40% mức tiêu thụ điện trong chip máy chủ là do rò rỉ. Nếu bóng bán dẫn
bắt đầu rò rỉ nhiều hơn, toàn bộ quá trình có thể trở nên khó sử dụng.
Để cố gắng giải quyết vấn đề năng lượng, các nhà thiết kế đã gắn các thiết bị lớn
để tăng khả năng làm mát và họ tắt các phần của chip không được sử dụng trong một
chu kỳ đồng hồ nhất định. Mặc dù có nhiều cách đắt tiền hơn để làm mát chip và do
đó tăng sức mạnh của chúng lên 300 watt, nhưng những kỹ thuật này thường quá tốn
kém cho máy tính cá nhân và thậm chí cả máy chủ, chưa kể đến thiết bị di động cá
nhân.
Kể từ khi các nhà thiết kế máy tính đâm sầm vào một bức tường quyền lực, họ
cần một hướng đi mới. Họ đã chọn một con đường khác với cách họ thiết kế bộ
vi xử lý trong 30 năm đầu tiên.

Xây dựng: Mặc dù năng lượng động là nguồn tiêu thụ năng lượng chính trong CMOS,
mức tiêu thụ năng lượng tĩnh xảy ra do dòng rò chảy ngay cả khi bóng bán dẫn tắt. Trong
các máy chủ, rò rỉ thường chịu trách nhiệm cho 40% mức tiêu thụ năng lượng. Do đó, việc
tăng số lượng bóng bán dẫn làm tăng sự tiêu tán năng lượng, ngay cả khi các bóng bán
dẫn luôn tắt. Một loạt các kỹ thuật thiết kế và đổi mới công nghệ đang được triển khai để
kiểm soát rò rỉ, nhưng nó khó có thể hạ thấp điện áp hơn nữa.

Xây dựng: Sức mạnh là một thách thức cho các mạch tích hợp vì hai lý do. Đầu tiên,
năng lượng phải được đưa vào và phân phối xung quanh chip; bộ vi xử lý hiện đại sử
dụng hàng trăm chân chỉ để lấy năng lượng và mặt đất! Tương tự, nhiều cấp độ kết nối
chip chỉ được sử dụng để phân phối điện và mặt đất cho các phần của chip. Thứ hai, năng
lượng bị tiêu tán dưới dạng nhiệt và phải được loại bỏ. Chip máy chủ có thể ghi nhiều hơn
hơn 100 watt, và làm mát chip và hệ thống xung quanh là một chi phí lớn trong các
máy tính quy mô kho (xem Chương 6).
1.8 Thay đổi biển: Chuyển từ bộ vi xử lý sang bộ đa xử lý 43

Thay đổi biển: Công tắc từ


1.8
Bộ vi xử lý để đa bộ xử lý

Giới hạn công suất đã buộc một sự thay đổi mạnh mẽ trong thiết kế bộ vi xử lý. Cho đến nay, hầu hết
Hình 1.17 cho thấy sự cải thiện về thời gian đáp ứng của các chương trình cho các phần mềm đã
máy tính để bàn vi xử lý theo thời gian. Kể từ năm 2002, tỷ lệ đã chậm lại từ hệ giống như âm nhạc
số 1,5 mỗi năm xuống chỉ còn 1,03 mỗi năm. được viết cho một nghệ
Thay vì tiếp tục giảm thời gian phản hồi của một chương trình chạy trên bộ xử lý sĩ solo; với thế hệ chip
đơn, kể từ năm 2006, tất cả các công ty máy tính để bàn và máy chủ đang vận chuyển hiện tại, chúng tôi có
bộ vi xử lý với nhiều bộ xử lý trên mỗi chip, trong đó lợi ích thường là thông lượng một chút kinh nghiệm
nhiều hơn thời gian phản hồi. Để giảm sự nhầm lẫn giữa bộ xử lý từ và bộ vi xử lý, với các bản song ca và
các công ty gọi các bộ xử lý là lõi lõi, bộ vi xử lý và các bộ vi xử lý như vậy được tứ tấu và các bản hòa
gọi chung là bộ vi xử lý đa lõi. Do đó, một bộ vi xử lý quadcore của người Viking là tấu nhỏ khác; nhưng
một con chip chứa bốn bộ xử lý hoặc bốn lõi. ghi một tác phẩm cho
Trước đây, các lập trình viên có thể dựa vào những đổi mới trong phần cứng, dàn nhạc lớn và hợp
kiến trúc và trình biên dịch để tăng gấp đôi hiệu suất của các chương trình của họ xướng là một loại thử
sau mỗi 18 tháng mà không phải thay đổi một dòng mã. Ngày nay, để các lập thách khác.
trình viên có được sự cải thiện đáng kể về thời gian phản hồi, họ cần viết lại các Brian Hayes , Máy tính
chương trình của mình để tận dụng nhiều bộ xử lý. Hơn nữa, để có được lợi ích trong một vũ trụ song
lịch sử khi chạy nhanh hơn trên các bộ vi xử lý mới, các lập trình viên sẽ phải song, 2007.
tiếp tục cải thiện hiệu suất của mã khi số lượng lõi tăng lên.
Để củng cố cách các hệ thống phần mềm và phần cứng hoạt động cùng nhau,
chúng tôi sử dụng một phần đặc biệt , Giao diện phần cứng / phần mềm, trong
suốt cuốn sách, với cái đầu tiên xuất hiện dưới đây. Những yếu tố này tóm tắt
những hiểu biết quan trọng tại giao diện quan trọng này.

Song song luôn luôn quan trọng đối với hiệu suất trong điện toán, nhưng nó Giao diện
thường ẩn. Chương 4 sẽ giải thích đường ống, một kỹ thuật thanh lịch chạy các
chương trình nhanh hơn bằng cách chồng chéo việc thực hiện các hướng dẫn.
phần
Đường ống là một ví dụ về song song cấp độ hướng dẫn, nơi tính chất song song cứng /
của phần cứng được trừu tượng hóa đi để lập trình viên và trình biên dịch có thể phần
nghĩ phần cứng là thực hiện các hướng dẫn tuần tự. mềm
Buộc các lập trình viên phải nhận thức được phần cứng song song và viết lại các
chương trình của họ song song là đường ray thứ ba của kiến trúc máy tính, đối với
các công ty trong quá khứ phụ thuộc vào sự thay đổi hành vi như vậy đã thất bại
(xem Mục 6.15). Từ quan điểm lịch sử này, nó giật mình rằng toàn bộ Ngành
công nghiệp CNTT đặt cược tương lai của nó rằng các lập trình viên sẽ chuyển
thành công một cách rõ ràng
lập trình song song.
44 Chương 1 Trừu tượng và công nghệ máy tính

Intel Core i7 4 lõi 4.2 GHz (Tăng lên 4,5 GHz)


Intel Core i7 4 lõi 4.0 GHz (Tăng lên 4.2 GHz)
Intel Core i7 4 lõi 4.0 GHz (Tăng lên 4.2 GHz)
Intel Xeon 4 lõi 3,7 GHz (Tăng lên 4,1 GHz)
100.000 Intel Xeon 4 lõi 3,6 GHz (Tăng lên 4.0 GHz)
Intel Xeon 4 lõi 3,6 GHz (Tăng lên 4.0 GHz)
Intel Core i7 4 lõi 3,4 GHz (tăng lên 3,8 GHz)
Intel Xeon 6 lõi, 3,3 GHz (tăng lên 3,6 GHz) 49.935
Intel Xeon 4 lõi, 3,3 GHz (tăng lên 3,6 GHz) 49.870
Intel Core i7 Extreme 4 lõi 3,2 GHz (tăng lên 3,5 GHz) 39.419
31.999
49.935
Intel Core Duo Extreme 2 lõi, 3.0 GHz 21.871 40.967
Intel Core 2 Extreme 2 lõi, 2,9 GHz 34.967
10.000 AMD Athlon 64, 2,8 GHz 24.129
AMD Athlon, 2,6 GHz 14.387 19.484
11.865
Intel Xeon EE 3,2 GHz 6.681 7.108
Bo mạch chủ Intel D850EMVR (bộ xử lý 3.06 GHz, Pentium 4 với Công nghệ siêu phân luồng) 6.043
Hiệu suất (vs. VAX-11/780)

IBM Power4, 1,3 GHz 4.195


3.016
Bo mạch chủ Intel VC820, bộ xử lý Pentium III 1.0 GHz
Máy trạm chuyên nghiệp XP1000, 667 MHz 21264A 1.779
1000 AlphaServer kỹ thuật số 8400 6/575, 575 MHz 21264 1.267
993
AlphaServer 4000 5/600, 600 MHz 21164
Bảng chữ cái kỹ thuật số 5/500, 500 MHz 649
480
Bảng chữ cái kỹ thuật số 5/300, 300 MHz 12% / năm 3,5% /
Bảng chữ cái kỹ thuật số 4/266, 266 280 23% / năm năm
MHz
183
100 IBM POWERstation 100, 150 MHz 117
Kỹ thuật số 3000 AXP / 500, 150 MHz
80
HP 9000/750, 66 MHz
51

IBM RS6000 / 540, 30 MHz 24 52% / năm


MIPS M2000, 25 MHz
18
10 MIPS M / 120, 16,7 MHz
13
Sun-4/260, 16,7 MHz 9
VAX 8700, 22 MHz 5
AX-11/780, 5 MHz

25% / năm
1 1
1978 1980 1982 1984 1986 1988 1990 1992 1994 1996 2000 2002 2004 2006 2008 2010 2012 2014 2016

HÌNH 1.17 Tăng trưởng hiệu suất bộ xử lý kể từ giữa những năm 1980. Biểu đồ này biểu đồ hiệu suất liên quan đến VAX
11/780 được đo bằng các điểm chuẩn của Specint (xem Phần 1.11). Trước giữa những năm 1980, tăng trưởng hiệu suất của bộ xử lý chủ
yếu dựa trên công nghệ và trung bình khoảng 25% mỗi năm. Sự gia tăng tăng trưởng lên khoảng 52% kể từ đó là do các ý tưởng kiến trúc
và tổ chức tiên tiến hơn. Mức cải thiện hiệu suất hàng năm cao hơn 52% kể từ giữa những năm 1980 có nghĩa là hiệu suất đạt khoảng bảy
lần lớn hơn vào năm 2002 so với mức 25%. Kể từ năm 2002, các giới hạn về sức mạnh, tính song song ở cấp độ hướng dẫn có sẵn và độ trễ
bộ nhớ dài đã làm chậm hiệu suất của bộ giải xử lý gần đây, xuống còn khoảng 3,5% mỗi năm.

Tại sao các lập trình viên rất khó viết các chương trình song song rõ ràng? Lý do
đầu tiên là lập trình song song là lập trình hiệu suất định nghĩa, làm tăng độ khó của
lập trình. Chương trình không chỉ cần chính xác, giải quyết một vấn đề quan trọng và
cung cấp giao diện hữu ích cho mọi người hoặc các chương trình khác gọi nó;
chương trình cũng phải nhanh chóng. Mặt khác, nếu bạn không cần hiệu suất, chỉ cần
viết một chương trình tuần tự.
Lý do thứ hai là nhanh chóng cho phần cứng song song có nghĩa là lập trình viên
phải phân chia một ứng dụng để mỗi bộ xử lý có cùng số lượng phải làm cùng một
lúc và chi phí lên lịch và phối hợp không làm giảm đi lợi ích hiệu suất tiềm năng của
song song.
Như một sự tương tự, giả sử nhiệm vụ là viết một câu chuyện báo chí. Tám phóng
viên làm việc trên cùng một câu chuyện có khả năng viết một câu chuyện nhanh hơn tám
lần. Để đạt được tốc độ tăng này, người ta sẽ cần phải chia tay nhiệm vụ để mỗi phóng
viên có việc phải làm cùng một lúc. Như vậy, chúng ta phải lịch trình các nhiệm vụ phụ.
Nếu bất cứ điều gì sai và chỉ một phóng viên mất nhiều thời gian hơn bảy người khác đã
làm, thì lợi ích của việc có tám nhà văn sẽ bị giảm đi. Như vậy, chúng ta phải cân bằng
1.8 Thay đổi biển: Chuyển từ bộ vi xử lý sang bộ đa xử lý 45

tải đồng đều để có được tốc độ mong muốn. Một mối nguy hiểm khác sẽ là nếu các
phóng viên có dành nhiều thời gian để nói chuyện với nhau để viết phần của họ. Bạn cũng
sẽ hụt hẫng nếu một phần của câu chuyện, chẳng hạn như kết luận, không thể được viết
cho đến khi tất cả các phần khác được hoàn thành. Vì vậy, phải cẩn thận giảm giao tiếp
và đồng bộ hóa trên đầuĐối với cả tương tự và lập trình song song này, các. các thách
thức bao gồm lập lịch, cân bằng tải, thời gian để đồng bộ hóa và chi phí liên lạc giữa các
bên. Như bạn có thể đoán, thách thức là cứng hơn với nhiều phóng viên hơn cho một câu
chuyện báo chí và nhiều bộ xử lý hơn cho lập trình song song.
Để phản ánh sự thay đổi biển này trong ngành, năm chương tiếp theo trong ấn bản này
của cuốn sách mỗi phần có một phần về ý nghĩa của cuộc cách mạng song song với
chương đó :
■ Chương 2, Mục 2.11: Song song và hướng dẫn: Đồng bộ hóaThông thường.
các nhiệm vụ song song độc lập cần phối hợp đôi khi, chẳng hạn như khi họ
đã hoàn thành công việc của mình. Chương này giải thích các hướng dẫn
được sử dụng bởi các bộ xử lý đa lõi để đồng bộ hóa các tác vụ.
■ Chương 3, Mục 3.6: Song song và số học máy tính: Subword Song songCó
lẽ hình thức song song đơn giản nhất để xây dựng liên quan. tính toán trên
các yếu tố song song, chẳng hạn như khi nhân hai vectơ. Song song
Subword dựa trên các đơn vị số học rộng hơn có thể hoạt động trên nhiều
toán hạng cùng một lúc.
■ Chương 4, Mục 4.10: Song song thông qua Hướng dẫnĐưa ra những khó khăn
của. lập trình song song rõ ràng, nỗ lực to lớn đã được đầu tư vào những năm
1990
trong việc có phần cứng và trình biên dịch phát hiện ra sự song song ngầm,
ban đầu thông qua đường ống Chương này mô tả một số kỹ thuật tích cực
này, bao gồm tìm nạp và thực hiện đồng thời nhiều hướng dẫn và đoán kết
quả của các quyết định và thực hiện các hướng dẫn sử dụng một cách suy
đoán. dự đoán.
■ Chương 5, Mục 5.10: Song song và Phân cấp bộ nhớ: Bộ nhớ cache Sự kết
hợpMột cách để giảm chi phí truyền thông là có tất cả. bộ xử lý sử dụng cùng
một không gian địa chỉ, để mọi bộ xử lý có thể đọc hoặc ghi bất kỳ dữ liệu nào.
Cho rằng tất cả các bộ xử lý ngày nay sử dụng bộ nhớ cache để giữ tạm thời
bản sao dữ liệu trong bộ nhớ nhanh hơn gần bộ xử lý, thật dễ dàng để tưởng
tượng rằng lập trình song song sẽ còn khó khăn hơn nếu bộ nhớ cache được liên
kết với mỗi bộ xử lý có giá trị không nhất quán của dữ liệu được chia sẻ.
Chương này mô tả các cơ chế giữ dữ liệu trong tất cả các bộ nhớ cache nhất
quán.
■ Chương 5, Mục 5.11: Phân cấp song song và bộ nhớ: Dự phòng Mảng đĩa
rẻ tiềnPhần này mô tả cách sử dụng nhiều đĩa. kết hợp có thể cung cấp
thông lượng cao hơn nhiều, đó là bản gốc
cảm hứng của Mảng dư thừa của đĩa rẻ tiền (RAID). Sự phổ biến thực sự
của RAID đã chứng tỏ là độ tin cậy lớn hơn nhiều được cung cấp bằng
cách bao gồm một số lượng đĩa dự phòng khiêm tốn. Phần này giải thích sự
khác biệt về hiệu suất, chi phí và độ tin cậy giữa các cấp độ RAID khác
nhau.
46 Chương 1 Trừu tượng và công nghệ máy tính
để sử dụng để so sánh hiệu suất máy tính.

Tôi nghĩ rằng [máy tính]


sẽ là một ý tưởng áp
dụng phổ biến, giống
như một cuốn sách.
Nhưng tôi đã không nghĩ
rằng nó sẽ phát triển
nhanh như nó đã làm,
bởi vì tôi đã hình dung
ra rằng chúng tôi có thể
có được nhiều phần trên
một con chip như
cuối cùng chúng tôi đã
có. Transitor xuất hiện
bất ngờ. Tất cả xảy ra
nhanh hơn nhiều so
với chúng tôi mong
đợi.
J. Presper Eckert, nhà
sản xuất ENIAC, phát
biểu năm 1991

khối lượng công việc


Một bộ các chương trình
chạy trên máy tính là bộ
sưu tập ứng dụng thực tế
do người dùng điều hành
hoặc được xây dựng từ các
chương trình thực để ước
tính một hỗn hợp như vậy.
Một khối lượng công việc
điển hình chỉ định cả
chương trình và tần số
tương đối.

điểm chuẩn Một


chương trình được chọn
Phụ lục B mô tả GPU NVIDIA và các phần nổi bật của song song của nó
môi trường lập trình.
Ngoài các phần này,
có một chương đầy đủ
về xử lý song song.
Chương 6 đi sâu vào Real Stuff: Điểm chuẩn
chi tiết hơn về những
1.9
Intel Core i7
thách thức của lập
trình song song; trình
bày hai cách tiếp cận Mỗi chương có một phần có tên là Real Real Stuff, liên kết các khái niệm trong
tương phản để truyền cuốn sách với một máy tính bạn có thể sử dụng hàng ngày. Những phần này bao
thông địa chỉ được gồm công nghệ cơ bản của máy tính hiện đại. Đối với phần Real Real Stuff đầu
chia sẻ và thông điệp tiên này, chúng tôi xem xét cách các mạch tích hợp được sản xuất và cách đo
rõ ràng; mô tả một mô hiệu suất và công suất, với ví dụ Intel Core i7.
hình hạn chế của song
song dễ lập trình hơn; Điểm chuẩn CPU ĐẶC BIỆT
thảo luận về độ khó Một người dùng máy tính chạy cùng một chương trình ngày này qua ngày khác sẽ
của bộ xử lý song là ứng cử viên hoàn hảo để đánh giá một máy tính mới. Tập hợp các chương trình
song điểm chuẩn; giới chạy sẽ tạo thành một khối lượng công việc Để đánh giá hai hệ thống máy tính,
thiệu một mô hình người dùng chỉ cần so sánh thời gian thực hiện khối lượng công việc trên hai máy
hiệu suất đơn giản mới tính. Hầu hết người dùng, tuy nhiên, không ở trong tình huống này. Thay vào đó,
cho bộ vi xử lý đa lõi; họ phải dựa vào các phương pháp khác để đo hiệu suất của máy tính ứng cử viên,
và, cuối cùng, mô tả hy vọng rằng các phương thức sẽ phản ánh mức độ hiệu quả của máy tính với
và đánh giá bốn ví dụ khối lượng công việc của người dùng. Sự thay thế này thường được theo sau bằng
về bộ vi xử lý đa lõi cách đánh giá máy tính bằng một bộ. điểm chuẩn- các chương trình được lựa
bằng mô hình này. chọn đặc biệt để đo lường hiệu suất. Các điểm chuẩn tạo thành một khối lượng
Như đã đề cập ở công việc mà người dùng hy vọng sẽ dự đoán hiệu suất của khối lượng công việc
trên , Chương 3 đến 6 thực tế. Như chúng tôi đã lưu ý ở trên, để làm cho trường hợp phổ biến nhanh,
sử dụng vectơ ma trận trước tiên bạn cần biết chính xác trường hợp nào là phổ biến, vì vậy điểm chuẩn
nhân như một ví dụ đóng vai trò quan trọng trong kiến trúc máy tính.
đang chạy để chỉ ra ĐẶC BIỆT (Hợp tác xã đánh giá hiệu suất hệ thống) là một nỗ lực được tài trợ và
cách mỗi loại song song hỗ trợ bởi một số nhà cung cấp máy tính để tạo ra các bộ điểm chuẩn tiêu chuẩn cho
có thể tăng hiệu suất
các hệ thống máy tính hiện đại. Năm 1989, ban đầu, SPEC đã tạo ra một bộ điểm
đáng kể.
chuẩn tập trung vào hiệu suất của bộ xử lý (bây giờ được gọi là Spec89), đã phát
Phụ lục B mô tả
triển
một thành phần
phần cứng ngày
càng phổ biến mà
được bao gồm với
máy tính để bàn, the
đơn vị xử lý đồ họa
(GPU). Được phát
minh để tăng tốc đồ
họa, GPU đang trở
thành nền tảng lập
trình theo cách riêng
của họ. Như bạn có
thể mong đợi, trong
những thời điểm này,
GPU dựa vào song
song.
1.9 Real Stuff: Điểm chuẩn Intel Core i7 47

Thông dịch viên Perl perlbench 2684 0,42 0,556 627 1774 2,83
Trình biên dịch GNU C gcc 2322 0,67 0,556 863 3976 4.61
Quy hoạch tuyến đường mcf 1786 1.22 0,556 1215 4721 3,89
Mô phỏng sự kiện rời rạc - omnetpp 1107 0,82 0,556 507 1630 3.21
mạng máy tính
XML sang HTML xalancbmk 1314 0,75 0,556 549 1417 2,58
chuyển đổi qua XSLT
Nén video x264 4488 0,32 0,556 813 1763 2.17
Trí tuệ nhân tạo :
cây alpha-beta sâu sắc 2216 0,57 0,556 698 1432 2.05
tìm kiếm (Cờ vua)
Trí tuệ nhân tạo :
Cây Monte Carlo leela 2236 0,79 0,556 987 1703 1.73
tìm kiếm (Đi)
Trí tuệ nhân tạo :
giải pháp đệ quy trao đổi2 6683 0,46 0,556 1718 2939 1.71
máy phát điện (Sudoku)
Dữ liệu chung xz 8533 1.32 0,556 6290 6182 0,98
nén
Hình học trung bình - - - - - - 2.36

HÌNH 1.18 SPECspeed 2017 Điểm chuẩn số nguyên chạy trên Intel Xeon E5-2650L 1.8 GHz . Như phương trình trên trang 35 giải
thích, thời gian thực hiện là sản phẩm của ba yếu tố trong bảng này: số lượng lệnh tính bằng tỷ, đồng hồ trên mỗi lệnh (CPI) và thời gian chu kỳ đồng
hồ tính bằng nano giây. Specratio đơn giản là thời gian tham chiếu, được cung cấp bởi Spec, chia cho thời gian thực hiện được đo. Số duy nhất được
trích dẫn là Specspeed 2017 Integer là giá trị trung bình hình học của Specratios. SPECspeed 2017 có nhiều tệp đầu vào cho perlbench, gcc, x264 và
xz. Đối với hình này, thời gian thực hiện và tổng chu kỳ đồng hồ là tổng thời gian chạy của các chương trình này cho tất cả các đầu vào.

qua năm thế hệ. Mới nhất là CPU2017, bao gồm một bộ gồm 10 điểm chuẩn số
nguyên (Số nguyên SPECspeed 2017) và 13 điểm chuẩn dấu phẩy động (CFP2006).
Các điểm chuẩn số nguyên thay đổi từ một phần của trình biên dịch C sang chương
trình cờ vua sang mô phỏng máy tính lượng tử. Các điểm chuẩn dấu phẩy động bao
gồm các mã lưới có cấu trúc để mô hình phần tử hữu hạn, mã phương pháp hạt cho
động lực học phân tử và mã đại số tuyến tính thưa thớt cho động lực học chất lỏng.
Hình 1.18 mô tả các điểm chuẩn số nguyên của Spec và thời gian thực hiện
của chúng trên Intel Core i7 và hiển thị các yếu tố giải thích thời gian thực hiện:
số lượng lệnh, CPI và thời gian chu kỳ đồng hồ. Lưu ý rằng CPI thay đổi nhiều
hơn hệ số 4.
Để đơn giản hóa việc tiếp thị máy tính, Spec đã quyết định báo cáo một số duy
nhất tóm tắt tất cả 10 điểm chuẩn số nguyên. Chia thời gian thực hiện của bộ xử lý
tham chiếu theo thời gian thực hiện của máy tính được đánh giá sẽ bình thường hóa
các phép đo thời gian thực hiện; sự chuẩn hóa này mang lại một thước đo, được gọi
là Đặc biệt, có lợi thế là kết quả số lớn hơn cho thấy hiệu suất nhanh hơn. Đó là,
Specratio là nghịch đảo của thời gian thực hiện. Một phép đo tóm tắt SPECspeed
2017 có được bằng cách lấy giá trị trung bình hình học của Specratios.

Xây dựng: Khi so sánh hai máy tính sử dụng Specratios, hãy áp dụng hình học có nghĩa là
nó đưa ra câu trả lời tương đối giống nhau cho dù máy tính nào được sử dụng để bình thường
hóa kết quả. Nếu chúng ta tính trung bình các giá trị thời gian thực hiện được chuẩn hóa với giá
trị trung bình số học, kết quả sẽ thay đổi tùy thuộc vào máy tính chúng ta chọn làm tham chiếu.
48 Chương 1 Trừu tượng và công nghệ máy tính

Công thức cho giá trị trung bình hình học là


n
n ∏Tỷ lệ thời gian thực hiệnTôi
Tôi 1

trong đó tỷ lệ thời gian thực hiệnTôi là thời gian thực hiện, được chuẩn hóa cho máy
tính tham chiếu, cho Tôichương trình của tổng số n trong khối lượng công việc, và
n
∏aTôi có nghĩa là sản phẩm a1 a2 ... an
i 1

Điểm chuẩn điện


Do tầm quan trọng ngày càng tăng của năng lượng và sức mạnh, ĐẶC BIỆT đã
thêm một chuẩn mực để đo lường sức mạnh. Nó báo cáo mức tiêu thụ điện của
các máy chủ ở các mức khối lượng công việc khác nhau, được chia thành 10%
gia tăng, trong một khoảng thời gian. Hình 1.19 hiển thị kết quả cho một máy
chủ sử dụng bộ xử lý Intel Nehalem tương tự như trên.

100% 4.864.136 347


90% 4.389.196 312
80% 3.905.724 278
70% 3,418,737 241
60% 2.925.811 212
50% 2.439.017 183
40% 1.951.394 160
30% 1.461.411 141
20% 974.045 128
10% 485.973 115
0% 0 48
Tổng số 26.815.444 2.165
ssj_ops / sức mạnh = 12.385

HÌNH 1.19 SPECpower_ssj2008 chạy trên ổ cắm kép 2.2 GHz Intel Xeon Platinum 8276L
với 192 GiB DRAM và một đĩa SSD 80 GB.

SPECpower bắt đầu với một tiêu chuẩn SPEC khác cho các ứng dụng kinh doanh
Java (SPECJBB2005), thực hiện bộ xử lý, bộ nhớ đệm và bộ nhớ chính cũng như
máy ảo Java, trình biên dịch, bộ thu rác và các phần của hệ điều hành. Hiệu suất
được đo bằng thông lượng và các đơn vị là hoạt động kinh doanh mỗi giây. Một lần
nữa, để đơn giản hóa việc tiếp thị máy tính, ĐẶC BIỆT
1.10 Nhanh hơn: Ma trận nhân trong Python 49

đun sôi các số này xuống một số, được gọi là ssj_ops tổng thể trên mỗi
watt.Công thức cho số liệu tóm tắt duy nhất này là
10 10quyền
tổng thể ssj_ops trên mỗi watt 5 ∑ ssj_opsTôi ∑ lựcTôi
Tôi
Tôi50 50

nơi ssj_opsTôi là hiệu suất ở mỗi mức tăng 10% và sức mạnhTôi là năng lượng
tiêu thụ ở mỗi cấp độ hiệu suất.

1.10 Nhanh hơn: Ma trận nhân trong Python

Để chứng minh tác động của các ý tưởng trong cuốn sách này, mỗi chương đều
có phần Nhanh hơn về phía trước, cải thiện hiệu suất của một chương trình nhân
một ma trận nhân với một vectơ. Chúng tôi bắt đầu với chương trình Python này :

Chúng tôi đang sử dụng máy chủ n1-tiêu chuẩn-96 trong Google Cloud
Engine, có hai chip Intel Skylake Xeon và mỗi chip có 24 bộ xử lý hoặc lõi và
chạy Python phiên bản 3.1. Nếu ma trận là 960 x 960, phải mất khoảng 5 phút để
chạy bằng Python 2.7. Vì các phép tính dấu phẩy động đi lên với khối lập
phương của kích thước ma trận, nên sẽ mất gần 6 giờ để chạy nếu ma trận là
4096 x 4096. Mặc dù nhanh chóng viết ma trận nhân lên trong Python, người
muốn đợi lâu để có câu trả lời?
Trong Chương 2, chúng tôi chuyển đổi phiên bản Python của ma trận nhân
thành phiên bản C làm tăng hiệu suất lên 200 lần. Sự trừu tượng lập trình C gần
với phần cứng hơn Python, đó là lý do tại sao chúng tôi sử dụng nó làm ví dụ lập
trình trong cuốn sách này. Thu hẹp khoảng cách trừu tượng cũng làm cho nó
nhanh hơn nhiều so với Python [Leiserson, 2020].
■ Trong danh mục song song cấp dữ liệu, trong Chương 3 chúng tôi sử dụng
song song từ con thông qua nội tại C để tăng hiệu suất theo hệ số khoảng 8.
■ Trong thể loại song song cấp độ hướng dẫn, trong Chương 4 chúng tôi sử
dụng vòng lặp unrolling để khai thác nhiều vấn đề lệnh và phần cứng thực
thi ngoài đơn hàng để tăng hiệu suất theo một yếu tố khác khoảng 2.
■ Trong danh mục tối ưu hóa hệ thống phân cấp bộ nhớ, trong Chương 5 chúng tôi sử
dụng chặn bộ đệm để tăng hiệu suất trên các ma trận lớn theo hệ số khác khoảng
1,5.
50 Chương 1 Trừu tượng và công nghệ máy tính

100000
44.226

10000
3.686
2.457
1.365
-lên 1000

175
Tốc
độ

100

10

1
1
Con trăn dịch + Mức dữ liệu + Hướng dẫn + Ký ức + Chủ đề
(Ch. 1) đến C Song song cấp độ thứ bậc cấp độ
(Ch. 2) (Ch. 3) song song tối ưu hóa song song
(Ch. 4) (Ch. 5) (Ch. 6)

HÌNH 1.20 Tối ưu hóa chương trình nhân ma trận trong Python trong năm chương tiếp
theo của cuốn sách này.
■ Trong thể loại song song cấp độ chủ đề, trong Chương 6 chúng tôi sử dụng
song song cho các vòng lặp trong OpenMP để khai thác phần cứng đa lõi
để tăng hiệu suất theo hệ số khác từ 12 đến 17.
Bốn bước cuối cùng thúc đẩy sự hiểu biết của chúng ta về cách phần cứng cơ bản thực
sự hoạt động trong bộ vi xử lý hiện đại và chỉ yêu cầu 21 dòng mã C. Hình 1.20 cho thấy
tốc độ tăng tốc trên thang đo nhật ký của hệ số gần 50.000 so với ban đầu Phiên bản
Python. Thay vì chờ đợi gần sáu giờ, sẽ mất ít hơn một giây!

Xây dựng: Để tăng tốc Python, các lập trình viên thường gọi các thư viện được tối ưu hóa cao thay
vì viết mã trong chính Python. Vì chúng tôi đang cố gắng hiển thị tốc độ vốn có của Python so với C,
chúng tôi hiển thị tốc độ nhân ma trận trong chính Python. Nếu chúng ta sử dụng thư viện Numpy thay
vào đó, phép nhân ma trận 960 x 960 sẽ mất ít hơn 1 giây thay vì 5 phút.

1.11 Ngụy biện và Cạm bẫy


Khoa học phải bắt
Mục đích của một phần về ngụy biện và cạm bẫy, sẽ được tìm thấy trong mỗi chương, là
đầu với những để giải thích một số quan niệm sai lầm thường được tổ chức mà bạn có thể gặp phải.
huyền thoại, và Chúng tôi gọi cho họ ngụy biệnKhi thảo luận về một ngụy biện, chúng tôi cố gắng đưa ra
những lời chỉ trích một ví dụ. Chúng tôi cũng thảo luận. cạm bẫy, hoặc dễ dàng phạm sai lầm. Thông thường
về thần thoại. cạm bẫy là khái quát của các nguyên tắc đúng trong một bối cảnh hạn chế. Mục đích của
Ngài Karl Popper , các phần này là để giúp bạn tránh mắc những lỗi này trong các máy tính bạn có thể thiết
Các Triết học khoa kế hoặc sử dụng. Ngụy biện chi phí / hiệu suất và cạm bẫy đã khiến nhiều kiến trúc sư
học, 1957 máy tính, bao gồm cả chúng tôi. Theo đó, điều này
1.11 Ngụy biện và Cạm bẫy 51

Hiệu quả năng lượng


phần không thiếu các ví dụ liên quan. Chúng tôi bắt đầu với một cạm bẫy bẫy quan trọng ở mức sử
nhiều nhà thiết kế và cho thấy một mối quan hệ quan trọng trong thiết kế máy dụng thấp vì khối lượng
tính.
công việc máy chủ khác
Pitfall: Mong đợi sự cải tiến của một khía cạnh của máy tính để tăng hiệu suất
nhau. Việc sử dụng các
tổng thể theo một tỷ lệ thuận với kích thước của cải tiến.
máy chủ trong máy tính
Ý tưởng tuyệt vời của việc thực hiện trường hợp phổ biến nhanh có một hệ quả
tất yếu đã làm khổ các nhà thiết kế của cả phần cứng và phần mềm. Nó nhắc nhở quy mô kho Google
chúng ta rằng cơ hội để cải thiện bị ảnh hưởng bởi thời gian sự kiện tiêu tốn bao Google, chẳng hạn, nằm
nhiêu thời gian. trong khoảng từ 10%
Một vấn đề thiết kế đơn giản minh họa nó tốt. Giả sử một chương trình chạy đến 50%
trong 100 giây trên máy tính, với các thao tác nhân trong 80 giây thời gian này.
Tôi phải cải thiện tốc độ nhân lên bao nhiêu nếu tôi muốn chương trình của mình
chạy nhanh hơn năm lần?
Thời gian thực hiện của chương trình sau khi thực hiện cải tiến được đưa ra
bởi phương trình đơn giản sau đây được gọi là Luật Amdahl:
Thực hiện cải tiến timeaffter
5 Thực hiện bị ảnh hưởng bởi cải tiến 1 Thực hiện không bị
ảnh hưởng thời gian Số lượng cải tiến
Đối với vấn đề này :
80 giây
Thời gian thực hiện một cải tiến er (100 80 giây) n

Vì chúng tôi muốn hiệu suất nhanh hơn năm lần, thời gian thực hiện mới sẽ là 20
giây, cho
80 giây
20 giây 5 1 20 giây
n
0 5 80 giây
n

Đó là, có không có số tiền theo đó chúng ta có thể tăng cường - nhiều lần để đạt
được hiệu suất tăng gấp năm lần, nếu nhân chỉ chiếm 80% khối lượng công việc.
Việc tăng cường hiệu suất có thể với một cải tiến nhất định bị giới hạn bởi số
lượng mà tính năng cải tiến được sử dụng. Trong cuộc sống hàng ngày, khái
niệm này cũng mang lại cái mà chúng ta gọi là luật lợi nhuận giảm dần.
Chúng ta có thể sử dụng Luật Amdahl để ước tính các cải tiến hiệu suất khi chúng
ta biết thời gian tiêu thụ cho một số chức năng và tốc độ tiềm năng của nó. Amdahl
từ Luật, cùng với phương trình hiệu suất CPU, là một công cụ hữu ích để đánh giá
các cải tiến có thể. Luật Amdahl từ được khám phá chi tiết hơn trong các bài tập.
Luật Amdahl cũng được sử dụng để tranh luận về các giới hạn thực tế đối với số lượng
bộ xử lý song song. Chúng tôi kiểm tra lập luận này trong phần Fallacy và Pit thác của
Chương 6.
Fallacy: Máy tính sử dụng thấp sử dụng ít năng lượng.
Luật Amdahl Một quy tắc nêu rõ rằng việc tăng cường hiệu suất có thể với một cải tiến nhất định
bị giới hạn bởi số lượng mà tính năng được cải thiện được sử dụng. Nó là một phiên bản định lượng
của định luật lợi nhuận giảm dần.
52 Chương 1 Trừu tượng và công nghệ máy tính

hầu hết thời gian và ít hơn 100% thời gian. Thậm chí được cho 5 năm để tìm hiểu
cách chạy tốt điểm chuẩn của Specpower, máy tính được cấu hình đặc biệt có kết quả
tốt nhất vào năm 2020 vẫn sử dụng 33% công suất cực đại ở mức 10% tải. Các hệ
thống trong lĩnh vực không được cấu hình cho điểm chuẩn của Specpower chắc chắn
sẽ tệ hơn.
Do các máy chủ khối lượng công việc khác nhau nhưng sử dụng một phần lớn
công suất cực đại, Luiz Barroso và Urs Hölzle (2007) cho rằng chúng ta nên thiết kế
lại phần cứng để đạt được tính toán tỷ lệ năng lượng.Nếu các máy chủ trong tương
lai được sử dụng, giả sử, 10% công suất cực đại với khối lượng công việc 10%,
chúng tôi có thể giảm hóa đơn tiền điện của các trung tâm dữ liệu và trở thành công
dân tốt trong thời đại ngày càng lo ngại về CO2 khí thải.
Fallacy: Thiết kế cho hiệu suất và thiết kế cho hiệu quả năng lượng là những
mục tiêu không liên quan.
Vì năng lượng là năng lượng theo thời gian, nên thường thì việc tối ưu hóa phần
cứng hoặc phần mềm mất ít thời gian hơn để tiết kiệm năng lượng tổng thể ngay cả
khi tối ưu hóa mất thêm một chút năng lượng khi sử dụng. Một lý do là tất cả phần
còn lại của máy tính đang tiêu thụ năng lượng trong khi chương trình đang chạy, vì
vậy ngay cả khi phần được tối ưu hóa sử dụng thêm một chút năng lượng, thời gian
giảm có thể tiết kiệm năng lượng của toàn hệ thống.
Pitfall: Sử dụng một tập hợp con của phương trình hiệu suất làm số liệu hiệu
suất.
Chúng tôi đã cảnh báo về sự nguy hiểm của việc dự đoán hiệu suất dựa trên chỉ một trong
triệu hướng dẫn các tốc độ xung nhịp, số lượng hướng dẫn hoặc CPI. Một sai lầm phổ biến khác là chỉ sử
mỗi giây (MIPS) dụng hai trong ba yếu tố để so sánh hiệu suất. Mặc dù sử dụng hai trong ba yếu tố có thể
Một phép đo tốc độ thực hợp lệ trong bối cảnh hạn chế, khái niệm này cũng dễ bị lạm dụng. Thật vậy, gần như tất
hiện chương trình dựa cả các lựa chọn thay thế được đề xuất cho việc sử dụng thời gian vì số liệu hiệu suất cuối
trên số lượng hàng triệu cùng đã dẫn đến các tuyên bố sai lệch, kết quả bị bóp méo hoặc giải thích không chính
hướng dẫn. MIPS được
xác.
tính là số lệnh chia cho
sản phẩm của thời gian Một thay thế cho thời gian là MIPS (triệu hướng dẫn mỗi giây)Đối với một
thực hiện và 106. chương trình nhất định, MIPS chỉ đơn giản là.
Hướng dẫn
MIPS 5
Thời gian thực hiện 3106
Vì MIPS là tốc độ thực hiện lệnh, MIPS chỉ định hiệu suất ngược với thời gian
thực hiện; máy tính nhanh hơn có xếp hạng MIPS cao hơn. Tin tốt về MIPS là nó
dễ hiểu và máy tính nhanh hơn có nghĩa là MIPS lớn hơn, phù hợp với trực giác.
Có ba vấn đề với việc sử dụng MIPS như một biện pháp để so sánh máy tính.
Đầu tiên, MIPS chỉ định tốc độ thực hiện lệnh nhưng không tính đến khả năng
của các hướng dẫn. Chúng ta không thể so sánh các máy tính với các bộ hướng
dẫn khác nhau bằng MIPS, vì số lượng lệnh chắc chắn sẽ khác nhau. Thứ hai,
MIPS khác nhau giữa các chương trình trên cùng một máy tính; do đó, một máy
tính không thể có một xếp hạng MIPS duy nhất. Ví dụ: bằng cách thay thế thời
gian thực hiện, chúng ta thấy mối quan hệ giữa MIPS, tốc độ xung nhịp và CPI :

MIPS 5 Số lượng hướng 5 Tỷ lệ


dẫn đồng hồ
Số lượng hướng dẫn 3
CPI
Tỷ lệ đồng hồ 3106 CPI 3106
1.12 Nhận xét kết luận 53

CPI thay đổi theo hệ số 4 cho Số nguyên Specspeed 2017 trên máy tính Intel
Xeon Hình 1.18, vì vậy MIPS cũng vậy. Cuối cùng, và quan trọng nhất, nếu một
chương trình mới thực hiện nhiều hướng dẫn hơn nhưng mỗi hướng dẫn nhanh
hơn, MIPS có thể thay đổi độc lập với hiệu suất!

Hãy xem xét các phép đo hiệu suất sau đây cho một chương trình :

Đo lường Máy tính A Máy tính B Kiểm tra


Số lượng hướng Bản thân bạn
dẫn 10 tỷ 8 tỷ
Tỷ lệ đồng hồ 4 GHz 4 GHz
CPI 1.0 1.1

a. Máy tính nào có xếp hạng MIPS cao hơn?


b. Máy tính nào nhanh hơn?

1.12 Kết luận


Ở đâu ... ENIAC
được trang bị 18.000
Mặc dù rất khó để dự đoán chính xác mức độ của máy tính chi phí / hiệu suất sẽ
ống chân không và
có trong tương lai, nhưng nó đặt cược an toàn rằng chúng sẽ tốt hơn nhiều so với
nặng 30 tấn, máy
hiện nay. Để tham gia vào những tiến bộ này, các nhà thiết kế máy tính và lập
tính trong tương lai
trình viên phải hiểu nhiều vấn đề hơn.
có thể có 1.000 ống
Cả hai nhà thiết kế phần cứng và phần mềm xây dựng các hệ thống máy tính trong các
chân không và có lẽ
lớp phân cấp, với mỗi lớp thấp hơn ẩn các chi tiết từ cấp độ trên. Ý tưởng tuyệt vời này
chỉ nặng 1½ tấn.
của trừu tượng là nền tảng để hiểu các hệ thống máy tính ngày nay, nhưng nó không có
Cơ học phổ biến,
nghĩa là các nhà thiết kế có thể giới hạn bản thân để biết một sự trừu tượng duy nhất. Có
Tháng 3 năm 1949
lẽ ví dụ quan trọng nhất của sự trừu tượng là giao diện giữa phần cứng và phần mềm cấp
thấp, được gọi là hướng dẫn đặt kiến trúcViệc duy trì kiến trúc tập lệnh dưới dạng hằng số
cho phép nhiều triển khai kiến trúc đó có lẽ khác nhau về chi phí và hiệu suất. Mặt khác,
kiến trúc có thể ngăn cản việc giới thiệu các sáng kiến yêu cầu giao diện thay đổi.
Có một phương pháp đáng tin cậy để xác định và báo cáo hiệu suất bằng cách
sử dụng thời gian thực hiện của các chương trình thực làm số liệu. Thời gian thực
hiện này có liên quan đến các phép đo quan trọng khác mà chúng ta có thể thực
hiện theo phương trình sau :

Đồng hồ chu
Giây 5 Hướng dẫn 3 kỳ 3 Giây
Chương Chương Hướng Chu kỳ
trình trình dẫn đồng hồ
Chúng tôi sẽ sử dụng phương trình này và các yếu tố cấu thành của nó nhiều lần.
Tuy nhiên, hãy nhớ rằng các yếu tố riêng lẻ không xác định hiệu suất: chỉ sản
phẩm, bằng với thời gian thực hiện, là thước đo hiệu suất đáng tin cậy.
54 Chương 1 Trừu tượng và công nghệ máy tính

Các Thời gian thực hiện là thước đo hiệu suất duy nhất và không thể tin được.
Nhiều số liệu khác đã được đề xuất và tìm thấy mong muốn. Đôi khi các
LỚN số liệu này bị thiếu sót ngay từ đầu bằng cách không phản ánh thời gian
thực hiện; lần khác, một số liệu âm thanh trong bối cảnh hạn chế được
Hình ảnh mở rộng và sử dụng ngoài bối cảnh đó hoặc không cần làm rõ thêm để
làm cho nó hợp lệ.

Công nghệ phần cứng quan trọng cho bộ xử lý hiện đại là silicon. Trong khi
silicon thúc đẩy sự tiến bộ nhanh chóng của phần cứng, những ý tưởng mới trong
tổ chức máy tính đã cải thiện giá / hiệu suất. Hai trong số các ý tưởng chính đang
khai thác tính song song trong chương trình, thông thường ngày nay thông qua
nhiều bộ xử lý và khai thác địa phương truy cập vào a hệ thống phân cấp bộ
nhớ, thường thông qua bộ nhớ cache.
Hiệu quả năng lượng đã thay thế khu vực chết là nguồn tài nguyên quan trọng
nhất của thiết kế vi xử lý. Bảo tồn sức mạnh trong khi cố gắng tăng hiệu suất đã
buộc ngành công nghiệp phần cứng chuyển sang bộ vi xử lý đa lõi, do đó yêu cầu
ngành công nghiệp phần mềm chuyển sang lập trình phần cứng song song. Song
song bây giờ là cần thiết cho hiệu suất.
Thiết kế máy tính luôn được đo lường bằng chi phí và hiệu suất, cũng như các yếu tố
quan trọng khác như năng lượng, độ tin cậy, chi phí sở hữu và khả năng mở rộng. Mặc dù
chương này đã tập trung vào chi phí, hiệu suất và năng lượng, các thiết kế tốt nhất sẽ đạt
được sự cân bằng phù hợp cho một thị trường nhất định trong số tất cả các yếu tố.

Bản đồ đường cho cuốn sách này


Ở dưới cùng của những trừu tượng này là năm thành phần cổ điển của máy tính:
datapath, điều khiển, bộ nhớ, đầu vào và đầu ra (tham khảo Hình 1.5). Năm
thành phần này cũng đóng vai trò là khuôn khổ cho phần còn lại của các chương
trong cuốn sách này :
■ Datapath : Chương 3, Chương 4, Chương 6, và Phụ lục B
■ Điều khiển: Chương 4, Chương 6, và Phụ lục B
■ Ký ức: Chương 5
■ Đầu vào: Chương 5 và 6
■ Đầu ra: Chương 5 và 6
Như đã đề cập ở trên , Chương 4 mô tả cách các bộ xử lý khai thác song song ngầm ,
Chương 6 mô tả các bộ vi xử lý đa lõi song song rõ ràng đang ở trái tim của cuộc
cách mạng song song, và Phụ lục B mô tả chip xử lý đồ họa rất song song. Chương 5
mô tả cách một hệ thống phân cấp bộ nhớ khai thác địa phương. Chương 2 mô tả các
bộ hướng dẫn Giao diện giữa các trình biên dịch và máy tính và nhấn mạnh vai trò
của trình biên dịch và ngôn ngữ lập trình trong việc sử dụng các tính năng của tập
lệnh. Chương 3 mô tả cách máy tính xử lý dữ liệu số học. Phụ lục A giới thiệu thiết
kế logic.
1.13 Quan điểm lịch sử và đọc thêm 54.e1

Một lĩnh vực hoạt động


của khoa học giống
1.13 Quan điểm lịch sử và đọc thêm như một con kiến
khổng lồ; cá nhân gần
như biến mất trong
Đối với mỗi chương trong văn bản, một phần dành cho một quan điểm lịch sử có khối tâm trí đang va
thể được tìm thấy trực tuyến. Chúng tôi có thể theo dõi sự phát triển của một ý vào nhau, mang thông
tưởng thông qua một loạt các máy móc hoặc mô tả một số dự án quan trọng và tin từ nơi này sang nơi
chúng tôi cung cấp tài liệu tham khảo trong trường hợp bạn quan tâm đến việc khác, truyền nó xung
thăm dò thêm. quanh với tốc độ ánh
Viễn cảnh lịch sử cho chương này cung cấp một nền tảng cho một số ý tưởng sáng.
chính được trình bày trong đó. Mục đích của nó là cung cấp cho bạn câu chuyện Lewis Thomas, Tự
của con người đằng sau những tiến bộ công nghệ và đặt những thành tựu trong nhiên
bối cảnh lịch sử của họ. Bằng cách học quá khứ, bạn có thể hiểu rõ hơn về các Khoa học, trực tiếp Cuộc
lực sẽ định hình điện toán trong tương lai. Mỗi phần phối cảnh lịch sử kết thúc sống của
với các đề xuất để đọc thêm, cũng được thu thập riêng trong phần trực tuyến. một tế bào, 1974
Đọc thêm.Giáo dục

Máy tính điện tử đầu tiên


J. Presper Eckert và John Mauchly tại Trường Moore thuộc Đại học Pennsylvania đã
xây dựng những gì được chấp nhận rộng rãi để trở thành máy tính đa năng, điện tử
hoạt động đầu tiên trên thế giới. Máy này, được gọi là ENIAC (Điện tử Máy tích hợp
và máy tính số), được tài trợ bởi Quân đội Hoa Kỳ và bắt đầu làm việc trong Thế
chiến II nhưng không được tiết lộ công khai cho đến năm 1946. ENIAC là một cỗ
máy đa năng được sử dụng để tính toán các bàn bắn pháo. Hình e1.13.1 cho thấy máy
tính hình chữ U, dài 80 feet x 8,5 feet

HÌNH e1.13.1 ENIAC, máy tính điện tử đa năng đầu tiên trên thế giới.
54.e2 1.13 Quan điểm lịch sử và đọc thêm

cao và rộng vài feet. Mỗi trong số 20 thanh ghi 10 chữ số dài 2 feet. Tổng cộng,
ENIAC đã sử dụng 18.000 ống chân không.
Về kích thước, ENIAC là hai đơn đặt hàng lớn hơn các máy được chế tạo
ngày nay, tuy nhiên nó chậm hơn tám bậc, thực hiện 1900 lần bổ sung mỗi giây.
ENIAC cung cấp các bước nhảy có điều kiện và có thể lập trình được, phân biệt
rõ ràng với các máy tính trước đó. Lập trình được thực hiện thủ công bằng cách
cắm cáp và thiết lập công tắc và dữ liệu được nhập trên thẻ đục lỗ. Lập trình cho
các tính toán điển hình cần thiết từ nửa giờ đến cả ngày. ENIAC là một máy đa
năng, bị giới hạn chủ yếu bởi một lượng nhỏ lưu trữ và lập trình tẻ nhạt.
Năm 1944, John von Neumann bị thu hút vào dự án ENIAC. Nhóm muốn cải
thiện cách các chương trình được nhập và thảo luận về việc lưu trữ các chương
trình dưới dạng số; von Neumann đã giúp kết tinh các ý tưởng và viết một bản
ghi nhớ đề xuất một máy tính chương trình lưu trữ có tên EDVAC (Điện tử rời
rạc Máy tính tự động biến). Herman Goldstine đã phân phát bản ghi nhớ và đưa
vào von Neumann, tên trên đó, khiến Eckert và Mauchly mất tinh thần, tên của họ
đã bị bỏ qua. Bản ghi nhớ này đã làm cơ sở cho thuật ngữ thường được sử dụng
máy tính von Neumann Một số người tiên phong đầu tiên trong lĩnh vực máy tính
tin rằng thuật ngữ này mang lại quá nhiều tín dụng cho von Neumann, người đã
viết ra các ý tưởng, và quá ít cho các kỹ sư, Eckert và Mauchly, những người làm
việc trên máy móc. Vì lý do này, thuật ngữ này không xuất hiện ở nơi khác trong
cuốn sách này hoặc trong các phần trực tuyến.
Năm 1946, Maurice Wilkes của Đại học Cambridge đã đến thăm Trường
Moore để tham dự phần sau của một loạt các bài giảng về sự phát triển trong máy
tính điện tử. Khi trở về Cambridge, Wilkes quyết định bắt tay vào một dự án để
xây dựng một máy tính chương trình lưu trữ có tên EDSAC (Lưu trữ trễ điện tử
tự động Máy tính). EDSAC bắt đầu hoạt động vào năm 1949 và là quy mô đầy đủ
đầu tiên trên thế giới , hoạt động, máy tính chương trình lưu trữ [Wilkes, 1985].
(Một nguyên mẫu nhỏ gọi là Mark-I, được chế tạo tại Đại học Manchester năm
1948, có thể được gọi là máy chương trình lưu trữ hoạt động đầu tiên.) Mục 2.5
giải thích khái niệm chương trình lưu trữ.
Năm 1947, Eckert và Mauchly đã xin cấp bằng sáng chế cho máy tính điện tử.
Trưởng khoa của trường Moore yêu cầu bằng sáng chế được chuyển cho trường đại
học, điều này có thể đã giúp Eckert và Mauchly kết luận rằng họ nên rời đi. Sự ra đi
của họ làm tê liệt dự án EDVAC, trì hoãn hoàn thành cho đến năm 1952.
Goldstine rời đi để tham gia von Neumann tại Viện nghiên cứu cao cấp (IAS) tại
Princeton năm 1946. Cùng với Arthur Burks, họ đã đưa ra một báo cáo dựa trên bản
ghi nhớ được viết trước đó [Burks et al., 1946]. Bài báo là không thể tin được trong
thời kỳ này; đọc nó ngày hôm nay, bạn sẽ không bao giờ đoán được bài báo mang tính
bước ngoặt này đã được viết hơn 70 năm trước, bởi vì nó thảo luận về hầu hết các
khái niệm kiến trúc được thấy trong các máy tính hiện đại. (Chúng tôi trích dẫn từ văn
bản đó một cách tự do Chương 2.) Bài viết này đã dẫn đến máy IAS được chế tạo bởi
Julian Bigelow. Nó có tổng cộng 1024 từ 40 bit và nhanh hơn ENIAC khoảng 10 lần.
Nhóm nghĩ về việc sử dụng cho
1.13 Quan điểm lịch sử và đọc thêm 54.e3

máy, đã xuất bản một bộ báo cáo và khuyến khích khách truy cập. Những báo
cáo và khách truy cập đã truyền cảm hứng cho sự phát triển của một số máy tính
mới.
Gần đây, đã có một số tranh cãi về công việc của John Atanasoff, người đã chế
tạo một máy tính điện tử quy mô nhỏ vào đầu những năm 1940. Máy của ông,
được thiết kế tại Đại học bang Iowa, là một máy tính chuyên dùng không bao giờ
hoạt động hoàn toàn. Mauchly đã đến thăm Atanasoff một thời gian ngắn trước
khi ông xây dựng ENIAC. Sự hiện diện của máy Atanasoff, cùng với sự chậm trễ
trong việc nộp bằng sáng chế ENIAC (công việc đã được phân loại và bằng sáng
chế không thể được nộp cho đến sau chiến tranh) và phân phối giấy EDVAC von
Neumann, đã được sử dụng để phá vỡ bằng sáng chế Eckert-Mauchly. Mặc dù
tranh cãi vẫn còn hoành hành về vai trò của Atanasoff, Eckert và Mauchly thường
được tín nhiệm để xây dựng máy tính điện tử hoạt động, đa năng, đầu tiên [Stern,
1980].
Một máy tính tiên phong khác xứng đáng được tín dụng là một cỗ máy chuyên
dùng được chế tạo bởi Konrad Zuse ở Đức vào cuối những năm 1930 và đầu
những năm 1940. Mặc dù Zuse đã chuẩn bị thiết kế cho một máy tính có thể lập
trình sẵn sàng, chính phủ Đức đã quyết định không tài trợ cho các cuộc điều tra
khoa học mất hơn 2 năm vì các quan chức dự kiến cuộc chiến sẽ chiến thắng
trước thời hạn đó.
Trên khắp Kênh tiếng Anh, trong Thế chiến II, các máy tính điện tử chuyên
dùng đã được chế tạo để giải mã các tin nhắn bị chặn của Đức. Một nhóm nghiên
cứu tại Bletchley Park, bao gồm Alan Turing, đã xây dựng Colossus vào năm
1943. Các máy móc được giữ bí mật cho đến năm 1970; Sau chiến tranh, nhóm ít
có tác động đến máy tính thương mại của Anh.
Trong khi công việc trên ENIAC được tiến hành, Howard Aiken đang chế tạo một
máy tính cơ điện có tên Mark-I tại Harvard (tên mà Manchester sau này đã sử dụng cho
máy của mình). Anh ta đi theo Mark-I bằng một máy chuyển tiếp, Mark-II và một cặp
máy ống chân không, Mark-III và Mark-IV. Trái ngược với các máy trước đó như
EDSAC, sử dụng một bộ nhớ duy nhất cho các hướng dẫn và dữ liệu, Mark-III và Mark-
IV có các bộ nhớ riêng cho các hướng dẫn và dữ liệu. Các máy móc được coi là phản
động bởi những người ủng hộ máy tính chương trình lưu trữ; thuật ngữ Kiến trúc
Harvard được đặt ra để mô tả các máy móc với những ký ức riêng biệt. Trả tiền đối với
lịch sử, thuật ngữ này được sử dụng ngày nay theo một nghĩa khác để mô tả các máy có
một bộ nhớ chính duy nhất nhưng với các bộ nhớ riêng để được hướng dẫn và dữ liệu.
Dự án Whirlwind được bắt đầu tại MIT vào năm 1947 và nhằm vào các ứng
dụng trong xử lý tín hiệu radar thời gian thực. Mặc dù nó đã dẫn đến một số phát
minh, sự đổi mới quan trọng nhất của nó là bộ nhớ lõi từ tính. Whirlwind có
2048 từ 16 bit của lõi từ. Lõi từ tính đóng vai trò là công nghệ bộ nhớ chính
trong gần 30 năm.

Phát triển thương mại


Vào tháng 12 năm 1947, Eckert và Mauchly thành lập Tập đoàn máy tính Eckert-
Mauchly. Cỗ máy đầu tiên của họ, BINAC, được chế tạo cho Northrop và được
trình chiếu vào tháng 8 năm 1949. Sau một số khó khăn tài chính, công ty của họ
đã được Remington-Rand mua lại, nơi họ đã xây dựng UNIVAC I (Universal
Automatic
54.e4 1.13 Quan điểm lịch sử và đọc thêm

Máy tính), được thiết kế để bán dưới dạng máy tính đa năng (Hình e1.13.2). Được
giao lần đầu tiên vào tháng 6 năm 1951, UNIVAC I được bán với giá khoảng 1
triệu đô la và là hệ thống máy tính thương mại thành công đầu tiên được chế tạo!
Máy tính ban đầu này, cùng với nhiều mảnh truyền thuyết máy tính hấp dẫn khác,
có thể được nhìn thấy tại Bảo tàng Lịch sử Máy tính ở Mountain View, California.

HÌNH e1.13.2 UNIVAC I, máy tính thương mại đầu tiên ở Hoa Kỳ. Nó chính xác dự đoán kết quả
của cuộc bầu cử tổng thống năm 1952, nhưng dự báo ban đầu của nó đã bị giữ lại từ phát sóng vì các
chuyên gia nghi ngờ việc sử dụng kết quả sớm như vậy.

IBM đã tham gia vào hoạt động kinh doanh tự động hóa thẻ và văn phòng
nhưng không bắt đầu xây dựng máy tính cho đến năm 1950. Máy tính IBM đầu
tiên, IBM 701, được xuất xưởng vào năm 1952 và cuối cùng 19 chiếc đã được bán.
Vào đầu những năm 1950, nhiều người đã bi quan về tương lai của máy tính, tin
rằng thị trường và cơ hội cho những cỗ máy chuyên dụng cao này rất hạn chế.
Năm 1964, sau khi đầu tư 5 tỷ đô la, IBM đã có một bước đi táo bạo với thông
báo của Hệ thống / 360. Một phát ngôn viên của IBM đã nói như sau vào thời điểm
đó :
Chúng tôi không khiêm tốn trong thông báo này. Đây là thông báo sản phẩm quan
trọng nhất mà tập đoàn này từng đưa ra trong lịch sử của mình. Nó không phải là
một máy tính theo bất kỳ ý nghĩa trước đó. Nó không phải là một sản phẩm, mà là
một dòng sản phẩm ... kéo dài hiệu suất từ phần rất thấp của dòng máy tính đến rất
cao.
1.13 Quan điểm lịch sử và đọc thêm 54.e5

HÌNH e1.13.3 Máy tính IBM System / 360: các mô hình 40, 50, 65 và 75 đều được giới thiệu vào năm 1964. Bốn mô hình này thay
đổi về chi phí và hiệu suất theo hệ số gần 10; nó tăng lên 25 nếu chúng ta bao gồm các mô hình 20 và 30 (không hiển thị). Tốc độ xung nhịp, phạm vi
kích thước bộ nhớ và giá gần đúng chỉ cho bộ xử lý và bộ nhớ có kích thước trung bình: (a) model 40, 1.6 MHz, 32 KB, 256 KB, $ 225.000; (b)
model 50, 2.0 MHz, 128 KB, 256 KB, $ 5 mô hình. Thêm các thiết bị I / O thường tăng giá theo các yếu tố từ 1,8 đến 3,5, với các yếu tố cao hơn cho
các mẫu rẻ hơn.

Di chuyển ý tưởng của kiến trúc trừu tượng vào thực tế thương mại, IBM đã công
bố sáu triển khai kiến trúc System / 360 thay đổi về giá cả và hiệu suất theo hệ số 25.
Hình e1.13.3 cho thấy bốn trong số các mô hình này. IBM đặt cược công ty của mình
vào sự thành công của a gia đình máy tínhvà IBM đã thắng. System / 360 và những
người kế nhiệm của nó thống trị thị trường máy tính lớn. Con cháu của nó vẫn ở mức
10 tỷ đô la kinh doanh hàng năm cho IBM, biến Hệ thống IBM / 360 trở thành kiến
trúc tập lệnh lâu đời nhất còn tồn tại. Fred Brooks, Jr., đã giành giải thưởng ACM A.
M. Turing năm 1999 một phần để lãnh đạo Dự án Hệ thống / 360 của IBM.
Khoảng một năm sau, Tập đoàn Thiết bị Kỹ thuật số (DEC) đã công bố PDP-8,
thương mại đầu tiên máy tính mini, vào năm 1965. Chiếc máy nhỏ này là một
bước đột phá trong thiết kế chi phí thấp, cho phép DEC cung cấp một máy tính
với giá dưới 20.000 đô la. Máy tính mini là tiền thân của bộ vi xử lý, với Intel
phát minh ra bộ vi xử lý đầu tiên vào năm 1971, Intel Intel 4004.
54.e6 1.13 Quan điểm lịch sử và đọc thêm

Năm 1963 đã đưa ra thông báo đầu tiên siêu máy tínhThông báo này không đến từ các
công ty lớn cũng như từ các trung tâm công nghệ cao. Seymour Cray dẫn đầu thiết kế của
Control Data Corporation CDC 6600 ở Minnesota. Máy này bao gồm nhiều ý tưởng đang
bắt đầu được tìm thấy trong các bộ vi xử lý mới nhất. Cray sau đó rời CDC để thành lập
Cray Research, Inc., ở Wisconsin. Năm 1976, ông tuyên bố Cray-1 (.Hình e1.13.4). Máy
này đồng thời là máy nhanh nhất thế giới, đắt nhất và máy tính có chi phí / hiệu suất tốt
nhất cho các chương trình khoa học. Cray-1 sẽ nằm trong bất kỳ danh sách các máy tính
lớn nhất mọi thời đại, mặc dù tổng doanh số trọn đời là hơn 80 siêu máy tính.

HÌNH e1.13.4 Cray-1, siêu máy tính vector thương mại đầu tiên, được công bố vào năm
1976. Máy này có sự khác biệt bất thường là cả máy tính nhanh nhất cho các ứng dụng khoa học và máy
tính có giá / hiệu suất tốt nhất cho các ứng dụng đó. Nhìn từ trên xuống, máy tính trông giống như chữ cái
C Seymour Cray đã qua đời năm 1996 vì những vết thương kéo dài trong một tai nạn ô tô. Vào thời điểm
ông qua đời, nhà tiên phong máy tính 70 tuổi này đang nghiên cứu tầm nhìn của ông về thế hệ siêu máy
tính tiếp theo. (Xem www.cray.com để biết thêm chi tiết.)

Trong khi Seymour Cray đang tạo ra máy tính đắt nhất thế giới, các nhà thiết
kế khác trên thế giới đang xem xét sử dụng bộ vi xử lý để tạo ra một máy tính rẻ
đến mức bạn có thể có nó ở nhà. Không có đài phun nước duy nhất cho máy tính
cá nhân, nhưng vào năm 1977, Apple IIe (Hình e1.13.5) từ Steve Jobs và Steve
Wozniak đặt ra các tiêu chuẩn cho chi phí thấp, khối lượng lớn và độ tin cậy cao
xác định ngành công nghiệp máy tính cá nhân. Từ năm 1977 đến 1993, Apple đã
sản xuất khoảng sáu triệu máy tính này.
1.13 Quan điểm lịch sử và đọc thêm 54.e7

HÌNH e1.13.5 Apple IIc Plus. Được thiết kế bởi Steve Wozniak, Apple IIc đặt ra các tiêu chuẩn về chi
phí và độ tin cậy cho ngành công nghiệp.

Tuy nhiên, ngay cả khi bắt đầu 4 năm, máy tính cá nhân của Apple đã đứng thứ hai
về mức độ phổ biến. Máy tính cá nhân IBM, được công bố vào năm 1981, đã trở
thành máy tính bán chạy nhất dưới mọi hình thức; thành công của nó đã mang lại cho
Intel bộ vi xử lý phổ biến nhất và Microsoft hệ điều hành phổ biến nhất. Trong thập
kỷ tiếp theo, CD phổ biến nhất là hệ điều hành Microsoft, mặc dù nó có giá cao hơn
nhiều lần so với CD nhạc! Tất nhiên, trong hơn 30 năm mà máy tính cá nhân tương
thích IBM đã tồn tại, nó đã phát triển rất nhiều. Trên thực tế, các máy tính cá nhân
đầu tiên có bộ xử lý 16 bit và 64 kilobyte ký ứcvà một đĩa mềm chậm, mật độ thấp là
bộ lưu trữ không bay hơi duy nhất! Đĩa mềm ban đầu được IBM phát triển để tải các
chương trình chẩn đoán trong máy tính lớn, nhưng là một thiết bị I / O chính trong
máy tính cá nhân trong gần 20 năm trước khi CD và mạng ra đời khiến chúng trở nên
lỗi thời như một phương pháp trao đổi dữ liệu.
Đương nhiên, bộ vi xử lý Intel cũng đã phát triển kể từ PC đầu tiên, sử dụng
bộ xử lý 16 bit với giao diện ngoài 8 bit! Trong Chương 2 , chúng tôi viết về sự
phát triển của kiến trúc Intel.
Các máy tính cá nhân đầu tiên khá đơn giản, có ít hoặc không có khả năng đồ
họa, không có thiết bị trỏ và hệ điều hành nguyên thủy so với các máy tính ngày
nay. Máy tính đã truyền cảm hứng cho nhiều khái niệm kiến trúc và phần mềm
đặc trưng cho các máy tính để bàn hiện đại là Xerox Alto, được hiển thị trong
Hình e1.13.6Alto được tạo ra như một nguyên mẫu thử nghiệm của một máy tính
trong tương lai; đã có vài trăm Altos được chế tạo, bao gồm một ý nghĩa.
54,e8 1.13 Quan điểm lịch sử và đọc thêm

HÌNH e1.13.6 Xerox Alto là nguồn cảm hứng chính cho máy tính để bàn hiện đại. Nó bao
gồm một con chuột, sơ đồ ánh xạ bit, giao diện người dùng dựa trên Windows và mạng cục bộ kết nối.

số đã được tặng cho các trường đại học. Trong số các công nghệ được kết hợp tại
Alto có :
■ màn hình đồ họa được ánh xạ bit được tích hợp với máy tính (màn hình đồ
họa trước đó đóng vai trò là thiết bị đầu cuối, thường được kết nối với các
máy tính lớn hơn)

■ một con chuột, được phát minh ra trước đó, nhưng được bao gồm trên mỗi
Alto và được sử dụng rộng rãi trong giao diện người dùng
■ một mạng cục bộ (LAN), đã trở thành tiền thân của Ethernet
■ giao diện người dùng dựa trên Windows và có trình soạn thảo WYSIWYG
(những gì bạn thấy là những gì bạn nhận được) trình soạn thảo và các
chương trình vẽ tương tác
1.13 Quan điểm lịch sử và đọc thêm 54.e9

Ngoài ra, cả máy chủ tệp và máy chủ in đều được phát triển và giao tiếp qua
mạng cục bộ và các kết nối giữa mạng cục bộ và ARPAnet diện rộng đã tạo ra
các phiên bản đầu tiên của mạng kiểu Internet. Xerox Alto có ảnh hưởng đáng
kinh ngạc và ảnh hưởng rõ ràng đến thiết kế của nhiều loại máy tính và hệ thống
phần mềm, bao gồm Apple Macintosh, PC, MacOS và Windows tương thích với
IBM và Sun và các máy trạm ban đầu khác. Giống như Cray-1, Alto sẽ nằm trong
bất kỳ danh sách các máy tính lớn nhất mọi thời đại, mặc dù tổng sản lượng của
nó chỉ khoảng 2000. Chuck Thacker đã giành giải thưởng ACM A. M. Turing
năm 2009 chủ yếu để tạo ra Alto.

Đo lường hiệu suất


Ngay từ những ngày đầu tiên của điện toán, các nhà thiết kế đã chỉ định các mục tiêu
hiệu suất, EN ENAC sẽ nhanh hơn 1000 lần so với Harvard Mark-I và IBM Stretch
(7030) nhanh hơn 100 lần so với máy tính nhanh nhất hiện có. Tuy nhiên, điều rõ
ràng là cách đo hiệu suất này.
Thước đo hiệu suất ban đầu là thời gian cần thiết để thực hiện một thao tác
riêng lẻ, chẳng hạn như bổ sung. Vì hầu hết các hướng dẫn đều có cùng thời gian
thực hiện, thời gian của một hướng dẫn giống như các hướng dẫn khác. Khi thời
gian thực hiện các hướng dẫn trong máy tính trở nên đa dạng hơn, tuy nhiên, thời
gian cần thiết cho một thao tác không còn hữu ích để so sánh.
Để xem xét những khác biệt này, an hướng dẫn trộn được tính bằng cách đo
tần số tương đối của các hướng dẫn trong máy tính trên nhiều chương trình.
Nhân thời gian cho mỗi hướng dẫn với trọng lượng của nó trong hỗn hợp đã cho
người dùng thời gian thực hiện hướng dẫn trung bình(Nếu được đo theo chu kỳ
đồng hồ, hướng dẫn trung bình. thời gian thực hiện giống như CPI trung bình.)
Vì các bộ lệnh tương tự nhau, đây là một so sánh chính xác hơn so với thời gian
thêm. Từ thời gian thực hiện hướng dẫn trung bình, sau đó, nó chỉ là một bước
nhỏ để MIPS. MIPS có đức tính dễ hiểu; do đó, nó đã trở nên phổ biến.

Nhiệm vụ cho một chương trình trung bình


Khi các bộ xử lý trở nên tinh vi hơn và dựa vào hệ thống phân cấp bộ nhớ (chủ đề
của Chương 5) và đường ống (chủ đề của Chương 4), thời gian thực hiện duy nhất
cho mỗi lệnh không còn tồn tại; do đó, không thể tính thời gian thực hiện cũng như
MIPS từ hỗn hợp lệnh và hướng dẫn.
Mặc dù ngày nay có vẻ rõ ràng rằng điều đúng đắn cần làm là phát triển một
bộ ứng dụng thực sự có thể được sử dụng làm điểm chuẩn tiêu chuẩn, đây là một
nhiệm vụ khó khăn cho đến cuối những năm 1980. Biến thể trong hệ điều hành
và tiêu chuẩn ngôn ngữ khiến cho việc tạo ra các chương trình lớn có thể được
chuyển từ máy tính sang máy tính chỉ bằng cách biên dịch lại.
Thay vào đó, bước tiếp theo là điểm chuẩn bằng cách sử dụng các chương trình
tổng hợp. Chương trình tổng hợp Whetstone được tạo ra bằng cách đo các chương
trình khoa học được viết bằng Algol-60 (xem Curnow và Doesmann từ [1976] sự
miêu tả). Điều này
54.e10 1.13 Quan điểm lịch sử và đọc thêm

chương trình đã được chuyển đổi thành Fortran và được sử dụng rộng rãi để mô tả
hiệu suất chương trình khoa học. Hiệu suất của Whetstone thường được trích dẫn
trong Whetstones mỗi giây, số lần thực hiện của một lần lặp lại của điểm chuẩn
Whetstone! Dhstallone là một chuẩn mực tổng hợp khác vẫn được sử dụng trong một
số vòng tròn điện toán nhúng (xem Weicker từ [1984] mô tả và phương pháp luận).
Cũng trong khoảng thời gian Whetstone được phát triển, khái niệm về điểm chuẩn
hạt nhân trở nên nổi tiếng. Hạt nhân là những mảnh nhỏ, tốn nhiều thời gian từ các
chương trình thực được trích xuất và sau đó được sử dụng làm điểm chuẩn. Cách tiếp
cận này được phát triển chủ yếu để đánh giá các máy tính cao cấp, đặc biệt là siêu
máy tính. Livermore Loops và Linpack là những ví dụ nổi tiếng nhất. Vòng lặp
Livermore bao gồm một loạt 21 đoạn vòng nhỏ. Linpack bao gồm một phần của gói
con đại số tuyến tính. Kernels được sử dụng tốt nhất để cô lập hiệu suất của các tính
năng riêng lẻ của máy tính và để giải thích lý do cho sự khác biệt trong hiệu suất của
các chương trình thực. Bởi vì các ứng dụng khoa học thường sử dụng các đoạn mã
nhỏ thực thi trong một thời gian dài, đặc trưng cho hiệu suất với hạt nhân là phổ biến
nhất trong lớp ứng dụng này. Mặc dù hạt nhân giúp chiếu sáng hiệu suất, chúng
thường xuyên thể hiện hiệu suất trên các ứng dụng thực.

ĐẶC BIỆT về hiệu suất


Một tiến bộ quan trọng trong đánh giá hiệu suất là sự hình thành của nhóm Hợp
tác xã đánh giá hiệu suất hệ thống (SPEC) năm 1988. Đặc biệt bao gồm đại diện
của nhiều công ty máy tính, những người sáng lập là Apollo / Hewlett-Packard,
DEC, MIPS và Sun, những người đã đồng ý về một loạt các chương trình và đầu
vào thực sự mà tất cả sẽ chạy. Điều đáng chú ý là Spec không thể ra đời trước
các hệ điều hành di động và sự phổ biến của các ngôn ngữ cấp cao. Bây giờ các
trình biên dịch cũng được chấp nhận như là một phần thích hợp trong hiệu suất
của các hệ thống máy tính và phải được đo lường trong mọi đánh giá.
Lịch sử dạy chúng ta rằng mặc dù nỗ lực của Spec có thể hữu ích với các máy tính
hiện tại, nhưng nó sẽ không đáp ứng nhu cầu của thế hệ tiếp theo mà không thay đổi.
Năm 1991, một biện pháp thông lượng đã được thêm vào, dựa trên việc chạy nhiều phiên
bản của điểm chuẩn. Nó hữu ích nhất để đánh giá việc sử dụng timeshared của bộ giải mã
hoặc bộ đa xử lý. Các điểm chuẩn hệ thống khác bao gồm các hoạt động chuyên sâu về hệ
điều hành và I / O-mạnh cũng đã được thêm vào. Một thay đổi khác là quyết định bỏ một
số điểm chuẩn và thêm các điểm khác. Một kết quả của sự khó khăn trong việc tìm kiếm
điểm chuẩn là phiên bản ban đầu của điểm chuẩn SPEC (được gọi là Spec89) có sáu điểm
chuẩn dấu phẩy động nhưng chỉ có bốn điểm chuẩn số nguyên. Tính toán một phép đo
tóm tắt duy nhất bằng cách sử dụng giá trị trung bình hình học của thời gian thực hiện
được chuẩn hóa thành VAX-11/780 có nghĩa là biện pháp này ưa thích các máy tính có
hiệu suất dấu phẩy động mạnh.
1.13 Quan điểm lịch sử và đọc thêm 54.e11

Năm 1992, một bộ điểm chuẩn mới (được gọi là Spec92) đã được giới thiệu.
Nó kết hợp các điểm chuẩn bổ sung, giảm ma trận300 và cung cấp các phương
tiện riêng biệt (SPEC INT và SpecFP) cho các chương trình số nguyên và dấu
phẩy động. Ngoài ra, biện pháp SPECbase, không cho phép các cờ tối ưu hóa
dành riêng cho chương trình, đã được thêm vào để cung cấp cho người dùng một
phép đo hiệu suất phù hợp hơn với những gì họ có thể trải nghiệm trên các
chương trình của riêng họ. Các số ĐẶC BIỆT cho thấy mức tăng lớn nhất so với
phép đo SPECFP cơ bản, thường dao động từ 15% đến 30% cao hơn.
Năm 1995, bộ điểm chuẩn một lần nữa được cập nhật, thêm một số điểm chuẩn số
nguyên và dấu phẩy động mới, cũng như loại bỏ một số điểm chuẩn bị sai sót hoặc có
thời gian chạy quá nhỏ do hệ số cải thiện hiệu suất từ 20 trở lên kể từ khi phát hành
SPEC đầu tiên. SPEC95 cũng đã thay đổi máy tính cơ sở để chuẩn hóa thành Trạm
Sun SPARC 10/40, do các phiên bản vận hành của máy tính cơ sở ban đầu đang trở
nên khó tìm!
Phiên bản mới nhất của SPEC là Spec2017. CPU ĐẶC BIỆT cần 82 chương trình
trong sáu thế hệ của nó, với 47 (57%) chỉ sử dụng một thế hệ và chỉ 6 (7%) kéo dài
ba hoặc nhiều hơn. Người sống sót duy nhất từ Spec89 là trình biên dịch gcc.
Đặc biệt cũng đã bổ sung các bộ điểm chuẩn ngoài các bộ ban đầu nhắm vào
hiệu suất CPU. Năm 2008, SPEC đã cung cấp các bộ điểm chuẩn cho đồ họa,
điện toán khoa học hiệu năng cao, điện toán hướng đối tượng, hệ thống tệp, máy
chủ và máy khách Web, Java, ứng dụng CAD kỹ thuật và sức mạnh.

Sự tăng trưởng của máy tính nhúng


Bộ xử lý nhúng đã có từ rất lâu; trên thực tế, các máy tính mini đầu tiên và bộ vi
xử lý đầu tiên ban đầu được phát triển để kiểm soát các chức năng trong phòng
thí nghiệm hoặc ứng dụng công nghiệp. Trong nhiều năm, việc sử dụng chủ yếu
các bộ xử lý nhúng là cho các ứng dụng điều khiển công nghiệp và mặc dù việc
sử dụng này vẫn tiếp tục phát triển, bộ xử lý có xu hướng rất rẻ và hiệu suất
tương đối thấp. Ví dụ, bộ xử lý bán chạy nhất trên thế giới vẫn là bộ điều khiển vi
mô 8 bit được sử dụng trong ô tô, một số thiết bị gia dụng và các ứng dụng đơn
giản khác.
Cuối những năm 1980 và đầu những năm 1990 đã chứng kiến sự xuất hiện của
những cơ hội mới cho bộ xử lý nhúng, từ các trò chơi video tiên tiến hơn và các hộp
giải mã cho đến điện thoại di động và trợ lý kỹ thuật số cá nhân. Số lượng thiết bị
thông tin ngày càng tăng nhanh và sự phát triển của mạng đã thúc đẩy sự gia tăng
mạnh mẽ về số lượng bộ xử lý nhúng, cũng như các yêu cầu về hiệu suất. Để đánh
giá hiệu suất, cộng đồng nhúng đã được truyền cảm hứng bởi Spec để tạo ra Nhúng
vi xử lý Điểm chuẩn Hiệp hội (EEMBC). Bắt đầu vào năm 1997, nó bao gồm một bộ
hạt nhân được tổ chức thành các bộ giải quyết các phần khác nhau của ngành công
nghiệp nhúng. Họ đã công bố thế hệ thứ hai của những điểm chuẩn này trong năm
2007. Năm 2019, một tập đoàn gồm các học giả và các học viên đã phát triển một bộ
chương trình miễn phí có tên Embench với mục tiêu rõ ràng là thay thế việc sử dụng
rộng rãi các chương trình tổng hợp như Dhrystone và CoreMarks làm điểm chuẩn
cho điện toán nhúng.
54.e12 1.13 Quan điểm lịch sử và đọc thêm

Một nửa thế kỷ tiến bộ


Kể từ năm 1951, đã có hàng ngàn máy tính mới sử dụng một loạt các công nghệ
và có khả năng khác nhau. Hình e1.13.7 tóm tắt các đặc điểm chính của một số
máy được đề cập trong phần này và cho thấy những thay đổi mạnh mẽ đã xảy ra
chỉ trong hơn 50 nămSau khi điều chỉnh theo lạm phát, giá / hiệu suất đã được
cải thiện gần 100 tỷ trong 55 năm, tương đương khoảng 58% mỗi năm. Một cách
khác để nói rằng đó là chúng tôi đã thấy một yếu tố cải thiện 10.000 chi phí và hệ
số cải thiện 10.000.000 hiệu suất.

Đã điều chỉnh
Giá / Đã điều chỉnh giá /
Kích Quyền
thước lực Hiệu suất Ký ức hiệu suất giá cả hiệu suất
Năm Tên (cu. ft.) (watts) (thêm / giây) (KB) Giá cả so với. UNIVAC (2007 $) so với. UNIVAC

1951 UNIVAC I 1000 125.000 2000 48 $ 1.000.000 0,000,001 $ 7.670.724 00.000,001


1964 IBM S / 360 60 10.000 500.000 64 $ 1.000.000 0,000 ,263 $ 6,018,798 00.000 ,319
mô hình 50
Năm 0,016.000 đô
1965 PDP-8 số 8 500 330.000 4 la 0,010.855 0,0$ 94,685 00,013.367
4.000.000 đô
1976 Cray-1 58 60.000 166.000.000 32.000 la 0,021.842 $ 13,509,798 00,047.127
1981 PC IBM 1 000 ,150 240.000 256 0,00 $ 3000 0,042.105 0,00 $ 6859 00 ,134.208
1991 HP 9000 / 2 000 ,500 50.000.000 16.384 0,00 $ 7400 3.556.188 0,00$ 11,807 16.241.889
mô hình 750
1996 Intel PPro 2 000 ,500 400.000.000 16.384 0,00 $ 4400 47.846.890 $ 6211 247.021.234
PC (200 MHz)
2003 Intel Pentium 4 2 500 6.000.000.000 262.144 $ 1600 1.875.000.000 $ 2009 11.451.750.000
PC (3.0 GHz)
2007 AMD Barcelona 2 250 20.000.000.000 2.097.152 $ 800 12.500.000.000 $ 800 95.884.051.042
PC (2,5 GHz)

HÌNH e1.13.7 Đặc điểm của các máy tính thương mại quan trọng kể từ năm 1950, bằng đô la thực tế và năm 2007 đô la
được điều chỉnh theo lạm phát. Hàng cuối cùng giả định rằng chúng ta có thể sử dụng đầy đủ hiệu suất tiềm năng của bốn lõi ở
Barcelona. Trái ngược với Hình e1.13.3, ở đây giá của IBM S / 360 model 50 bao gồm các thiết bị I / O. (Nguồn: Bảo tàng Lịch sử Máy
tính và Chỉ số Giá sản xuất đối với hàng hóa công nghiệp.)

Độc giả quan tâm đến lịch sử máy tính nên tham khảo ý kiến Biên niên sử của
lịch sử Máy tính, một tạp chí dành cho lịch sử điện toán. Một số cuốn sách mô tả
những ngày đầu của điện toán cũng đã xuất hiện, nhiều người viết bởi những
người tiên phong bao gồm Goldstine [1972], Đô thị et al. [1980], và Wilkes
[1985].
1.13 Quan điểm lịch sử và đọc thêm 54.e13

Đọc thêm
Barroso, L. và U. Hölzle [2007]. Trường hợp cho điện toán tỷ lệ năng lượng, , Máy tính IEEE Tháng 12.
Một lời biện hộ để thay đổi bản chất của các thành phần máy tính để chúng sử dụng ít năng lượng hơn khi sử dụng nhẹ.
Chuông, C. G. [1996]. Tiên phong máy tính và máy tính tiên phong, ACM và Bảo tàng Máy tính, băng video.
Hai băng video về lịch sử điện toán, được sản xuất bởi Gordon và Gwen Bell, bao gồm các máy sau và
nhà phát minh của họ: Harvard Mark-I, ENIAC, EDSAC, máy IAS và nhiều máy khác.
Burks, A. W., H. H. Goldstine và J. von Neumann [1946]. Thảo luận sơ bộ về thiết kế logic của một công
cụ điện toán điện tử, Báo cáo của Bộ phận Quân đội Hoa Kỳ, tr. 1; cũng xuất hiện trong Giấy tờ của John
von Neumann, W. Aspray và A. Burks (Eds.), Nhà xuất bản MIT, Nhà xuất bản Cambridge, MA và
Tomash, Los Angeles, 1987, 97 Tiết146.
Một bài báo kinh điển giải thích phần cứng và phần mềm máy tính trước khi máy tính chương trình lưu trữ
đầu tiên được chế tạo. Chúng tôi trích dẫn rộng rãi từ nó trong Chương 3. Nó đồng thời giải thích các
máy tính với thế giới và là một nguồn gây tranh cãi vì bản dự thảo đầu tiên không cung cấp tín dụng cho
Eckert và Mauchly.
Campbell-Kelly, M. và W. Aspray [1996]. Máy tính: Lịch sử của máy thông tin, Sách cơ bản, New York.
Hai nhà sử học ghi lại câu chuyện kịch tính. Thời báo New York gọi nó là văn bản và có thẩm quyền.
Ceruzzi, P. F. [1998]. Lịch sử điện toán hiện đại, Báo chí MIT, Cambridge, MA .
Chứa một mô tả hay về lịch sử điện toán sau này: mạch tích hợp và tác động của nó, máy tính cá nhân,
UNIX và Internet.
Curnow, H. J. và B. A. Doesmann [1976]. Một tiêu chuẩn tổng hợp Máy tính J . 19 (1): 80.
Mô tả điểm chuẩn tổng hợp chính đầu tiên, Whetstone và cách nó được tạo ra.

Flemming, P. J. và J. J. Wallace [1986]. Cách làm thế nào để không nói dối với số liệu thống kê: Cách
chính xác để tóm tắt kết quả điểm chuẩn Thông tin. ACM 29: 3 (Tháng 3), 218 Từ21.
Mô tả một số nguyên tắc cơ bản trong việc sử dụng các phương tiện khác nhau để tóm tắt kết quả hiệu suất.

Goldstine, H. H. [1972]. Máy tính: Từ Pascal đến von Neumann, Nhà xuất bản Đại học Princeton,
Princeton, NJ .
Một quan điểm cá nhân về điện toán của một trong những người tiên phong đã làm việc với von Neumann.

Hayes, B. [2007]. Máy tính trong một vũ trụ song song , Nhà khoa học người Mỹ Tập. 95 (Tháng 11,
tháng 12): 476 Từ480.
Tổng quan về thử thách điện toán song song được viết cho giáo dân.

Hennessy, J. L. và D. A. Patterson [2019]. Chương 1 của Kiến trúc máy tính: Cách tiếp cận định lượng,
phiên bản thứ sáu, Morgan Kaufmann, Cambridge, MA .
Mục 1.5 đi sâu vào chi tiết hơn về sức mạnh, Phần 1.6 chứa nhiều chi tiết hơn về chi phí của các mạch
tích hợp và giải thích lý do cho sự khác biệt giữa giá và chi phí và Phần 1.8 cung cấp thêm chi tiết về đánh
giá hiệu suất.
Lampson, B. W. [1986]. Điện toán phân tán cá nhân; Phần mềm Alto và Ethernet.Hội thảo ACM về Lịch
sử máy trạm cá nhân (tháng 1).
54.e14 1.13 Quan điểm lịch sử và đọc thêm

Thacker, C. R. [1986]. Điện toán phân tán cá nhân: Phần cứng Alto và Ethernet, Hội nghị ACM về Lịch sử
máy trạm cá nhân (tháng 1).
Hai bài báo này mô tả phần mềm và phần cứng của cột mốc Alto.
Đô thị, N., J. Howlett và G.-C. Rota (Eds.) [1980]. Lịch sử điện toán trong thế kỷ XX, Nhà xuất bản Học
thuật, New York.
Một tập hợp các bài tiểu luận mô tả con người, phần mềm, máy tính và phòng thí nghiệm liên quan đến
các máy tính thử nghiệm và thương mại đầu tiên. Hầu hết các tác giả đã tham gia vào các dự án. Một thư
mục tuyệt vời của các báo cáo sớm kết thúc cuốn sách thú vị này.
Hệ thống phát thanh công cộng [1992]. Cỗ máy đã thay đổi thế giới, băng video.
Năm chương trình kéo dài 1 giờ này bao gồm các cảnh quay hiếm hoi và các cuộc phỏng vấn với những
người tiên phong của ngành công nghiệp máy tính.

Slater, R. [1987]. Chân dung ở Silicon, Báo chí MIT, Cambridge, MA .


Tiểu sử ngắn của 31 nhà tiên phong máy tính.

Stern, N. [1980]. Ai đã phát minh ra máy tính kỹ thuật số điện tử đầu tiên?Giáo dục Biên niên sử của lịch
sử điện toán 2: 4 (Tháng Mười), 375 Từ76.
Một quan điểm của nhà sử học về Atanasoff so với Eckert và Mauchly.

Weicker, R. P. [1984]. Đá Dhstall: một hệ thống tổng hợp lập trình chuẩn , Truyền thông của ACM 27 (10):
1013 Từ1030.
Mô tả một chương trình điểm chuẩn tổng hợp cho mã hệ thống.
Wilkes, M. V. [1985]. Hồi ức của một tiên phong máy tính, Báo chí MIT, Cambridge, MA .
Một quan điểm cá nhân về điện toán của một trong những người tiên phong.
1.14 Tự học 55

1.13 Quan điểm lịch sử và hơn thế nữa


Đọc hiểu

Đối với mỗi chương trong văn bản, một phần dành cho quan điểm lịch sử có thể Một lĩnh vực hoạt động
được tìm thấy trực tuyến trên một trang web đi kèm với cuốn sách này. Chúng tôi của khoa học giống
có thể theo dõi sự phát triển của một ý tưởng thông qua một loạt các máy tính như một con kiến
hoặc mô tả một số dự án quan trọng và chúng tôi cung cấp tài liệu tham khảo khổng lồ; cá nhân gần
trong trường hợp bạn quan tâm đến việc thăm dò thêm. như biến mất trong
Viễn cảnh lịch sử cho chương này cung cấp một nền tảng cho một số ý tưởng khối tâm trí đang va
chính được trình bày trong chương mở đầu này. Mục đích của nó là cung cấp cho bạn vào nhau, mang thông
câu chuyện của con người đằng sau những tiến bộ công nghệ và đặt những thành tựu tin từ nơi này sang nơi
trong bối cảnh lịch sử của họ. Bằng cách nghiên cứu về quá khứ, bạn có thể hiểu rõ khác, truyền nó xung
hơn về các lực sẽ định hình điện toán trong tương lai. Mỗi phần Phối cảnh lịch sử quanh với tốc độ ánh
trực tuyến kết thúc với các đề xuất để đọc thêm, cũng được thu thập trực tuyến riêng sáng.
dưới phầnĐọc thêmPhần còn lại của. Mục 1.13 được tìm thấy trực tuyến. Lewis Thomas, Tự
nhiên
Khoa học, trực tiếp Cuộc
sống của
một tế bào, 1974
1.14 Tự học

Bắt đầu với phiên bản thứ sáu, chúng tôi đang thêm một phần trong mỗi chương
với một số bài tập kích thích tư duy hy vọng cùng với các giải pháp của họ để
giúp người đọc kiểm tra xem họ có đang theo dõi tài liệu này không.
Lập bản đồ ý tưởng tuyệt vời trong kiến trúc với thế giới thực. Tìm trận
đấu hay nhất trong số bảy ý tưởng tuyệt vời từ kiến trúc máy tính đến những ví
dụ trong thế giới thực này :
a. Giảm thời gian giặt bằng cách giặt tải tiếp theo trong khi sấy tải cuối cùng
b. Giấu chìa khóa dự phòng trong trường hợp bạn mất chìa khóa cửa trước
c. Kiểm tra dự báo thời tiết cho các thành phố bạn sẽ lái xe qua khi quyết
định tuyến đường nào sẽ đi trong một chuyến đi mùa đông dài
d. Làn đường thanh toán nhanh trong các cửa hàng tạp hóa cho 10 mặt hàng
hoặc ít hơn
e. Chi nhánh địa phương của một hệ thống thư viện thành phố lớn.
f. ô tô chạy bằng động cơ điện trên cả bốn bánh xe
g. chế độ ô tô tự lái tùy chọn yêu cầu mua tùy chọn tự đỗ và điều hướng
Làm thế nào để bạn đo lường nhanh nhất? Hãy xem xét ba bộ xử lý khác
nhau P1, P2 , và P3 thực hiện cùng một bộ hướng dẫn. P1 có thời gian chu kỳ
đồng hồ là 0,33 ns và CPI là 1,5; P2 có thời gian chu kỳ đồng hồ là 0,40 ns và
CPI là 1,0; P3 có thời gian chu kỳ đồng hồ là 0,25 ns và CPI là 2,2.
a. Mà có tốc độ đồng hồ cao nhất? Nó là gì?
56 Chương 1 Trừu tượng và công nghệ máy tính

b. Đó là máy tính nhanh nhất? Nếu câu trả lời khác với ở trên, hãy giải thích
tại sao. Đó là chậm nhất?
c. Làm thế nào để câu trả lời cho a và b phản ánh tầm quan trọng của điểm
chuẩn?
Amdahl từ luật pháp và tình anh em. Luật Amdahl về cơ bản là luật giảm
dần lợi nhuận, áp dụng cho đầu tư cũng như kiến trúc máy tính. Anh trai của bạn
đã tham gia một công ty khởi nghiệp và đang cố gắng thuyết phục bạn đầu tư
một số tiền tiết kiệm của mình, vì anh ta tuyên bố, đó là một điều chắc chắn!Giáo
dục
a. Bạn quyết định đầu tư 10% tiền tiết kiệm của bạn. Lợi tức đầu tư của bạn
(tức là nhiều khoản đầu tư của bạn) trong khởi nghiệp là gấp đôi tổng tài
sản của bạn, giả sử khởi nghiệp là khoản đầu tư duy nhất của bạn?
b. Giả sử khoản đầu tư khởi nghiệp mang lại lợi nhuận mà bạn đã tính trong a
và giả sử rằng tài sản của bạn giống như trước khi tính toán, bạn cần bao
nhiêu tiền tiết kiệm để nhận được lợi nhuận (tức là., đầu tư nhiều lần) vào
tổng tài sản của bạn bằng 90% mức tăng khởi nghiệp? Làm thế nào
khoảng 95%?
c. Làm thế nào để các kết quả liên quan đến quan sát Amdahl về máy tính?
Nó nói gì về tình anh em?

Giá của bộ nhớ DRAM theo thời gian


10.00.00.000
đô la

$ 1,00,00,000
cả ($ / Gigabyte)

10.00.000 đô la

$ 1.00.000
Giá

10.000 đô la
DRAM Ký ức

$ 1.000

$ 100

$ 10

$1
1975 1980 1985 1990 1995 2000 2005 2010 2015 2020
HÌNH 1.21 Giá bộ nhớ trên mỗi gigabyte từ năm 1975 đến 2020. (Nguồn: https://jcmit.net/
memeprice.htm)
1.14 Tự học 57

Giá DRAM so với chi phí. Hình 1.21 vẽ giá chip DRAM từ năm 1975 đến
năm 2020, trong khi Hình 1.11 cho thấy công suất trên mỗi chip DRAM trong
cùng thời gian. Nó cho thấy công suất tăng gấp triệu lần (16 Kbit đến 16 Gbit) và
giảm giá gấp 25 triệu lần mỗi gigabyte (100 triệu đô la đến 4 đô la). Lưu ý rằng
giá mỗi GiB dao động theo thời gian, trong khi công suất trên mỗi chip có đường
cong tăng trưởng trơn tru.
a. Bạn có thể thấy bằng chứng về sự chậm lại của luật Moore Moore trong Hình 1.21?
b. Tại sao giá có thể cải thiện gấp 25 lần so với việc cải thiện công suất trên
mỗi chip? Những lý do bên cạnh việc tăng công suất chip?
c. Tại sao bạn nghĩ rằng giá mỗi gigabyte dao động trong khoảng thời gian 3
đến 5 năm? Có liên quan đến các công thức chi phí chip ở trang 28 hoặc
các lực lượng khác trên thị trường?

Câu trả lời cho tự học

Lập bản đồ những ý tưởng tuyệt vời trong kiến trúc đến thế giới thực
a. Hiệu suất thông qua Pipeling
b. Độ tin cậy thông qua Redundancy (mặc dù bạn có thể lập luận rằng đó
cũng là việc sử dụng Hiệu suất thông qua Song song)
c. Hiệu suất thông qua Dự đoán
d. Làm cho trường hợp chung nhanh chóng
e. Phân cấp ký ức
f. Hiệu suất thông qua Parallelism (mặc dù bạn có thể lập luận rằng đó cũng
là việc sử dụng Độ tin cậy thông qua Dự phòng)
g. Sử dụng Trừu tượng hóa để Đơn giản hóa Thiết kế

Máy tính nhanh nhất


a. Tốc độ đồng hồ là nghịch đảo của thời gian chu kỳ đồng hồ. P1 = 1 /
(0,33x10-9 giây) = 3 GHz; P2 = 1 / (0,40x10-9 giây) = 2,5 GHz; P3 = 1 /
(0,25x10-9 giây) = 4 GHz. P3 có tốc độ đồng hồ cao nhất.
b. Vì tất cả đều có cùng một kiến trúc tập lệnh, tất cả các chương trình đều có
cùng số lượng lệnh, vì vậy chúng tôi có thể đo hiệu suất là sản phẩm của
chu kỳ đồng hồ trung bình trên mỗi hướng dẫn (CPI) lần thời gian chu kỳ
đồng hồ, cũng là thời gian trung bình của một hướng dẫn :
■ P1 = 1,5 x 0,33 ns = 0,495 ns (bạn cũng có thể tính thời gian hướng
dẫn trung bình bằng CPI / tốc độ đồng hồ hoặc 1,5 / 3.0GHz = 0,495 ns)
58 Chương 1 Trừu tượng và công nghệ máy tính

■ P2 = 1,0 x 0,40 ns = 0,400 ns (hoặc 1,0 / 2,5GHz = 0,400 ns)


■ P3 = 2,2 x 0,25 ns = 0,550 ns (hoặc 1,0 / 4,0GHz = 0,550 ns)
P2 là nhanh nhất và P3 là chậm nhất. Mặc dù có tốc độ đồng hồ cao
nhất ,
trung bình P3 mất rất nhiều chu kỳ đồng hồ đến mức mất đi lợi ích của tốc
độ đồng hồ cao hơn.
c. Tính toán CPI dựa trên việc chạy một số điểm chuẩn. Nếu họ là đại diện
của khối lượng công việc thực tế, câu trả lời cho những câu hỏi này là
chính xác. Nếu điểm chuẩn là không thực tế, họ có thể không. Sự khác biệt
giữa những thứ dễ quảng cáo, như tốc độ đồng hồ và hiệu suất thực tế làm
nổi bật tầm quan trọng của việc phát triển điểm chuẩn tốt.

Brotherhood và Amdahl từ Luật


a. Lợi tức đầu tư 11 lần để tăng gấp đôi số tiền tiết kiệm của bạn: 90%∗1 +
10%∗11 = 2.0.
b. Bạn phải đầu tư 89% tài sản của mình để nhận 90% lợi nhuận đầy đủ: 90%
của 11x = 9,9x và 11%∗1 + 89%∗11 = 9,9. Bạn phải đầu tư 94,5% của cải
để nhận 95% lợi nhuận: 95% của 11x = 10,45x và 5,5%∗1 + 94,5%∗11 =
10,45.
c. Giống như phần bạn không đầu tư giới hạn lợi tức đầu tư ngay cả khi lợi
nhuận cao của một công ty khởi nghiệp thành công, phần máy tính mà bạn
không tăng tốc sẽ hạn chế lợi ích của việc tăng tốc cho dù bạn thực hiện
phần cải tiến đó nhanh hơn bao nhiêu. Số tiền bạn đầu tư sẽ bị ảnh hưởng
bởi niềm tin của bạn vào phán đoán của anh trai bạn, đặc biệt là khi 90%
các công ty khởi nghiệp không thành công!

Giá so với chi phí bộ nhớ


a. Mặc dù giá cả dao động, có vẻ như giá cả đang phẳng hơn bắt đầu vào
năm 2013, điều này phù hợp với sự chậm lại của luật Moore Moore. Ví dụ:
DRAM là $ 4 / GB trong năm 2013 và 2016 cũng như năm 2019. Không
có khoảng thời gian dài khác như bằng phẳng trong quá khứ.
b. Không có con số nào đề cập đến khối lượng chip DRAM, điều này có thể giải
thích tại sao giá cải thiện hơn công suất trên mỗi chip. Thông thường có các
đường cong học tập sản xuất trong đó mỗi yếu tố tăng mười lần có thể dẫn đến
việc giảm hai yếu tố chi phí. Cũng có những đổi mới trong bao bì chip có thể
làm giảm chi phí và do đó giá cả trong một thời gian dài.
c. DRAM là các bộ phận hàng hóa, vì có nhiều công ty sản xuất các sản phẩm
tương tự, và do đó chúng phải chịu áp lực thị trường và giá cả biến động. Giá
tăng khi nhu cầu vượt quá cung và ngược lại. Ngành công nghiệp có một lịch
sử của các giai đoạn mà DRAM rất có lợi nhuận, vì vậy họ xây dựng nhiều
dây chuyền sản xuất hơn cho đến khi có tình trạng dư cung và giá giảm, và sau
đó họ cắt giảm các dây chuyền sản xuất mới.
1.15 Bài tập 59

1.15 Bài tập

Xếp hạng thời gian tương đối của các bài tập được hiển thị trong ngoặc vuông
sau mỗi số bài tập. Trung bình, một bài tập được xếp hạng [10] sẽ đưa bạn dài
gấp đôi so với một bài tập được xếp hạng [5]. Các phần của văn bản nên được
đọc trước khi thử một bài tập sẽ được đưa ra trong ngoặc nhọn; ví dụ: <§1.4> có
nghĩa là bạn nên đọc Mục 1.4, Dưới vỏ bọc, để giúp bạn giải quyết bài tập này.

1.1 [2] <§1.1> Liệt kê và mô tả ba loại máy tính.

1.2 [5] <§1.2> Bảy ý tưởng tuyệt vời trong kiến trúc máy tính tương tự như ý
tưởng từ các lĩnh vực khác. Kết hợp bảy ý tưởng từ kiến trúc máy tính, Sử dụng
tính trừu tượng để đơn giản hóa thiết kế, một cách nhanh chóng Làm cho trường
hợp chung nhanh chóng, hiệu suất của trò chơi thông qua song song, hiệu suất
của trò chơi qua đường ống, hiệu suất của trò chơi thông qua dự đoán về sự tin
cậy của các lĩnh vực khác :
a. Dây chuyền lắp ráp trong sản xuất ô tô
b. Cáp treo cầu
c. Hệ thống hàng không và hàng hải kết hợp thông tin gió
d. Thang máy tốc hành trong các tòa nhà
e. Thư viện dự trữ bàn
f. Tăng diện tích cổng trên bóng bán dẫn CMOS để giảm thời gian chuyển đổi
g. Xây dựng những chiếc xe tự lái có hệ thống điều khiển một phần dựa vào cảm
biến hiện có các hệ thống đã được cài đặt vào phương tiện cơ sở, chẳng hạn như
hệ thống khởi hành làn đường và hệ thống kiểm soát hành trình thông minh

1.3 [2] <§1.3> Mô tả các bước chuyển đổi một chương trình được viết ở cấp độ
cao ngôn ngữ như C thành một biểu diễn được thực hiện trực tiếp bởi bộ xử lý
máy tính.

1.4 [2] <§1.4> Giả sử màn hình màu sử dụng 8 bit cho mỗi màu chính (đỏ,
xanh lá cây, xanh dương) trên mỗi pixel và kích thước khung hình 1280 × 1024.
a. Kích thước tối thiểu tính bằng byte của bộ đệm khung để lưu trữ khung là bao nhiêu?
b. Tối thiểu sẽ mất bao lâu để khung được gửi trên 100 Mbit / s mạng?
60 Chương 1 Trừu tượng và công nghệ máy tính

1.5 [5] Xem xét bảng dưới đây, theo dõi một số chỉ số hiệu suất cho Bộ xử lý
máy tính để bàn Intel từ năm 2010.
Cột Tech Tech cho thấy kích thước tính năng tối thiểu của từng quy trình chế tạo
bộ xử lý. Giả sử rằng kích thước khuôn vẫn tương đối ổn định và số lượng bóng
bán dẫn bao gồm trong mỗi thang đo bộ xử lý ở mức (1 /t)2, Ở đâu t = kích thước
tính năng tối thiểu.
Đối với mỗi chỉ số hiệu suất, hãy tính tỷ lệ cải thiện trung bình từ năm 2010 đến
2019 cũng như số năm cần thiết để nhân đôi mỗi lần với tỷ lệ tương ứng đó.

Tối đa.
Tối đa. đồng hồ DRAM SP oating L3
Máy tính Số nguyên Băng điểm bộ
để bàn Năm tốc độ IPC / Lõi thông (Gflop / s) nhớ
bộ xử lý Côn (GHz) cốt (GB / s) cach
g nghệ lõi e
(MiB)
Westmere 2010 32 3.33 4 2 17.1 107 4
i7-620
Cầu Ivy 2013 22 3,90 6 4 25.6 250 số 8
i7-3770K
Broadwell 2015 14 4.20 số 8 4 34.1 269 số 8
i7-6700K
Hồ Kaby 2017 14 4.50 số 8 4 38.4 288 số 8
i7-7700K
Hồ cà phê 2019 14 4,90 số 8 số 8 42.7 627 12
i7-9700K
Imp./ năm __% __% __% __% __% __% __%
Nhân đôi mọi __năm __năm __năm __năm __năm __năm __năm

1.6 [4] <§1.6> Xem xét ba bộ xử lý khác nhau P1, P2 và P3 thực thi cùng một
bộ hướng dẫn. P1 có tốc độ xung nhịp 3 GHz và CPI là 1,5. P2 có tốc độ xung
nhịp 2,5 GHz và CPI là 1,0. P3 có tốc độ xung nhịp 4.0 GHz và có CPI là 2.2.
a. Bộ xử lý nào có hiệu suất cao nhất được thể hiện trong hướng dẫn mỗi giây?

b. Nếu bộ xử lý mỗi thực hiện một chương trình trong 10 giây, hãy tìm số lượng
chu kỳ và số lượng hướng dẫn.
c. Chúng tôi đang cố gắng giảm 30% thời gian thực hiện, nhưng điều này dẫn đến sự
gia tăng 20% trong CPI. Chúng ta nên giảm tốc độ đồng hồ nào trong thời gian này?
1.15 Bài tập 61

1.7 [20] <§1.6> Xem xét hai triển khai khác nhau của cùng một hướng dẫn
thiết lập kiến trúc. Các hướng dẫn có thể được chia thành bốn lớp theo CPI của
chúng (các lớp A, B, C và D). P1 với tốc độ xung nhịp 2,5 GHz và CPI là 1, 2, 3
và 3 và P2 với tốc độ xung nhịp 3 GHz và CPI là 2, 2, 2 và 2.
Đưa ra một chương trình với số lượng hướng dẫn động là 1.0E6 hướng dẫn được
chia thành các lớp như sau: 10% lớp A, 20% lớp B, 50% lớp C và 20% lớp D,
nhanh hơn: P1 hoặc P2?
a. CPI toàn cầu cho mỗi lần thực hiện là gì?
b. Tìm các chu kỳ đồng hồ cần thiết trong cả hai trường hợp.
1.8 [15] <§1.6> Trình biên dịch có thể có tác động sâu sắc đến hiệu suất của
một ứng dụng. Giả sử rằng đối với một chương trình, trình biên dịch A dẫn đến
số lượng lệnh động là 1.0E9 và có thời gian thực hiện là 1,1 giây, trong khi trình
biên dịch B dẫn đến số lượng lệnh động là 1.2E9 và thời gian thực hiện là 1,5
giây.

a. Tìm CPI trung bình cho mỗi chương trình cho rằng bộ xử lý có chu kỳ xung
nhịp thời gian 1 ns.
b. Giả sử các chương trình biên dịch chạy trên hai bộ xử lý khác nhau. Nếu thực
hiện thời gian trên hai bộ xử lý là như nhau, đồng hồ của bộ xử lý chạy trình biên
dịch mã A nhanh hơn bao nhiêu so với đồng hồ của bộ xử lý chạy trình biên dịch
mã B?
c. Một trình biên dịch mới được phát triển chỉ sử dụng 6.0E8 hướng dẫn và có
một CPI trung bình 1,1. Việc tăng tốc sử dụng trình biên dịch mới này so với sử
dụng trình biên dịch A hoặc B trên bộ xử lý gốc là gì?

1.9 Bộ xử lý Pentium 4 Prescott, được phát hành năm 2004, có tốc độ xung
nhịp 3,6 GHz và điện áp 1,25 V. Giả sử, trung bình, nó tiêu thụ 10 W công suất
tĩnh và 90 W công suất động.
Cầu Core i5 Ivy, được phát hành năm 2012, có tốc độ xung nhịp 3,4 GHz và điện
áp 0,9 V. Giả sử, trung bình, nó tiêu thụ 30 W công suất tĩnh và 40 W công suất
động.
1.9.1 [5] < §1.7> Đối với mỗi bộ xử lý tìm thấy tải điện dung trung bình.
1.9.2 [5] < §1.7> Tìm tỷ lệ phần trăm của tổng sức mạnh tiêu tan bao gồm tĩnh
điện và tỷ lệ công suất tĩnh với công suất động cho từng công nghệ.
1.9.3 [15] < §1.7> Nếu tổng công suất tiêu tán sẽ giảm 10%, bao nhiêu nên
giảm điện áp để duy trì cùng dòng rò? Lưu ý: công suất được định nghĩa là sản
phẩm của điện áp và dòng điện.
62 Chương 1 Trừu tượng và công nghệ máy tính

1.10 Giả sử cho các hướng dẫn số học, tải / lưu trữ và chi nhánh, một bộ xử lý
có CPI tương ứng là 1, 12 và 5. Cũng giả sử rằng trên một bộ xử lý duy nhất, một
chương trình yêu cầu thực hiện các hướng dẫn số học 2.56E9, hướng dẫn tải / lưu
trữ 1.28E9 và 256 triệu hướng dẫn nhánh. Giả sử rằng mỗi bộ xử lý có tần số
xung nhịp 2 GHz.
Giả sử rằng, khi chương trình được song song để chạy qua nhiều lõi, số lượng
hướng dẫn số học và tải / lưu trữ trên mỗi bộ xử lý được chia cho 0,7 × tr (ở đâu
tr là số lượng bộ xử lý) nhưng số lượng hướng dẫn nhánh trên mỗi bộ xử lý vẫn
như cũ.
1.10.1 [5] < §1.7> Tìm tổng thời gian thực hiện cho chương trình này trên 1, 2,
4 và 8 bộ xử lý và hiển thị tốc độ tương đối của kết quả bộ xử lý 2, 4 và 8 so với
kết quả bộ xử lý đơn.
1.10.2 [10] <§ §1.6, 1.8> Nếu CPI của các hướng dẫn số học được nhân đôi ,
tác động sẽ là gì đến thời gian thực hiện chương trình trên bộ xử lý 1, 2, 4 hoặc 8?
1.10.3 [10] <§ §1.6, 1.8> CPI của hướng dẫn tải / lưu trữ là gì giảm để một bộ
xử lý duy nhất phù hợp với hiệu suất của bốn bộ xử lý bằng cách sử dụng các giá
trị CPI ban đầu?

1.11 Giả sử một wafer đường kính 15 cm có chi phí 12, chứa 84 khuôn và có
0,020 khuyết tật / cm2Giả sử một wafer đường kính 20 cm có chi phí 15, chứa
100 khuôn và có 0,031 khuyết tật / cm.2.
1.11.1 [10] <§1.5> Tìm năng suất cho cả hai tấm wafer.
1.11.2 [5] <§1.5> Tìm chi phí cho mỗi lần chết cho cả hai tấm wafer.
1.11.3 [5] <§1.5> Nếu số lượng chết trên mỗi wafer được tăng thêm 10% và
khuyết tật trên mỗi đơn vị diện tích tăng 15%, tìm diện tích chết và năng suất.
1.11.4 [5] <§1.5> Giả sử một quy trình chế tạo cải thiện năng suất từ 0,92 đến
0,95. Tìm các khuyết tật trên mỗi đơn vị diện tích cho mỗi phiên bản công nghệ
có diện tích chết là 200 mm2.

1.12 Kết quả của điểm chuẩn Bzip2 của CPU2006 chạy trên AMD Barcelona
có số lượng hướng dẫn là 2.389E12, thời gian thực hiện là 750 giây và thời gian
tham chiếu là 9650 giây.
1.12.1 [5] <§ §1.6, 1.9> Tìm CPI nếu thời gian chu kỳ đồng hồ là 0,333 ns.
1.12.2 [5] <§1.9> Tìm các đặc điểm.
1.12.3 [5] <§ §1.6, 1.9> Tìm sự gia tăng thời gian CPU nếu số lượng hướng
dẫn điểm chuẩn được tăng thêm 10% mà không ảnh hưởng đến CPI .
1.15 Bài tập 63

1.12.4 [5] <§ §1.6, 1.9> Tìm sự gia tăng thời gian CPU nếu số lượng hướng dẫn
điểm chuẩn được tăng thêm 10% và CPI được tăng thêm 5%.
1.12.5 [5] <§ §1.6, 1.9> Tìm sự thay đổi trong Specratio cho thay đổi này.
1.12.6 [10] <§1.6> Giả sử rằng chúng tôi đang phát triển một phiên bản mới
của AMD Bộ xử lý Barcelona với tốc độ xung nhịp 4 GHz. Chúng tôi đã thêm
một số hướng dẫn bổ sung vào tập lệnh theo cách giảm 15% số lượng hướng dẫn.
Thời gian thực hiện giảm xuống còn 700 giây và Specratio mới là 13,7. Tìm CPI
mới .
1.12.7 [10] <§1.6> Giá trị CPI này lớn hơn thu được trong 1.11.1 dưới dạng
đồng hồ tốc độ được tăng từ 3 GHz lên 4 GHz. Xác định xem mức tăng CPI có
tương tự như tốc độ xung nhịp hay không. Nếu họ không giống nhau, tại sao?
1.12.8 [5] <§1.6> Thời gian CPU đã giảm bao nhiêu?
1.12.9 [10] <§1.6> Đối với một điểm chuẩn thứ hai, libquantum, giả sử thực
hiện thời gian 960 ns, CPI 1,61 và tốc độ xung nhịp 3 GHz. Nếu thời gian thực
hiện giảm thêm 10% mà không ảnh hưởng đến CPI và với tốc độ xung nhịp 4
GHz, hãy xác định số lượng hướng dẫn.
1.12.10 [10] <§1.6> Xác định tốc độ đồng hồ cần thiết để cung cấp thêm 10%
giảm thời gian CPU trong khi duy trì số lượng hướng dẫn và với CPI không thay
đổi.
1.12.11 [10] <§1.6> Xác định tốc độ đồng hồ nếu CPI giảm 15% và thời gian
CPU bằng 20% trong khi số lượng hướng dẫn không thay đổi.

1.13 Mục 1.11 trích dẫn như một cạm bẫy của việc sử dụng một tập hợp con
của hiệu suất phương trình như một số liệu hiệu suất. Để minh họa điều này, hãy
xem xét hai bộ xử lý sau đây. P1 có tốc độ xung nhịp 4 GHz, CPI trung bình 0,9
và yêu cầu thực hiện các hướng dẫn 5.0E9. P2 có tốc độ xung nhịp 3 GHz, CPI
trung bình 0,75 và yêu cầu thực hiện các hướng dẫn 1.0E9.
1.13.1 [5] <§ §1.6, 1.11> Một ngụy biện thông thường là xem xét máy tính có lớn nhất
tốc độ đồng hồ là có hiệu suất cao nhất. Kiểm tra xem điều này có đúng với P1 và P2
không.
1.13.2 [10] <§ §1.6, 1.11> Một sai lầm khác là xem xét rằng bộ xử lý thực hiện
số lượng hướng dẫn lớn nhất sẽ cần thời gian CPU lớn hơn. Xem xét rằng bộ xử
lý P1 đang thực hiện một chuỗi các hướng dẫn 1.0E9 và CPI của bộ xử lý P1 và
P2 không thay đổi, hãy xác định số lượng hướng dẫn mà P2 có thể thực hiện
cùng lúc với P1 cần thực hiện các hướng dẫn 1.0E9.
1.13.3 [10] <§ §1.6, 1.11> Một ngụy biện phổ biến là sử dụng MIPS (hàng
triệu hướng dẫn mỗi giây) để so sánh hiệu suất của hai bộ xử lý khác nhau , và
xem xét rằng bộ xử lý có MIPS lớn nhất có hiệu suất lớn nhất. Kiểm tra xem điều
này có đúng với P1 và P2 không.
64 Chương 1 Trừu tượng và công nghệ máy tính

1.13.4 [10] <§1.11> Một con số hiệu suất phổ biến khác là MFLOPS (hàng
triệu của các hoạt động dấu phẩy động mỗi giây), được định nghĩa là

MFLOPS 5 Không. FPoperations / (thời gian thực hiện 31E6)

nhưng con số này có cùng vấn đề với MIPS. Giả sử rằng 40% các hướng dẫn
được thực hiện trên cả P1 và P2 là các hướng dẫn dấu phẩy động. Tìm số liệu
MFLOPS cho bộ xử lý.
1.14 Một cạm bẫy khác được trích dẫn trong Mục 1.11 đang mong đợi để cải thiện tổng
thể hiệu suất của máy tính bằng cách chỉ cải thiện một khía cạnh của máy tính. Hãy xem
xét một máy tính chạy một chương trình yêu cầu 250 giây, với 70 giây thực hiện các
hướng dẫn FP, hướng dẫn L / S được thực hiện 85 giây và 40 giây thực hiện các hướng
dẫn chi nhánh.
1.14.1 [5] <§1.11> Tổng thời gian giảm bao nhiêu nếu thời gian cho FP hoạt
động giảm 20%?
1.14.2 [5] <§1.11> Thời gian cho các hoạt động INT giảm bao nhiêu nếu tổng
thời gian giảm 20%?
1.14.3 [5] <§1.11> Tổng thời gian có thể giảm 20% chỉ bằng cách giảm thời
gian cho hướng dẫn chi nhánh?

1.15 Giả sử một chương trình yêu cầu thực hiện 50 × 106 Hướng dẫn FP , 110
× 106 Hướng dẫn INT, 80 × 106 Hướng dẫn L / S và 16 × 106 hướng dẫn chi
nhánh. CPI cho mỗi loại hướng dẫn lần lượt là 1, 1, 4 và 2. Giả sử rằng bộ xử lý
có tốc độ xung nhịp 2 GHz.
1.15.1 [10] <§1.11> Chúng ta phải cải thiện CPI của các hướng dẫn FP bao
nhiêu nếu chúng tôi muốn chương trình chạy nhanh hơn hai lần?
1.15.2 [10] <§1.11> Chúng ta phải cải thiện CPI của các hướng dẫn L / S bao
nhiêu nếu chúng tôi muốn chương trình chạy nhanh hơn hai lần?
1.15.3 [5] <§1.11> Thời gian thực hiện của chương trình được cải thiện bao
nhiêu nếu chỉ dẫn CPI của INT và FP giảm 40% và CPI của L / S và Chi nhánh
giảm 30%?

1.16 [5] <§1.8> Khi một chương trình được điều chỉnh để chạy trên nhiều bộ
xử lý một hệ thống đa bộ xử lý, thời gian thực hiện trên mỗi bộ xử lý bao gồm
thời gian tính toán và thời gian trên không cần thiết cho các phần quan trọng bị
khóa và / hoặc gửi dữ liệu từ bộ xử lý này sang bộ xử lý khác.
Giả sử một chương trình yêu cầu t = 100 giây thời gian thực hiện trên một bộ xử
lý. Khi chạy tr bộ xử lý, mỗi bộ xử lý yêu cầu t / p s, cũng như thêm 4 giây trên
cao , không phân biệt số lượng bộ xử lý. Tính thời gian thực hiện trên mỗi bộ xử
lý cho các bộ xử lý 2, 4, 8, 16, 32, 64 và 128. Đối với mỗi trường hợp, hãy liệt kê
tốc độ tương ứng so với một bộ xử lý đơn và tỷ lệ giữa tốc độ thực tế so với tốc
độ lý tưởng (tốc độ nếu không có chi phí chung).
1.15 Bài tập 65

§1.1, trang 10: Câu hỏi thảo luận: nhiều câu trả lời được chấp nhận. Câu trả lời
§1.4, trang 24: Bộ nhớ DRAM: không ổn định, thời gian truy cập ngắn từ 50 đến 70 để kiểm tra
nano giây và chi phí cho mỗi GB là 5 đến 10 đô la. Bộ nhớ đĩa: không biến động,
thời gian truy cập chậm hơn 100.000 đến 400.000 lần so với DRAM và chi phí cho chính mình
mỗi GB rẻ hơn 100 lần so với DRAM. Bộ nhớ flash: không biến động, thời gian truy
cập chậm hơn 100 đến 1000 lần so với DRAM và chi phí cho mỗi GB rẻ hơn 7 đến
10 lần so với DRAM ...
§1.5, trang 28: 1, 3 và 4 là những lý do hợp lệ. Trả lời 5 có thể đúng vì khối
lượng lớn có thể giúp đầu tư thêm để giảm kích thước chết bằng cách, 10% là
một quyết định kinh tế tốt, nhưng điều đó không phải là sự thật.
§1.6, trang 33: 1. a: cả hai, b: độ trễ, c: không. 7 giây.
§1.6, trang 40: b.
§1.11, trang 54: a. Máy tính A có xếp hạng MIPS cao hơn. b. Máy tính B nhanh hơn.
2
Hướng dẫn: Ngôn ngữ
của máy tính
2.1 Giới thiệu 68
Tôi nói tiếng Tây 2.2 Hoạt động của phần cứng máy tính 69
Ban Nha với 2.3 Hoạt động của phần cứng máy tính 73

Chúa, tiếng Ý với 2.4 Số đã ký và chưa ký 80


2.5 Hướng dẫn đại diện trong máy tính 87
phụ nữ, tiếng
2.6 Hoạt động logic 95
Pháp với đàn ông
2.7 Hướng dẫn đưa ra quyết định 98
và tiếng Đức với 2.8 Quy trình hỗ trợ trong phần cứng
con ngựa của tôi. máy tính 104
Charles V, Hoàng đế La Mã 2.9 Giao tiếp với mọi người 114
thần thánh (1500 bóng1558)

Tổ chức máy tính và thiết kế Phiên bản RISC-V. DOI: http://dx.doi.org/10.1016/B978-0-12-820331-6.00002-8 ©


2021 Elsevier Inc. Đã đăng ký Bản quyền.
2.10 Địa chỉ RISC-V cho các địa chỉ và địa chỉ rộng 120
2.11 Song song và hướng dẫn: Đồng bộ hóa 128
2.12 Dịch và bắt đầu một chương trình 131
2.13 Một ví dụ sắp xếp C để đặt tất cả lại với nhau 140
2.14 Mảng so với con trỏ 148
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151
2.16 Real Stuff: MIPS Hướng dẫn 152
2.17 Real Stuff: Hướng dẫn ARMv7 (32 bit) 153
2,18 Real Stuff: Hướng dẫn ARMv8 (64 bit) 157
2.19 Real Stuff: x86 Hướng dẫn 158
2,20 Real Stuff: Phần còn lại của Bộ hướng dẫn RISC-V 167
2,21 Nhanh hơn: Ma trận nhân trong C 168
2.22 Ngụy biện và Cạm bẫy 170
2.23 Kết luận 172
2.24 Quan điểm lịch sử và đọc thêm 174
2.25 Tự học 175
2.26 Bài tập 178

Năm thành phần cổ điển của một máy tính


68 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

2.1 Giới thiệu

Để chỉ huy phần cứng máy tính, bạn phải nói ngôn ngữ của nó. Các từ của ngôn ngữ
máy tính được gọi hướng dẫnvà từ vựng của nó được gọi là an bộ hướng dẫnTrong
bộ hướng dẫn Các từ chương này, bạn sẽ thấy bộ hướng dẫn của một máy tính thực sự ,. cả ở dạng được
vựng của các lệnh được viết bởi mọi người và ở dạng đọc bởi máy tính. Chúng tôi giới thiệu hướng dẫn trong
hiểu bởi một kiến trúc một thời trang từ trên xuống. Bắt đầu từ một ký hiệu trông giống như một ngôn ngữ
nhất định. lập trình bị hạn chế, chúng tôi tinh chỉnh nó từng bước cho đến khi bạn thấy ngôn
ngữ thực tế của một máy tính thực sự. Chương 3 tiếp tục đi xuống của chúng tôi, tiết
lộ phần cứng cho số học và biểu diễn các số dấu phẩy động.
Bạn có thể nghĩ rằng ngôn ngữ của máy tính sẽ đa dạng như ngôn ngữ của mọi người,
nhưng thực tế, ngôn ngữ máy tính khá giống nhau, giống phương ngữ khu vực hơn là
ngôn ngữ độc lập. Do đó, một khi bạn học một, thật dễ dàng để chọn người khác.
Tập lệnh được chọn là RISC-V, ban đầu được phát triển tại UC Berkeley bắt
đầu từ năm 2010.
Để chứng minh việc chọn các bộ hướng dẫn khác dễ dàng như thế nào, chúng
tôi cũng sẽ xem nhanh hai bộ hướng dẫn phổ biến khác.
1. MIPS là một ví dụ thanh lịch về các bộ hướng dẫn được thiết kế từ những
năm 1980. Trong một số khía cạnh, RISC-V tuân theo một thiết kế tương
tự.
2. Intel x86 có nguồn gốc từ những năm 1970, nhưng ngày nay vẫn cung cấp
năng lượng cho cả PC và Đám mây của thời kỳ hậu PC.
Sự giống nhau của các bộ hướng dẫn xảy ra bởi vì tất cả các máy tính được
xây dựng từ các công nghệ phần cứng dựa trên các nguyên tắc cơ bản tương tự và
bởi vì có một vài thao tác cơ bản mà tất cả các máy tính phải cung cấp. Hơn nữa,
các nhà thiết kế máy tính có một mục tiêu chung: tìm một ngôn ngữ giúp dễ dàng
xây dựng phần cứng và trình biên dịch trong khi tối đa hóa hiệu suất và giảm
thiểu chi phí và năng lượng. Mục tiêu này là thời gian được tôn vinh; trích dẫn
sau đây đã được viết trước khi bạn có thể mua một máy tính, và nó đúng như
ngày nay vào năm 1946 :
Thật dễ dàng để thấy bằng các phương pháp logic chính thức tồn tại một số
[bộ hướng dẫn] nhất định đủ trừu tượng để kiểm soát và gây ra việc thực hiện
bất kỳ chuỗi hoạt động nào.... Những cân nhắc thực sự quyết định từ quan
điểm hiện tại, trong việc chọn một [bộ hướng dẫn] có bản chất thực tế hơn: sự
đơn giản của thiết bị theo yêu cầu của [bộ hướng dẫn] và sự rõ ràng của ứng
dụng của nó đối với các vấn đề thực sự quan trọng cùng với tốc độ xử lý các
vấn đề đó.
Burks, Goldstine và von Neumann, 1946

Sự đơn giản của các thiết bị, có thể xem xét rất có giá trị đối với các máy tính
ngày nay cũng như đối với những năm 1940. Mục tiêu của chương này là dạy một bộ
hướng dẫn tuân theo lời khuyên này, cho thấy cả cách nó được thể hiện trong phần
cứng và mối quan hệ giữa các ngôn ngữ lập trình cấp cao và điều này
2.2 Hoạt động của phần cứng máy tính 69

nguyên thủy hơn. Các ví dụ của chúng tôi là trong ngôn ngữ lập trình C; Mục
2.15 cho thấy những thứ này sẽ thay đổi như thế nào đối với một ngôn ngữ hướng đối
tượng như Java.
Bằng cách học cách thể hiện các hướng dẫn, bạn cũng sẽ khám phá bí mật của điện khái niệm chương
toán: the khái niệm chương trình lưu trữHơn nữa, bạn sẽ thực hiện các kỹ năng ngôn trình lưu trữ Ý tưởng
ngữ nước ngoài của bạn bằng cách viết các chương trình bằng ngôn ngữ của máy tính và đó hướng dẫn và dữ liệu
chạy chúng trên trình giả lập đi kèm với cuốn sách này. Bạn cũng sẽ thấy tác động của của nhiều loại có thể được
ngôn ngữ lập trình và tối ưu hóa trình biên dịch đến hiệu suất. Chúng tôi kết luận với một lưu trữ trong bộ nhớ dưới
dạng số và do đó dễ thay
cái nhìn về sự phát triển lịch sử của các bộ hướng dẫn và tổng quan về các phương ngữ
đổi, dẫn đến máy tính
máy tính khác. chương trình được lưu trữ.
Chúng tôi tiết lộ hướng dẫn đầu tiên của chúng tôi đặt một mảnh tại một thời điểm,
đưa ra lý do cùng với các cấu trúc máy tính. Hướng dẫn từng bước từ trên xuống này
dệt các thành phần bằng lời giải thích của chúng, làm cho ngôn ngữ máy tính trở nên
ngon miệng hơn. Hình 2.1 đưa ra một bản xem trước lén lút của bộ hướng dẫn được
đề cập trong chương này.
Xây dựng: RISC-V là một kiến trúc mở được kiểm soát bởi RISC-V International ,
không phải là kiến trúc độc quyền thuộc sở hữu của một công ty như ARM, MIPS
hoặc x86. Năm 2020, hơn 200 công ty là thành viên của RISC-V International và mức
độ phổ biến của nó đang tăng lên nhanh chóng.

Chắc chắn phải có


hướng dẫn
2.2 Hoạt động của phần cứng máy tính để thực hiện các phép
toán số học cơ bản.
Mỗi máy tính phải có khả năng thực hiện số học. Ký hiệu ngôn ngữ lắp ráp Burks, Goldstine và
RISC-V von Neumann, 1946
thêm a, b, c
hướng dẫn một máy tính để thêm hai biến b và c và để đặt số tiền của họ vào aKý
hiệu này cứng nhắc ở chỗ mỗi lệnh số học RISC-V chỉ thực hiện.
một thao tác và phải luôn có chính xác ba biến. Ví dụ: giả sử chúng ta muốn đặt
tổng của bốn biến b, c, d, và e thành biến a(Trong phần này, chúng tôi đang cố
tình mơ hồ về việc một biến số của người Viking là gì; trong phần tiếp theo,
chúng tôi sẽ giải thích chi tiết.).
Trình tự hướng dẫn sau đây thêm bốn biến :
thêm a, b, c // Tổng của b và c được đặt trong một thêm a, a, d // Tổng của b, c, và d
bây giờ là trong một thêm a, a, e // Tổng của b, c, d, và bây giờ là trong một

Vì vậy, phải mất ba hướng dẫn để tổng hợp bốn biến.


Các từ bên phải của dấu gạch chéo kép (//) trên mỗi dòng trên là ý kiến cho
người đọc, vì vậy máy tính bỏ qua chúng. Lưu ý rằng không giống như các ngôn
ngữ lập trình khác, mỗi dòng của ngôn ngữ này có thể chứa nhiều nhất một lệnh.
Một điểm khác biệt so với C là các bình luận luôn chấm dứt ở cuối dòng.
70 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

HÌNH 2.1 Ngôn ngữ lắp ráp RISC-V được tiết lộ trong chương này. Thông tin này cũng được tìm thấy trong Cột 1 của RISC-V
Thẻ dữ liệu tham khảo ở phía trước của cuốn sách này.
2.2 Hoạt động của phần cứng máy tính 71

HÌNH 2.1 (Tiếp theo).

Số lượng toán hạng tự nhiên cho một thao tác như bổ sung là ba: hai số được
cộng lại với nhau và một nơi để đặt tổng. Yêu cầu mọi hướng dẫn phải có chính
xác ba toán hạng, không hơn không kém, phù hợp với triết lý giữ phần cứng đơn
giản: phần cứng cho một số toán hạng khác nhau phức tạp hơn phần cứng cho
một số cố định. Tình huống này minh họa đầu tiên trong ba nguyên tắc cơ bản của
thiết kế phần cứng :
Nguyên tắc thiết kế 1: Đơn giản ủng hộ sự đều đặn.
Bây giờ chúng ta có thể chỉ ra, trong hai ví dụ tiếp theo, mối quan hệ của các
chương trình được viết bằng ngôn ngữ lập trình cấp cao hơn với các chương trình
theo ký hiệu nguyên thủy hơn này.

Biên soạn hai Báo cáo chuyển nhượng C thành RISC-V


VÍ DỤ
Đoạn này của chương trình C chứa năm biếna, b, c, d, và eVì Java phát triển
từ C, ví dụ này và một số hoạt động tiếp theo cho ngôn ngữ lập trình cấp
cao :.
a = b + c;
d = a - e;

Các trình biên dịch dịch từ hướng dẫn ngôn ngữ lắp ráp C đến RISC-V.
Hiển thị mã RISC-V được tạo bởi trình biên dịch.
TRẢ LỜI
Một lệnh RISC-V hoạt động trên hai toán hạng nguồn và đặt kết quả vào một
toán hạng đích. Do đó, hai câu lệnh đơn giản ở trên biên dịch trực tiếp vào
hai hướng dẫn ngôn ngữ lắp ráp RISC-V này :
thêm a, b, c
phụ d, a, e
72 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Biên dịch một Nhiệm vụ C phức tạp thành RISC-V


VÍ DỤ
Một tuyên bố hơi phức tạp chứa năm biến f, g, h, Tôi, và j:
f = (g + h) - (i + j);

Những gì một trình biên dịch C có thể sản xuất?

Trình biên dịch phải chia câu lệnh này thành nhiều hướng dẫn lắp ráp, vì chỉ
TRẢ LỜI có một thao tác được thực hiện theo hướng dẫn RISC-V. Hướng dẫn RISC-V
đầu tiên tính tổng g và h Chúng ta phải đặt kết quả ở đâu đó, vì vậy trình biên
dịch tạo ra một biến tạm thời, được gọi. t0:
thêm t0, g, h // biến tạm thời t0 chứa g + h

Mặc dù thao tác tiếp theo là trừ, chúng ta cần tính tổng Tôi và j trước khi
chúng ta có thể trừ đi. Do đó, hướng dẫn thứ hai đặt tổng của Tôi và j trong
một biến tạm thời khác được tạo bởi trình biên dịch, được gọi t1:
thêm t1, i, j // biến tạm thời t1 chứa i + j

Cuối cùng, lệnh trừ trừ trừ tổng thứ hai từ đầu tiên và đặt sự khác biệt trong
biến f, hoàn thành mã biên dịch :
phụ f, t0, t1 // f được t0 - t1, đó là (g + h) - (i + j)

Kiểm tra Đối với một hàm nhất định, ngôn ngữ lập trình có thể mất nhiều dòng mã nhất?
Bản thân bạn Đặt ba đại diện dưới đây theo thứ tự.
1. Java
2. C
3. Ngôn ngữ lắp ráp RISC-V

Xây dựng: Để tăng tính di động, Java ban đầu được hình dung là dựa vào một thông
dịch viên phần mềm. Tập lệnh của trình thông dịch này được gọi Mã byte Java (xem
Mục 2.15), khá khác so với tập lệnh RISC-V. Để có được hiệu suất gần với chương
trình C tương đương, các hệ thống Java ngày nay thường biên dịch các mã byte
Java thành các bộ lệnh gốc như RISC-V. Bởi vì việc biên dịch này thường được
thực hiện muộn hơn nhiều so với các chương trình C, các trình biên dịch Java như
vậy thường được gọi Chỉ Trong thời gian (JIT) trình biên dịch. Mục 2.12 cho thấy
cách JIT được sử dụng muộn hơn trình biên dịch C trong quá trình khởi động và
Phần 2.13 cho thấy hậu quả hiệu suất của việc biên dịch so với diễn giải các
chương trình Java.
2.3 Hoạt động của phần cứng máy tính 73

2.3 Hoạt động của phần cứng máy tính

Không giống như các chương trình bằng các ngôn ngữ cấp cao, các toán hạng của
các hướng dẫn số học bị hạn chế; chúng phải đến từ một số vị trí đặc biệt được xây
dựng trực tiếp trong phần cứng được gọi sổ đăng ký Sổ đăng ký là nguyên thủy được
sử dụng trong thiết kế phần cứng cũng có thể nhìn thấy cho lập trình viên khi máy
tính hoàn thành, vì vậy bạn có thể nghĩ các thanh ghi là viên gạch xây dựng máy tính.
Kích thước của một thanh ghi trong kiến trúc RISC-V là 32 bit; các nhóm 32 bit xảy
ra thường xuyên đến mức chúng được đặt tên. từ trong kiến trúc RISC-V. (Một kích từ Một đơn vị tự nhiên
thước phổ biến khác là một nhóm gồm 64 bit, được gọi là a từ khóa trong kiến trúc truy cập trong máy tính,
RISC-V.) thường là một nhóm 32
Một điểm khác biệt chính giữa các biến của ngôn ngữ lập trình và thanh ghi là số bit; tương ứng với kích
lượng thanh ghi giới hạn, thường là 32 trên các máy tính hiện tại, như RISC-V. (Xem thước của một thanh ghi
trong kiến trúc RISC-V.
Mục 2.25 cho lịch sử của số lượng đăng ký.) Vì vậy, tiếp tục trong chúng tôi từ trên
xuống, tiến hóa từng bước của biểu diễn biểu tượng của ngôn ngữ RISC-V, trong từ khóa Khác đơn vị
phần này, chúng tôi đã thêm hạn chế rằng ba toán hạng của các hướng dẫn số học truy cập tự nhiên trong
RISC-V phải được chọn từ một trong các thanh ghi 32 bit. máy tính, thường là một
Lý do giới hạn của 32 thanh ghi có thể được tìm thấy trong phần hai của ba nhóm 64 bit.
nguyên tắc thiết kế cơ bản của công nghệ phần cứng :
Nguyên tắc thiết kế 2 : Nhỏ hơn là nhanh hơn.
Một số lượng rất lớn các thanh ghi có thể làm tăng thời gian chu kỳ đồng hồ đơn
giản vì nó mất tín hiệu điện tử lâu hơn khi chúng phải di chuyển xa hơn.
Các hướng dẫn như nhỏ hơn là nhanh hơn không phải là tuyệt đối; 31 thanh
ghi có thể không nhanh hơn 32. Mặc dù vậy, sự thật đằng sau những quan sát
như vậy khiến các nhà thiết kế máy tính nghiêm túc thực hiện chúng. Trong
trường hợp này, nhà thiết kế phải cân bằng sự khao khát của các chương trình để
có thêm các thanh ghi với mong muốn của nhà thiết kế để giữ cho chu kỳ đồng
hồ nhanh. Một lý do khác để không sử dụng nhiều hơn 32 là số bit mà nó sẽ có ở
định dạng lệnh, như Mục 2.5 chứng minh.
Chương 4 cho thấy vai trò trung tâm của các thanh ghi đóng vai trò trong xây
dựng phần cứng; như chúng ta sẽ thấy trong chương đó, việc sử dụng hiệu quả
các thanh ghi là rất quan trọng đối với hiệu suất của chương trình.
Mặc dù chúng tôi chỉ có thể viết hướng dẫn bằng cách sử dụng số cho các
thanh ghi, từ 0 đến 31, quy ước RISC-V là x theo sau là số lượng đăng ký, ngoại
trừ một vài tên đăng ký mà chúng tôi sẽ bao gồm sau.

Biên dịch một bài tập C bằng cách sử dụng các thanh ghi
VÍ DỤ
Đây là công việc biên dịch để liên kết các biến chương trình với các thanh
ghi. Lấy ví dụ, câu lệnh gán từ ví dụ trước của chúng tôi :
f = (g + h) - (i + j);
74 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Các biến f, g, h, Tôi, và j được gán cho các thanh ghi x19, x20, x21, x22, và
x23, tương ứng. Mã RISC-V được biên dịch là gì?

Chương trình đã biên dịch rất giống với ví dụ trước, ngoại trừ chúng tôi thay thế
TRẢ LỜI các biến bằng tên đăng ký được đề cập ở trên cộng với hai thanh ghi tạm thời ,
x5 và x6, tương ứng với các biến tạm thời ở trên :

thêm x5, x20, x21 // thanh ghi x5 chứa g + h thêm x6, x22, x23 //
thanh ghi x6 chứa i + j
phụ x19, x5, x6 // f được x5 - x6, đó là (g + h) - (i + j)

Toán tử bộ nhớ
Các ngôn ngữ lập trình có các biến đơn giản chứa các thành phần dữ liệu đơn lẻ,
như trong các ví dụ này, nhưng chúng cũng có các cấu trúc dữ liệu phức tạp hơn.
Các cấu trúc dữ liệu tổng hợp này có thể chứa nhiều thành phần dữ liệu hơn so
với các thanh ghi trong máy tính. Làm thế nào một máy tính có thể đại diện và
truy cập các cấu trúc lớn như vậy?
Nhớ lại năm thành phần của một máy tính được giới thiệu trong Chương 1 và
lặp lại ở trang 67. Bộ xử lý chỉ có thể giữ một lượng nhỏ dữ liệu trong các thanh
ghi, nhưng bộ nhớ máy tính chứa hàng tỷ yếu tố dữ liệu. Do đó, cấu trúc dữ liệu
hướng dẫn truyền dữ
liệu Một mệnh lệnh di
(mảng và cấu trúc) được lưu trong bộ nhớ.
chuyển dữ liệu giữa bộ Như đã giải thích ở trên, các phép toán số học chỉ xảy ra trên các thanh ghi
nhớ và thanh ghi. trong hướng dẫn RISC-V; do đó, RISC-V phải bao gồm các hướng dẫn truyền dữ
liệu giữa bộ nhớ và thanh ghi. Hướng dẫn như vậy được gọi hướng dẫn truyền
Địa chỉ Một giá trị được dữ liệu Để truy cập một từ trong bộ nhớ, hướng dẫn phải cung cấp bộ nhớ. Địa
sử dụng để phân định vị
chỉ Bộ nhớ chỉ là một mảng lớn, một chiều, với địa chỉ đóng vai trò là chỉ mục
trí của một thành phần dữ
cho mảng đó, bắt đầu từ 0. Ví dụ, trong. Hình 2.2, địa chỉ của phần tử dữ liệu thứ
liệu cụ thể trong một
mảng bộ nhớ.
ba là 2 và giá trị của bộ nhớ [2] là 10.

3 100
2 10
1 101
0 1
Địa chỉ Dữ
liệu
Bộ xử lý Ký ức

HÌNH 2.2 Địa chỉ bộ nhớ và nội dung của bộ nhớ tại các vị trí đó. Nếu những yếu tố này là các từ, các
địa chỉ này sẽ không chính xác, vì RISC-V thực sự sử dụng địa chỉ byte, với mỗi từ đại diện cho 4 byte. Hình 2.3
hiển thị địa chỉ bộ nhớ chính xác cho các địa chỉ từ tuần tự.
2.3 Hoạt động của phần cứng máy tính 75

Hướng dẫn truyền dữ liệu sao chép dữ liệu từ bộ nhớ sang thanh ghi theo
truyền thống được gọi tải Định dạng của lệnh tải là tên của thao tác theo sau là
thanh ghi sẽ được tải, sau đó đăng ký và một hằng số được sử dụng để truy cập
bộ nhớ. Tổng phần không đổi của lệnh và nội dung của thanh ghi thứ hai tạo
thành địa chỉ bộ nhớ. Tên RISC-V thực sự cho hướng dẫn này là. lw, đứng cho
tải từ.

Biên dịch một bài tập khi một toán tử nằm trong bộ nhớ
Hãy để giả định rằng A là một mảng gồm 100 từ và trình biên dịch đã liên kết
VÍ DỤ
các biến g và h với các thanh ghi x20 và x21 như trước đây. Hãy để cũng giả định rằng địa chỉ bắt
đầu, hoặc địa chỉ cơ sở, của mảng là trong x22Biên dịch C.
tuyên bố chuyển nhượng :

g = h + A [8];

Mặc dù có một thao tác duy nhất trong câu lệnh gán này, một trong những TRẢ LỜI
toán hạng nằm trong bộ nhớ, vì vậy trước tiên chúng ta phải chuyển A [8] để
đăng ký. Địa chỉ của phần tử mảng này là tổng của cơ sở của mảng A, tìm
thấy trong đăng ký x22, cộng với số để chọn phần tử 8. Dữ liệu nên được đặt
trong một thanh ghi tạm thời để sử dụng trong hướng dẫn tiếp theo. Dựa trên
Hình 2.2, hướng dẫn biên soạn đầu tiên là
lw x9, 8 (x22) // Reg tạm thời x9 được A [8]

(Chúng tôi sẽ thực hiện một điều chỉnh nhỏ cho hướng dẫn này, nhưng chúng
tôi sẽ sử dụng phiên bản đơn giản hóa này ngay bây giờ.) Hướng dẫn sau đây
có thể hoạt động trên giá trị trong x9 (bằng A [8]) vì nó nằm trong một sổ
đăng ký. Hướng dẫn phải thêm h (chứa trong x21) đến A [8] (chứa trong x9)
và đặt tổng trong thanh ghi tương ứng với g (liên kết với x20):
thêm x20, x21, x9 // g = h + A [8]

Sổ đăng ký được thêm vào để tạo thành địa chỉ (x22) được gọi là đăng ký cơ
sởvà hằng số trong lệnh truyền dữ liệu (8) được gọi là bù đắp.

Ngoài việc liên kết các biến với các thanh ghi, trình biên dịch phân bổ các cấu Giao diện
trúc dữ liệu như mảng và cấu trúc cho các vị trí trong bộ nhớ. Trình biên dịch sau phần
đó có thể đặt địa chỉ bắt đầu thích hợp vào hướng dẫn truyền dữ liệu.
Từ 8 bit byte rất hữu ích trong nhiều chương trình, hầu như tất cả các kiến trúc cứng /
ngày nay đều giải quyết các byte riêng lẻ. Do đó, địa chỉ của một từ khớp với địa phần
chỉ của một trong 4 byte trong từ và địa chỉ của các từ tuần tự khác nhau mềm
76 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

4. Ví dụ, Hình 2.3 hiển thị địa chỉ RISC-V thực tế cho các từ trong Hình 2.2; địa
chỉ byte của từ thứ ba là 8.
Máy tính chia thành những người sử dụng địa chỉ của byte ngoài cùng bên trái
hoặc byte lớn của Google làm địa chỉ từ so với những người sử dụng byte cuối
bên phải hoặc nhỏ. RISC-V thuộc về trại sau, được gọi là ít cuốiVì thứ tự chỉ
quan trọng nếu bạn truy cập dữ liệu giống hệt nhau dưới dạng một từ và bốn byte
riêng lẻ, nên rất ít người cần phải biết về tính cuối cùng của Hồi.Giáo dục.
Địa chỉ byte cũng ảnh hưởng đến chỉ mục mảng. Để có được địa chỉ byte thích
hợp trong mã ở trên , phần bù được thêm vào thanh ghi cơ sở x22 phải là 8 × 4,
hoặc 32, để địa chỉ tải sẽ chọn A [8] và không A [8/4] (Xem các liên quan. Hố
trên trang 172 của Mục 2.22).
Các hướng dẫn bổ sung để tải được gọi theo truyền thống cửa hàng; nó sao
chép dữ liệu từ một thanh ghi vào bộ nhớ. Định dạng của một cửa hàng tương tự
như tải: tên của hoạt động, theo sau là thanh ghi được lưu trữ, sau đó là thanh ghi
cơ sở và cuối cùng là phần bù để chọn thành phần mảng. Một lần nữa, địa chỉ
RISC-V được chỉ định một phần bởi một hằng số và một phần bởi nội dung của
một thanh ghi. Tên RISC-V thực tế là sw, đứng cho lưu trữ từ.

12 100

số 8 10

4 101

0 1

Địa chỉ byte Dữ liệu

Bộ xử lý Ký ức

HÌNH 2.3 Địa chỉ bộ nhớ RISC-V thực tế và nội dung của bộ nhớ cho những từ đó. Các địa
chỉ thay đổi được tô sáng để tương phản với Hình 2.2Vì RISC-V giải quyết từng byte, địa chỉ từ là bội số
của 4: có 4 byte trong một ô kép.

hạn chế căn chỉnh Xây dựng: Trong nhiều kiến trúc, các từ phải bắt đầu tại các địa chỉ là bội số của
Một yêu cầu rằng dữ liệu 4. Yêu cầu này được gọi là an hạn chế căn chỉnh(.Chương 4 gợi ý tại sao căn chỉnh
được căn chỉnh trong bộ dẫn đến chuyển dữ liệu nhanh hơn.) RISC-V và Intel x86 làm không phải có các hạn
nhớ trên các ranh giới tự chế căn chỉnh, nhưng MIPS thì có.
nhiên.
phần mềm
Giao diện
phần
cứng /
Vì các địa chỉ trong tải
và lưu trữ là số nhị phân,
chúng ta có thể thấy tại
sao DRAM cho bộ nhớ
chính có kích thước nhị
phân thay vì kích thước
thập phân. Đó là, trong
gibibytes (230) hoặc
tebibyte (240), không
tính bằng gigabyte (109)
hoặc terabyte (1012);
xem Hình 1.1.
2.3 Hoạt động của phần cứng máy tính 77

Biên dịch bằng cách sử dụng Tải và lưu trữ

Giả sử biến h được liên kết với đăng ký x21 và địa chỉ cơ sở của mảng A là
trong x22Mã lắp ráp RISC-V cho câu lệnh gán C dưới đây là gì. VÍ DỤ
A [12] = h + A [8];

Mặc dù có một thao tác duy nhất trong câu lệnh C, nhưng bây giờ hai trong
số các toán hạng đã ở trong bộ nhớ, vì vậy chúng tôi cần nhiều hướng dẫn
RISC-V hơn nữa. Hai hướng dẫn đầu tiên giống như trong ví dụ trước, ngoại TRẢ LỜI
trừ lần này chúng tôi sử dụng độ lệch thích hợp là 32 cho địa chỉ byte trong
hướng dẫn đăng ký tải để chọn A [8]và thêm hướng dẫn đặt tổng trong x9:

lw x9, 32 (x22) // Reg tạm thời x9 được A [8]


thêm x9, x21, x9 // Reg tạm thời x9 được h + A [8]

Các hướng dẫn cuối cùng lưu trữ tổng vào A [12], sử dụng 48 (4 × 12) làm
phần bù và đăng ký x22 như đăng ký cơ sở.

sw x9, 48 (x22) // Cửa hàng h + A [8] trở lại A [12]

Tải từ và lưu trữ từ là các hướng dẫn sao chép từ giữa bộ nhớ và các thanh ghi
trong kiến trúc RISC-V. Một số nhãn hiệu máy tính sử dụng các hướng dẫn khác
cùng với tải và lưu trữ để truyền dữ liệu. Một kiến trúc với các lựa chọn thay thế
như vậy là Intel x86, được mô tả trong Mục 2.17.

Nhiều chương trình có nhiều biến hơn máy tính có thanh ghi. Do đó, trình biên Giao diện
dịch cố gắng giữ các biến được sử dụng thường xuyên nhất trong các thanh ghi phần
và đặt phần còn lại vào bộ nhớ, sử dụng tải và lưu trữ để di chuyển các biến giữa
các thanh ghi và bộ nhớ. Quá trình đưa các biến ít được sử dụng (hoặc các biến cứng /
cần thiết sau này) vào bộ nhớ được gọi tràn ra sổ đăng ký. phần
Nguyên tắc phần cứng liên quan đến kích thước và tốc độ cho thấy bộ nhớ mềm
phải chậm hơn các thanh ghi, vì có ít thanh ghi hơn. Gợi ý này thực sự là trường
hợp; truy cập dữ liệu sẽ nhanh hơn nếu dữ liệu nằm trong sổ đăng ký thay vì bộ
nhớ.
Hơn nữa, dữ liệu hữu ích hơn khi đăng ký. Một lệnh số học RISC-V có thể
đọc hai thanh ghi, hoạt động trên chúng và viết kết quả. Một lệnh truyền dữ liệu
RISC-V chỉ đọc một toán hạng hoặc ghi một toán hạng mà không hoạt động trên
nó.
78 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Vì vậy, các thanh ghi mất ít thời gian hơn để truy cập và có thông lượng cao hơn
bộ nhớ, làm cho dữ liệu trong các thanh ghi nhanh hơn đáng kể để truy cập và sử
dụng đơn giản hơn. Truy cập các thanh ghi cũng sử dụng ít năng lượng hơn nhiều so
với truy cập bộ nhớ. Để đạt được hiệu suất cao nhất và bảo tồn năng lượng, kiến trúc
tập lệnh phải có đủ thanh ghi và trình biên dịch phải sử dụng các thanh ghi một cách
hiệu quả.

Xây dựng: Hãy để đặt năng lượng và hiệu suất của các thanh ghi so với bộ nhớ
vào phối cảnh. Giả sử dữ liệu 32 bit, các thanh ghi nhanh hơn khoảng 200 lần (0,25
so với. 50 nano giây) và tiết kiệm năng lượng hơn 10.000 lần (0,1 so với. 1000
picoJoules) so với DRAM năm 2020. Những khác biệt lớn này đã dẫn đến bộ nhớ
cache, làm giảm hiệu suất và hình phạt năng lượng của việc đi vào bộ nhớ (xem
Chương 5).

Hoạt động không đổi hoặc ngay lập tức


Chẳng hạn, nhiều lần một chương trình sẽ sử dụng một hằng số trong một hoạt
động, ví dụ, tăng một chỉ mục để trỏ đến phần tử tiếp theo của một mảng. Trên
thực tế, hơn một nửa các hướng dẫn số học RISC-V có hằng số là một toán hạng
khi chạy các điểm chuẩn của CPU CPU2006.
Chỉ sử dụng các hướng dẫn chúng tôi đã thấy cho đến nay, chúng tôi sẽ phải
tải một hằng số từ bộ nhớ để sử dụng một. (Các hằng số sẽ được đặt trong bộ nhớ
khi chương trình được tải.) Ví dụ: để thêm hằng số 4 để đăng ký x22, chúng ta có
thể sử dụng mã
lw x9, AddrConstant4 (x3) // x9 = hằng số 4
thêm x22, x22, x9 // x22 = x22 + x9 (trong đó x9 == 4)

giả sử rằng x3 + AddrConstant4 là địa chỉ bộ nhớ của hằng số 4. Một giải pháp
thay thế tránh hướng dẫn tải là cung cấp các phiên bản của số học
hướng dẫn trong đó một toán hạng là một hằng số. Hướng dẫn thêm nhanh này
với một toán hạng không đổi được gọi thêm ngay lập tức hoặc là addi Để thêm 4
để đăng ký. x22, chúng tôi chỉ viết
addi x22, x22, 4 // x22 = x22 + 4
Các toán hạng không đổi xảy ra thường xuyên; thật, addi là hướng dẫn phổ
biến nhất trong hầu hết các chương trình RISC-V. Bằng cách bao gồm các hằng
số bên trong các hướng dẫn số học, các phép toán nhanh hơn nhiều và sử dụng ít
năng lượng hơn so với khi các hằng số được tải từ bộ nhớ.
Số 0 không đổi có một vai trò khác, đó là đơn giản hóa tập lệnh bằng cách
cung cấp các biến thể hữu ích. Ví dụ: bạn có thể phủ nhận giá trị trong một thanh
ghi bằng cách sử dụng phụ hướng dẫn với số không cho toán hạng đầu tiên. Do
đó, RISC-V dành đăng ký x0 được kết nối với giá trị bằng không. Sử dụng tần số
để biện minh cho các vùi của hằng số là một ví dụ khác về ý tưởng tuyệt vời từ
đó Chương 1 làm cho trường hợp phổ biến nhanh.
2.3 Hoạt động của phần cứng máy tính 79

Do tầm quan trọng của các thanh ghi, tốc độ tăng số lượng thanh ghi trong chip Kiểm tra
theo thời gian là bao nhiêu? Bản thân bạn
1. Rất nhanh: Chúng tăng nhanh như Moore Moore Law, dự đoán sẽ tăng gấp
đôi số lượng bóng bán dẫn trên một con chip cứ sau 24 tháng.
2. Rất chậm: Vì các chương trình thường được phân phối bằng ngôn ngữ của
máy tính, nên có quán tính trong kiến trúc tập lệnh và do đó số lượng
thanh ghi chỉ tăng nhanh khi các bộ lệnh mới trở nên khả thi.

Xây dựng: Mặc dù các thanh ghi RISC-V trong cuốn sách này rộng 32 bit, RISC-V
các kiến trúc sư đã hình thành nhiều biến thể của ISA. Ngoài biến thể này, được gọi
là RV32, một biến thể có tên RV64 có các thanh ghi 64 bit, có địa chỉ lớn hơn giúp
RV64 phù hợp hơn với bộ xử lý cho máy chủ và điện thoại thông minh.

Xây dựng: Độ lệch RISC-V cộng với địa chỉ đăng ký cơ sở là một kết hợp tuyệt vời các
cấu trúc cũng như các mảng, vì thanh ghi có thể trỏ đến điểm bắt đầu của cấu trúc và
phần bù có thể chọn phần tử mong muốn. Chúng tôi sẽ thấy một ví dụ như vậy trong Mục
2.13.

Xây dựng: Sổ đăng ký trong hướng dẫn truyền dữ liệu ban đầu được phát minh ra giữ
một chỉ mục của một mảng với phần bù được sử dụng cho địa chỉ bắt đầu của một mảng.
Do đó, thanh ghi cơ sở cũng được gọi là đăng ký chỉ sốNgày nay, bộ nhớ của Nhật Bản
lớn hơn nhiều và mô hình phần mềm phân bổ dữ liệu phức tạp hơn, do đó địa chỉ cơ sở
của mảng thường được chuyển trong một thanh ghi vì nó đã thắng phù hợp với phần bù,
như chúng ta sẽ thấy.

Xây dựng: Việc di chuyển từ máy tính địa chỉ 32 bit sang địa chỉ 64 bit máy tính để lại
trình biên dịch cho người viết lựa chọn kích thước của các loại dữ liệu trong C. Rõ ràng,
con trỏ phải là 64 bit, nhưng còn số nguyên thì sao? Hơn nữa, C có các loại dữ liệu int, dài
int, và dài intCác vấn đề đến từ việc chuyển đổi từ một loại dữ liệu sang. khác và có một
sự tràn bất ngờ trong mã C không tuân thủ đầy đủ tiêu chuẩn, điều không may là không
phải là mã hiếm. Bảng dưới đây cho thấy hai tùy chọn phổ biến :

Hệ điều hành con trỏ int int dài dài int


Microsoft Windows 64 bit 32 bit 32 bit 64 bit
Linux, Unix nhất 64 bit 32 bit 64 bit 64 bit
80 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

2.4 Số đã ký và chưa ký

Đầu tiên, hãy nhanh chóng xem lại cách một máy tính đại diện cho các con số.
Bởi vì mọi người có 10 ngón tay, chúng tôi được dạy để suy nghĩ trong cơ sở 10,
nhưng số có thể được biểu thị trong bất kỳ cơ sở nào. Ví dụ: 123 cơ sở 10 =
1111011 cơ sở 2.
Các số được giữ trong phần cứng máy tính dưới dạng một loạt tín hiệu điện tử
cao và thấp, và do đó chúng được coi là số cơ sở 2. (Giống như số cơ sở 10 được
gọi số thập phân số, số cơ sở 2 được gọi nhị phân số.)
chữ số nhị phân Do đó, một chữ số của một số nhị phân là nguyên tử của máy tính, vì tất cả các
Cũng thế gọi là bit. thông tin được cấu thành từ chữ số nhị phân hoặc là bitKhối xây dựng cơ bản
Một trong hai số này có thể là một trong hai giá trị, có thể được coi là một số lựa chọn thay thế:
trong cơ sở 2, 0 hoặc cao hay thấp, bật hoặc tắt, đúng hoặc sai hoặc 1 hoặc 0.
1, đó là các thành
Tổng quát hóa điểm, trong bất kỳ cơ sở số, giá trị của Tôichữ số d là
phần của thông tin.
d 3 Căn cứTôi
Ở đâu Tôi bắt đầu từ 0 và tăng từ phải sang trái. Biểu diễn này dẫn đến một cách
rõ ràng để đánh số các bit trong từ kép: chỉ cần sử dụng sức mạnh của cơ sở cho
bit đó. Chúng tôi đăng ký số thập phân với mười và số nhị phân với haiVí dụ,.
1011hai
đại diện
(1 × 23) + (0 × 22) + (1 × 21) + (1 × 20)mười = (1 × 8) + (0 × 4)
+ (1 × 2) + (1 × 1)mười
= số 8 + 0 + 2 + 1mười
= 11mười
Chúng tôi đánh số các bit 0, 1, 2, 3, ... từ phải sang trái trong một từ đôi. Bản vẽ
dưới đây cho thấy việc đánh số các bit trong một từ RISC-V và vị trí của số
1011hai:

ít quan trọng nhất Các Vì các từ được vẽ theo chiều dọc cũng như chiều ngang, ngoài cùng bên trái và
bit ngoài cùng bên phải ngoài cùng bên phải có thể không rõ ràng. Do đó, cụm từ ít quan trọng nhất được
trong một từ RISC-V. sử dụng để chỉ bit ngoài cùng bên phải (bit 0 ở trên) và bit quan trọng nhất đến bit
ngoài cùng bên trái (bit 31).
bit quan trọng nhất
Từ RISC-V dài 32 bit, vì vậy nó có thể đại diện cho 2 32 các mẫu 32 bit khác nhau.
Các bit ngoài cùng bên
trái trong một từ RISC-V.
Việc để các kết hợp này đại diện cho các số từ 0 đến 2 là điều tự nhiên32 -1
(4.294.967.295mười):
2.4 Số đã ký và chưa ký 81

00000000 00000000 0000000 00000000 hai = 0mười


00000000 00000000 0000000 00000001 hai = 1mười
00000000 00000000 0000000 00000010hai = 2mười
. . . . . .

11111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111 hai = 4.294.967.293mười
11111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111 hai = 4.294.967.294mười
11111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111 hai = 4.294.967.295mười

Nghĩa là, số nhị phân 32 bit có thể được biểu thị theo giá trị bit nhân với công
suất 2 (ở đây xTôi có nghĩa là Tôichút của x):

Vì những lý do chúng ta sẽ sớm thấy, những con số dương này được gọi là số
chưa ký.
Các chương trình
máy tính tính toán cả
số dương và số âm,
vì vậy chúng ta cần
Cơ sở 2 không tự nhiên đối với con người; chúng tôi có 10 ngón tay và vì vậy tìm một đại diện để phân
cơ sở 10 tự nhiên. Tại sao máy tính không sử dụng số thập phân? Trong thực tế, biệt số dương với số
máy tính thương mại đầu tiên đã làm cung cấp số học thập phân. Vấn đề là máy âm. Giải pháp rõ
tính vẫn sử dụng tín hiệu bật và tắt, do đó, một chữ số thập phân được biểu thị đơn ràng nhất là thêm
giản bằng một số chữ số nhị phân. Decimal đã chứng minh không hiệu quả đến một dấu hiệu riêng
mức các máy tính tiếp theo trở lại tất cả nhị phân, chuyển đổi thành cơ sở 10 chỉ biệt, có thể được thể
cho các sự kiện đầu vào / đầu ra tương đối không thường xuyên. hiện một cách thuận
tiện trong một bit
duy nhất; tên cho đại
Hãy nhớ rằng các mẫu bit nhị phân ở trên chỉ đơn giản là đại diện số. Các số thực diện này là dấu hiệu
sự có vô số chữ số, với hầu hết tất cả là 0 ngoại trừ một vài chữ số ngoài cùng bên và cường độ.
phải. Chúng tôi chỉ không thường xuyên hiển thị 0s hàng đầu. Than ôi, dấu hiệu
Phần cứng có thể được thiết kế để thêm, trừ, nhân và chia các mẫu bit nhị và đại diện cường độ
phân này, như chúng ta sẽ thấy Chương 3. Nếu số là kết quả thích hợp của các có một số thiếu sót.
thao tác đó không thể được biểu thị bằng các bit phần cứng ngoài cùng bên phải Đầu tiên, nó không rõ
này , tràn được cho là đã xảy ra. Nó có thể sử dụng ngôn ngữ lập trình, hệ điều ràng nơi để đặt bit dấu
hành và chương trình để xác định phải làm gì nếu xảy ra tràn. hiệu. Bên phải? Bên
trái? Máy tính sớm đã
thử cả hai. Thứ hai, người thêm cho dấu hiệu và cường độ có thể cần thêm một bước
để đặt dấu hiệu

Giao diện
phần
cứng /
phần
mềm

tràn khi nào kết quả


của một hoạt động lớn
hơn được thể hiện trong
một thanh ghi
82 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

bởi vì chúng tôi có thể biết trước dấu hiệu thích hợp của số tiền sẽ là gì. Cuối cùng,
một bit dấu hiệu riêng biệt có nghĩa là dấu hiệu và cường độ có cả số dương và số 0
âm, có thể dẫn đến các vấn đề cho các lập trình viên không tập trung. Vì những thiếu
sót này, biểu diễn dấu hiệu và cường độ đã sớm bị bỏ rơi.
Trong quá trình tìm kiếm một giải pháp thay thế hấp dẫn hơn, câu hỏi đặt ra là
kết quả của những con số chưa ký nếu chúng ta cố gắng trừ một số lượng lớn từ
một số nhỏ. Câu trả lời là nó sẽ cố gắng mượn từ một chuỗi 0 hàng đầu, vì vậy
kết quả sẽ có một chuỗi 1 hàng đầu.
Cho rằng không có sự thay thế rõ ràng nào tốt hơn, giải pháp cuối cùng là chọn
đại diện làm cho phần cứng trở nên đơn giản: 0s hàng đầu có nghĩa là tích cực và
dẫn 1s có nghĩa là tiêu cực. Quy ước này để đại diện cho số nhị phân đã ký được
gọi bổ sung hai đại diện (Một xây dựng trên trang 81 giải thích tên bất thường
này) :
00000000 00000000 0000000 00000000 hai = 0mười
00000000 00000000 0000000 00000001hai = 1mười
00000000 00000000 0000000 00000010 hai = 2mười
. . . . . .
01111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111hai = 2.147.483.645mười
01111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111hai = 2.147.483.646mười
01111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111hai = 2.147.483.647mười
10000000 00000000 0000000 00000000 hai = - 2.147.483.648mười
10000000 00000000 0000000 00000001hai = - 2.147.483.647mười
10000000 00000000 0000000 00000010 hai = -
2.147.483.646mười ... . . .
11111111 111111111 1111111111111111two = - 3mười
11111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111hai = - 2mười
11111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111hai = - 1mười
Một nửa số dương, từ 0 đến 2.147.483.647mười (231−1), sử dụng cùng một đại
diện như trước đây. Mẫu bit sau (1000 ... 0000hai) đại diện cho số âm nhất -
2.147.483.648mười (−231). Tiếp theo là một tập hợp các số âm giảm dần: -
2.147.483.647mười (1000 ... 0001hai) xuống −1mười (1111 ... 1111hai).
Bổ sung hai có một số âm không có số dương tương ứng: -2.147.483.648mười
Sự mất cân bằng như vậy cũng là một mối lo ngại đối với lập trình viên không
tập trung, nhưng dấu hiệu và cường độ có vấn đề đối với cả lập trình viên. và nhà
thiết kế phần cứng. Do đó, mỗi máy tính ngày nay sử dụng hai biểu diễn nhị phân
bổ sung cho các số đã ký.
2.4 Số đã ký và chưa ký 83

Đại diện bổ sung của Two có lợi thế là tất cả các số âm đều có 1 trong bit quan
trọng nhất. Do đó, phần cứng chỉ cần kiểm tra bit này để xem một số dương hay
âm (với số 0 được coi là dương). Bit này thường được gọi là ký bitBằng cách
nhận ra vai trò của bit dấu, chúng ta có thể biểu thị các số 32 bit dương và âm
theo giá trị bit nhân với công suất 2 :.

Bit ký hiệu được nhân với −231và phần còn lại của các bit sau đó được nhân
với các phiên bản dương của các giá trị cơ sở tương ứng của chúng.

Chuyển đổi nhị phân sang thập phân


VÍ DỤ
Giá trị thập phân của số bổ sung hai bit 32 bit này là bao nhiêu?

11111111 111111111 111111111 11111100 hai

Thay thế các giá trị bit số thành công thức trên : TRẢ LỜI

Chúng tôi sẽ thấy một lối tắt để đơn giản hóa việc chuyển đổi từ tiêu cực sang
tích cực sớm.

Giống như một thao tác trên các số chưa ký có thể làm tràn khả năng của phần
cứng để thể hiện kết quả, do đó, một thao tác trên hai số bổ sung có thể. Tràn xảy ra
khi bit được giữ lại ngoài cùng bên trái của mẫu bit nhị phân không giống với số chữ
số vô hạn ở bên trái (bit dấu là không chính xác): 0 ở bên trái của mẫu bit khi số âm
hoặc 1 khi số dương.
84 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Giao diện Đã ký so với không dấu áp dụng cho tải cũng như số học. Các chức năng của một
phần tải đã ký là sao chép dấu hiệu liên tục để điền vào phần còn lại của thanh ghi được
cứng / gọi là ký tên phần mở rộng-Nhưng nó mục đích là đặt một đại diện chính xác của
số bên trong đăng ký đó. Tải không dấu chỉ đơn giản là điền 0s ở bên trái dữ liệu,
phần vì số được biểu thị bằng mẫu bit không được ký.
mềm Khi tải một từ 32 bit vào một thanh ghi 32 bit, điểm đó là moot; tải đã ký và
không dấu là giống hệt nhau. RISC-V cung cấp hai hương vị của tải byte : tải byte
không dấu (lbu) coi byte là một số chưa ký và do đó không mở rộng để điền các bit
ngoài cùng bên trái của thanh ghi, trong khi tải byte (lb) hoạt động với các số nguyên
đã ký. Vì các chương trình C hầu như luôn sử dụng byte để thể hiện các ký tự thay vì
coi byte là số nguyên được ký rất ngắn , lbu được sử dụng thực tế dành riêng cho tải
byte.

Giao diện Không giống như các số đã ký được thảo luận ở trên, địa chỉ bộ nhớ tự nhiên bắt
phần đầu từ 0 và tiếp tục đến địa chỉ lớn nhất. Đặt một cách khác, địa chỉ tiêu cực
không có ý nghĩa. Do đó, các chương trình muốn đối phó đôi khi với các số có
cứng / thể dương hoặc âm và đôi khi với các số chỉ có thể dương. Một số ngôn ngữ lập
phần trình phản ánh sự khác biệt này. C, ví dụ, tên trước đây số nguyên (tuyên bố là int
mềm trong chương trình) và sau này số nguyên không dấu (không dấu int). Một số
hướng dẫn phong cách C thậm chí khuyên bạn nên khai báo trước đây là ký int để
giữ sự phân biệt rõ ràng.

Hãy cùng kiểm tra hai phím tắt hữu ích khi làm việc với hai số bổ sung. Phím
tắt đầu tiên là một cách nhanh chóng để phủ nhận một số nhị phân bổ sung hai.
Đơn giản chỉ cần đảo ngược mỗi 0 đến 1 và mỗi 1 đến 0, sau đó thêm một kết quả.
Phím tắt này dựa trên quan sát rằng tổng của một số và biểu diễn ngược của nó
phải là 111 ... 111hai, đại diện cho −1. Kể từ đó x 1 x 521, do đó x 1 x 1 1 5 0 hoặc
là x 1 1 52x (Chúng tôi sử dụng ký hiệu. x có nghĩa là đảo ngược mọi bit trong x
từ 0 đến 1 và ngược lại.)

Phím tắt phủ định


VÍ DỤ
Cổng 2mười, và sau đó kiểm tra kết quả bằng cách phủ nhận −2 mười.

2mười = 00000000 00000000 00000000 00000010hai


TRẢ LỜI
2.4 Số đã ký và chưa ký 85

Phủ định số này bằng cách đảo ngược các bit và thêm một ,

Đi theo hướng khác ,

11111111 111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111hai

đầu tiên được đảo ngược và sau đó tăng :

Phím tắt tiếp theo của chúng tôi cho chúng tôi biết cách chuyển đổi số nhị
phân được thể hiện trong n bit đến một số được biểu thị với nhiều hơn n bit. Phím
tắt là lấy bit quan trọng nhất từ số lượng nhỏ hơn, bit ký hiệu và sao chép nó để
điền vào các bit mới của số lượng lớn hơn. Các bit không cần thiết cũ được sao
chép đơn giản vào phần bên phải của ô kép mới. Phím tắt này được gọiký gia hạn.

VÍ DỤ
Dấu hiệu mở rộng lối tắt

Chuyển đổi phiên bản nhị phân 16 bit của 2mười và −2mười số nhị phân TRẢ LỜI
32 bit. Phiên bản nhị phân 16 bit của số 2 là

00000000 00000010hai = 2mười

Nó được chuyển đổi thành số 32 bit bằng cách tạo 16 bản sao của giá trị trong
bit quan trọng nhất (0) và đặt nó ở bên trái của từ. Phần bên phải có giá trị cũ :
00000000 00000000 0000000 00000010 hai = 2mườiM
86 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Hãy để phủ nhận phiên bản 16 bit của 2 bằng cách sử dụng phím tắt trước đó.
Như thế,

0000 0000 0000 0010hai

trở thành
1111 1111 1111 1101hai
+ 1
hai

= 1111 1111 1111 1110hai


Tạo phiên bản 32 bit của số âm có nghĩa là sao chép bit dấu 16 lần và đặt
nó ở bên trái :
11111111 111111111
11111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111hai = −2mười

Thủ thuật này hoạt động vì hai số bổ sung tích cực của cộng đồng thực sự có số 0
vô hạn ở bên trái và hai số bổ sung âm có số lượng vô hạn là 1 giây. Mẫu bit nhị
phân đại diện cho một số ẩn các bit hàng đầu để phù hợp với chiều rộng của phần
cứng; phần mở rộng ký chỉ đơn giản là khôi phục một số trong số họ.

Tóm tắt
Điểm chính của phần này là chúng ta cần thể hiện cả số nguyên dương và số âm
trong máy tính, và mặc dù có những ưu và nhược điểm đối với bất kỳ tùy chọn
nào, sự lựa chọn nhất trí kể từ năm 1965 đã được bổ sung hai.

Kiểm tra Xây dựng: Đối với số thập phân đã ký, chúng tôi đã sử dụng-Để thể hiện tiêu cực
Bản thân bởi vì không có giới hạn về kích thước của một số thập phân. Cho kích thước dữ liệu
bạn cố định, nhị phân và thập lục phân (xem Hình 2.4) chuỗi bit có thể mã hóa dấu hiệu;
do đó, chúng ta thường không sử dụng+Mùi hay-Có ký hiệu nhị phân hoặc thập lục
phân.

Giá trị thập phân của số bổ sung hai bit 64 bit này là bao nhiêu?

11111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111hai

1) -4mười
2) -số 8mười không dấu 64 bit?
3) -16mười
4) 18.446.744
.073.709.5
51.608mười

G
i
á
tr

t
h

p
p
h
â
n
l
à
b
a
o
n
h
i
ê
u
n
ế
u
t
h
a
y
v
à
o
đ
ó
l
à
m

t
s

2.5 Hướng dẫn đại diện trong máy tính 87

Xây dựng: Bổ sung Two có tên của nó từ quy tắc mà tổng không dấu của một n-
bit số và của nó n-bit âm là 2n; do đó, sự phủ định hoặc bổ sung của một số x là 2n - x,
hoặc bổ sung của nó hai lần.Giáo dục một bổ sung A ký hiệu
Một đại diện thay thế thứ ba cho hai bổ sung và dấu hiệu và cường độ được gọi một bổ đại diện cho giá trị âm
sungÂm tính của một bổ sung một được tìm thấy bằng cách đảo ngược từng bit, từ. 0 đến 1 và nhất bằng 10 ... 000hai và
từ 1 đến 0, hoặc x Mối quan hệ này giúp giải thích tên của nó kể từ khi bổ sung. x là 2n - x - 1.
giá trị tích cực nhất của
Đó cũng là một nỗ lực để trở thành một giải pháp tốt hơn so với dấu hiệu và cường độ, và một
1 ... 11hai, để lại một số
số máy tính khoa học ban đầu đã sử dụng ký hiệu. Đại diện này tương tự như lượng tiêu cực bằng nhau
và tích cực nhưng kết
hai bổ sung ngoại trừ nó cũng có hai số 0: 00 ... 00hai là dương 0 và 11 ... 11hai là âm 0. Số
thúc với hai số không,
âm nhất, 10 ... 000hai, đại diện -2.147.483.647mười, và do đó, các mặt tích cực và tiêu cực
một số dương (00 ... 00hai)
được cân bằng. Một bổ sung bổ sung đã làm
và một tiêu cực (11 ...
cần một bước thêm để trừ một số, và do đó hai bổ sung thống trị ngày hôm nay. Một ký
11hai). Thuật ngữ này
hiệu cuối cùng, mà chúng ta sẽ xem xét khi chúng ta thảo luận về điểm nổi Chương 3, là
cũng được sử dụng để chỉ
để biểu thị giá trị âm nhất bằng 00 ... 000hai và giá trị tích cực nhất của
đảo ngược của mọi bit
11 ... 11hai, với 0 thường có giá trị 10 ... 00hai Đại diện này được gọi là a. ký hiệu trong một mẫu: 0 đến 1
thiên vị, vì nó thiên vị số sao cho số cộng với độ lệch có a đại diện không tiêu cực. và 1 đến 0.
ký hiệu thiên vị A ký
hiệu đại diện cho giá trị
âm nhất bằng 00 000
2.5 Hướng dẫn đại diện trong máy tính 000hai và giá trị tích cực
nhất của
11 ... 11hai, với 0
Bây giờ chúng tôi đã sẵn sàng để giải thích sự khác biệt giữa cách con người thường có
hướng dẫn máy tính và cách máy tính nhìn thấy hướng dẫn. giá trị 10 00hai, do đó làm
Các hướng dẫn được giữ trong máy tính dưới dạng một loạt tín hiệu điện tử cao và sai lệch số sao cho số
thấp và có thể được biểu diễn dưới dạng số. Trong thực tế, mỗi phần của một hướng dẫn cộng với độ lệch có biểu
diễn không âm.
có thể được coi là một số riêng lẻ và đặt các số này cạnh nhau tạo thành hướng dẫn. 32
thanh ghi của RISC-V chỉ được gọi bằng số của chúng, từ 0 đến 31.

VÍ DỤ
Dịch một Hướng dẫn lắp ráp RISC-V thành Hướng dẫn
máy

Hãy để Lừa làm bước tiếp theo trong việc tinh chỉnh ngôn ngữ RISC-V làm
ví dụ. Chúng tôi sẽ hiển thị phiên bản ngôn ngữ RISC-V thực của hướng dẫn
được biểu thị một cách tượng trưng như
thêm x9, x20, x21

đầu tiên là sự kết hợp của số thập phân và sau đó là số nhị phân. Các TRẢ LỜI
đại diện thập phân là

0 21 20 0 9 51
88 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Mỗi phân đoạn của một hướng dẫn được gọi là a cánh đồng Các trường thứ
nhất, thứ tư và thứ sáu (chứa 0, 0 và 51 trong trường hợp này) nói chung với
máy tính RISC-V rằng hướng dẫn này thực hiện bổ sung. Trường thứ hai cung
cấp số lượng thanh ghi là toán hạng nguồn thứ hai của hoạt động bổ sung (21
cho. x21) và trường thứ ba cung cấp cho toán hạng nguồn khác cho phép cộng
(20 cho x20). Trường thứ năm chứa số lượng thanh ghi sẽ nhận được tổng (9
cho x9). Vì vậy, hướng dẫn này thêm đăng ký x20 đăng ký x21 và đặt tổng
trong đăng ký x9.
Hướng dẫn này cũng có thể được biểu diễn dưới dạng các trường số nhị
phân thay vì thập phân :
0000000 10101 10100 000 01001 0110011
7 bit 5 bit 5 bit 3 bit 5 bit 7 bit

định dạng hướng dẫn Bố cục này của hướng dẫn được gọi là định dạng hướng dẫnNhư bạn có thể
A hình thức biểu diễn thấy từ việc đếm số bit, lệnh RISC-V này lấy chính xác 32 bit. Theo nguyên tắc
của một lệnh bao gồm thiết kế của chúng tôi rằng sự đơn giản ủng hộ tính đều đặn, các hướng dẫn
các trường số nhị phân.
RISC-V đều dài 32 bit.
Máy móc Để phân biệt với ngôn ngữ lắp ráp, chúng tôi gọi phiên bản số của hướng dẫn
ngôn ngữ Nhị phân ngôn ngữ máy móc và một chuỗi các hướng dẫn như vậy mã máy.
đại diện được sử dụng Có vẻ như bây giờ bạn sẽ đọc và viết các chuỗi nhị phân dài, mệt mỏi. Chúng
cho tôi tránh tedium đó bằng cách sử dụng một cơ sở cao hơn nhị phân dễ dàng
giao tiếp trong một
hệ thống máy tính.
chuyển đổi thành nhị phân. Vì hầu hết tất cả các kích thước dữ liệu máy tính là
bội số của 4 , thập lục phân (cơ sở 16) số là phổ biến. Vì cơ sở 16 là lũy thừa 2,
thập lục phân Số chúng ta có thể chuyển đổi tầm thường bằng cách thay thế mỗi nhóm bốn chữ số
trong căn cứ 16. nhị phân bằng một chữ số thập lục phân duy nhất và ngược lại. Hình 2.4 chuyển
đổi giữa thập lục phân và nhị phân.

HÌNH 2.4 Bảng chuyển đổi nhị phân thập lục phân. Chỉ cần thay thế một chữ số thập lục phân bằng bốn chữ số nhị phân tương ứng ,
và ngược lại. Nếu độ dài của số nhị phân không phải là bội số của 4, hãy đi từ phải sang trái.

Vì chúng tôi thường xuyên xử lý các cơ sở số khác nhau, để tránh nhầm lẫn,
chúng tôi sẽ đăng ký số thập phân với mười, số nhị phân với haivà số thập lục
phân với hex(Nếu không có chỉ mục, mặc định là cơ sở 10.) Nhân tiện, C và Java
sử dụng ký hiệu 0x.nnnn cho số thập lục phân.
2.5 Hướng dẫn đại diện trong máy tính 89

Nhị phân đến Hexadecimal và Back


VÍ DỤ
Chuyển đổi các số nhị phân 8 chữ số và 32 bit sau đây thành cơ sở khác :
eca8 6420hex
0001 0011 0101 0111 1001 1011 1101 1111 hai

Sử dụng Hình 2.4, câu trả lời chỉ là một cái nhìn bàn một cách :

eca8 6420hex TRẢ LỜI

1110 1100 1010 1000 0110 0100 0010 0000hai

Và rồi hướng khác :

0001 0011 0101 0111 1001 1011 1101 1111hai

1357 9bdfhex

Các trường RISC-V


Các trường RISC-V được đặt tên để giúp chúng dễ thảo luận hơn :

func7 rs2 rs1 func3 thứ hai opcode


7 bit 5 bit 5 bit 3 bit 5 bit 7 bit

Dưới đây là ý nghĩa của từng tên của các trường trong hướng dẫn RISC-V :
n opcode: Hoạt động cơ bản của hướng dẫn, và viết tắt này là của nó tên
opcode Lĩnh vực đó
truyền thống. biểu thị hoạt động và
n thứ : Các operand đích đăng ký. Nó nhận được kết quả của hoạt động. định dạng của một hướng
dẫn.
n func3 : Một trường opcode bổ sung.
n rs1 : Các operand nguồn đăng ký đầu tiên.
n rs2 : Các operand nguồn đăng ký thứ hai.
n func7 : Một trường opcode bổ sung.
90 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Một vấn đề xảy ra khi một hướng dẫn cần các trường dài hơn các trường được
hiển thị ở trên. Ví dụ: lệnh thanh ghi tải phải chỉ định hai thanh ghi và một hằng
số. Nếu địa chỉ sử dụng một trong các trường 5 bit ở định dạng trên, hằng số lớn
nhất trong hướng dẫn đăng ký tải sẽ chỉ giới hạn ở 25−1 hoặc 31. Hằng số này
được sử dụng để chọn các phần tử từ mảng hoặc cấu trúc dữ liệu và nó thường
cần lớn hơn 31. Trường 5 bit này quá nhỏ để có ích.
Do đó, chúng tôi có một mâu thuẫn giữa mong muốn giữ cho tất cả các hướng
dẫn có cùng độ dài và mong muốn có một định dạng hướng dẫn duy nhất. Xung
đột này dẫn chúng ta đến nguyên tắc thiết kế phần cứng cuối cùng :
Nguyên tắc thiết kế 3: Thiết kế tốt đòi hỏi sự thỏa hiệp tốt.
Sự thỏa hiệp được lựa chọn bởi các nhà thiết kế RISC-V là giữ cho tất cả các
hướng dẫn có cùng độ dài, do đó yêu cầu các định dạng hướng dẫn riêng biệt cho
các loại hướng dẫn khác nhau. Ví dụ, định dạng trên được gọi Loại R (để đăng
ký). Một loại định dạng hướng dẫn thứ hai là Tôi gõ và được sử dụng bởi các
toán hạng số học với một toán hạng không đổi, bao gồm addivà bằng hướng dẫn
tải. Các trường của định dạng loại I là

ngay lập tức rs1 func3 thứ hai opcode


12 bit 5 bit 3 bit 5 bit 7 bit

Ngay lập tức 12 bit được hiểu là một giá trị bổ sung hai, do đó nó có thể đại
diện cho các số nguyên từ đó -211 đến 211-1. Khi định dạng loại I được sử dụng cho
các hướng dẫn tải, ngay lập tức biểu thị phần bù byte, do đó, lệnh từ tải có thể
tham chiếu đến bất kỳ từ nào trong một vùng ± 211 hoặc 2048 byte (± 2số 8 hoặc
512 từ) của địa chỉ cơ sở trong rd đăng ký cơ sở. Chúng tôi thấy rằng hơn 32
thanh ghi sẽ khó ở định dạng này, vì các trường rd và rs1 sẽ cần một bit khác,
khiến việc lắp mọi thứ trong một từ trở nên khó khăn hơn.
Hãy cùng xem hướng dẫn đăng ký tải từ trang 77 :

lw x9, 32 (x22) // Reg tạm thời x9 được A [8]

Ở đây, 22 (cho x22) được đặt trong trường rs1, 32 được đặt trong trường ngay
lập tức và 9 (cho x9) được đặt trong trường rd. Chúng tôi cũng cần một định dạng
cho hướng dẫn từ cửa hàng , sw, cần hai thanh ghi nguồn (cho địa chỉ cơ sở và dữ
liệu lưu trữ) và ngay lập tức để bù địa chỉ. Các trường có định dạng loại S là
ngay lập tức [11: 5] rs2 rs1 func3 ngay lập tức [4: 0] opcode
7 bit 5 bit 5 bit 3 bit 5 bit 7 bit

12 bit ngay lập tức ở định dạng loại S được chia thành hai trường, cung cấp 5 bit
thấp hơn và 7 bit trên. Các kiến trúc sư RISC-V đã chọn thiết kế này vì nó giữ các
trường rs1 và rs2 ở cùng một vị trí trong tất cả các định dạng hướng dẫn. (Hình
4.14.5 cho thấy cách phân chia này đơn giản hóa phần cứng.) Giữ các định dạng
hướng dẫn như
2.5 Hướng dẫn đại diện trong máy tính 91

tương tự như có thể làm giảm độ phức tạp phần cứng. Tương tự, các trường opcode
và func3 có cùng kích thước ở tất cả các vị trí và chúng luôn ở cùng một vị trí.
Trong trường hợp bạn đang tự hỏi, các định dạng được phân biệt bởi các giá trị
trong trường opcode: mỗi định dạng được gán một bộ giá trị opcode riêng biệt
trong trường đầu tiên (opcode) để phần cứng biết cách xử lý phần còn lại của
hướng dẫn. Hình 2.5 hiển thị các số được sử dụng trong từng trường cho các
hướng dẫn RISC-V bao phủ cho đến nay.

Mã hóa lệnh FIGURE 2.5 RISC-V. Trong bảng trên, reg reg có nghĩa là số đăng ký giữa 0 và địa chỉ 31 và
trên mạng có nghĩa là địa chỉ 12 bit hoặc hằng số. Các trường funct3 và funct7 hoạt động như các trường opcode
bổ sung.

Dịch ngôn ngữ lắp ráp RISC-V sang ngôn ngữ máy
VÍ DỤ
Bây giờ chúng ta có thể lấy một ví dụ từ những gì lập trình viên viết cho
những gì máy tính thực thi. Nếu x10 có cơ sở của mảng A và x21 tương ứng
với h, tuyên bố chuyển nhượng
A [30] = h + A [30] + 1;

được biên soạn thành

lw x9, 120 (x10) // Tạm thời reg x9 được A [30]


thêm x9, x21, x9 // Tạm thời reg x9 được h + A [30]
h + A [30]
addi x9, x9, 1 // Tạm thời reg x9 được +1
sw x9, 120 (x10) // Cửa hàng h + A [30] +1 trở lại A [30] TRẢ LỜI
Mã ngôn ngữ máy RISC-V cho ba hướng dẫn này là gì?
92 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Để thuận tiện, trước tiên hãy để đại diện cho các hướng dẫn ngôn ngữ máy
bằng cách sử dụng số thập phân. Từ Hình 2.5, chúng ta có thể xác định ba
hướng dẫn ngôn ngữ máy :

ngay lập tức rs1 func3 thứ hai opcode


120 10 2 9 3

func7 rs2 rs1 func3 thứ hai opcode


0 9 21 0 9 51

ngay lập tức rs1 func3 thứ hai opcode


1 9 0 9 19

ngay lập tức [11: 5] rs2 rs1 func3 ngay lập tức [4: 0] opcode
3 9 10 2 24 35

Các lw hướng dẫn được xác định bởi 3 (xem Hình 2.5) trong trường
opcode và 2 trong trường funct3. Thanh ghi cơ sở 10 được chỉ định trong
trường rs1 và thanh ghi đích 9 được chỉ định trong trường rd. Phần bù để
chọnA [30] (120 = 30 × 4) được tìm thấy trong trường ngay lập tức.
Các thêm lệnh sau được chỉ định với 51 trong trường opcode, 0 trong
trường func3 và 0 trong trường func7. Ba toán hạng thanh ghi (9, 21 và 9)
được tìm thấy trong các trường rd, rs1 và rs2.
Tiếp theo addi lệnh được chỉ định với 19 trong trường opcode và 0 trong
trường funct3. Các toán hạng thanh ghi (9 và 9) được tìm thấy trong các
trường rd và rs1 và phần bổ sung 1 không đổi được tìm thấy trong trường
ngay lập tức.
Các sw hướng dẫn được xác định với 35 trong trường opcode và 2 trong
trường funct3. Các toán hạng thanh ghi (9 và 10) được tìm thấy trong các
trường rs2 và rs1, tương ứng. Địa chỉ bù 120 được chia thành hai trường ngay
lập tức. Vì phần trên của phần giữ ngay lập tức bit 5 trở lên, chúng ta có thể
phân tách phần bù 120 bằng cách chia cho 25Phần trên của ngay lập tức giữ
thương số, 3 và phần dưới giữ phần còn lại, 24.
Từ 120mười = 0000011 11000hai, nhị phân tương đương với dạng thập phân là :

ngay lập tức rs1 func3 thứ hai opcode


000011110000 01010 010 01001 0000011
func7 rs2 rs1 func3 thứ hai opcode
0000000 01001 10101 000 01001 0110011
ngay lập tức rs1 func3 thứ hai opcode
00000000001 01001 000 01001 0010011
ngay lập tức [11: ngay lập tức [4:
5] rs2 rs1 func3 0] opcode
0000011 01001 01010 010 11000 0100011
2.5 Hướng dẫn đại diện trong máy tính 93

Xây dựng: Các lập trình viên ngôn ngữ lắp ráp RISC-V aren buộc phải sử dụng addi
khi làm việc với các hằng số. Các lập trình viên chỉ đơn giản là viết thêmvà trình biên dịch
tạo opcode phù hợp và định dạng lệnh phù hợp tùy thuộc vào việc các toán hạng có phải
là tất cả các thanh ghi (loại R) hay nếu một là hằng số (loại I); xem Mục 2.12Chúng tôi sử
dụng tên rõ ràng trong RISC-V cho các opcodes và định dạng khác nhau vì chúng tôi nghĩ
rằng nó ít gây nhầm lẫn hơn khi giới thiệu ngôn ngữ lắp ráp so với ngôn ngữ máy.

Xây dựng: Mặc dù RISC-V có cả hai thêm và phụ hướng dẫn, nó không có a tiểu
thư đối tác với addi Điều này là do trường tức thời đại diện cho một số nguyên bổ
sung hai, vì vậy. addi có thể được sử dụng để trừ các hằng số.

Mong muốn giữ tất cả các hướng dẫn có cùng kích thước mâu thuẫn với mong Giao diện
muốn có càng nhiều thanh ghi càng tốt. Bất kỳ sự gia tăng nào về số lượng thanh phần
ghi sử dụng tối thiểu một bit nữa trong mỗi trường thanh ghi của định dạng lệnh.
Với những hạn chế này và nguyên tắc thiết kế nhỏ hơn nhanh hơn, hầu hết các bộ
cứng /
hướng dẫn hiện nay đều có 16 hoặc 32 thanh ghi mục đích chung. phần
mềm

Hình 2.6 tóm tắt các phần của ngôn ngữ máy RISC-V được mô tả trong phần
này. Như chúng ta sẽ thấy trong Chương 4, sự giống nhau của các biểu diễn nhị
phân của các hướng dẫn liên quan đơn giản hóa thiết kế phần cứng. Những điểm
tương đồng này là một ví dụ khác về tính đều đặn trong kiến trúc RISC-V.

Kiến trúc FIGURE 2.6 RISC-V được tiết lộ thông qua Mục 2.5.Ba định dạng hướng dẫn RISC-V cho đến nay là R, I và S. The
Định dạng kiểu R có hai toán hạng đăng ký nguồn và một toán hạng thanh ghi đích. Định dạng loại I thay thế một toán hạng đăng ký nguồn
bằng 12 bit ngay lập tức cánh đồng. Định dạng kiểu S có hai toán hạng nguồn và trường tức thời 12 bit, nhưng không có toán hạng thanh ghi
đích. Trường tức thời loại S được chia thành hai phần, với các bit 11, 5 ở trường ngoài cùng bên trái và bit 4, 0 trong trường ngoài cùng bên
phải thứ hai.
94 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Các Ngày nay, máy tính của cải được xây dựng trên hai nguyên tắc chính :

LỚN 1. Hướng dẫn được thể hiện dưới dạng số.

Hình ảnh 2. Các chương trình được lưu trữ trong bộ nhớ để đọc hoặc viết, giống như
dữ liệu.
Những nguyên tắc này dẫn đến chương trình lưu trữ khái niệm; phát
minh của nó cho phép các vị thần điện toán ra khỏi chai của nó. Hình 2.7
cho thấy sức mạnh của khái niệm; cụ thể, bộ nhớ có thể chứa mã nguồn
cho chương trình soạn thảo, mã máy được biên dịch tương ứng, văn bản
mà chương trình đã biên dịch đang sử dụng và thậm chí trình biên dịch
đã tạo mã máy.
Một hậu quả của hướng dẫn là số là các chương trình thường được vận
chuyển dưới dạng tệp của số nhị phân. Hàm ý thương mại là máy tính có thể
kế thừa phần mềm làm sẵn miễn là chúng tương thích với bộ hướng dẫn
hiện có. Khả năng tương thích nhị phân như vậy, thường dẫn đến ngành
công nghiệp sắp xếp xung quanh một số lượng nhỏ các kiến trúc tập lệnh.

Ký ức
Chương trình kế toán
(mã máy)

Chương trình biên tập


(mã máy)

Trình biên dịch C


Bộ xử lý (mã máy)

Dữ liệu bảng lương

Sách văn bản

Mã nguồn trong C
cho chương trình biên
tập

HÌNH 2.7 Khái niệm chương trình lưu trữ. Các chương trình được lưu trữ cho phép một máy tính
thực hiện kế toán để trở thành, trong chớp mắt, một máy tính giúp tác giả viết một cuốn sách. Việc chuyển
đổi xảy ra đơn giản bằng cách tải bộ nhớ với các chương trình và dữ liệu và sau đó bảo máy tính bắt đầu
thực thi tại một vị trí nhất định trong bộ nhớ. Xử lý các hướng dẫn theo cách tương tự như dữ liệu đơn giản
hóa rất nhiều cả phần cứng bộ nhớ và phần mềm của hệ thống máy tính. Cụ thể, công nghệ bộ nhớ cần
thiết cho dữ liệu cũng có thể được sử dụng cho các chương trình và các chương trình như trình biên dịch,
chẳng hạn, có thể
dịch mã được viết
theo ký hiệu thuận
tiện hơn cho con
người thành mã mà
máy tính có thể hiểu.
2.6 Hoạt động logic 95

Những gì hướng dẫn RISC-V làm điều này đại diện? Chọn từ một trong bốn tùy chọn
phía dưới. Kiểm tra
Bản thân bạn
func7 rs2 rs1 func3 th opcode

h
ai
32 9 10 000 11 51

1. phụ x9, x10, x11


2. thêm x11, x9, x10
3. phụ x11, x10, x9
4. phụ x11, x9, x10
Nếu một người ở tuổi 40mười, tuổi của họ là bao nhiêu trong thập lục phân?

2.6 Hoạt động logic


Ngược lại,
Mặc dù các máy tính đầu tiên hoạt động trên các từ đầy đủ, nhưng nó đã sớm trở nên Tweedledee tiếp tục,
rõ ràng rằng nó hữu ích để hoạt động trên các trường bit trong một từ hoặc thậm chí nếu nó là như vậy, nó
trên các bit riêng lẻ. Kiểm tra các ký tự trong một từ, mỗi từ được lưu trữ dưới dạng 8 có thể là như vậy; và
bit, là một ví dụ về thao tác như vậy (xem Mục 2.9). Theo đó, các thao tác đã được nếu nó là như vậy, nó
thêm vào các ngôn ngữ lập trình và kiến trúc tập lệnh để đơn giản hóa, trong số sẽ được; nhưng vì nó
không phải là, nó
những thứ khác, việc đóng gói và giải nén các bit thành từ. Những hướng dẫn này
không phải là ai.
được gọi hoạt động logic. Hình 2.8 hiển thị các hoạt động logic trong C, Java và
Đó là logic logic.Giáo
RISC-V .
dục
Lewis Carroll , Cuộc
phiêu lưu của Alice ở
xứ sở thần tiên, 1865
Các toán tử logic FIGURE 2.8 C và Java và các hướng dẫn RISC-V tương ứng của chúng.
Một cách để thực hiện KHÔNG là sử dụng XOR với một toán hạng là tất cả các toán hạng (FFFF FFFF FFFF FFFF hex).
96 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Lớp đầu tiên của các hoạt động như vậy được gọi ca làm việc Chúng di
chuyển tất cả các bit trong một từ sang trái hoặc phải, điền vào các bit trống bằng
0s. Ví dụ, nếu đăng ký. x19 chứa đựng

00000000 00000000 00000000 00001001 hai = 9mười

và lệnh dịch chuyển sang trái 4 đã được thực thi, giá trị mới sẽ là :

00000000 00000000 0000000 10010000 hai = 144mười

Hai mặt của một ca bên trái là một ca bên phải. Tên thực tế của hai hướng dẫn
thay đổi RISC-V là chuyển sang logic ngay lập tức(slli) và chuyển ngay logic ngay
lập tức (srli). Hướng dẫn sau đây thực hiện thao tác trên, nếu giá trị ban đầu được
đăng ký x19 và kết quả sẽ đi vào đăng ký x11:

slli x11, x19, 4 // reg x11 = reg x19 <<4 bit

Các hướng dẫn thay đổi này sử dụng định dạng loại I. Vì nó không hữu ích để thay
đổi một thanh ghi 32 bit hơn 31 bit, nên chỉ có các bit thấp hơn của định dạng I
loại 12 bit ngay lập tức được sử dụng. Các bit còn lại được sử dụng lại dưới dạng
trường opcode bổ sung, func7.

func7 ngay lập tức rs1 func3 thứ hai opcode


0 4 19 1 11 19

Mã hóa của slli là 19 trong trường opcode, rd chứa 11, func3 chứa 1, rs1 chứa
19, ngay lập tức chứa 4 và func6 chứa 0.
Shift trái logic cung cấp một lợi ích tiền thưởng. Chuyển sang tráiTôibit cho kết
quả giống hệt nhau khi nhân với 2Tôi, giống như dịch chuyển một số thập phân
bằng Tôi chữ số tương đương với nhân với 10Tôi Ví dụ, ở trên. slli dịch chuyển 4,
cho kết quả tương tự như nhân với 24 hoặc 16. Mẫu bit đầu tiên ở trên đại diện cho
9 và 9 × 16 = 144, giá trị của mẫu bit thứ hai. RISC-V cung cấp loại dịch chuyển
thứ ba , dịch chuyển số học phải (srai). Biến thể này tương tự như srli, ngoại trừ
việc lấp đầy các bit bị bỏ trống ở bên trái bằng số không, nó sẽ lấp đầy chúng
bằng các bản sao của bit dấu cũ. Nó cũng cung cấp các biến thể của cả ba ca lấy
số tiền thay đổi từ một thanh ghi, thay vì từ ngay lập tức : sll, srl, và sra.
VÀ Một thao tác bit-by- Một hoạt động hữu ích khác mà cô lập các trường là VÀ (Chúng tôi viết hoa
bit logic với hai toán từ để tránh nhầm lẫn giữa hoạt động và kết hợp tiếng Anh.) VÀ là một hoạt động
hạng chỉ tính toán 1 nếu từng bit chỉ để lại 1 trong kết quả nếu cả hai bit của toán hạng là 1. Ví dụ, nếu
có 1 in cả hai toán hạng.
đăng ký. x11 chứa
2.6 Hoạt động logic 97

00000000 00000000 00001101 11000000 hai và đăng

ký x10 chứa
00000000 00000000 0011100 00000000 hai
sau đó, sau khi thực hiện hướng dẫn RISC-V

và x9, x10, x11 // reg x9 = reg x10 & reg x11


giá trị của đăng ký x9 sẽ là

00000000 00000000 00001100 00000000 hai


Như bạn có thể thấy, VÀ có thể áp dụng một mẫu bit cho một tập hợp các bit để
buộc 0 trong đó có 0 trong mẫu bit. Một mô hình bit như vậy kết hợp với AND
theo truyền thống được gọi là a mặt nạ, kể từ khi mặt nạ che giấu một số bit.
Để đặt một giá trị vào một trong những vùng biển 0 này, có tên kép đến AND HOẶC LÀ Một thao
HOẶC LÀ Đó là một hoạt động từng bit đặt 1 trong kết quả nếu. hoặc bit tác bit-by-bit logic với
operand là 1. Để giải thích, nếu các thanh ghi x10 và x11 không thay đổi so với ví hai toán hạng tính toán
1 nếu có 1 in hoặc toán
dụ trước, kết quả của hướng dẫn RISC-V
hạng.
hoặc x9, x10, x11 // reg x9 = reg x10 | reg x11 KHÔNG PHẢI Một
thao tác bit-bit logic
là giá trị này trong đăng ký x9:
với một toán hạng đảo
ngược các bit; nghĩa là,
00000000 00000000 0011101 11000000hai
nó thay thế mỗi 1 bằng
Các hoạt động logic cuối cùng là một contrarian. KHÔNG PHẢI lấy một toán 0 và mỗi 0 bằng 1.
hạng và đặt 1 trong kết quả nếu một bit toán hạng là 0 và ngược lại. Sử dụng ký XOR Một hoạt động
hiệu trước của chúng tôi, nó tính toán x . bit-by-bit hợp lý với hai
Để phù hợp với định dạng ba toán tử, các nhà thiết kế của RISC-V đã quyết toán hạng tính toán OR
định đưa vào hướng dẫn XOR (độc quyền OR) thay vì KHÔNG. Vì độc quyền độc quyền của hai toán
HOẶC tạo 0 khi các bit giống nhau và 1 nếu chúng khác nhau, tương đương với hạng. Nghĩa là, nó chỉ
KHÔNG là a xor 111 ... 111. tính 1 nếu các giá trị
Nếu đăng ký x10 không thay đổi so với ví dụ trước và đăng ký x12 có giá trị 0, khác nhau trong hai toán
hạng.
kết quả của lệnh RISC-V
xor x9, x10, x12 // reg x9 = reg x10 ^ reg x12
là giá trị này trong đăng ký x9:

00000000 00000000 00110001 11000000hai

Hình 2.8 ở trên cho thấy mối quan hệ giữa các toán tử C và Java và hướng dẫn
RISC-V. Các hằng số rất hữu ích trong các hoạt động logic cũng như trong các
phép toán số học, vì vậy RISC-V cũng cung cấp các hướng dẫn và ngay lập tức
(andi), hoặc ngay lập tức (ori), và độc quyền hoặc ngay lập tức (xori).
98 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Xây dựng: C cho phép trường bit hoặc là cánh đồng được định nghĩa trong các từ,
cả hai đều cho phép các đối tượng được đóng gói trong một từ và để phù hợp với
giao diện được thi hành bên ngoài như thiết bị I / O. Tất cả các lĩnh vực phải phù hợp
trong một từ duy nhất. Các trường là số nguyên không dấu có thể ngắn bằng 1 bit.
Trình biên dịch C chèn và trích xuất các trường bằng các hướng dẫn logic trong RISC-
V : andi, ori, slli, và srli.

Kiểm tra
Bản thân bạn Những hoạt động có thể cô lập một trường trong một từ?
1. VÀ
Tiện ích của máy tính tự 2. Một ca trái theo sau là một ca phải
động nằm ở khả năng sử
dụng một chuỗi hướng
dẫn nhất định liên tục, số
lần lặp lại bị phụ thuộc
vào kết quả tính toán....
Sự lựa chọn này có thể
được thực hiện 2.7 Hướng dẫn đưa ra quyết định
phụ thuộc vào dấu
hiệu của một số
(không được coi là Điều khác biệt một máy tính với một máy tính đơn giản là khả năng đưa ra quyết
cộng cho mục đích định. Dựa trên dữ liệu đầu vào và các giá trị được tạo trong quá trình tính toán,
máy móc). Do đó, các hướng dẫn khác nhau thực thi. Ra quyết định thường được thể hiện trong các
chúng tôi giới thiệu ngôn ngữ lập trình bằng cách sử dụng nếu tuyên bố, đôi khi kết hợp với đi đến
[hướng dẫn] (chuyển báo cáo và nhãn. Ngôn ngữ lắp ráp RISC-V bao gồm hai hướng dẫn ra quyết
giao có điều kiện định, tương tự như an nếu tuyên bố với a đi đếnHướng dẫn đầu tiên là.
[hướng dẫn]), tùy thuộc
beq rs1, rs2, L1
vào dấu hiệu của một số
nhất định, khiến cho Hướng dẫn này có nghĩa là đi đến tuyên bố được dán nhãn L1 nếu giá trị trong
một trong hai thói quen đăng ký rs1 bằng giá trị trong đăng ký rs2. Mnemonic beq viết tắt của nhánh nếu
được thực thi đúng. bằng nhauHướng dẫn thứ hai là.
Burks, Goldstine và
bne rs1, rs2, L1
von Neumann, 1946
Nó có nghĩa là đi đến tuyên bố nhãn L1 nếu giá trị trong đăng ký rs1 không
chi nhánh có điều kiện không phải bằng giá trị trong đăng ký rs2. Mnemonic bne viết tắt của nhánh nếu
An hướng dẫn kiểm tra
một giá trị và cho phép
không bằng nhau Hai hướng dẫn này được gọi theo truyền thống. nhánh có điều
chuyển điều khiển tiếp kiện.
theo sang một địa chỉ mới
trong chương trình dựa
trên kết quả của bài kiểm
tra.
2.7 Hướng dẫn đưa ra quyết định 99

Biên soạn nếu-sau đó-khác vào các chi nhánh có điều kiện
VÍ DỤ
Trong phân đoạn mã sau , f, g, h, Tôi, và j là các biến. Nếu năm biến f thông
qua j tương ứng với năm thanh ghi x19 thông qua x23, cái gì là cái gì biên
dịch mã RISC-V cho C. này nếu tuyên bố?
if (i == j) f = g + h; khác f = g - h;

Hình 2.9 hiển thị sơ đồ về những gì mã RISC-V nên làm. Đầu tiên biểu thức
so sánh cho sự bình đẳng giữa hai biến trong thanh ghi. Có vẻ như chúng tôi TRẢ LỜI
muốn phân nhánh nếu tôi và j bằng nhau (beq). Nói chung, mã sẽ hiệu quả
hơn nếu chúng ta kiểm tra điều kiện ngược lại để phân nhánh qua mã mà các
nhánh nếu các giá trị là không phải bằng nhau (bne). Đây là mã :
bne x22, x23, Khác // đi đến Khác nếu i ≠ j

Câu lệnh gán tiếp theo thực hiện một thao tác duy nhất và nếu tất cả các toán
hạng được phân bổ cho các thanh ghi, thì đó chỉ là một lệnh :
thêm x19, x20, x21 // f = g + h (bỏ qua nếu i ≠ j)

Bây giờ chúng ta cần phải đi đến cuối của nếu tuyên bố. Ví dụ này giới thiệu
một loại chi nhánh khác, thường được gọi là an chi nhánh vô điều kiệnHướng
dẫn này nói rằng bộ xử lý luôn theo nhánh. Một cách để thể hiện một nhánh
vô điều kiện trong RISC-V là sử dụng một nhánh có điều kiện với điều kiện
luôn luôn đúng :.
beq x0, x0, Thoát // nếu 0 == 0, đi đến Thoát

Tuyên bố chuyển nhượng trong khác một phần của nếu câu lệnh một lần nữa
có thể được biên dịch thành một hướng dẫn duy nhất. Chúng tôi chỉ cần nối
thêm nhãn Khác theo hướng dẫn này. Chúng tôi cũng hiển thị nhãn Lối ra đó
là sau hướng dẫn này, hiển thị kết thúc của nếu-sau đó-khác mã biên dịch :
Khác: sub x19, x20, x21 // f = g - h (bỏ qua nếu i = j)
Lối ra:

Lưu ý rằng trình biên dịch giải phóng trình biên dịch và lập trình viên ngôn ngữ
lắp ráp khỏi các địa chỉ tính toán cho các nhánh, giống như để tính toán địa chỉ
dữ liệu cho tải và lưu trữ (xem Mục 2.12).
100 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

i=j tôi j
i = = j?

Khác :

f=g+h f = g hè h

Lối ra:

HÌNH 2.9 Minh họa các tùy chọn trong nếu tuyên bố trên. Hộp bên trái tương ứng với các sau đó
một phần của nếu câu lệnh và hộp bên phải tương ứng với khác một phần.

Giao diện Trình biên dịch thường tạo các nhánh và nhãn nơi chúng không xuất hiện trong
phần ngôn ngữ lập trình. Tránh gánh nặng của việc viết nhãn và chi nhánh rõ ràng là
một lợi ích của việc viết bằng các ngôn ngữ lập trình cấp cao và là một lý do mã
cứng / hóa nhanh hơn ở cấp độ đó.
phần
mềm Vòng lặp
Các quyết định rất quan trọng cả trong việc lựa chọn giữa hai lựa chọn thay thế
được tìm thấy trong nếu các câu lệnh và để lặp lại một tính toán được tìm thấy
trong các vòng lặp. Các hướng dẫn lắp ráp giống nhau là các khối xây dựng cho
cả hai trường hợp.

Biên soạn a trong khi Vòng lặp trong C

Đây là một vòng lặp truyền thống trong C :


VÍ DỤ
trong khi (lưu [i] == k)
i + = 1;
Giả sử rằng Tôi và k tương ứng với các thanh ghi x22 và x24 và cơ sở của
mảng tiết kiệm là trong x25Mã lắp ráp RISC-V tương ứng với mã C này là gì.
Bước đầu tiên là tải lưu [i] vào một đăng ký tạm thời. Trước khi chúng ta có
thể tải lưu [i] vào một đăng ký tạm thời, chúng ta cần phải có địa chỉ của nó.
Trước chúng tôi có thể thêm Tôi đến cơ sở của mảng tiết kiệm để tạo thành
địa chỉ, chúng ta phải nhân chỉ mục Tôi bởi 4 do vấn đề địa chỉ byte. May
TRẢ LỜI mắn thay, chúng ta có thể sử dụng dịch chuyển sang trái, vì dịch chuyển sang
trái 2 bit nhân với 2 hoặc 4 (xem trang 96 trước
2.7 Hướng dẫn đưa ra quyết định 101

phần). Chúng ta cần thêm nhãn Vòng lặp với nó để chúng ta có thể phân
nhánh trở lại hướng dẫn đó ở cuối vòng lặp :
Vòng lặp: slli x10, x22, 2 // Temp reg x10 = i * 4
Để có được địa chỉ của lưu [i], chúng ta cần thêm x10 và cơ sở của tiết kiệm
trong x25:

thêm x10, x10, x25 // x10 = địa chỉ lưu [i]

Bây giờ chúng ta có thể sử dụng địa chỉ đó để tải lưu [i] vào một đăng ký tạm thời :

lw x9, 0 (x10) // Temp reg x9 = lưu [i]

Hướng dẫn tiếp theo thực hiện kiểm tra vòng lặp, thoát nếu lưu [i] ≠ k:

bne x9, x24, Thoát // đi đến Lối ra nếu lưu [i] ≠ k

Các hướng dẫn sau đây thêm 1 vào Tôi:

addi x22, x22, 1 // i = i + 1

Sự kết thúc của các nhánh vòng lặp trở lại trong khi kiểm tra ở đầu vòng lặp.
Chúng tôi chỉ cần thêm Lối ra nhãn sau nó, và chúng tôi đã hoàn thành :
beq x0, x0, Vòng lặp // đi tới Vòng lặp

Lối ra:

(Xem Tự nghiên cứu trong Phần 2.25 để tối ưu hóa trình tự này.)

Các chuỗi hướng dẫn như vậy kết thúc trong một nhánh rất cơ bản để biên dịch Giao diện
đến mức chúng được cung cấp từ thông dụng riêng: a khối cơ bản là một chuỗi
các hướng dẫn không có nhánh, ngoại trừ có thể ở cuối và không có mục tiêu
phần
nhánh hoặc nhãn nhánh, ngoại trừ có thể ở đầu. Một trong những giai đoạn đầu cứng /
tiên của quá trình biên dịch là phá vỡ chương trình thành các khối cơ bản. phần
mềm
Thử nghiệm cho sự bình đẳng hoặc bất bình đẳng có lẽ là thử nghiệm phổ biến khối cơ bản Một trình tự
nhất, nhưng có nhiều mối quan hệ khác giữa hai con số. Ví dụ: a cho vòng lặp có của các hướng dẫn không
thể muốn kiểm tra xem biến chỉ mục có nhỏ hơn 0 không. Toàn bộ so sánh nhỏ có nhánh (trừ khi có thể ở
hơn (<), nhỏ hơn hoặc bằng (≤), lớn hơn (>), lớn hơn hoặc bằng (≥), bằng (=) và cuối) và không có mục
không bằng nhau (≠). tiêu nhánh hoặc nhãn
So sánh các mẫu bit cũng phải đối phó với sự phân đôi giữa các số đã ký và không nhánh (trừ khi có thể ở
dấu. Đôi khi một mẫu bit có 1 trong bit quan trọng nhất đại diện cho một số âm và, đầu).
tất nhiên, nhỏ hơn bất kỳ số dương nào, phải có 0 trong bit quan trọng nhất. Mặt khác,
với các số nguyên không dấu, 1 trong bit quan trọng nhất đại diện cho một số đó là
lớn hơn hơn bất kỳ điều gì bắt đầu
102 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

với số 0. (Chúng tôi sẽ sớm tận dụng ý nghĩa kép này của bit quan trọng nhất để giảm
chi phí kiểm tra giới hạn mảng.) RISC-V cung cấp các hướng dẫn xử lý cả hai trường
hợp. Các hướng dẫn này có dạng giống như beq và bne, nhưng thực hiện các so sánh
khác nhau. Chi nhánh nếu ít hơn (blt) lệnh so sánh các giá trị trong các thanh ghi rs1
và rs2 và lấy nhánh nếu giá trị trong rs1 nhỏ hơn, khi chúng được coi là hai số bổ
sung. Chi nhánh nếu lớn hơn hoặc bằng (bge) lấy nhánh trong trường hợp ngược lại,
nghĩa là, nếu giá trị trong rs1 ít nhất là giá trị trong rs2. Chi nhánh nếu ít hơn, không
dấu (bltu) lấy nhánh nếu giá trị trong rs1 nhỏ hơn giá trị trong rs2 khi các giá trị được
coi là số chưa ký. Cuối cùng, nhánh nếu lớn hơn hoặc bằng, không dấu ( bgeu) lấy chi
nhánh trong trường hợp ngược lại.
Một cách khác để cung cấp các hướng dẫn chi nhánh bổ sung này là đặt một
thanh ghi dựa trên kết quả so sánh, sau đó phân nhánh trên giá trị trong thanh ghi
tạm thời đó với beq hoặc là bne hướng dẫn. Cách tiếp cận này, được sử dụng bởi
bộ hướng dẫn MIPS, có thể làm cho bộ xử lý datapath đơn giản hơn một chút,
nhưng cần nhiều hướng dẫn hơn để thể hiện một chương trình.
Một cách khác, được sử dụng bởi các bộ hướng dẫn ARM ARM, là giữ các bit
bổ sung ghi lại những gì xảy ra trong một hướng dẫn. Các bit bổ sung, được gọi
điều kiện mã hoặc là cờ, cho biết, ví dụ, nếu kết quả của một phép toán số học là
âm, hoặc bằng không, hoặc dẫn đến tràn.
Các nhánh có điều kiện sau đó sử dụng kết hợp các mã điều kiện này để thực
hiện thử nghiệm mong muốn.
Một nhược điểm của mã điều kiện là nếu nhiều hướng dẫn luôn đặt chúng, nó sẽ tạo ra
các phụ thuộc sẽ gây khó khăn cho việc thực thi đường ống (xem Chương 4).

Giới hạn Kiểm tra Phím tắt


Xử lý các số đã ký như thể chúng không được ký sẽ cho chúng ta cách kiểm tra
chi phí thấp nếu 0 x < y, phù hợp với kiểm tra chỉ số ngoài giới hạn cho các mảng.
Điều quan trọng là các số nguyên âm trong hai ký hiệu bổ sung trông giống như
số lớn trong ký hiệu không dấu; nghĩa là, bit quan trọng nhất là một bit dấu trong
ký hiệu cũ nhưng một phần lớn của số sau. Do đó, một so sánh không dấu x < y
kiểm tra nếu x là tiêu cực cũng như nếu x ít hơn y.

Sử dụng phím tắt này để giảm kiểm tra chỉ số ngoài giới hạn: nhánh đến
VÍ DỤ
IndexOutOfBound nếu x20 x11 hoặc nếu x20 là tiêu cực.

Mã kiểm tra chỉ sử dụng không dấu lớn hơn hoặc bằng cả hai kiểm tra :
TRẢ LỜI
bgeu x20, x11, IndexOutOfBounds // nếu x20> = x11 hoặc x20 <0, goto
IndexOutOfBound
2.7 Hướng dẫn đưa ra quyết định 103

Trường hợp / Tuyên bố chuyển đổi


Hầu hết các ngôn ngữ lập trình có a trường hợp hoặc là công tắc câu lệnh cho
phép lập trình viên chọn một trong nhiều lựa chọn thay thế tùy thuộc vào một giá
trị duy nhất. Cách đơn giản nhất để thực hiện công tắc là thông qua một chuỗi
các bài kiểm tra có điều kiện, biến công tắc tuyên bố thành một chuỗi nếu-sau
đó-khác tuyên bố.
Đôi khi các lựa chọn thay thế có thể được mã hóa hiệu quả hơn dưới dạng bảng bảng địa chỉ chi
địa chỉ của các chuỗi hướng dẫn thay thế, được gọi là a bảng địa chỉ chi nhánh nhánh Cũng
được gọi
hoặc là bảng chi nhánhvà chương trình chỉ cần lập chỉ mục vào bảng và sau đó
bảng chi nhánhMột cái
phân nhánh theo trình tự thích hợp. Do đó, bảng nhánh chỉ là một mảng các từ
bàn của. địa chỉ của trình
kép chứa các địa chỉ tương ứng với các nhãn trong mã. Chương trình tải mục tự hướng dẫn thay thế.
thích hợp từ bảng nhánh vào một thanh ghi. Sau đó, nó cần phải phân nhánh bằng
cách sử dụng địa chỉ trong sổ đăng ký. Để hỗ trợ các tình huống như vậy, các máy
tính như RISC-V bao gồm an nhảy gián tiếp hướng dẫn, thực hiện một nhánh vô
điều kiện đến địa chỉ được chỉ định trong một thanh ghi. Trong RISC-V, hướng
dẫn đăng ký nhảy và liên kết (jalr) phục vụ mục đích này. Chúng tôi sẽ thấy việc
sử dụng phổ biến hơn nữa của hướng dẫn linh hoạt này trong phần tiếp theo.

Mặc dù có nhiều tuyên bố cho các quyết định và vòng lặp trong các ngôn ngữ lập Giao diện
trình như C và Java, nhưng câu lệnh nền tảng thực hiện chúng ở cấp tập lệnh là
nhánh có điều kiện.
phần
cứng /
phần
I. C có nhiều tuyên bố cho các quyết định và vòng lặp, trong khi RISC-V có mềm
rất ít. Điều nào sau đây không hoặc không giải thích sự mất cân bằng này?
Tại sao? Kiểm tra
1. Nhiều tuyên bố quyết định làm cho mã dễ đọc và dễ hiểu hơn. Bản thân bạn
2. Ít tuyên bố quyết định đơn giản hóa nhiệm vụ của lớp cơ bản chịu trách
nhiệm thực thi.
3. Nhiều tuyên bố quyết định hơn có nghĩa là ít dòng mã hơn, thường làm
giảm thời gian mã hóa.
4. Nhiều tuyên bố quyết định hơn có nghĩa là ít dòng mã hơn, thường dẫn
đến việc thực hiện ít thao tác hơn.
II. Tại sao C cung cấp hai bộ toán tử cho AND (& và &&) và hai bộ toán tử
cho OR (| và ||), trong khi RISC-V không có?
1. Hoạt động logic VÀ và HOẶC thực hiện & và |, trong khi các nhánh
có điều kiện thực hiện && và ||.
2. Câu lệnh trước có nó ngược: && và || tương ứng với các phép toán
logic, while & và | map đến các nhánh có điều kiện.
3. Chúng là dư thừa và có nghĩa là cùng một điều: && và || | đơn giản
được kế thừa từ ngôn ngữ lập trình B, tiền thân của C .
104 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Thủ tục hỗ trợ trong máy tính


2.8 Phần cứng

thủ tục Một lưu trữ A thủ tục hoặc chức năng là một lập trình viên công cụ sử dụng để cấu trúc các
chương trình con thực chương trình, cả hai để làm cho chúng dễ hiểu hơn và cho phép sử dụng lại mã. Các
hiện một nhiệm vụ cụ thủ tục cho phép lập trình viên chỉ tập trung vào một phần của nhiệm vụ tại một thời
thể dựa trên các tham số điểm; các tham số hoạt động như một giao diện giữa thủ tục và phần còn lại của
mà nó được cung cấp. chương trình và dữ liệu, vì chúng có thể vượt qua các giá trị và trả về kết quả. Chúng
tôi mô tả tương đương với các thủ tục trong Java Mục 2.15, nhưng Java cần mọi
thứ từ máy tính mà C cần. Thủ tục là một cách để thực hiện trừu tượng trong
phần mềm.
Bạn có thể nghĩ về một thủ tục như một điệp viên rời đi với một kế hoạch bí
mật, có được tài nguyên, thực hiện nhiệm vụ, che dấu vết của mình và sau đó trở
về điểm xuất phát với kết quả mong muốn. Không có gì khác nên bị xáo trộn khi
nhiệm vụ hoàn thành. Hơn nữa, một điệp viên chỉ hoạt động dựa trên cơ sở cần
biết về cơ sở, vì vậy điệp viên có thể đưa ra các giả định về spymaster.
Tương tự, trong quá trình thực hiện thủ tục, chương trình phải tuân theo sáu
bước sau :
1. Đặt tham số ở nơi thủ tục có thể truy cập chúng.
2. Chuyển kiểm soát sang thủ tục.
3. Có được các tài nguyên lưu trữ cần thiết cho thủ tục.
4. Thực hiện nhiệm vụ mong muốn.
5. Đặt giá trị kết quả ở nơi chương trình gọi có thể truy cập nó.
6. Trả về quyền kiểm soát về điểm xuất phát, vì một thủ tục có thể được gọi
từ một số điểm trong một chương trình.
Như đã đề cập ở trên, các thanh ghi là nơi nhanh nhất để chứa dữ liệu trong
máy tính, vì vậy chúng tôi muốn sử dụng chúng càng nhiều càng tốt. Phần mềm
RISC-V tuân theo quy ước sau đây về thủ tục gọi trong việc phân bổ 32 thanh
ghi của nó :
n x10 x17: tám thanh ghi tham số để truyền tham số hoặc trả về giá trị.
hướng dẫn nhảy và n x1: một đăng ký địa chỉ trả về để trở về điểm xuất phát.
liên kết An hướng dẫn
phân nhánh đến một địa Ngoài việc phân bổ các thanh ghi này, ngôn ngữ lắp ráp RISC-V bao gồm một
chỉ và đồng thời lưu địa hướng dẫn chỉ dành cho các thủ tục: nó phân nhánh đến một địa chỉ và đồng thời
chỉ của hướng dẫn sau lưu địa chỉ của hướng dẫn sau vào rd thanh ghi đích. Các hướng dẫn nhảy và
trong một thanh ghi liên kết (jal) được viết
(thường là x1 trong
RISC-V). jal x1, Thủ tục Địa chỉ // nhảy đến Thủ tục Địa chỉ và ghi địa chỉ trả
về x1
2.8 Quy trình hỗ trợ trong phần cứng máy tính 105

Các liên kết một phần của tên có nghĩa là một địa chỉ hoặc liên kết được hình
thành trỏ đến trang web gọi để cho phép thủ tục quay trở lại địa chỉ thích hợp.
Liên kết này, được lưu trữ trong sổ đăng ký x1, được gọi là địa chỉ trả lạiĐịa chỉ địa chỉ trả lại Một liên
trả về là cần thiết vì quy trình tương tự có thể được gọi từ một số phần của kết đến trang web gọi cho
chương trình. phép một thủ tục trở về
Để hỗ trợ trả về từ một thủ tục, các máy tính như RISC-V sử dụng một bước địa chỉ thích hợp; trong
RISC-V, nó được lưu trữ
nhảy gián tiếp, như hướng dẫn nhảy và liên kết (jalr) giới thiệu ở trên để giúp báo trong thanh ghi x1.
cáo trường hợp :
jalr x0, 0 (x1) người gọi Chương trình
đó xúi giục một thủ tục
Các nhánh hướng dẫn đăng ký nhảy và liên kết đến địa chỉ được lưu trong và cung cấp các giá trị
thanh ghi x1Đây là những gì chúng ta muốn. Do đó, chương trình gọi, hoặc tham số cần thiết.
người gọi, đặt các giá trị tham số vào x10 x17 và sử dụng jal x1, X để chi nhánh
callee Một thủ tục mà
để làm thủ tục X (đôi khi được đặt tên là callee). Callee sau đó thực hiện các
thực hiện một loạt các
phép tính, đặt kết quả vào cùng các thanh ghi tham số và trả về điều khiển cho hướng dẫn được lưu trữ
người gọi bằng cách sử dụng jalr x0, 0 (x1). dựa trên các tham số do
Ẩn ý trong ý tưởng chương trình được lưu trữ là cần phải có một thanh ghi để giữ địa người gọi cung cấp và sau
chỉ của lệnh hiện tại đang được thực thi. Vì lý do lịch sử, đăng ký này hầu như luôn được đó trả về quyền kiểm soát
gọi là quầy chương trình, viết tắt PC trong kiến trúc RISC-V, mặc dù một cái tên hợp lý cho người gọi.
hơn sẽ có đăng ký địa chỉ hướng dẫn Các. jal hướng dẫn thực sự lưu PC + 4 trong thanh bộ đếm chương trình
ghi chỉ định của nó (thường là x1) để liên kết đến địa chỉ byte của hướng dẫn sau để thiết (PC) Sổ đăng ký chứa
lập trả về thủ tục. địa chỉ của lệnh trong
chương trình đang được
thực thi.
Xây dựng: Hướng dẫn nhảy và liên kết cũng có thể được sử dụng để thực hiện
một nhánh vô điều kiện trong một thủ tục bằng cách sử dụng x0 làm thanh ghi đích. chồng Một cấu trúc dữ
Vì x0 có dây cứng đến 0, nên hiệu quả là loại bỏ địa chỉ trả về : liệu cho các thanh ghi
tràn được tổ chức như
jal x0, Nhãn // nhánh vô điều kiện để Nhãn
một hàng đợi đầu tiên.

xếp con trỏ Một giá trị


Sử dụng nhiều đăng ký biểu thị địa chỉ được
phân bổ gần đây nhất
Giả sử một trình biên dịch cần nhiều thanh ghi cho một thủ tục hơn tám thanh ghi đối số.
trong một ngăn xếp cho
Vì chúng tôi phải bao gồm các bản nhạc của mình sau khi nhiệm vụ của chúng tôi hoàn tất, biết nơi đăng ký sẽ bị đổ
mọi thanh ghi cần thiết của người gọi phải được khôi phục về các giá trị mà chúng chứa hoặc nơi có thể tìm thấy
trước thủ tục đã được viện dẫn. Tình huống này là một ví dụ trong đó chúng ta cần làm đổ các giá trị đăng ký cũ.
các thanh ghi vào bộ nhớ, như được đề cập trong Giao diện phần cứng / phần mềm phần Trong RISC-V, nó được
trên trang 75. đăng ký sp , hoặc là x2.
Cấu trúc dữ liệu lý tưởng cho các thanh ghi tràn là a chồngHàng đợi cuối cùng
trong hàng đầu tiên. Một ngăn xếp cần một con trỏ đến địa chỉ được phân bổ gần
đẩy Thêm yếu tố
đây nhất trong ngăn xếp để hiển thị nơi thủ tục tiếp theo sẽ đặt các thanh ghi bị
vào chồng.
đổ hoặc nơi tìm thấy các giá trị thanh ghi cũ. Trong RISC-V, the xếp con trỏ là
đăng ký x2, còn được biết đến với tên sp Con trỏ ngăn xếp được điều chỉnh bởi
bật lên Loại bỏ phần
một từ cho mỗi thanh ghi được lưu hoặc khôi phục. Ngăn xếp phổ biến đến mức
tử từ ngăn xếp.
chúng có từ thông dụng riêng để truyền dữ liệu đến và từ ngăn xếp: đặt dữ liệu
lên ngăn xếp được gọi là a. đẩyvà xóa dữ liệu khỏi ngăn xếp được gọi là a bật
lên.
106 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Theo tiền lệ lịch sử, các ngăn xếp phát triển từ các địa chỉ cao hơn đến các địa
chỉ thấp hơn. Quy ước này có nghĩa là bạn đẩy các giá trị lên ngăn xếp bằng cách
trừ từ con trỏ ngăn xếp. Thêm vào con trỏ ngăn xếp thu nhỏ ngăn xếp, do đó bật
các giá trị ra khỏi ngăn xếp.

Biên soạn một thủ tục C mà không gọi là thủ tục khác
VÍ DỤ
Hãy để ví dụ trên trang 72 từ Mục 2.2 vào thủ tục C :

int leaf_example (int g, int h, int i, int j)


{
int f;

?? ?? ?? f = (g + h) - (i + j);
trở về f;
}

Mã lắp ráp RISC-V được biên dịch là gì?

Các biến tham số g, h, Tôi, và j tương ứng với các thanh ghi đối số x10, x11 ,
TRẢ LỜI x12, và x13, tương ứng, và f tương ứng với x20Biên soạn. chương trình bắt
đầu với nhãn của thủ tục :
lá_example :

Bước tiếp theo là lưu các thanh ghi được sử dụng bởi thủ tục. Câu lệnh gán C
trong phần thủ tục giống hệt với ví dụ ở trang 73, sử dụng hai thanh ghi tạm thời
(x5 và x6). Vì vậy, chúng ta cần lưu ba thanh ghi : x5, x6 , và x20Chúng tôi đẩy
các giá trị cũ lên ngăn xếp bằng cách tạo khoảng trắng cho. ba từ (12 byte) trên
ngăn xếp và sau đó lưu trữ chúng :

addi sp, sp, -12 // điều chỉnh stack để nhường chỗ cho 3 mục
sw x5, 8 (sp) // lưu đăng ký x5 để sử dụng sau đó
sw x6, 4 (sp) // lưu đăng ký x6 để sử dụng sau đó
sw x20, 0 (sp) // lưu đăng ký x20 để sử dụng sau đó

Hình 2.10 hiển thị ngăn xếp trước, trong và sau cuộc gọi thủ tục.
Ba câu tiếp theo tương ứng với phần thân của thủ tục, theo ví dụ ở trang
73 :
thêm x5, x10, x11 // thanh ghi x5 chứa g + h thêm x6, x12, x13 // thanh
ghi x6 chứa i + j
phụ x20, x5, x6 // f = x5 - x6, đó là (g + h) - (i + j)
2.8 Quy trình hỗ trợ trong phần cứng máy tính 107

Để trả về giá trị của f, chúng tôi sao chép nó vào một thanh ghi tham số :

addi x10, x20, 0 // trả về f (x10 = x20 + 0)

Trước khi quay lại, chúng tôi khôi phục ba giá trị cũ của các thanh ghi mà
chúng tôi đã lưu bằng cách bật lên chúng từ ngăn xếp :

lw x20, 0 (sp)  // khôi phục đăng ký x20 cho người gọi
lw x6, 4 (sp)  // khôi phục đăng ký x6 cho người gọi
lw x5, 8 (sp) // khôi phục thanh ghi x5 cho addi sp của người gọi, sp, 12 //
điều chỉnh ngăn xếp để xóa 3 mục

Thủ tục kết thúc bằng một thanh ghi chi nhánh sử dụng địa chỉ trả về :

jalr x0, 0 (x1) // nhánh trở lại thói quen gọi

Trong ví dụ trước, chúng tôi đã sử dụng các thanh ghi tạm thời và giả sử các
giá trị cũ của chúng phải được lưu và khôi phục. Để tránh lưu và khôi phục một
thanh ghi có giá trị không bao giờ được sử dụng, điều này có thể xảy ra với một
thanh ghi tạm thời, phần mềm RISC-V tách 19 thanh ghi thành hai nhóm :

n x5-x7 và x28-x31: đăng ký tạm thời đó không phải được bảo quản bởi callee
(gọi là thủ tục) trên một cuộc gọi thủ tục
n x8-x9 và x18-x27: các thanh ghi đã lưu phải được bảo quản trên một thủ tục
gọi (nếu được sử dụng, callee lưu và khôi phục chúng)
Quy ước đơn giản này làm giảm sự cố tràn đăng ký. Trong ví dụ trên, vì người gọi
không mong đợi các thanh ghi x5 và x6 được bảo tồn qua một cuộc gọi thủ tục ,

Địa chỉ cao

SP SP
Nội dung đăng ký x5
Nội dung đăng ký x6
SP Nội dung đăng ký x20

Địa chỉ thấp


(a) (b) (c)

HÌNH 2.10 Các giá trị của con trỏ ngăn xếp và ngăn xếp (a) trước, (b) trong và (c) sau lệnh
gọi thủ tục. Con trỏ ngăn xếp luôn trỏ đến đỉnh đầu của ngăn xếp hoặc từ cuối cùng trong ngăn xếp
trong bản vẽ này.
108 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

chúng tôi có thể thả hai cửa hàng và hai tải từ mã. Chúng ta vẫn phải tiết kiệm và
khôi phục x20, vì callee phải cho rằng người gọi cần giá trị của nó.

Thủ tục lồng nhau


Các thủ tục không gọi người khác được gọi lá thủ tục. Cuộc sống sẽ đơn giản nếu
tất cả các thủ tục là thủ tục lá, nhưng chúng không phải là. Giống như một điệp
viên có thể sử dụng các điệp viên khác như một phần của nhiệm vụ, người này có
thể sử dụng nhiều gián điệp hơn nữa, do đó, các thủ tục gọi các thủ tục khác. Hơn
nữa, các thủ tục đệ quy thậm chí còn gọi các bản sao của bản thân. Cũng giống
như chúng ta cần cẩn thận khi sử dụng các thanh ghi trong các thủ tục, phải chú ý
khi gọi các thủ tục không liên quan.
Ví dụ: giả sử rằng chương trình chính gọi thủ tục A với đối số là 3, bằng cách đặt
giá trị 3 vào thanh ghi x10 và sau đó sử dụng jal x1, A Sau đó, giả sử thủ tục đó A gọi
thủ tục B qua. jal x1, B với một đối số 7, cũng được đặt trong x10 Vì A hasn đã hoàn
thành nhiệm vụ của mình, có một mâu thuẫn về việc sử dụng đăng ký. x10 Tương tự,
có một xung đột về địa chỉ trả lại trong đăng ký. x1, vì bây giờ nó có địa chỉ trả lại
cho B. Trừ khi chúng tôi thực hiện các bước để ngăn chặn vấn đề, xung đột này sẽ
loại bỏ thủ tục Khả năng trở lại với người gọi của nó.
Một giải pháp là đẩy tất cả các thanh ghi khác phải được bảo quản trên ngăn
xếp, giống như chúng ta đã làm với các thanh ghi đã lưu. Người gọi đẩy bất kỳ
thanh ghi đối số (x10 x17) hoặc đăng ký tạm thời (x5-x7 và x28-x31) cần thiết sau
cuộc gọi. Callee đẩy đăng ký địa chỉ trả lại x1 và bất kỳ thanh ghi đã lưu (x8-x9
và x18-x27) được sử dụng bởi callee. Con trỏ ngăn xếp sp được điều chỉnh vào tài
khoản cho số lượng thanh ghi được đặt trên ngăn xếp. Khi trở về, các thanh ghi
được khôi phục từ bộ nhớ và con trỏ ngăn xếp được điều chỉnh lại.

Biên dịch thủ tục C đệ quy, hiển thị liên kết thủ tục lồng nhau

VÍ DỤ Hãy để giải quyết một thủ tục đệ quy tính toán giai thừa :

int thực tế (int n)


{
nếu (n <1) trở lại (1);
khác trở lại (n * thực tế (n - 1));
}

Mã lắp ráp RISC-V là gì?

Biến tham số n tương ứng với thanh ghi đối số x10 Chương trình đã biên
dịch bắt đầu với nhãn của thủ tục và sau đó lưu hai thanh ghi trên ngăn xếp,
địa chỉ trả về và. x10:
TRẢ LỜI
thực tế:
2.8 Quy trình hỗ trợ trong phần cứng máy tính 109

addi sp, sp, -8 // điều chỉnh stack cho 2 mục


sw x1, 4 (sp) // lưu địa chỉ trả lại
sw x10, 0 (sp) // lưu đối số n

Lần đầu tiên thực tế được gọi là, sw lưu một địa chỉ trong chương trình được
gọi thực tếHai hướng dẫn tiếp theo kiểm tra xem. n là ít hơn 1, sẽ L1 nếu n 1.

addi x5, x10, -1 // x5 = n - 1


bge x5, x0, L1 // nếu (n - 1)> = 0, đi đến L1

Nếu n là ít hơn 1 , thực tế trả về 1 bằng cách đặt 1 vào một thanh ghi giá trị:
nó thêm 1 đến 0 và đặt tổng đó vào x10Sau đó, nó bật hai giá trị đã lưu ra
khỏi ngăn xếp và các nhánh đến địa chỉ trả về :.

addi x10, x0, 1 // trả lại 1


addi sp , sp, 8 // bật 2 mục ra khỏi ngăn xếp
jalr x0 , 0 (x1) // trở lại với người gọi

Trước khi bật hai mục ra khỏi ngăn xếp, chúng tôi có thể đã tải x1 và x10Kể
từ đó. x1 và x10 don thay đổi khi n là ít hơn 1, chúng tôi bỏ qua những hướng
dẫn.
Nếu n không ít hơn 1, đối số n bị suy giảm và sau đó thực tế được gọi lại
với giá trị giảm dần :
L1: addi x10, x10, -1 // n> = 1: đối số được (n - 1)
jal x1, thực tế // thực tế cuộc gọi với (n - 1)

Hướng dẫn tiếp theo là ở đâu thực tế trở về; kết quả của nó là trong x10 Bây
giờ địa chỉ trả về cũ và đối số cũ được khôi phục, cùng với con trỏ ngăn
xếp :.

addi x6, x10, 0 // trở về từ jal: di chuyển kết quả của thực tế
(n - 1) đến x6 :
lw x10, 0 (sp) // khôi phục đối số n
lw x1, 4 (sp) // khôi phục các địa chỉ trả lại
addi sp, sp, 8 // điều chỉnh con trỏ ngăn xếp để bật 2 mục

Tiếp theo, đăng ký đối số x10 có được sản phẩm của đối số cũ và kết quả của
thực tế (n - 1), bây giờ trong x6 Chúng tôi giả định một hướng dẫn nhân có
sẵn, mặc dù nó không được bảo hiểm cho đến khi. Chương 3:
mul x10, x10, x6 // return n * fact (n - 1)

Cuối cùng, thực tế chi nhánh một lần nữa đến địa chỉ trả về :

jalr x0, 0 (x1) // trở về người gọi


110 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Giao diện Một biến C nói chung là một vị trí trong bộ lưu trữ và việc giải thích nó phụ thuộc cả
vào nó kiểu và lớp lưu trữ Các loại ví dụ bao gồm số nguyên và ký tự (xem. Mục 2.9).
phần C có hai lớp lưu trữ : tự động và tĩnhBiến tự động. là cục bộ của một thủ tục và bị
cứng / loại bỏ khi thủ tục thoát ra. Các biến tĩnh tồn tại trên các lối thoát từ và các mục vào
phần thủ tục. Các biến C được khai báo bên ngoài tất cả các thủ tục được coi là tĩnh, cũng
như bất kỳ biến nào được khai báo bằng từ khóa tĩnhPhần còn lại là tự động. Để đơn
mềm
giản hóa việc truy cập vào dữ liệu tĩnh, một số RISC-V. trình biên dịch dự trữ một
đăng ký x3 để sử dụng như con trỏ toàn cầu, hoặc là gp.

con trỏ toàn cầu Các


đăng ký được dành riêng Hình 2.11 tóm tắt những gì được bảo quản qua một cuộc gọi thủ tục. Lưu ý
để chỉ vào khu vực tĩnh. rằng một số lược đồ bảo toàn ngăn xếp, đảm bảo rằng người gọi sẽ lấy lại cùng
một dữ liệu trên một tải từ ngăn xếp khi nó được lưu trữ trên ngăn xếp. Các ngăn
xếp ở trên sp được bảo tồn đơn giản bằng cách đảm bảo rằng callee không viết ở
trên sp; sp được bảo quản bởi callee thêm chính xác số tiền đã được trừ vào nó;
và các thanh ghi khác được bảo tồn bằng cách lưu chúng trên ngăn xếp (nếu
chúng được sử dụng) và khôi phục chúng từ đó.

HÌNH 2.11 Cái gì và cái gì không được bảo quản trong một cuộc gọi thủ tục. Nếu phần mềm
dựa vào trên thanh ghi con trỏ toàn cầu, được thảo luận trong các tiểu mục sau, nó cũng được bảo tồn.

khung thủ tục Cũng thế Phân bổ không gian cho dữ liệu mới trên ngăn xếp
gọi hồ sơ kích hoạtĐoạn
của ngăn xếp chứa một thủ
Độ phức tạp cuối cùng là ngăn xếp cũng được sử dụng để lưu trữ các biến cục bộ
tục lưu các thanh ghi và của thủ tục nhưng không phù hợp với các thanh ghi, chẳng hạn như mảng hoặc
biến cục bộ. cấu trúc cục bộ. Đoạn của ngăn xếp chứa một thủ tục Các thanh ghi đã lưu và các
biến cục bộ được gọi là a khung thủ tục hoặc là hồ sơ kích hoạt.Hình 2.12 hiển
thị trạng thái của ngăn xếp trước, trong và sau cuộc gọi thủ tục.
Một số trình biên dịch RISC-V sử dụng a con trỏ khung fp, hoặc đăng ký x8
con trỏ khung Một giá để chỉ từ đầu tiên của khung của một thủ tục. Một con trỏ ngăn xếp có thể thay
trị biểu thị vị trí của các đổi trong quy trình và do đó, các tham chiếu đến một biến cục bộ trong bộ nhớ có
thanh ghi đã lưu và các
biến cục bộ cho một thủ
thể có các độ lệch khác nhau tùy thuộc vào vị trí của chúng trong quy trình, làm
tục nhất định. cho quy trình khó hiểu hơn. Ngoài ra, một con trỏ khung cung cấp một thanh ghi
cơ sở ổn định trong một quy trình cho các tham chiếu bộ nhớ cục bộ. Lưu ý rằng
một bản ghi kích hoạt
2.8 Quy trình hỗ trợ trong phần cứng máy tính 111

Địa chỉ cao

FP FP

SP SP
FP Đã lưu đối số
đăng ký (nếu có)
Đã lưu địa chỉ trả lại
Tiết kiệm tiết kiệm
đăng ký (nếu có)
Mảng địa phương và
cấu trúc (nếu có)
SP
Địa chỉ thấp
(a) (b) (c)

HÌNH 2.12 Minh họa phân bổ ngăn xếp (a) trước, (b) trong và (c) sau cuộc gọi thủ tục. Con
trỏ khung (fp hoặc là x8) trỏ đến từ đầu tiên của khung, thường là một đối số đã lưu thanh ghi và con trỏ
ngăn xếp (sp) trỏ đến đỉnh của ngăn xếp. Ngăn xếp được điều chỉnh để nhường chỗ cho tất cả các thanh ghi
đã lưu và bất kỳ biến cục bộ nào trong bộ nhớ. Vì con trỏ ngăn xếp có thể thay đổi trong quá trình thực thi
chương trình, nên các lập trình viên dễ dàng tham chiếu các biến thông qua con trỏ khung ổn định, mặc dù
nó có thể được thực hiện chỉ với con trỏ ngăn xếp và một số học địa chỉ nhỏ. Nếu không có biến cục bộ
trên ngăn xếp trong một thủ tục, trình biên dịch sẽ tiết kiệm thời gian không phải thiết lập và khôi phục con
trỏ khung. Khi một con trỏ khung được sử dụng, nó được khởi tạo bằng cách sử dụng địa chỉ trong sp trên
một cuộc gọi và sp được khôi phục bằng fp. Thông tin này cũng được tìm thấy trong Cột 4 của Thẻ dữ liệu
tham chiếu RISC-V ở mặt trước của cuốn sách này.

xuất hiện trên ngăn xếp cho dù có sử dụng con trỏ khung rõ ràng hay không.
Chúng tôi đã tránh sử dụng fp bằng cách tránh thay đổi sp trong một quy trình:
trong các ví dụ của chúng tôi, ngăn xếp chỉ được điều chỉnh khi vào và ra khỏi
quy trình.
phát triển về phía
nhau, do đó cho phép
Phân bổ không gian cho dữ liệu mới trên đống
sử dụng hiệu quả bộ
Ngoài các biến tự động cục bộ theo quy trình, lập trình viên C cần không gian nhớ khi hai phân đoạn
trong bộ nhớ cho các biến tĩnh và cho các cấu trúc dữ liệu động. Hình 2.13 hiển sáp và suy yếu dần.
thị quy ước RISC-V để phân bổ bộ nhớ khi chạy hệ điều hành Linux. Ngăn xếp
bắt đầu ở mức cao nhất của không gian địa chỉ người dùng (xem Chương 5) và
phát triển xuống. Phần đầu tiên của phần thấp của bộ nhớ được bảo lưu , theo sau
là nhà của mã máy RISC-V, theo truyền thống được gọi là văn bản phân
khúcTrên mã là. phân đoạn dữ liệu tĩnh, đó là nơi dành cho hằng số và các biến
tĩnh khác. Mặc dù các mảng có xu hướng có độ dài cố định và do đó phù hợp với
phân đoạn dữ liệu tĩnh, các cấu trúc dữ liệu như danh sách được liên kết có xu
hướng phát triển và thu nhỏ trong suốt cuộc đời của chúng. Các phân đoạn cho
các cấu trúc dữ liệu như vậy theo truyền thống được gọi là đốngvà nó được đặt
tiếp theo trong bộ nhớ. Lưu ý rằng sự phân bổ này cho phép ngăn xếp và đống
phân đoạn văn bản Các phân đoạn tệp đối tượng UNIX chứa mã ngôn ngữ máy cho các thói
quen trong tệp nguồn.
112 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

SP 0000 003f ffff fff0hex Chồng

Dữ liệu động

Dữ liệu tĩnh
0000 0000 1000 0000hex
Văn bản
PC 0000 0000 0040 0000hex
Dành riêng
0

HÌNH 2.13 Phân bổ bộ nhớ RISC-V cho chương trình và dữ liệu. Những địa chỉ này chỉ là một quy ước
phần mềm và không phải là một phần của kiến trúc RISC-V. Con trỏ stack được khởi tạo thành 0000 003f
ffff fff0hex và phát triển xuống phía phân khúc dữ liệu. Ở đầu bên kia, mã chương trình (văn bản trực
tuyến) bắt đầu từ 0000 0000 0040 0000 hexDữ liệu tĩnh bắt đầu ngay sau khi kết thúc phân đoạn văn bản;
trong ví dụ này, chúng tôi giả sử rằng địa chỉ đó là 0000 0000 1000 0000.hex Dữ liệu động, được phân bổ
bởi malloc trong C và mới trong Java, là tiếp theo. Nó lớn lên về phía ngăn xếp trong một khu vực được
gọi là. đốngThông tin này cũng được tìm thấy trong Cột 4 của Thẻ dữ liệu tham chiếu RISC-V ở mặt trước
của cuốn sách này.

C phân bổ và giải phóng không gian trên đống với các chức năng rõ ràng. trung tâm
thương mại () phân bổ không gian trên đống và trả về một con trỏ cho nó, và miễn phí ()
giải phóng không gian trên đống mà con trỏ trỏ tới. Các chương trình C kiểm soát
phân bổ bộ nhớ, là nguồn gốc của nhiều lỗi phổ biến và khó khăn. Việc quên không
gian trống dẫn đến rò rỉ bộ nhớ của người dùng, mà cuối cùng sử dụng rất nhiều bộ
nhớ đến nỗi hệ điều hành có thể bị sập. Giải phóng không gian quá sớm dẫn đến các
con trỏ lơ lửng, có thể khiến các con trỏ chỉ ra những điều mà chương trình không
bao giờ có ý định. Java sử dụng phân bổ bộ nhớ tự động và thu gom rác chủ yếu để
tránh các lỗi như vậy.
Hình 2.14 tóm tắt các quy ước đăng ký cho lắp ráp RISC-V ngôn ngữ. Quy
ước này là một ví dụ khác về việc thực hiện trường hợp phổ biến nhanh: hầu
hết các thủ tục có thể được thỏa mãn với tối đa tám thanh ghi đối số, mười hai
thanh ghi đã lưu và bảy thanh ghi tạm thời mà không bao giờ đi vào bộ nhớ.

Xây dựng: Điều gì nếu có nhiều hơn tám tham số? Công ước RISC-V là để đặt
các tham số phụ trên ngăn xếp ngay phía trên con trỏ khung. Thủ tục sau đó mong
đợi tám tham số đầu tiên sẽ có trong các thanh ghi x10 thông qua x17 và phần còn lại
trong bộ nhớ, có thể định địa chỉ thông qua con trỏ khung.
Như đã đề cập trong chú thích của Hình 2.12, con trỏ khung là thuận tiện vì tất cả các
tham chiếu đến các biến trong ngăn xếp trong một thủ tục sẽ có cùng độ lệch. Con trỏ
khung là không cần thiết, tuy nhiên. Trình biên dịch RISC-V C chỉ sử dụng một con trỏ
khung trong các quy trình thay đổi con trỏ ngăn xếp trong phần thân của quy trình.
2.8 Quy trình hỗ trợ trong phần cứng máy tính 113

HÌNH 2.14 Công ước đăng ký RISC-V. Thông tin này cũng được tìm thấy trong Cột 2 của Thẻ dữ liệu
tham khảo RISC-V ở mặt trước của cuốn sách này.

Xây dựng: Một số thủ tục đệ quy có thể được thực hiện lặp đi lặp lại mà không
cần sử dụng đệ quy. Lặp lại có thể cải thiện đáng kể hiệu suất bằng cách loại bỏ chi
phí liên quan đến các cuộc gọi thủ tục đệ quy. Ví dụ: xem xét một thủ tục được sử
dụng để tích lũy một tổng :

int sum (int n, int acc) {


nếu (n> 0)
tổng trả về (n - 1, acc + n);
khác
trả lại acc;
}

Hãy xem xét các thủ tục gọi tổng (3.0) Điều này sẽ dẫn đến các cuộc gọi đệ quy
đến. tổng (2,3), tổng (1,5), và tổng (0,6), và sau đó kết quả 6 sẽ được trả về bốn lần.
Cuộc gọi đệ quy này của tổng được gọi là a gọi đuôivà ví dụ này sử dụng đệ quy
đuôi có thể được thực hiện rất hiệu quả (giả địnhx10 = n, x11 = accvà kết quả đi
vào x12):

tổng: chảy
máu x10 , x0, sum_exit // đi đến sum_exit nếu n <= 0
thêm x11 , x11, x10 // thêm n vào acc
addi x10, x10, -1 // trừ 1 từ n
jal x0, tổng // nhảy để tổng
sum_exit :
addi x12, x11, 0 // trả về giá trị acc
jalr x0, 0 (x1) // trở về người gọi
114 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Kiểm tra Những tuyên bố nào sau đây về C và Java nói chung là đúng?
Bản thân bạn Các lập trình viên C quản lý dữ liệu một cách rõ ràng, trong khi nó tự động
1. trong Java.
2. C dẫn đến nhiều lỗi con trỏ và lỗi rò rỉ bộ nhớ hơn Java.

(@ |! => (wow mở
tab tại thanh là tuyệt
vời) 2.9 Giao tiếp với mọi người
Dòng thứ tư của bài thơ
bàn phím Hat Hat Atlas, Máy tính được phát minh với số lượng khủng hoảng, nhưng ngay khi chúng trở
1991 (một số đặt tên nên khả thi về mặt thương mại, chúng đã được sử dụng để xử lý văn bản. Hầu hết
cho các ký tự ASCII: các máy tính ngày nay cung cấp byte 8 bit để thể hiện các ký tự, với Mã tiêu
Hồi!Mùi là wow wow,
chuẩn Mỹ cho thông tin Trao đổi (ASCII) là đại diện mà gần như tất cả mọi
ngay lập tức ('' là mở, | |
| là thanh, v.v.).
người theo dõi. Hình 2.15 tóm tắt ASCII .

HÌNH 2.15 ASCII đại diện cho các nhân vật. Lưu ý rằng các chữ cái viết hoa và chữ thường khác nhau chính xác 32; quan sát này có
thể dẫn đến các phím tắt trong việc kiểm tra hoặc thay đổi chữ hoa và chữ thường. Các giá trị không được hiển thị bao gồm các ký tự định
dạng. Ví dụ: 8 đại diện cho một khoảng lùi, 9 đại diện cho một ký tự tab và 13 đại diện cho lợi nhuận vận chuyển. Một giá trị hữu ích khác
là 0 cho null, giá trị mà ngôn ngữ lập trình C sử dụng để đánh dấu phần cuối của chuỗi.
2.9 Giao tiếp với mọi người 115

ASCII so với số nhị phân


VÍ DỤ
Chúng ta có thể biểu diễn các số dưới dạng chuỗi các chữ số ASCII thay vì số nguyên.
Bao nhiêu lưu trữ tăng nếu số 1 tỷ được đại diện trong
ASCII so với số nguyên 32 bit?

Một tỷ là 1.000.000.000, vì vậy sẽ mất 10 chữ số ASCII, mỗi chữ số dài 8 bit.
TRẢ LỜI
Do đó, việc mở rộng lưu trữ sẽ là (10 × 8) / 32 hoặc 2.5. Ngoài việc mở rộng trong lưu trữ,
phần cứng để thêm, trừ, nhân và chia số thập phân đó
số lượng là khó khăn và sẽ tiêu thụ nhiều năng lượng hơn. Những khó khăn
như vậy giải thích tại sao các chuyên gia điện toán được nuôi dưỡng để tin
rằng nhị phân là tự nhiên và máy tính thập phân thỉnh thoảng là kỳ quái.

Một loạt các hướng dẫn có thể trích xuất một byte từ một từ, vì vậy đăng ký tải
và đăng ký lưu trữ là đủ để chuyển byte cũng như từ. Tuy nhiên, do sự phổ biến
của văn bản trong một số chương trình, RISC-V cung cấp các hướng dẫn để di
chuyển byte. Tải byte không dấu (lbu) tải một byte từ bộ nhớ, đặt nó vào 8 bit
ngoài cùng bên phải của một thanh ghi. Lưu trữ byte (sb) lấy một byte từ 8 bit
ngoài cùng bên phải của một thanh ghi và ghi nó vào bộ nhớ. Vì vậy, chúng tôi
sao chép một byte với trình tự

lbu x12, 0 (x10) // Đọc byte từ nguồn


sb x12, 0 (x11) // Viết byte đến đích

Các ký tự thường được kết hợp thành các chuỗi, có số lượng ký tự thay đổi. Có ba
lựa chọn để đại diện cho một chuỗi : (1) vị trí đầu tiên của chuỗi được dành riêng để
cung cấp độ dài của chuỗi, (2) một biến đi kèm có độ dài của chuỗi (như trong một
cấu trúc) hoặc là (3) vị trí cuối cùng của chuỗi được biểu thị bằng ký tự được sử dụng
để đánh dấu phần cuối của chuỗi. C sử dụng lựa chọn thứ ba, chấm dứt một chuỗi có
byte có giá trị là 0 (được đặt tên là null trong ASCII). Do đó, chuỗi Cal Cal được biểu
thị bằng C bằng 4 byte sau, được hiển thị dưới dạng số thập phân: 67, 97, 108 và 0.
(Như chúng ta sẽ thấy, Java sử dụng tùy chọn đầu tiên.)
116 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Biên dịch thủ tục sao chép chuỗi, hiển thị cách sử dụng chuỗi C
VÍ DỤ
Thủ tục strcpy chuỗi bản sao y để xâu chuỗi x sử dụng quy ước chấm dứt
byte null của C :
void strcpy (char x [], char y [])
{
size_t i;
i = 0;
 trong khi ((x [i] = y [i]) != ‘\ 0,) / * sao chép và kiểm tra byte * /
i + = 1;
}

Mã lắp ráp RISC-V là gì?

Dưới đây là phân đoạn mã lắp ráp RISC-V cơ bản. Giả sử rằng các địa chỉ cơ
sở cho mảng x và y được tìm thấy trong x10 và x11, trong khi Tôi là trong
TRẢ LỜI x19.strcpy điều chỉnh con trỏ ngăn xếp và sau đó lưu thanh ghi đã lưu x19
trên ngăn xếp :
strcpy :
addi sp, sp, -4 // điều chỉnh stack cho thêm 1 mục sw x19, 0 (sp) // lưu x19

Để khởi tạo Tôi đến 0, các bộ hướng dẫn tiếp theo x19 đến 0 bằng cách thêm
0 đến 0 và đặt tổng đó vào x19:
thêm x19, x0, x0 // i = 0 + 0

Đây là sự khởi đầu của vòng lặp. Địa chỉ củay [i] được hình thành đầu tiên
bằng cách thêm Tôi đến y []:
L1: thêm x5, x19, x11 // địa chỉ của y [i] trong x5

Lưu ý rằng chúng tôi không phải nhân lên Tôi bởi 4 kể từ đó y là một mảng
của byte và không phải từ ngữ, như trong các ví dụ trước.
Tải byte (lb) dấu kéo dài byte trong khi tải byte không dấu (lbu) không
mở rộng nó. Để tải nhân vật vào y [i], chúng tôi sử dụng byte tải không dấu,
đặt ký tự vào x6:
lbu x6, 0 (x5) // x6 = y [i]
2.9 Giao tiếp với mọi người 117

Một tính toán địa chỉ tương tự đặt địa chỉ của x [i] trong x7, và sau đó là nhân
vật trong x6 được lưu trữ tại địa chỉ đó.

thêm x7, x19, x10 // địa chỉ của x [i] trong x7 sb x6, 0 (x7) // x [i] = y
[i]

Tiếp theo, chúng tôi thoát khỏi vòng lặp nếu ký tự là 0. Đó là, chúng tôi
thoát nếu đó là ký tự cuối cùng của chuỗi :

beq x6, x0, L2

Nếu không, chúng tôi tăng Tôi và lặp lại :

addi x19, x19, 1 // i = i + 1


jal x0, L1 // đi đến L1

Nếu chúng ta không quay lại, đó là ký tự cuối cùng của chuỗi; chúng tôi khôi
phục x19 và con trỏ ngăn xếp, và sau đó trở về.
L2: lw x19, 0 (sp) addi sp, sp, 4 jalr // khôi phục x19 cũ
x0, 0 (x1) // bật 1 từ ra khỏi ngăn xếp
// trở về

Các bản sao chuỗi thường sử dụng con trỏ thay vì mảng trong C để tránh các
thao tác trên Tôi trong mã trên. Xem Mục 2.14 cho một lời giải thích về
mảng so với con trỏ.

Kể từ khi làm thủ tục strcpy ở trên là một thủ tục lá, trình biên dịch có thể phân
bổ Tôi để đăng ký tạm thời và tránh lưu và khôi phục x19Do đó, thay vì nghĩ rằng
các thanh ghi này chỉ dành cho thời gian, chúng ta có thể nghĩ chúng là các thanh
ghi mà callee nên sử dụng bất cứ khi nào thuận tiện. Khi một trình biên dịch tìm
thấy một thủ tục lá, nó sẽ cạn kiệt tất cả các thanh ghi tạm thời trước khi sử dụng
các thanh ghi mà nó phải lưu.

Ký tự và chuỗi trong Java


Unicode là một mã hóa phổ quát của bảng chữ cái của hầu hết các ngôn ngữ của
con người. Hình 2.16 đưa ra một danh sách các bảng chữ cái Unicode; có gần
như nhiều bảng chữ cái trong Unicode như có ích biểu tượng trong ASCII. Để
bao quát hơn, Java sử dụng Unicode cho các ký tự. Theo mặc định, nó sử dụng
16 bit để thể hiện một ký tự.
118 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Latin Malayalam Tagbanwa Dấu câu chung


Người Hy
Lạp Sinhala Khmer Chữ sửa đổi khoảng cách
Cyrillic Người Thái Mông Cổ Biểu tượng tiền tệ
Armenia Lào Limbu Kết hợp nhãn hiệu diacritical
Tiếng Do
Thái Tây Tạng Tai Lê Kết hợp nhãn hiệu cho biểu tượng
Tiếng Ả
Rập Myanmar Kangxi cấp tiến Siêu ký tự và đăng ký
Syriac Gruzia Hiragana Số mẫu
Thaana Hangul Jamo Katakana Toán tử toán học
Devanagari Ê-ti-ô-a Bopomofo Biểu tượng chữ và số toán học
Tiếng
Bengal Cherokee Kanbun Mẫu chữ nổi
Gurmukhi Canada thống nhất Shavian Nhận dạng ký tự quang học
Giáo trình thổ dân
Gujarati Ôi Osmanya Biểu tượng âm nhạc Byzantine
Oriya Runic Giáo trình Cypriot Biểu tượng âm nhạc
Tamil Tagalog Biểu tượng Tai Xuan Jing Mũi tên
Tiếng Biểu tượng Hexagram
Telugu Hanunoo Kinh Dịch Vẽ hộp
Kannada Buhid Số Aegean Hình dạng hình học

HÌNH 2.16 Bảng chữ cái ví dụ trong Unicode. Unicode phiên bản 4.0 có hơn 160 khối, mà là tên của họ cho một bộ
sưu tập các biểu tượng. Mỗi khối là bội số của 16. Ví dụ, tiếng Hy Lạp bắt đầu từ 0370 hexvà Cyrillic ở 0400hex Ba cột đầu
tiên hiển thị 48 khối tương ứng với ngôn ngữ của con người theo thứ tự số Unicode. Cột cuối cùng có 16 khối đa ngôn
ngữ và không theo thứ tự. Mã hóa 16 bit, được gọi là UTF-16, là mặc định. Mã hóa có độ dài thay đổi, được gọi là UTF-8,
giữ tập hợp con ASCII là tám bit và sử dụng 16 hoặc 32 bit cho các ký tự khác. UTF-32 sử dụng 32 bit cho mỗi ký tự. Các
phiên bản Unicode mới được phát hành vào tháng 6 hàng năm, với phiên bản 13.0 vào năm 2020. Các phiên bản 9.0 đến
13.0 đã thêm các Biểu tượng cảm xúc khác nhau, trong khi các phiên bản trước đó đã thêm các khối ngôn ngữ và chữ
tượng hình mới. Tổng cộng là gần 150.000 ký tự. Để tìm hiểu thêm, xem. www.unicode.org.

Tập lệnh RISC-V có các hướng dẫn rõ ràng để tải và lưu trữ số lượng 16 bit
như vậy, được gọi nửa chữ.Tải một nửa không dấu tải một nửa từ bộ nhớ, đặt nó
vào 16 bit ngoài cùng bên phải của một thanh ghi, lấp đầy 16 bit ngoài cùng bên
trái bằng số không. Giống như tải byte , tải một nửa (lh) coi nửa từ là một số đã
ký và do đó, phần mở rộng ký hiệu để điền vào 16 bit ngoài cùng bên trái của
thanh ghi. Lưu trữ một nửa (sh) lấy một nửa từ 16 bit ngoài cùng bên phải của
một thanh ghi và ghi nó vào bộ nhớ. Chúng tôi sao chép một nửa từ với trình tự
lhu x19, 0 (x10) // Đọc nửa từ (16 bit) từ nguồn sh x19, 0 (x11) // Viết nửa từ
(16 bit) thành Dest

Các chuỗi là một lớp Java tiêu chuẩn với các phương thức tích hợp và được
xác định trước đặc biệt để ghép, so sánh và chuyển đổi. Không giống như C, Java
bao gồm một từ cung cấp độ dài của chuỗi, tương tự như các mảng Java.

Xây dựng: Phần mềm RISC-V được yêu cầu để giữ cho ngăn xếp được căn chỉnh theo
dòng chữ Quadword (16 byte) địa chỉ để có được hiệu suất tốt hơn. Quy ước này có nghĩa
là a char biến được phân bổ trên ngăn xếp có thể chiếm tới 16 byte, mặc dù nó cần ít hơn.
Tuy nhiên, một biến chuỗi C hoặc một mảng byte sẽ gói 16 byte cho mỗi ô tiêu đề và một
biến chuỗi Java hoặc mảng quần short gói 8 nửa từ trên mỗi ô tiêu đề.
2.9 Giao tiếp với mọi người 119

Xây dựng: Phản ánh bản chất quốc tế của web, hầu hết các trang web ngày nay sử
dụng Unicode thay vì ASCII. Do đó, Unicode có thể còn phổ biến hơn ASCII ngày nay.

I. Những tuyên bố nào sau đây về các ký tự và chuỗi trong C và Java là đúng? Kiểm tra
1. Một chuỗi trong C mất khoảng một nửa bộ nhớ là cùng một chuỗi Bản thân bạn
trong Java.
2. Chuỗi chỉ là một tên không chính thức cho các mảng ký tự một chiều
trong C và Java.
3. Các chuỗi trong C và Java sử dụng null (0) để đánh dấu phần cuối của
chuỗi.
4. Hoạt động trên các chuỗi, như độ dài, trong C nhanh hơn so với Java.
II. Loại biến nào có thể chứa 1.000.000.000mười chiếm nhiều không gian bộ
nhớ nhất?
1. int trong C
2. chuỗi trong C
3. chuỗi trong Java

Các
Những người mới đến với máy tính rất ngạc nhiên khi loại dữ liệu
không được mã hóa bên trong dữ liệu mà thay vào đó là chương trình LỚN
hoạt động trên dữ liệu đó. Hình ảnh
Như một sự tương tự, từ ngữ giành được có nghĩa là gì? Bạn có thể
trả lời câu hỏi đó mà không biết bối cảnh, cụ thể là ngôn ngữ mà nó
được cho là. Dưới đây là bốn lựa chọn thay thế :
1. Trong tiếng Anh, đó là động từ là thì quá khứ của chiến thắng.
2. Trong tiếng Hàn, nó là một danh từ là đơn vị tiền tệ của Hàn Quốc.
3. Trong tiếng Ba Lan, nó là một tính từ có nghĩa là có mùi thơm.
4. Trong tiếng Nga, nó là một tính từ có nghĩa là mùi hôi thối.
Một số nhị phân cũng có thể đại diện cho một số loại dữ liệu. Ví dụ,
mẫu 32 bit 01100010 01100001 01010000 0000000 có thể đại diện
cho:
1. 1.650.544.640 nếu chương trình coi nó là số nguyên không dấu.
2. +1.650.544.640 nếu chương trình coi nó là số nguyên đã ký.
3. Ba baP nếu chương trình coi nó như một chuỗi ASCII kết thúc.
4. Màu xanh đậm nếu chương trình coi mẫu bit là hỗn hợp của bốn
màu cơ bản màu lục lam, đỏ tươi, vàng và đen của hệ thống khớp
màu Pantone.
120 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Bức tranh lớn ở trang 94 nhắc nhở chúng ta rằng các hướng dẫn cũng
được biểu thị dưới dạng số, do đó mẫu bit có thể đại diện cho hướng dẫn
ngôn ngữ máy MIPS
011000 10011 00001 01010 00000 000000
tương ứng với hướng dẫn ngôn ngữ lắp ráp nhân lên (xem
Chương 3):
mult $ t2, $ s3, $ tại
Nếu bạn vô tình đưa ra một chương trình xử lý văn bản một hình ảnh,
nó sẽ cố gắng diễn giải nó dưới dạng văn bản và bạn sẽ thấy những hình
ảnh kỳ quái trên màn hình. Bạn sẽ gặp vấn đề tương tự nếu bạn cung cấp
dữ liệu văn bản cho chương trình hiển thị đồ họa. Hành vi không bị hạn
chế này là lý do tại sao các hệ thống tệp có quy ước đặt tên của hậu tố
đưa ra loại tệp (ví dụ:., .jpg, .pdf hoặc .txt) để cho phép chương trình
kiểm tra sự không phù hợp theo tên tệp để giảm sự xuất hiện của các tình
huống xấu hổ như vậy.

2.10 Địa chỉ RISC-V cho Immediates rộng


và Địa chỉ

Mặc dù giữ tất cả các hướng dẫn RISC-V dài 32 bit giúp đơn giản hóa phần cứng,
nhưng có những lúc sẽ thuận tiện khi có các hằng số hoặc địa chỉ 32 bit hoặc lớn
hơn. Phần này bắt đầu với giải pháp chung cho các hằng số lớn, và sau đó hiển thị
tối ưu hóa cho các địa chỉ lệnh được sử dụng trong các nhánh.

Hoạt động ngay lập tức


Mặc dù các hằng số thường ngắn và phù hợp với các trường 12 bit, đôi khi chúng
lớn hơn.
Tập lệnh RISC-V bao gồm hướng dẫn Tải trên ngay lập tức (lui) để tải hằng số
20 bit thành các bit 12 đến 31 của thanh ghi. 12 bit ngoài cùng bên phải được lấp
đầy bằng số không. Hướng dẫn này cho phép, ví dụ, hằng số 32 bit được tạo bằng
hai hướng dẫn. lui sử dụng định dạng hướng dẫn mới, loại U, vì các định dạng
khác không thể chứa hằng số lớn như vậy.

VÍ DỤ
Đang tải hằng số 32 bit

Mã lắp ráp RISC-V để tải hằng số 32 bit này vào thanh ghi là gì x19?

00000000 00111101 00000101 00000000


2.10 Địa chỉ RISC-V cho các địa chỉ và địa chỉ rộng 121

TRẢ LỜI
Đầu tiên, chúng ta sẽ tải các bit 12 đến 31 với mẫu bit đó, là 976 theo số thập
phân, sử dụng lui:
lui x19, 976 // 976số thập phân = 0000 0000 0011 1101 0000

Giá trị của đăng ký x19 sau đó là :

00000000 00111101 00000000 00000000

Bước tiếp theo là thêm vào 12 bit thấp nhất, có giá trị thập phân là 1280 :

addi x19, x19, 1280 // 1280số thập phân = 00000101 00000000

Giá trị cuối cùng trong đăng ký x19 là giá trị mong muốn :

00000000 00111101 00000101 00000000

Xây dựng: Trong ví dụ trước, bit 11 của hằng số là 0. Nếu bit 11 có đã được
thiết lập, sẽ có một biến chứng bổ sung: ngay lập tức 12 bit được mở rộng bằng
dấu, do đó phần bổ sung sẽ âm. Điều này có nghĩa là ngoài việc thêm vào 11 bit
tối đa của hằng số, chúng ta cũng sẽ trừ 212Để bù cho lỗi này, nó đủ để thêm 1
vào hằng số được tải bằng lui, vì hằng số lui được chia tỷ lệ bằng 2.12.

Trình biên dịch hoặc trình biên dịch phải chia các hằng số lớn thành các mảnh và Giao diện
sau đó lắp ráp lại chúng thành một thanh ghi. Như bạn có thể mong đợi, việc hạn
chế kích thước trường ngay lập tức có thể là một vấn đề đối với các địa chỉ bộ phần
nhớ trong tải và cửa hàng cũng như các hằng số trong các hướng dẫn ngay lập tức. cứng /
Do đó, biểu diễn tượng trưng của ngôn ngữ máy RISC-V không còn bị giới phần
hạn bởi phần cứng, mà bởi bất kỳ người tạo ra trình biên dịch nào chọn bao gồm
(xem Mục 2.12). Chúng tôi bám sát phần cứng để giải thích kiến trúc của máy
mềm
tính, lưu ý khi chúng tôi sử dụng ngôn ngữ nâng cao của trình biên dịch không
tìm thấy trong bộ xử lý.
Địa chỉ tại Chi nhánh
Các hướng dẫn nhánh RISC-V sử dụng định dạng hướng dẫn RISC-V với 12 bit
ngay lập tức. Định dạng này có thể đại diện cho các địa chỉ chi nhánh từ −4096
đến 4094, theo bội số của 2. Vì những lý do được tiết lộ trong thời gian ngắn, chỉ
có thể phân nhánh đến các địa chỉ chẵn. Định dạng kiểu SB bao gồm opcode 7 bit,
mã chức năng 3 bit, hai toán hạng thanh ghi 5 bit (rs1 và rs2) và địa chỉ 12 bit
ngay lập tức. Địa chỉ sử dụng mã hóa bất thường, giúp đơn giản hóa thiết kế
datapath nhưng làm phức tạp việc lắp ráp. Hướng dẫn

bne x10, x11, 2000 // nếu x10 != x11, đi đến vị trí 2000 mười = 0111 1101 0000
122 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

có thể được lắp ráp thành định dạng S (nó thực sự phức tạp hơn một chút, như
chúng ta sẽ thấy trong Phần 4.4) :

0011111 01011 01010 001 01000 1100111


im [12: 6] rs2 rs1 func3 im [5: 1] opcode

trong đó opcode cho các nhánh có điều kiện là 1100111hai và bneMã func3 của
funct là 001hai.
Hướng dẫn nhảy và liên kết vô điều kiện (jal) sử dụng định dạng hướng dẫn
với 12 bit ngay lập tức. Hướng dẫn này bao gồm opcode 7 bit, toán hạng thanh
ghi đích 5 bit (rd) và địa chỉ 20 bit ngay lập tức. Địa chỉ liên kết, là địa chỉ của
hướng dẫn theo sau jal, được viết cho rd.
Giống như định dạng kiểu SB, toán hạng địa chỉ định dạng kiểu UJ sử dụng
mã hóa tức thời bất thường và nó không thể mã hóa các địa chỉ lẻ. Vì thế,
jal x0, 2000 // đi đến địa điểm 2000 mười = 0111 1101 0000
có thể được lắp ráp thành định dạng U (Mục 4.4 sẽ hiển thị định dạng thực tế cho
jal) :

0000000001111101000 00000 1101111


im [20: 1] thứ hai opcode

Nếu địa chỉ của chương trình phải phù hợp với trường 20 bit này, điều đó có
nghĩa là không có chương trình nào có thể lớn hơn 220, đó là quá nhỏ để trở thành
một lựa chọn thực tế ngày nay. Một cách khác là chỉ định một thanh ghi sẽ luôn
được thêm vào bù nhánh, để một lệnh nhánh sẽ tính toán như sau :

Bộ đếm chương trình 5 Đăng ký 1 Chi nhánh bù

Tổng này cho phép chương trình lớn bằng 232 và vẫn có thể sử dụng các nhánh
có điều kiện, giải quyết vấn đề kích thước địa chỉ chi nhánh. Sau đó, câu hỏi là,
đăng ký?
Câu trả lời đến từ việc xem các nhánh có điều kiện được sử dụng như thế nào. Các
nhánh có điều kiện được tìm thấy trong các vòng lặp và trong nếu tuyên bố, vì vậy họ
có xu hướng chi nhánh cho một hướng dẫn gần đó. Ví dụ: khoảng một nửa trong số
Địa chỉ tương đối tất cả các chi nhánh có điều kiện trong điểm chuẩn của Spec đi đến các vị trí cách đó
PC An chế độ địa chưa đến 16 hướng dẫn. Kể từ khi chương trình quầy (PC) chứa địa chỉ của hướng
chỉ trong đó địa chỉ dẫn hiện tại, chúng tôi có thể phân nhánh bên trong
là tổng của quầy
chương trình (PC) và
± 210 các từ của lệnh hiện tại hoặc nhảy trong phạm vi ± 218 các từ của hướng dẫn
một hằng số trong hiện tại, nếu chúng ta sử dụng PC làm thanh ghi để được thêm vào địa chỉ. Hầu
hướng dẫn. như tất cả các vòng lặp và nếu báo cáo nhỏ hơn 210 từ ngữ, vì vậy PC là sự lựa
chọn lý tưởng. Hình thức địa chỉ chi nhánh này được gọiĐịa chỉ tương đối PC.
2.10 Địa chỉ RISC-V cho các địa chỉ và địa chỉ rộng 123

Giống như hầu hết các máy tính gần đây, RISC-V sử dụng địa chỉ tương đối
PC cho cả các nhánh có điều kiện và nhảy vô điều kiện, bởi vì đích của các
hướng dẫn này có thể sẽ gần với nhánh. Mặt khác, các cuộc gọi thủ tục có thể
yêu cầu nhảy nhiều hơn 218 từ xa, vì không có gì đảm bảo rằng callee gần với
người gọi. Do đó, RISC-V cho phép nhảy rất dài đến bất kỳ địa chỉ 32 bit nào với
chuỗi hai hướng dẫn : lui ghi các bit 12 đến 31 của địa chỉ vào một thanh ghi tạm
thời và jalr thêm 12 bit thấp hơn của địa chỉ vào thanh ghi tạm thời và nhảy vào
tổng.
Vì các hướng dẫn RISC-V dài 4 byte, các hướng dẫn nhánh RISC-V có thể được
thiết kế để kéo dài phạm vi của chúng bằng cách có địa chỉ liên quan đến PC đề cập
đến số lượng lời nói giữa nhánh và lệnh đích, thay vì số byte. Tuy nhiên, các kiến
trúc sư RISC-V muốn hỗ trợ khả năng các hướng dẫn chỉ dài 2 byte, vì vậy các
hướng dẫn chi nhánh đại diện cho số lượng nửa chữ giữa chi nhánh và mục tiêu chi
nhánh. Do đó, trường địa chỉ 20 bit trong jal lệnh có thể mã hóa khoảng cách ± 2 19
Halfwords, hoặc ± 1 MiB từ PC hiện tại. Tương tự, trường 12 bit trong hướng dẫn
nhánh có điều kiện cũng là một địa chỉ nửa chữ, nghĩa là nó đại diện cho địa chỉ byte
13 bit.

VÍ DỤ
Hiển thị Offset nhánh trong ngôn ngữ máy

Các trong khi vòng lặp trên trang 100 đã được biên dịch thành mã trình biên
dịch RISC-V này :

Vòng lặp: slli x10, x22, 2 // Temp reg x10 = i * 4


thêm x10, x10, x25 // x10 = địa chỉ lưu [i]
lw x9, 0 (x10) // Temp reg x9 = lưu [i]
bne x9, x24, Thoát // đi đến Lối ra nếu lưu [i] != k
addi x22, x22, 1 // i = i + 1
beq x0, x0, Vòng lặp // đi đến vòng lặp
Lối ra:

Nếu chúng ta giả sử chúng ta đặt vòng lặp bắt đầu tại vị trí 80000 trong bộ TRẢ LỜI
nhớ, mã máy RISC-V cho vòng lặp này là gì?

Các hướng dẫn lắp ráp và địa chỉ của họ là :

Địa chỉ Hướng dẫn


80000 0000000 00010 10110 001 01010 0010011
80004 0000000 11001 01010 000 01010 0110011
80008 0000000 00000 01010 011 01001 0000011
80012 0000000 11000 01001 001 01100 1100011
80016 0000000 00001 10110 000 10110 0010011
80020 1111111 00000 00000 000 01101 1100011
124 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Hãy nhớ rằng các hướng dẫn RISC-V có địa chỉ byte, vì vậy địa chỉ của các từ
tuần tự khác nhau bởi 4. Các bne hướng dẫn trên dòng thứ tư thêm 3 từ hoặc
12 byte vào địa chỉ của lệnh, chỉ định đích nhánh liên quan đến lệnh nhánh (12
+ 80012) và không sử dụng địa chỉ đích đầy đủ (80024). Hướng dẫn nhánh
trên dòng cuối cùng thực hiện một phép tính tương tự cho nhánh ngược (−20
+ 80020), tương ứng với nhãn Vòng lặp.
Xây dựng: Trong Chương 2 và 3, chúng tôi giả vờ rằng các nhánh và nhảy sử
dụng định dạng S và U vì lý do sư phạm. Các nhánh có điều kiện và các bước
nhảy vô điều kiện sử dụng các định dạng khớp với độ dài và chức năng của các
trường trong các loại S và U được gọi là SB và UJ, nhưng các bit được xoay
quanh. Lý do cho SB và UJ có ý nghĩa hơn khi bạn hiểu phần cứng, như Chương
4 giải thích. SB và UJ đơn giản hóa phần cứng nhưng cung cấp cho trình biên dịch
(và tác giả của bạn) thêm một chút để làm. Hình 4.17 và 4.18 cho thấy tiết kiệm
phần cứng.

Giao diện Hầu hết các nhánh có điều kiện là đến một vị trí gần đó, nhưng đôi khi chúng phân nhánh
ở xa, xa hơn có thể được thể hiện trong địa chỉ 12 bit trong hướng dẫn nhánh có điều kiện.
phần Trình biên dịch đến giải cứu giống như đã làm với các địa chỉ hoặc hằng số lớn: nó chèn
cứng / một nhánh vô điều kiện vào mục tiêu nhánh và đảo ngược điều kiện để nhánh có điều
phần kiện quyết định có bỏ qua nhánh vô điều kiện hay không.
mềm

Chi nhánh xa

Đưa ra một chi nhánh trên đăng ký x10 bằng không ,


VÍ DỤ
beq x10, x0, L1

thay thế nó bằng một cặp hướng dẫn cung cấp khoảng cách phân nhánh lớn hơn
nhiều.
Các hướng dẫn này thay thế nhánh điều kiện địa chỉ ngắn :
TRẢ LỜI bne x10, x0, L2
jal x0, L1 L2 :
2.10 Địa chỉ RISC-V cho các địa chỉ và địa chỉ rộng 125

1. Địa chỉ ngay lập tức ngay lập

tức rs1 funct3 rd op

2. Đăng ký địa chỉ


funct7 rs2 rs1 func3 thứ hai Đăng ký
op
Đăng ký

3. Địa chỉ cơ sở
ngay lập tức rs1 func3
Ký ức
thứ hai op
Byte Nửa chữ từ

Đăng ký +

4. Địa chỉ tương đối PC


Ký ức
tôi rs2 rs1 func3 tôi op
Lời

PC +

HÌNH 2.17 Minh họa bốn chế độ địa chỉ RISC-V. Các toán hạng được tô màu. Các toán hạng của chế độ 3 là trong bộ nhớ, trong khi
toán hạng cho chế độ 2 là một thanh ghi. Lưu ý rằng các phiên bản tải và lưu trữ byte truy cập, nửa từ, từ. Đối với chế độ 1, toán hạng là
một phần của chính lệnh. Chế độ 4 hướng dẫn địa chỉ trong bộ nhớ, với chế độ 4 thêm một địa chỉ dài vào PC. Lưu ý rằng một thao tác có
thể sử dụng nhiều hơn một chế độ địa chỉ. Thêm, ví dụ, sử dụng cả địa chỉ tức thời (addi) và đăng ký (thêm).

chế độ địa chỉ Một của


Tóm tắt chế độ địa chỉ RISC-V
một số chế độ địa chỉ được
Nhiều hình thức địa chỉ được gọi chung chế độ địa chỉ.Hình 2.17 cho thấy cách phân định bởi việc sử dụng
các toán hạng được xác định cho từng chế độ địa chỉ. Địa chỉ các chế độ của các toán hạng và / hoặc địa
hướng dẫn RISC-V như sau : chỉ khác nhau của chúng.

1. Địa chỉ ngay lập tức, trong đó toán hạng là một hằng số trong lệnh chính
nó.
2. Đăng ký địa chỉ, trong đó toán hạng là một thanh ghi.
3. Căn cứ hoặc là địa chỉ dịch chuyển, nơi toán hạng ở vị trí bộ nhớ có địa chỉ là
tổng của một thanh ghi và một hằng số trong hướng dẫn.
4. Địa chỉ tương đối PC, trong đó địa chỉ chi nhánh là tổng của PC và a hằng
số trong hướng dẫn.
126 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Mã hóa lệnh FIGURE 2.18 RISC-V. Tất cả các hướng dẫn có một trường opcode và tất cả các định
dạng ngoại trừ loại U sử dụng trường funct3. Hướng dẫn loại R sử dụng trường funct7 và dịch chuyển
ngay lập tức (slli, srli, srai) sử dụng trường funct6.

Giải mã ngôn ngữ máy


Đôi khi bạn buộc phải thiết kế ngược ngôn ngữ máy để tạo ngôn ngữ lắp ráp ban đầu.
Một ví dụ là khi nhìn vào bãi rác lõi cốt lõi.Giáo dục Hình 2.18 hiển thị mã hóa RISC-
V của các opcodes cho ngôn ngữ máy RISC-V. Con số này giúp khi dịch bằng tay
giữa ngôn ngữ lắp ráp và ngôn ngữ máy.
2.10 Địa chỉ RISC-V cho các địa chỉ và địa chỉ rộng 127

VÍ DỤ
Mã máy giải mã

Câu lệnh ngôn ngữ lắp ráp tương ứng với hướng dẫn máy này là gì?
00578833hex

Bước đầu tiên là chuyển đổi thập lục phân thành nhị phân :
TRẢ LỜI
0000 0000 0101 0111 1000 1000 0011 0011

Để biết cách diễn giải các bit, chúng ta cần xác định định dạng lệnh và để
làm điều đó trước tiên chúng ta cần xác định opcode Opcode là 7 bit ngoài
cùng bên phải, hoặc 0110011. Đang tìm kiếm. Hình 2.20 đối với giá trị này,
chúng ta thấy rằng opcode tương ứng với các hướng dẫn số học loại R. Do
đó, chúng ta có thể phân tích định dạng nhị phân thành các trường được liệt
kê trong Hình 2.21:

func7 rs2 rs1 func3 thứ hai opcode


0000000 00101 01111 000 10000 0110011

Chúng tôi giải mã phần còn lại của hướng dẫn bằng cách xem các giá trị
trường. Các trường funct7 và funct3 đều bằng 0, cho biết hướng dẫn là thêm
Các giá trị thập phân cho các toán hạng thanh ghi là 5 cho trường rs2, 15 cho
rs1 và 16 cho rd. Những số này đại diện cho các thanh ghi. x5, x15, và
x16Bây giờ chúng ta có thể tiết lộ hướng dẫn lắp ráp :.

thêm x16, x15, x5

Hình 2.19 hiển thị tất cả các định dạng hướng dẫn RISC-V. Hình 2.1 trên trang 70
bóng71 cho thấy ngôn ngữ lắp ráp RISC-V được tiết lộ trong chương này. Chương
tiếp theo bao gồm các hướng dẫn RISC-V để nhân, chia và số học cho các số thực.

HÌNH 2.19 Bốn định dạng hướng dẫn RISC-V. Hình 4.14.6 cho thấy các định dạng RISC-V bị thiếu cho nhánh có điều kiện (SB)
và nhảy vô điều kiện (UJ), có định dạng phù hợp với độ dài của các trường trong loại S và U, nhưng các bit được xoay quanh. Lý do cho
SB và UJ có ý nghĩa hơn khi bạn hiểu về phần cứng được đưa ra trong Chương 4, vì SB và UJ đơn giản hóa phần cứng nhưng cung cấp
cho trình biên dịch thêm một chút để làm.
128 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Kiểm tra I. Phạm vi của các địa chỉ byte cho các nhánh có điều kiện trong RISC-V (K
Bản thân = 1024) là gì?
bạn 1. Địa chỉ từ 0 đến 4K - 1
2. Địa chỉ từ 0 đến 8K - 1
3. Địa chỉ lên đến khoảng 2K trước khi chi nhánh đến khoảng 2K sau đó
4. Địa chỉ lên đến khoảng 4K trước khi chi nhánh đến khoảng 4K sau đó
II. Phạm vi của các địa chỉ byte cho lệnh nhảy và liên kết trong RISC-V (M =
1024K) là gì?
1. Địa chỉ từ 0 đến 512K - 1
2. Địa chỉ từ 0 đến 1M - 1
3. Địa chỉ lên tới khoảng 512K trước chi nhánh đến khoảng 512K sau đó
4. Địa chỉ lên đến khoảng 1M trước khi chi nhánh đến khoảng 1M sau đó

2.11 Song song và hướng dẫn :


Đồng bộ hóa
Thực hiện song song dễ dàng hơn khi các nhiệm vụ độc lập, nhưng thường thì
chúng cần hợp tác. Hợp tác thường có nghĩa là một số nhiệm vụ đang viết các giá
trị mới mà những người khác phải đọc. Để biết khi nào một tác vụ được viết
xong để nó an toàn cho người khác đọc, các tác vụ cần phải đồng bộ hóa. Nếu họ
cuộc đua dữ liệu Hai không đồng bộ hóa, có nguy cơ a cuộc đua dữ liệu, nơi kết quả của chương trình
ký ức truy cập tạo thành có thể thay đổi tùy thuộc vào cách các sự kiện xảy ra.
một cuộc đua dữ liệu Ví dụ, nhớ lại sự tương đồng của tám phóng viên viết một câu chuyện ở trang 44
nếu chúng từ các luồng Ném45 của Chương 1Giả sử một phóng viên cần đọc tất cả các phần trước trước khi viết
khác nhau đến cùng một
kết luận. Do đó, anh ấy hoặc cô ấy phải biết khi nào các phóng viên khác đã hoàn thành
vị trí, ít nhất một là một
lần ghi và chúng xảy ra phần của họ, để không có nguy cơ các phần bị thay đổi sau đó. Đó là, họ đã đồng bộ hóa
lần lượt. tốt hơn việc viết và đọc từng phần để kết luận sẽ phù hợp với những gì được in trong các
phần trước.
Trong điện toán, các cơ chế đồng bộ hóa thường được xây dựng với các thói
quen phần mềm cấp người dùng dựa trên các hướng dẫn đồng bộ hóa do phần
cứng cung cấp. Trong phần này, chúng tôi tập trung vào việc thực hiện khóa và
mở khóa hoạt động đồng bộ hóa. Khóa và mở khóa có thể được sử dụng đơn giản
để tạo các vùng chỉ có một bộ xử lý duy nhất có thể hoạt động, được gọi là a loại
trừ lẫn nhau, cũng như để thực hiện các cơ chế đồng bộ hóa phức tạp hơn.
Khả năng quan trọng mà chúng tôi yêu cầu để thực hiện đồng bộ hóa trong bộ
đa xử lý là một tập hợp các nguyên thủy phần cứng với khả năng nguyên tử đọc
và sửa đổi một vị trí bộ nhớ. Đó là, không có gì khác có thể xen vào giữa đọc và
ghi vị trí bộ nhớ. Nếu không có khả năng như vậy, chi phí xây dựng các nguyên
thủy đồng bộ hóa cơ bản sẽ cao và sẽ tăng lên một cách vô lý khi số lượng bộ xử
lý tăng lên.
2.11 Song song và hướng dẫn: Đồng bộ hóa 129

Có một số công thức thay thế của các nguyên thủy phần cứng cơ bản, tất cả đều
cung cấp khả năng đọc và sửa đổi nguyên tử một vị trí, cùng với một số cách để biết
liệu việc đọc và viết có được thực hiện nguyên tử hay không. Nói chung, các kiến
trúc sư không mong đợi người dùng sử dụng các nguyên thủy phần cứng cơ bản, mà
thay vào đó, các lập trình viên hệ thống sẽ sử dụng các nguyên thủy để xây dựng một
thư viện đồng bộ hóa, một quá trình thường phức tạp và khó khăn.
Hãy bắt đầu với một phần cứng nguyên thủy như vậy và chỉ ra cách nó có thể
được sử dụng để xây dựng một nguyên thủy đồng bộ hóa cơ bản. Một hoạt động
điển hình cho các hoạt động đồng bộ hóa tòa nhà là trao đổi nguyên tử hoặc là
hoán đổi nguyên tử, liên thay đổi một giá trị trong một thanh ghi cho một giá trị
trong bộ nhớ.
Để xem cách sử dụng điều này để xây dựng một nguyên thủy đồng bộ hóa cơ bản,
giả sử rằng chúng tôi muốn xây dựng một khóa đơn giản trong đó giá trị 0 được sử
dụng để chỉ ra rằng khóa là miễn phí và 1 được sử dụng để chỉ ra rằng khóa không
khả dụng. Một bộ xử lý cố gắng đặt khóa bằng cách thực hiện trao đổi 1, trong một
thanh ghi, với địa chỉ bộ nhớ tương ứng với khóa. Giá trị được trả về từ lệnh trao đổi
là 1 (không khả dụng) nếu một số bộ xử lý khác đã yêu cầu quyền truy cập và 0
(miễn phí) nếu không. Trong trường hợp sau, giá trị cũng được thay đổi thành 1
(không khả dụng), ngăn mọi trao đổi cạnh tranh trong bộ xử lý khác cũng lấy 0 (miễn
phí).
Ví dụ: xem xét hai bộ xử lý mà mỗi người cố gắng thực hiện trao đổi đồng
thời: cuộc đua này bị ngăn chặn, vì chính xác một trong các bộ xử lý sẽ thực hiện
trao đổi trước, trả về 0 (miễn phí) và bộ xử lý thứ hai sẽ trả về 1 (không khả dụng)
khi nó làm trao đổi. Chìa khóa để sử dụng trao đổi nguyên thủy để thực hiện
đồng bộ hóa là hoạt động là nguyên tử: trao đổi là không thể chia cắt và hai trao
đổi đồng thời sẽ được đặt hàng bởi phần cứng. Không thể hai bộ xử lý cố gắng
đặt biến đồng bộ hóa theo cách này để cả hai đều nghĩ rằng họ đã đồng thời đặt
biến.
Việc triển khai một thao tác bộ nhớ nguyên tử duy nhất đưa ra một số thách
thức trong thiết kế bộ xử lý, vì nó đòi hỏi cả đọc bộ nhớ và ghi trong một hướng
dẫn duy nhất, không bị gián đoạn.
Một cách khác là có một cặp hướng dẫn trong đó lệnh thứ hai trả về một giá
trị cho biết liệu cặp hướng dẫn có được thực thi như thể cặp đó là nguyên tử hay
không. Cặp hướng dẫn có hiệu quả nguyên tử nếu nó xuất hiện như thể tất cả các
thao tác khác được thực hiện bởi bất kỳ bộ xử lý nào xảy ra trước hoặc sau cặp.
Do đó, khi một cặp lệnh có hiệu quả nguyên tử, không có bộ xử lý nào khác có
thể thay đổi giá trị giữa cặp hướng dẫn.
Trong RISC-V, cặp hướng dẫn này bao gồm một tải đặc biệt được gọi là a từ dành
riêng (lr.w) và một cửa hàng đặc biệt gọi là a từ có điều kiện cửa hàng (sc.w). Các hướng
dẫn này được sử dụng theo thứ tự: nếu nội dung của vị trí bộ nhớ được chỉ định bởi tải
được đặt trước khi có điều kiện lưu trữ đến cùng một địa chỉ, thì điều kiện lưu trữ không
thành công và không ghi giá trị vào bộ nhớ. Điều kiện cửa hàng được xác định để lưu trữ
giá trị của thanh ghi (có lẽ khác nhau) trong bộ nhớ và để thay đổi giá trị của một thanh
ghi khác thành 0 nếu nó thành công và thành giá trị khác không nếu nó thất bại. Như thế,
sc.w chỉ định ba thanh ghi: một để giữ địa chỉ, một để cho biết liệu hoạt động nguyên tử
không thành công hay thành công và một để giữ giá trị được lưu trữ trong bộ nhớ nếu nó
thành công. Vì tải dành riêng trả về giá trị ban đầu và
130 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

chỉ trả về có điều kiện trong kho 0 nếu thành công, trình tự sau thực hiện trao đổi
nguyên tử trên vị trí bộ nhớ được chỉ định bởi nội dung của x20:

một lần nữa: lr.w x10, (x20) // sc.w x11, x23, (x20) // có điều kiện lưu trữ
bne x11, x0, một lần nữa // chi nhánh nếu cửa hàng thất bại (0)
addi x23, x10, 0 // đặt giá trị được tải vào x23

Bất cứ khi nào bộ xử lý can thiệp và sửa đổi giá trị trong bộ nhớ giữa lr.w và
sc.w hướng dẫn, các sc.w viết một giá trị khác không vào x11, gây ra trình tự mã
để thử lại. Ở cuối chuỗi này, nội dung của x23 và vị trí bộ nhớ được chỉ định bởi
x20 đã được trao đổi nguyên tử.

Xây dựng: Mặc dù nó đã được trình bày để đồng bộ hóa đa bộ xử lý, nguyên tử
trao đổi cũng hữu ích cho hệ điều hành trong việc xử lý nhiều quy trình trong một bộ
xử lý. Để đảm bảo không có gì can thiệp vào một bộ xử lý, điều kiện cửa hàng cũng
thất bại nếu bộ xử lý thực hiện chuyển đổi ngữ cảnh giữa hai hướng dẫn (xem
Chương 5).

Xây dựng: Một lợi thế của cơ chế có thể chịu tải / lưu trữ có điều kiện là nó có thể
được sử dụng để xây dựng các nguyên thủy đồng bộ hóa khác, chẳng hạn như so sánh
nguyên tử và trao đổi hoặc là nguyên tử lấy và tăng, được sử dụng trong một số mô hình
lập trình song song. Chúng liên quan đến nhiều hướng dẫn hơn giữa lr.w và sc.w, nhưng
không quá nhiều.
Vì điều kiện cửa hàng sẽ thất bại sau khi một cửa hàng cố gắng khác đến địa chỉ
đặt chỗ tải hoặc bất kỳ ngoại lệ nào, nên phải cẩn thận trong việc chọn hướng dẫn
nào được chèn giữa hai hướng dẫn. Cụ thể, chỉ có số học số nguyên, nhánh chuyển
tiếp và nhánh lùi ra khỏi khối có thể đặt trước / có điều kiện lưu trữ có thể được cho
phép một cách an toàn; mặt khác, có thể tạo các tình huống bế tắc trong đó bộ xử lý
không bao giờ có thể hoàn thành sc.w vì lỗi trang lặp đi lặp lại. Ngoài ra, số lượng
hướng dẫn giữa dự trữ tải và điều kiện cửa hàng nên nhỏ để giảm thiểu xác suất sự
kiện không liên quan hoặc bộ xử lý cạnh tranh khiến điều kiện cửa hàng bị lỗi thường
xuyên.

Xây dựng: Trong khi mã trên thực hiện trao đổi nguyên tử, như sau mã sẽ có
được một khóa hiệu quả hơn tại vị trí trong đăng ký x20, trong đó giá trị 0 có nghĩa là
khóa miễn phí và 1 có nghĩa là khóa được mua :

addi x12 , x0, 1 // sao chép giá trị khóa


một lần nữa:
lr.w x10 , (x20) // tải dành riêng để đọc khóa
bne x10 , x0, một lần nữa // kiểm tra xem nó đã 0 chưa
sc.w x11 , x12, (x20) // cố gắng lưu trữ giá trị mới
bne x11, x0, một lần nữa // chi nhánh nếu cửa hàng thất bại

Chúng tôi phát hành khóa chỉ bằng cách sử dụng một cửa hàng thông thường để ghi
0 vào vị trí :

sw 0 (x20) // khóa miễn phí bằng cách viết 0


2.12 Dịch và bắt đầu một chương trình 131

Khi nào bạn sử dụng các nguyên thủy như dự trữ tải và điều kiện lưu trữ? Kiểm tra
1. Khi hợp tác các luồng của một chương trình song song cần phải đồng bộ Bản thân bạn
hóa để có được hành vi phù hợp để đọc và viết dữ liệu được chia sẻ.
2. Khi hợp tác các quy trình trên bộ giải mã cần phải đồng bộ hóa để đọc và
ghi dữ liệu được chia sẻ.

2.12 Dịch và bắt đầu một chương trình

Phần này mô tả bốn bước trong việc chuyển đổi chương trình C thành tệp trong
bộ lưu trữ không bay hơi (bộ nhớ đĩa hoặc flash) thành chương trình chạy trên
máy tính. Hình 2.20 cho thấy hệ thống phân cấp dịch thuật. Một số hệ thống kết
hợp các bước này để giảm thời gian dịch, nhưng các chương trình trải qua bốn
giai đoạn logic này. Phần này tuân theo hệ thống phân cấp dịch thuật này.

C chương trình

Trình

biên

dịch

Chương trình ngôn ngữ hội

Lắp ráp

Đối tượng: Mô-đun ngôn ngữ máy Đối tượng: Thói quen thư viện (ngôn ngữ máy)

Liên kết

Thực thi: Chương trình ngôn ngữ máy

Máy xúc lật

Ký ức

HÌNH 2.20 Một hệ thống phân cấp dịch thuật cho C . Một chương trình ngôn ngữ cấp cao lần đầu tiên được biên soạn thành một
chương trình ngôn ngữ lắp ráp và sau đó lắp ráp thành một mô-đun đối tượng bằng ngôn ngữ máy. Trình liên kết kết hợp nhiều mô-đun với
các thói quen thư viện để giải quyết tất cả các tài liệu tham khảo. Bộ tải sau đó đặt mã máy vào các vị trí bộ nhớ thích hợp để bộ xử lý thực
hiện. Để tăng tốc quá trình dịch thuật, một số bước được bỏ qua hoặc kết hợp. Một số trình biên dịch tạo ra các mô-đun đối tượng trực tiếp
và một số hệ thống sử dụng các trình tải liên kết thực hiện hai bước cuối cùng. Để xác định loại tệp, UNIX tuân theo quy ước hậu tố cho các
tệp: Tệp nguồn C được đặt tênx.c, tệp lắp ráp là x.s, tệp đối tượng được đặt tên x.o, thói quen thư viện được liên kết tĩnh là x.a, các tuyến
thư viện được liên kết động là x.so và các tệp thực thi theo mặc định được gọi là a.out. MS-DOS sử dụng các hậu
tố .C, .ASM, .OBJ, .LIB , .DLL và .EXE cho cùng một hiệu ứng.
132 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Trình biên dịch


Trình biên dịch biến chương trình C thành an chương trình ngôn ngữ lắp ráp, một hình
thức tượng trưng của những gì máy hiểu. Các chương trình ngôn ngữ cấp cao có ít dòng
mã hơn ngôn ngữ lắp ráp, vì vậy năng suất lập trình viên cao hơn nhiều.
ngôn ngữ lắp ráp A Năm 1975, nhiều hệ điều hành và lắp ráp đã được viết vào lắp ráp ngôn ngữ
ngôn ngữ tượng trưng có bởi vì ký ức nhỏ và trình biên dịch không hiệu quả. Các tăng gấp triệu lần dung
thể được dịch sang ngôn lượng bộ nhớ trên mỗi chip DRAM đã làm giảm mối lo ngại về kích thước
ngữ máy nhị phân. chương trình và tối ưu hóa trình biên dịch ngày nay có thể tạo ra các chương trình
ngôn ngữ lắp ráp gần như một chuyên gia ngôn ngữ lắp ráp và đôi khi còn tốt hơn
cho các chương trình lớn.

Lắp ráp
Vì ngôn ngữ lắp ráp là giao diện cho phần mềm cấp cao hơn, trình biên dịch cũng
có thể xử lý các biến thể phổ biến của hướng dẫn ngôn ngữ máy như thể chúng là
hướng dẫn theo cách riêng của chúng. Phần cứng không cần thực hiện các hướng
dẫn này; tuy nhiên, sự xuất hiện của chúng trong ngôn ngữ lắp ráp đơn giản hóa
giả hành A biến thể phổ dịch thuật và lập trình. Hướng dẫn như vậy được gọi giả hành.
biến của hướng dẫn ngôn Như đã đề cập ở trên, phần cứng RISC-V đảm bảo đăng ký đó x0 luôn có giá trị 0.
ngữ lắp ráp thường được Đó là, bất cứ khi nào đăng ký x0 được sử dụng, nó cung cấp 0 và nếu lập trình viên
coi như thể đó là một
cố gắng thay đổi giá trị x0, giá trị mới chỉ đơn giản là bị loại bỏ. Đăng ký x0 được sử
hướng dẫn theo đúng
nghĩa của nó.
dụng để tạo hướng dẫn ngôn ngữ lắp ráp sao chép nội dung của một thanh ghi này
sang thanh ghi khác. Do đó, trình biên dịch RISC-V chấp nhận hướng dẫn sau mặc
dù nó không được tìm thấy trong ngôn ngữ máy RISC-V :
li x9, 123 // tải giá trị ngay lập tức 123 vào thanh ghi x9

Trình biên dịch chuyển đổi hướng dẫn ngôn ngữ lắp ráp này thành ngôn ngữ
máy tương đương với hướng dẫn sau :

addi x9, x0, 123 // đăng ký x9 được đăng ký x0 + 123

Trình biên dịch RISC-V cũng chuyển đổi mv (di chuyển) vào một addi chỉ dẫn.

Như thế mv x10, x11 // đăng ký x10 được đăng ký x11

trở thành

addi x10, x11, 0 // đăng ký x10 được đăng ký x11 + 0

Nhà lắp ráp cũng chấp nhận j Dán nhãn cho nhánh vô điều kiện vào nhãn, làm
tiêu chuẩn cho jal x0, Nhãn Nó cũng chuyển đổi các chi nhánh đến các địa điểm
xa thành một nhánh và một bước nhảy. Như đã đề cập ở trên, trình biên dịch
RISC-V cho phép các hằng số lớn được tải vào một thanh ghi mặc dù kích thước
giới hạn của các hướng dẫn ngay lập tức. Như vậy, các. tải ngay lập tức (li) giả
thuyết được giới thiệu ở trên
2.12 Dịch và bắt đầu một chương trình 133

có thể tạo hằng số lớn hơn addiTrường ngay lập tức có thể chứa; các địa chỉ tải (la)
macro hoạt động tương tự cho các địa chỉ tượng trưng. Cuối cùng, nó có thể đơn giản
hóa tập lệnh bằng cách xác định biến thể nào của hướng dẫn mà lập trình viên muốn.
Ví dụ: trình biên dịch RISC-V không yêu cầu lập trình viên chỉ định phiên bản ngay
lập tức của lệnh khi sử dụng hằng số cho các hướng dẫn số học và logic; nó chỉ tạo ra
opcode thích hợp. Như thế

và x9, x10, 15 // đăng ký x9 được x10 VÀ 15

trở thành

andi x9, x10, 15 // đăng ký x9 được x10 VÀ 15


Chúng tôi bao gồm các thành phốTôiHướng dẫn để nhắc nhở người đọc rằng
andi tạo ra một opcode khác nhau ở định dạng hướng dẫn khác với và hướng dẫn
không có toán hạng ngay lập tức.
Tóm lại, pseudoinstructions cung cấp cho RISC-V một bộ hướng dẫn ngôn
ngữ lắp ráp phong phú hơn so với các hướng dẫn được thực hiện bởi phần cứng.
Nếu bạn định viết chương trình lắp ráp, hãy sử dụng pseudoinstructions để đơn
giản hóa nhiệm vụ của bạn. Tuy nhiên, để hiểu kiến trúc RISC-V và chắc chắn sẽ
có được hiệu suất tốt nhất, hãy nghiên cứu các hướng dẫn RISC-V thực sự được
tìm thấy trong Hình 2.1 và 2,18Để giảm nhầm lẫn về các hướng dẫn thực tế so
với giả hành, Chương 2 và 3 sẽ chỉ sử dụng các hướng dẫn thực tế ngay cả khi
một lập trình viên ngôn ngữ lắp ráp có kinh nghiệm sẽ sử dụng giả hành.
Các nhà lắp ráp cũng sẽ chấp nhận số lượng trong một loạt các căn cứ. Ngoài nhị
phân và thập phân, chúng thường chấp nhận một cơ sở ngắn gọn hơn nhị phân nhưng
dễ dàng chuyển đổi thành một mẫu bit. Bộ lắp ráp RISC-V sử dụng thập lục phân và
bát phân.
Các tính năng như vậy là thuận tiện, nhưng nhiệm vụ chính của một trình biên
dịch là lắp ráp thành mã máy. Trình biên dịch biến chương trình ngôn ngữ lắp
ráp thành một tập tin đối tượng, đó là sự kết hợp của các hướng dẫn ngôn ngữ
máy, dữ liệu và thông tin cần thiết để đặt hướng dẫn đúng trong bộ nhớ.
Để tạo phiên bản nhị phân của mỗi lệnh trong chương trình ngôn ngữ lắp ráp, trình
biên dịch phải xác định địa chỉ tương ứng với tất cả các nhãn. Các nhà lắp ráp theo dõi bảng biểu tượng Một
các nhãn được sử dụng trong các chi nhánh và hướng dẫn truyền dữ liệu trong a bảng cái bàn khớp tên của
biểu tượngNhư bạn có thể mong đợi, bảng chứa các cặp ký hiệu và địa chỉ. nhãn với địa chỉ của các
Tệp đối tượng cho các hệ thống UNIX thường chứa sáu phần riêng biệt : từ bộ nhớ mà hướng dẫn
chiếm giữ.
n Các tiêu đề tập tin đối tượng mô tả kích thước và vị trí của các phần khác
của tệp đối tượng.
n Các phân đoạn văn bản chứa mã ngôn ngữ máy.
n Các phân đoạn dữ liệu tĩnh chứa dữ liệu được phân bổ cho vòng đời của
chương trình. (UNIX cho phép các chương trình sử dụng cả hai dữ liệu tĩnh,
được phân bổ trong suốt chương trình, và dữ liệu động, có thể phát triển
hoặc thu nhỏ khi cần thiết bởi chương trình. Xem Hình 2.13).
n Các thông tin di dời xác định các hướng dẫn và từ dữ liệu phụ thuộc vào địa
chỉ tuyệt đối khi chương trình được tải vào bộ nhớ.
134 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

n Các bảng biểu tượng chứa các nhãn còn lại không được xác định, chẳng
hạn như các tham chiếu bên ngoài.
n Các thông tin gỡ lỗi chứa một mô tả ngắn gọn về cách các mô-đun được
biên dịch để trình gỡ lỗi có thể liên kết các hướng dẫn máy với các tệp
nguồn C và làm cho các cấu trúc dữ liệu có thể đọc được.
Tiểu mục tiếp theo cho thấy cách đính kèm các thói quen như vậy đã được lắp
ráp, chẳng hạn như các thói quen của thư viện.

Liên kết
Những gì chúng tôi đã trình bày cho đến nay cho thấy rằng một thay đổi duy nhất cho một
dòng của một thủ tục yêu cầu biên dịch và lắp ráp toàn bộ chương trình. Dịch lại hoàn
toàn là một sự lãng phí khủng khiếp của tài nguyên điện toán. Sự lặp lại này đặc biệt lãng
phí cho các thói quen thư viện tiêu chuẩn, bởi vì các lập trình viên sẽ biên dịch và lắp ráp
các thói quen mà theo định nghĩa gần như không bao giờ thay đổi. Một cách khác là biên
dịch và lắp ráp từng quy trình một cách độc lập, để thay đổi thành một dòng sẽ chỉ yêu cầu
biên dịch và lắp ráp một quy trình. Sự thay thế này đòi hỏi một chương trình hệ thống mới,
liên kết Cũng được gọi được gọi là a biên tập viên liên kết hoặc là liên kết, trong đó có tất cả các chương trình
biên tập viên liên ngôn ngữ máy được lắp ráp độc lập và các thiết bị của chúng kết hợp với nhau. Lý do một
kếtMột hệ thống. trình liên kết hữu ích là vì nó nhanh hơn nhiều để vá mã so với việc biên dịch lại và lắp
chương trình kết hợp các ráp lại.
chương trình ngôn ngữ Có ba bước cho trình liên kết :
máy được lắp ráp độc
lập và giải quyết tất cả
các nhãn không xác định 1. Đặt mã và mô-đun dữ liệu một cách tượng trưng trong bộ nhớ.
thành một tệp thực thi. 2. Xác định địa chỉ của dữ liệu và nhãn hướng dẫn.
3. Vá cả các tài liệu tham khảo bên trong và bên ngoài.

Trình liên kết sử dụng bảng thông tin và ký hiệu di chuyển trong mỗi mô-đun
đối tượng để giải quyết tất cả các nhãn không xác định. Các tài liệu tham khảo
như vậy xảy ra trong hướng dẫn chi nhánh và địa chỉ dữ liệu, vì vậy công việc
của chương trình này giống như của một biên tập viên: nó tìm thấy các địa chỉ cũ
và thay thế chúng bằng các địa chỉ mới. Chỉnh sửa là nguồn gốc của tên biên tập
tập tin thực thi A viên liên kết, tên viết tắt hoặc liên kết.
chương trình chức năng Nếu tất cả các tham chiếu bên ngoài được giải quyết, trình liên kết tiếp theo sẽ
ở định dạng của một tệp xác định vị trí bộ nhớ mà mỗi mô-đun sẽ chiếm giữ. Nhớ lại điều đó Hình 2.13
đối tượng không chứa trên trang 112 cho thấy quy ước RISC-V để phân bổ chương trình và dữ liệu vào
các tham chiếu chưa bộ nhớ. Do các tệp được lắp ráp cách ly, trình biên dịch không thể biết nơi hướng
được giải quyết. Nó có dẫn và dữ liệu mô-đun sẽ được đặt so với các mô-đun khác. Khi liên kết đặt một
thể chứa các bảng biểu mô-đun trong bộ nhớ, tất cả tuyệt đối tài liệu tham khảo, nghĩa là, địa chỉ bộ nhớ
tượng và thông tin gỡ lỗi.
không liên quan đến một thanh ghi, phải di dời để phản ánh vị trí thực sự của nó.
Một tập tin thực thi tước
tước không chứa thông Các liên kết tạo ra một tập tin thực thi có thể chạy trên máy tính. Thông thường,
tin đó. Thông tin di dời tệp này có cùng định dạng với tệp đối tượng, ngoại trừ việc nó không chứa các tham
có thể được bao gồm cho chiếu chưa được giải quyết. Có thể có các tệp được liên kết một phần, chẳng hạn như
bộ tải. các thói quen của thư viện, vẫn có các địa chỉ chưa được giải quyết và do đó dẫn đến
các tệp đối tượng.
2.12 Dịch và bắt đầu một chương trình 135

Liên kết tập tin đối tượng


VÍ DỤ
Liên kết hai tập tin đối tượng dưới đây. Hiển thị địa chỉ cập nhật của một vài
hướng dẫn đầu tiên của tệp thực thi đã hoàn thành. Chúng tôi hiển thị các
hướng dẫn trong ngôn ngữ lắp ráp chỉ để làm cho ví dụ dễ hiểu; trong thực tế,
các hướng dẫn sẽ là số.
Lưu ý rằng trong các tệp đối tượng, chúng tôi đã tô sáng các địa chỉ và ký
hiệu phải được cập nhật trong quy trình liên kết: các hướng dẫn tham khảo
địa chỉ của các thủ tục A và B và các hướng dẫn đề cập đến địa chỉ của các từ
dữ liệu X và Y.

Tiêu đề tập tin đối


tượng
Tên Thủ tục A
Kích thước văn
bản 100hex
Kích thước dữ
20hex
liệu
Phân khúc văn bản Địa chỉ Hướng dẫn
0 lw x10, 0 (x3)
4 jal x1, 0
... ...
Phân khúc dữ liệu 0 (X)
... ...
Di dời thông tin Địa chỉ Loại hướng dẫn Sự phụ thuộc
0 lw X
4 jal B
Bảng biểu tượng Nhãn Địa chỉ
X -
B -
Tên Thủ tục B
Kích thước văn
bản 200hex
Kích thước dữ
30hex
liệu
Phân khúc văn bản Địa chỉ Hướng dẫn
0 sw x11, 0 (x3)
4 jal x1, 0
... ...
Phân khúc dữ liệu 0 (Y)
... ...
Di dời thông tin Địa chỉ Loại hướng dẫn Sự phụ thuộc
0 sw Y
4 jal A
Bảng biểu tượng Nhãn Địa chỉ
Y -
A -
Thủ tục A cần tìm địa chỉ cho biến được dán nhãn X để đặt trong hướng dẫn
tải và tìm địa chỉ của thủ tục B để đặt trong jal
136 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

chỉ dẫn. Thủ tục B cần địa chỉ của biến được dán nhãn Y cho hướng dẫn cửa
TRẢ LỜI hàng và địa chỉ của thủ tục A cho nó jal chỉ dẫn.
Từ Hình 2.14 trên trang 113, chúng tôi biết rằng phân đoạn văn bản bắt
đầu tại địa chỉ 0000 0000 0040 0000hex và phân đoạn dữ liệu tại 0000 0000 1000
0000hexVăn bản thủ tục. A được đặt tại địa chỉ đầu tiên và dữ liệu của nó thứ
hai. Tiêu đề tập tin đối tượng cho thủ tục A nói rằng văn bản của nó là 100hex
byte và dữ liệu của nó là 20hex byte, vì vậy địa chỉ bắt đầu cho thủ tục B văn
bản là 40 0100hexvà dữ liệu của nó bắt đầu từ 1000 0020hex.

Tiêu đề tập tin thực thi


300hex
Kích thước văn bản
50hex
Kích thước dữ liệu
Phân khúc văn bản Địa chỉ Hướng dẫn
0000 0000 0040 0000hex lw x10, 0 (x3)
0000 0000 0040 0004hex jal x1, 252mười
... ...
0000 0000 0040 0100hex sw x11, 32 (x3)
0000 0000 0040 0104hex jal x1, -260mười
... ...
Phân khúc dữ liệu Địa chỉ
0000 0000 1000 0000hex (X)
... ...
0000 0000 1000 0020hex (Y)
... ...

Bây giờ trình liên kết cập nhật các trường địa chỉ của hướng dẫn. Nó sử
dụng trường loại hướng dẫn để biết định dạng của địa chỉ sẽ được chỉnh sửa.
Chúng tôi có ba loại ở đây :
1. Các hướng dẫn nhảy và liên kết sử dụng địa chỉ tương đối PC. Như vậy,
cho jal tại địa chỉ 40 0004hex đi đến 40 0100hex (địa chỉ của thủ tục B), nó
phải đặt (40 0100hex - 40 0004hex) hoặc 252mười trong trường địa chỉ của
nó. Tương tự, kể từ đó 40 0000hex là địa chỉ của thủ tục A, các jal tại
40 0104hex nhận được số âm -260mười (40 0000hex - 40 0104hex) trong
trường địa chỉ của nó.
2. Các địa chỉ tải khó hơn vì chúng liên quan đến một thanh ghi cơ sở.
Ví dụ này sử dụng x3 như đăng ký cơ sở, giả sử nó được khởi tạo 0000
0000 1000 0000hex Để có được địa chỉ. 0000 0000 1000 0000hex (địa chỉ
của từ X), chúng tôi đặt 0mười trong trường địa chỉ của lw tại địa chỉ 40
0000hexTương tự, chúng tôi đặt. 20hex trong trường địa chỉ của sw tại địa
chỉ 40 0100hex để có được địa chỉ 0000 0000 1000 0020hex (địa chỉ của ô
kép Y).

3. Địa chỉ cửa hàng được xử lý giống như địa chỉ tải, ngoại trừ định dạng
hướng dẫn loại S của chúng thể hiện ngay lập tức khác với định dạng kiểu
tải I. Chúng tôi đặt 32mười trong trường địa chỉ của sw tại địa chỉ 40 0100hex
để có được địa chỉ 0000 0000 1000 0020hex (địa chỉ của từ Y).
2.12 Dịch và bắt đầu một chương trình 137

Máy xúc lật


Bây giờ tệp thực thi đã có trên đĩa, hệ điều hành đọc nó vào bộ nhớ và khởi động
nó. Các máy xúc lật tuân theo các bước sau trong các hệ thống UNIX : máy xúc lật Một hệ
thống chương trình đặt
1. Đọc tiêu đề tệp thực thi để xác định kích thước của các phân đoạn văn bản chương trình đối tượng
và dữ liệu. vào bộ nhớ chính để nó
sẵn sàng thực thi.
2. Tạo một không gian địa chỉ đủ lớn cho văn bản và dữ liệu.
3. Sao chép các hướng dẫn và dữ liệu từ tệp thực thi vào bộ nhớ.
4. Sao chép các tham số (nếu có) vào chương trình chính vào ngăn xếp.
5. Khởi tạo các thanh ghi bộ xử lý và đặt con trỏ ngăn xếp đến vị trí miễn phí
đầu tiên.
6. Chi nhánh cho một thói quen khởi động sao chép các tham số vào các thanh
ghi đối số và gọi thói quen chính của chương trình. Khi thói quen chính trở lại,
thói quen khởi động chấm dứt chương trình với an lối ra gọi hệ thống.

Thư viện liên kết động


Phần đầu tiên của phần này mô tả cách tiếp cận truyền thống để liên kết các thư Hầu như mọi vấn đề
viện trước khi chương trình được chạy. Mặc dù cách tiếp cận tĩnh này là cách trong khoa học máy
nhanh nhất để gọi các thói quen của thư viện, nhưng nó có một vài nhược điểm : tính đều có thể được
n Các thói quen thư viện trở thành một phần của mã thực thi. Nếu một phiên giải quyết bằng một
bản mới của thư viện được phát hành để sửa lỗi hoặc hỗ trợ các thiết bị mức độ khác.
phần cứng mới, chương trình được liên kết tĩnh sẽ tiếp tục sử dụng phiên David Wheeler
bản cũ.
n Nó tải tất cả các thói quen trong thư viện được gọi ở bất cứ đâu trong tệp
thực thi, ngay cả khi các cuộc gọi đó không được thực thi. Thư viện có thể
lớn so với chương trình; ví dụ: thư viện C tiêu chuẩn trên hệ thống RISC-V
chạy hệ điều hành Linux là 1,5 MiB . thư viện liên kết động
Những bất lợi này dẫn đến thư viện liên kết động (DLL), nơi các thói quen (DLL) Thư viện các thói
thư viện không được liên kết và tải cho đến khi chương trình được chạy. Cả quen được liên kết với
chương trình và thói quen thư viện đều giữ thêm thông tin về vị trí của các thủ một chương trình trong
khi thực hiện.
tục không cục bộ và tên của chúng. Trong phiên bản gốc của DLL, trình tải đã
chạy một trình liên kết động, sử dụng thông tin bổ sung trong tệp để tìm các thư
viện thích hợp và cập nhật tất cả các tham chiếu bên ngoài.
Nhược điểm của phiên bản ban đầu của DLL là nó vẫn liên kết tất cả các thói
quen của thư viện có thể được gọi, so với chỉ những thói quen được gọi trong quá
trình chạy chương trình. Quan sát này đã dẫn đến phiên bản liên kết thủ tục lười
biếng của DLL, trong đó mỗi thói quen chỉ được liên kết sau nó được gọi là.
Giống như nhiều đổi mới trong lĩnh vực của chúng tôi, thủ thuật này phụ thuộc
vào mức độ không hướng. Hình 2.21 cho thấy kỹ thuật. Nó bắt đầu với các thói
quen không cục bộ gọi một tập hợp thói quen giả ở cuối chương trình, với một
mục nhập cho mỗi thói quen không cục bộ. Mỗi mục giả này chứa một nhánh
gián tiếp.
138 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Văn bản Văn bản

JAL JAL
... ...
LW LW
JALR JALR
... ...

Dữ liệu Dữ liệu

Văn bản
...
ADDI x0, ID
JAL
...

Văn bản
Liên kết động / trình tải
Remap DLL thường
xuyên
JAL
...

Văn bản
Dữ liệu / Văn bản Thói quen DLL
Thói quen DLL ...
... JALR
JALR
(b) Các cuộc gọi tiếp theo đến thói
(a) Cuộc gọi đầu tiên đến quen DLL
thói quen DLL
HÌNH 2.21 Thư viện được liên kết động thông qua liên kết thủ tục lười biếng. (a) Các bước
đầu tiên thời gian một cuộc gọi được thực hiện cho thói quen DLL. (b) Các bước để tìm thói quen, tóm tắt
lại và liên kết nó được bỏ qua trong các cuộc gọi tiếp theo. Như chúng ta sẽ thấy trong Chương 5, hệ điều
hành có thể tránh sao chép thói quen mong muốn bằng cách ánh xạ lại bằng cách sử dụng quản lý bộ nhớ
ảo.

Lần đầu tiên thói quen thư viện được gọi, chương trình gọi mục giả và theo nhánh
gián tiếp. Nó trỏ đến mã đặt một số trong một thanh ghi để xác định thói quen thư
viện mong muốn và sau đó phân nhánh đến trình liên kết / trình tải động. Trình liên
kết / trình tải tìm thấy thói quen mong muốn, tóm tắt lại và thay đổi địa chỉ trong vị
trí nhánh gián tiếp để trỏ đến thói quen đó. Sau đó nó phân nhánh cho nó. Khi thói
quen hoàn thành, nó trở về trang web gọi ban đầu. Sau đó, cuộc gọi đến thư viện
thường xuyên phân nhánh gián tiếp đến thói quen mà không cần thêm bước nhảy.
Tóm lại, DLL yêu cầu không gian bổ sung cho thông tin cần thiết cho liên kết
động, nhưng không yêu cầu toàn bộ thư viện phải được sao chép hoặc liên kết. Họ trả
rất nhiều chi phí trong lần đầu tiên một thói quen được gọi, nhưng chỉ một chi nhánh
gián tiếp duy nhất sau đó. Lưu ý rằng tiền lãi từ thư viện không phải trả thêm chi phí.
Microsoft Microsoft Windows dựa nhiều vào các thư viện được liên kết động và nó
cũng là mặc định khi thực hiện các chương trình trên các hệ thống UNIX ngày nay.
2.12 Dịch và bắt đầu một chương trình 139

Bắt đầu một chương trình Java


Cuộc thảo luận ở trên nắm bắt mô hình truyền thống thực hiện một chương trình,
trong đó nhấn mạnh vào thời gian thực hiện nhanh cho một chương trình được
nhắm mục tiêu đến một kiến trúc tập lệnh cụ thể hoặc thậm chí là một triển khai
cụ thể của kiến trúc đó. Thật vậy, có thể thực thi các chương trình Java giống như
C. Java được phát minh với một bộ mục tiêu khác, tuy nhiên. Một là chạy an toàn
trên bất kỳ máy tính nào, ngay cả khi nó có thể làm chậm thời gian thực hiện.
Hình 2.22 hiển thị các bước dịch và thực thi điển hình cho Java. Thay vào đó hơn là biên
dịch sang ngôn ngữ lắp ráp của máy tính đích, Java được biên dịch trước tiên theo các hướng
dẫn dễ diễn giải: the Mã byte Java tập lệnh (xem Mục 2.15). Tập lệnh này được thiết kế
Mã byte Java Hướng
gần với ngôn ngữ Java bước biên soạn này là tầm thường. Hầu như không có tối ưu hóa
dẫn từ một tập lệnh
được thực hiện. Giống như trình biên dịch C, trình biên dịch Java kiểm tra các loại dữ
được thiết kế để giải
liệu và tạo ra hoạt động phù hợp cho từng loại. Các chương trình Java được phân phối thích các chương trình
trong phiên bản nhị phân của các mã byte này. Java.
Một thông dịch viên phần mềm, được gọi là a Máy ảo Java (JVM), có thể thực
thi mã byte Java. Trình thông dịch là một chương trình mô phỏng kiến trúc tập lệnh. Máy ảo Java (JVM)
Ví dụ, trình giả lập RISC-V được sử dụng với cuốn sách này là một trình thông dịch. Chương trình đó diễn giải
Không cần một bước lắp ráp riêng biệt, vì bản dịch đơn giản đến mức trình biên dịch mã byte Java.
điền vào địa chỉ hoặc JVM tìm thấy chúng khi chạy.
Mặt trái của giải thích là tính di động. Tính khả dụng của các máy ảo Java có
nghĩa là hầu hết mọi người có thể viết và chạy các chương trình Java ngay sau đó

Chương trình Java

Trình biên dịch

Tập tin lớp (mã byte Java) Thói quen thư viện Java (ngôn ngữ máy)

Chỉ trong
thời gian
Máy ảo Java
trình biên
dịch

Phương pháp Java tổng hợp (ngôn ngữ máy)

HÌNH 2.22 Một hệ thống phân cấp dịch thuật cho Java. Một chương trình Java lần đầu tiên được biên
dịch thành nhị phân phiên bản mã byte Java, với tất cả các địa chỉ được xác định bởi trình biên dịch. Chương trình
Java hiện đã sẵn sàng để chạy trên trình thông dịch, được gọi là Máy ảo Java (JVM). JVM liên kết với các
phương thức mong muốn trong thư viện Java trong khi chương trình đang chạy. Để đạt được hiệu suất cao hơn,
JVM có thể gọi trình biên dịch JIT, biên dịch có chọn lọc các phương thức sang ngôn ngữ máy gốc của máy mà
nó đang chạy.
140 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Java đã được công bố. Ngày nay, máy ảo Java được tìm thấy trong hàng tỷ thiết
bị, trong mọi thứ từ điện thoại di động đến trình duyệt Internet.
Nhược điểm của giải thích là hiệu suất thấp hơn. Những tiến bộ đáng kinh
ngạc về hiệu suất của những năm 1980 và 1990 đã khiến việc giải thích trở nên
khả thi đối với nhiều ứng dụng quan trọng, nhưng hệ số chậm lại 10 khi so sánh
với các chương trình C được biên dịch theo truyền thống khiến Java không hấp
dẫn đối với một số ứng dụng.
Trình biên dịch chỉ Để duy trì tính di động và cải thiện tốc độ thực thi, giai đoạn tiếp theo của phát
trong thời gian (JIT) triển Java là các trình biên dịch được dịch trong khi chương trình đã chạy. Như
Tên thường được trao cho
vậy Trình biên dịch thời gian (JIT) thường hồ sơ chương trình đang chạy để tìm
một trình biên dịch hoạt
động trong thời gian chạy, nơi các phương thức nóng của Cameron là và sau đó biên dịch chúng thành tập
dịch các phân đoạn mã lệnh gốc mà máy ảo đang chạy. Phần biên dịch được lưu cho lần tiếp theo chương
được giải thích thành mã trình được chạy, để nó có thể chạy nhanh hơn mỗi lần chạy. Sự cân bằng giữa giải
gốc của máy tính. thích và biên dịch này phát triển theo thời gian, do đó các chương trình Java
thường xuyên phải chịu rất ít sự giải thích.
Khi các máy tính trở nên nhanh hơn để các trình biên dịch có thể làm được
nhiều hơn và khi các nhà nghiên cứu phát minh ra các cách để biên dịch Java một
cách nhanh chóng, khoảng cách hiệu suất giữa Java và C hoặc C ++ đang đóng
lại. Mục 2.15 đi vào chiều sâu lớn hơn nhiều trên triển khai các bộ lọc Java,
Kiểm tra Java, JVM và JIT.
Bản thân bạn
Những lợi thế nào của một thông dịch viên so với một dịch giả là quan trọng nhất
đối với các nhà thiết kế Java?
1. Dễ viết một thông dịch viên
2. Thông báo lỗi tốt hơn
3. Mã đối tượng nhỏ hơn
4. Máy độc lập

2.13 Một ví dụ sắp xếp C để đặt tất cả lại với


nhau

Một mối nguy hiểm của việc hiển thị mã ngôn ngữ lắp ráp trong các đoạn là bạn
sẽ không biết chương trình ngôn ngữ lắp ráp đầy đủ trông như thế nào. Trong
phần này, chúng tôi lấy mã RISC-V từ hai thủ tục được viết bằng C: một để trao
đổi các phần tử mảng và một để sắp xếp chúng.
2.13 A C Sắp xếp ví dụ để đặt tất cả lại với nhau 141

HÌNH 2.23 Một thủ tục C hoán đổi hai vị trí trong bộ nhớ. Tiểu mục này sử dụng điều này thủ tục
trong một ví dụ sắp xếp.

Thủ tục hoán đổi


Hãy bắt đầu với mã cho thủ tục hoán đổi trong Hình 2.23Thủ tục này chỉ đơn giản
là hoán đổi hai vị trí trong bộ nhớ. Khi dịch từ C sang ngôn ngữ lắp ráp bằng tay,
chúng tôi làm theo các bước chung sau :.
1. Phân bổ các thanh ghi cho các biến chương trình.
2. Sản xuất mã cho cơ thể của thủ tục.
3. Bảo quản các thanh ghi trên các yêu cầu thủ tục.
Phần này mô tả hoán đổi thủ tục trong ba phần này, kết luận bằng cách đặt tất
cả các mảnh lại với nhau.

Đăng ký phân bổ cho hoán đổi


Như đã đề cập ở trang 104, quy ước RISC-V về truyền tham số là sử dụng các
thanh ghi x10 đến x17 Vì trao đổi chỉ có hai tham số ,. v và k, chúng sẽ được tìm
thấy trong sổ đăng ký x10 và x11 Biến duy nhất khác là. tạm thời, mà chúng tôi
liên kết với đăng ký x5 vì trao đổi là một thủ tục lá (xem trang 108). Phân bổ
đăng ký này tương ứng với các khai báo biến trong phần đầu tiên của thủ tục
hoán đổi trong Hình 2.23.

Mã cho cơ quan của thủ tục hoán đổi


Các dòng còn lại của mã C trong trao đổi là

tạm thời = v [k];


v [k] = v [k + 1];
v [k + 1] = temp;

Hãy nhớ lại rằng địa chỉ bộ nhớ cho RISC-V đề cập đến byte địa chỉ, và vì vậy
các từ thực sự cách nhau 4 byte. Do đó, chúng ta cần nhân chỉ số k bằng 4 trước
khi thêm nó vào địa chỉ. Thay vào đó, quên rằng các địa chỉ từ tuần tự khác nhau
bởi 4 của 1 là một sai lầm phổ biến trong lập trình ngôn ngữ lắp ráp.
142 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Do đó, bước đầu tiên là lấy địa chỉ v [k] bằng cách nhân k bởi 4 thông qua một ca
làm việc còn lại bởi 2 :
slli x6, x11, 2 // reg x6 = k * 4
thêm x6, x10, x6 // reg x6 = v + (k * 4)

Bây giờ chúng tôi tải v [k] sử dụng x6, và sau đó v [k + 1] bằng cách thêm 4 vào
x6:

lw x5, 0 (x6) // reg x5 (temp) = v [k] lw x7, 4 (x6) // reg x7 =


v [k + 1]
// đề cập đến yếu tố tiếp theo của v

Tiếp theo chúng tôi lưu trữ x9 và x11 đến các địa chỉ hoán đổi :

sw x7, 0 (x6) // v [k] = reg x7


sw x5, 4 (x6) // v [k + 1] = reg x5 (temp)

Bây giờ chúng tôi đã phân bổ các thanh ghi và viết mã để thực hiện các hoạt
động của thủ tục. Điều còn thiếu là mã để bảo quản các thanh ghi đã lưu được sử
dụng bên trong hoán đổiVì chúng tôi không sử dụng các thanh ghi đã lưu trong
quy trình lá này, nên không có gì để bảo quản.

Toàn bộ hoán đổi Thủ tục


Bây giờ chúng tôi đã sẵn sàng cho toàn bộ thói quen. Tất cả những gì còn lại là
thêm nhãn thủ tục và chi nhánh trả lại.

hoán đổi:
slli x6, x11, 2 // reg x6 =k*4
thêm x6, x10, x6 // reg x6 = v + (k * 4)
lw x5, 0 (x6) // reg x5 (temp) = v [k]
lw x7, 4 (x6) // reg x7 = v [k + 1]
sw x7, 0 (x6) // v [k] = reg x7
sw x5, 4 (x6) // v [k + 1] = reg x5 (temp)
jalr x0, 0 (x1) // trở về gọi thói quen

Thủ tục sắp xếp


Để đảm bảo rằng bạn đánh giá cao sự nghiêm ngặt của lập trình trong ngôn ngữ
lắp ráp, chúng tôi sẽ thử một ví dụ thứ hai, dài hơn. Trong trường hợp này, chúng
tôi sẽ xây dựng một thói quen gọi thủ tục hoán đổi. Chương trình này sắp xếp một
mảng các số nguyên, sử dụng bong bóng hoặc sắp xếp trao đổi, đây là một trong
những cách đơn giản nhất nếu không phải là loại nhanh nhất. Hình 2.24 hiển thị
phiên bản C của chương trình. Một lần nữa, chúng tôi trình bày quy trình này
trong một số bước, kết luận với quy trình đầy đủ.
2.13 A C Sắp xếp ví dụ để đặt tất cả lại với nhau 143

HÌNH 2.24 Một thủ tục C thực hiện một sắp xếp trên mảng v.

Đăng ký phân bổ cho sắp xếp


Hai tham số của thủ tục sắp xếp, v và n, nằm trong các thanh ghi tham số x10 và
x11và chúng tôi chỉ định đăng ký x19 đến Tôi và đăng ký x20 đến j.

Mã cho cơ quan của thủ tục sắp xếp


Cơ thể thủ tục bao gồm hai lồng nhau cho vòng lặp và một cuộc gọi đến hoán đổi
bao gồm các tham số. Hãy để mở mã từ bên ngoài đến giữa.
Bước dịch đầu tiên là bước đầu tiêncho vòng lặp:
cho (i = 0; i <n; i + = 1) {
Nhớ lại rằng C cho câu lệnh có ba phần: khởi tạo, kiểm tra vòng lặp và tăng
lặp. Nó chỉ mất một hướng dẫn để khởi tạo Tôi đến 0, phần đầu tiên của cho
tuyên bố:
addi x19, x0, 0
Nó cũng chỉ mất một hướng dẫn để tăng Tôi, phần cuối cùng của cho tuyên bố:
addi x19, x19, 1 // i + = 1
Vòng lặp nên được thoát nếu tôi <n là không phải đúng hay nói cách khác, nên
được thoát ra nếu tôi ≥ nBài kiểm tra này chỉ mất một hướng dẫn :.
for1tst: bge x19, x11, exit1 // đi đến exit1 nếu x19 x1 (i≥n)
Phần dưới của vòng lặp chỉ phân nhánh trở lại bài kiểm tra vòng lặp :
j for1tst // nhánh để kiểm tra lối ra vòng ngoài1 :

Mã bộ xương đầu tiên cho vòng lặp là sau đó


addi x19, x0, 0 // i = 0 for1tst :

bge x19, x11, exit1 // đi đến exit1 nếu x19 x1 (i≥n)


?? ?? ...
(cơ thể đầu tiên cho vòng lặp)
?? ?? ...
144 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

addi x19, x19, 1 // i + = 1


j for1tst // nhánh để kiểm tra lối ra vòng ngoài1 :

Voila! (Các bài tập khám phá việc viết mã nhanh hơn cho các vòng lặp tương tự.)
Thứ hai cho vòng lặp trông như thế này trong C :
cho (j = i - 1; j> = 0 && v [j]> v [j + 1]; j - = 1) {
Phần khởi tạo của vòng lặp này lại là một hướng dẫn :
addi x20, x19, -1 // j = i - 1
Sự suy giảm của j ở cuối vòng lặp cũng là một hướng dẫn :
addi x20, x20, -1 j = 1
Các bài kiểm tra vòng lặp có hai phần. Chúng tôi thoát khỏi vòng lặp nếu một
trong hai điều kiện không thành công, vì vậy thử nghiệm đầu tiên phải thoát khỏi
vòng lặp nếu nó không thành công (j <0) :
for2tst :
??blt??x
??x
??thoát ????đi??đến??exit ??nếu??x
??
?? j??
??
Chi nhánh này sẽ bỏ qua bài kiểm tra điều kiện thứ hai. Nếu nó không bỏ qua, thì j
0.
Bài kiểm tra thứ hai thoát ra nếu v [j]> v [j + 1] là không phải đúng, hoặc thoát
nếu v [j] v [j +
1]Đầu tiên chúng tôi tạo địa chỉ bằng cách nhân. j bởi 4 (vì chúng tôi cần một địa chỉ
byte)
và thêm nó vào địa chỉ cơ sở của v:
slli x5, x20, 2 // reg x5 = j * 4
thêm x5, x10, x5 // reg x5 = v + (j * 4)

Bây giờ chúng tôi tải v [j]:


lw x6, 0 (x5) // reg x6 = v [j]
Vì chúng tôi biết rằng phần tử thứ hai chỉ là từ sau, chúng tôi thêm 4 vào địa
chỉ trong sổ đăng ký x5 để có được v [j + 1]:
lw x7, 4 (x5) // reg x7 = v [j + 1]
Chúng tôi kiểm tra v [j] v [j + 1] để thoát khỏi vòng lặp :
chảy máu x6, x7, thoát2 // đi đến lối ra2 nếu x6 x7
Phần dưới của các nhánh vòng quay trở lại thử nghiệm vòng lặp bên trong :
jal, x0 for2tst // nhánh để kiểm tra vòng lặp bên trong
Kết hợp các mảnh, bộ xương của thứ hai cho vòng lặp trông như thế này :
addi x20, x19, -1 // j = i - 1
for2tst : blt x20, x0, thoát2 // đi đến exit2 nếu x20 <0 (j <0)
slli x5, x20 , 2 // reg x5 =j *4
thêm x5 , x10 , x5 // reg x5 = v + (j * 4)
lw x6 , 0 (x5) // reg x6 = v [j]
2.13 A C Sắp xếp ví dụ để đặt tất cả lại với nhau 145

lw x7, 4 (x5) // reg x7 = v [j + 1]


ble x6, x7, exit2 // đi đến lối ra2 nếu x6 x7
...
(cơ thể thứ hai cho vòng lặp)
...
addi x20, x20, -1 // j - = 1
jal, x0 for2tst // nhánh để kiểm tra vòng lặp bên trong
lối ra2 :

Thủ tục gọi vào sắp xếp


Bước tiếp theo là cơ thể của thứ hai cho vòng lặp:

hoán đổi (v, j);


Gọi điện thoại hoán đổi đủ dễ :

jal x1, trao đổi

Truyền thông số trong sắp xếp


Vấn đề đến khi chúng ta muốn vượt qua các tham số vì sắp xếp thủ tục cần các giá
trị trong thanh ghi x10 và x11, tuy nhiên thủ tục hoán đổi cần phải có các tham số
của nó được đặt trong các thanh ghi tương tự. Một giải pháp là sao chép các tham
số cho sắp xếp vào các thanh ghi khác trước đó trong thủ tục, làm cho các thanh
ghi x10 và x11 có sẵn cho cuộc gọi của hoán đổi(Bản sao này nhanh hơn tiết kiệm
và khôi phục. trên ngăn xếp.) Chúng tôi sao chép lần đầu tiên x10 và x11 vào x21
và x22 trong quá trình làm thủ tục :
addi x21, x10, 0 // sao chép tham số x10 vào x21 addi x22, x11, 0 // sao
chép tham số x11 vào x22
Sau đó, chúng tôi chuyển các tham số đến hoán đổi với hai hướng dẫn sau :
addi x10, x21, 0 // tham số hoán đổi đầu tiên là v addi x11, x20, 0 //
tham số hoán đổi thứ hai là j

Bảo quản Đăng ký trong sắp xếp


Mã duy nhất còn lại là lưu và khôi phục các thanh ghi. Rõ ràng, chúng ta phải
lưu địa chỉ trả lại trong đăng ký x1, kể từ đó sắp xếp là một thủ tục và chính nó
được gọi. Các sắp xếp thủ tục cũng sử dụng các thanh ghi lưu callee x19, x20, x21,
và x22, vì vậy họ phải được cứu. Lời mở đầu của sắp xếp thủ tục là sau đó
addi sp, sp, -20 // làm phòng trên stack cho 5 regs
sw x1, 16 (sp) // lưu x1 trên ngăn xếp
sw x22, 12 (sp) // lưu x22 trên ngăn xếp
sw x21, 8 (sp) // lưu x21 trên ngăn xếp
sw x20, 4 (sp) // lưu x20 trên ngăn xếp
sw x19, 0 (sp) // lưu x19 trên ngăn xếp
146 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Đuôi của thủ tục chỉ đơn giản là đảo ngược tất cả các hướng dẫn này, và sau đó
thêm a jalr trở về.

Thủ tục đầy đủ sắp xếp


Bây giờ chúng tôi đặt tất cả các mảnh lại với nhau Hình 2.25, cẩn thận để thay
thế các tài liệu tham khảo cho các thanh ghi x10 và x11 trong cho các vòng lặp
với các tham chiếu đến các thanh ghi x21 và x22 Một lần nữa, để làm cho mã dễ
theo dõi hơn, chúng tôi xác định từng khối mã với mục đích của nó trong quy
trình. Trong ví dụ này, chín dòng của. sắp xếp thủ tục trong C trở thành 34 dòng
trong ngôn ngữ lắp ráp RISC-V.

Phiên bản lắp ráp thủ tục FIGURE 2.25 RISC-V sắp xếp trong Hình 2.27.
2.13 A C Sắp xếp ví dụ để đặt tất cả lại với nhau 147

Xây dựng: Một tối ưu hóa hoạt động với ví dụ này là thủ tục nội tuyến. Thay vì truyền
các đối số trong các tham số và gọi mã bằng a jal hướng dẫn, trình biên dịch sẽ sao chép
mã từ phần thân của hoán đổi thủ tục nơi cuộc gọi đến hoán đổi xuất hiện trong mã.
Inlining sẽ tránh bốn hướng dẫn trong ví dụ này. Nhược điểm của tối ưu hóa nội tuyến là
mã được biên dịch sẽ lớn hơn nếu quy trình nội tuyến được gọi từ một số vị trí. Việc mở
rộng mã như vậy có thể biến thành thấp hơn hiệu suất nếu nó tăng tỷ lệ bỏ lỡ bộ nhớ
cache; xem Chương 5.

Hình 2.26 cho thấy tác động của tối ưu hóa trình biên dịch đối với chương trình Hiểu hiệu suất
sắp xếp hiệu suất, thời gian biên dịch, chu kỳ đồng hồ, số lượng hướng dẫn và
CPI. Lưu ý rằng mã chưa được tối ưu hóa có CPI tốt nhất và tối ưu hóa O1 có số
chương trình
lượng lệnh thấp nhất, nhưng O3 là nhanh nhất, nhắc nhở chúng tôi rằng thời gian
là thước đo chính xác duy nhất về hiệu suất chương trình.
Hình 2.27 so sánh tác động của ngôn ngữ lập trình, biên soạn so với giải thích, và
thuật toán về hiệu suất của các loại. Cột thứ tư cho thấy chương trình C chưa được tối
ưu hóa nhanh hơn 8.3 lần so với mã Java được giải thích cho Bubble Sort. Sử dụng
trình biên dịch JIT làm cho Java 2.1 lần nhanh hơn so với C chưa được tối ưu hóa và
trong hệ số 1,13 của mã C được tối ưu hóa cao nhất. ( Mục 2.15 cung cấp thêm chi
tiết về giải thích so với biên dịch Java và mã Java và jalr cho Bubble Sort.) Các tỷ
lệ aren sắt gần với Quicksort trong Cột 5, có lẽ vì khó khấu hao chi phí biên
dịch thời gian chạy trong thời gian thực hiện ngắn hơn. Cột cuối cùng cho thấy
tác động của một thuật toán tốt hơn, cung cấp ba bậc độ lớn tăng hiệu suất khi
sắp xếp 100.000 mục. Ngay cả khi so sánh Java được giải thích trong Cột 5 với
trình biên dịch C ở mức tối ưu hóa cao nhất trong Cột 4, Quicksort đánh bại
Bong bóng Sắp xếp theo hệ số 50 (0,05 × 2468 hoặc nhanh hơn 123 lần so với mã
C không được tối ưu hóa so với nhanh hơn 2,41 lần).

HÌNH 2.26 So sánh hiệu suất, số lượng lệnh và CPI bằng cách sử dụng tối ưu hóa trình
biên dịch cho Bubble Sort. Các chương trình đã sắp xếp 100.000 từ 32 bit với mảng được khởi tạo
thành giá trị ngẫu nhiên. Các chương trình này được chạy trên Pentium 4 với tốc độ xung nhịp 3.06 GHz
và bus hệ thống 533 MHz với 2 GB PC2100 DDR SDRAM. Nó đã sử dụng Linux phiên bản 2.4.20.
148 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

HÌNH 2.27 Hiệu suất của hai thuật toán sắp xếp trong C và Java bằng cách sử dụng trình giải thích và tối ưu hóa trình
biên dịch so với phiên bản C chưa được tối ưu hóa. Cột cuối cùng cho thấy lợi thế về hiệu suất của Quicksort so với Bubble Sort
cho từng ngôn ngữ và tùy chọn thực hiện. Các chương trình này được chạy trên cùng một hệ thống như trong Hình 2.29JVM là Sun phiên
bản 1.3.1 và JIT là Sun Hotspot phiên bản 1.3.1.

2.14 Mảng so với con trỏ

Một thách thức cho bất kỳ lập trình viên C mới là hiểu con trỏ. So sánh mã lắp ráp sử
dụng mảng và chỉ số mảng với mã lắp ráp sử dụng con trỏ cung cấp cái nhìn sâu sắc
về con trỏ. Phần này hiển thị các phiên bản lắp ráp C và RISC-V của hai quy trình để
xóa một chuỗi các từ trong bộ nhớ: một sử dụng các chỉ mục mảng và một với các
con trỏ. Hình 2.28 cho thấy hai thủ tục C.
Mục đích của phần này là để hiển thị cách con trỏ ánh xạ vào các hướng dẫn
RISC-V và không xác nhận kiểu lập trình ngày. Chúng tôi sẽ thấy tác động của tối ưu
hóa trình biên dịch hiện đại đối với hai quy trình này ở cuối phần.

HÌNH 2.28 Hai thủ tục C để đặt một mảng cho tất cả các số không. rõ ràng1 sử dụng các chỉ số ,
trong khi Clear2 sử dụng con trỏ. Quy trình thứ hai cần một số lời giải thích cho những người không quen
thuộc với C. Địa chỉ của một biến được chỉ định bởi & và đối tượng được chỉ ra bởi một con trỏ được chỉ
định bởi *. Các khai báo khai báo rằng mảng và p là con trỏ tới số nguyên. Phần đầu tiên của cho loop in
Clear2 gán địa chỉ của phần tử đầu tiên của mảng cho con trỏ p. Phần thứ hai của cho kiểm tra vòng lặp để
xem con trỏ có chỉ ra ngoài phần tử cuối cùng của mảng không. Tăng một con trỏ bằng một, ở phần dưới
cùng của cho vòng lặp, có nghĩa là di chuyển con trỏ đến đối tượng tuần tự tiếp theo có kích thước khai
báo của nó. Vì p là một con trỏ tới các số nguyên, trình biên dịch sẽ tạo các hướng dẫn RISC-V để tăng p
lên bốn, số byte trong số nguyên RISC-V. Việc gán trong vòng lặp đặt 0 trong đối tượng được trỏ bởi p.
2.14 Mảng so với Con trỏ 149

Phiên bản mảng rõ ràng


Hãy bắt đầu với phiên bản mảng , rõ ràng1, tập trung vào phần thân của vòng lặp và
bỏ qua mã liên kết thủ tục. Chúng tôi giả định rằng hai tham số mảng và kích thước
được tìm thấy trong các thanh ghi x10 và x11, và đó Tôi được phân bổ để đăng ký x5.
Việc khởi tạo Tôi, phần đầu tiên của cho vòng lặp, rất đơn giản :

addi x5, x0, 0 // i = 0 (đăng ký x5 = 0)

Để thiết lập mảng [i] đến 0 trước tiên chúng ta phải có địa chỉ của nó. Bắt đầu
bằng cách nhân Tôi bằng 4 để có được địa chỉ byte :
loop1: slli x6, x5, 2 // x6 = i * 4

Vì địa chỉ bắt đầu của mảng nằm trong một thanh ghi, chúng tôi phải thêm nó
vào chỉ mục để lấy địa chỉ mảng [i] sử dụng một hướng dẫn thêm :
thêm x7, x10, x6 // x7 = địa chỉ của mảng [i]
Cuối cùng, chúng tôi có thể lưu trữ 0 trong địa chỉ đó :

sw x0, 0 (x7) // mảng [i] = 0

Hướng dẫn này là phần cuối của phần lặp, vì vậy bước tiếp theo là tăngTôi:

addi x5, x5, 1 // i = i + 1

Kiểm tra vòng lặp nếu Tôi nhỏ hơn kích thước :

blt x5, x11, loop1 // nếu (i <kích thước) đi đến loop1

Bây giờ chúng tôi đã thấy tất cả các phần của thủ tục. Dưới đây là mã RISC-V
để xóa một mảng bằng các chỉ số :
addi x5, x0, 0 // i = 0
loop1: slli x6, x5, 2 // x6 = i * 4
thêm x7, x10, x6 // x7 = địa chỉ của mảng [i]
sw x0, 0 (x7) // mảng [i] = 0
addi x5, x5, 1 // i = i + 1
blt x5, x11, vòng lặp1 // nếu (i <kích thước) đi đến vòng 1

(Mã này hoạt động miễn là kích thước lớn hơn 0; ANSI C yêu cầu kiểm tra kích
thước trước vòng lặp, nhưng chúng tôi sẽ bỏ qua tính hợp pháp đó ở đây.)

Phiên bản con trỏ rõ ràng


Quy trình thứ hai sử dụng con trỏ phân bổ hai tham số mảng và kích thước để đăng
ký x10 và x11 và phân bổ tr đăng ký x5Mã cho.
150 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

thủ tục thứ hai bắt đầu bằng việc gán con trỏ tr đến địa chỉ của phần tử đầu tiên
của mảng :
mv x5, x10 // p = địa chỉ của mảng [0]
Mã tiếp theo là cơ thể của cho vòng lặp, chỉ đơn giản là lưu trữ 0 vào tr:
loop2: sw x0, 0 (x5) // Bộ nhớ [p] = 0
Hướng dẫn này thực hiện phần thân của vòng lặp, vì vậy mã tiếp theo là gia
tăng lặp, thay đổi tr để chỉ từ tiếp theo :
addi x5, x5, 4 // p = p + 4
Tăng một con trỏ bằng 1 có nghĩa là di chuyển con trỏ đến đối tượng tuần tự tiếp
theo trong C. Kể từ đó tr là một con trỏ tới số nguyên được khai báo là int, mỗi
trong số đó sử dụng 4 byte, gia số trình biên dịch tr bằng 4.
Các bài kiểm tra vòng lặp là tiếp theo. Bước đầu tiên là tính toán địa chỉ của
yếu tố cuối cùng mảng Bắt đầu với nhân. kích thước bằng 8 để có được địa chỉ
byte của nó :
slli x6, x11, 2 // x6 = kích thước * 4
và sau đó chúng tôi thêm sản phẩm vào địa chỉ bắt đầu của mảng để lấy địa chỉ
của ô kép đầu tiên sau mảng:
thêm x7, x10, x6 // x7 = địa chỉ của mảng [kích thước]
Các bài kiểm tra vòng lặp chỉ đơn giản là để xem nếu tr ít hơn yếu tố cuối cùng
của mảng:
bltu x5, x7, loop2 // nếu (p <& mảng [kích thước]) đi đến loop2
Với tất cả các phần đã hoàn thành, chúng ta có thể hiển thị một phiên bản con
trỏ của mã thành 0 một mảng :
addi x5, x10, 0 // p = địa chỉ của mảng [0]
vòng lặp2 : sw x0, 0 (x5) // Bộ nhớ [p] = 0
addi x5, x5, 4 // p = p + 4
slli x6, x11, 2 // x6 = kích thước * 4
thêm x7, x10, x6 // x7 = địa chỉ của mảng [kích thước]
bltu x5, x7, vòng lặp2 // nếu (p <& mảng [kích thước]) đi đến loop2

Như trong ví dụ đầu tiên, mã này giả định kích thước lớn hơn 0.
Lưu ý rằng chương trình này tính toán địa chỉ của phần cuối của mảng trong
mỗi lần lặp của vòng lặp, mặc dù nó không thay đổi. Một phiên bản nhanh hơn
của mã di chuyển phép tính này ra ngoài vòng lặp :
addi x5, x10, 0 // p = địa chỉ của mảng [0]
slli x6, x11, 2 // x6 = kích thước * 4
thêm x7, x10, x6 // x7 = địa chỉ của mảng [kích thước]
vòng lặp2 : sw x0, 0 (x5) // Bộ nhớ [p] = 0
addi x5, x5, 4 // p = p + 4
bltu x5, x7, vòng lặp2 // nếu (p <& mảng [kích thước]) đi đến loop2
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151

So sánh hai phiên bản rõ ràng


So sánh hai chuỗi mã cạnh nhau minh họa sự khác biệt giữa các chỉ số mảng và
con trỏ (những thay đổi được giới thiệu bởi phiên bản con trỏ được tô sáng) :

addi x5, x0, 0 // i = 0 addi x5, 0 // p = địa chỉ của mảng [0]
= kích thước
loop1: slli x6, x5, 2 // x6 = tôi * 4 slli x6, x11, 2 // x6 * 4
thêm x7, x10, x6 // x7 = địa chỉ của mảng [i] thêm x7, x10, x6 // x7 = địa chỉ của mảng [kích thước]
sw x0, 0 (x7) // mảng [i] = 0 loop2: sw x0, 0 (x5) // Bộ nhớ [p] = 0
addi x5, x5, 1 // i = i + 1 addi x5, x5 , 4 // p = p + 4
blt x5, x11, vòng lặp1 // nếu (i <kích thước) đi đến vòng 1 bltu x5, x7 , vòng lặp2 // nếu (p <& mảng [kích thước]) đi đến loop2

Phiên bản bên trái phải có nhiều người khác và thêm vào bên trong vòng lặp vì
Tôi được tăng lên và mỗi địa chỉ phải được tính toán lại từ chỉ mục mới. Phiên
bản con trỏ bộ nhớ bên phải tăng con trỏ tr trực tiếp. Phiên bản con trỏ di chuyển
dịch chuyển tỷ lệ và phép cộng ràng buộc mảng bên ngoài vòng lặp, do đó giảm
các hướng dẫn được thực hiện cho mỗi lần lặp từ năm xuống còn ba. Tối ưu hóa
thủ công này tương ứng với tối ưu hóa trình biên dịch giảm cường độ (thay vì
nhân) và loại bỏ biến cảm ứng (loại bỏ tính toán địa chỉ mảng trong các vòng lặp).
Mục 2.15 mô tả hai và nhiều tối ưu hóa khác.

Xây dựng: Như đã đề cập trước đó, trình biên dịch C sẽ thêm một bài kiểm tra để
chắc chắn điều đó kích thước lớn hơn 0. Một cách sẽ là phân nhánh theo hướng dẫn
sau vòng lặp với blt x0, x11, sau vòng lặp.

Mọi người đã từng được dạy sử dụng con trỏ trong C để có hiệu quả cao hơn so Hiểu hiệu suất
với mảng có sẵn: Sử dụng con trỏ, ngay cả khi bạn có thể hiểu được mã.Trình
chương trình
biên dịch tối ưu hóa hiện đại có thể tạo mã cho phiên bản mảng cũng tốt như vậy.
Hầu hết các lập trình viên ngày nay thích rằng trình biên dịch làm việc nặng.

2.15 Tài liệu nâng cao: Biên dịch C và


Phiên dịch Java

Phần này cung cấp một cái nhìn tổng quan ngắn gọn về cách trình biên dịch C
hoạt động và cách thức thực thi Java. Bởi vì trình biên dịch sẽ ảnh hưởng đáng kể
đến hiệu suất của máy tính, việc hiểu công nghệ trình biên dịch ngày nay rất quan
trọng để hiểu
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e1

Tài liệu nâng cao: Biên dịch C và


Phiên dịch Java

Phần này cung cấp một cái nhìn tổng quan ngắn gọn về cách trình biên dịch C
hoạt động và cách thức thực thi Java. Bởi vì trình biên dịch sẽ ảnh hưởng đáng kể
đến hiệu suất của máy tính, việc hiểu công nghệ trình biên dịch ngày nay rất quan
trọng để hiểu hiệu suất. Hãy nhớ rằng chủ đề xây dựng trình biên dịch thường
được dạy trong một hoặc hai học kỳ, vì vậy phần giới thiệu của chúng tôi sẽ nhất
thiết chỉ chạm vào những điều cơ bản.
Phần thứ hai của phần này, bắt đầu từ trang 150.e15, dành cho độc giả quan tâm
đến việc xem cách một ngôn ngữ hướng đối tượng như Java thực thi trên kiến trúc
RISC-V. Nó cho thấy các mã byte Java được sử dụng để giải thích và mã RISC-V
cho phiên bản Java của một số phân đoạn C trong các phần trước, bao gồm cả Bubble
Sort. Nó bao gồm cả máy ảo Java và trình biên dịch đúng lúc (JIT).

Biên soạn C
Phần đầu tiên của phần giới thiệu nội bộgiải phẫu của một trình biên dịch. Để
bắt đầu, Hình e2.15.1 cho thấy cấu trúc của các trình biên dịch gần đây và chúng
tôi mô tả các tối ưu hóa theo thứ tự các đường chuyền của cấu trúc đó.

Phụ thuộc Ngôn ngữ Chức năng


phụ thuộc; máy độc Mặt trước mỗi Chuyển đổi ngôn ngữ sang
lập hình thức trung gian phổ biến
ngôn ngữ

Trung cấp
đại diện
Một số ngôn ngữ phụ thuộc; phần Ví dụ: vòng lặp
Cấp cao
lớn máy độc lập biến đổi và
tối ưu hóa
thủ tục nội tuyến
(cũng được gọi
tích hợp thủ tục)
Phụ thuộc ngôn ngữ nhỏ; phụ Bao gồm toàn cầu và địa phương
Toàn cầu
thuộc máy móc nhẹ (ví dụ:., tối ưu hóa đăng ký
tối ưu hóa
đăng ký số lượng / loại) phân bổ

Phụ thuộc máy cao; ngôn Lựa chọn hướng dẫn chi tiết
Máy phát mã
ngữ độc lập và phụ thuộc vào máy
tối ưu hóa; có thể bao gồm
hoặc được theo sau bởi trình biên dịch

HÌNH e2.15.1 Cấu trúc của trình biên dịch tối ưu hóa hiện đại bao gồm một số đường chuyền
hoặc pha. Về mặt logic, mỗi đường chuyền có thể được coi là chạy đến hoàn thành trước khi tiếp theo xảy ra.
Trong thực tế, một số đường chuyền có thể xử lý một thủ tục tại một thời điểm, về cơ bản xen kẽ với một đường
chuyền khác.
151.e2 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Để minh họa các khái niệm trong phần này của phần này, chúng tôi sẽ sử dụng
phiên bản C của a trong khi vòng lặp từ trang 95 :
trong khi (lưu [i] == k)
i + = 1;

Mặt trận
Chức năng của mặt trước là đọc trong một chương trình nguồn; kiểm tra cú pháp
và ngữ nghĩa; và dịch chương trình nguồn sang dạng trung gian diễn giải hầu hết
các hoạt động cụ thể theo ngôn ngữ của chương trình. Như chúng ta sẽ thấy, các
hình thức trung gian thường đơn giản và trên thực tế, một số tương tự như các mã
byte Java (xem Hình e2.15.8).
Mặt trước thường được chia thành bốn chức năng riêng biệt :
1. Quét đọc bằng các ký tự riêng lẻ và tạo một chuỗi mã thông báo. Ví dụ về
mã thông báo là các từ dành riêng, tên, toán tử và ký hiệu dấu chấm câu.
Trong ví dụ trên, trình tự mã thông báo là trong khi, (, lưu ,
[, i,], ==, k,), i, + =, 1Một từ như thế. trong khi được công nhận là một từ
dành riêng trong C, nhưng tiết kiệm, Tôi, và j được công nhận là tên, và 1
được công nhận là một con số.
2. Phân tích cú pháp lấy luồng mã thông báo, đảm bảo cú pháp là chính xác
và tạo ra an cây cú pháp trừu tượng, đó là một đại diện của cấu trúc cú
pháp của chương trình. Hình e2.15.2 cho thấy cây cú pháp trừu tượng có
thể trông như thế nào đối với đoạn chương trình này.
3. Phân tích ngữ nghĩa lấy cây cú pháp trừu tượng và kiểm tra chương trình
tính đúng đắn ngữ nghĩa. Kiểm tra ngữ nghĩa thường đảm bảo rằng các
biến và loại được khai báo đúng và các loại toán tử và đối tượng khớp với
nhau, một bước được gọi kiểm tra loạiTrong quá trình này, một bảng ký
hiệu đại diện cho tất cả các đối tượng được đặt tên là các lớp, biến và hàm,
thường được tạo và sử dụng để kiểm tra kiểu chương trình.
4. Thế hệ của đại diện trung gian (IR) lấy bảng ký hiệu và cây cú pháp trừu
tượng và tạo biểu diễn trung gian là đầu ra của mặt trước. Các biểu diễn
trung gian thường sử dụng các thao tác đơn giản trên một tập hợp nhỏ các
loại nguyên thủy, chẳng hạn như số nguyên, ký tự và thực. Mã byte Java
đại diện cho một loại hình thức trung gian. Trong các trình biên dịch hiện
đại, dạng trung gian phổ biến nhất trông giống như tập lệnh RISC-V
nhưng với vô số thanh ghi ảo; sau này, chúng tôi mô tả cách ánh xạ các
thanh ghi ảo này thành một tập hợp các thanh ghi thực. Hình e2.15.3 cho
thấy ví dụ của chúng ta có thể được thể hiện như thế nào trong một dạng
trung gian.
Biểu mẫu trung gian chỉ định chức năng của chương trình theo cách độc lập
với nguồn gốc. Sau mặt trước này đã tạo ra hình thức trung gian, các đường
chuyền còn lại phần lớn là ngôn ngữ độc lập.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e3

trong khi tuyên bố

trong khi điều kiện tuyên bố cơ thể

biểu hiện 15 phân công

55 sự so sánh
bên tay trái biểu hiện

biểu hiện biểu hiện định danh nhân tố

nhân tố nhân tố số
l

truy cập mảng định danh 1

mản biểu hiện k


g

định nhân tố
danh

định danh
tiết kiệm

Tôi

HÌNH e2.15.2 Một cây cú pháp trừu tượng cho trong khi ví dụ. Rễ cây bao gồm của các mã
thông tin như số và tên. Các chuỗi dài của con cháu thẳng thường bị bỏ qua trong việc xây dựng cây.

Tối ưu hóa cấp cao


Tối ưu hóa cấp cao là các phép biến đổi được thực hiện ở một cái gì đó gần với
cấp nguồn.
Sự chuyển đổi cấp cao phổ biến nhất có lẽ là thủ tục nội tuyến, thay thế một cuộc
gọi đến một hàm bằng phần thân của hàm, thay thế các đối số của người gọi cho các
tham số thủ tục. Các tối ưu hóa cấp cao khác liên quan đến các phép biến đổi vòng không kiểm soát vòng
lặp có thể làm giảm chi phí vòng lặp, cải thiện quyền truy cập bộ nhớ và khai thác lặp
phần cứng hiệu quả hơn. Ví dụ: trong các vòng lặp thực hiện nhiều lần lặp, chẳng hạn Một kỹ thuật để có
như các vòng lặp được điều khiển theo truyền thống bởi a cho tuyên bố, tối ưu hóa được hiệu suất cao hơn
từ các vòng truy cập
của không kiểm soát vòng lặp thường hữu ích. Kiểm soát vòng lặp liên quan đến vào các mảng, trong đó
việc lấy một vòng lặp, sao chép cơ thể nhiều lần và thực hiện vòng lặp được chuyển nhiều bản sao của thân
đổi ít lần hơn. Kiểm soát vòng lặp làm giảm chi phí vòng lặp và cung cấp cơ hội cho vòng lặp được tạo ra và
nhiều tối ưu hóa khác. Các loại biến đổi cấp cao khác bao gồm các hướng dẫn từ các
lần lặp khác nhau được
lên lịch cùng nhau.
151.e4 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

vòng lặp:
# ý kiến được viết như thế này - mã nguồn thường được bao gồm
# trong khi (lưu [i] == k)
addi r100 , x0, tiết kiệm # r100 = & lưu [0]
lw r101 , Tôi
addi r102 , x0, 4
mul r103 , r101, r102
thêm r104 , r103, r100
lw r105 , 0 (r104) # r105 = lưu [i]
lw r106 , k
bne r105 , r106, thoát ra
#i+=1
lw r106 , Tôi
addi r107 , r106, tôi # gia tăng
sw r107 , Tôi
vòng lặp jal x0 # lần lặp tiếp theo
lối ra:

HÌNH e2.15.3 trong khi ví dụ vòng lặp được hiển thị bằng cách sử dụng một đại diện trung gian điển hình.
Trong thực tế, tên tiết kiệm, Tôi, và k sẽ được thay thế bằng một số loại địa chỉ, chẳng hạn như tham chiếu
đến con trỏ ngăn xếp cục bộ hoặc con trỏ toàn cầu và phần bù, tương tự như cách lưu [i] được truy cập. Lưu
ý rằng định dạng của các hướng dẫn RISC-V khác với phần còn lại của chương, bởi vì chúng đại diện cho các
biểu diễn trung gian ở đây bằng cách sử dụng rXX ký hiệu cho các thanh ghi ảo.

các phép biến đổi vòng lặp tinh vi như các vòng lồng nhau và các vòng chặn để
có được hành vi bộ nhớ tốt hơn; xem Chương 5 ví dụ.

Tối ưu hóa địa phương và toàn cầu


Trong phạm vi dành riêng cho tối ưu hóa cục bộ và toàn cầu, ba lớp tối ưu hóa
được thực hiện :
1. Tối ưu hóa địa phương hoạt động trong một khối cơ bản duy nhất. Một tối
ưu hóa địa phương pass thường được chạy như một tiền thân và kế thừa
cho tối ưu hóa toàn cầu để dọn sạch mã trước và sau khi tối ưu hóa toàn
cầu.
2. Tối ưu hóa toàn cầu hoạt động trên nhiều khối cơ bản; chúng ta sẽ thấy
một ví dụ về điều này trong thời gian ngắn.
3. Toàn cầu đăng ký phân bổ phân bổ các biến cho các thanh ghi cho các
vùng của mã. Đăng ký phân bổ là rất quan trọng để có được hiệu suất tốt
trong các bộ xử lý hiện đại.
Một số tối ưu hóa được thực hiện cả tại địa phương và toàn cầu, bao gồm loại
bỏ biểu thức con chung, nhân giống liên tục, nhân giống sao chép, loại bỏ cửa
hàng chết và giảm sức mạnh. Hãy cùng xem xét một số ví dụ đơn giản về những
tối ưu hóa này.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e5

Loại bỏ biểu thức con phổ biến tìm thấy nhiều trường hợp giống nhau biểu
thức và thay thế cái thứ hai bằng một tham chiếu đến cái thứ nhất. Ví dụ, xem xét
một phân đoạn mã để thêm 4 vào một phần tử mảng :
x [i] = x [i] + 4

Việc tính toán địa chỉ cho x [i] xảy ra hai lần và giống hệt nhau vì không phải địa chỉ
bắt đầu của x cũng không phải giá trị của Tôi thay đổi. Do đó, tính toán có thể được sử
dụng lại. Hãy cùng xem mã trung gian cho đoạn này, vì nó cho phép thực hiện một số
tối ưu hóa khác. Mã trung gian không được tối ưu hóa ở bên trái. Bên phải là mã được
tối ưu hóa, sử dụng loại bỏ biểu thức con phổ biến để thay thế phép tính địa chỉ thứ
hai bằng mã thứ nhất. Lưu ý rằng phân bổ đăng ký chưa xảy ra, vì vậy trình biên dịch
đang sử dụng số đăng ký ảo như thế r100 đây.
// x [i] + 4 // x [i] + 4
addi r100, x0, x addi r100, x0, x
lw r101, tôi lw r101, tôi
mul r102, r101,4 slli r102, r101,2
thêm r103, r100, r102 thêm r103, r100, r102
lw r104, 0 (r103) lw r104, 0 (r103)
// // giá trị của x [i] là trong r104
addi r105, r104,4 addi r105, r104,4
addi r106, x0, x sw r105, 0 (r103)
lw r107, tôi
mul r108, r107,4
thêm r109, r106, r107
sw r105,0 (r109)

Nếu tối ưu hóa tương tự có thể có trên hai khối cơ bản, thì đó sẽ là một ví dụ
loại bỏ biểu thức con chung toàn cầu.
Hãy xem xét một số tối ưu hóa khác :
■ Giảm sức mạnh thay thế các hoạt động phức tạp bằng những hoạt động đơn
giản hơn và có thể áp dụng cho phân đoạn mã này, thay thế mul bằng một
ca trái.
■ Nhân giống liên tục và anh chị em của nó gấp liên tục tìm hằng số trong mã
và tuyên truyền chúng, thu gọn các giá trị không đổi bất cứ khi nào có thể.
■ Sao chép tuyên truyền tuyên truyền các giá trị là bản sao đơn giản, loại bỏ
cần tải lại các giá trị và có thể cho phép các tối ưu hóa khác, chẳng hạn như
loại bỏ biểu thức con phổ biến.
■ Loại bỏ cửa hàng chết tìm các cửa hàng cho các giá trị không được sử dụng lại
và loại bỏ các cửa hàng; anh em họ của nó là loại bỏ mã chết, tìm thấy mã mã
không sử dụng mã mã không thể ảnh hưởng đến kết quả của chương trình và
loại bỏ nó. Với việc sử dụng nhiều macro, mẫu và các kỹ thuật tương tự được
thiết kế để sử dụng lại mã trong các ngôn ngữ cấp cao, mã chết xảy ra thường
xuyên một cách đáng ngạc nhiên.
151.e6 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Trình biên dịch phải được bảo thủNhiệm vụ đầu tiên của trình biên dịch là tạo ra
mã chính xác; Nhiệm vụ thứ hai của nó thường là sản xuất mã nhanh, mặc dù các yếu
tố khác, chẳng hạn như kích thước mã, đôi khi cũng có thể quan trọng. Mã nhanh
nhưng không chính xác cho bất kỳ sự kết hợp nào có thể có của đầu vào, đơn giản là
sai. Do đó, khi chúng tôi nói trình biên dịch là bảo thủ, thì chúng tôi muốn nói rằng
nó chỉ thực hiện tối ưu hóa nếu nó biết chắc chắn 100% rằng, bất kể đầu vào là gì, mã
sẽ hoạt động như người dùng đã viết. Vì hầu hết các trình biên dịch dịch và tối ưu
hóa một chức năng hoặc thủ tục tại một thời điểm, hầu hết các trình biên dịch, đặc
biệt ở mức tối ưu hóa thấp hơn, giả định điều tồi tệ nhất về các lệnh gọi chức năng và
về các tham số của riêng chúng.

Các lập trình viên quan tâm đến hiệu suất của các vòng quan trọng, đặc biệt là
Hiểu biết trong thực tế-
thời gian hoặc các ứng dụng nhúng, có thể thấy mình đang nhìn chằm chằm vào
Chương trình ngôn ngữ lắp ráp
được sản xuất bởi một trình biên dịch và tự hỏi tại sao trình biên dịch không thực
hiện được một số
tối ưu hóa toàn cầu hoặc để phân bổ một biến cho một thanh ghi trong một vòng
Hiệu suất lặp. Các
câu trả lời thường nằm trong lệnh rằng trình biên dịch phải bảo thủ. Cơ hội cho
cải thiện mã có vẻ rõ ràng đối với lập trình viên, nhưng sau đó là lập trình viên
thường có kiến thức mà trình biên dịch không có, chẳng hạn như không có bí danh
giữa hai con trỏ hoặc không có tác dụng phụ bởi một lệnh gọi hàm. Trình biên dịch
thực sự có thể thực hiện chuyển đổi với một chút giúp đỡ, có thể
loại bỏ các hành vi trường hợp xấu nhất mà nó phải giả định. Cái nhìn sâu sắc này
cũng minh họa
một quan sát quan trọng: các lập trình viên sử dụng con trỏ để cố gắng cải thiện
hiệu suất trong việc truy cập các biến, đặc biệt là con trỏ tới các giá trị trên ngăn
xếp đó
cũng có tên là biến hoặc là thành phần của mảng, có khả năng vô hiệu hóa nhiều
tối ưu hóa trình biên dịch. Kết quả là mã con trỏ cấp thấp hơn có thể chạy không
tốt hơn, hoặc thậm chí tệ hơn, so với mã cấp cao hơn được tối ưu hóa bởi trình biên
dịch.

Tối ưu hóa mã toàn cầu


Nhiều tối ưu hóa mã toàn cầu có cùng mục đích với các mục tiêu được sử dụng
trong trường hợp cục bộ, bao gồm loại bỏ biểu thức con phổ biến, truyền liên tục,
nhân giống sao chép và lưu trữ chết và loại bỏ mã chết.
Có hai tối ưu hóa toàn cầu quan trọng khác: chuyển động mã và loại bỏ biến cảm
ứng. Cả hai đều là tối ưu hóa vòng lặp; nghĩa là, chúng nhằm vào mã trong các vòng
lặp. Mã chuyển động tìm mã là bất biến vòng lặp: một đoạn mã cụ thể tính cùng một
giá trị trên mỗi lần lặp của vòng lặp và do đó, có thể được tính một lần bên ngoài
vòng lặp. Loại bỏ biến cảm ứng là sự kết hợp của các phép biến đổi làm giảm chi phí
trên các mảng lập chỉ mục, về cơ bản thay thế việc lập chỉ mục mảng bằng các truy
cập con trỏ. Thay vì kiểm tra loại bỏ biến cảm ứng theo chiều sâu, chúng tôi chỉ
người đọc Mục 2.14, so sánh việc sử dụng lập chỉ mục mảng và con trỏ; đối với hầu
hết các vòng lặp, trình biên dịch tối ưu hóa hiện đại có thể thực hiện chuyển đổi từ
mã mảng rõ ràng hơn sang mã con trỏ nhanh hơn.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e7

Thực hiện tối ưu hóa địa phương


Tối ưu hóa cục bộ được thực hiện trên các khối cơ bản bằng cách quét khối cơ bản
theo thứ tự thực hiện lệnh, tìm kiếm các cơ hội tối ưu hóa. Trong ví dụ câu lệnh gán
trên trang 150.e6, bản sao của toàn bộ tính toán địa chỉ được nhận dạng bởi một loạt
các chuỗi tuần tự vượt qua mã. Dưới đây là cách quá trình có thể tiến hành, bao gồm
mô tả về các kiểm tra cần thiết :
1. Xác định rằng hai addi các hoạt động trả về kết quả tương tự bằng cách
quan sát toán hạng x là như nhau và giá trị của địa chỉ của nó đã không
được thay đổi giữa hai addi hoạt động.
2. Thay thế tất cả các sử dụng của R106 trong khối cơ bản bằng cách R101.
3. Quan sát điều đó Tôi không thể thay đổi giữa hai lw hướng dẫn tham khảo
nó. Vì vậy, thay thế tất cả các sử dụng của R107 với R101.
4. Quan sát rằng mul hướng dẫn bây giờ có cùng toán hạng đầu vào, vì vậy
mà R108 có thể được thay thế bởi R102.
5. Quan sát rằng bây giờ hai thêm hướng dẫn có toán hạng đầu vào giống hệt
nhau (R100 và R102), vì vậy thay thế R109 với R103.
6. Sử dụng loại bỏ mã lưu trữ chết để xóa bộ thứ hai addi, lw, mul, và thêm
hướng dẫn vì kết quả của họ không được sử dụng.
Trong suốt quá trình này, chúng ta cần biết khi nào hai trường hợp của một
toán hạng có cùng giá trị. Điều này rất dễ xác định khi chúng đề cập đến các
thanh ghi ảo, vì biểu diễn trung gian của chúng tôi chỉ sử dụng các thanh ghi đó
một lần, nhưng vấn đề có thể khó hơn khi các toán hạng là các biến trong bộ nhớ,
mặc dù chúng tôi chỉ xem xét các tham chiếu trong một khối cơ bản.
Thật dễ dàng cho trình biên dịch để đưa ra quyết định loại bỏ biểu thức con
chung theo kiểu bảo thủ trong trường hợp này; như chúng ta sẽ thấy trong tiểu
mục tiếp theo, điều này khó khăn hơn khi các chi nhánh can thiệp.

Thực hiện tối ưu hóa toàn cầu


Để hiểu được thách thức của việc thực hiện tối ưu hóa toàn cầu, hãy để xem xét
một vài ví dụ :
■ Hãy xem xét trường hợp của một cơ hội để loại bỏ biểu thức con chung, nói,
về một tuyên bố IR như thế nào thêm Rx, R20, R50 Để xác định xem hai câu
lệnh như vậy có tính cùng một giá trị hay không, chúng ta phải xác định
xem các giá trị của. R20 và R50 giống hệt nhau trong hai tuyên bố. Trong
thực tế, điều này có nghĩa là các giá trị của R20 và R50 đã không thay đổi
giữa tuyên bố đầu tiên và câu lệnh thứ hai. Đối với một khối cơ bản duy
nhất, điều này rất dễ quyết định; khó khăn hơn cho một cấu trúc chương
trình phức tạp hơn liên quan đến nhiều khối và nhánh cơ bản.
■ Hãy xem xét thứ hai lw của Tôi vào R107 trong ví dụ trước: làm thế nào để
chúng ta biết liệu giá trị của nó có được sử dụng lại hay không? Nếu chúng ta
chỉ xem xét một khối cơ bản duy nhất ,
151.e8 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

và chúng tôi biết rằng tất cả sử dụng của R107 nằm trong khối đó, nó rất dễ nhìn.
Tuy nhiên, khi tối ưu hóa tiến hành, việc loại bỏ biểu thức con thông thường và sao
chép lan truyền có thể tạo ra các cách sử dụng khác của một giá trị. Xác định rằng
một giá trị không được sử dụng và mã đã chết khó khăn hơn trong trường hợp có
nhiều khối cơ bản.
■ Cuối cùng, xem xét tải của k trong vòng lặp của chúng tôi, một ứng cử viên cho
chuyển động mã. Trong ví dụ đơn giản này, chúng ta có thể lập luận rằng thật
dễ dàng để thấy điều đó k không được thay đổi trong vòng lặp và do đó, bất
biến vòng lặp. Tuy nhiên, hãy tưởng tượng một vòng lặp phức tạp hơn với
nhiều tổ và nếu tuyên bố trong cơ thể. Xác định rằng tải của k là bất biến vòng
lặp là khó hơn trong trường hợp như vậy.
Thông tin chúng ta cần để thực hiện các tối ưu hóa toàn cầu này là tương tự
nhau: chúng ta cần biết mỗi toán hạng trong một câu lệnh IR có thể được thay
đổi hoặc ở đâu định nghĩa (thông tin định nghĩa sử dụng). Bản sao của thông tin
này cũng cần thiết : nghĩa là, tìm tất cả các cách sử dụng của toán hạng đã thay
đổi đó (thông tin sử dụng định nghĩa). Phân tích luồng dữ liệu có được cả hai
loại thông tin.
Tối ưu hóa toàn cầu và phân tích luồng dữ liệu hoạt động trên a kiểm soát biểu đồ
dòng chảy, trong đó các nút đại diện cho các khối cơ bản và các cung biểu thị luồng điều
khiển giữa các khối cơ bản. Hình e2.15.4 hiển thị biểu đồ luồng điều khiển cho ví dụ
vòng lặp đơn giản của chúng tôi, với một phép biến đổi quan trọng được giới thiệu.
Chúng tôi mô tả sự chuyển đổi trong chú thích, nhưng xem liệu bạn có thể khám phá nó
không, và tại sao nó được thực hiện, một mình!

9. lw r1, tôi
10. addi r2, r1, 1
11. sw r2, tôi

1. addi r3, x0, lưu


2. lw r4, tôi
3. slli r5, r4, 2
4. thêm r6, r5, r3
5. lw r7, 0 (r6)
6. lw r8, k
7. beq r7, r8, đầu

HÌNH e2.15.4 Biểu đồ dòng điều khiển cho trong khi ví dụ vòng lặp. Mỗi nút đại diện cho một
cơ bản khối, kết thúc bằng một nhánh hoặc bằng cách rơi tuần tự vào một khối cơ bản khác cũng là mục
tiêu của một nhánh. Các tuyên bố IR đã được đánh số để dễ dàng đề cập đến chúng. Sự chuyển đổi quan
trọng được thực hiện là di chuyển trong khi kiểm tra và chi nhánh có điều kiện đến cuối. Điều này giúp loại
bỏ nhánh vô điều kiện trước đây nằm trong vòng lặp và đặt nó trước vòng lặp. Sự chuyển đổi này quan
trọng đến mức nhiều trình biên dịch thực hiện nó trong quá trình tạo IR. Các mul cũng được thay thế bằng
(giảm sức mạnh xuống thành) slli.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e9

Giả sử chúng tôi đã tính toán thông tin định nghĩa sử dụng cho biểu đồ luồng điều
khiển trong Hình e2.15.4 Làm thế nào để thông tin này cho phép chúng tôi thực hiện
chuyển động mã. Xem xét các câu lệnh IR số 1 và 6: trong cả hai trường hợp, thông
tin định nghĩa sử dụng cho chúng ta biết rằng không có định nghĩa (thay đổi) về các
toán hạng của các câu lệnh này trong vòng lặp? Do đó, các câu lệnh IR này có thể
được di chuyển ra ngoài vòng lặp. Lưu ý rằng nếu. addi của tiết kiệm và lw của k được
thực thi một lần, ngay trước lối vào vòng lặp, hiệu ứng tính toán là như nhau, nhưng
chương trình hiện chạy nhanh hơn vì hai câu lệnh này nằm ngoài vòng lặp. Ngược lại,
xem xét câu lệnh IR 2, tải giá trị của Tôi Các định nghĩa của. Tôi ảnh hưởng đến
tuyên bố này là cả bên ngoài vòng lặp, ở đâu Tôi được xác định ban đầu và bên trong
vòng lặp trong câu lệnh 10 nơi nó được lưu trữ. Do đó, tuyên bố này không phải là
bất biến vòng lặp.
Hình e2.15.5 hiển thị mã sau khi thực hiện cả chuyển động mã và cảm ứng
loại bỏ biến, trong đó đơn giản hóa việc tính toán địa chỉ. Biến Tôi vẫn có thể
được đăng ký phân bổ, loại bỏ nhu cầu tải và lưu trữ nó mỗi lần và chúng ta sẽ
thấy cách thức này được thực hiện trong tiểu mục tiếp theo.
Trước khi chúng tôi chuyển sang đăng ký phân bổ, chúng tôi cần đề cập đến
một cảnh báo cũng minh họa sự phức tạp và khó khăn của các bộ tối ưu hóa. Hãy
nhớ rằng trình biên dịch phải thận trọng. Để bảo thủ, một trình biên dịch phải
xem xét câu hỏi sau: Có bất kỳ cách nào đó là biến k có thể có thể thay đổi trong
vòng lặp này? Thật không may, có một cách. Giả sử rằng biến k và biến Tôi thực
sự đề cập đến cùng một vị trí bộ nhớ, có thể xảy ra nếu chúng là truy cập bằng
con trỏ hoặc tham số tham chiếu.

addi r1, x0, lưu


lw r6, k
lw r2, tôi
slli r3, r2, 2
thêm r4, r3, r1

lw r2, tôi
addi r7, r6, 1
addi r4, r4, 4
sw r7, tôi

lw r5, 0 (r4)
beq r5, r6, đầu

HÌNH e2.15.5 Biểu đồ dòng điều khiển hiển thị biểu diễn của trong khi ví dụ vòng lặp sau
chuyển động mã và loại bỏ biến cảm ứng. Số lượng hướng dẫn trong vòng lặp bên trong đã giảm
từ 10 xuống còn 6.
151.e10 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Tôi chắc chắn rằng nhiều độc giả đang nói, Vâng, đó chắc chắn sẽ là một đoạn
mã ngu ngốc!Than ôi, phản hồi này không mở cho trình biên dịch, mà phải dịch
mã như được viết. Nhớ lại rằng thông tin bí danh cũng phải bảo thủ; do đó, các
trình biên dịch thường thấy mình phủ nhận các cơ hội tối ưu hóa vì một bí danh
có thể tồn tại ở một nơi trong mã hoặc do thông tin không đầy đủ về bí danh.

Đăng ký phân bổ
Đăng ký phân bổ có lẽ là tối ưu hóa quan trọng nhất cho các kiến trúc cửa hàng tải
hiện đại. Loại bỏ một tải hoặc một cửa hàng được loại bỏ một hướng dẫn. Hơn nữa,
phân bổ đăng ký nâng cao giá trị của các tối ưu hóa khác, chẳng hạn như loại bỏ biểu
thức con phổ biến. May mắn thay, xu hướng đăng ký lớn hơn trong các kiến trúc hiện
đại đã làm cho việc phân bổ đăng ký đơn giản và hiệu quả hơn. Phân bổ đăng ký
được thực hiện trên cả cơ sở địa phương và cơ sở toàn cầu, nghĩa là, trên nhiều khối
cơ bản nhưng trong một chức năng duy nhất. Phân bổ đăng ký cục bộ thường được
thực hiện muộn trong quá trình biên dịch, vì mã cuối cùng được tạo. Trọng tâm của
chúng tôi ở đây là phân bổ đăng ký toàn cầu đầy thách thức và cơ hội hơn.
Phân bổ đăng ký toàn cầu hiện đại sử dụng cách tiếp cận dựa trên khu vực,
trong đó một khu vực (đôi khi được gọi là a phạm vi sống) đại diện cho một phần
mã trong đó một biến cụ thể có thể được phân bổ cho một thanh ghi cụ thể. Làm
thế nào là một khu vực được chọn? Quá trình lặp đi lặp lại :
1. Chọn một định nghĩa (thay đổi) của một biến trong một khối cơ bản nhất
định; thêm khối đó vào khu vực.
2. Tìm bất kỳ việc sử dụng định nghĩa đó, đó là một vấn đề phân tích luồng
dữ liệu; thêm bất kỳ khối cơ bản nào có chứa các mục đích sử dụng đó,
cũng như bất kỳ khối cơ bản nào mà giá trị đi qua để đạt được mục đích sử
dụng, vào khu vực.
3. Tìm bất kỳ định nghĩa nào khác cũng có thể ảnh hưởng đến việc sử dụng
được tìm thấy trong bước trước và thêm các khối cơ bản có chứa các định
nghĩa đó, cũng như các khối định nghĩa đi qua để đạt được việc sử dụng,
cho khu vực.
4. Lặp lại các bước 2 và 3 bằng cách sử dụng các định nghĩa được phát hiện
trong bước 3 cho đến khi hội tụ.
Tập hợp các khối cơ bản được tìm thấy bởi kỹ thuật này có một thuộc tính đặc
biệt: nếu biến được chỉ định được phân bổ cho một thanh ghi trong tất cả các
khối cơ bản này, thì không cần phải tải và lưu trữ biến.
Các bộ phân bổ đăng ký toàn cầu hiện đại bắt đầu bằng cách xây dựng các
vùng cho mọi thanh ghi ảo trong một hàm. Khi các khu vực được xây dựng, câu
hỏi chính là làm thế nào để phân bổ một thanh ghi cho từng khu vực: thách thức
là các khu vực nhất định trùng nhau và không được sử dụng cùng một thanh ghi.
Các khu vực không chồng chéo (tức là., chia sẻ không có khối cơ bản chung) có
thể chia sẻ cùng một thanh ghi. Một cách để ghi lại sự can thiệp giữa các khu vực
là với một đồ thị giao thoa, trong đó mỗi nút đại diện cho một vùng và các cung
giữa các nút biểu thị rằng các vùng có một số khối cơ bản chung.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e11

Khi một biểu đồ giao thoa đã được xây dựng, vấn đề phân bổ các thanh ghi tương
đương với một vấn đề nổi tiếng được gọi tô màu đồ thị: tìm màu cho mỗi nút trong
biểu đồ sao cho không có hai nút liền kề có cùng màu. Nếu số lượng màu bằng với số
lượng thanh ghi, thì tô màu cho biểu đồ giao thoa tương đương với việc phân bổ một
thanh ghi cho từng vùng! Cái nhìn sâu sắc này là động lực ban đầu cho phương pháp
phân bổ hiện được gọi là phân bổ dựa trên khu vực, nhưng ban đầu được gọi là
phương pháp tô màu đồ thị. Hình e2.15.6 hiển thị biểu đồ dòng chảy của trong khi ví
dụ vòng lặp sau khi phân bổ đăng ký.
Điều gì xảy ra nếu biểu đồ không thể được tô màu bằng cách sử dụng số
lượng thanh ghi có sẵn? Bộ phân bổ phải làm đổ các thanh ghi cho đến khi nó có
thể hoàn thành việc tô màu. Bằng cách thực hiện tô màu dựa trên chức năng ưu
tiên có tính đến số lượng tham chiếu bộ nhớ được lưu và chi phí buộc đăng ký,
người phân bổ cố gắng tránh làm đổ cho các ứng cử viên quan trọng nhất.
Tràn tương đương với việc chia tách một vùng (hoặc phạm vi sống); nếu khu
vực bị chia tách, sẽ có ít khu vực khác can thiệp vào hai nút riêng biệt đại diện
cho khu vực ban đầu. Một quy trình phân chia các vùng và tô màu liên tiếp được
sử dụng để cho phép quá trình phân bổ hoàn thành, tại thời điểm đó tất cả các
ứng cử viên sẽ được phân bổ một đăng ký. Tất nhiên, bất cứ khi nào một khu vực
được phân chia, tải và lưu trữ phải được giới thiệu để có được giá trị từ bộ nhớ
hoặc để lưu trữ nó ở đó. Vị trí được chọn để phân chia một khu vực phải cân
bằng chi phí của các tải và cửa hàng phải được giới thiệu với lợi thế là giải phóng
một thanh ghi và giảm số lượng giao thoa.

addi x10, x0, lưu


lw x11, k
lw x12, tôi
slli x13, x12, 2
thêm x14, x13, x10

addi x12, x12, 1


addi x14, x14, 4

lw x13, 0 (x14)
beq x13, x11, đầu

HÌNH e2.15.6 Biểu đồ dòng điều khiển hiển thị biểu diễn của trong khi ví dụ vòng lặp sau
chuyển động mã và loại bỏ biến cảm ứng và phân bổ đăng ký, sử dụng tên đăng ký RISC-
V. Số lượng câu lệnh IR trong vòng lặp bên trong hiện đã giảm xuống chỉ bốn từ sáu trước khi phân bổ
đăng ký và 10 trước khi tối ưu hóa toàn cầu. Giá trị của Tôi cư trú trong x12 ở cuối vòng lặp và cuối
cùng có thể cần được lưu trữ để duy trì ngữ nghĩa chương trình. Nếu Tôi đã không được sử dụng sau vòng
lặp, không chỉ có thể tránh được cửa hàng, mà còn có thể loại bỏ sự gia tăng bên trong vòng lặp!
151.e12 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Các nhà phân bổ đăng ký hiện đại có hiệu quả đáng kinh ngạc trong việc sử dụng
số lượng đăng ký lớn có sẵn trong các bộ xử lý hiện đại. Trong nhiều chương trình,
hiệu quả của việc phân bổ đăng ký bị hạn chế không phải bởi sự sẵn có của các thanh
ghi mà bởi khả năng bí danh khiến trình biên dịch phải bảo thủ trong việc lựa chọn
ứng cử viên.

Tạo mã
Các bước cuối cùng của trình biên dịch là tạo mã và lắp ráp. Hầu hết các trình biên
dịch không sử dụng trình biên dịch độc lập chấp nhận mã nguồn ngôn ngữ lắp ráp; để
tiết kiệm thời gian, thay vào đó họ thực hiện hầu hết các chức năng tương tự: điền
vào các giá trị tượng trưng và tạo mã nhị phân là giai đoạn cuối cùng của việc tạo mã.
Trong các bộ xử lý hiện đại, việc tạo mã khá đơn giản, vì các kiến trúc đơn
giản làm cho việc lựa chọn hướng dẫn tương đối rõ ràng. Tạo mã phức tạp hơn
đối với các kiến trúc phức tạp hơn, chẳng hạn như x86, vì nhiều hướng dẫn IR có
thể sụp đổ thành một lệnh máy duy nhất. Trong các trình biên dịch hiện đại, quy
trình biên dịch này sử dụng khớp mẫu với trình bắt mẫu dựa trên cây hoặc trình
bắt mẫu được điều khiển bởi trình phân tích cú pháp.
Trong quá trình tạo mã, các giai đoạn cuối cùng của tối ưu hóa phụ thuộc vào
máy cũng được thực hiện. Chúng bao gồm một số tối ưu hóa gấp liên tục, cũng
như lập lịch hướng dẫn cục bộ (xem Chương 4).

Tóm tắt tối ưu hóa


Hình e2.15.7 đưa ra các ví dụ về tối ưu hóa điển hình và cột cuối cùng cho
biết nơi tối ưu hóa được thực hiện trong trình biên dịch gcc. Đôi khi rất khó để
tách một số tối ưu hóa đơn giản hơn Tối ưu hóa cục bộ và phụ thuộc vào bộ xử lý,
từ các phép biến đổi được thực hiện trong trình tạo mã và một số tối ưu hóa được
thực hiện nhiều lần, đặc biệt là tối ưu hóa cục bộ, có thể được thực hiện trước và
sau khi tối ưu hóa toàn cầu như trong quá trình tạo mã.

Ngày nay, về cơ bản tất cả các chương trình cho các ứng dụng máy tính để bàn và
máy chủ được thực hiện bằng các ngôn ngữ cấp cao, như hầu hết các chương trình
cho các ứng dụng nhúng. Sự phát triển này có nghĩa là vì hầu hết các hướng dẫn được
thực thi là đầu ra của trình biên dịch, nên kiến trúc tập lệnh chủ yếu là mục tiêu trình
biên dịch. Thật hấp dẫn khi thêm các thao tác tinh vi trong một tập lệnh. Thách thức
là chúng có thể không khớp chính xác với những gì trình biên dịch cần sản xuất hoặc
có thể chung chung đến mức chúng không nhanh. Ví dụ, xem xét các hướng dẫn vòng
lặp đặc biệt được tìm thấy trong một số máy tính. Giả sử thay vì giảm dần theo một,
trình biên dịch muốn tăng thêm bốn hoặc thay vì phân nhánh trên không bằng 0, trình
biên dịch muốn phân nhánh nếu chỉ mục nhỏ hơn hoặc bằng giới hạn. Các hướng dẫn
vòng lặp có thể là một sự không phù hợp. Khi phải đối mặt với những phản đối như
vậy, nhà thiết kế bộ hướng dẫn có thể
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e13

tiếp theo khái quát hóa hoạt động, thêm một toán hạng khác để chỉ định gia tăng
và có lẽ là một tùy chọn để sử dụng điều kiện nhánh. Sau đó, mối nguy hiểm là
một trường hợp phổ biến, giả sử, tăng thêm một, sẽ chậm hơn một chuỗi các thao
tác đơn giản.

Xây dựng Một số trình biên dịch tinh vi hơn, và nhiều trình biên dịch nghiên cứu, sử
dụng một kỹ thuật phân tích được gọi là phân tích liên ngành để có thêm thông tin về các
chức năng và cách chúng được gọi. Phân tích liên ngành cố gắng khám phá những thuộc
tính nào vẫn đúng trong một lệnh gọi hàm. Ví dụ: chúng ta có thể khám phá ra rằng một
lệnh gọi hàm không bao giờ có thể thay đổi bất kỳ biến toàn cục nào, điều này có thể hữu
ích trong việc tối ưu hóa một vòng lặp gọi hàm đó. Thông tin như vậy được gọi thông tin có
thể hoặc là thông tin không nhạy cảm và có thể thu được một cách hợp lý một cách hiệu
quả, mặc dù phân tích một cuộc gọi đến một hàm F yêu cầu phân tích tất cả các chức
năng mà F gọi, điều này làm cho quá trình này hơi tốn thời gian cho các chương trình lớn.
Một tài sản tốn kém hơn để khám phá là một chức năng phải luôn thay đổi một số biến;
thông tin đó được gọi là phải thông tin hoặc là thông tin nhạy cảmNhớ lại mệnh lệnh để
bảo thủ :. thông tin có thể không bao giờ có thể được sử dụng như thông tin phải có chỉ vì
một chức năng có thể thay đổi một biến không có nghĩa là nó phải thay đổi nó. Tuy nhiên,
việc sử dụng phủ định thông tin may là bảo thủ, do đó trình biên dịch có thể dựa vào thực
tế là một hàm sẽ không bao giờ thay đổi một biến trong tối ưu hóa xung quanh trang web
cuộc gọi của chức năng đó.

Cấp độ cao Ở hoặc gần mức nguồn; bộ xử lý độc lập


Quy trình tích hợp Thay thế thủ tục gọi bằng thủ tục cơ thể O3
Địa phương Trong mã đường thẳng
Loại bỏ biểu thức con phổ biến Thay thế hai trường hợp tính toán giống nhau bằng một bản sao O1
Nhân giống liên tục Thay thế tất cả các phiên bản của một biến được gán một hằng số bằng O1
hằng số
Giảm chiều cao ngăn xếp Cây biểu thức phía sau để giảm thiểu tài nguyên cần thiết để đánh giá biểu thức O1

Toàn cầu Trên một chi nhánh


Biểu hiện chung toàn cầu Giống như địa phương, nhưng phiên bản này vượt qua các chi nhánh O2
loại bỏ
Sao chép tuyên truyền Thay thế tất cả các trường hợp của một biến A đã được chỉ định X (tức là., A = X) với X O2
Mã chuyển động Xóa mã khỏi một vòng lặp tính toán cùng một giá trị mỗi lần lặp của vòng lặp O2
Loại bỏ biến cảm ứng Đơn giản hóa / loại bỏ các tính toán địa chỉ mảng trong các vòng lặp O2
Bộ xử lý phụ thuộc Phụ thuộc vào kiến thức bộ xử lý
Giảm sức mạnh Nhiều ví dụ; thay thế nhân với một hằng số bằng các dịch chuyển O1
Lập kế hoạch đường ống Hướng dẫn sắp xếp lại để cải thiện hiệu suất đường ống O1
Tối ưu hóa bù chi nhánh Chọn dịch chuyển nhánh ngắn nhất đạt được mục tiêu O1

HÌNH e2.15.7 Các loại tối ưu hóa và giải thích chính của từng lớp. Cột thứ ba hiển thị khi những điều này xảy ra ở các mức độ tối
ưu hóa khác nhau trong gcc. Tổ chức GNU gọi ba mức tối ưu hóa trung bình (O1), đầy đủ (O2) và đầy đủ với tích hợp các thủ tục nhỏ (O3).
151.e14 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Một trong những cách sử dụng quan trọng nhất của phân tích liên ngành là để
có được cái gọi là thông tin bí danh. An bí danh xảy ra khi hai tên có thể chỉ định
cùng một biến. Ví dụ, khá hữu ích khi biết rằng hai con trỏ được truyền cho một
hàm có thể không bao giờ chỉ định cùng một biến. Thông tin về người ngoài
hành tinh thường không nhạy cảm với dòng chảy và phải được sử dụng một cách
bảo thủ.

ngôn ngữ Phiên dịch Java


hướng đối Phần thứ hai của phần này dành cho độc giả quan tâm đến việc xem làm thế nào
tượng
một ngôn ngữ hướng đối tượng giống như Java thực thi trên kiến trúc RISC-V.
Một ngôn ngữ lập trình
được định hướng xung
Nó hiển thị Java mã byte được sử dụng để giải thích và mã RISC-V cho phiên
quanh các đối tượng thay bản Java của một số phân đoạn C trong các phần trước, bao gồm cả Bubble Sort.
vì hành động hoặc dữ Hãy nhanh chóng xem lại biệt ngữ Java để đảm bảo tất cả chúng ta đều ở trên
liệu so với logic. cùng một trang. Ý tưởng lớn về lập trình hướng đối tượng là để các lập trình viên suy
nghĩ về các đối tượng trừu tượng và các hoạt động được liên kết với nhau kiểu của
đối tượng. Các loại mới thường có thể được coi là các sàng lọc cho các loại hiện có
và do đó các loại mới sử dụng một số thao tác cho các loại hiện có mà không thay đổi.
Hy vọng là lập trình viên nghĩ ở cấp độ cao hơn và mã đó có thể được sử dụng lại dễ
dàng hơn nếu lập trình viên thực hiện các thao tác phổ biến trên nhiều loại khác nhau.
Quan điểm khác nhau này đã dẫn đến một bộ các điều khoản khác nhau. Loại
của một đối tượng là a lớp học, đó là định nghĩa của kiểu dữ liệu mới cùng với
các thao tác được xác định để hoạt động trên kiểu dữ liệu đó. Một đối tượng cụ
thể sau đó là một ví dụ của một lớp và tạo một đối tượng từ một lớp được gọi
khởi tạo Các hoạt động trong một lớp được gọi. phương pháp, tương tự như thủ
tục C. Thay vì gọi một thủ tục như trong C, bạn viện dẫn một phương thức trong
Java. Các thành viên khác của một lớp học là cánh đồng, tương ứng với các biến
trong C. Các biến bên trong các đối tượng được gọi trường hợpThay vì truy cập
một cấu trúc với một con trỏ, Java sử dụng an. tham chiếu đối tượng để truy cập
vào một đối tượng. Cú pháp cho gọi phương thức là x.y, Ở đâu x là một tài liệu
tham khảo đối tượng và y là tên phương thức.
Mối quan hệ cha mẹ con giữa các lớp cũ và mới hơn được nắm bắt bởi động từ
mở rộng phạm vi: một lớp con mở rộng (hoặc phân lớp) một lớp cha. Lớp con
thường sẽ xác định lại một số phương thức được tìm thấy trong cha mẹ để khớp với
kiểu dữ liệu mới. Một số phương pháp hoạt động tốt, và lớp trẻ thừa kế những
phương pháp đó.
Để giảm số lượng lỗi liên quan đến con trỏ và phân bổ bộ nhớ rõ ràng, Java tự
động giải phóng bộ nhớ không sử dụng, sử dụng bộ thu rác riêng biệt giải phóng
bộ nhớ khi đầy. Do đó, mới tạo một thể hiện mới của một đối tượng động trên
heap, nhưng không có miễn phí trong Java. Java cũng yêu cầu các giới hạn mảng
phải được kiểm tra trong thời gian chạy để bắt một loại lỗi khác có thể xảy ra
trong các chương trình C.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e15

Giải thích
Như đã đề cập trước đây, các chương trình Java được phân phối dưới dạng mã
byte Java và Máy ảo Java (JVM) thực thi mã byte Java. JVM hiểu một định dạng
nhị phân được gọi là tập tin lớp học định dạng. Tệp lớp là một luồng byte cho
một lớp, chứa một bảng các phương thức hợp lệ với mã byte của chúng, một
nhóm các hằng số hoạt động một phần như bảng ký hiệu và các thông tin khác
như lớp cha của lớp này.
Khi JVM lần đầu tiên được bắt đầu, nó sẽ tìm phương thức lớp chínhĐể bắt
đầu bất kỳ lớp Java nào, JVM sẽ tự động tải, liên kết và khởi tạo một lớp. JVM
tải một lớp bằng cách trước tiên tìm biểu diễn nhị phân của lớp thích hợp (tệp lớp)
và sau đó tạo một lớp từ biểu diễn nhị phân đó. Liên kết kết hợp lớp vào trạng
thái thời gian chạy của JVM để nó có thể được thực thi. Cuối cùng, nó thực hiện
phương pháp khởi tạo lớp được bao gồm trong mỗi lớp.
Hình e2.15.8 hiển thị mã byte Java và các hướng dẫn RISC-V tương ứng của
chúng , minh họa năm điểm khác biệt chính giữa hai :
1. Để đơn giản hóa việc biên dịch, Java sử dụng một ngăn xếp thay vì các
thanh ghi cho toán hạng. Các toán tử được đẩy trên ngăn xếp, hoạt động
trên, và sau đó bật ra khỏi ngăn xếp.
2. Các nhà thiết kế của JVM đã quan tâm đến kích thước mã, do đó, mã byte
có độ dài khác nhau giữa một và năm byte, so với hướng dẫn RISC-V có
kích thước cố định bốn byte. Để tiết kiệm không gian, JVM thậm chí còn
có các hướng dẫn dự phòng với độ dài khác nhau mà sự khác biệt duy nhất
là kích thước của ngay lập tức. Quyết định này minh họa một biến thể kích
thước mã của nguyên tắc thiết kế thứ ba của chúng tôi: làm cho trường hợp
chung nhỏ.
3. JVM có các tính năng an toàn được nhúng trong kiến trúc. Ví dụ: các
hướng dẫn truyền dữ liệu mảng kiểm tra để chắc chắn rằng toán hạng đầu
tiên là một tham chiếu và toán hạng chỉ mục thứ hai nằm trong giới hạn.
4. Để cho phép người thu gom rác tìm thấy tất cả các con trỏ trực tiếp, JVM
sử dụng các hướng dẫn khác nhau để hoạt động trên các địa chỉ so với số
nguyên để JVM có thể biết các toán hạng chứa địa chỉ. RISC-V thường
gộp các số nguyên và địa chỉ lại với nhau.
5. Cuối cùng, không giống như RISC-V, mã byte Java bao gồm các hướng
dẫn dành riêng cho Java thực hiện các thao tác phức tạp, như phân bổ một
mảng trên heap hoặc gọi một phương thức.
151.e16 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Số học thêm iadd số 8 thêm NOS = TOS + NOS; bật


trừ đi isub số 8 phụ NOS = TOS NOS; bật
gia tăng inc I8a I8b số 8 addi Khung [I8a] = Khung [I8a] + I8b
Truyền dữ liệu tải số nguyên / địa chỉ cục bộ iload I8 / anoad I8 16 lw ĐKDV = Khung [I8]
tải số nguyên / địa chỉ cục bộ iload_/aload_ {0,1,2,3} số 8 lw ĐKDV = Khung [{0,1,2,3}]
lưu trữ số nguyên / địa chỉ cục bộ istore I8 / astore I8 16 sw Khung [I8] = ĐKDV; bật
tải số nguyên / địa chỉ từ mảng iaload / aaload số 8 lw NOS = * NOS [TOS]; bật
lưu trữ số nguyên / địa chỉ vào mảng iastore / aastore số 8 sw * NNOS [NOS] = TOS; pop2
tải một nửa từ mảng saload số 8 lh NOS = * NOS [TOS]; bật
lưu trữ một nửa vào mảng kinh ngạc số 8 sh * NNOS [NOS] = TOS; pop2
tải byte từ mảng baload số 8 lb NOS = * NOS [TOS]; bật
lưu trữ byte vào mảng khốn số 8 sb * NNOS [NOS] = TOS; pop2
tải ngay lập tức bipush I8, nhấm nháp I16 16, 24 addi đẩy; ĐKDV = I8 hoặc I16
tải ngay lập tức iconst_ {- 1,0,1,2,3,4,5} số 8 addi đẩy; ĐKDV = {- 1,0,1,2,3,4,5}
Hợp lý và iand số 8 và NOS = TOS & NOS; bật
hoặc là ior số 8 hoặc là NOS = TOS | NOS; bật
chuyển sang trái ishl số 8 sll NOS = NOS << ĐKDV; bật
chuyển sang phải iushr số 8 srl NOS = NOS >> ĐKDV; bật
Có điều kiện nhánh trên bằng nhau if_icompeq I16 24 beq nếu TOS == NOS, hãy chuyển đến I16; pop2
chi nhánh nhánh trên không bằng nhau if_icompne I16 24 bne nếu ĐKDV != NOS, đi đến I16; pop2
nếu TOS {<, <=,>,> =} NOS, hãy chuyển đến I16;
so sánh if_icomp {lt, le, gt, ge} I16 24 blt / bge pop2
Vô điều kiện nhảy goto I16 24 jal đi đến I16
nhảy trở về ret, ireturn số 8 jalr
nhảy xuống chương trình con jsr I16 24 jal đi đến I16; đẩy; ĐKDV = PC + 3
Chồng loại bỏ khỏi ngăn xếp pop, pop2 số 8 pop, pop2
sự quản lý trùng lặp trên ngăn xếp song số 8 đẩy; ĐKDV = NOS
trao đổi 2 vị trí hàng đầu trên ngăn xếp hoán đổi số 8 T = NOS; NOS = ĐKDV; ĐKDV = T
Kiểm tra an toàn kiểm tra tham chiếu null ifnull I16, ifnotnull I16 24 nếu ĐKDV {==,!=} null, đi đến I16
có được độ dài của mảng mảng dài số 8 đẩy; ĐKDV = độ dài của mảng
kiểm tra xem đối tượng một loại ví dụ I16 24 ĐKDV = 1 nếu ĐKD phù hợp với loại
Hằng [I16]; ĐKDV = 0 khác

Lời cầu nguyện gọi phương pháp gọi I16 24 Gọi phương thức trong Const [I16], gửi đi
về loại hình

Phân bổ tạo ví dụ lớp mới I16 mới 24 Phân bổ loại đối tượng Const [I16] trên heap
tạo mảng mới newarray I16 24 Phân bổ loại mảng Const [I16] trên heap

HÌNH e2.15.8 Kiến trúc mã byte Java so với RISC-V . Mặc dù nhiều mã byte rất đơn giản, nhưng những mã trong nửa tá hàng cuối
cùng ở trên rất phức tạp và cụ thể đối với Java. Mã byte có chiều dài từ một đến năm byte, do đó tên của chúng. Mnemonics Java sử dụng
tiền tố Tôi cho số nguyên 32 bit , a để tham khảo (địa chỉ) , S cho số nguyên 16 bit (ngắn) và b cho byte 8 bit. Chúng tôi sử dụng I8 cho
hằng số 8 bit và I16 cho hằng số 16 bit. RISC-V sử dụng các thanh ghi cho toán hạng, nhưng JVM sử dụng một ngăn xếp. Trình biên dịch
biết kích thước tối đa của ngăn toán hạng cho mỗi phương thức và chỉ cần phân bổ không gian cho nó trong khung hiện tại. Đây là ký hiệu
trong cột Ý nghĩa : ĐKDV: đầu ngăn xếp; NOS : vị trí tiếp theo bên dưới ĐKDV; NNOS: vị trí tiếp theo bên dưới NOS; bật lên: loại
bỏ ĐKDV; pop2: loại bỏ ĐKDV và NOS; và đẩy: thêm một vị trí vào ngăn xếp. * NOS và * NNOS có nghĩa là truy cập vào vị trí bộ
nhớ được chỉ ra bởi địa chỉ trong ngăn xếp tại các vị trí đó. Hằng [] đề cập đến nhóm hằng số thời gian chạy của một lớp được tạo bởi JVM
và Khung [] đề cập đến các biến của khung phương thức cục bộ. Các mã byte Java bị thiếu từ Hình e2.1 là một vài toán tử số học và logic,
một số quản lý ngăn xếp khó, so sánh với 0 và nhánh, hỗ trợ cho các bảng nhánh, chuyển đổi kiểu, nhiều biến thể của các hướng dẫn phức
tạp, dành riêng cho Java cộng với các thao tác trên dữ liệu dấu phẩy động, số nguyên 64 bit ( dài) và ký tự 16 bit.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e17

Biên soạn a trong khi Vòng lặp trong Java bằng Bytecodes

Biên dịch trong khi vòng lặp từ trang 95, lần này sử dụng mã byte Java :
VÍ DỤ
trong khi (lưu [i] == k)
i + = 1;

Giả sử rằng Tôi, k, và tiết kiệm là ba biến cục bộ đầu tiên. Hiển thị địa chỉ của
mã byte. Phiên bản RISC-V của vòng lặp C trong Hình e2.15.3 lấy sáu
hướng dẫn và 24 byte. Phiên bản mã byte lớn như thế nào?

Bước đầu tiên là đặt tham chiếu mảng vào tiết kiệm trên ngăn xếp :
TRẢ LỜI
0 aload_3 // Đẩy biến cục bộ 3 (lưu []) vào ngăn xếp

Hướng dẫn 1 byte này thông báo cho JVM rằng một địa chỉ trong biến cục bộ
3 đang được đặt trên ngăn xếp. 0 ở bên trái của hướng dẫn này là địa chỉ byte
của hướng dẫn đầu tiên này; mã byte cho mỗi phương thức bắt đầu từ 0.
Bước tiếp theo là đặt chỉ mục trên ngăn xếp :
1 iload_1 // Đẩy biến cục bộ 1 (i) lên ngăn xếp

Giống như hướng dẫn trước, lệnh 1 byte này là phiên bản ngắn của lệnh tổng
quát hơn, mất 2 byte để tải một biến cục bộ lên ngăn xếp. Hướng dẫn tiếp
theo là lấy giá trị từ phần tử mảng :
2 iaload // Đặt phần tử mảng (lưu [i]) vào ngăn xếp

Hướng dẫn 1 byte này kiểm tra hai toán hạng trước, bật chúng ra khỏi ngăn
xếp và sau đó đặt giá trị của phần tử mảng mong muốn lên đỉnh mới của ngăn
xếp. Tiếp theo, chúng tôi đặt k trên ngăn xếp :
3 iload_2 // Đẩy biến cục bộ 2 (k) lên ngăn xếp

Bây giờ chúng tôi đã sẵn sàng cho trong khi kiểm tra:

4 if_icompne, Thoát // So sánh và thoát nếu không bằng nhau

Hướng dẫn 3 byte này so sánh hai yếu tố trên cùng của ngăn xếp, bật chúng
ra khỏi ngăn xếp và các nhánh nếu chúng không bằng nhau. Cuối cùng chúng
tôi đã chuẩn bị cho cơ thể của vòng lặp :
7 iinc, 1, 1 // Tăng biến cục bộ 1 bằng 1 (i + = 1)
151.e18 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Lệnh 3 byte bất thường này tăng một biến cục bộ lên 1 mà không cần sử dụng
ngăn xếp toán hạng, một tối ưu hóa một lần nữa giúp tiết kiệm không gian.
Cuối cùng, chúng tôi trở về đầu vòng lặp với nhánh 3 byte :
10 đi đến 0 // Chuyển đến đầu vòng lặp (địa chỉ byte 0)

Do đó, phiên bản mã byte có bảy hướng dẫn và 13 byte, chỉ hơn một nửa
kích thước của mã RISC-V C. (Như trước đây, chúng tôi có thể tối ưu hóa
mã này để phân nhánh ít hơn.)

Biên dịch cho Java


Vì Java có nguồn gốc từ C và Java có cùng loại tích hợp với C, nên các ví dụ về
câu lệnh gán trong Phần 2.2 đến 2.6 giống nhau trong Java như trong C. Điều
tương tự cũng đúng với nếu ví dụ tuyên bố trong Mục 2.7.
Phiên bản Java của trong khi vòng lặp là khác nhau, tuy nhiên. Các nhà thiết
kế của C để nó cho các lập trình viên để chắc chắn rằng mã của họ không vượt
quá giới hạn mảng. Các nhà thiết kế của Java muốn bắt các lỗi ràng buộc mảng
và do đó yêu cầu trình biên dịch kiểm tra các vi phạm đó. Để kiểm tra giới hạn,
trình biên dịch cần biết chúng là gì. Java bao gồm một từ bổ sung trong mỗi
mảng giữ giới hạn trên. Giới hạn dưới được định nghĩa là 0.

Biên soạn a trong khi Vòng lặp trong Java

Sửa đổi mã RISC-V cho trong khi vòng lặp trên trang 95 để bao gồm các
VÍ DỤ kiểm tra giới hạn mảng được Java yêu cầu. Giả sử rằng độ dài của mảng
được đặt ngay trước phần tử đầu tiên của mảng.

Giả sử rằng các mảng Java dành hai từ đầu tiên của mảng trước khi dữ liệu
TRẢ LỜI bắt đầu. Chúng tôi sẽ sớm thấy việc sử dụng từ đầu tiên, nhưng từ thứ hai có
độ dài mảng. Trước khi chúng ta nhập vòng lặp, hãy để tải độ dài của mảng
vào một thanh ghi tạm thời :
lw x5, 4 (x25) // Temp reg x5 = độ dài của mảng lưu

Trước khi chúng ta nhân lên Tôi bằng 4, chúng ta phải kiểm tra xem nó có
nhỏ hơn 0 hay lớn hơn phần tử cuối cùng của mảng không. Bước đầu tiên là
kiểm tra xem Tôi nhỏ hơn 0 :
Vòng lặp: blt x22, x0, IndexOutOfBound // nếu i <0, lỗi goto

Vì mảng bắt đầu từ 0, chỉ mục của phần tử mảng cuối cùng nhỏ hơn một chiều
dài của mảng. Do đó, thử nghiệm của mảng trên bị ràng buộc là để chắc chắn
rằng Tôi là
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e19

nhỏ hơn chiều dài của mảng. Do đó, bước thứ hai là phân nhánh thành một
lỗi nếu nó lớn hơn hoặc bằng chiều dài.
bge x22, x5, IndexOutOfBounds // nếu i> = chiều dài, lỗi goto

Hai dòng tiếp theo của RISC-V trong khi vòng lặp không thay đổi so với phiên bản C :

slli x10, x22, 2 // Temp reg x10 = i * 4 thêm x10, x10, x25 // x10 =
địa chỉ lưu [i]

Chúng ta cần tính đến 16 byte đầu tiên của một mảng được dành riêng trong Java.
Chúng tôi làm điều đó bằng cách thay đổi trường địa chỉ của tải từ 0 đến 16 :

lw x9, 8 (x10) // Temp reg x9 = lưu [i]

Phần còn lại của mã RISC-V từ C trong khi vòng lặp là tốt như là :

bne x9, x24, Thoát addi x22, // đi đến Lối ra nếu lưu [i] k
x22, 1 beq x0, x0, Thoát // i=i+1
vòng lặp : // đi đến vòng lặp

(Xem các bài tập để tối ưu hóa trình tự này.)

Gọi các phương thức trong Java


Trình biên dịch chọn phương thức thích hợp tùy thuộc vào loại đối tượng. Trong
một vài trường hợp, nó không rõ ràng và phương thức có thể được gọi mà không
có nhiều chi phí hơn thủ tục C. Tuy nhiên, nói chung, trình biên dịch chỉ biết rằng
một biến đã cho có chứa một con trỏ tới một đối tượng thuộc về một kiểu con của
một lớp chung. Vì nó không biết tại thời điểm biên dịch phân lớp đối tượng, và do
đó phương pháp nào nên được gọi, trình biên dịch sẽ tạo mã kiểm tra đầu tiên để
chắc chắn rằng con trỏ không phải là null và sau đó sử dụng mã để tải một con trỏ
tới một bảng với tất cả các phương thức pháp lý cho loại đó. Từ đầu tiên của đối
tượng có địa chỉ bảng phương thức, đó là lý do tại sao các mảng Java dự trữ hai từ.
Hãy nói rằng nó sử dụng phương pháp thứ năm được khai báo cho lớp đó. (Thứ tự
phương thức là giống nhau cho tất cả các lớp con.) Trình biên dịch sau đó lấy địa
chỉ thứ năm từ bảng đó và gọi phương thức tại địa chỉ đó.
Chi phí định hướng đối tượng nói chung là việc gọi phương thức thực hiện
năm bước :
1. Một nhánh có điều kiện để chắc chắn rằng con trỏ tới đối tượng là hợp lệ;
2. Tải để có được địa chỉ của bảng các phương thức có sẵn;
3. Một tải khác để có được địa chỉ của phương pháp thích hợp;
151.e20 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

4. Đặt địa chỉ trả lại vào sổ đăng ký trả lại; và cuối cùng
5. Một đăng ký chi nhánh để gọi phương pháp.

Một ví dụ sắp xếp trong Java


Hình e2.15.9 hiển thị phiên bản Java của loại trao đổi. Một sự khác biệt đơn giản
công cộng Một từ là điều đó không cần phải vượt qua độ dài của mảng dưới dạng một tham số
khóa Java cho phép riêng biệt, vì các mảng Java bao gồm độ dài của chúng : v.length biểu thị độ dài
một phương thức được
của v.
gọi bằng bất kỳ phương
pháp nào khác.
Một sự khác biệt quan trọng hơn là các phương thức Java được chuẩn bị sẵn
với các từ khóa không tìm thấy trong các thủ tục C. Các sắp xếp phương pháp
được bảo vệ Một được khai báo tĩnh công cộng trong khi hoán đổi được tuyên bố bảo vệ tĩnh.Công
khóa Java từ hạn chế cộng có nghĩa là sắp xếp có thể được gọi từ bất kỳ phương pháp khác, trong khi
gọi một phương thức được bảo vệ nghĩa là hoán đổi chỉ có thể được gọi bằng các phương pháp khác
cho các phương thức
trong cùng gói và từ các phương pháp trong các lớp dẫn xuất. A phương pháp
khác trong gói đó.
tĩnh là một tên gọi khác cho phương thức lớp Các phương thức thực hiện các
gói Về cơ bản a thư mục thao tác trên toàn lớp và không áp dụng cho một đối tượng riêng lẻ. Các phương
chứa một nhóm các lớp pháp tĩnh về cơ bản giống như các thủ tục C.
liên quan. Bản dịch đơn giản này từ C sang phương thức tĩnh có nghĩa là không có sự mơ hồ về
phương pháp tĩnh Một gọi phương thức và do đó nó có thể hiệu quả như C. Nó cũng bị giới hạn trong việc sắp
phương pháp áp dụng cho xếp các số nguyên, có nghĩa là một loại khác nhau phải được viết cho từng loại dữ liệu.
toàn bộ lớp chứ không Để chứng minh hướng đối tượng của Java , Hình e2.15.10 hiển thị phiên bản
phải cho một đối tượng mới với những thay đổi được tô sáng. Đầu tiên, chúng tôi tuyên bố v là loại So
riêng lẻ. Nó không liên sánh và thay thế v [j]> v [j + 1] với một lời cầu khẩn của so sánh với. Bằng cách
quan đến tĩnh trong C .
thay đổi v đến lớp mới này, chúng ta có thể sử dụng mã này để sắp xếp nhiều loại
dữ liệu.

lớp công cộng sắp xếp {


tĩnh công cộng khoảng trống sắp xếp (int [] v) {
cho (int i = 0; i < v.length; i + = 1) {
cho (int j = i - 1; j> = 0 && v [j]> v [j + 1]; j - = 1) {trao đổi (v, j);

}
}

bảo vệ tĩnh void hoán đổi (int [] v, int k) { int temp = v [k];

v [k] = v [k + 1];
v [k + 1] = temp;
}}

HÌNH e2.15.9 Một quy trình Java ban đầu thực hiện một sắp xếp trên mảng v. Thay đổi từ
Số liệu e2.24 và e2,26 được làm nổi bật.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e21

loại lớp công cộng {


sắp xếp khoảng trống tĩnh công cộng (So sánh[] v) {cho
(int i = 0; i <v.length; i + = 1) {
cho (int j = i - 1; j> = 0 && v [j].compareTo (v [j + 1]); j - = 1) {

hoán đổi (v, j);


}
}

bảo vệ trao đổi khoảng trống tĩnh (So sánh[] v, int k) { So sánh temp
= v [k];
v [k] = v [k + 1];
v [k + 1] = temp;
}}
lớp công cộng So sánh {
int công khai (so sánh To (int x)
{giá trị trả về - x; } giá trị int
công cộng;
}

HÌNH e2.15.10 Một quy trình Java sửa đổi sắp xếp trên mảng v có thể có nhiều loại hơn. Thay đổi từ Hình
e2.15.9 được làm nổi bật.

Phương pháp so sánh với so sánh hai phần tử và trả về một giá trị lớn hơn 0 nếu
tham số lớn hơn đối tượng, 0 nếu bằng và một số âm nếu nó nhỏ hơn đối tượng.
Hai thay đổi này khái quát hóa mã để nó có thể sắp xếp số nguyên, ký tự, chuỗi,
v.v., nếu có các lớp con So sánh với mỗi loại này và nếu có một phiên bản so sánh
với cho từng loại. Đối với mục đích sư phạm, chúng tôi xác định lại lớp học So
sánh và phương pháp so sánh với ở đây để so sánh số nguyên. Định nghĩa thực tế
của So sánh trong Thư viện Java khác biệt đáng kể.
Bắt đầu từ mã RISC-V mà chúng tôi đã tạo cho C, chúng tôi hiển thị những
thay đổi chúng tôi đã thực hiện để tạo mã RISC-V cho Java.
Cho hoán đổi, sự khác biệt đáng kể duy nhất là chúng ta phải kiểm tra để chắc
chắn rằng tham chiếu đối tượng không phải là null và mỗi tham chiếu mảng nằm
trong giới hạn. Kiểm tra đầu tiên kiểm tra rằng địa chỉ trong tham số đầu tiên
không bằng 0 :
hoán đổi: beq x10, x0, Lỗi x10, NullPulum // nếu X0 == 0, goto Lỗi
151.e22 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Tiếp theo, chúng tôi tải độ dài của v vào một thanh ghi và kiểm tra chỉ mục đó k
đồng ý.

lw x5, 4 (x10) // Temp reg x5 = độ dài của mảng v


blt x11 , x0, IndexOutOfBound // nếu k <0, lỗi goto
bge x11 , x5, IndexOutOfBound // nếu k > = chiều dài, lỗi goto

Kiểm tra này được theo sau bởi một kiểm tra rằngk + 1 là trong giới hạn.

addi x6, x11,1 // Temp reg x6 = k + 1


blt x6, x0 , IndexOutOfBound // nếu k + 1 <0, lỗi goto
bge x6, x5 , IndexOutOfBound // nếu k + 1 > = chiều dài, lỗi goto

Hình e2.15.11 nêu bật các hướng dẫn RISC-V bổ sung trong hoán đổi đó là một
Java trình biên dịch có thể sản xuất. Chúng ta lại phải điều chỉnh phần bù trong
tải và lưu trữ để tính hai từ dành riêng cho bảng phương thức và độ dài.
Hình e2.15.12 hiển thị cơ thể phương pháp cho những hướng dẫn mới cho sắp
xếp.
(Chúng tôi có thể lấy tiết kiệm, khôi phục và trở về từ Hình e2,28).
Thử nghiệm đầu tiên là một lần nữa để đảm bảo con trỏ tới v không phải là
null :

beq x10, x0, Lỗi // nếu x10 == 0, lỗi goto

hoán đổi: beq x10, x0, NullPulum # Nếu x10 == 0, lỗi goto
lw x5, 4 (x10) # Temp reg x5 = độ dài của mảng v
blt x11, x0, IndexOutOfBound # Nếu k <0, lỗi goto
bge x11, x5, IndexOutOfBounds # Nếu k> = chiều dài, lỗi goto
addi x6, x11, 1 # Temp reg x6 = k + 1
blt x6, x0, IndexOutOfBounds # Nếu k + 1 <0, lỗi goto
bge x6, x5, IndexOutOfBOunds # Nếu k + 1> = chiều dài, lỗi goto

slli x11, x11, 2 # reg X11 =k*4


thêm x11, x11, x10 # reg X11 = v + (k * 4)
lw x12, 0 (x11) # reg x12 = v [k]
lw x13, 4 (x11) # reg x13 = v [k + 1]
sw x13, 0 (x11) # v [k] = reg x13
sw x12, 4 (x11) # v [k + 1] = reg x12

jalr x0,0 (x1) # trở lại thói quen gọi


HÌNH e2.15.11 Mã lắp ráp RISC-V của quy trình hoán đổi trong Hình e2.24.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e23

Di chuyển các tham số addi x21, x10, 0 # Sao chép tham số x10 vào x21
Kiểm tra ptr null beq x10, x0, NullPulum # Nếu x10 == 0, lỗi goto
Nhận độ dài mảng lw x22, 4 (x10) # x22 = độ dài của mảng v
addi x19, x0, 0 #i=0
Đầu vòng ngoài for1tst : bge x19, x22, thoát1 # Nếu i> = chiều dài, đi đến lối ra1
addi x20, x19, -1 #j=i-1
Đầu vòng trong for2tst : blt x20, x0, thoát1 # Nếu j <0, goto exit2

Kiểm tra nếu j quá lớn bge x20, x22, IndexOutOfBound # Nếu j> = chiều dài, lỗi goto

slli x5, x20, 2 # x5 = j * 4


Nhận v [j] thêm x5, x21, x5 # x5 = v + (j * 4)
lw x6, 0 (x5) # x6 = v [j]
addi x7, x20, 1 # x7 = j + 1
Kiểm tra nếu j + 1 <0 hoặc blt x7, x0, IndexOutOfBounds # Nếu j + 1 <0, lỗi goto
quá lớn bge x7, x22, IndexOutOfBounds # Nếu j + 1> = chiều dài, lỗi goto

Nhận v [j + 1] lw x7, 4 (x5) # x7 = v [j + 1]


Bảng phương pháp tải lw x28, 0 (x10) # x28 = địa chỉ của bảng phương thức
Nhận địa chỉ phương
pháp lw x28, 8 (x28) # x28 = địa chỉ của phương pháp thứ ba
addi x10, x6, 0 # Tham số thứ 1 là v [j]
Truyền tham số
for2tst : addi x11, x7, 0 Tham số thứ 2 là v [j + 1]
Phương thức gọi gián tiếp jalr x1, 0 (x28) # Gọi so sánh
Kiểm tra nếu nên bỏ qua ble x10, x0, thoát2 # Nếu kết quả <= 0, bỏ qua trao đổi
hoán đổi
Truyền tham số addi x10, x21, 0 # Tham số 1 là v
addi x11, x20, 0 # Tham số thứ 2 là j
và gọi hoán đổi jal x1, trao đổi # Gọi thói quen hoán đổi (Hình 2.34)
addi x20, x20, -1 #j-=1
Đầu vòng trong
jal x0, for2tst # Chuyển đến for2tst
lối ra2 : addi x19, x19,1 #i+=1
Đầu vòng ngoài
jal x0, for1tst # Đi đến for1tst

HÌNH e2.15.12 Phiên bản lắp ráp RISC-V của thân phương thức của phiên bản Java sắp xếp.Mã mới được tô sáng trong con
số này. Chúng tôi vẫn phải thêm mã để lưu và khôi phục các thanh ghi và trả về từ mã RISC-V được tìm thấy trong Hình e2.27 Để giữ mã
tương tự như con số đó, chúng tôi tải. v.length vào x22 thay vì vào một đăng ký tạm thời. Để giảm số lượng dòng mã, chúng tôi đưa ra giả
định đơn giản hóa điều đó so sánh với là một thủ tục lá và chúng ta không cần phải đẩy các thanh ghi để được lưu trên ngăn xếp.

Tiếp theo, chúng tôi tải độ dài của mảng (chúng tôi sử dụng thanh ghi x22 để giữ
nó tương tự như mã cho phiên bản C sắp xếp) :
lw x22, 4 (x10) // x22 = độ dài của mảng v
Bây giờ chúng tôi phải đảm bảo rằng chỉ số nằm trong giới hạn. Vì thử
nghiệm đầu tiên của vòng lặp bên trong là kiểm tra xem j là âm tính, chúng ta có
thể bỏ qua bài kiểm tra ràng buộc ban đầu. Điều đó để lại bài kiểm tra quá lớn :
bge x20, x22, IndexOutOfBound // nếu j> = chiều dài, lỗi goto
151.e24 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

Mã để thử nghiệm j + 1 khá giống với mã để kiểm tra k + 1 trong hoán đổi, vì
vậy chúng tôi bỏ qua nó ở đây.
Sự khác biệt chính là sự cầu khẩn của so sánh vớiTrước tiên chúng tôi tải địa
chỉ của bảng các phương thức pháp lý, mà chúng tôi giả sử là hai từ trước khi bắt
đầu mảng :.
lw x28, 0 (x10) // x28 = địa chỉ của bảng phương thức
Đưa ra địa chỉ của bảng phương thức cho đối tượng này, sau đó chúng ta có
được phương thức mong muốn. Hãy giả sử so sánh với là phương pháp thứ ba
trong So sánh lớp học. Để chọn địa chỉ của phương thức thứ ba, chúng tôi tải địa
chỉ đó vào một thanh ghi tạm thời :
lw x28, 8 (x28) // x28 = địa chỉ của phương pháp thứ ba
Bây giờ chúng tôi đã sẵn sàng để gọi so sánh với Bước tiếp theo là lưu các
thanh ghi cần thiết trên ngăn xếp. May mắn thay, chúng tôi không cần các thanh
ghi tạm thời hoặc các thanh ghi đối số sau khi gọi phương thức, vì vậy không có
gì để lưu. Vì vậy, chúng tôi chỉ đơn giản là vượt qua các tham số cho. so sánh với:
addi x10, x6, 0 // Tham số thứ nhất của so sánh là v [j]
addi x11, x7, 0 // Tham số thứ 2 của so sánhTo là v [j + 1]

Sau đó, chúng tôi sử dụng thanh ghi nhảy và liên kết để gọi so sánh với:

jalr x1, 0 (x28) // gọi so sánhTo và lưu địa chỉ trả về trong x1

Phương thức trả về, với x10 xác định yếu tố nào trong hai yếu tố lớn hơn. Nếu
x10> 0, sau đó v [j]> v [j + 1]và chúng ta cần hoán đổi Vì vậy, để bỏ qua. hoán đổi,
chúng ta cần kiểm tra nếu x10 ≤ 0:
ble x10, x0, thoát2 // đi đến exit2 nếu v [j] v [j + 1]

Mã RISC-V cho so sánh với còn lại như một bài tập.

Giao diện Những thay đổi chính cho các phiên bản Java của sắp xếp và hoán đổi đang thử
nghiệm các tham chiếu đối tượng null và các lỗi ngoài chỉ mục và yêu cầu
phần phương thức bổ sung để đưa ra so sánh tổng quát hơn. Gọi phương thức này đắt
cứng / hơn một lệnh gọi thủ tục C, vì nó yêu cầu, một nhánh có điều kiện, một cặp tải bị
phần xiềng xích và một nhánh gián tiếp. Như chúng ta thấy trong Chương 4, tải phụ
thuộc và các nhánh gián tiếp có thể tương đối chậm trên các bộ xử lý hiện đại. Sự
mềm phổ biến ngày càng tăng của Java cho thấy rằng nhiều lập trình viên ngày nay sẵn
sàng tận dụng hiệu suất cao của các bộ xử lý hiện đại để trả tiền cho việc kiểm tra
lỗi và tái sử dụng mã.
2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java 151.e25

Xây dựng Mặc dù chúng tôi kiểm tra từng tài liệu tham khảo j và j + 1 để chắc
chắn rằng những điều này các chỉ số nằm trong giới hạn, một lập trình viên ngôn ngữ
lắp ráp có thể xem mã và lý do như sau :
1. Bên trong cho vòng lặp chỉ được thực hiện nếu j ≤ 0 và kể từ đó j + 1> j,
không cần phải kiểm tra j + 1 để xem nếu nó nhỏ hơn 0.
2. Kể từ đó Tôi đảm nhận các giá trị, 0, 1, 2, ..., (data.length - 1) và kể từ đó j
đảm nhận các giá trị i - 1, i - 2, ..., 2, 1, 0, không cần kiểm tra nếu j
Data.length kể từ giá trị lớn nhất j có thể là data.length - 2.
3. Theo cùng một lý do, không cần phải kiểm tra xem j + 1 data.length kể từ
giá trị lớn nhất của j+1 là data.length - 1.
Có thủ thuật mã hóa trong phần còn lại của Chương 2 và thực hiện superscalar
trong Chương 4 làm giảm chi phí hiệu quả của việc kiểm tra giới hạn như vậy, nhưng
chỉ những trình biên dịch tối ưu hóa cao mới có thể lý do theo cách này. Lưu ý rằng
nếu trình biên dịch đưa phương thức trao đổi vào sắp xếp, nhiều kiểm tra sẽ không
cần thiết.

Xây dựng Nhìn kỹ mã để trao đổi Hình e2.15.11Xem bất cứ điều gì. sai trong mã,
hoặc ít nhất là trong phần giải thích về cách thức hoạt động của mã? Nó ngầm giả
định rằng mỗi So sánh yếu tố trong v dài 4 byte. Chắc chắn, bạn cần nhiều hơn 4 byte
cho một lớp con phức tạp So sánh, có thể chứa bất kỳ số lượng các trường. Đáng
ngạc nhiên, mã này hoạt động, bởi vì một thuộc tính quan trọng của ngữ nghĩa Java,
buộc phải sử dụng cùng một đại diện nhỏ cho tất cả các biến, trường và các phần tử
mảng thuộc về So sánh hoặc các lớp con của nó.
Các loại Java được chia thành loại nguyên thủyCác loại được xác định trước cho
các số, ký tự và Booleans và các loại tham khảoCác lớp tích hợp như Chuỗi, các lớp
do người dùng xác định và mảng. Giá trị của các loại tham chiếu là con trỏ (còn được
gọi tài liệu tham khảo) cho các đối tượng ẩn danh được phân bổ trong đống. Cho lập
trình viên, điều này có nghĩa là việc gán một biến cho một biến khác không tạo ra một
đối tượng mới, mà thay vào đó làm cho cả hai biến đều đề cập đến cùng một đối
tượng. Do các đối tượng này là ẩn danh và do đó các chương trình không có cách
nào để chỉ chúng trực tiếp, nên một chương trình phải sử dụng hướng thông qua một
biến để đọc hoặc viết bất kỳ đối tượng nào Các trường (biến). Do đó, vì cấu trúc dữ
liệu được phân bổ cho mảng v bao gồm hoàn toàn các con trỏ, có thể an toàn khi cho
rằng tất cả chúng đều có cùng kích thước và cùng một mã hoán đổi hoạt động cho tất
cả So sánhCác kiểu con của người Viking.
Để viết các hàm sắp xếp và hoán đổi cho các mảng của các kiểu nguyên thủy yêu
cầu chúng ta viết các phiên bản mới của các hàm, mỗi loại cho mỗi loại. Sự nhân
rộng này là vì hai lý do. Đầu tiên, các giá trị loại nguyên thủy không bao gồm các
tham chiếu đến các bảng gửi mà chúng tôi đã sử dụng So sánh để xác định tại thời
gian chạy làm thế nào để so sánh các giá trị. Thứ hai, các giá trị nguyên thủy có các
kích cỡ khác nhau: 1, 2, 4 hoặc 8 byte.
Việc sử dụng con trỏ phổ biến trong Java rất thanh lịch về tính nhất quán của nó,
với hình phạt là một mức độ không định hướng và yêu cầu các đối tượng được phân
bổ trên heap. Hơn nữa, trong bất kỳ ngôn ngữ nào mà tuổi thọ của các đối tượng ẩn
danh được phân bổ heap không phụ thuộc vào tuổi thọ của các biến, trường và các
thành phần mảng được đặt tên tham chiếu chúng, các lập trình viên phải giải quyết
vấn đề khi quyết định an toàn để phân bổ heap lưu trữ phân bổ. Các nhà thiết kế
Java đã chọn sử dụng
151.e26 2.15 Tài liệu nâng cao: Biên dịch C và Phiên dịch Java

thu gom rác. Tất nhiên, sử dụng bộ sưu tập rác thay vì quản lý bộ nhớ người dùng rõ
ràng cũng cải thiện sự an toàn của chương trình.
C++ cung cấp một sự tương phản thú vị. Mặc dù các lập trình viên có thể viết về
cơ bản cùng một giải pháp thao tác con trỏ trong C++, có một lựa chọn khác. Trong
C++, các lập trình viên có thể chọn từ bỏ mức độ chỉ định và thao tác trực tiếp một
mảng các đối tượng, thay vì một mảng các con trỏ tới các đối tượng đó. Để làm như
vậy, C++ các lập trình viên thường sử dụng khả năng của mẫu, cho phép một lớp
hoặc hàm được tham số hóa bởi kiểu dữ liệu mà nó hoạt động. Tuy nhiên, các mẫu
được biên dịch bằng cách sử dụng tương đương với mở rộng macro. Đó là, nếu
chúng tôi khai báo một thể hiện có khả năng sắp xếp các loại X và Y, C++ sẽ tạo hai
bản sao của mã cho lớp: một để sắp xếp<X> và một cho sắp xếp<Y>, mỗi chuyên
ngành phù hợp. Giải pháp này tăng kích thước mã để đổi lấy việc so sánh nhanh hơn
(vì các lệnh gọi hàm sẽ không gián tiếp và thậm chí có thể bị mở rộng nội tuyến). Tất
nhiên, lợi thế tốc độ sẽ bị hủy nếu hoán đổi các đối tượng cần di chuyển một lượng
lớn dữ liệu thay vì chỉ một con trỏ. Như mọi khi, thiết kế tốt nhất phụ thuộc vào các
chi tiết của vấn đề.
152 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

hiệu suất. Hãy nhớ rằng chủ đề xây dựng trình biên dịch thường được dạy trong
một hoặc hai học kỳ, vì vậy phần giới thiệu của chúng tôi sẽ nhất thiết chỉ chạm
vào những điều cơ bản.
ngôn ngữ hướng đối Phần thứ hai của phần này dành cho độc giả quan tâm đến việc xem làm thế
tượng A ngôn ngữ nào một ngôn ngữ hướng đối tượng giống như Java thực thi trên kiến trúc
lập trình được định RISC-V. Nó hiển thị Java mã byte được sử dụng để giải thích và mã RISC-V cho
hướng xung quanh các phiên bản Java của một số phân đoạn C trong các phần trước, bao gồm cả Bubble
đối tượng thay vì hành
động hoặc dữ liệu so
Sort. Nó bao gồm cả trình biên dịch Java Virtual Machine và JIT.
với logic. Phần còn lại của Mục 2.15 có thể được tìm thấy trực tuyến.

2.16 Real Stuff: MIPS Hướng dẫn

Tập lệnh tương tự như RISC-V, MIPS, cũng có nguồn gốc từ giới hàn lâm, nhưng
hiện thuộc sở hữu của Wave Computing. MIPS và RISC-V có chung triết lý thiết kế,
mặc dù MIPS cao hơn 25 tuổi so với RISC-V. Tin tốt là nếu bạn biết RISC-V, sẽ rất
dễ dàng để chọn MIPS. Để thể hiện sự tương đồng của họ , Hình 2.29 so sánh các
định dạng hướng dẫn cho RISC-V và MIPS .
MIPS ISA có cả phiên bản địa chỉ 32 bit và địa chỉ 64 bit, được gọi hợp lý là
MIPS-32 và MIPS-64. Các bộ lệnh này gần như giống hệt nhau ngoại trừ kích
thước địa chỉ lớn hơn cần các thanh ghi 64 bit thay vì các thanh ghi 32 bit. Dưới
đây là các tính năng phổ biến giữa RISC-V và MIPS :
n Tất cả các hướng dẫn rộng 32 bit cho cả hai kiến trúc.
n Cả hai đều có 32 thanh ghi đa năng, với một thanh ghi được gắn với 0.
n Cách duy nhất để truy cập bộ nhớ là thông qua tải và lưu trữ hướng dẫn
trên cả hai kiến trúc.
n Không giống như một số kiến trúc, không có hướng dẫn nào có thể tải hoặc
lưu trữ nhiều thanh ghi trong MIPS hoặc RISC-V .
n Cả hai đều có hướng dẫn nhánh đó nếu thanh ghi bằng 0 và nhánh nếu
thanh ghi không bằng 0.
n Cả hai bộ chế độ địa chỉ đều hoạt động cho tất cả các kích cỡ từ.
Một trong những khác biệt chính giữa RISC-V và MIPS là đối với các nhánh có
điều kiện khác với bằng hoặc không bằng nhau. Trong khi RISC-V chỉ đơn giản cung
cấp các hướng dẫn nhánh để so sánh hai thanh ghi, MIPS dựa trên một lệnh so sánh
đặt thanh ghi thành 0 hoặc 1 tùy thuộc vào việc so sánh có đúng hay không. Các lập
trình viên sau đó làm theo hướng dẫn so sánh đó với một nhánh bằng hoặc không
bằng 0 tùy thuộc vào kết quả mong muốn của so sánh. Theo triết lý tối giản của nó,
MIPS chỉ thực hiện ít hơn so sánh, để lại cho lập trình viên chuyển đổi thứ tự các
toán hạng hoặc chuyển điều kiện đang được chi nhánh kiểm tra để có được tất cả các
kết quả mong muốn. MIPS có cả phiên bản đã ký và không dấu của bộ trên ít hơn
hướng dẫn : slt và sltu.
2.17 Real Stuff: Hướng dẫn ARMv7 (32 bit) 153

31 28 27 20 19 16 15 12 11 43 0
1 2
rupe rupee
ARM Opx4 Opsố 8 e4 Rd4 Opxsố 8 4
Đăng ký đăng ký
31 26 25 21 20 16 15 11 10 6 5 0
2
MIPS Op6 1 rupee5 rupee5 Rd5 Hằng5 Opx6

31 25 24 20 19 1514 12 11 76 0

RISC-V
func77 2 rupee5 1 rupee5 func33 Rd5 opsode7

31 28 27 20 19 16 15 12 11 0
Tải 1
rupe
ARM Opx4 Opsố 8 e4 Rd4 Hằng12

31 26 25 21 20 16 15 0

MIPS Op6 1 rupee5 Rd5 Hằng16

31 20 19 1514 12 11 76 0

RISC-V
ngay lập tức12 1 rupee5 func33 Rd5 opsode7

Cửa hàng 31 28 27 20 19 16 15 12 11 0
1
ARM
rupee
Opx4 Opsố 8 4 Rd4 Hằng12

31 26 25 21 20 16 15 0
MIPS
Op6 1 rupee5 Rd5 Hằng16

31 25 24 20 19 1514 12 11 7 6 0
ngay lập
RISC-V ngay lập tức7 2 rupee5 1 rupee5 func33 tức5 opsode7

HÌNH 2.29 Các định dạng hướng dẫn của ARM, RISC-V và MIPS . Sự khác biệt kết quả từ liệu
kiến trúc có 16 thanh ghi như ARM hay 32 thanh ghi như MIPS và RISC-V .

Khi chúng ta nhìn xa hơn các hướng dẫn cốt lõi được sử dụng phổ biến nhất,
sự khác biệt chính khác là MIPS đầy đủ là một tập lệnh lớn hơn nhiều so với
RISC-V, như chúng ta sẽ thấy Mục 2.20.

2.17 Real Stuff: Hướng dẫn ARMv7 (32 bit)


ARM là kiến trúc tập lệnh phổ biến nhất cho các thiết bị nhúng, với hơn 100 tỷ
thiết bị cho đến năm 2016. Đứng ban đầu cho Acorn Machine, tên này sau đó
được đổi thành Advanced RISC Machine, ARM đã đến
154 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Nguồn / loại toán hạng đích Nguồn thứ hai


Đăng ký Đăng ký
Đăng ký Ngay lập tức
Đăng ký Ký ức
Ký ức Đăng ký
Ký ức Ngay lập tức

HÌNH 2.30 Điểm tương đồng trong các bộ hướng dẫn ARM và RISC-V.

Đăng ký
Chế độ Sự miêu tả hạn chế Tương đương RISC-V
Không phải ESP hay
Đăng ký gián tiếp Địa chỉ là trong một đăng ký. EBP ld x10, 0 (x11)
Chế độ dựa trên 8 hoặc 32 bit Địa chỉ là nội dung của đăng ký cơ sở cộng Không phải ESP ld x10, 40 (x11)
chuyển vị chuyển vị.
Cơ sở cộng với chỉ số mở rộng Địa chỉ là Cơ sở: bất kỳ GPR slli x12, x12, 3
Chỉ số: không phải
Quy mô
Cơ sở + (2 × Chỉ mục) ESP thêm x11, x11, x12
Trong đó Tỷ lệ có giá trị 0, 1, 2 hoặc 3. ld x10, 0 (x11)
Cơ sở cộng với chỉ số mở rộng
với Địa chỉ là Cơ sở: bất kỳ GPR slli x12, x12, 3
Chuyển vị 8 hoặc 32 bit Chỉ số: không phải
Cơ sở + (2Quy mô × Chỉ mục) + Dịch chuyển ESP thêm x11, x11, x12
Trong đó Tỷ lệ có giá trị 0, 1, 2 hoặc 3. ld x10, 40 (x11)

HÌNH 2.31 ARM đăng ký Đăng ký và hướng dẫn truyền dữ liệu tương đương với lõi RISC-
V. Dấu gạch ngang có nghĩa là hoạt động không có sẵn trong kiến trúc đó hoặc không được tổng hợp trong
một số ít hướng dẫn. Nếu có một số lựa chọn hướng dẫn tương đương với lõi RISC-V, chúng được phân
tách bằng dấu phẩy. ARM bao gồm các ca làm việc như một phần của mọi hướng dẫn vận hành dữ liệu, do
đó, một ca làm việc với siêu ký tự 1 chỉ là một biến thể của hướng dẫn di chuyển, chẳng hạn như lsr1. Lưu
ý rằng ARM không có hướng dẫn phân chia.

cùng năm với MIPS và theo những triết lý tương tự. Hình 2.30 liệt kê những
điểm tương đồng giữa ARM và RISC-V. Sự khác biệt chính là RISC-V có nhiều
thanh ghi hơn và ARM có nhiều chế độ địa chỉ hơn.
Có một lõi tương tự của các bộ lệnh cho các hướng dẫn truyền dữ liệu và logic
số học cho MIPS và ARM, như Hình 2.31 chương trình.

Các chế độ địa chỉ


Hình 2.32 hiển thị các chế độ địa chỉ dữ liệu được ARM hỗ trợ. Không giống
như RISC-V , ARM không dành một thanh ghi để chứa 0. Mặc dù RISC-V chỉ
có ba chế độ địa chỉ dữ liệu đơn giản (xem Hình 2.18), ARM có chín, bao gồm
các tính toán khá phức tạp. Ví dụ: ARM có chế độ địa chỉ có thể dịch chuyển
một thanh ghi theo bất kỳ số tiền nào, thêm nó vào các thanh ghi khác để tạo địa
chỉ và sau đó cập nhật một thanh ghi với địa chỉ mới này.

So sánh và chi nhánh có điều kiện


RISC-V sử dụng nội dung của các thanh ghi để đánh giá các nhánh có điều kiện.
ARM sử dụng bốn bit mã điều kiện truyền thống được lưu trữ trong từ trạng thái
chương trình : tiêu cực,
2.17 Real Stuff: Hướng dẫn ARMv7 (32 bit) 155

Hướng dẫn Chức năng


je tên nếu bằng (mã điều kiện) {EIP = tên};
EIPTHER 128 <= tên <EIP + 128
jmp tên EIP = tên
gọi tên SP = SPTHER 4; M [SP] = EIP + 5; EIP = tên;
EBX Movw, [EDI + 45] EBX = M [EDI + 45]
đẩy ESI SP = SPTHER 4; M [SP] = ESI
EDI pop EDI = M [SP]; SP = SP + 4
thêm EAX, # 6765 EAX = EAX + 6765
kiểm tra EDX, # 42 Đặt mã điều kiện (fl ags) với EDX và 42
Movsl M [EDI] = M [ESI];
EDI = EDI + 4; ESI = ESI + 4

HÌNH 2.32 Tóm tắt các chế độ địa chỉ dữ liệu. ARM có đăng ký gián tiếp và đăng ký riêng
+ tắt các chế độ địa chỉ được đặt thay vì chỉ đặt 0 vào phần bù của chế độ sau. Để có phạm vi địa chỉ lớn
hơn, ARM sẽ dịch chuyển phần bù còn lại 1 hoặc 2 bit nếu kích thước dữ liệu là một nửa từ hoặc từ.

không, mang, và trànChúng có thể được đặt trên bất kỳ hướng dẫn số học hoặc
logic nào;. Không giống như các kiến trúc trước đó, cài đặt này là tùy chọn trên
mỗi hướng dẫn. Một tùy chọn rõ ràng dẫn đến ít vấn đề hơn trong việc thực hiện
đường ống. ARM sử dụng các nhánh có điều kiện để kiểm tra mã điều kiện để
xác định tất cả các mối quan hệ không dấu và có chữ ký.
CMP trừ một toán hạng khác và sự khác biệt đặt mã điều kiện. So sánh tiêu
cực (CMN) thêm cái này hoạt động với cái kia và tổng đặt mã điều kiện. TST
thực hiện logic AND trên hai toán hạng để đặt tất cả các mã điều kiện nhưng tràn,
trong khi TEQ sử dụng OR độc quyền để đặt ba mã điều kiện đầu tiên.
Một tính năng khác thường của ARM là mọi hướng dẫn đều có tùy chọn thực
thi có điều kiện tùy thuộc vào mã điều kiện. Mỗi lệnh bắt đầu với trường 4 bit
xác định xem nó sẽ hoạt động như một lệnh không hoạt động (nop) hay hướng
dẫn thực tùy thuộc vào mã điều kiện. Do đó, các nhánh có điều kiện được coi là
điều kiện thực hiện hướng dẫn nhánh vô điều kiện. Thực thi có điều kiện cho
phép tránh một nhánh nhảy qua một lệnh duy nhất. Phải mất ít không gian mã và
thời gian hơn để thực hiện một cách có điều kiện một lệnh.
Hình 2.29 hiển thị các định dạng hướng dẫn cho ARM và MIPS. Hiệu trưởng
sự khác biệt là trường thực thi có điều kiện 4 bit trong mọi lệnh và trường đăng
ký nhỏ hơn, vì ARM có một nửa số thanh ghi.

Các tính năng độc đáo của ARM


Hình 2.33 cho thấy một vài hướng dẫn logic số học không tìm thấy trong MIPS.
Kể từ đó ARM không có thanh ghi chuyên dụng cho 0, nó có các opcodes riêng
biệt để thực hiện một số thao tác mà MIPS có thể thực hiện với $ zero. Ngoài ra,
ARM có hỗ trợ cho số học đa từ.
156 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

a. JE EIP + dịch chuyển


4 4 số 8
JE Condi- Dịch chuyển
tion

b. GỌI
số
8 32
GỌI Bù đắp

c. BIẾN EBX, [EDI + 45]


6 1 1 số 8 số 8
r/m
BIẾN d w Dịch chuyển
Postbyte

d. KIẾM ESI
5 3
ĐÚN Reg
G

e. THÊM EAX, # 6765


4 3 1 32
THÊM Reg w Ngay lập tức

f. KIỂM TRA EDX,


# 42
7 1 số 8 32
KIỂM
TRA w Postbyte Ngay lập tức

HÌNH 2.33 ARM hướng dẫn số học / logic không tìm thấy trong MIPS .

Trường ngay lập tức 12 bit ARM ARM có một cách giải thích mới. Tám bit có
ý nghĩa nhỏ nhất được mở rộng bằng 0 đến giá trị 32 bit, sau đó xoay đúng số bit
được chỉ định trong bốn bit đầu tiên của trường nhân với hai. Một lợi thế là sơ đồ
này có thể đại diện cho tất cả các quyền hạn của hai trong một từ 32 bit. Liệu sự
phân chia này có thực sự bắt được nhiều hơn so với trường 12 bit đơn giản hay
không sẽ là một nghiên cứu thú vị.
Chuyển đổi toán tử không giới hạn ở ngay lập tức. Thanh ghi thứ hai của tất cả
các hoạt động xử lý số học và logic có tùy chọn được thay đổi trước khi được vận
hành. Các tùy chọn dịch chuyển là dịch chuyển trái logic, dịch chuyển phải logic,
dịch chuyển số học phải và xoay phải.
ARM cũng có hướng dẫn để lưu các nhóm thanh ghi, được gọi tải khối và cửa
hàngDưới sự kiểm soát của mặt nạ 16 bit trong hướng dẫn, bất kỳ trong số 16 thanh
ghi.
2.18 Real Stuff: Hướng dẫn ARMv8 (64 bit) 157

có thể được tải hoặc lưu trữ vào bộ nhớ trong một lệnh duy nhất. Các hướng dẫn
này có thể lưu và khôi phục các thanh ghi khi nhập và trả lại thủ tục. Các hướng
dẫn này cũng có thể được sử dụng để sao chép bộ nhớ khối và giảm kích thước
mã khi nhập và thoát thủ tục.

2,18 Real Stuff: Hướng dẫn ARMv8 (64 bit)

Trong số nhiều vấn đề tiềm ẩn trong một tập lệnh, vấn đề gần như không thể khắc
phục là có một địa chỉ bộ nhớ quá nhỏ. Trong khi x86 được mở rộng thành công
các địa chỉ đầu tiên đến 32 bit và sau đó đến các địa chỉ 64 bit, nhiều anh em của
nó đã bị bỏ lại phía sau. Ví dụ, địa chỉ 16 bit MOStek 6502 cung cấp năng lượng
cho Apple II, nhưng ngay cả khi bắt đầu với máy tính cá nhân thành công về mặt
thương mại đầu tiên, việc thiếu các bit địa chỉ đã lên án nó đối với thùng rác của
lịch sử.
Các kiến trúc sư ARM có thể nhìn thấy chữ viết trên tường của máy tính địa
chỉ 32 bit của họ và bắt đầu thiết kế phiên bản địa chỉ 64 bit của ARM vào năm
2007. Cuối cùng nó đã được tiết lộ vào năm 2013. Thay vì một số thay đổi mỹ
phẩm nhỏ để làm cho tất cả các thanh ghi rộng 64 bit, về cơ bản là những gì đã
xảy ra với x86, ARM đã thực hiện một cuộc đại tu hoàn chỉnh. Tin tốt là nếu bạn
biết MIPS, sẽ rất dễ dàng để nhận ARMv8, vì phiên bản 64 bit được gọi.
Đầu tiên, so với RISC-V, ARM đã bỏ hầu như tất cả các tính năng khác
thường của v7 :
n Không có trường thực thi có điều kiện như trong gần như mọi hướng dẫn
trong v7.
n Trường tức thời chỉ đơn giản là hằng số 12 bit chứ không phải là đầu vào
cho hàm tạo hằng số như trong v7.
n ARM đã giảm Tải nhiều và Lưu trữ Nhiều hướng dẫn.
n PC không còn là một trong những thanh ghi, dẫn đến các nhánh bất ngờ
nếu bạn viết cho nó.

Thứ hai, ARM đã thêm các tính năng còn thiếu hữu ích trong MIPS :
n V8 có 32 thanh ghi đa năng, mà các nhà văn biên dịch chắc chắn yêu thích.
Giống như MIPS, một thanh ghi được gắn với 0, mặc dù trong các hướng
dẫn tải và lưu trữ, thay vào đó, nó đề cập đến con trỏ ngăn xếp.
n Các chế độ địa chỉ của nó hoạt động cho tất cả các kích thước từ trong
ARMv8, điều này không xảy ra trong ARMv7.
n Nó bao gồm một hướng dẫn phân chia, đã bị bỏ qua khỏi ARMv7.
n Nó thêm tương đương với nhánh MIPS nếu bằng và nhánh nếu không bằng nhau.
158 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Vì triết lý của tập lệnh v8 gần với RISC-V hơn so với v7, kết luận của chúng
tôi là sự tương đồng chính giữa ARMv7 và ARMv8 là tên.

2.19 Real Stuff: x86 Hướng dẫn

Vẻ đẹp hoàn toàn nằm Các nhà thiết kế bộ lệnh đôi khi cung cấp các thao tác mạnh hơn so với các hoạt
động được tìm thấy trong RISC -V và MIPS. Mục tiêu nói chung là để giảm số
trong mắt của kẻ si tình.
lượng hướng dẫn được thực hiện bởi một chương trình. Điều nguy hiểm là việc
Margaret Wolfe giảm này có thể xảy ra với chi phí đơn giản, làm tăng thời gian chương trình thực
Hungerford , hiện vì các hướng dẫn chậm hơn. Sự chậm chạp này có thể là kết quả của thời
Molly Bình minh, gian chu kỳ đồng hồ chậm hơn hoặc yêu cầu nhiều chu kỳ đồng hồ hơn là một
1877 chuỗi đơn giản hơn.

Do đó, con đường hướng tới sự phức tạp của hoạt động đầy nguy hiểm. Mục
2.21 chứng minh những cạm bẫy của sự phức tạp.

Sự phát triển của Intel x86


đăng ký mục đích RISC-V và MIPS là tầm nhìn của các nhóm đơn lẻ làm việc cùng một lúc; các
chung (GPR) A đăng
mảnh của các kiến trúc này phù hợp độc đáo với nhau. Đó không phải là trường
ký có thể được sử dụng
cho các địa chỉ hoặc hợp của x86; nó là sản phẩm của một số nhóm độc lập đã phát triển kiến trúc
cho dữ liệu với hầu như trong gần 40 năm, thêm các tính năng mới vào bộ hướng dẫn ban đầu vì ai đó có
bất kỳ hướng dẫn nào. thể thêm quần áo vào túi đóng gói. Dưới đây là các mốc x86 quan trọng.
n 1978: Kiến trúc Intel 8086 được công bố là phần mở rộng tương thích với
ngôn ngữ lắp ráp của Intel 8080 thành công lúc bấy giờ, bộ vi xử lý 8 bit.
8086 là kiến trúc 16 bit, với tất cả các thanh ghi bên trong rộng 16 bit.
Không giống như RISC-V, các thanh ghi có sử dụng chuyên dụng và do đó
8086 không được coi là a đăng ký mục đích chung (GPR) kiến trúc.
n 1980: Bộ đồng xử lý dấu phẩy động Intel 8087 được công bố. Architec này ture
mở rộng 8086 với khoảng 60 hướng dẫn dấu phẩy động. Thay vì sử dụng các
thanh ghi, nó dựa vào một ngăn xếp (xem Mục 2.24 và Mục 3.7).
n 1982: 80286 mở rộng kiến trúc 8086 bằng cách tăng địa chỉ không gian đến
24 bit, bằng cách tạo một mô hình bảo vệ và ánh xạ bộ nhớ phức tạp (xem
Chương 5) và bằng cách thêm một vài hướng dẫn để làm tròn bộ hướng
dẫn và thao tác mô hình bảo vệ.
n 1985: 80386 đã mở rộng kiến trúc 80286 lên 32 bit. Ngoài kiến trúc 32 bit với các
thanh ghi 32 bit và không gian địa chỉ 32 bit, 80386 đã thêm các chế độ địa chỉ mới
và các thao tác bổ sung. Các hướng dẫn mở rộng làm cho 80386 gần như một máy
đăng ký đa năng. 80386 cũng đã thêm hỗ trợ phân trang ngoài địa chỉ được phân
đoạn (xem Chương 5). Giống như 80286, 80386 có chế độ để thực thi 8086 chương
trình mà không thay đổi.
2.19 Real Stuff: x86 Hướng dẫn 159

n 1989 bóng95: 80486 tiếp theo vào năm 1989, Pentium năm 1992 và
Pentium Pro vào năm 1995 đã nhắm đến hiệu suất cao hơn, chỉ có bốn
hướng dẫn được thêm vào bộ hướng dẫn hiển thị của người dùng: ba để
giúp xử lý đa xử lý (xem Chương 6) và một hướng dẫn di chuyển có điều
kiện.
n 1997: Sau khi Pentium và Pentium Pro được vận chuyển, Intel tuyên bố rằng nó
sẽ mở rộng kiến trúc Pentium và Pentium Pro với MMX (Phần mở rộng đa
phương tiện). Bộ 57 hướng dẫn mới này sử dụng ngăn xếp dấu phẩy động để
tăng tốc các ứng dụng đa phương tiện và truyền thông. Hướng dẫn MMX
thường hoạt động trên nhiều yếu tố dữ liệu ngắn tại một thời điểm, theo truyền
thống hướng dẫn đơn, nhiều dữ liệu Kiến trúc (SIMD) (xem Chương 6).
Pentium II không giới thiệu bất kỳ hướng dẫn mới.
n 1999: Intel đã thêm 70 hướng dẫn khác, được dán nhãn SSE (Truyền phát
SIMD Phần mở rộng) là một phần của Pentium III. Những thay đổi chính là
thêm tám các thanh ghi riêng biệt, tăng gấp đôi chiều rộng của chúng lên
128 bit và thêm một kiểu dữ liệu dấu phẩy động chính xác duy nhất. Do đó,
bốn thao tác dấu phẩy động 32 bit có thể được thực hiện song song. Để cải
thiện hiệu suất bộ nhớ, SSE bao gồm các hướng dẫn tìm nạp bộ đệm cộng
với hướng dẫn lưu trữ phát trực tuyến bỏ qua bộ nhớ cache và ghi trực tiếp
vào bộ nhớ (xem Chương 5).
n 2001: Intel đã thêm 144 hướng dẫn khác, lần này được dán nhãn SSE2. Các
kiểu dữ liệu mới là số học chính xác kép, cho phép các cặp hoạt động dấu
phẩy động 64 bit song song. Hầu như tất cả 144 hướng dẫn này là các phiên
bản của hướng dẫn MMX và SSE hiện có hoạt động song song trên 64 bit
dữ liệu. Thay đổi này không chỉ cho phép nhiều hoạt động đa phương tiện
hơn; nó cung cấp cho trình biên dịch một mục tiêu khác cho các hoạt động
dấu phẩy động so với kiến trúc ngăn xếp độc đáo. Trình biên dịch có thể
chọn sử dụng tám thanh ghi SSE làm thanh ghi dấu phẩy động giống như
các thanh ghi được tìm thấy trong các máy tính khác. Sự thay đổi này đã
thúc đẩy hiệu suất điểm nổi của Pentium 4, bộ vi xử lý đầu tiên bao gồm
các hướng dẫn SSE2.
n 2003: Một công ty khác ngoài Intel đã tăng cường kiến trúc x86 lần này.
AMD đã công bố một bộ phần mở rộng kiến trúc để tăng không gian địa
chỉ từ 32 lên 64 bit. Tương tự như quá trình chuyển đổi từ không gian địa
chỉ 16 đến 32 bit vào năm 1985 với 80386, AMD64 mở rộng tất cả các
thanh ghi thành 64 bit. Nó cũng tăng số lượng thanh ghi lên 16 và tăng số
lượng thanh ghi SSE 128 bit lên 16. Thay đổi chính của ISA đến từ việc
thêm một chế độ mới được gọi chế độ dài xác định lại việc thực hiện tất cả
các hướng dẫn x86 với địa chỉ và dữ liệu 64 bit. Để giải quyết số lượng
thanh ghi lớn hơn, nó thêm một tiền tố mới vào hướng dẫn. Tùy thuộc vào
cách bạn đếm, chế độ dài cũng thêm bốn đến 10 hướng dẫn mới và giảm 27
hướng dẫn cũ. Địa chỉ dữ liệu tương đối PC là một phần mở rộng khác.
AMD64 vẫn có chế độ giống hệt x86 (chế độ cũ) cộng với chế độ giới hạn
chương trình người dùng ở x86 nhưng cho phép hệ điều hành sử dụng
AMD64 (chế độ tương thích). Các chế độ này cho phép chuyển đổi duyên
dáng hơn sang địa chỉ 64 bit so với kiến trúc HP / Intel IA-64.
160 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

n 2004: Intel đầu hàng và ôm lấy AMD64, dán nhãn lại Ký ức mở rộng 64 Công
nghệ (EM64T). Sự khác biệt chính là Intel đã thêm 128 bit hướng dẫn so sánh
và trao đổi nguyên tử, có lẽ nên được đưa vào AMD64. Đồng thời, Intel đã
công bố một thế hệ mở rộng truyền thông khác. SSE3 bổ sung 13 hướng dẫn để
hỗ trợ số học phức tạp, các thao tác đồ họa trên các mảng cấu trúc, mã hóa
video, chuyển đổi điểm nổi và đồng bộ hóa luồng (xem Mục 2.11). AMD đã
thêm SSE3 trong các chip tiếp theo và hướng dẫn hoán đổi nguyên tử bị thiếu
vào AMD64 để duy trì khả năng tương thích nhị phân với Intel.
n 2006: Intel công bố 54 hướng dẫn mới như là một phần của tập lệnh SSE4
phần mở rộng. Các tiện ích mở rộng này thực hiện các chỉnh sửa như tổng
số khác biệt tuyệt đối, các sản phẩm chấm cho các mảng cấu trúc, ký hiệu
hoặc mở rộng bằng không dữ liệu hẹp đến kích thước rộng hơn, số lượng
dân số, v.v. Họ cũng thêm hỗ trợ cho các máy ảo (xem Chương 5).
n 2007: AMD công bố 170 hướng dẫn như một phần của SSE5, bao gồm 46
hướng dẫn của tập lệnh cơ sở có thêm ba hướng dẫn toán hạng như RISC-
V.
n 2011: Intel cung cấp Phần mở rộng Vector nâng cao mở rộng SSE chiều
rộng đăng ký từ 128 đến 256 bit, do đó xác định lại khoảng 250 hướng dẫn
và thêm 128 hướng dẫn mới.
n 2015: Intel vận chuyển AVX-512, mở rộng các thanh ghi và hoạt động từ
đó 256 bit đến 512 bit và một lần nữa xác định lại hàng trăm hướng dẫn
cũng như thêm nhiều hướng dẫn khác.
Lịch sử này minh họa tác động của còng tay vàng Vàng về khả năng tương
thích trên x86, vì cơ sở phần mềm hiện có ở mỗi bước là quá quan trọng để gây
nguy hiểm cho những thay đổi kiến trúc quan trọng.
Bất kể thất bại nghệ thuật của x86 là gì, hãy nhớ rằng bộ hướng dẫn này phần
lớn đã thúc đẩy thế hệ máy tính PC và vẫn thống trị phần Đám mây trong thời kỳ
hậu PC. Sản xuất chip 250M x86 mỗi năm có vẻ nhỏ so với hàng tỷ chip ARM,
nhưng nhiều công ty rất thích kiểm soát thị trường như vậy. Tuy nhiên, tổ tiên ca
rô này đã dẫn đến một kiến trúc khó khăn vì các con chip đắt hơn nhiều giải thích
và không thể yêu.
Tự ôm mình vì những gì bạn sắp thấy! Làm không phải cố gắng đọc phần này
với sự cẩn thận mà bạn sẽ cần để viết các chương trình x86; thay vào đó, mục
tiêu là giúp bạn làm quen với những điểm mạnh và điểm yếu của kiến trúc máy
tính để bàn phổ biến nhất thế giới.
Thay vì hiển thị toàn bộ các bộ hướng dẫn 16 bit, 32 bit và 64 bit, trong phần
này, chúng tôi tập trung vào tập hợp con 32 bit có nguồn gốc từ 80386. Chúng tôi
bắt đầu giải thích với các thanh ghi và chế độ địa chỉ, chuyển sang các phép toán
số nguyên và kết thúc bằng kiểm tra mã hóa lệnh.
2.19 Real Stuff: x86 Hướng dẫn 161

Tên Sử dụng
31 0 EAX
GPR 0

GPR 1
ECX
GPR 2
EDX
GPR 3
EBX
GPR 4
ESP
GPR 5
EBP
GPR 6
ESI
GPR 7
EDI
Mã con trỏ phân đoạn
CS
Con trỏ phân đoạn ngăn xếp (đầu ngăn xếp)
SS
Con trỏ phân đoạn dữ liệu 0
DS
Con trỏ phân đoạn dữ liệu 1
ES
FS Con trỏ phân đoạn dữ liệu 2

GS Con trỏ phân đoạn dữ liệu 3

Con trỏ hướng dẫn (PC)


EIP

Mã điều kiện
HIỆU QUẢ

HÌNH 2.34 Bộ đăng ký 80386. Bắt đầu với 80386, tám thanh ghi hàng đầu đã được mở rộng đến 32 bit
và cũng có thể được sử dụng làm thanh ghi mục đích chung.

x86 Đăng ký và Chế độ địa chỉ dữ liệu


Các thanh ghi của 80386 cho thấy sự phát triển của tập lệnh (Hình 2.34). 80386
đã mở rộng tất cả các thanh ghi 16 bit (ngoại trừ các thanh ghi phân đoạn) thành
32 bit, tiền tố an E để tên của họ để chỉ ra phiên bản 32 bit. Chúng tôi sẽ gọi
chúng một cách khái quát là GPRs (đăng ký mục đích chung). 80386 chỉ chứa
tám GPR. Điều này có nghĩa là các chương trình RISC-V và MIPS có thể sử
dụng gấp bốn lần.
Hình 2.35 hiển thị các hướng dẫn số học, logic và truyền dữ liệu hướng dẫn
hai toán tử. Có hai sự khác biệt quan trọng ở đây. Các hướng dẫn số học và logic
x86 phải có một toán hạng hoạt động như cả nguồn và đích; RISC-V và MIPS
cho phép các thanh ghi riêng cho nguồn và
162 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

HÌNH 2.35 Các loại hướng dẫn cho các hướng dẫn truyền dữ liệu, logic và số học. X86 cho
phép các kết hợp được hiển thị. Hạn chế duy nhất là không có chế độ bộ nhớ. Immediates có thể dài 8, 16
hoặc 32 bit; một thanh ghi là bất kỳ một trong 14 thanh ghi chính trong Hình 2.33 (không phải EIP hoặc
EFLAGS).

HÌNH 2.36 x86 Chế độ địa chỉ 32 bit với các hạn chế đăng ký và mã RISC-V tương đương. Cơ sở cộng Chế độ địa chỉ Index
được chia tỷ lệ, không được tìm thấy trong RISC-V hoặc MIPS, được bao gồm để tránh nhân với 4 (hệ số tỷ lệ 2) để biến một chỉ mục trong
một thanh ghi thành địa chỉ byte (xem Hình 2.26 và 2.28). Hệ số tỷ lệ 1 được sử dụng cho dữ liệu 16 bit và hệ số tỷ lệ 2 cho dữ liệu 32 bit.
Hệ số tỷ lệ 0 có nghĩa là địa chỉ không được thu nhỏ. Nếu độ dịch chuyển dài hơn 12 bit ở chế độ thứ hai hoặc thứ tư, thì chế độ tương
đương RISC-V sẽ cần nhiều hướng dẫn hơn, thường là lui để tải các bit 12 đến 31 của độ dịch chuyển, tiếp theo là thêm để tổng các bit này
với đăng ký cơ sở. (Intel đưa ra hai tên khác nhau cho cái được gọi là chế độ địa chỉ dựa trên cơ sở và được lập chỉ mục nhưng về cơ bản
chúng giống hệt nhau và chúng tôi kết hợp chúng ở đây.)

đích đến. Hạn chế này gây áp lực nhiều hơn cho các thanh ghi giới hạn, vì một
thanh ghi nguồn phải được sửa đổi. Sự khác biệt quan trọng thứ hai là một trong
những toán hạng có thể nằm trong bộ nhớ. Do đó, hầu như mọi lệnh đều có thể có
một toán hạng trong bộ nhớ, không giống như RISC-V và MIPS .
Các chế độ địa chỉ bộ nhớ dữ liệu, được mô tả chi tiết dưới đây, cung cấp hai kích
thước địa chỉ trong hướng dẫn. Những cái gọi là chuyển vị có thể là 8 bit hoặc 32 bit.
Mặc dù một toán hạng bộ nhớ có thể sử dụng bất kỳ chế độ địa chỉ nào, nhưng
có những hạn chế về điều đó sổ đăng ký có thể được sử dụng trong một chế độ.
Hình 2.36 hiển thị các chế độ địa chỉ x86 và GPR nào không thể được sử dụng
với mỗi chế độ, cũng như cách có được hiệu ứng tương tự bằng các hướng dẫn
RISC-V.
2.19 Real Stuff: x86 Hướng dẫn 163

x86 Số nguyên hoạt động


8086 cung cấp hỗ trợ cho cả 8 bit (byte) và 16-bit (từ) các loại dữ liệu. 80386
thêm địa chỉ và dữ liệu 32 bit (từ khóa) trong x86. (AMD64 thêm địa chỉ và dữ
liệu 64 bit, được gọi bốn từ; chúng tôi sẽ gắn bó với 80386 trong phần này.) Sự
phân biệt kiểu dữ liệu áp dụng cho các hoạt động đăng ký cũng như truy cập bộ
nhớ.
Hầu như mọi hoạt động đều hoạt động trên cả dữ liệu 8 bit và trên một kích thước dữ liệu dài hơn.
Kích thước đó được xác định bởi chế độ và là 16 bit hoặc 32 bit.
Rõ ràng, một số chương trình muốn hoạt động trên dữ liệu của cả ba kích cỡ,
vì vậy 80386 kiến trúc sư đã cung cấp một cách thuận tiện để chỉ định từng phiên
bản mà không mở rộng đáng kể kích thước mã. Họ quyết định rằng dữ liệu 16 bit
hoặc 32 bit thống trị hầu hết các chương trình và do đó, thật hợp lý khi có thể đặt
kích thước lớn mặc định. Kích thước dữ liệu mặc định này được đặt một bit trong
thanh ghi phân đoạn mã. Để ghi đè kích thước dữ liệu mặc định, 8 bit tiền tố được
đính kèm với hướng dẫn để báo cho máy sử dụng kích thước lớn khác cho hướng
dẫn này.
Giải pháp tiền tố được mượn từ 8086, cho phép nhiều tiền tố sửa đổi hành vi
hướng dẫn. Ba tiền tố ban đầu ghi đè lên thanh ghi phân đoạn mặc định, khóa bus để
hỗ trợ đồng bộ hóa (xem Mục 2.11) hoặc lặp lại hướng dẫn sau cho đến khi đăng ký
ECX đếm ngược xuống 0. Tiền tố cuối cùng này được dự định kết hợp với một lệnh
di chuyển byte để di chuyển một số byte khác nhau. 80386 cũng đã thêm một tiền tố
để ghi đè kích thước địa chỉ mặc định.
Các phép toán số nguyên x86 có thể được chia thành bốn lớp chính :
1. Hướng dẫn chuyển động dữ liệu, bao gồm di chuyển, đẩy và bật.
2. Hướng dẫn số học và logic, bao gồm các phép toán, số nguyên và số thập
phân.
3. Luồng điều khiển, bao gồm các nhánh có điều kiện, các nhánh, cuộc gọi và
trả về vô điều kiện.
4. Hướng dẫn chuỗi, bao gồm di chuyển chuỗi và so sánh chuỗi.
Hai loại đầu tiên không đáng kể, ngoại trừ các hoạt động hướng dẫn số học và
logic cho phép đích đến là một thanh ghi hoặc một vị trí bộ nhớ. Hình 2.37 hiển
thị một số hướng dẫn x86 điển hình và chức năng của chúng.
Các nhánh có điều kiện trên x86 được dựa trên mã điều kiện hoặc là cờMã
điều kiện được đặt làm tác dụng phụ của thao tác; hầu hết được sử dụng để so
sánh giá trị của kết quả với 0. Chi nhánh sau đó kiểm tra mã điều kiện. Địa chỉ
nhánh tương đối với PC phải được chỉ định theo số byte, vì không giống như
RISC-V và MIPS, 80386 hướng dẫn không có giới hạn căn chỉnh.
Hướng dẫn chuỗi là một phần của tổ tiên 8080 của x86 và không được thực
hiện phổ biến trong hầu hết các chương trình. Chúng thường chậm hơn các thói
quen phần mềm tương đương (xem Ngụy biện trên trang 170).
Hình 2.38 liệt kê một số hướng dẫn x86 số nguyên. Nhiều hướng dẫn có sẵn ở
cả định dạng byte và từ.
164 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

HÌNH 2.37 Một số hướng dẫn x86 điển hình và chức năng của chúng. Một danh sách các hoạt
động thường xuyên xuất hiện trong Hình 2.41CALL lưu EIP của lệnh tiếp theo trên ngăn xếp. (EIP là PC
Intel.).

Hướng dẫn Ý nghĩa


Điều khiển Chi nhánh có điều kiện và vô điều kiện
jnz, jz Nhảy nếu điều kiện để bù EIP + 8 bit; JNE (cho JNZ), JE (cho JZ) là
tên thay thế

jmp Nhảy vô điều kiện bù 8 bit hoặc 16 bit


gọi Subroutine gọi bù 16 bit; địa chỉ trả lại đẩy lên ngăn xếp
ret Pops trả lại địa chỉ từ stack và nhảy đến nó
vòng lặp Chi nhánh vòng lặp giảm ECX; nhảy sang EIP + chuyển vị 8 bit nếu ECX  0
Truyền dữ liệu Di chuyển dữ liệu giữa các thanh ghi hoặc giữa thanh ghi và bộ nhớ
di chuyển Di chuyển giữa hai thanh ghi hoặc giữa thanh ghi và bộ nhớ
đẩy, bật Đẩy toán hạng nguồn trên stack; pop toán hạng từ stack top đến một thanh ghi
les Tải ES và một trong các GPR từ bộ nhớ
Số học, logic Các phép toán số học và logic sử dụng các thanh ghi dữ liệu và bộ nhớ
thêm phụ Thêm nguồn đến đích; trừ nguồn từ điểm đến; đăng ký-bộ nhớ
định dạng
cmp So sánh nguồn và điểm đến; định dạng bộ nhớ đăng ký
Chuyển sang trái; dịch chuyển logic phải; xoay phải với mã điều kiện mang theo như fi
shl, shr, rcr ll
Chuyển đổi byte trong tám bit ngoài cùng bên phải của EAX thành từ 16 bit ở bên phải
cbw EAX
kiểm tra Logic VÀ của nguồn và đích đặt mã điều kiện
inc, dec Điểm đến tăng, điểm đến giảm
hoặc, xor Hợp lý HOẶC; độc quyền HOẶC; định dạng đăng ký bộ nhớ
Chuỗi Di chuyển giữa các toán hạng chuỗi; độ dài được cho bởi một tiền tố lặp lại
di chuyển Bản sao từ nguồn chuỗi đến đích bằng cách tăng ESI và EDI; có thể là
lặp đi lặp lại

nhà nghỉ Tải một byte, từ hoặc ô chữ của chuỗi vào thanh ghi EAX

HÌNH 2.38 Một số thao tác điển hình trên x86. Nhiều hoạt động sử dụng định dạng bộ nhớ đăng ký ,
trong đó nguồn hoặc đích có thể là bộ nhớ và nguồn kia có thể là thanh ghi hoặc toán hạng ngay lập tức.
2.19 Real Stuff: x86 Hướng dẫn 165

a. JE EIP + dịch chuyển


4 4 số 8
JE Condi- Dịch chuyển
tion

b. GỌI
số
8 32
GỌI Bù đắp

c. BIẾN EBX, [EDI + 45]


6 1 1 số 8 số 8
r/m
BIẾN d w Dịch chuyển
Postbyte

d. KIẾM ESI
5 3
ĐÚN Reg
G

e. THÊM EAX, # 6765


4 3 1 32
THÊM Reg w Ngay lập tức

f. KIỂM TRA EDX,


# 42
7 1 số 8 32
KIỂM
TRA w Postbyte Ngay lập tức

HÌNH 2.39 Định dạng hướng dẫn x86 điển hình. Hình 2.39 cho thấy mã hóa của postbyte. Nhiều hướng
dẫn chứa trường 1 bit w, trong đó cho biết liệu hoạt động là một byte hoặc một ô chữ kép. Các d trường trong
MOV được sử dụng trong các hướng dẫn có thể di chuyển đến hoặc từ bộ nhớ và hiển thị hướng di chuyển.
Hướng dẫn THÊM yêu cầu 32 bit cho trường tức thời, vì ở chế độ 32 bit, các phần tiếp theo là 8 bit hoặc 32 bit.
Trường ngay lập tức trong TEST dài 32 bit vì không có chế độ 8 bit ngay lập tức để kiểm tra ở chế độ 32 bit. Nhìn
chung, các hướng dẫn có thể thay đổi từ 1 đến 15 byte chiều dài. Độ dài dài đến từ các tiền tố 1 byte bổ sung, có
cả địa chỉ dịch chuyển 4 byte ngay lập tức và 4 byte, sử dụng opcode 2 byte và sử dụng bộ chỉ định chế độ chỉ
mục tỷ lệ, thêm một byte khác.

Mã hóa hướng dẫn x86


Tiết kiệm tồi tệ nhất cho lần cuối, mã hóa các hướng dẫn trong 80386 rất phức
tạp, với nhiều định dạng hướng dẫn khác nhau. Hướng dẫn cho 80386 có thể thay
đổi từ 1 byte, khi chỉ có một toán hạng, tối đa 15 byte.
Hình 2.39 hiển thị định dạng hướng dẫn cho một số hướng dẫn ví dụ trong Hình
2.37Byte opcode thường chứa một chút cho biết liệu toán hạng có 8 bit hay không. hoặc
32 bit. Đối với một số hướng dẫn, opcode có thể bao gồm chế độ địa chỉ và
166 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

HÌNH 2.40 Mã hóa của trình xác định địa chỉ đầu tiên của x86 : mod, reg , r / m.Bốn cột đầu tiên hiển thị mã hóa của trường reg 3 bit,
phụ thuộc vào w bit từ opcode và cho dù máy ở chế độ 16 bit (8086) hay chế độ 32 bit (80386). Các cột còn lại giải thích mod và r / m cánh đồng. Ý
nghĩa của 3 bit r / m trường phụ thuộc vào giá trị trong 2 bit mod trường và kích thước địa chỉ. Về cơ bản, các thanh ghi được sử dụng trong tính toán
địa chỉ được liệt kê trong các cột thứ sáu và thứ bảy, bên dưới mod = 0, với mod = 1 thêm chuyển vị 8 bit và mod = 2 thêm chuyển vị 16 bit hoặc 32
bit, tùy thuộc vào chế độ địa chỉ. Các ngoại lệ là 1) r / m = 6 khi mod = 1 hoặc mod = Chế độ 2 trong 16 bit chọn BP cộng với chuyển vị; 2) r / m = 5
khi mod = 1 hoặc mod = Chọn chế độ 2 trong 32 bit EBP cộng với dịch chuyển; và 3) r / m = 4 ở chế độ 32 bit khi mod không bằng 3, trong đó (sib)
có nghĩa là sử dụng chế độ chỉ mục tỷ lệ được hiển thị trong Hình 2.39Khi nào. mod = 3, các r / m trường chỉ ra một thanh ghi, sử dụng cùng mã hóa
với trường reg kết hợp với w bit.

đăng ký; điều này đúng trong nhiều hướng dẫn có dạng Đăng ký = đăng ký op
ngay lập tức.Các hướng dẫn khác sử dụng một byte postbyte và một byte opcode
bổ sung, được dán nhãn Mod mod, reg, r / m, có chứa thông tin chế độ địa chỉ.
Postbyte này được sử dụng cho nhiều hướng dẫn giải quyết bộ nhớ. Chế độ chỉ
mục cơ sở cộng với tỷ lệ sử dụng chế độ sau thứ hai, được dán nhãn Sc, chỉ mục,
cơ sở.Giáo dục
Hình 2.40 cho thấy mã hóa của hai đặc tả địa chỉ postbyte cho cả hai chế độ 16
bit và 32 bit. Thật không may, để hiểu đầy đủ các thanh ghi và chế độ địa chỉ nào
có sẵn, bạn cần xem mã hóa của tất cả các chế độ địa chỉ và đôi khi cả mã hóa
của các hướng dẫn.

x86 Kết luận


Intel đã có bộ vi xử lý 16 bit hai năm trước khi các đối thủ cạnh tranh của nó có
kiến trúc thanh lịch hơn, chẳng hạn như Motorola 68000, và sự khởi đầu này đã
dẫn đến việc lựa chọn 8086 làm CPU cho PC của IBM. Các kỹ sư của Intel
thường thừa nhận rằng x86 khó xây dựng hơn các máy tính như RISC-V và
MIPS, nhưng thị trường lớn có nghĩa là trong thời đại PC mà AMD và Intel có
thể đủ khả năng để có thêm nguồn lực để giúp khắc phục sự phức tạp thêm vào.
Những gì x86 thiếu trong phong cách, nó điều chỉnh theo quy mô thị trường, làm
cho nó đẹp từ quan điểm đúng.
Ân sủng tiết kiệm của nó là các thành phần kiến trúc x86 được sử dụng thường
xuyên nhất không quá khó để thực hiện, vì AMD và Intel đã chứng minh bằng cách
cải thiện nhanh chóng hiệu suất của các chương trình số nguyên kể từ năm 1978. Để
có được hiệu suất đó, các trình biên dịch phải tránh các phần của kiến trúc khó thực
hiện nhanh.
Tuy nhiên, trong thời kỳ hậu PC, mặc dù có chuyên môn về kiến trúc và sản xuất
đáng kể, x86 vẫn chưa cạnh tranh trong thiết bị di động cá nhân.
2.20 Real Stuff: Phần còn lại của Bộ hướng dẫn RISC-V 167

HÌNH 2.41 Năm hướng dẫn còn lại trong kiến trúc tập lệnh RISC-V cơ sở.

Real Stuff: Phần còn lại của Bộ


2,20 hướng dẫn RISC-V

Với mục tiêu làm cho một kiến trúc tập lệnh phù hợp với nhiều loại máy tính, các
kiến trúc sư RISC-V đã phân vùng tập lệnh thành a căn cứ kiến trúc và một số
phần mở rộngMỗi cái tên được đặt tên bằng một chữ cái của bảng chữ cái ,. và
kiến trúc cơ sở được đặt tên TÔI cho số nguyênKiến trúc cơ sở có một vài hướng
dẫn liên quan đến các bộ hướng dẫn phổ biến khác hiện nay; thật vậy, chương
này đã bao gồm gần như tất cả chúng. Phần này làm tròn kiến trúc cơ sở, sau đó
mô tả năm phần mở rộng tiêu chuẩn.
Hình 2.41 liệt kê các hướng dẫn còn lại trong kiến trúc RISC-V cơ sở. Hướng
dẫn đầu tiên , auipc, được sử dụng cho địa chỉ bộ nhớ tương đối PC. Giống như
lui lệnh, nó giữ hằng số 20 bit tương ứng với các bit 12 đến 31 của một số nguyên.
auipcHiệu ứng của máy tính là thêm số này vào PC và ghi tổng vào một thanh ghi.
Kết hợp với một hướng dẫn như thế nào addi, có thể giải quyết bất kỳ byte bộ
nhớ nào trong 4 GiB của PC. Tính năng này rất hữu ích cho độc lập với vị trí mã,
có thể thực thi chính xác bất kể nó được tải ở đâu trong bộ nhớ. Nó là thường
được sử dụng trong các thư viện liên kết động.
Bốn hướng dẫn tiếp theo so sánh hai số nguyên, sau đó viết kết quả Boolean
của so sánh với một thanh ghi. slt và sltu so sánh hai thanh ghi là các số đã ký và
không dấu, sau đó viết 1 vào một thanh ghi nếu giá trị đầu tiên nhỏ hơn giá trị thứ
hai hoặc 0 nếu không. slti và sltiu thực hiện các so sánh tương tự, nhưng với một
ngay lập tức cho toán hạng thứ hai.
Đó là nó cho kiến trúc cơ sở! Hình 2.42 liệt kê năm phần mở rộng tiêu chuẩn.
Đầu tiên, M, thêm hướng dẫn để nhân và chia số nguyên. Chương 3 sẽ giới thiệu
một số hướng dẫn trong phần mở rộng M.
Phần mở rộng thứ hai, A, hỗ trợ các hoạt động bộ nhớ nguyên tử để đồng bộ
hóa đa bộ xử lý. Tải dành riêng (lr.w) và điều kiện cửa hàng (sc.w) hướng dẫn
giới thiệu trong Mục 2.11 là thành viên của phần mở rộng A. 18 hướng dẫn còn
lại là tối ưu hóa đồng bộ hóa phổ biến
168 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

HÌNH 2.42 Kiến trúc tập lệnh RISC-V được chia thành ISA cơ sở, được đặt tên là I và năm
phần mở rộng tiêu chuẩn, M, A, F, D và C . RISC-V International đang phát triển nhiều thứ khác
mở rộng hướng dẫn tùy chọn. Không giống như hầu hết các kiến trúc, ngăn xếp phần mềm RISC-V chỉ giả
định kiến trúc cơ sở (I), với các tiện ích mở rộng khác tùy chọn chỉ được trình biên dịch phát hành nếu bộ
xử lý bao gồm các tùy chọn đó.

các mẫu, như trao đổi nguyên tử và bổ sung nguyên tử, nhưng không thêm bất kỳ
chức năng bổ sung nào vào điều kiện dự trữ tải và có điều kiện lưu trữ.
Phần mở rộng thứ ba và thứ tư, F và D, cung cấp các thao tác trên các số dấu
phẩy động, được mô tả trong Chương 3.
Phần mở rộng cuối cùng, C, không cung cấp chức năng mới nào cả. Thay vào
đó, nó cần các hướng dẫn RISC-V phổ biến nhất, như thế addivà cung cấp các
hướng dẫn tương đương chỉ dài 16 bit, thay vì 32. Do đó, nó cho phép các
chương trình được thể hiện bằng ít byte hơn, có thể giảm chi phí và, như chúng
ta sẽ thấy Chương 5, có thể cải thiện hiệu suất. Để phù hợp với 16 bit, các hướng
dẫn mới có các hạn chế đối với toán hạng của chúng: ví dụ: một số hướng dẫn
chỉ có thể truy cập vào một số trong 32 thanh ghi và các trường ngay lập tức hẹp
hơn.
Được kết hợp với nhau, cơ sở RISC-V và các phần mở rộng có 184 hướng dẫn,
cộng với 13 hướng dẫn hệ thống sẽ được giới thiệu vào cuối Chương 5.

2,21 Nhanh hơn: Ma trận nhân trong C

Chúng tôi bắt đầu bằng cách viết lại chương trình Python từ Mục 1.10.Hình 2.43
hiển thị một phiên bản của ma trận ma trận được viết nhân trong C. Chương trình
này thường được gọi DGEMM, viết tắt của Double-Precision Gyneral Matrix
Multiply. Bởi vì chúng ta đang chuyển kích thước ma trận làm tham số, phiên bản
DGEMM này sử dụng các phiên bản ma trận đơn chiều và số học địa chỉ để có
hiệu suất tốt hơn thay vì sử dụng các mảng hai chiều trực quan hơn mà chúng ta
thấy trong Python. Các ý kiến trong hình nhắc nhở chúng ta về ký hiệu trực quan
hơn này. Hình 2.44 hiển thị đầu ra ngôn ngữ lắp ráp x86 cho vòng lặp bên trong
của Hình 2.43Năm hướng dẫn dấu phẩy động bắt đầu bằng a và bao gồm trong
tên, viết tắt của độ chính xác kép vô hướng.
2.21 Nhanh hơn: Ma trận nhân trong C 169

1. void dgemm (int n, double * A, double * B, double * C)


2. {
3. cho (int i = 0; i <n; ++ i)
4. cho (int j = 0; j <n; ++ j)
5. {
6. đôi cij = C [i + j * n]; / * cij = C [i] [j] * /
7. cho (int k = 0; k <n; k ++)
8. cij + = A [i + k * n] * B [k + j * n]; / * cij + = A [i] [k] * B [k] [j] * /
9. C [i + j * n] = cij; / * C [i] [j] = cij * /
10. }
11. }

HÌNH 2.43 C phiên bản của ma trận hai độ chính xác nhân, được biết đến rộng rãi với tên DGEMM cho
phép nhân ma trận Genneral chính xác kép (GEMM).

1. vmovsd (% r10),% xmm0 # Tải 1 phần tử C vào% xmm0


di
2. chuyển % rsi,% rcx # đăng ký% RCx =% rsi
3. xor % thuế,% thuế # đăng ký% eax = 0
4. vmovsd (% RCx),% xmm1 # Tải 1 phần tử B vào% xmm1
5. thêm % r9,% RCx # đăng ký% RCx =% RCx +% r9
(% r8,% rax, 8),% xmm1,%
6. vmulsd xmm1 # Nhân% xmm1, phần tử của A
7. thêm $ 0x1,% rax # đăng ký% rax =% rax + 1
số 8. cmp % thuế,% edi # so sánh% eax với% edi
9. vaddsd % xmm1,% xmm0,% xmm0 # Thêm% xmm1,% xmm0
10. jg 30 <dgemm + 0x30> # nhảy nếu% eax>% edi
11. thêm $ 0x1,% r11 # đăng ký% r11 =% r11 + 1
12. vmovsd % xmm0, (% r10) # Lưu% xmm0 vào phần tử C

HÌNH 2.44 Ngôn ngữ lắp ráp x86 cho thân của các vòng lồng nhau được tạo bằng cách biên dịch mã C
không được tối ưu hóa trong Hình 2.43 sử dụng gcc với cờ tối ưu hóa -O3.
170 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

-O0 (nhanh nhất -O1 -O2 -O3 (chạy nhanh nhất


thời gian biên dịch) thời gian)
77 208 212 212

HÌNH 2,45 Tốc độ của DGEMM trong Hình 2.43 qua chương trình Python trong Mục 1.10
khi chúng tôi tăng mức tối ưu hóa.

Hình 2.45 cho thấy hiệu suất của chương trình C khi chúng tôi thay đổi tối ưu
hóa tham số so với chương trình Python. Ngay cả chương trình C không được tối
ưu hóa cũng nhanh hơn đáng kể. Khi chúng ta tăng mức tối ưu hóa, nó thậm chí
còn nhanh hơn; chi phí là thời gian biên dịch dài hơn. Các lý do cho việc tăng tốc
về cơ bản là sử dụng trình biên dịch thay vì trình thông dịch và vì các khai báo
loại của C cho phép trình biên dịch tạo ra mã hiệu quả hơn nhiều.

2.22 Ngụy biện và Cạm bẫy

Fallacy: Hướng dẫn mạnh mẽ hơn có nghĩa là hiệu suất cao hơn.
Một phần sức mạnh của Intel x86 là các tiền tố có thể sửa đổi việc thực thi lệnh
sau. Một tiền tố có thể lặp lại lệnh tiếp theo cho đến khi bộ đếm bước xuống 0.
Do đó, để di chuyển dữ liệu trong bộ nhớ, dường như trình tự lệnh tự nhiên là sử
dụng di chuyển với tiền tố lặp lại để thực hiện các động tác bộ nhớ đến bộ nhớ 32
bit.
Một phương pháp thay thế, sử dụng các hướng dẫn tiêu chuẩn được tìm thấy
trong tất cả các máy tính, là tải dữ liệu vào các thanh ghi và sau đó lưu các thanh
ghi trở lại bộ nhớ. Phiên bản thứ hai của chương trình này, với mã được sao chép
để giảm chi phí vòng lặp, sao chép nhanh gấp khoảng 1,5 lần. Phiên bản thứ ba,
sử dụng các thanh ghi dấu phẩy động lớn hơn thay vì các thanh ghi số nguyên của
x86, sao chép nhanh gấp khoảng 2,0 lần so với lệnh di chuyển phức tạp.
Fallacy: Viết bằng ngôn ngữ lắp ráp để có được hiệu suất cao nhất.
Tại một thời điểm trình biên dịch cho các ngôn ngữ lập trình tạo ra các chuỗi hướng
dẫn ngây thơ; độ tinh vi ngày càng tăng của trình biên dịch có nghĩa là khoảng cách giữa
mã được biên dịch và mã được tạo ra bằng tay đang đóng lại nhanh chóng. Trong thực tế,
để cạnh tranh với các trình biên dịch hiện tại, lập trình viên ngôn ngữ lắp ráp cần phải
hiểu các khái niệm trong Chương 4 và 5 kỹ lưỡng (bộ xử lý đường ống và phân cấp bộ
nhớ).
Cuộc chiến giữa các trình biên dịch và trình mã hóa ngôn ngữ lắp ráp là một
tình huống khác trong đó con người đang mất dần vị thế. Ví dụ, C cung cấp cho
lập trình viên cơ hội đưa ra gợi ý cho trình biên dịch về biến nào cần giữ trong các
thanh ghi so với tràn vào bộ nhớ. Khi trình biên dịch kém trong phân bổ đăng ký,
những gợi ý như vậy rất quan trọng đối với hiệu suất. Trong thực tế, một số sách
giáo khoa C cũ đã dành một lượng thời gian hợp lý để đưa ra các ví dụ sử dụng
hiệu quả các gợi ý đăng ký. Ngày nay, các trình biên dịch C C thường bỏ qua các
gợi ý này, bởi vì trình biên dịch thực hiện công việc phân bổ tốt hơn so với lập
trình viên.
2.22 Ngụy biện và Cạm bẫy 171

1500
1400
1300
1200
1100
1000
900
a Hướng dẫn

800
700
600
500
củ

400
300
Số

200
100
0
4 6
1978198019821984198619881990199219941996199820002002 200 200 2008201020122014 20162018
Năm

HÌNH 2.46 Tăng trưởng của hướng dẫn x86 theo thời gian. Trong khi có giá trị kỹ thuật rõ ràng
để một số tiện ích mở rộng này, sự thay đổi nhanh chóng này cũng làm tăng khó khăn cho các công ty khác
khi cố gắng xây dựng bộ xử lý tương thích.

Thậm chí nếu viết bằng tay dẫn đến mã nhanh hơn, sự nguy hiểm của việc viết
bằng ngôn ngữ lắp ráp là thời gian kéo dài dành cho mã hóa và gỡ lỗi, mất tính di
động và khó duy trì mã đó. Một trong số ít các tiên đề được chấp nhận rộng rãi của
kỹ thuật phần mềm là việc mã hóa mất nhiều thời gian hơn nếu bạn viết nhiều dòng
hơn và rõ ràng phải mất nhiều dòng hơn để viết một chương trình bằng ngôn ngữ lắp
ráp so với C hoặc Java. Hơn nữa, một khi nó được mã hóa, mối nguy hiểm tiếp theo
là nó sẽ trở thành một chương trình phổ biến. Các chương trình như vậy luôn tồn tại
lâu hơn dự kiến, có nghĩa là ai đó sẽ phải cập nhật mã trong nhiều năm và làm cho nó
hoạt động với các bản phát hành mới của hệ điều hành và máy tính gần đây. Viết
bằng ngôn ngữ cấp cao hơn thay vì ngôn ngữ lắp ráp không chỉ cho phép các trình
biên dịch trong tương lai điều chỉnh mã cho các máy sắp tới; nó cũng làm cho phần
mềm dễ bảo trì hơn và cho phép chương trình chạy trên nhiều kiến trúc tập lệnh hơn.

Fallacy: Tầm quan trọng của khả năng tương thích nhị phân thương mại có
nghĩa là các bộ hướng dẫn thành công không thay đổi.
Trong khi tương thích nhị phân ngược là bất khả xâm phạm , Hình 2.39 cho thấy
kiến trúc x86 đã phát triển vượt bậc. Trung bình là nhiều hơn một hướng dẫn mỗi
tháng trong vòng đời 40 năm của nó!
Pitfall: Quên rằng các địa chỉ từ tuần tự trong các máy có địa chỉ byte
không khác nhau bởi một.
172 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Nhiều lập trình viên ngôn ngữ lắp ráp đã xử lý các lỗi được thực hiện bằng cách giả
sử rằng địa chỉ của từ tiếp theo có thể được tìm thấy bằng cách tăng địa chỉ trong một
thanh ghi bằng một thay vì theo kích thước từ tính bằng byte. Cảnh báo trước được
báo trước!

Pitfall: Sử dụng một con trỏ tới một biến tự động bên ngoài quy trình xác định của
nó.

Một sai lầm phổ biến trong việc xử lý các con trỏ là chuyển kết quả từ một thủ tục
bao gồm một con trỏ tới một mảng cục bộ cho thủ tục đó. Theo kỷ luật ngăn xếp
trong Hình 2.12, bộ nhớ chứa mảng cục bộ sẽ được sử dụng lại ngay khi thủ tục trở
lại. Con trỏ đến các biến tự động có thể dẫn đến hỗn loạn.

Ít hơn là nhiều hơn.


2.23 Kết luận
Robert Browning ,
Andrea del Sarto, 1855 Hai nguyên tắc của chương trình lưu trữ máy tính là việc sử dụng các hướng dẫn
không thể phân biệt được với các số và việc sử dụng bộ nhớ có thể thay đổi cho
các chương trình. Những nguyên tắc này cho phép một cỗ máy duy nhất hỗ trợ
các nhà nghiên cứu ung thư, cố vấn tài chính và tiểu thuyết gia trong các chuyên
ngành của họ. Việc lựa chọn một bộ hướng dẫn mà máy có thể hiểu đòi hỏi sự
cân bằng tinh tế giữa số lượng hướng dẫn cần thiết để thực hiện chương trình, số
chu kỳ đồng hồ cần thiết theo hướng dẫn và tốc độ của đồng hồ. Như được minh
họa trong chương này, ba nguyên tắc thiết kế hướng dẫn các tác giả của các bộ
hướng dẫn trong việc thực hiện sự đánh đổi khó khăn đó :
1. Đơn giản ủng hộ sự đều đặn. Tính thường xuyên thúc đẩy nhiều tính năng
của RISC-V tập lệnh: giữ tất cả các hướng dẫn một kích thước duy nhất,
luôn yêu cầu toán hạng đăng ký trong các hướng dẫn số học và giữ các
trường đăng ký ở cùng một vị trí trong tất cả các định dạng lệnh.
2. Nhỏ hơn là nhanh hơn. Mong muốn về tốc độ là lý do mà RISC-V có 32
đăng ký chứ không phải nhiều hơn nữa.
3. Thiết kế tốt đòi hỏi sự thỏa hiệp tốt. Một ví dụ RISC-V là thỏa hiệp giữa
việc cung cấp các địa chỉ và hằng số lớn hơn trong các hướng dẫn và giữ
cho tất cả các hướng dẫn có cùng độ dài.
Một ý tưởng lớn khác trong chương này là con số không có loại vốn có. Một
mẫu bit đã cho có thể đại diện cho một số nguyên hoặc một chuỗi hoặc một màu
hoặc thậm chí một lệnh. Đây là chương trình xác định loại dữ liệu.
Chúng tôi cũng thấy ý tưởng tuyệt vời từ Chương 1 làm cho trường hợp phổ
biến nhanh áp dụng cho các bộ hướng dẫn cũng như kiến trúc máy tính. Các ví
dụ về việc làm cho trường hợp RISC-V phổ biến nhanh chóng bao gồm địa chỉ
tương đối PC cho các nhánh có điều kiện và địa chỉ ngay lập tức cho các toán
hạng không đổi lớn hơn.
Hình 2.47 liệt kê
các hướng dẫn
RISC-V mà
chúng tôi đã đề
cập cho đến nay.
2.23 Nhận xét kết luận 173

HÌNH 2.47 Bộ hướng dẫn RISC-V được bảo hiểm cho đến nay. Hình 2.1 cho thấy nhiều chi tiết hơn về
RISC-V kiến trúc được tiết lộ trong chương này. Thông tin được cung cấp ở đây cũng được tìm thấy trong Cột 1 và 2
của Thẻ dữ liệu tham chiếu RISC-V ở mặt trước của cuốn sách.

Trên cấp độ máy này là ngôn ngữ lắp ráp, một ngôn ngữ mà con người có thể
đọc. Trình biên dịch dịch nó thành các số nhị phân mà máy móc có thể hiểu được,
và thậm chí nó còn mở rộng tập lệnh bằng cách tạo các hướng dẫn tượng trưng
mà aren sắt trong phần cứng. Chẳng hạn, các hằng số hoặc địa chỉ quá lớn được
chia thành các phần có kích thước phù hợp, các biến thể phổ biến của hướng dẫn
được đặt tên riêng của chúng, v.v. Ẩn chi tiết từ cấp cao hơn là một ví dụ khác về
ý tưởng tuyệt vời trừu tượng.
174 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

HÌNH 2.48 Các lớp lệnh RISC-V, ví dụ, tương ứng với các cấu trúc ngôn ngữ chương trình cấp cao và
tỷ lệ phần trăm của các hướng dẫn RISC-V được thực hiện theo danh mục cho các điểm chuẩn
CPU2006 số nguyên và dấu phẩy động trung bình. Hình 3.24 trong Chương 3 chương trình tỷ lệ phần trăm
trung bình của cá nhân Hướng dẫn RISC-V được thực hiện.

Mỗi loại hướng dẫn RISC-V được liên kết với các cấu trúc xuất hiện trong các
ngôn ngữ lập trình :
n Hướng dẫn số học tương ứng với các phép toán được tìm thấy trong các
câu lệnh gán.
n Hướng dẫn truyền có nhiều khả năng xảy ra khi xử lý các cấu trúc dữ liệu
như mảng hoặc cấu trúc.
n Các nhánh có điều kiện được sử dụng trong nếu báo cáo và trong các vòng
lặp.
n Các nhánh vô điều kiện được sử dụng trong các cuộc gọi và trả về thủ tục
và cho trường hợp / công tắc tuyên bố.
Những hướng dẫn này không được sinh ra như nhau; sự phổ biến của một số ít
thống trị nhiều người. Ví dụ, Hình 2.48 cho thấy mức độ phổ biến của từng loại
hướng dẫn cho CPU2006. Sự phổ biến khác nhau của các hướng dẫn đóng một
vai trò quan trọng trong các chương về datapath, kiểm soát và đường ống.
Sau khi chúng tôi giải thích số học máy tính trong Chương 3, chúng tôi tiết lộ
thêm về kiến trúc tập lệnh RISC-V.

Quan điểm lịch sử và hơn thế nữa


2.24
Đọc hiểu

Phần này khảo sát lịch sử của kiến trúc hướng dẫn (ISAs) theo thời gian và
chúng tôi đưa ra một lịch sử ngắn về ngôn ngữ lập trình và trình biên dịch. ISA
bao gồm kiến trúc tích lũy, kiến trúc thanh ghi đa năng, kiến trúc ngăn xếp và
lịch sử ngắn gọn về kiến trúc x86 và ARM ARM 32 bit ,
2.24 Quan điểm lịch sử và đọc thêm 174.e1

2.24 Quan điểm lịch sử và hơn thế nữa


Đọc hiểu

Phần này khảo sát lịch sử của các kiến trúc tập lệnh theo thời gian và chúng tôi
đưa ra một lịch sử ngắn về các ngôn ngữ lập trình và trình biên dịch. ISA bao
gồm kiến trúc tích lũy, kiến trúc đăng ký đa năng, kiến trúc ngăn xếp và lịch sử
ngắn gọn của ARMv7 và x86. Chúng tôi cũng xem xét các chủ đề gây tranh cãi
của kiến trúc máy tính cấp cao và giảm kiến trúc máy tính tập lệnh. Lịch sử của
các ngôn ngữ lập trình bao gồm Fortran, Lisp, Algol, C, Cobol, Pascal, Simula,
Smalltalk, C ++ và Java, và lịch sử của các trình biên dịch bao gồm các mốc quan
trọng và những người tiên phong đã đạt được chúng.

Kiến trúc tích lũy


Phần cứng là quý giá trong các máy tính chương trình được lưu trữ sớm nhất. Do
đó, những người tiên phong trong máy tính không thể mua được số lượng thanh
ghi được tìm thấy trong các kiến trúc ngày nay. Trong thực tế, các kiến trúc này
đã có một thanh ghi duy nhất cho các hướng dẫn số học. Vì tất cả các hoạt động
sẽ tích lũy trong một thanh ghi, nó được gọi là tích lũyvà kiểu tập lệnh này được
đặt cùng tên. Ví dụ, EDSAC năm 1949 có một bộ tích lũy duy nhất. tích lũy Cổ xưa nhiệm
Định dạng ba toán tử của RISC-V cho thấy rằng một thanh ghi duy nhất có ít nhất kỳ cho đăng kýViệc sử
hai thanh ghi ngại các nhu cầu của chúng tôi. Có bộ tích lũy như cả một toán hạng dụng trực tuyến nó như
nguồn và đích đến của hoạt động lấp đầy một phần của sự thiếu hụt, nhưng nó vẫn để một từ đồng nghĩa với
Đăng ký trực tuyến là
lại cho chúng ta một điều khoản ngắn. Toán hạng cuối cùng được tìm thấy trong bộ một dấu hiệu khá đáng
nhớ. Kiến trúc tích lũy có chế độ địa chỉ toán hạng dựa trên bộ nhớ được đề xuất tin cậy cho thấy người
trước đó. Theo đó, hướng dẫn thêm của tập lệnh tích lũy sẽ giống như thế này : dùng đã ở đây khá lâu.

THÊM 200 Eric Raymond , Cái mới Từ


điển Hacker từ, 1991
Hướng dẫn này có nghĩa là thêm bộ tích lũy vào từ trong bộ nhớ tại địa chỉ 200 và
đặt tổng trở lại vào bộ tích lũy. Không có thanh ghi nào được chỉ định vì bộ tích lũy
được biết là cả nguồn và đích của hoạt động.
Bước tiếp theo trong quá trình phát triển các bộ hướng dẫn là bổ sung các
thanh ghi dành riêng cho các hoạt động cụ thể. Do đó, các thanh ghi có thể được
đưa vào để hoạt động như các chỉ số cho các tham chiếu mảng trong các hướng
dẫn truyền dữ liệu, để hoạt động như các bộ tích lũy riêng biệt để nhân hoặc chia
các hướng dẫn và để đóng vai trò là con trỏ đầu ngăn. Có lẽ ví dụ nổi tiếng nhất
về kiểu tập lệnh này được tìm thấy trong Intel 80x86. Kiểu này của bộ hướng dẫn
được dán nhãn tích lũy mở rộng, đăng ký chuyên dụng, hoặc là đăng ký mục đích
đặc biệtGiống như bộ tích lũy đơn đăng ký. kiến trúc, một toán hạng có thể nằm
trong bộ nhớ cho các hướng dẫn số học. Tuy nhiên, giống như kiến trúc RISC-V,
cũng có những hướng dẫn trong đó tất cả các toán hạng là các thanh ghi.
174.e2 2.24 Quan điểm lịch sử và đọc thêm

Kiến trúc đăng ký mục đích chung


Việc khái quát hóa kiến trúc đăng ký chuyên dụng cho phép tất cả các thanh ghi
được sử dụng cho bất kỳ mục đích nào, do đó có tên đăng ký mục đích chung
RISC-V là một ví dụ về kiến trúc đăng ký đa năng. Kiểu tập lệnh này có thể được
chia thành các tập lệnh cho phép một toán hạng trong bộ nhớ (như được tìm thấy
trong các kiến trúc tích lũy), được gọi là a. đăng ký bộ nhớ kiến trúc và những thứ
kiến trúc cửa đòi hỏi các toán hạng luôn có trong các thanh ghi, được gọi là a cửa hàng tải
hàng tải Cũng thế hoặc a đăng ký kiến trúc. Hình e2.24.1 cho thấy một lịch sử về số lượng thanh
gọi đăng ký- ghi trong một số máy tính phổ biến.
đăng ký kiến trúc. Kiến trúc cửa hàng tải đầu tiên là CDC 6600 vào năm 1963, được nhiều người
Một kiến trúc tập lệnh
trong đó tất cả các thao coi là siêu máy tính đầu tiên. RISC-V, ARMv7, ARMv8 và MIPS là những ví dụ
tác nằm giữa các thanh gần đây hơn về kiến trúc cửa hàng tải.
ghi và bộ nhớ dữ liệu
chỉ có thể được truy
cập thông qua tải hoặc Số lượng
lưu trữ. Máy móc đăng ký mục đích chung Phong cách kiến trúc Năm
EDSAC 1 Tích lũy 1949
IBM 701 1 Tích lũy 1953
CDC 6600 số 8 Cửa hàng tải 1963
IBM 360 16 Đăng ký bộ nhớ 1964
Năm
DEC PDP-8 1 Tích lũy 1965
DEC PDP-11 số 8 Đăng ký bộ nhớ 1970
Năm
Intel 8008 1 Tích lũy 1972
Motorola 6800 2 Tích lũy 1974
VAX DEC 16 Đăng ký bộ nhớ, bộ nhớ bộ nhớ 1977
Intel 8086 1 Tích lũy mở rộng 1978
Motorola 68000 16 Đăng ký bộ nhớ 1980
Intel 80386 số 8 Đăng ký bộ nhớ 1985
ARM 16 Cửa hàng tải 1985
MIPS 32 Cửa hàng tải 1985
HP PA-RISC 32 Cửa hàng tải 1986
SPARC 32 Cửa hàng tải 1987
PowerPC 32 Cửa hàng tải 1992
Alpha Alpha 32 Cửa hàng tải 1992
HP / Intel IA-64 128 Cửa hàng tải 2001
AMD64 (EMT64) 16 Đăng ký bộ nhớ 2003
RISC-V 32 Cửa hàng tải 2010
RISC-V 16 Ký ức thường xuyên 2010

HÌNH e2.24.1 Số lượng thanh ghi đa năng trong các kiến trúc phổ biến trong những năm
qua.

80386 là nỗ lực của Intel để biến 8086 thành tập lệnh bộ nhớ đăng ký đa năng.
Có lẽ bộ hướng dẫn bộ nhớ đăng ký nổi tiếng nhất là kiến trúc IBM 360, được
công bố lần đầu tiên vào năm 1964. Điều này
2.24 Quan điểm lịch sử và đọc thêm 174.e3

tập lệnh vẫn là cốt lõi của các máy tính lớn của IBM, vẫn chịu trách nhiệm cho
10 tỷ đô la mỗi năm doanh thu hàng năm. Kiến trúc bộ nhớ đăng ký là phổ biến
nhất trong những năm 1960 và nửa đầu những năm 1970.
Tập đoàn thiết bị kỹ thuật số Kiến trúc VAX đã đưa bộ nhớ hoạt động thêm
một bước nữa vào năm 1977. Nó cho phép một hướng dẫn sử dụng bất kỳ sự kết
hợp nào của các thanh ghi và toán hạng bộ nhớ. Một phong cách kiến trúc trong
đó tất cả các toán hạng có thể có trong bộ nhớ được gọi bộ nhớ(Trong thực tế,
tập lệnh VAX, giống như hầu hết các bộ hướng dẫn khác kể từ IBM 360, là một
phép lai, vì nó cũng có các thanh ghi mục đích chung.).
Intel x86 có nhiều phiên bản bổ sung 64 bit để chỉ định xem một toán hạng có
trong bộ nhớ hay nằm trong một thanh ghi. Ngoài ra, toán hạng bộ nhớ có thể được
truy cập với hơn bảy chế độ địa chỉ. Sự kết hợp giữa các chế độ địa chỉ và toán hạng
bộ nhớ đăng ký có nghĩa là có hàng tá biến thể của một hướng dẫn thêm x86. Rõ ràng,
sự biến đổi này làm cho việc triển khai x86 trở nên khó khăn hơn.

Mã nhỏ gọn và Kiến trúc ngăn xếp


Khi bộ nhớ khan hiếm, điều quan trọng là phải giữ các chương trình nhỏ, vì vậy các
kiến trúc như Intel x86, IBM 360 và VAX có các hướng dẫn có độ dài thay đổi, cả
hai đều phù hợp với các thông số kỹ thuật toán hạng khác nhau và để giảm thiểu kích
thước mã. Hướng dẫn Intel x86 dài từ 1 đến 15 byte; Hướng dẫn IBM 360 dài 2, 4
hoặc 6 byte; và độ dài lệnh VAX là bất cứ nơi nào từ 1 đến 54 byte.
Một nơi mà kích thước mã vẫn còn quan trọng là các ứng dụng nhúng. Để
nhận ra nhu cầu này, ARM, MIPS và RISC-V đều đã tạo ra các phiên bản của bộ
hướng dẫn của họ cung cấp cả định dạng hướng dẫn 16 bit và định dạng lệnh 32
bit: Thumb và Thumb-2 cho ARM, MIPS -16 và RISC -V nén. Mặc dù chỉ giới
hạn ở hai kích cỡ, các chương trình nén Thumb, Thumb-2, MIPS-16 và RISC-V
nhỏ hơn khoảng 25% đến 30%, khiến kích thước mã của chúng nhỏ hơn so với
80x86. Kích thước mã nhỏ hơn có thêm lợi ích của việc cải thiện tỷ lệ truy cập
bộ đệm lệnh (xem Chương 5).
Trong những năm 1960, một vài công ty đã theo một cách tiếp cận triệt để cho
các bộ hướng dẫn. Với niềm tin rằng quá khó để các trình biên dịch sử dụng các
thanh ghi một cách hiệu quả, các công ty này đã từ bỏ các thanh ghi hoàn toàn!
Bộ hướng dẫn được dựa trên a mô hình ngăn xếp thực hiện, giống như được tìm
thấy trong thiết bị cầm tay Hewlett-Packard cũ máy tính. Các toán tử được đẩy
trên ngăn xếp từ bộ nhớ hoặc bật ra khỏi ngăn xếp vào bộ nhớ. Các thao tác lấy
toán hạng của chúng từ ngăn xếp và sau đó đặt kết quả trở lại ngăn xếp. Ngoài
việc đơn giản hóa các trình biên dịch bằng cách loại bỏ phân bổ thanh ghi, các
kiến trúc ngăn xếp cho phép mã hóa lệnh nhỏ gọn, do đó loại bỏ kích thước bộ
nhớ như một cái cớ để không lập trình bằng các ngôn ngữ cấp cao.
Không gian bộ nhớ được coi là quý giá một lần nữa đối với Java, vì cả không
gian bộ nhớ bị giới hạn để giữ chi phí thấp trong các ứng dụng nhúng và vì các
chương trình có thể được tải xuống qua Internet hoặc các đường dây điện thoại
dưới dạng applet Java và các chương trình nhỏ hơn mất ít thời gian hơn để truyền.
Do đó, mã hóa lệnh nhỏ gọn là mong muốn đối với mã byte Java.
174.e4 2.24 Quan điểm lịch sử và đọc thêm

Kiến trúc máy tính cấp cao


Vào những năm 1960, phần mềm hệ thống hiếm khi được viết bằng các ngôn ngữ
cấp cao. Ví dụ, hầu như mọi hệ điều hành thương mại trước UNIX đều được lập trình
bằng ngôn ngữ lắp ráp và gần đây, ngay cả OS / 2 ban đầu cũng được lập trình ở mức
thấp đó. Một số người đổ lỗi cho mật độ mã của các bộ hướng dẫn, thay vì ngôn ngữ
lập trình và công nghệ trình biên dịch.
Do đó, một triết lý thiết kế kiến trúc được gọi là máy tính ngôn ngữ cao kiến
trúc đã được ủng hộ, với mục tiêu làm cho phần cứng giống như hơn ngôn ngữ
lập trình. Các ngôn ngữ lập trình và trình biên dịch hiệu quả hơn, cộng với việc
mở rộng bộ nhớ, đã làm cho phong trào này trở thành một chú thích lịch sử.
Burroughs B5000 là tiền đề thương mại của triết lý này, nhưng ngày nay không
có hậu duệ thương mại quan trọng nào của gốc tự do những năm 1960 này.

Giảm hướng dẫn thiết lập kiến trúc máy tính


Triết lý thiết kế định hướng ngôn ngữ này đã được thay thế vào những năm 1980
bởi RISC (giảm hướng dẫn đặt máy tính). Những cải tiến trong ngôn ngữ lập
trình, công nghệ trình biên dịch và chi phí bộ nhớ có nghĩa là việc lập trình ít hơn
được thực hiện ở cấp độ lắp ráp, do đó, các bộ hướng dẫn có thể được đo lường
bằng cách sử dụng chúng tốt như thế nào, trái ngược với cách các lập trình viên
ngôn ngữ lắp ráp khéo léo sử dụng chúng.
Hầu như tất cả các bộ hướng dẫn mới kể từ năm 1982 đã tuân theo triết lý RISC
này về độ dài lệnh cố định, bộ hướng dẫn lưu trữ tải, chế độ địa chỉ giới hạn và các
hoạt động hạn chế. ARMv7, ARMv8, ARC, Hitachi SH, IBM PowerPC, MIPS, và,
tất nhiên, RISC-V, đều là những ví dụ về kiến trúc RISC.

Lịch sử tóm tắt của ARMv7


ARM bắt đầu làm bộ xử lý cho máy tính Acorn, do đó tên ban đầu của Acorn
RISC Machine. Các bài báo RISC Berkeley ảnh hưởng đến kiến trúc của nó.
Một trong những ứng dụng ban đầu quan trọng nhất là mô phỏng AM 6502, bộ
vi xử lý 16 bit. Mô phỏng này là để cung cấp hầu hết các phần mềm cho máy tính
Acorn. Vì 6502 có tập lệnh có độ dài thay đổi, nhiều byte, mô phỏng 6502 giúp
giải thích sự nhấn mạnh vào việc dịch chuyển và che lấp trong tập lệnh ARMv7.
Sự phổ biến của nó như là một máy tính nhúng công suất thấp bắt đầu với việc
lựa chọn làm bộ xử lý cho trợ lý kỹ thuật số cá nhân xấu số Apple Newton. Mặc
dù Newton không phổ biến như Apple hy vọng, nhưng phước lành của Apple đã
mang lại khả năng hiển thị cho các bộ hướng dẫn ARM trước đó và sau đó họ đã
bắt gặp ở một số thị trường, bao gồm cả điện thoại di động. Không giống như trải
nghiệm của Newton, thành công phi thường của điện thoại di động giải thích tại
sao 100 tỷ bộ xử lý ARM được vận chuyển từ năm 1999 đến 2016.
Một trong những sự kiện chính trong lịch sử ARM ARM là phần mở rộng địa
chỉ 64 bit được gọi là phiên bản 8. ARM đã nhân cơ hội thiết kế lại bộ hướng dẫn
để làm cho nó trông giống MIPS hơn nhiều so với các phiên bản ARM trước đó.
2.24 Quan điểm lịch sử và đọc thêm 174.e5

Lịch sử tóm tắt của x86


Tổ tiên của x86 là bộ vi xử lý đầu tiên, được sản xuất bắt đầu từ năm 1972. Intel
4004 và 8008 là những kiến trúc kiểu tích lũy 4 bit và 8 bit cực kỳ đơn giản.
Morse và cộng sự. [1980] mô tả sự phát triển của 8086 từ 8080 vào cuối những
năm 1970 như một nỗ lực để cung cấp kiến trúc 16 bit với thông lượng tốt hơn.
Vào thời điểm đó, hầu hết tất cả các chương trình cho bộ vi xử lý được thực hiện
bằng ngôn ngữ lắp ráp, cả bộ nhớ và bộ biên dịch đều bị thiếu. Intel muốn giữ cơ
sở 8080 người dùng của mình, vì vậy 8086 được thiết kế để tương thích với các
phiên bản 8080. 8086 là không bao giờ mã đối tượng tương thích với 8080,
nhưng các kiến trúc đủ gần để dịch các chương trình ngôn ngữ lắp ráp có thể
được thực hiện tự động.
Đầu năm 1980, IBM đã chọn một phiên bản 8086 với bus ngoài 8 bit, được gọi
là 8088, để sử dụng trong PC của IBM. Họ đã chọn phiên bản 8 bit để giảm chi
phí kiến trúc. Sự lựa chọn này, cùng với thành công to lớn của IBM PC, đã làm
cho kiến trúc 8086 trở nên phổ biến trong thời đại PC. Thành công của IBM PC
một phần là do IBM đã mở kiến trúc của PC và cho phép ngành công nghiệp PC
nhân bản phát triển. Như đã thảo luận trong Mục 2.18, 80286, 80386, 80486,
Pentium, Pentium Pro, Pentium II, Pentium III, Pentium 4 và AMD64 đã mở rộng
kiến trúc và cung cấp một loạt các cải tiến hiệu suất.
Mặc dù 68000 được chọn cho Macintosh, Mac không bao giờ phổ biến như
PC, một phần vì Apple không cho phép nhân bản Mac dựa trên 68000 và 68000
không có được phần mềm tương tự như 8086 thích. Motorola 68000 có thể có ý
nghĩa hơn về mặt kỹ thuật so với 8086, nhưng tác động của chiến lược lựa chọn
và kiến trúc mở của IBM đã chi phối các lợi thế kỹ thuật của 68000 trên thị
trường.
Một số ý kiến cho rằng sự không phù hợp của bộ hướng dẫn x86 là không thể
tránh khỏi, mức giá phải trả cho sự thành công tràn lan của bất kỳ kiến trúc nào.
Chúng tôi bác bỏ quan niệm đó. Rõ ràng, không có kiến trúc thành công nào có
thể loại bỏ các tính năng đã được thêm vào trong các triển khai trước đó và theo
thời gian, một số tính năng có thể được xem là không mong muốn. Sự lúng túng
của x86 bắt đầu từ cốt lõi của nó với tập lệnh 8086 và bị làm trầm trọng thêm bởi
các mở rộng không nhất quán về mặt kiến trúc được tìm thấy trong 8087, 80286,
80386, MMX, SSE, SSE2, SSE3, SSE4, AMD64 (EM64T) và AVX .
Một ví dụ là kiến trúc IBM 360/370, cũ hơn nhiều so với x86. Nó thống trị thị
trường máy tính lớn giống như x86 thống trị thị trường PC. Do chắc chắn là có
cơ sở tốt hơn và các cải tiến tương thích hơn, bộ hướng dẫn này có ý nghĩa hơn
nhiều so với x86 55 năm sau lần thực hiện đầu tiên.
Mở rộng địa chỉ x86 đến 64 bit có nghĩa là kiến trúc có thể tồn tại trong vài
thập kỷ nữa. Các nhà nhân chủng học của tương lai sẽ bóc lớp này sang lớp khác
từ các kiến trúc như vậy cho đến khi họ phát hiện ra các cổ vật từ bộ vi xử lý đầu
tiên. Đưa ra một phát hiện như vậy, làm thế nào họ sẽ đánh giá kiến trúc máy tính
ngày hôm nay?
174.e6 2.24 Quan điểm lịch sử và đọc thêm

Lịch sử tóm tắt về ngôn ngữ lập trình


Năm 1954, John Backus đã lãnh đạo một nhóm tại IBM để tạo ra một ký hiệu tự
nhiên hơn cho lập trình khoa học. Mục tiêu của Fortran, đối với FORmula
TRANslator, đã giảm thời gian phát triển các chương trình. Fortran bao gồm
nhiều ý tưởng được tìm thấy trong các ngôn ngữ lập trình ngày nay, bao gồm các
câu lệnh gán, biểu thức, biến được gõ, vòng lặp và mảng. Sự phát triển của ngôn
ngữ và trình biên dịch đi đôi với nhau. Ngôn ngữ này đã trở thành một tiêu chuẩn
đã phát triển theo thời gian để cải thiện năng suất lập trình viên và tính di động
của chương trình. Các bước tiến hóa là Fortran I, II, IV, 77, 90, 95, 2003, 2008 và
2018.
Fortran được phát triển cho máy tính thương mại thứ hai của IBM, 704, cũng
là cái nôi của một ngôn ngữ lập trình quan trọng khác: Lisp. John McCarthy đã
phát minh ra ngôn ngữ LISt Xử lý ngôn ngữ vào năm 1958. Câu thần chú của nó
là lập trình có thể được coi là thao tác danh sách, vì vậy ngôn ngữ chứa các hoạt
động để theo liên kết và soạn danh sách mới từ các danh sách cũ. Ký hiệu danh
sách này được sử dụng cho mã cũng như dữ liệu, vì vậy việc sửa đổi hoặc soạn
thảo các chương trình Lisp là phổ biến. Đóng góp lớn là cấu trúc dữ liệu động và
do đó, con trỏ. Cho rằng nhà phát minh của nó là người tiên phong trong trí tuệ
nhân tạo, Lisp trở nên phổ biến trong cộng đồng AI. Lisp không có khai báo loại
và Lisp thường tự động lấy lại lưu trữ thông qua bộ sưu tập rác tích hợp. Lisp ban
đầu được giải thích, mặc dù các trình biên dịch sau đó đã được phát triển cho nó.
Fortran đã truyền cảm hứng cho cộng đồng quốc tế phát minh ra một ngôn ngữ lập
trình tự nhiên hơn để thể hiện các thuật toán so với Fortran, ít chú trọng đến mã hóa. Ngôn
ngữ này đã trở thành Algol, cho ngôn ngữ ALGOrithmic.Giống như Fortran, nó bao gồm
các khai báo kiểu, nhưng nó đã thêm các cuộc gọi thủ tục đệ quy, lồng nhau nếu-sau đó-
khác tuyên bố, trong khi vòng lặp, bắt đầu câu lệnh để cấu trúc mã và tên gọi. Algol-60
trở thành ngôn ngữ cổ điển cho các học giả để dạy lập trình trong những năm 1960.
Mặc dù các kỹ sư, nhà nghiên cứu AI và nhà khoa học máy tính có ngôn ngữ lập
trình riêng, nhưng điều tương tự không thể nói cho việc xử lý dữ liệu kinh doanh.
Cobol, đối với ngôn ngữ định hướng kinh doanh của COmmon, đã được phát triển
như một tiêu chuẩn cho mục đích này đương đại với Algol-60. Cobol được tạo ra để
dễ đọc, vì vậy nó tuân theo từ vựng và dấu câu tiếng Anh. Nó đã thêm các bản ghi
vào các ngôn ngữ lập trình và tách mô tả dữ liệu khỏi mô tả mã.
Niklaus Wirth là thành viên của ủy ban Algol-68, được cho là sẽ cập nhật
Algol-60. Anh ta bị làm phiền bởi sự phức tạp của kết quả, và vì vậy anh ta đã
viết một báo cáo thiểu số để cho thấy rằng một ngôn ngữ lập trình có thể kết hợp
sức mạnh thuật toán của Algol-60 với cấu trúc bản ghi từ Cobol và đơn giản để
hiểu, dễ thực hiện, nhưng vẫn mạnh mẽ. Báo cáo thiểu số này đã trở thành Pascal.
Nó lần đầu tiên được thực hiện với một thông dịch viên và một bộ mã byte Pascal.
Sự dễ dàng thực hiện đã dẫn đến việc nó được triển khai rộng rãi, nhiều hơn
Algol-68, và nó đã sớm thay thế Algol-60 trở thành ngôn ngữ phổ biến nhất cho
các học giả để dạy lập trình.
Trong cùng thời gian, Dennis Ritchie đã phát minh ra ngôn ngữ lập trình C để sử dụng
trong việc xây dựng UNIX. Các nhà phát minh của nó nói rằng đó không phải là ngôn
ngữ lập trình cấp độ rất cao của người Viking hay ngôn ngữ lớn và nó không nhằm vào
một ứng dụng cụ thể. Với nơi sinh của nó, nó đã được
2.24 Quan điểm lịch sử và đọc thêm 174.e7

rất giỏi trong việc lập trình hệ thống, và hệ điều hành UNIX và trình biên dịch C
được viết bằng C. UNIX, mức độ phổ biến đã giúp thúc đẩy sự phổ biến của C.
Khái niệm định hướng đối tượng lần đầu tiên được nắm bắt trong Simula-67, một
ngôn ngữ mô phỏng kế tiếp Algol-60. Được phát minh bởi Ole-Johan Dahl và Kristen
Nygaard tại Đại học Oslo năm 1967, nó đã giới thiệu các đối tượng, lớp học và thừa
kế.
Định hướng đối tượng đã được chứng minh là một ý tưởng mạnh mẽ. Nó đã khiến
Alan Kay và những người khác tại Trung tâm nghiên cứu Xerox Palo Alto phát minh
ra Smalltalk vào những năm 1970. Smalltalk-80 kết hôn với các biến số không loại và
bộ sưu tập rác từ Lisp và hướng đối tượng của Simula-67. Nó dựa vào sự giải thích
được xác định bởi một máy ảo Smalltalk với bộ hướng dẫn mã byte Smalltalk. Kay
và các đồng nghiệp của ông lập luận rằng các bộ xử lý đang trở nên nhanh hơn và
cuối cùng chúng ta phải sẵn sàng hy sinh một số hiệu suất để cải thiện sự phát triển
của chương trình. Một ví dụ khác là CLU, đã chứng minh rằng một ngôn ngữ hướng
đối tượng có thể được xác định cho phép kiểm tra loại thời gian biên dịch. Simula-67
cũng đã truyền cảm hứng cho Bjarne Stroustrup của Bell Labs để phát triển một
phiên bản C hướng đối tượng có tên C ++ vào những năm 1980. C ++ được sử dụng
rộng rãi trong công nghiệp.
Không hài lòng với C ++, một nhóm tại Sun do James Gosling dẫn đầu đã phát
minh ra Oak vào đầu những năm 1990. Nó được phát minh dưới dạng phương ngữ C
hướng đối tượng cho các thiết bị nhúng như một phần của dự án Mặt trời lớn. Để làm
cho nó di động, nó đã được giải thích và có bộ hướng dẫn mã nguồn và máy ảo riêng.
Vì nó là một ngôn ngữ mới, nó có thiết kế hướng đối tượng thanh lịch hơn C ++ và
dễ học và biên dịch hơn nhiều so với Smalltalk-80. Vì dự án nhúng Sun Sun thất bại,
chúng tôi có thể chưa bao giờ nghe nói về nó nếu ai đó không tạo được kết nối giữa
Oak và các trình duyệt có thể lập trình cho World Wide Web. Nó đã được đặt lại
Java và vào năm 1995, Netscape tuyên bố rằng nó sẽ được vận chuyển với trình
duyệt của nó. Nó sớm trở nên cực kỳ phổ biến. Java có sự khác biệt hiếm có là trở
thành ngôn ngữ tiêu chuẩn cho các ứng dụng xử lý dữ liệu kinh doanh mới và ngôn
ngữ ưa thích cho các học giả để dạy lập trình. Java và các ngôn ngữ giống như nó
khuyến khích sử dụng lại mã, và do đó các lập trình viên sử dụng nhiều thư viện,
trong khi trước đây họ có nhiều khả năng viết mọi thứ từ đầu.
Một số người trong phần lịch sử này đã giành được giải thưởng ACM A. M.
Turing, ít nhất là một phần vì những đóng góp của họ cho các ngôn ngữ lập trình:
John Backus (1977), John McCarthy (1971), Niklaus Wirth (1984), Dennis
Ritchie (1983), Ole-Johan Dahl và Kristen Nygaard (2) và Alan Key.

Một lịch sử ngắn gọn của trình biên dịch


Backus và nhóm của ông đã rất lo ngại rằng Fortran sẽ không thành công nếu
những người hoài nghi tìm thấy các ví dụ trong đó phiên bản Fortran chạy với tốc
độ bằng một nửa chương trình ngôn ngữ lắp ráp tương đương. Thành công của họ
với một trong những trình biên dịch đầu tiên đã tạo ra một bãi biển mà nhiều
người khác theo dõi.
Trình biên dịch sớm là các chương trình đặc biệt thực hiện các bước được mô tả
trong Mục 2.15 trực tuyến. Những cách tiếp cận ad hoc đã được thay thế bằng một lý
thuyết vững chắc nền tảng cho từng bước này. Mỗi khi lý thuyết được thiết lập, một
công cụ được xây dựng dựa trên lý thuyết đó đã tự động tạo ra bước đó.
174.e8 2.24 Quan điểm lịch sử và đọc thêm

Nguồn gốc lý thuyết của việc quét và phân tích cú pháp bắt nguồn từ lý thuyết
automata và mối quan hệ giữa các ngôn ngữ và automata đã được biết đến sớm.
Nhiệm vụ quét tương ứng với việc nhận dạng ngôn ngữ được chấp nhận bởi
automata trạng thái hữu hạn và phân tích cú pháp tương ứng với việc nhận dạng ngôn
ngữ bằng automata đẩy xuống (về cơ bản là automata có ngăn xếp). Ngôn ngữ được
mô tả bằng ngữ pháp, là một bộ quy tắc cho biết làm thế nào bất kỳ chương trình
pháp lý nào có thể được tạo ra.
Việc quét qua trình biên dịch đã được hiểu rõ từ sớm, nhưng phân tích cú pháp
khó hơn. Các phân tích cú pháp sớm nhất sử dụng các kỹ thuật ưu tiên, xuất phát
từ cấu trúc của các câu lệnh số học, và sau đó được khái quát hóa. Bước đột phá
lớn trong phân tích cú pháp hiện đại đã được Donald Knuth tạo ra trong việc phát
minh ra phương pháp phân tích cú pháp LR, mã hóa hai bước chính trong kỹ
thuật phân tích cú pháp, đẩy mã thông báo trên ngăn xếp hoặc giảm một bộ mã
thông báo trên ngăn xếp bằng quy tắc ngữ pháp. Công thức lý thuyết mạnh mẽ để
quét và phân tích cú pháp đã dẫn đến sự phát triển của các công cụ tự động cho
các công trình biên dịch, chẳng hạn như lex và yacc, các công cụ được phát triển
như một phần của UNIX .
Tối ưu hóa xảy ra trong nhiều trình biên dịch, và khó xác định các ví dụ đầu
tiên trong hầu hết các trường hợp. Tuy nhiên, Victor Vyssotsky đã làm những bài
báo đầu tiên về phân tích luồng dữ liệu vào năm 1963 và William McKeeman
thường được ghi nhận với trình tối ưu hóa peephole đầu tiên vào năm 1965.
Nhóm tại IBM, bao gồm John Cocke và Fran Allan, đã phát triển nhiều khái niệm
tối ưu hóa sớm, cũng như xác định và mở rộng các khái niệm phân tích dòng chảy.
Những đóng góp quan trọng cũng được thực hiện bởi Al Aho và Jeff Ullman.
Một trong những thách thức lớn nhất để tối ưu hóa là phân bổ đăng ký. Thật
khó khăn khi một số kiến trúc sư đã sử dụng kiến trúc ngăn xếp chỉ để tránh vấn
đề. Bước đột phá đến khi các nhà nghiên cứu làm việc trên các trình biên dịch
cho 801, một kiến trúc RISC ban đầu, nhận ra rằng tô màu một biểu đồ với số
lượng màu tối thiểu tương đương với việc phân bổ số lượng thanh ghi cố định
cho số lượng thanh ghi ảo không giới hạn được sử dụng ở dạng trung gian.
Trình biên dịch cũng đóng một vai trò quan trọng trong phong trào nguồn mở.
Nhiệm vụ tự bổ nhiệm của Richard Stallman, là tạo ra một phiên bản miền công cộng
của UNIX. Ông đã xây dựng Trình biên dịch GNU C (gccnc) như một trình biên dịch
nguồn mở vào năm 1987. Nó sớm được chuyển đến nhiều kiến trúc, và được sử dụng
trong nhiều hệ thống ngày nay.

Đọc thêm
Bayko, J. [1996]. Bộ vi xử lý tuyệt vời của quá khứ và hiện tại, tìm kiếm nó trên http://www.cpushack.
com / CPU / cpu.html.
Một cái nhìn cá nhân về lịch sử của cả bộ vi xử lý đại diện và bộ vi xử lý bất thường, từ Intel 4004 đến
Patriot Science ShBoom!
Kane, G. và J. Heinrich [1992]. Kiến trúc MIPS RISC, Hội trường Prentice, Vách đá Englewood, NJ .
Cuốn sách này mô tả kiến trúc MIPS chi tiết hơn Phụ lục A.
Levy, H. và R. Eckhouse [1989]. Lập trình và kiến trúc máy tính, VAX, Báo chí kỹ thuật số, Boston.
Cuốn sách này tập trung vào VAX, nhưng cũng bao gồm các mô tả về Intel 8086, IBM 360 và CDC 6600.
2.24 Quan điểm lịch sử và đọc thêm 174,e9

Morse, S., B. Ravenal, S. Mazor và W. Pohlman [1980]. Bộ vi xử lý Intel Intel 8080 đến 8086 , Máy vi
tính 13 10 (Tháng Mười).
Lịch sử kiến trúc của Intel từ năm 4004 đến 8086, theo những người tham gia thiết kế.
Wakerly, J. [1989]. Kiến trúc và lập trình máy vi tính, Wiley, New York.
Motorola 6800 là trọng tâm chính của cuốn sách, nhưng nó bao gồm Intel 8086, Motorola 6809, TI 9900
và Zilog Z8000.
2.25 Tự học 175

ARMv7. Chúng tôi cũng xem xét các chủ đề gây tranh cãi của kiến trúc máy tính
cấp cao và giảm kiến trúc máy tính tập lệnh. Lịch sử của các ngôn ngữ lập trình
bao gồm Fortran, Lisp, Algol, C, Cobol, Pascal, Simula, Smalltalk, C ++ và Java,
và lịch sử của các trình biên dịch bao gồm các mốc quan trọng và những người
tiên phong đã đạt được chúng. Phần còn lại của Mục 2.24 là tìm thấy trực
tuyến.

2.25 Tự học
Hướng dẫn làm số. Cho số nhị phân này :
0000000101001011001000000000011hai
Nó là gì ở định dạng thập lục phân?
Giả sử nó là một số chưa ký, nó là số thập phân?
Giá trị có thay đổi nếu nó được coi là một số đã ký?
Chương trình ngôn ngữ lắp ráp nào nó đại diện?

Hướng dẫn như số và không an toànMặc dù các chương trình chỉ là những
con số. trong bộ nhớ , Chương 5 chỉ ra cách báo cho máy tính cách bảo vệ
chương trình khỏi bị sửa đổi bằng cách dán nhãn một phần không gian địa chỉ là
chỉ đọc. Những kẻ tấn công thông minh khai thác các lỗi trong các chương trình
C để tuy nhiên chèn mã của chính họ trong khi thực hiện chương trình mặc dù
chương trình được bảo vệ.
Dưới đây là một chương trình sao chép chuỗi đơn giản sao chép những gì
người dùng nhập vào một biến cục bộ trên ngăn xếp.
#include <string.h>

void copyinput (char * input)


{
char bản sao [10];

strcpy (sao chép, đầu vào); // không có giới hạn kiểm tra trong
strcpy
}

int main (int argc, char ** argv)


{
copyinput (argv [1]);

trả về 0;
}

Điều gì xảy ra nếu người dùng viết nhiều hơn 10 ký tự làm đầu vào? Điều gì
có thể là hậu quả để thực hiện chương trình? Làm thế nào điều này có thể để một
kẻ tấn công tiếp quản thực hiện chương trình?
176 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Trong khi nhanh hơnDưới đây là mã RISC-V cho C trong khi lặp từ các
trang. 92-93 :
Vòng lặp:

// đi đến Lối ra nếu lưu [i] ¹ k

Lối ra:

Giả sử vòng lặp thường thực hiện 10 lần. Làm cho vòng lặp nhanh hơn bằng
cách thực hiện trung bình một lệnh nhánh trên mỗi vòng lặp thay vì cả một bước
nhảy và một lệnh nhánh.
AnticompilerDưới đây là một phần của ngôn ngữ lắp ráp MIPS với các bình
luận. cho năm hướng dẫn đầu tiên :
ix5
sll , x18, 2 # x5 = f * 4
thê = & A
m x5 , x23, x5 # x5 [f]
ix6
sll , x19, 2
# x6 = g * 4
thê = & B
m x6 , x24, x6 # x6 [g]
x18 0
lw , (x5) # f = A [f]
addi x7 , x5 4 #
lw x5 , 0 (x7) #
thê
m x5 , x5, x18 #
sw x5 , 0 (x6) #

Giả sử rằng các biến f, g, h, i và j được gán cho các thanh ghi $ s0, $ s1, $ s2,
$ s3 và $ s4, tương ứng. Giả sử rằng địa chỉ cơ sở của mảng A và B tương ứng có
trong các thanh ghi $ s6 và $ s7. Hoàn thành các nhận xét cho bốn hướng dẫn
cuối cùng, sau đó hiển thị mã C có thể được biên dịch thành các hướng dẫn
MIPS này.

Câu trả lời tự học

Hướng dẫn làm số


Nhị phân: 000000010100110010100000100011hai
Lục phân: 14B2823hex
Số thập phân: 21702691mười
Vì bit dẫn đầu là 0, nên nó có cùng giá trị thập phân cho dù là số nguyên đã ký
hay số nguyên không dấu.
Ngôn ngữ hội:
sw x20, 16 (x22)
2.25 Tự học 177

Ngôn ngữ máy :

31 25 24 20 19 15 14 # 11 7 6 0

ngay lập tức [11: 5] rs2 rs1 func3 ngay lập tức [4: 0] opcode
0000000 10100 10110 010 10000 0100011
7 5 5 3 5 7

Hướng dẫn như số và không an toàn


Bản sao biến cục bộ có thể sao chép an toàn đầu vào của người dùng tối đa 9 ký tự
theo sau là ký tự null chấm dứt chuỗi. Bất cứ điều gì lâu hơn sẽ ghi đè lên các giá trị
khác trên ngăn xếp. Khi ngăn xếp phát triển xuống, các giá trị bên dưới ngăn xếp bao
gồm các khung ngăn xếp từ các lệnh gọi thủ tục trước đó, bao gồm các địa chỉ trả về.
Kẻ tấn công cẩn thận không chỉ có thể chèn mã vào ngăn xếp mà còn có thể ghi đè
địa chỉ trả về trong ngăn xếp để cuối cùng chương trình có thể sử dụng địa chỉ trả về
kẻ tấn công để bắt đầu thực thi mã được đặt trên ngăn xếp sau khi một số thủ tục
được trả về.
Trong khi nhanh hơn. Bí quyết là đảo ngược nhánh có điều kiện và có nó
nhảy lên đỉnh của vòng lặp thay vì để nó nhảy qua ở dưới cùng của vòng lặp. Để
phù hợp với ngữ nghĩa của vòng lặp while, trước tiên mã phải kiểm tra xem trước
khi tăng :

slli x10
thêm , x22, 2 // Temp reg x10 = i * 4
lw x10
bne , x10, x25 // x10 = địa chỉ lưu [i]
x9 , 0 (x10) // Temp reg x9 = lưu [i]
Vòng lặp: x24, Lối // đi đến Lối ra nếu lưu [i]
addi x9 , ra ¹ k
slli x22
thêm , x22, 1 // i = i + 1
lw x10
beq , x22, 2 // Temp reg x10 = i * 4
x10
Lối ra: , x10, x25 // x10 = địa chỉ lưu [i]
x9 , 0 (x10) // Temp reg x9 = lưu [i]
x24, Vòng // đi tới Vòng lặp nếu lưu
x9 , lặp [i] = k

Anticompiler :

x18
slli x5 , , 2 # x5 = f * 4
x23
thêm x5 , , x5 # x5 = & A [f]
slli x6 , x19 2 # x6 = g * 4
,
x24
thêm x6 , , x6 # x6 = & B [g]
x18
lw , 0 (x5) # f = A [f]
# x7 = x5 + 4 => x7 điểm đến A [f +
addi x7 , x5 , 4 1] ngay bây giờ
lw x5 , 0 (x7) # x5 = A [f + 1]
# x5 = x5 + $ s0 => x5 bây giờ là A A [f +
thêm x5 , x5 , x18 [f] + 1]
sw x5 , 0 (x6) # lưu kết quả vào B [g]
178 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

Tương đương câu lệnh C là


B [g] = A [f] + A [f + 1];

2.26 Bài tập

2.1 [5] <§2.2> Đối với câu lệnh C sau, viết RISC-V tương ứng mã lắp ráp. Giả
sử rằng các biến C f, g, và h, đã được đặt trong sổ đăng ký x5, x6, và x7 tương
ứng. Sử dụng số lượng tối thiểu các hướng dẫn lắp ráp RISC-V.
f = g + (h - 5);

2.2 [5] <§2.2> Viết một câu lệnh C duy nhất tương ứng với hai RISC-V hướng
dẫn lắp ráp dưới đây.
thêm f, g, h
thêm f, i, f

2.3 [5] <§ §2.2, 2.3> Đối với câu lệnh C sau, viết tương ứng Mã lắp ráp RISC-
V. Giả sử rằng các biến f, g, h, Tôi, và j được gán cho các thanh ghi x5, x6, x7, x28,
và x29, tương ứng. Giả sử rằng địa chỉ cơ sở của các mảng A và B đang trong sổ
đăng ký x10 và x11, tương ứng.
B [8] = A [i − j];

2.4 [10] <§ §2.2, 2.3> Đối với các hướng dẫn lắp ráp RISC-V dưới đây, cái gì
là câu lệnh C tương ứng? Giả sử rằng các biến f, g, h, Tôi, và j được gán cho các
thanh ghi x5, x6, x7, x28, và x29, tương ứng. Giả sử rằng địa chỉ cơ sở của mảng
A và B nằm trong sổ đăng ký x10 và x11, tương ứng.
slli x30, x5, 3 // x30 = f * 8
thêm x30, x10, x30 // x30 = & A [f]
slli x31, x6, 3 // x31 = g * 8
thêm x31, x11, x31 // x31 = & B [g]
lw x5, 0 (x30) // f = A [f]

addi x12, x30, 8


lw x30, 0 (x12)
thêm x30, x30, x5
lw x30, 0 (x31)
2.26 Bài tập 179

2.5 [5] <§2.3> Chỉ ra giá trị như thế nào 0xabcdef12 sẽ được sắp xếp trong bộ
nhớ của một người cuối cùng nhỏ và một cỗ máy lớn. Giả sử dữ liệu được lưu trữ
bắt đầu từ địa chỉ 0 và kích thước từ là 4 byte.

2.6 [5] <§2.4> Dịch 0xabcdef12 thành thập phân.

2.7 [5] <§ §2.2, 2.3> Dịch mã C sau sang RISC-V. Giả sử rằng biến f, g, h, Tôi,
và j được gán cho các thanh ghi x5, x6, x7, x28, và x29, tương ứng. Giả sử rằng
địa chỉ cơ sở của các mảng A và B đang trong sổ đăng ký x10 và x11, tương ứng.
Giả sử rằng các yếu tố của mảng A và B là các từ 8 byte :
B [8] = A [i] + A [j];

2.8 [10] <§ §2.2, 2.3> Dịch mã RISC-V sau đây sang C. Giả sử rằng biến f, g, h,
Tôi, và j được gán cho các thanh ghi x5, x6, x7, x28, và x29, tương ứng. Giả sử
rằng địa chỉ cơ sở của các mảng A và B đang trong sổ đăng ký x10 và x11, tương
ứng.
addi x30, x10, 8
addi x31, x10 , 0
sw x31, 0 (x30)
lw x30, 0 (x30)
thêm x5, x30 , x31

2.9 [20] <§ §2.2, 2.5> Đối với mỗi hướng dẫn RISC-V trong Bài tập 2.8, hãy
hiển thị giá trị của các trường opcode (op), thanh ghi nguồn (rs1) và thanh ghi
đích (rd). Đối với các hướng dẫn loại I, hiển thị giá trị của trường tức thời và đối
với các hướng dẫn loại R, hiển thị giá trị của thanh ghi nguồn thứ hai (rs2). Đối
với các hướng dẫn không phải kiểu U và UJ, hãy hiển thị trường funct3 và đối
với các hướng dẫn loại R và loại S, cũng hiển thị trường funct7.

2.10 Giả sử rằng đăng ký x5 và x6 giữ các giá trị 0x8000000000000000 và


0xD000000000000000, tương ứng.
2.10.1 [5] <§2.4> Giá trị của x30 cho mã lắp ráp sau đây?
thêm x30, x5, x6
2.10.2 [5] <§2.4> Là kết quả trong x30 kết quả mong muốn, hoặc đã có tràn?
2.10.3 [5] <§2.4> Đối với nội dung của sổ đăng ký x5 và x6 như được chỉ định
ở trên , giá trị của cái gì x30 cho mã lắp ráp sau đây?
phụ x30, x5, x6
2.10.4 [5] <§2.4> Là kết quả trong x30 kết quả mong muốn, hoặc đã có tràn?
180 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

2.10.5 [5] <§2.4> Đối với nội dung của sổ đăng ký x5 và x6 như được chỉ định
ở trên , giá trị của cái gì x30 cho mã lắp ráp sau đây?
thêm x30, x5, x6
thêm x30, x30, x5
2.10.6 [5] <§2.4> Là kết quả trong x30 kết quả mong muốn, hoặc đã có tràn?
2.11 Giả sử rằng x5 giữ giá trị 128mười.
2.11.1 [5] <§2.4> Đối với hướng dẫn thêm x30, x5, x6, phạm vi là gì
của các giá trị cho x6 điều đó sẽ dẫn đến tràn?
2.11.2 [5] <§2.4> Đối với hướng dẫn phụ x30, x5, x6, phạm vi là gì
của các giá trị cho x6 điều đó sẽ dẫn đến tràn?
2.11.3 [5] <§2.4> Đối với hướng dẫn phụ x30, x6, x5, phạm vi là gì
của các giá trị cho x6 điều đó sẽ dẫn đến tràn?

2.12 [5] <§ §2.2, 2.5> Cung cấp loại hướng dẫn và ngôn ngữ lắp ráp hướng
dẫn cho giá trị nhị phân sau :
0000 0000 0001 0000 1000 0000 1011 0011 hai
Gợi ý: Hình 2.20 có thể hữu ích.

2.13 [5] <§ §2.2, 2.5> Cung cấp loại hướng dẫn và biểu diễn thập lục phân của
hướng dẫn sau :
sw x5, 32 (x30)

2.14 [5] <§2.5> Cung cấp loại hướng dẫn, hướng dẫn ngôn ngữ lắp ráp, và biểu
diễn nhị phân của lệnh được mô tả bởi các trường RISC-V sau :
opcode = 0x33, func3 = 0x0, func7 = 0x20, rs2 = 5, rs1 = 7, rd = 6

2.15 [5] <§2.5> Cung cấp loại hướng dẫn, hướng dẫn ngôn ngữ lắp ráp, và biểu
diễn nhị phân của lệnh được mô tả bởi các trường RISC-V sau :
opcode = 0x3, func3 = 0x3, rs1 = 27, rd = 3, im = 0x4

2.16 Giả sử rằng chúng tôi muốn mở rộng tệp đăng ký RISC-V lên 128 thanh ghi
và mở rộng tập lệnh để chứa số lượng hướng dẫn gấp bốn lần.
2.16.1 [5] <§2.5> Làm thế nào điều này sẽ ảnh hưởng đến kích thước của từng
trường bit trong Hướng dẫn loại R?
2.26 Bài tập 181

2.16.2 [5] <§2.5> Làm thế nào điều này sẽ ảnh hưởng đến kích thước của từng
trường bit trong Hướng dẫn loại I?
2.16.3 [5] <§ §2.5, 2.8, 2.10> Làm thế nào mỗi trong hai thay đổi được đề xuất
giảm kích thước của chương trình lắp ráp RISC-V? Mặt khác, làm thế nào thay
đổi được đề xuất có thể tăng kích thước của chương trình lắp ráp RISC-V?

2.17 Giả sử nội dung đăng ký sau :


x5 = 0x0000000AAAAAAAA, x6 = 0x1234567812345678
2.17.1 [5] <§2.6> Đối với các giá trị đăng ký được hiển thị ở trên, giá trị của là
gì x7 cho trình tự hướng dẫn sau đây?
slli x7, x5, 4
hoặc là x7, x7, x6
2.17.2 [5] <§2.6> Đối với các giá trị đăng ký được hiển thị ở trên, giá trị của là
gì x7 cho trình tự hướng dẫn sau đây?
slli x7, x6, 4
2.17.3 [5] <§2.6> Đối với các giá trị đăng ký được hiển thị ở trên, giá trị của là
gì x7 cho trình tự hướng dẫn sau đây?
srli x7, x5, 3
andi x7, x7, 0xFEF

2,18 [10] <§2.6> Tìm trình tự ngắn nhất của hướng dẫn RISC-V trích xuất bit
16 xuống đến 11 từ thanh ghi x5 và sử dụng giá trị của trường này để thay thế bit
31 xuống còn 26 trong thanh ghi x6 mà không thay đổi các bit khác của thanh ghi
x5 hoặc là x6 (Hãy chắc chắn kiểm tra mã của bạn bằng cách sử dụng. x5 = 0 và
x6 = 0xffffffffffffffffLàm như vậy có thể tiết lộ một giám sát chung.).

2.19 [5] <§2.6> Cung cấp một bộ hướng dẫn RISC-V tối thiểu có thể được sử
dụng để thực hiện giả hành sau :
không x5, x6 // nghịch đảo bit

2,20 [5] <§2.6> Đối với câu lệnh C sau, viết một chuỗi tối thiểu Hướng dẫn lắp
ráp RISC-V thực hiện thao tác giống hệt nhau. Giả sử x6 = A, và x17 là địa chỉ cơ
sở của C .
A = C [0] <<4;
182 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

2,21 [5] <§2.7> Giả sử x5 giữ giá trị 0x0000000001010000Những gì là. giá trị
của x6 sau các hướng dẫn sau đây?
bge x5, x0, ELSE
jal x0, DONE ELSE:
ori x6, x0, 2 DONE :

2.22 Giả sử quầy chương trình (PC) được đặt thành 0x20000000.

2.22.1 [5] <§2.10> Phạm vi địa chỉ nào có thể đạt được bằng cách sử dụng
RISC-V nhảy và liên kết (jal) hướng dẫn? (Nói cách khác, tập hợp các giá trị có
thể là gì cho PC sau khi hướng dẫn nhảy thực thi?)
2.22.2 [5] <§2.10> Phạm vi địa chỉ nào có thể đạt được bằng cách sử dụng
RISC-V nhánh nếu bằng nhau (beq) hướng dẫn? (Nói cách khác, tập hợp các giá
trị có thể là gì cho PC sau khi hướng dẫn nhánh thực thi?)

2.23 Hãy xem xét một hướng dẫn mới được đề xuất có tên rptHướng dẫn này
kết hợp. kiểm tra điều kiện vòng lặp và giảm sự suy giảm thành một hướng dẫn
duy nhất. Ví dụ rpt x29, vòng lặp sẽ làm như sau :
nếu (x29> 0) {
x29 = x29 1;
vòng lặp goto
}

2.23.1 [5] <§2.7, 2.10> Nếu hướng dẫn này được thêm vào RISC-V tập lệnh,
định dạng hướng dẫn phù hợp nhất là gì?
2.23.2 [5] <§2.7> Trình tự ngắn nhất của hướng dẫn RISC-V là gì thực hiện
cùng một hoạt động?

2.24 Hãy xem xét vòng lặp RISC-V sau :

LOOP: beq x6, x0, XONG


addi x6, x6, -1
addi x5, x5, 2
jal x0, LOOP
LÀM XONG:

2.24.1 [5] <§2.7> Giả sử rằng đăng ký x6 được khởi tạo thành giá trị 10. Gì là
giá trị cuối cùng trong đăng ký x5 giả sử x5 ban đầu bằng không?
2.26 Bài tập 183

2.24.2 [5] <§2.7> Đối với vòng lặp ở trên, viết mã C tương đương. Giả sử rằng
các thanh ghi x5 và x6 là số nguyên acc và Tôi, tương ứng.
2.24.3 [5] <§2.7> Đối với vòng lặp được viết trong cụm RISC-V ở trên, giả sử
rằng đăng ký x6 được khởi tạo thành giá trị N. Có bao nhiêu hướng dẫn RISC-V
được thực thi?
2.24.4 [5] <§2.7> Đối với vòng lặp được viết trong lắp ráp RISC-V ở trên,
thay thế hướng dẫnbeq x6, x0, XONGHướng dẫn với hướng dẫnblt x6, x0,
DONGViết và viết mã C tương đương.

2.25 [10] <§2.7> Dịch mã C sau sang mã lắp ráp RISC-V. Sử dụng một số
lượng tối thiểu của hướng dẫn. Giả sử rằng các giá trị của a, b, Tôi, và j đang
trong sổ đăng ký x5, x6, x7, và x29, tương ứng. Ngoài ra, giả sử đăng ký đó x10
giữ địa chỉ cơ sở của mảng D .
cho (i = 0; i <a; i ++)
cho (j = 0; j <b; j ++)
D [4 * j] = i + j;

2.26 [5] <§2.7> Cần bao nhiêu hướng dẫn RISC-V để thực hiện Mã C từ Bài
tập 2.25? Nếu các biến a và b được khởi tạo thành 10 và 1 và tất cả các phần tử
của D ban đầu là 0, tổng số hướng dẫn RISC-V được thực hiện để hoàn thành
vòng lặp là bao nhiêu?

2,27 [5] <§2.7> Dịch vòng lặp sau vào C. Giả sử rằng cấp độ C số nguyên Tôi
được tổ chức trong đăng ký x5, x6 giữ số nguyên cấp C được gọi kết quả, và x10
giữ địa chỉ cơ sở của số nguyên MemArray.
addi x6, x0, 0
addi x29, x0, 100
LOOP: lw x7, 0 (x10)
thêm x5, x5, x7
addi x10, x10, 8
addi x6, x6, 1
blt x6, x29, LOOP

2,28 [10] <§2.7> Viết lại vòng lặp từ Bài tập 2.27 để giảm số lượng Hướng
dẫn RISC-V được thực hiện. Gợi ý: Lưu ý rằng biến Tôi chỉ được sử dụng để
điều khiển vòng lặp.
184 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

2,29 [30] <§2.8> Thực hiện mã C sau trong lắp ráp RISC-V. Gợi ý:
Hãy nhớ rằng con trỏ ngăn xếp phải được căn chỉnh trên bội số của 16.

int fib (int n) {


nếu (n == 0)
trả về 0;
khác nếu (n == 1)
trả lại 1;
khác
trả lại sợi (n 1) + xơ (n 2);
}

2.30 [20] <§2.8> Đối với mỗi chức năng gọi trong Bài tập 2.29, hiển thị nội
dung của ngăn xếp sau khi gọi hàm được thực hiện. Giả sử con trỏ stack ban đầu
là tại địa chỉ 0x7ffffffcvà tuân theo các quy ước đăng ký như được chỉ định trong
Hình 2.11.

2.31 [20] <§2.8> Dịch chức năng f vào ngôn ngữ lắp ráp RISC-V. Giả sử khai
báo chức năng cho g là int g (int a, int b) Mã cho chức năng. f như sau :
int f (int a, int b, int c, int d) {

trả về g (g (a, b), c + d);


}
2.32 [5] <§2.8> Chúng ta có thể sử dụng tối ưu hóa cuộc gọi đuôi trong chức
năng này? Nếu không, giải thích tại sao không. Nếu có, sự khác biệt về số lượng
hướng dẫn được thực hiện là gì f có và không có sự tối ưu hóa?

2.33 [5] <§2.8> Ngay trước chức năng của bạn f từ bài tập 2.31 trở lại, làm gì
chúng tôi biết về nội dung của các thanh ghi x10-x14, x8, x1, và sp Hãy nhớ rằng
chúng tôi biết toàn bộ chức năng? f trông giống như, nhưng cho chức năng g
chúng tôi chỉ biết tuyên bố của nó.

2.34 [30] <§2.9 > Viết một chương trình trong lắp ráp RISC-V để chuyển đổi
ASCII chuỗi chứa một chuỗi thập phân số nguyên dương hoặc âm thành một số
nguyên. Chương trình của bạn nên mong đợi đăng ký x10 để giữ địa chỉ của một
chuỗi kết thúc null có chứa một tùy chọn + + hoặc - - theo sau là một số kết hợp
các chữ số từ 0 đến 9. Chương trình của bạn sẽ tính giá trị số nguyên tương
đương với chuỗi chữ số này, sau đó đặt số vào thanh ghi x10 Nếu một ký tự
không có chữ số xuất hiện ở bất kỳ đâu trong chuỗi, chương trình của bạn sẽ
dừng với giá trị −1 trong thanh ghi. x10 Ví dụ, nếu đăng ký. x10 chỉ ra một chuỗi
ba
2.26 Bài tập 185

byte 50mười, 52mười, 0mười (chuỗi kết thúc null 24 24), sau đó khi chương trình
dừng lại, hãy đăng ký x10 nên chứa giá trị 24mười RISC -V. mul hướng dẫn lấy
hai thanh ghi làm đầu vào. Không có tiếng AnhmuliHướng dẫn. Vì vậy, chỉ cần
lưu trữ hằng số 10 trong một thanh ghi.

2,35 Hãy xem xét mã sau :

lb x6, 0 (x7)
sw x6, 8 (x7)

Giả sử rằng đăng ký x7 chứa địa chỉ 0 × 10000000 và dữ liệu tại địa chỉ là 0 ×
112233445567788.
2.35.1 [5] <§2.3, 2.9> Giá trị nào được lưu trữ trong 0 × 10000008 trên một
người lớn Máy móc?
2.35.2 [5] <§2.3, 2.9> Giá trị nào được lưu trữ trong 0 × 10000008 trên một
chút endian Máy móc?

2.36 [5] <§2.10> Viết mã lắp ráp RISC-V tạo hằng số 32 bit
0x12345678hex và lưu trữ giá trị đó để đăng ký x10.

2.37 [10] <§2.11> Viết mã lắp ráp RISC-V để thực hiện các thao tác sau Mã C
dưới dạng một hoạt động nguyên tử của bộ cài đặt tối đa bằng cách sử dụng
lr.d/sc.d hướng dẫn. Đây, tranh luận shvar chứa địa chỉ của một biến được chia sẻ
cần được thay thế bằng x nếu x lớn hơn giá trị mà nó trỏ tới :
void setmax (int * shvar, int x) {
// Bắt đầu phần quan trọng nếu (x>
* shvar)
* shvar = x;
// Kết thúc phần quan trọng}
}

2,38 [5] <§2.11> Sử dụng mã của bạn từ Bài tập 2.37 làm ví dụ, giải thích những
gì xảy ra khi hai bộ xử lý bắt đầu thực hiện phần quan trọng này cùng một lúc, giả sử
rằng mỗi bộ xử lý thực hiện chính xác một lệnh trên mỗi chu kỳ.

2,39 Giả sử cho một bộ xử lý nhất định, CPI của các hướng dẫn số học là 1 ,
CPI của hướng dẫn tải / lưu trữ là 10 và CPI của hướng dẫn nhánh là 3. Giả sử
một chương trình có các phân tích hướng dẫn sau: 500 triệu
186 Chương 2 Hướng dẫn: Ngôn ngữ của máy tính

hướng dẫn số học, hướng dẫn tải / lưu trữ 300 triệu, hướng dẫn chi nhánh 100
triệu.
2.39.1 [5] <§ §1.6, 2.13> Giả sử rằng số học mới, mạnh hơn hướng dẫn được
thêm vào tập lệnh. Trung bình, thông qua việc sử dụng các hướng dẫn số học
mạnh hơn này, chúng ta có thể giảm số lượng hướng dẫn số học cần thiết để thực
hiện chương trình 25%, trong khi chỉ tăng 10% thời gian chu kỳ đồng hồ. Đây có
phải là một lựa chọn thiết kế tốt? Tại sao?
2.39.2 [5] <§ §1.6, 2.13> Giả sử rằng chúng tôi tìm cách tăng gấp đôi hiệu suất của
hướng dẫn số học. Tốc độ tổng thể của máy của chúng tôi là gì? Điều gì sẽ xảy ra
nếu chúng ta tìm ra cách cải thiện hiệu suất của các hướng dẫn số học 10 lần?

2,40 Giả sử rằng đối với một chương trình nhất định, 70% các hướng dẫn được
thực hiện là số học, 10% là tải / lưu trữ và 20% là chi nhánh.
2.40.1 [5] <§ §1.6, 2.13> Đưa ra hỗn hợp hướng dẫn này và giả định rằng một
lệnh số học yêu cầu hai chu kỳ, một lệnh tải / lưu trữ mất sáu chu kỳ và một lệnh
nhánh mất ba chu kỳ, tìm CPI trung bình .
2.40.2 [5] <§ §1.6, 2.13> Để cải thiện 25% hiệu suất, có bao nhiêu trung bình,
các chu kỳ, có thể một lệnh số học sẽ thực hiện nếu tải / lưu trữ và hướng dẫn
nhánh hoàn toàn không được cải thiện?
2.40.3 [5] <§ §1.6, 2.13> Để cải thiện 50% hiệu suất, có bao nhiêu trung bình,
các chu kỳ, có thể một lệnh số học sẽ thực hiện nếu tải / lưu trữ và hướng dẫn
nhánh hoàn toàn không được cải thiện?

2,41 [10] <§2,22 > Giả sử ISC-V bao gồm một địa chỉ bù được thu nhỏ chế độ
tương tự như x86 được mô tả trong Mục 2.19 (Hình 2.39). Mô tả cách bạn sẽ sử
dụng tải bù được thu nhỏ để giảm thêm số lượng hướng dẫn lắp ráp cần thiết để
thực hiện chức năng được đưa ra trong Bài tập 2.4.
2,42 [10] <§2,22> Giả sử ISC-V bao gồm một địa chỉ bù được thu nhỏ chế độ
tương tự như x86 được mô tả trong Mục 2.19 (Hình 2.39). Mô tả cách bạn sẽ sử
dụng tải bù được thu nhỏ để giảm thêm số lượng lắp ráp
hướng dẫn cần thiết để thực hiện mã C được đưa ra trong Bài tập 2.7.

§2.2, trang 72: RISC-V, C, Java.


Câu trả lời để §2.3, trang 79: 2) Rất chậm.
kiểm tra chính §2.4, trang 86: Câu hỏi đầu tiên: 2) -8mười; Câu hỏi thứ hai: 4)
mình 18.446.744.073.709.551.608mười
§2.5, trang 95: 3) phụ x11, x10, x9; Câu hỏi thứ hai: 28hex
§2.6, trang 98: Cả hai. VÀ với mẫu mặt nạ 1s sẽ để lại 0s ở mọi nơi trừ trường mong
muốn. Chuyển sang trái theo số lượng chính xác sẽ loại bỏ các bit từ bên trái
2.26 Bài tập 187

của lĩnh vực này. Chuyển đổi ngay theo số lượng thích hợp sẽ đặt trường vào các
bit bên phải của từ, với 0s trong phần còn lại của từ. Lưu ý rằng AND rời khỏi
trường nơi ban đầu và cặp dịch chuyển di chuyển trường vào phần ngoài cùng bên
phải của từ.
§2.7, trang 103: I. Tất cả đều đúng. II. 1).
§2.8, trang 114: Cả hai đều đúng.
§2.9, trang 119: I. 1) và 2) II. 3).
§2.10, trang 128: I. 4) ± 4 K. II. 4) ± 1 M .
§2.11, trang 131: Cả hai đều đúng.
§2.12, trang 140: 4) Máy độc lập.
3
Số học cho
máy tính
3.1 Giới thiệu 190
Độ chính xác số là 3.2 Phép cộng và phép trừ 190
linh hồn của khoa 3.3 Phép nhân 193
3.4 Sư đoàn
học. 199
3.5 Điểm nổi 208
Ngài Diênarcy Wentworth
3.6 Song song và số học máy tính :
Thompson , Về tăng trưởng và hình
thức, 1917 Song song Subword 233
3.7 Real Stuff: Truyền phát phần mở rộng SIMD

Phần mở rộng Vector nâng cao trong x86
234
Tổ chức máy tính và thiết kế Phiên bản RISC-V. DOI: http://dx.doi.org/10.1016/B978-0-12-820331-6.00003-X ©
2021 Elsevier Inc. Đã đăng ký Bản quyền.
3.8 Nhanh hơn: Song song Subword và Ma trận nhân 236
3.9 Ngụy biện và Cạm bẫy 238
3.10 Kết luận 241
3.11 Quan điểm lịch sử và đọc thêm 242
3.12 Tự học 242
3.13 Bài tập 246

Năm thành phần cổ điển của một máy tính


190 Chương 3 Số học cho máy tính

3.1 Giới thiệu

Từ máy tính được cấu tạo từ bit; do đó, các từ có thể được biểu diễn dưới dạng số nhị
phân. Chương 2 cho thấy các số nguyên có thể được biểu diễn ở dạng thập phân hoặc
nhị phân, nhưng những số khác thường xảy ra? Ví dụ:
n Những gì về phân số và số thực khác?
n Điều gì xảy ra nếu một hoạt động tạo ra một số lớn hơn có thể được đại diện?
n Và bên dưới những câu hỏi này là một bí ẩn: Làm thế nào để phần cứng
thực sự nhân hoặc chia số?
Mục tiêu của chương này là làm sáng tỏ những bí ẩn này, bao gồm việc thể hiện
các số thực, thuật toán số học, phần cứng tuân theo các thuật toán này và ý nghĩa của
tất cả những điều này đối với các bộ hướng dẫn. Những hiểu biết này có thể giải
thích những điều kỳ quặc mà bạn đã gặp với máy tính. Hơn nữa, chúng tôi chỉ ra
cách sử dụng kiến thức này để làm cho các chương trình chuyên sâu về số học đi
nhanh hơn nhiều.

Phép trừ: Bổ sung


Tricky Pal
3.2 Phép cộng và phép trừ
Không. 10, Mười khóa
học hàng đầu dành cho Bổ sung chỉ là những gì bạn mong đợi trong máy tính. Các chữ số được thêm
vận động viên tại một từng chút một từ phải sang trái, với các chữ số được truyền sang chữ số tiếp theo
nhà máy bóng đá, David bên trái, giống như bạn sẽ làm bằng tay. Phép trừ sử dụng phép cộng: toán hạng
Letterman et al., Sách thích hợp chỉ bị phủ định trước khi được thêm vào.
của Mười danh sách
hàng đầu, 1990

Bổ sung nhị phân và trừ

Hãy thử thêm 6mười đến 7mười trong nhị phân và sau đó trừ 6mười từ 7mười trong nhị
VÍ DỤ phân.

00000000 00000000 0000000 00000111hai = 7mười


+ 00000000 00000000 0000000 00000110hai = 6mười = 00000000

00000000 00000000 00001101hai = 13mười

4 bit ở bên phải có tất cả các hành động; Hình 3.1 cho thấy các khoản tiền và mang.
Dấu ngoặc đơn xác
định mang, với các
mũi tên minh họa
cách chúng được
thông qua.
3.2 Bổ sung và trừ 191

(0) (0) (1) (1) (0) (Carries)


... 0 0 0 1 1 1
... 0 0 0 1 1 0
. . . (0) 0 (0) 0 (0) 1 (1) 1 (1) 0 (0) 1

HÌNH 3.1 Bổ sung nhị phân, hiển thị mang từ phải sang trái. Bit ngoài cùng bên phải thêm
1 đến 0, dẫn đến tổng của bit này là 1 và thực hiện từ bit này là 0. Do đó, thao tác cho chữ số thứ hai
ở bên phải là 0 + 1 + 1. Điều này tạo ra 0 cho bit tổng này và thực hiện 1. Chữ số thứ ba là tổng của 1
+ 1 + 1, dẫn đến việc thực hiện 1 và tổng bit là 1. Bit thứ tư là 1 + 0 + 0, mang lại 1 tổng và không
mang theo.

Trừ 6mười từ 7mười có thể được thực hiện trực tiếp :


TRẢ LỜI
00000000 00000000 0000000 00000111hai = 7mười
- 00000000 00000000 0000000 00000110hai = 6mười

= 00000000 00000000 0000000 00000001hai = 1mười

hoặc thông qua việc bổ sung bằng cách sử dụng hai đại diện bổ sung của −6 :

00000000 00000000 0000000 00000111hai = 7mười


_
+ 11111111 111111111 111111111 11111010hai = 6mười

= 00000000 00000000 0000000 00000001hai = 1mười

Nhớ lại rằng tràn xảy ra khi kết quả từ một hoạt động không thể được biểu
diễn bằng phần cứng có sẵn, trong trường hợp này là một từ 32 bit. Khi nào có
thể tràn xảy ra ngoài? Khi thêm toán hạng với các dấu hiệu khác nhau, tràn
không thể xảy ra. Lý do là tổng phải không lớn hơn một trong các toán hạng. Ví
dụ: −10 + 4 = 6. Vì các toán hạng khớp với 32 bit và tổng không lớn hơn toán
hạng, tổng cũng phải vừa với 32 bit. Do đó, không có tràn có thể xảy ra khi thêm
các toán hạng dương và âm.
Có những hạn chế tương tự như sự xuất hiện của tràn trong khi trừ, nhưng nó chỉ
là nguyên tắc ngược lại: khi các dấu hiệu của toán hạng là giống nhau, tràn không thể
xảy ra. Để thấy điều này, hãy nhớ rằng c - a = c + (-a) bởi vì chúng tôi trừ bằng cách
phủ nhận toán hạng thứ hai và sau đó thêm. Do đó, khi chúng tôi trừ các toán hạng
của cùng một dấu hiệu, chúng tôi sẽ kết thúc thêm toán hạng của khác nhau dấu hiệu.
Từ đoạn trước, chúng tôi biết rằng tràn cũng không thể xảy ra trong trường hợp này.
Biết khi nào một tràn không thể xảy ra ngoài và trừ là tốt và tốt, nhưng làm thế
nào để chúng tôi phát hiện ra nó khi nó làm xảy ra? Rõ ràng, việc thêm hoặc trừ hai
số 32 bit có thể mang lại kết quả cần 33 bit để được thể hiện đầy đủ.
192 Chương 3 Số học cho máy tính

HÌNH 3.2 Điều kiện tràn để cộng và trừ.

Việc thiếu bit thứ 33 có nghĩa là khi xảy ra tràn, bit dấu được đặt cùng với giá
trị của kết quả thay vì dấu hiệu thích hợp của kết quả. Vì chúng ta chỉ cần thêm
một chút, chỉ có bit dấu có thể sai. Do đó, tràn xảy ra khi thêm hai số dương và
tổng âm hoặc ngược lại. Tổng giả này có nghĩa là một thực hiện xảy ra vào bit
dấu hiệu.
Tràn xảy ra trong phép trừ khi chúng ta trừ một số âm từ một số dương và
nhận được kết quả âm tính hoặc khi chúng ta trừ một số dương từ một số âm và
nhận được kết quả dương tính. Một kết quả vô lý như vậy có nghĩa là một khoản
vay xảy ra từ bit dấu hiệu. Hình 3.2 cho thấy sự kết hợp của các hoạt động, toán
hạng và kết quả cho thấy sự tràn.
Chúng ta vừa thấy cách phát hiện tràn cho hai số bổ sung của máy tính trong
máy tính. Điều gì về tràn với số nguyên không dấu? Các số nguyên chưa ký
thường được sử dụng cho các địa chỉ bộ nhớ nơi bỏ qua tràn.
Đơn vị logic số học May mắn thay, trình biên dịch có thể dễ dàng kiểm tra tràn không dấu bằng cách
(ALU) Phần cứng thực
sử dụng lệnh nhánh. Phép cộng đã tràn nếu tổng nhỏ hơn một trong hai phần bổ sung,
hiện phép cộng, phép trừ
và thường là các thao tác
trong khi phép trừ đã tràn nếu chênh lệch lớn hơn phần phụ.
logic như AND và OR . Phụ lục A mô tả phần cứng thực hiện phép cộng và phép trừ , được gọi là an
Đơn vị logic số học hoặc là ALU.

Giao diện Nhà thiết kế máy tính phải quyết định cách xử lý tràn số học. Mặc dù một số ngôn
phần ngữ như C và Java bỏ qua tràn số nguyên, các ngôn ngữ như Ada và Fortran yêu cầu
chương trình phải được thông báo. Lập trình viên hoặc môi trường lập trình sau đó
cứng / phải quyết định phải làm gì khi xảy ra tràn.
phần
mềm Tóm tắt
Một điểm chính của phần này là, độc lập với biểu diễn, kích thước từ hữu hạn của
máy tính có nghĩa là các phép toán số học có thể tạo ra kết quả quá lớn để phù hợp
với kích thước từ cố định này. Nó dễ dàng phát hiện tràn trong các số chưa ký, mặc
dù những số này hầu như luôn bị bỏ qua vì các chương trình don don muốn phát hiện
tràn cho số học địa chỉ, việc sử dụng số tự nhiên phổ biến nhất. Bổ sung Two Two
đưa ra một thách thức lớn hơn, tuy nhiên một số hệ thống phần mềm yêu cầu nhận ra
tràn, vì vậy ngày nay tất cả các máy tính đều có cách để phát hiện ra nó.
3.3 Phép nhân 193

Một số ngôn ngữ lập trình cho phép hai số học số nguyên bổ sung trên các biến Kiểm tra
được khai báo bằng một nửa và một nửa, trong khi RISC-V chỉ có các phép toán Bản thân bạn
số nguyên trên các từ đầy đủ. Khi chúng tôi nhớ lại từ Chương 2, RISC-V có các
hoạt động truyền dữ liệu cho byte và nửa từ. Những hướng dẫn RISC-V nào sẽ
được tạo cho các phép toán số học byte và nửa chữ?
1. Tải với lb, lh; số học với thêm, phụ, mul, div , sử dụng và để che kết quả đến
8 hoặc 16 bit sau mỗi thao tác; sau đó lưu trữ bằng cách sử dụng sb, sh.
2. Tải với lb, lh; số học với thêm, phụ, mul, div; sau đó lưu trữ bằng cách sử
dụng sb, sh.

Xây dựng: Một tính năng thường không được tìm thấy trong các bộ vi xử lý đa
năng là hoạt động bão hòa. Sự bão hòa có nghĩa là khi một phép tính tràn, kết quả
được đặt thành số dương lớn nhất hoặc số âm nhất, thay vì tính toán modulo như
trong hai số học bổ sung. Saturation có khả năng là những gì bạn muốn cho các hoạt
động truyền thông. Ví dụ, núm âm lượng trên một đài phát thanh sẽ gây bực bội nếu
khi bạn bật nó, âm lượng sẽ liên tục to hơn trong một thời gian và sau đó ngay lập
tức rất mềm. Một núm có độ bão hòa sẽ dừng ở âm lượng cao nhất cho dù bạn xoay
nó bao xa. Phần mở rộng đa phương tiện cho các bộ hướng dẫn tiêu chuẩn thường
cung cấp số học bão hòa.

Xây dựng: Tốc độ bổ sung phụ thuộc vào tốc độ mang vào các bit bậc cao được
tính toán. Có nhiều kế hoạch để dự đoán việc mang theo để trường hợp xấu nhất là
chức năng của nhật ký2 số lượng bit trong bộ cộng. Các tín hiệu dự đoán này nhanh
hơn vì chúng đi qua ít cổng hơn theo trình tự, nhưng phải mất nhiều cổng hơn để dự
đoán việc mang theo đúng cách. Phổ biến nhất là mang theo nhìn kìa, cái nào Mục
A.6 trong Phụ lục A mô tả.

3.3 Phép nhân

Bây giờ chúng tôi đã hoàn thành giải thích về phép cộng và phép trừ, chúng tôi
đã sẵn sàng để xây dựng hoạt động nhân lên nhiều hơn. Phép nhân là sự phật
Đầu tiên, hãy để xem xét sự nhân lên của các số thập phân theo chiều dài để ý, Phân chia là xấu;
nhắc nhở bản thân về các bước nhân và tên của các toán hạng. Vì những lý do sẽ Quy tắc của ba câu
sớm trở nên rõ ràng, chúng tôi giới hạn ví dụ thập phân này chỉ sử dụng các chữ đố cho tôi, và thực
số 0 và 1. Nhân 1000mười bằng 1001mười: hành làm tôi phát
điên.
Vô danh,
Bản thảo Elizabeth ,
1570
194 Chương 3 Số học cho máy tính

Các toán hạng đầu tiên được gọi là bội số và thứ hai số nhân Kết quả cuối cùng
được gọi là. sản phẩmNhư bạn có thể nhớ lại. thuật toán học được trong trường
ngữ pháp là lấy các chữ số của số nhân tại một thời điểm từ phải sang trái, nhân
số nhân với một chữ số của số nhân, và chuyển sản phẩm trung gian một chữ số
sang trái của các sản phẩm trung gian trước đó,

Quan sát đầu tiên là số chữ số trong sản phẩm lớn hơn đáng kể so với số trong
bội số hoặc số nhân. Trong thực tế, nếu chúng ta bỏ qua các bit ký hiệu, độ dài
của phép nhân của an n-bit bội số và an m-bit số nhân là một sản phẩm n + m bit
dài. Đó là, n + m bit được yêu cầu để đại diện cho tất cả các sản phẩm có thể. Do
đó, giống như thêm, nhân phải đối phó với tràn vì chúng ta thường muốn một sản
phẩm 32 bit là kết quả của việc nhân hai số 32 bit.
Trong ví dụ này, chúng tôi đã giới hạn các chữ số thập phân thành 0 và 1. Chỉ
với hai lựa chọn, mỗi bước của phép nhân rất đơn giản :
1. Chỉ cần đặt một bản sao của phép nhân (1 × phép nhân) vào đúng vị trí nếu
chữ số nhân là 1 hoặc
2. Đặt 0 (0 × bội) vào đúng vị trí nếu chữ số là 0.
Mặc dù ví dụ thập phân ở trên chỉ sử dụng 0 và 1, phép nhân số nhị phân phải
luôn sử dụng 0 và 1 và do đó luôn chỉ cung cấp hai lựa chọn này.
Bây giờ chúng tôi đã xem xét các kiến thức cơ bản về phép nhân, bước tiếp
theo truyền thống là cung cấp phần cứng nhân được tối ưu hóa cao. Chúng tôi
phá vỡ truyền thống với niềm tin rằng bạn sẽ hiểu rõ hơn bằng cách nhìn thấy sự
phát triển của phần cứng và thuật toán nhân qua nhiều thế hệ. Hiện tại, hãy để
cho rằng chúng tôi chỉ nhân các số dương.

Phiên bản tuần tự của Thuật toán nhân và phần


cứng
Thiết kế này bắt chước thuật toán chúng ta đã học ở trường ngữ pháp;Hình 3.3
hiển thị phần cứng. Chúng tôi đã vẽ phần cứng để dữ liệu chảy từ trên xuống
dưới giống với phương pháp giấy và bút chì chặt chẽ hơn.
Hãy giả sử rằng hệ số nhân nằm trong thanh ghi số nhân 32 bit và thanh ghi sản
phẩm 64 bit được khởi tạo thành 0. Từ ví dụ giấy và bút chì ở trên, rõ ràng là
chúng ta sẽ cần di chuyển bội số còn lại một chữ số mỗi bước, vì nó có thể được
thêm vào các sản phẩm trung gian. Trên 32 bước, một phép nhân 32 bit sẽ di
chuyển 32 bit sang trái. Do đó, chúng ta cần một thanh ghi bội số 64 bit, được
khởi tạo với phép nhân 32 bit ở nửa bên phải và 0 ở nửa bên trái. Thanh ghi này
sau đó được dịch sang trái 1 bit mỗi bước để căn chỉnh bội số với tổng được tích
lũy trong thanh ghi sản phẩm 64 bit.
3.3 Phép nhân 195

Phép nhân
Chuyển sang trái
64 bit

Hệ số nhân
ALU 64 bit Chuyển sang phải
32 bit

Sản phẩm Điều


khiển kiểm tra
Viết
64 bit

HÌNH 3.3 Phiên bản đầu tiên của phần cứng nhân. Thanh ghi bội, ALU , và thanh ghi sản phẩm
đều rộng 64 bit, chỉ có thanh ghi Số nhân chứa 32 bit. (Phụ lục A mô tả ALU.) Phép nhân 32 bit bắt đầu ở
nửa bên phải của thanh ghi Multiplicand và được dịch sang trái 1 bit trên mỗi bước. Hệ số nhân được dịch
theo hướng ngược lại ở mỗi bước. Thuật toán bắt đầu với sản phẩm được khởi tạo thành 0. Kiểm soát quyết
định khi nào cần dịch các thanh ghi Multiplicand và Multiplier và khi nào sẽ ghi các giá trị mới vào thanh
ghi Sản phẩm.

Hình 3.4 cho thấy ba bước cơ bản cần thiết cho mỗi bit. Ít quan trọng nhất bit
của số nhân (Multiplier0) xác định xem phép nhân được thêm vào thanh ghi Sản
phẩm. Sự dịch chuyển trái trong bước 2 có tác dụng di chuyển các toán hạng trung
gian sang trái, giống như khi nhân với giấy và bút chì. Sự thay đổi ngay trong
bước 3 cho chúng ta bit tiếp theo của hệ số nhân để kiểm tra trong lần lặp sau. Ba
bước này được lặp lại 32 lần để có được sản phẩm. Nếu mỗi bước thực hiện một
chu kỳ xung nhịp, thuật toán này sẽ yêu cầu gần 200 chu kỳ xung nhịp để nhân hai
số 32 bit. Tầm quan trọng tương đối của các phép toán số học như nhân thay đổi
theo chương trình, nhưng phép cộng và phép trừ có thể phổ biến hơn từ 5 đến 100
lần so với nhân. Theo đó, trong nhiều ứng dụng, nhân có thể mất vài chu kỳ đồng
hồ mà không ảnh hưởng đáng kể đến hiệu suất. Tuy nhiên, Luật Amdahl từ (xem
Mục 1.10) nhắc nhở chúng ta rằng ngay cả tần số vừa phải cho hoạt động chậm
cũng có thể hạn chế hiệu suất.
Thuật toán và phần cứng này dễ dàng được tinh chỉnh để thực hiện một chu kỳ
đồng hồ mỗi bước. Tốc độ tăng đến từ việc thực hiện các thao tác song song: hệ
số nhân và bội số được dịch chuyển trong khi phép nhân được thêm vào sản phẩm
nếu bit số nhân là 1. Phần cứng chỉ phải đảm bảo rằng nó kiểm tra đúng bit của
hệ số nhân và có được phiên bản nâng trước của phép nhân. Phần cứng thường
được tối ưu hóa hơn nữa để giảm một nửa chiều rộng của bộ cộng và các thanh
ghi bằng cách nhận thấy nơi có các phần không sử dụng của thanh ghi và bộ cộng.
Hình 3.5 cho thấy phần cứng sửa đổi.
196 Chương 3 Số học cho máy tính

Khởi đầu

Hệ số nhân0
Hệ số nhân0 = 1 1. Kiểm tra =0
Số nhân0

1a. Thêm bội số cho sản phẩm và


đặt kết quả vào đăng ký sản phẩm

2. Chuyển thanh ghi Multiplicand còn lại 1 bit

3. Chuyển số đăng ký số nhân ngay 1 bit

Không: <32 lần lặp lại


Lần lặp lại thứ
32?

Có: 32 lần lặp lại

Làm xong

HÌNH 3.4 Thuật toán nhân đầu tiên, sử dụng phần cứng được hiển thị trong Hình 3.3.Nếu bit ít
quan trọng nhất của số nhân là 1, thêm bội số vào sản phẩm. Nếu không, đi đến bước tiếp theo. Chuyển bội số
nhân sang trái và số nhân bên phải trong hai bước tiếp theo. Ba bước này được lặp lại 32 lần.

Giao diện Thay thế số học bằng các dịch cũng có thể xảy ra khi nhân với các hằng số. Một
số trình biên dịch thay thế bội số bằng các hằng số ngắn bằng một loạt các ca và
phần thêm vào. Bởi vì một bit ở bên trái đại diện cho một số lớn gấp đôi trong cơ sở 2,
cứng / việc dịch chuyển các bit còn lại có tác dụng tương tự như nhân với một lũy thừa
phần là 2. Như đã đề cập trong Chương 2, hầu hết mọi trình biên dịch sẽ thực hiện tối
ưu hóa giảm cường độ thay thế một dịch chuyển trái cho nhân với công suất 2.
mềm
3.3 Phép nhân 197

Phép nhân
32 bit

ALU 32 bit

Điều
Chuyển sang phải
Sản phẩm khiển
Viết kiểm
tra
64 bit

HÌNH 3.5 Phiên bản tinh chỉnh của phần cứng nhân. So sánh với phiên bản đầu tiên trong Hình
3.3Thanh ghi Multiplicand và ALU đã giảm xuống còn 32 bit. Bây giờ sản phẩm được chuyển sang phải.
Thanh ghi nhân riêng biệt cũng biến mất. Hệ số nhân được đặt thay thế ở nửa bên phải của thanh ghi Sản
phẩm, đã tăng thêm một bit đến 65 bit để giữ phần mang ra của bộ cộng. Những thay đổi này được tô sáng
màu.

HÌNH 3.6 Ví dụ nhân sử dụng thuật toán trong Hình 3.4.Các bit được kiểm tra để xác định bước
tiếp theo được khoanh tròn màu sắc.

VÍ DỤ
Một thuật toán nhân

Sử dụng số 4 bit để tiết kiệm không gian, nhân 2 mười × 3mườihoặc 0010hai × TRẢ LỜI
0011hai.

Hình 3.6 hiển thị giá trị của mỗi thanh ghi cho từng bước được dán nhãn
theo Hình 3.4, với giá trị cuối cùng là 0000 0110hai hoặc 6mườiMàu được sử
dụng để chỉ ra các giá trị thanh ghi thay đổi trên bước đó và bit được khoanh
tròn là giá trị được kiểm tra để xác định hoạt động của bước tiếp theo.
198 Chương 3 Số học cho máy tính

Đã ký nhân
Cho đến nay, chúng tôi đã xử lý các con số tích cực. Cách dễ nhất để hiểu cách xử lý
các số đã ký là trước tiên chuyển đổi số nhân và số nhân thành số dương và sau đó
ghi nhớ các dấu ban đầu của chúng. Các thuật toán tiếp theo sẽ được chạy trong 31
lần lặp, để lại các dấu hiệu ra khỏi phép tính. Như chúng ta đã học ở trường ngữ pháp,
chúng ta chỉ cần phủ nhận sản phẩm nếu các dấu hiệu ban đầu không đồng ý.
Hóa ra thuật toán cuối cùng sẽ hoạt động cho các số đã ký, nếu chúng ta nhớ
rằng chúng ta đang xử lý các số có chữ số vô hạn và chúng ta chỉ đại diện cho
chúng với 32 bit. Do đó, các bước dịch chuyển sẽ cần mở rộng dấu hiệu của sản
phẩm cho các số đã ký. Khi thuật toán hoàn thành, từ dưới sẽ có sản phẩm 32 bit.

Phép nhân nhanh hơn


Moore Moore Law cung cấp nhiều tài nguyên hơn đến mức các nhà thiết kế phần
cứng có thể xây dựng phần cứng nhân nhanh hơn nhiều. Liệu phép nhân được thêm
hay không được biết ở đầu phép nhân bằng cách xem xét từng bit trong số 32 số nhân.
Có thể nhân nhanh hơn bằng cách cung cấp một bộ cộng 32 bit cho mỗi bit của hệ số
nhân: một đầu vào là phép nhân VÀ với một bit số nhân và đầu kia là đầu ra của một
bộ cộng trước.
Một cách tiếp cận đơn giản sẽ là kết nối các đầu ra của các bộ cộng ở bên phải
với các đầu vào của các bộ cộng ở bên trái, làm cho một chồng các bộ bổ sung
cao 64. Một cách khác để tổ chức 32 bổ sung này là trong một cây song song, như
Hình 3.7 chương trình. Thay vì chờ thêm 32 lần, chúng tôi chỉ chờ nhật ký2 (32)
hoặc năm lần thêm 32 bit.
Trong thực tế, nhân có thể đi nhanh hơn sáu lần thêm vì sử dụng mang theo tiết
kiệm bổ sung (xem Mục A.6 trong Phụ lục A), và bởi vì nó dễ dàng đường ống một
thiết kế như vậy để có thể hỗ trợ nhiều bội số cùng một lúc (xem Chương 4).

Nhân với RISC-V


Để sản xuất một sản phẩm 64 bit được ký đúng hoặc không ký tên, RISC-V có
bốn hướng dẫn : nhân lên (mul), nhân cao (mulh), nhân cao không dấu (mulhu),
và nhân cao ký không ký (mulhsu). Để có được sản phẩm số nguyên 32 bit, lập
trình viên sử dụng mulĐể có được 32 bit trên của sản phẩm 64 bit, lập trình viên
sử dụng (.mulh) nếu cả hai toán hạng được ký, (mulhu) nếu cả hai toán hạng
không được ký, hoặc (mulhsu) nếu một toán hạng được ký và cái còn lại không
được ký.
Tóm tắt
Phần cứng nhân chỉ đơn giản là dịch chuyển và thêm vào, như xuất phát từ
phương pháp giấy và bút chì được học ở trường ngữ pháp. Trình biên dịch thậm
chí sử dụng hướng dẫn thay đổi
Sư đoàn 3.4 199

Mplier31 • Mcand Mplier30 • Mcand Mplier29 • Mcand Mplier28 • Mcand Mplier3 • Mcand Mplier2 • McandMplier1 • Mcand Mplier0 • Mcand

32 bit 32 bit ... 32 bit 32 bit

32 bit 32 bit

1 bit 1 bit ... ... ... 1 bit 1 bit

32 bit

... Sản Sản


Sản phẩm63 Sản phẩm62 Sản phẩm47..16 ... phẩm1 phẩm0

HÌNH 3.7 Phần cứng nhân nhanh. Thay vì sử dụng một bộ cộng 32 bit duy nhất 31 lần, phần cứng này sẽ bỏ qua vòng lặp để sử
dụng 31 người thêm và sau đó tổ chức chúng để giảm thiểu độ trễ.

cho phép nhân với lũy thừa 2. Với nhiều phần cứng hơn, chúng tôi có thể làm
thêm vào song song, và làm chúng nhanh hơn nhiều.

Phần mềm có thể sử dụng các hướng dẫn nhân cao để kiểm tra tràn từ phép nhân Giao diện
32 bit. Không có tràn cho phép nhân không dấu 32 bit nếu mulhuKết quả của con
số không. Không có tràn cho phép nhân được ký 32 bit nếu tất cả các bit trong
phần
mulhKết quả của s là bản sao của bit dấu hiệu của mulKết quả của người khác. cứng /
phần
mềm
Hãy bắt đầu với
một ví dụ về phân
chia dài bằng cách sử
3.4 Sư đoàn
dụng các số thập phân
để nhớ lại tên của các
Hoạt động đối ứng của bội số là phân chia, một hoạt động thậm chí ít thường
toán hạng và thuật
xuyên hơn và thậm chí là khó hiểu hơn. Nó thậm chí còn cung cấp cơ hội để thực
hiện một hoạt động không hợp lệ về mặt toán học: chia cho 0. toán phân chia từ
trường ngữ pháp. Cho
Chia et inra.
Tiếng Latin cho sự phân chia và cai trị của người Hồi giáo, câu châm ngôn chính trị cổ
xưa được trích dẫn bởi Machiavelli, 1532
cổ tức Một con số bị chia rẽ.
200 Chương 3 Số học cho máy tính

chia rẽ Một con số đó cổ các lý do tương tự như các lý do trong phần trước, chúng tôi giới hạn các chữ số
tức được chia cho.
thập phân chỉ là 0 hoặc 1. Ví dụ đang chia 1.001.010mười bằng 1000mười:
thương số Chính kết
quả của một bộ phận;
một số mà khi nhân với
ước số và thêm vào
phần còn lại sẽ tạo ra cổ
tức.
phần còn lại Các kết
quả thứ cấp của một bộ
phận; một số mà khi
thêm vào sản phẩm của
thương số và ước số tạo Chia hai toán hạng, được gọi là cổ tức và chia rẽvà kết quả, được gọi là
ra cổ tức. thương số, được kèm theo một kết quả thứ hai, được gọi là phần còn lạiĐây là
một cách khác để thể hiện mối quan hệ giữa các thành phần :.
Cổ tức = Quotient × Ly hôn + Còn lại

trong đó phần còn lại nhỏ hơn ước số. Đôi khi, các chương trình sử dụng hướng
dẫn phân chia chỉ đơn giản là để phần còn lại, bỏ qua thương số.
Thuật toán phân chia cơ bản từ trường ngữ pháp cố gắng xem số lượng lớn có
thể được trừ như thế nào, tạo ra một chữ số của thương số trên mỗi lần thử. Ví dụ
thập phân được chọn cẩn thận của chúng tôi chỉ sử dụng các số 0 và 1, do đó, nó
dễ dàng tìm ra số lần ước số đi vào phần cổ tức: nó có thể 0 lần hoặc 1 lần. Số
nhị phân chỉ chứa 0 hoặc 1, vì vậy phân chia nhị phân bị giới hạn trong hai lựa
chọn này, do đó đơn giản hóa phân chia nhị phân.
Hãy để cho rằng cả cổ tức và ước số đều dương và do đó thương số và phần
còn lại là không âm. Các toán hạng phân chia và cả hai kết quả là các giá trị 32
bit và chúng ta sẽ bỏ qua dấu hiệu ngay bây giờ.

Một thuật toán phân chia và phần cứng


Hình 3.8 hiển thị phần cứng để bắt chước thuật toán trường ngữ pháp của chúng
tôi. Chúng tôi bắt đầu với thanh ghi Quotient 32 bit được đặt thành 0. Mỗi lần lặp
của thuật toán cần di chuyển ước số sang một chữ số bên phải, vì vậy chúng tôi
bắt đầu với ước số được đặt ở nửa bên trái của thanh ghi Divisor 64 bit và dịch
chuyển đúng 1 bit mỗi bước để căn chỉnh cổ tức. Sổ đăng ký còn lại được khởi
tạo với cổ tức.
Hình 3.9 cho thấy ba bước của thuật toán phân chia đầu tiên. Không giống như
một con người, the máy tính không đủ thông minh để biết trước liệu ước số có nhỏ
hơn cổ tức hay không. Trước tiên, nó phải trừ đi ước số trong bước 1; hãy nhớ rằng
đây là cách chúng tôi thực hiện so sánh. Nếu kết quả là dương tính, ước số nhỏ hơn
hoặc bằng cổ tức, vì vậy chúng tôi tạo ra 1 trong thương số (bước 2a). Nếu kết quả
âm tính, bước tiếp theo là khôi phục giá trị ban đầu bằng cách thêm ước số trở lại
phần còn lại và tạo 0 trong thương số (bước 2b). Các ước được chuyển
Sư đoàn 3.4 201

Ly hôn
Chuyển sang phải

64 bit

Quotient
Chuyển sang trái
ALU 64 bit

32 bit

Còn lại Điều


khiển
Viết kiểm
tra
64 bit
Sự tinh chỉnh này
HÌNH 3.8 Phiên bản đầu tiên của phần cứng phân chia. Sổ đăng ký Divisor, ALU và Remainder giảm một nửa chiều
thanh ghi rộng tất cả 64 bit, chỉ có thanh ghi Quotient là 32 bit. Số chia 32 bit bắt đầu ở nửa bên trái của
thanh ghi Divisor và được dịch chuyển sang phải 1 bit mỗi lần lặp. Phần còn lại được khởi tạo với cổ tức.
rộng của trình bổ
Kiểm soát quyết định khi nào chuyển các thanh ghi Divisor và Quotient và khi nào sẽ ghi giá trị mới vào sung và các thanh
thanh ghi Remainder. ghi bằng cách chú ý

đúng, và sau đó chúng tôi lặp lại một lần nữa. Phần còn lại và thương số sẽ được
tìm thấy trong các thanh ghi tên của chúng sau khi lặp lại hoàn tất.

Một thuật toán phân chia

Sử dụng phiên bản 4 bit của thuật toán để lưu các trang, hãy thử chia 7mười
bằng 2mườihoặc 0000 0111hai vào năm 0010hai.

Hình 3.10 hiển thị giá trị của mỗi thanh ghi cho từng bước, với thương số là
3mười và phần còn lại 1mười Lưu ý rằng thử nghiệm ở bước 2 về việc phần
còn lại là dương hay âm chỉ đơn giản là kiểm tra xem bit dấu của thanh ghi
Remainder là 0 hay 1. Yêu cầu đáng ngạc nhiên của thuật toán này là nó cần.
n + 1 bước để có được thương số thích hợp và phần còn lại.
Thuật toán và phần cứng này có thể được tinh chỉnh để nhanh hơn và rẻ hơn. Việc
tăng tốc đến từ việc dịch chuyển các toán hạng và thương số đồng thời với phép trừ.
VÍ DỤ

TRẢ LỜI
202 Chương 3 Số học cho máy tính

Khởi đầu

1. Trừ đăng ký Divisor từ


Còn lại đăng ký và đặt
kết quả trong đăng ký Remainder

Còn lại  0 Phần còn lại <0


Kiểm tra còn lại

2a. Chuyển thanh ghi Quotient sang trái, 2b. Khôi phục giá trị ban đầu bằng cách
đặt bit ngoài cùng bên phải mới thêm thanh ghi Divisor vào thanh ghi
thành 1 Remainder và đặt tổng trong thanh ghi
Remainder. Đồng thời chuyển thanh ghi
Quotient sang trái, đặt bit mới ít quan
trọng nhất thành 0

3. Chuyển số đăng ký Divisor ngay 1 bit

Không: <65 lần lặp lại


Lần lặp lại thứ
33?

Có: 65 lần lặp lại

Làm xong

HÌNH 3.9 Một thuật toán phân chia, sử dụng phần cứng trong Hình 3.8.Nếu phần còn lại là tích
cực , ước đã đi vào cổ tức, vì vậy bước 2a tạo ra 1 trong thương số. Phần còn lại âm sau bước 1 có nghĩa là
ước số không đi vào cổ tức, do đó bước 2b tạo ra 0 trong thương số và thêm ước số vào phần còn lại, do đó
đảo ngược phép trừ của bước 1. Sự thay đổi cuối cùng, trong bước 3, sắp xếp ước số đúng, liên quan đến cổ
tức cho lần lặp tiếp theo. Các bước này được lặp lại 33 lần.
Sư đoàn 3.4 203

HÌNH 3.10 Ví dụ phân chia sử dụng thuật toán trong Hình 3.9.Các bit kiểm tra để xác định bước
tiếp theo được khoanh tròn màu.

nơi có các phần không sử dụng của thanh ghi và người thêm. Hình 3.11 cho thấy
phần cứng sửa đổi.

Bộ phận đã ký
Cho đến nay, chúng tôi đã bỏ qua các số đã ký trong bộ phận. Giải pháp đơn giản
nhất là ghi nhớ các dấu hiệu của ước số và cổ tức và sau đó phủ nhận thương số
nếu các dấu hiệu không đồng ý.

Xây dựng: Một phức tạp của phân chia đã ký là chúng ta cũng phải thiết lập dấu
hiệu của phần còn lại. Hãy nhớ rằng phương trình sau phải luôn giữ :

Cổ tức 5 Quotient 3 Ly hôn 1 Còn lại

Để hiểu cách đặt dấu hiệu của phần còn lại, hãy xem ví dụ về việc phân chia tất cả
các kết hợp của ±7mười bởi ±2mườiTrường hợp đầu tiên rất dễ :.

17 4 12: Quotient 5 13 , 1Còn lại 5 11

Kiểm tra kết quả :

175 3321(11)5611
204 Chương 3 Số học cho máy tính

Ly hôn
32 bit

ALU 32 bit

Chuyển
sang phải
Chuyển Điều
Còn lại sang trái khiển
Viết kiểm tra
64 bit

HÌNH 3.11 Một phiên bản cải tiến của phần cứng phân chia. Sổ đăng ký Divisor, ALU, và
Thanh ghi quotient đều rộng 32 bit. So với Hình 3.8, các thanh ghi ALU và Divisor được giảm một nửa và
phần còn lại được dịch sang trái. Phiên bản này cũng kết hợp thanh ghi Quotient với nửa bên phải của
thanh ghi Remainder. Như trong Hình 3.5, thanh ghi Remainder đã tăng lên 65 bit để đảm bảo việc thực
hiện ra khỏi bộ cộng không bị mất.

Nếu chúng ta thay đổi dấu hiệu của cổ tức, thương số cũng phải thay đổi :

27 4 12: Quotient 5 23

Viết lại công thức cơ bản của chúng tôi để tính phần còn lại :

Còn lại 5 (Cổ tức 2 Quotient 3 Ly hôn) 5 27 2 (23x 1 2)


5272(26) =21

Vì thế,

27 4 12: Quotient 5 23, Phần còn lại 5 21

Kiểm tra lại kết quả :

27523321(21)52621
Sư đoàn 3.4 205

Lý do câu trả lời không phải là một thương số -4 và phần còn lại của +1, cũng phù
hợp với công thức này, là giá trị tuyệt đối của thương số sau đó sẽ thay đổi tùy thuộc
vào dấu hiệu của cổ tức và ước số! Rõ ràng, nếu

(x y) ( x) y

lập trình sẽ là một thách thức thậm chí còn lớn hơn. Hành vi bất thường này được
tránh bằng cách tuân theo quy tắc rằng cổ tức và phần còn lại phải có dấu hiệu giống
hệt nhau, bất kể dấu hiệu của ước số và thương số là gì.
Chúng tôi tính toán các kết hợp khác bằng cách tuân theo cùng một quy tắc :

17 4 22: Quotient 5 23, Phần còn lại 5 11


27 4 22: Quotient 5 13, Remainder 5 21

Do đó, thuật toán phân chia được ký chính xác phủ nhận thương số nếu các dấu hiệu
của toán hạng ngược lại và làm cho dấu hiệu của phần còn lại không khớp với cổ tức.

Sư đoàn nhanh hơn


Định luật Moore Moore áp dụng cho phần cứng phân chia cũng như nhân, vì vậy
chúng tôi muốn có thể tăng tốc độ phân chia bằng cách ném phần cứng vào nó.
Chúng tôi đã sử dụng nhiều bộ cộng để tăng tốc độ nhân lên, nhưng chúng tôi
không thể thực hiện cùng một thủ thuật để phân chia. Lý do là chúng ta cần biết
dấu hiệu của sự khác biệt trước khi chúng ta có thể thực hiện bước tiếp theo của
thuật toán, trong khi với phép nhân, chúng ta có thể tính được 32 sản phẩm một
phần ngay lập tức.
Có các kỹ thuật để tạo ra nhiều hơn một bit thương số mỗi bước. Các Bộ phận
SRT kỹ thuật cố gắng dự đoán một số bit thương số mỗi bước, sử dụng tra cứu
bảng dựa trên các bit trên của cổ tức và phần còn lại. Nó dựa vào các bước tiếp
theo để sửa các dự đoán sai. Một giá trị điển hình ngày nay là 4 bit. Chìa khóa là
đoán giá trị để trừ. Với phân chia nhị phân, chỉ có một lựa chọn duy nhất. Các
thuật toán này sử dụng 6 bit từ phần còn lại và 4 bit từ ước số để lập chỉ mục một
bảng xác định dự đoán cho từng bước.
Độ chính xác của phương pháp nhanh này phụ thuộc vào việc có các giá trị
phù hợp trong bảng tra cứu. Các Ngụy biện trên trang 239 in Mục 3.8 cho thấy
những gì có thể xảy ra nếu bảng không chính xác.
206 Chương 3 Số học cho máy tính

Chia trong RISC-V


Bạn có thể đã quan sát thấy rằng phần cứng tuần tự tương tự có thể được sử dụng
cho cả nhân và chia Hình 3.5 và 3.11Yêu cầu duy nhất là một thanh ghi 64 bit có
thể dịch chuyển sang trái hoặc phải và ALU 32 bit có thêm hoặc trừ.
Để xử lý cả số nguyên đã ký và số nguyên không dấu, RISC-V có hai hướng
dẫn để phân chia và hai hướng dẫn cho phần còn lại : chia (div), chia không dấu
(divu), phần còn lại (rem), và phần còn lại không dấu (remu).

Tóm tắt
Hỗ trợ phần cứng chung để nhân và chia cho phép RISC-V cung cấp một cặp
thanh ghi 32 bit duy nhất được sử dụng cả để nhân và chia. Chúng tôi tăng tốc
phân chia bằng cách dự đoán nhiều bit thương số và sau đó sửa chữa các dự đoán
sai sau này. Hình 3.12 tóm tắt các cải tiến cho tập lệnh RISC-V cho hai phần
cuối.

Giao diện Hướng dẫn phân chia RISC-V bỏ qua tràn, vì vậy phần mềm phải xác định xem
thương số có quá lớn hay không. Ngoài tràn, phân chia cũng có thể dẫn đến một
phần phép tính không chính xác: chia cho 0. Một số máy tính phân biệt hai sự kiện dị
cứng / thường này. Phần mềm RISC-V phải kiểm tra ước số để khám phá sự phân chia
phần theo 0 cũng như tràn.
mềm

Xây dựng: Một thuật toán tuần tự thậm chí nhanh hơn Hình 3.9 không ngay lập tức
thêm ước số trở lại nếu phần còn lại là âm. Nó đơn giản thêm cổ tức cho phần còn lại
được thay đổi trong bước sau, kể từ (r + d) × 2 - d = r - 2 + d × 2 - d
= r × 2 + dĐiều này. không quan tâm thuật toán phân chia, mất một chu kỳ đồng hồ mỗi
bước, là khám phá thêm trong các bài tập; thuật toán trong Hình 3.9 được gọi là Phục hồi
phân chia. Một thuật toán thứ ba không lưu lại kết quả của phép trừ nếu nó âm được gọi là
a không phù hợp thuật toán phân chia. Nó trung bình ít hơn một phần ba các phép toán số
học.
3.4 Sư đoàn 207

Kiến trúc lõi 3.12 RISC-V. Ngôn ngữ máy RISC-V được liệt kê trong Thẻ dữ liệu tham chiếu RISC-V tại trước cuốn sách
này.
208 Chương 3 Số học cho máy tính

3.5 Điểm nổi

Tốc độ không đưa bạn Vượt ra ngoài các số nguyên đã ký và không dấu, các ngôn ngữ lập trình hỗ trợ
đến đâu nếu bạn đi sai các số có phân số, được gọi thực tế trong toán học. Dưới đây là một số ví dụ về
đường. thực tế :
Tục ngữ Mỹ 3.14159265 ... mười (pi)
2.71828 ... mười (e)
0,00000001mười hoặc 1.0mười × 10−9 (giây trong một nano giây)
3.155.760.000mười hoặc 3.15576mười × 109 (giây trong một thế kỷ điển hình)
ký hiệu khoa học A Lưu ý rằng trong trường hợp cuối cùng, số didn đại diện cho một phần nhỏ, nhưng
ký hiệu hiển thị các số nó lớn hơn chúng ta có thể biểu thị bằng số nguyên được ký 32 bit. Ký hiệu thay
có một chữ số ở bên thế cho hai số cuối được gọi ký hiệu khoa học, có một chữ số ở bên trái dấu thập
trái dấu thập phân. phân. Một số trong ký hiệu khoa học không có số 0 đứng đầu được gọi là a bình
bình thường hóa Một thường hóa số, đó là cách thông thường để viết nó. Ví dụ: 1.0mười × 10−9 là trong
con số trong ký hiệu dấu ký hiệu khoa học bình thường hóa, nhưng 0,1mười × 10-8 và 10.0mười × 10-10
phẩy động không có số 0 không phải.
đứng đầu. Giống như chúng ta có thể hiển thị số thập phân trong ký hiệu khoa học,
chúng ta cũng có thể hiển thị số nhị phân trong ký hiệu khoa học :

1.0hai 3 221

Để giữ một số nhị phân ở dạng chuẩn hóa, chúng ta cần một cơ sở mà chúng ta có
thể tăng hoặc giảm chính xác số bit mà số phải được dịch để có một chữ số khác ở
bên trái dấu thập phân. Chỉ có một cơ sở 2 đáp ứng nhu cầu của chúng tôi. Vì cơ
sở không phải là 10, chúng tôi cũng cần một tên mới cho dấu thập phân; nhị phân
điểm sẽ làm tốt.
nổi Số học máy tính hỗ trợ các số như vậy được gọi điểm nổi bởi vì nó đại diện
điểm Máy vi tính số cho các số trong đó điểm nhị phân không cố định, vì nó dành cho các số nguyên.
học đại diện cho các số
trong đó điểm nhị phân
Ngôn ngữ lập trình C sử dụng tên phao cho những con số như vậy. Cũng giống
không cố định. như trong ký hiệu khoa học, các số được biểu diễn dưới dạng một chữ số khác
không ở bên trái của điểm nhị phân. Trong nhị phân, hình thức là

1.xxxxxxxxxhai 3 2yyyy

(Mặc dù máy tính đại diện cho số mũ trong cơ sở 2 cũng như phần còn lại của số,
để đơn giản hóa ký hiệu chúng ta hiển thị số mũ theo số thập phân.)
Một ký hiệu khoa học tiêu chuẩn cho thực tế ở dạng chuẩn hóa cung cấp ba lợi
thế. Nó đơn giản hóa việc trao đổi dữ liệu bao gồm các số dấu phẩy động; nó đơn
giản hóa các thuật toán số học dấu phẩy động để biết rằng các số sẽ
3.5 Điểm nổi 209

luôn ở dạng này; và nó làm tăng độ chính xác của các số có thể được lưu trữ
trong một từ, vì các chữ số thực ở bên phải của điểm nhị phân thay thế các số 0
đứng đầu không cần thiết.

Đại diện điểm nổi


Một nhà thiết kế của một đại diện điểm nổi phải tìm một sự thỏa hiệp giữa kích phân số Giá trị, thường
thước của phân số và kích thước của số mũ, bởi vì một kích thước từ cố định có nằm trong khoảng từ 0
nghĩa là bạn phải lấy một chút từ cái này để cho cái kia một chút. Sự đánh đổi này đến 1, được đặt trong
trường phân số. Các phần
là giữa độ chính xác và phạm vi: tăng kích thước của phân số giúp tăng độ chính
cũng được gọi là thần
xác của phân số, trong khi tăng kích thước của số mũ làm tăng phạm vi số có thể chú.
được biểu diễn. Như hướng dẫn thiết kế của chúng tôi từ Chương 2 nhắc nhở
chúng tôi, thiết kế tốt đòi hỏi sự thỏa hiệp tốt. số mũ Trong hệ thống
biểu diễn số của số học
Số dấu phẩy động thường là bội số của kích thước của một từ. Biểu diễn của
dấu phẩy động, giá trị
số dấu phẩy động RISC-V được hiển thị bên dưới, trong đó S là dấu hiệu của số được đặt trong trường số
dấu phẩy động (1 có nghĩa là âm) , số mũ là giá trị của trường số mũ 8 bit (bao mũ.
gồm cả dấu của số mũ) và phân số là số 23 bit. Khi chúng tôi nhớ lại từ Chương
2, đại diện này là ký tên và cường độ, vì dấu hiệu là một bit riêng biệt với phần
còn lại của số.

Nói chung, số dấu phẩy động có dạng

(21)S 3 F 32E
F liên quan đến giá trị trong trường phân số và E liên quan đến giá trị trong
trường số mũ; mối quan hệ chính xác với các trường này sẽ được nêu ra sớm.
(Chúng tôi sẽ sớm thấy rằng RISC-V làm điều gì đó tinh vi hơn một chút.)
Các kích thước được chọn của số mũ và phân số này cung cấp cho số học máy
tính RISC-V một phạm vi phi thường. Phân số gần như nhỏ bằng 2.0mười × 10-38 tràn (điểm nổi) Một tình
và số lượng lớn gần bằng 2.0mười × 1038 có thể được đại diện trong một máy tính. huống trong mà một số mũ
Than ôi, khác biệt với vô hạn, vì vậy vẫn có thể các con số quá lớn. Do đó, các dương trở nên quá lớn để
ngoại lệ tràn có thể xảy ra trong số học dấu phẩy động cũng như số học số phù hợp với trường số mũ.
nguyên. Lưu ý rằng tràn ở đây có nghĩa là số mũ quá lớn để được thể hiện trong
trường số mũ.
Điểm nổi cũng cung cấp một loại sự kiện đặc biệt mới. Giống như các lập trình
tràn (điểm nổi) Một
viên sẽ muốn biết khi nào họ đã tính một số quá lớn để được đại diện, họ sẽ muốn
tình huống trong đó một
biết liệu phần nonzero mà họ đang tính toán có trở nên nhỏ đến mức không thể số mũ âm trở nên quá lớn
biểu thị được hay không; một trong hai sự kiện có thể dẫn đến một chương trình để phù hợp với trường số
đưa ra câu trả lời không chính xác. Để phân biệt với tràn, chúng tôi gọi sự kiện mũ.
này trànTình huống này xảy ra khi số mũ âm quá lớn để phù hợp với trường số
mũ.
210 Chương 3 Số học cho máy tính

độ chính xác gấp Một cách để giảm cơ hội tràn hoặc tràn là cung cấp một định dạng khác có số
đôi mũ lớn hơn. Trong C, số này được gọi gấp đôivà hoạt động trên đôi được gọi độ
Giá trị dấu phẩy động chính xác gấp đôi số học dấu phẩy động; độ chính xác duy nhất dấu phẩy động
được biểu thị bằng ô
là tên của định dạng trước đó.
kép 64 bit.
Việc biểu diễn số dấu phẩy động chính xác kép có một ô kép RISC-V, như được hiển
độ chính xác duy
thị bên dưới, trong đó S vẫn là dấu hiệu của số , số mũ là giá trị của trường số mũ 11 bit
nhất
Một giá trị dấu phẩy và phân số là số 52 bit trong trường phân số.
động được biểu thị
bằng một từ 32 bit.

Độ chính xác kép RISC-V cho phép các số nhỏ gần bằng 2.0 mười × 10-308 và gần như
lớn bằng 2.0mười × 10308Mặc dù độ chính xác kép làm tăng phạm vi số mũ, nhưng lợi thế
chính của nó là độ chính xác cao hơn vì phần lớn hơn nhiều.

ngoại lệ Cũng thế gọi Ngoại lệ và gián đoạn


ngắt lờiMột sự kiện đột Điều gì sẽ xảy ra khi tràn hoặc tràn để cho người dùng biết rằng đã xảy ra sự cố? Một
xuất làm gián đoạn việc số máy tính báo hiệu những sự kiện này bằng cách nâng cao một ngoại lệ, đôi khi
thực hiện chương trình; được gọi là an ngắt lờiMột ngoại lệ hoặc gián đoạn về cơ bản là một cuộc gọi thủ tục
được sử dụng để phát
đột xuất. Địa chỉ của hướng dẫn tràn được lưu trong một thanh ghi và máy tính nhảy
hiện tràn, ví dụ.
đến một địa chỉ được xác định trước để gọi thói quen thích hợp cho ngoại lệ đó. Địa
ngắt lời Một ngoại lệ chỉ bị gián đoạn được lưu để trong một số tình huống, chương trình có thể tiếp tục
xuất phát từ bên ngoài bộ
sau khi mã sửa lỗi được thực thi. (.Mục 4.9 bao gồm các ngoại lệ chi tiết hơn;
xử lý. (Một số kiến trúc
Chương 5 mô tả các tình huống khác khi xảy ra ngoại lệ và gián đoạn.) Máy tính
sử dụng thuật ngữ này
ngắt lời cho tất cả các RISC-V làm không phải nêu một ngoại lệ về tràn hoặc tràn; thay vào đó, phần mềm
trường hợp ngoại lệ.) có thể đọc kiểm soát điểm nổi và đăng ký trạng thái (fcsr) để kiểm tra xem tràn hay
tràn đã xảy ra.

Tiêu chuẩn nổi của IEEE 754


Các định dạng này vượt ra ngoài RISC-V. Họ là một phần của Điểm nổi 754 của
IEEE Tiêu chuẩn, được tìm thấy trong hầu hết mọi máy tính được phát minh từ
năm 1980. Tiêu chuẩn này có cải thiện đáng kể cả việc dễ dàng chuyển các
chương trình dấu phẩy động và chất lượng số học máy tính.
Để đóng gói nhiều bit hơn vào số, IEEE 754 làm cho 1 bit số nhị phân được chuẩn
hóa hàng đầu ẩn. Do đó, số thực sự dài 24 bit với độ chính xác đơn (ngụ ý 1 và phân
số 23 bit) và dài 53 bit với độ chính xác kép (1 + 52). Để chính xác, chúng tôi sử
dụng thuật ngữ có ý nghĩa và để đại diện cho 24- hoặc
3.5 Điểm nổi 211

Số 53 bit là 1 cộng với phân số và phân số khi chúng tôi có nghĩa là số 23 hoặc
52 bit. Vì 0 không có số 1 đứng đầu, nên nó được đưa ra giá trị số mũ dành riêng
0 để phần cứng won won đính kèm số 1 hàng đầu cho nó.
Do đó 00 00 00hai đại diện cho 0; biểu diễn của phần còn lại của các số sử
dụng biểu mẫu từ trước với ẩn 1 được thêm vào :

(21)S 3 (1 1 Phân số) 3 2E

trong đó các bit của phân số biểu thị một số từ 0 đến 1 và E chỉ định giá trị trong
trường số mũ, sẽ được cung cấp chi tiết trong thời gian ngắn. Nếu chúng ta đánh
số các bit của phân số từ trái sang phảis1, s2, s3, ..., sau đó giá trị là

(21)S 3 (1 1 (s1 3 221 ) 1 (s2 3 222 ) 1 (s3 3 223 ) 1 (s4 3 224 ) 1 )32
E

Hình 3.13 hiển thị các mã hóa của các số dấu phẩy động IEEE 754. Khác các
tính năng của IEEE 754 là các biểu tượng đặc biệt để thể hiện các sự kiện bất
thường. Ví dụ: thay vì ngắt trên chia cho 0, phần mềm có thể đặt kết quả thành
một mẫu bit đại diện cho + hoặc; số mũ lớn nhất được dành riêng cho các ký hiệu
đặc biệt này. Khi lập trình viên in kết quả, chương trình sẽ xuất ra một biểu
tượng vô cực. (Đối với các đào tạo toán học, mục đích của vô hạn là hình thành
sự đóng cửa tôpô của thực tế.)
IEEE 754 thậm chí có một biểu tượng cho kết quả của các hoạt động không
hợp lệ, chẳng hạn như 0/0 hoặc trừ đi vô cực từ vô cực. Biểu tượng này là NaN,
cho Không phải sốMục đích của NaN là cho phép các lập trình viên hoãn một số
bài kiểm tra và quyết định đến một thời gian sau trong chương trình khi chúng
thuận tiện.
Các nhà thiết kế của IEEE 754 cũng muốn một biểu diễn dấu phẩy động có thể
dễ dàng xử lý bằng các so sánh số nguyên, đặc biệt là để sắp xếp. Mong muốn
này là lý do tại sao dấu hiệu ở bit quan trọng nhất, cho phép kiểm tra nhanh ít hơn,
lớn hơn hoặc bằng 0. (Nó phức tạp hơn một chút so với một loại số nguyên đơn
giản, vì ký hiệu này về cơ bản là ký hiệu và cường độ chứ không phải là hai bổ
sung.)

HÌNH 3.13 Mã hóa IEEE 754 của các số dấu phẩy động. Một bit dấu hiệu riêng biệt xác định ký
tên. Số lượng không chuẩn hóa được mô tả trong Xây dựng trên trang 233. Thông tin này cũng được tìm
thấy trong Cột 4 của Thẻ dữ liệu tham chiếu RISC-V ở mặt trước của cuốn sách này.
212 Chương 3 Số học cho máy tính

Đặt số mũ trước ý nghĩa và cũng đơn giản hóa việc sắp xếp các số dấu phẩy
động bằng các hướng dẫn so sánh số nguyên, vì các số có số mũ lớn hơn trông
lớn hơn các số có số mũ nhỏ hơn, miễn là cả hai số mũ đều có cùng dấu.
Số mũ âm đặt ra một thách thức để sắp xếp đơn giản. Nếu chúng ta sử dụng
hai bổ sung hoặc bất kỳ ký hiệu nào khác trong đó số mũ âm có số 1 trong bit
quan trọng nhất của trường số mũ, số mũ âm sẽ trông giống như một số lớn. Ví
dụ: 1.0hai × 2-1 sẽ được thể hiện trong một độ chính xác duy nhất như

(Hãy nhớ rằng top 1 là ngầm định trong ý nghĩa.) Giá trị 1.0hai × 2+1 sẽ trông
giống như số nhị phân nhỏ hơn

Do đó, ký hiệu mong muốn phải đại diện cho số mũ âm nhất là


00 ... 00hai và tích cực nhất là 11 ... 11hai Quy ước này được gọi. thiên vị ký hiệu,
với độ lệch là số được trừ từ bình thường, không dấu đại diện để xác định giá trị
thực.
IEEE 754 sử dụng sai lệch 127 cho độ chính xác đơn, do đó, số mũ −1 được
biểu thị bằng mẫu bit của giá trị −1 + 127mườihoặc 126mười = 0111 1110haivà +1
được biểu thị bằng 1 + 127 hoặc 128mười = 1000 0000haiĐộ lệch số mũ cho độ
chính xác kép là 1023. Số mũ thiên vị có nghĩa là giá trị được biểu thị bằng số
dấu phẩy động thực sự là.

(21)S 3 (1 1 Phân số) 3 2(Xu hướng lũy thừa)

Phạm vi của các số chính xác duy nhất sau đó là từ nhỏ như

61.000000000000000000000000hai 3 22126

lớn như

61.111111111111111111111111111hai 3 21127 .

Hãy để chứng minh.


3.5 Điểm nổi 213

Hiển thị biểu diễn nhị phân của IEEE 754 của số −0,75mười trong độ chính VÍ DỤ
xác đơn và kép.

Số −0,75mười cũng là TRẢ LỜI


23/4mười hoặc là 2 3/22mười

Nó cũng được đại diện bởi phần nhị phân


11 / 22 hoặc là 0,11
2 hai mười 2 hai

Trong ký hiệu khoa học, giá trị là

20 .11hai 3 20

và trong ký hiệu khoa học bình thường hóa, nó là

21.1hai 3 221

S
Đại diện chung cho một số chính xác duy nhất là (21) 3 (1 1

(Số mũ2127)
Phân số) 3 2

1
Trừ đi độ lệch 127 từ số mũ −1.1hai × 2-1 sản lượng (21) 3 (1

(1262127)
1 .1000 0000 0000 0000 0000 000hai ) 3 2

Biểu diễn nhị phân chính xác duy nhất của −0,75mười là sau đó

Các đại diện chính xác kép là


(21)1 3 (1 1.1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 hai ) 3 2(10 2221023)

Bây giờ hãy để thử đi theo hướng khác.


214 Chương 3 Số học cho máy tính

Chuyển đổi Binary thành Điểm nổi thập phân


VÍ DỤ
Số thập phân nào mà phao chính xác duy nhất này đại diện?

Bit ký hiệu là 1, trường số mũ chứa 129 và trường phân số chứa 1 × 2−2 = 1/4
TRẢ LỜI
hoặc 0,25. Sử dụng phương trình cơ bản ,

(21)S 3 (1 1 Phân số) 3 2(Số mũ2 Xu hướng) 5 (21)1 3 (1 1 0,25) 3 2(1292127)


52131.25322
521.25 3 4
525.0

Trong một vài phần phụ tiếp theo, chúng tôi sẽ đưa ra các thuật toán để cộng
và nhân điểm nổi. Về cốt lõi, họ sử dụng các phép toán số nguyên tương ứng trên
các ý nghĩa, nhưng việc ghi sổ thêm là cần thiết để xử lý các số mũ và bình
thường hóa kết quả. Đầu tiên chúng tôi đưa ra một dẫn xuất trực quan của các
thuật toán theo số thập phân và sau đó đưa ra một phiên bản nhị phân chi tiết hơn
trong các hình.

Theo hướng dẫn của IEEE, ủy ban IEEE 754 đã được cải tổ 20 năm sau tiêu chuẩn
để xem những thay đổi nào, nếu có, nên được thực hiện. Tiêu chuẩn sửa đổi IEEE
754-2008 bao gồm gần như tất cả các IEEE 754-1985 và thêm định dạng 16 bit (một
nửa chính xác) và định dạng 128 bit (độ chính xác tứ giác). Độ chính xác một nửa có
dấu 1 bit, số mũ 5 bit (với độ lệch 15) và phân số 10 bit. Độ chính xác gấp bốn lần có
dấu 1 bit, số mũ 15 bit (với độ lệch 262143) và phân số 112 bit. Tiêu chuẩn sửa đổi
cũng bổ sung số học dấu phẩy động thập phân.

Xây dựng: Trong một nỗ lực để tăng phạm vi mà không loại bỏ bit khỏi có ý nghĩa
và, một số máy tính trước tiêu chuẩn IEEE 754 đã sử dụng một cơ sở khác ngoài 2.
Ví dụ: máy tính lớn IBM 360 và 370 đã sử dụng cơ sở 16. Kể từ khi thay đổi số mũ
của IBM bằng một phương tiện chuyển đổi ý nghĩa và 4 bit, số cơ sở 16 số cơ sở
bình thường hóa có thể có tối đa 3 bit hàng đầu của 0 giây! Do đó, các chữ số thập
lục phân có nghĩa là phải bỏ tối đa 3 bit khỏi ý nghĩa và dẫn đến các vấn đề đáng
ngạc nhiên về độ chính xác của số học dấu phẩy động. Các máy tính lớn của IBM
hiện hỗ trợ IEEE 754 cũng như định dạng hex cũ.
3.5 Điểm nổi 215

Bổ sung điểm nổi


Hãy để thêm các số trong ký hiệu khoa học bằng tay để minh họa các vấn đề trong
phép cộng dấu phẩy động: 9,999mười × 101 + 1.610mười × 10-1Giả sử rằng chúng ta
chỉ có thể lưu trữ bốn chữ số thập phân của ý nghĩa và hai chữ số thập phân của số
mũ.
Bước 1. Để có thể thêm các số này đúng cách, chúng ta phải căn chỉnh dấu thập
phân của số có số mũ nhỏ hơn. Do đó, chúng ta cần một dạng số nhỏ hơn,
1.610mười × 10-1, phù hợp với số mũ lớn hơn. Chúng tôi có được điều này
bằng cách quan sát rằng có nhiều biểu diễn của một số dấu phẩy động
không chuẩn hóa trong ký hiệu khoa học :

1.610mười 3 1021 5 0.1610mười 3 100 5 0,01610mười 3101

Số bên phải là phiên bản chúng tôi mong muốn, vì số mũ của nó phù hợp
với số mũ của số lớn hơn, 9,999mười × 101Do đó, bước đầu tiên chuyển ý
nghĩa của số nhỏ hơn sang phải cho đến khi số mũ được sửa của nó khớp
với số lượng lớn hơn. Nhưng chúng ta chỉ có thể đại diện cho bốn chữ số
thập phân vì vậy, sau khi dịch chuyển, con số thực sự là.

0,016 3101
Bước 2. Tiếp đến là sự bổ sung của các ý nghĩa :
9,999mười
1 0,016mười
10.015mười
1
Tổng là 10.015mười × 10 .
Bước 3. Tổng này không có trong ký hiệu khoa học chuẩn hóa, vì vậy chúng
ta cần điều chỉnh nó :
10.015mười 3 101 5 1.0015mười 3102

Sau khi bổ sung, chúng tôi có thể phải dịch số tiền để đưa nó vào
dạng chuẩn hóa, điều chỉnh số mũ một cách thích hợp. Ví dụ này cho
thấy dịch chuyển sang phải, nhưng nếu một số dương và số còn lại
âm, thì tổng số đó có thể có nhiều số 0 đứng đầu, yêu cầu dịch
chuyển trái. Bất cứ khi nào số mũ được tăng hoặc giảm, chúng ta
phải kiểm tra tràn hoặc tràn ra, đó là, chúng ta phải đảm bảo rằng số
mũ vẫn phù hợp với trường của nó.
Bước 4. Vì chúng tôi cho rằng ý nghĩa và có thể chỉ dài bốn chữ số (không
bao gồm dấu), chúng tôi phải làm tròn số. Trong thuật toán trường
ngữ pháp của chúng tôi, các quy tắc cắt bớt số nếu chữ số ở bên phải
của điểm mong muốn nằm trong khoảng từ 0 đến 4 và thêm 1 vào
chữ số nếu số bên phải nằm trong khoảng từ 5 đến 9. Số
1.0015mười 3102
216 Chương 3 Số học cho máy tính

được làm tròn thành bốn chữ số trong ý nghĩa và


1.002mười 3102

vì chữ số thứ tư ở bên phải dấu thập phân nằm trong khoảng từ 5
đến 9. Lưu ý rằng nếu chúng ta gặp xui xẻo khi làm tròn, chẳng hạn
như thêm 1 vào chuỗi 9, tổng có thể không còn được bình thường
hóa và chúng ta sẽ cần thực hiện lại bước 3.

Hình 3.14 hiển thị thuật toán cho phép cộng dấu phẩy động nhị phân theo sau này ví
dụ thập phân. Bước 1 và 2 tương tự như ví dụ vừa thảo luận: điều chỉnh ý nghĩa của số
với số mũ nhỏ hơn và sau đó thêm hai ý nghĩa. Bước 3 bình thường hóa kết quả, buộc
kiểm tra tràn hoặc tràn. Thử nghiệm cho tràn và tràn trong bước 3 phụ thuộc vào độ chính
xác của các toán hạng. Hãy nhớ lại rằng mẫu của tất cả 0 bit trong số mũ được dành riêng
và được sử dụng cho biểu diễn dấu phẩy động bằng 0. Ngoài ra, mẫu của tất cả 1 bit trong
số mũ được dành riêng để chỉ ra các giá trị và tình huống nằm ngoài phạm vi của các số
dấu phẩy động thông thường (xem phần Xây dựng trên trang 233). Đối với ví dụ dưới đây,
hãy nhớ rằng đối với độ chính xác đơn lẻ, số mũ tối đa là 127 và số mũ tối thiểu là −126.

Bổ sung điểm nổi nhị phân


VÍ DỤ Hãy thử thêm các số 0,5mười và −0,4375mười trong nhị phân sử dụng thuật
toán trong Hình 3.14.

Trước tiên, hãy nhìn vào phiên bản nhị phân của hai số trong ký hiệu khoa
TRẢ LỜI học được chuẩn hóa, giả sử rằng chúng tôi giữ 4 bit chính xác :

0,5mười 5 1/2mười 5 1/21mười


5 0,1hai 5 0,1hai 3 2 0 5 1.000hai 3 221
20,4375mư
ời 5 27/16mười 5 27/2mười4
5 20,0111hai 5 20,0111hai 3 2 0 5 21.110hai 3 222
Bây giờ chúng tôi làm theo thuật toán :
Bước 1. Ý nghĩa và số có số mũ nhỏ hơn (−1.11hai × 2−2)
được dịch chuyển ngay cho đến khi số mũ của nó khớp với số lớn
hơn :
21.110hai 3 222 5 20.111hai 3 221

Bước 2. Thêm ý nghĩa :


1.000hai 3 221 1(20 .111hai 3 221 ) 5 0,001hai 3 221
3.5 Điểm nổi 217

Khởi đầu

1. So sánh số mũ của hai số; chuyển số nhỏ


hơn sang phải cho đến khi số mũ của nó
khớp với số mũ lớn hơn

2. Thêm ý nghĩa

3. Chuẩn hóa tổng, chuyển sang phải và tăng


số mũ hoặc dịch chuyển sang trái
và làm giảm số mũ

Tràn hoặc Đúng


tràn?
Khôn
g Ngoại lệ

4. Làm tròn ý nghĩa và số bit thích hợp

Không
Vẫn bình thường hóa?

Đúng

Làm xong

HÌNH 3.14 Bổ sung điểm nổi. Đường dẫn bình thường là thực hiện các bước 3 và 4 một lần, nhưng
nếu làm tròn khiến tổng số không được chuẩn hóa, chúng ta phải lặp lại bước 3.
218 Chương 3 Số học cho máy tính

Bước 3. Chuẩn hóa tổng, kiểm tra tràn hoặc tràn :

0,001hai 3 221 5 0,010hai 3 222 5 0.100hai 3 223

5 1.000hai 3 224
Kể từ 127 ≥ −4 ≥ −126, không có tràn hoặc tràn. (Số mũ thiên vị sẽ
là −4 + 127 hoặc 123, nằm trong khoảng từ 1 đến 254, số mũ thiên
vị nhỏ nhất và lớn nhất không được kiểm soát.)
Bước 4. Làm tròn số tiền :
1.000hai 3 224

Tổng đã khớp chính xác trong 4 bit, do đó không có thay đổi đối với
các bit do làm tròn.
Tổng này là sau
đó
1.000 3224 5 0,0001000 5 0,0001
hai hai hai
5
4
5 1/2mười 5 1/16mười 0,0625mười
Tổng này là những gì chúng ta mong đợi từ việc thêm 0,5mười đến
−0,4375mười.

Nhiều máy tính dành phần cứng để chạy các hoạt động dấu phẩy động càng nhanh càng tốt.
Hình 3.15 phác thảo tổ chức cơ bản của phần cứng để thêm điểm nổi.

Phép nhân điểm nổi


Bây giờ chúng tôi đã giải thích việc cộng điểm nổi, hãy thử nhân điểm nổi.
Chúng ta bắt đầu bằng cách nhân số thập phân trong ký hiệu khoa học bằng tay:
1.110mười × 1010 × 9.200mười × 10−5Giả sử rằng chúng ta chỉ có thể lưu trữ bốn
chữ số của ý nghĩa và hai chữ số của số mũ.
Bước 1. Không giống như bổ sung, chúng tôi tính toán số mũ của sản phẩm
bằng cách thêm số mũ của các toán hạng lại với nhau :
Số mũ mới 5 10 1(25) 5 5

Hãy để làm điều này với các số mũ thiên vị cũng như để đảm bảo
chúng tôi có được kết quả tương tự: 10 + 127 = 137 và −5 + 127 =
122, vì vậy
Số mũ mới 5 137 1122 5 259
Kết quả này quá lớn đối với trường số mũ 8 bit, vì vậy có gì đó
không ổn! Vấn đề là với sự thiên vị bởi vì chúng tôi đang thêm các
thành kiến cũng như số mũ :
Số mũ mới 5 (10 1127) 1 (25 1 127) 5 (5 1 2 3127) 5 259
3.5 Điểm nổi 219

Ký Số mũ Phân số Ký tên Số mũ Phân số


tên

So sánh
ALU nhỏ
số mũ

Số mũ
sự khác biệt

0 1 0 1 0 1

Chuyển nhỏ
Điều khiển Chuyển sang phải hơn
số đúng

ALU lớn
Thêm vào

0 1 0 1

Tăng hoặc Chuyển sang trái


suy đồi hoặc phải
Bình thường
hóa

Phần cứng làm tròn


Tròn


tên Số mũ Phân số

HÌNH 3.15 Sơ đồ khối của một đơn vị số học dành riêng cho phép cộng dấu phẩy động. Các bước của Hình 3.14 tương ứng
đến từng khối, từ trên xuống dưới. Đầu tiên, số mũ của một toán hạng được trừ vào toán hạng khác bằng ALU nhỏ để xác định cái nào lớn
hơn và bao nhiêu. Sự khác biệt này kiểm soát ba bộ ghép kênh; từ trái sang phải, họ chọn số mũ lớn hơn, ý nghĩa của số nhỏ hơn và ý nghĩa
của số lớn hơn. Ý nghĩa nhỏ hơn được dịch chuyển sang phải, và sau đó các ý nghĩa được thêm vào với nhau bằng cách sử dụng ALU lớn.
Bước chuẩn hóa sau đó dịch chuyển tổng trái hoặc phải và tăng hoặc giảm số mũ. Làm tròn sau đó tạo ra kết quả cuối cùng, có thể yêu cầu
bình thường hóa lại để tạo ra kết quả cuối cùng thực tế.
220 Chương 3 Số học cho máy tính

Theo đó, để có được tổng sai lệch chính xác khi chúng ta thêm các
số sai lệch, chúng ta phải trừ đi độ lệch so với tổng:
Số mũ mới 5 137 1122 2 127 5 259 2 127 5 132 5 (5 1127)

và 5 thực sự là số mũ chúng tôi tính toán ban đầu.


Bước 2. Tiếp đến là sự nhân lên của các ý nghĩa :

Có ba chữ số ở bên phải dấu thập phân cho mỗi toán hạng, do đó
dấu thập phân được đặt sáu chữ số từ bên phải trong sản phẩm có ý
nghĩa :
10.212000mười

Nếu chúng ta chỉ có thể giữ ba chữ số ở bên phải dấu thập phân, sản
phẩm là 10.212 × 105.
Bước 3. Sản phẩm này không được bình thường hóa, vì vậy chúng tôi cần
bình thường hóa nó :
10.212mười 3 105 5 1.0212mười 3106

Do đó, sau khi nhân, sản phẩm có thể được dịch chuyển đúng một chữ
số để đặt nó ở dạng chuẩn hóa, thêm 1 vào số mũ. Tại thời điểm này,
chúng tôi có thể kiểm tra tràn và tràn. Dòng chảy có thể xảy ra nếu cả
hai toán hạng đều nhỏ, nếu cả hai đều có số mũ âm lớn.
Bước 4. Chúng tôi giả định rằng ý nghĩa và chỉ dài bốn chữ số (không bao
gồm dấu), vì vậy chúng tôi phải làm tròn số. Số
1.0212mười 3106
được làm tròn thành bốn chữ số trong ý nghĩa và
1.021mười 3106
Bước 5. Dấu hiệu của sản phẩm phụ thuộc vào các dấu hiệu của các toán hạng
ban đầu.
Nếu cả hai đều giống nhau, dấu hiệu là tích cực; mặt khác, nó âm tính.
Do đó, sản phẩm là
11.021mười 3106
Dấu của tổng trong thuật toán bổ sung được xác định bằng cách
thêm các ý nghĩa, nhưng trong phép nhân, các dấu hiệu của toán
hạng xác định dấu hiệu của sản phẩm.
3.5 Điểm nổi 221

Khởi đầu

1. Thêm số mũ thiên vị của hai số, trừ đi


độ lệch so với tổng
để có được số mũ thiên vị mới

2. Nhân các ý nghĩa

3. Bình thường hóa sản phẩm nếu cần thiết,


chuyển nó đúng và tăng số mũ

Tràn hoặc Đúng


tràn?
Khôn
g Ngoại lệ

4. Làm tròn ý nghĩa và số bit thích hợp

Không
Vẫn bình thường hóa?

Đúng

5. Đặt dấu hiệu của sản phẩm thành dương


nếu các dấu hiệu của toán hạng ban đầu là
như nhau;
nếu chúng khác nhau làm cho dấu hiệu âm tính

Làm xong

HÌNH 3.16 Phép nhân điểm nổi. Đường dẫn bình thường là thực hiện các bước 3 và 4 một lần, nhưng
nếu làm tròn khiến tổng số không được chuẩn hóa, chúng ta phải lặp lại bước 3.
222 Chương 3 Số học cho máy tính

Một lần nữa, như Hình 3.16 hiển thị, nhân số dấu phẩy động nhị phân
khá giống với các bước chúng ta vừa hoàn thành. Chúng tôi bắt đầu với
việc tính toán số mũ mới của sản phẩm bằng cách thêm số mũ sai lệch,
chắc chắn trừ đi một sai lệch để có được kết quả phù hợp. Tiếp theo là
nhân các ý nghĩa, tiếp theo là một bước chuẩn hóa tùy chọn. Kích thước
của số mũ được kiểm tra cho tràn hoặc tràn, và sau đó sản phẩm được
làm tròn. Nếu làm tròn dẫn đến bình thường hóa hơn nữa, chúng ta một
lần nữa kiểm tra kích thước số mũ. Cuối cùng, đặt bit dấu thành 1 nếu
các dấu hiệu của toán hạng khác nhau (sản phẩm âm) hoặc 0 nếu chúng
giống nhau (sản phẩm dương).

Phép nhân dấu phẩy động nhị phân

Hãy thử nhân các số 0,5mười và −0,4375mười, sử dụng các bước trong Hình
VÍ DỤ 3.16.

Trong nhị phân, nhiệm vụ đang nhân 1.000hai × 2-1 bằng −1.110hai × 2−2.
TRẢ LỜI
Bước 1. Thêm số mũ mà không sai lệch :
21 1(22) 523
hoặc, sử dụng đại diện thiên vị :
(21 1127) 1(22 1127) 2127 5 (21 22) 1(127 1127 2127)
523 1127 5124

Bước 2. Nhân các ý nghĩa :

Sản phẩm là 1.110000hai × 2-3, nhưng chúng ta cần giữ nó thành 4


bit, vì vậy nó là 1.110hai × 2-3.
Bước 3. Bây giờ chúng tôi kiểm tra sản phẩm để đảm bảo nó được chuẩn hóa, và sau
đó kiểm tra số mũ để tràn hoặc tràn. Sản phẩm đã được chuẩn hóa và, kể từ
127 ≥ −3 ≥ −126, không có tràn hoặc tràn. (Sử dụng biểu diễn thiên vị, 254
≥ 124 1, vì vậy số mũ phù hợp.)
Bước 4. Làm tròn sản phẩm không thay đổi :
3.5 Điểm nổi 223

1.110hai 3 223

Bước 5. Vì các dấu hiệu của toán hạng ban đầu khác nhau, làm cho dấu hiệu
của sản phẩm âm tính. Do đó, sản phẩm là
21 .110hai 3 223

Chuyển đổi sang số thập phân để kiểm tra kết quả của chúng tôi :
21 .110hai 3 223 5 20,001110hai 5 20,00111hai

5 27/25mười 5 27/32mười 5 20,21875mười

Sản phẩm của 0,5mười và −0,4375mười thực sự là −0.21875mười.

Hướng dẫn điểm nổi trong RISC-V


RISC-V hỗ trợ các định dạng chính xác và chính xác kép của IEEE 754 với các
hướng dẫn sau :
n Điểm nổi Ngoài ra, độc thân (fadd.s) và cộng, gấp đôi (fadd.d)

n Điểm nổi trừ, đơn (fsub.s) và trừ, gấp đôi (fsub.d)


n Điểm nổi nhân, đơn (fmul.s) và nhân, nhân đôi (fmul.d)
n Điểm nổi chia, độc thân (fdiv.s) và chia, đôi (fdiv.d)
n Căn bậc hai nổi, đơn (fsqrt.s) và căn bậc hai, gấp đôi (fsqrt.d)
n Điểm nổi bằng, đơn (feq.s) và bằng, gấp đôi (feq.d)
n Điểm nổi ít hơn, đơn (flt.s) và ít hơn, gấp đôi (flt.d)
n Điểm nổi nhỏ hơn hoặc bằng nhau, đơn (fle.s) và ít hơn hoặc bằng nhau,
gấp đôi (fle.d)
Các hướng dẫn so sánh , feq, flt, và chạy trốn, đặt một thanh ghi số nguyên thành
0 nếu so sánh là sai và 1 nếu nó là đúng. Do đó, phần mềm có thể phân nhánh
dựa trên kết quả so sánh dấu phẩy động bằng cách sử dụng các hướng dẫn nhánh
số nguyên beq và bne.
Các nhà thiết kế RISC-V đã quyết định thêm các thanh ghi dấu phẩy động
riêng biệt. Họ được gọi f0, f1, ..., f31 Do đó, chúng bao gồm các tải và cửa hàng
riêng biệt cho các thanh ghi dấu phẩy động :. fld và fsd cho độ chính xác kép và
flw và fsw cho độ chính xác đơn. Các thanh ghi cơ sở để truyền dữ liệu dấu phẩy
động được sử dụng cho các địa chỉ vẫn là các thanh ghi số nguyên. Mã RISC- V
để tải hai số chính xác duy nhất từ bộ nhớ, thêm chúng và sau đó lưu trữ tổng có
thể trông như thế này :
flw f0, 0 (x10) // Tải F.P 32 bit. số vào f0 flw f1, 4 (x10) // Tải 32 bit F.P. số vào
f1 fadd.s f2, f0, f1 // f2 = f0 + f1, fsw f2 chính xác đơn / x10)
224 Chương 3 Số học cho máy tính

Kiến trúc điểm nổi 3.17 RISC-V cho đến nay. Thông tin này cũng được tìm thấy trong cột 2 của RISC-V Thẻ dữ liệu tham khảo ở
phía trước của cuốn sách này.

Một thanh ghi chính xác duy nhất chỉ là nửa dưới của thanh ghi chính xác kép.
Lưu ý rằng, không giống như đăng ký số nguyên x0, đăng ký điểm nổi f0 là
không phải dây cứng đến hằng số 0.
Hình 3.17 tóm tắt phần dấu phẩy động của kiến trúc RISC-V được tiết lộ trong
chương này, với các phần mới để hỗ trợ điểm nổi được hiển thị bằng màu. Các
hướng dẫn dấu phẩy động sử dụng cùng định dạng với các đối tác số nguyên của
chúng: tải sử dụng định dạng loại I, các cửa hàng sử dụng định dạng loại S và
hướng dẫn số học sử dụng định dạng loại R.
3.5 Điểm nổi 225

Một vấn đề mà các kiến trúc sư phải đối mặt trong việc hỗ trợ số học dấu phẩy Giao diện
động là liệu có nên chọn các thanh ghi tương tự được sử dụng bởi các hướng dẫn
số nguyên hay để thêm một tập đặc biệt cho dấu phẩy động. Vì các chương trình phần
thường thực hiện các thao tác số nguyên và các phép toán dấu phẩy động trên các cứng /
dữ liệu khác nhau, việc tách các thanh ghi sẽ chỉ tăng nhẹ số lượng hướng dẫn phần
cần thiết để thực hiện chương trình. Tác động chính là tạo ra một bộ hướng dẫn
truyền dữ liệu riêng biệt để di chuyển dữ liệu giữa các thanh ghi dấu phẩy động mềm
và bộ nhớ.
Lợi ích của các thanh ghi dấu phẩy động riêng biệt là có số lượng thanh ghi
gấp đôi mà không sử dụng nhiều bit hơn ở định dạng lệnh, có hai lần băng thông
thanh ghi bằng cách có các bộ thanh ghi số nguyên và dấu phẩy động riêng biệt,
và có thể tùy chỉnh các thanh ghi đến điểm nổi; ví dụ, một số máy tính chuyển
đổi tất cả các toán hạng có kích thước trong các thanh ghi thành một định dạng
nội bộ duy nhất.

Biên dịch chương trình C nổi thành Mã hội RISC-V


VÍ DỤ
Hãy để chuyển đổi nhiệt độ ở Fahrenheit sang Celsius :

phao f2c (fahr nổi)


{
trả về ((5.0f / 9.0f) * (fahr - 32.0f));
}

Giả sử rằng đối số dấu phẩy động fahr được thông qua f10 và kết quả cũng
nên đi vào f10Mã lắp ráp RISC-V là gì.

Chúng tôi giả định rằng trình biên dịch đặt ba hằng số dấu phẩy động trong TRẢ LỜI
bộ nhớ trong phạm vi dễ dàng của thanh ghi x3Hai hướng dẫn đầu tiên tải
các hằng số 5.0 và 9.0 vào các thanh ghi dấu phẩy động :.
f2c :
flw f0, const5 (x3) // f0 = 5.0f
flw f1, const9 (x3) // f1 = 9.0f

Sau đó, chúng được chia để lấy phân số 5.0 / 9.0 :

fdiv.s f0, f0, f1 // f0 = 5.0f / 9.0f


226 Chương 3 Số học cho máy tính

(Nhiều trình biên dịch sẽ chia 5.0 cho 9.0 tại thời điểm biên dịch và lưu hằng
số đơn 5.0 / 9.0 trong bộ nhớ, do đó tránh được sự phân chia trong thời gian
chạy.) Tiếp theo, chúng tôi tải hằng số 32.0 và sau đó trừ nó khỏi fahr (f10):
flw f1, const32 (x3) // f1 = 32.0f
fsub.s f10, f10, f1 // f10 = fahr - 32.0f

Cuối cùng, chúng tôi nhân hai kết quả trung gian, đặt sản phẩm vào f10 như
kết quả trả lại, và sau đó trở lại
fmul.s f10, f0, f10 // f10 = (5.0f / 9.0f) * (fahr - 32.0f) jalr x0, 0 (x1) // return

Bây giờ hãy để thực hiện các thao tác dấu phẩy động trên ma trận, mã
thường được tìm thấy trong các chương trình khoa học.

VÍ DỤ Biên dịch thủ tục điểm C với ma trận hai chiều thành RISC-
V

Hầu hết các tính toán dấu phẩy động được thực hiện trong độ chính xác kép.
Đặt phép nhân ma trận trên mỗi dạng của C = C + A * B. Mã này là phiên
bản đơn giản của chương trình DGEMM Hình 2.43 trên trang 169. Giả sử C,
A và B đều là ma trận vuông với 32 phần tử ở mỗi chiều.
void mm (double c [] [], double a [] [], double b [] [])
{
size_t i, j, k;
cho (i = 0; i <32; i = i + 1)
cho (j = 0; j <32; j = j + 1)
cho (k = 0; k <32; k = k + 1)
c [i] [j] = c [i] [j] + a [i] [k] * b [k] [j];
}

Các địa chỉ bắt đầu mảng là các tham số, vì vậy chúng nằm trong x10, x11,
và x12 Giả sử rằng các biến số nguyên nằm trong. x5, x6, và x7, tương ứng.
Mã lắp ráp RISC-V cho phần thân của quy trình là gì?

Lưu ý rằng c [i] [j] được sử dụng trong vòng lặp trong cùng ở trên. Vì chỉ số
TRẢ LỜI vòng lặp là k, chỉ số không ảnh hưởng c [i] [j], vì vậy chúng tôi có thể tránh
tải và lưu trữ
3.5 Điểm nổi 227

c [i] [j] mỗi lần lặp. Thay vào đó, trình biên dịch tải c [i] [j] vào một đăng ký
bên ngoài vòng lặp, tích lũy tổng số sản phẩm của a [i] [k] và b [k] [j] trong
cùng một đăng ký, và sau đó lưu trữ số tiền vào c [i] [j] trên chấm dứt vòng
lặp trong cùng.
Phần thân của thủ tục bắt đầu bằng việc lưu giá trị chấm dứt vòng lặp là
32 trong một thanh ghi tạm thời và sau đó khởi tạo ba cho biến vòng lặp :
mm :...
addi x28, x0, 32 // x28 = 32 (kích thước hàng / đầu vòng) addi x5, x0, 0 // i = 0;
khởi tạo lần đầu tiên cho vòng lặp L1: addi x6, x0, 0 // j = 0; khởi tạo thứ 2 cho
vòng lặp L2: addi x7, x0, 0 // k = 0; khởi tạo thứ 3 cho vòng lặp

Để tính địa chỉ của c [i] [j], chúng ta cần biết làm thế nào một mảng hai chiều
32 × 32 được lưu trữ trong bộ nhớ. Như bạn có thể mong đợi, bố cục của nó
giống như khi có 32 mảng một chiều, mỗi mảng có 32 phần tử. Vì vậy, bước
đầu tiên là bỏ qua Tôi Mảng một chiều, các hàng hoặc các hàng, để có được
cái chúng ta muốn. Do đó, chúng tôi nhân chỉ số ở chiều thứ nhất với kích
thước của hàng, 32. Vì 32 là sức mạnh của 2, chúng ta có thể sử dụng một ca
thay thế :
slli x30, x5, 5 // x30 = i * 25(kích thước của hàng c)

Bây giờ chúng tôi thêm chỉ mục thứ hai để chọn jphần tử của hàng mong muốn :

thêm x30, x30, x6 // x30 = i * size (hàng) + j

Để biến tổng này thành một chỉ mục byte, chúng tôi nhân nó với kích thước
của một phần tử ma trận tính bằng byte. Vì mỗi phần tử là 8 byte cho độ
chính xác kép, thay vào đó chúng ta có thể dịch chuyển sang 3 vì 8 là công
suất 2 :
slli x30, x30, 3 // x30 = offset byte của [i] [j]

Tiếp theo chúng tôi thêm số tiền này vào địa chỉ cơ sở của c, đưa ra địa chỉ
của c [i] [j], và sau đó tải số chính xác kép c [i] [j] vào f0:
thêm x30, x10, x30 // x30 = địa chỉ byte của c [i] [j] fld f0, 0 (x30) // f0 =
8 byte của c [i] [j]

Năm hướng dẫn sau đây gần như giống hệt với năm hướng dẫn cuối cùng:
tính địa chỉ và sau đó tải số chính xác kép b [k] [j].
L3: slli x29, x7, 5 // x29 = k * 25(kích thước của hàng b)
thêm x29, x29, x6 // x29 = k * kích thước (hàng) + j
slli x29, x29 , 3 // x29 = offset of [k] [j]
thêm x29, x12 , x29 // x29 = địa chỉ byte của b [k] [j]
fld f1, 0 (x29) // f1 = 8 byte của b [k] [j]
228 Chương 3 Số học cho máy tính

Tương tự, năm hướng dẫn tiếp theo giống như năm hướng dẫn cuối cùng:
tính địa chỉ và sau đó tải số chính xác kép a [i] [k].
=
slli x29, x5, 5 // x29 Tôi * 25(kích thước của hàng a)
=
thêm x29, x29 , x7 // x29 Tôi * kích thước (hàng) + k
slli x29, x29, 3 // x29 = offset of [i] [k]
thêm x29, x11 , x29 // x29 = địa chỉ byte của a [i] [k]
fld f2, 0 (x29) // f2 = a [i] [k]

Bây giờ chúng tôi đã tải tất cả dữ liệu, cuối cùng chúng tôi đã sẵn sàng để
thực hiện một số thao tác dấu phẩy động! Chúng tôi nhân các yếu tố của a và
b nằm trong sổ đăng ký f2 và f1, và sau đó tích lũy tổng trong f0.

fmul.d f1, f2, f1 // f1 = a [i] [k] * b [k] [j]


fadd.d f0, f0, f1 // f0 = c [i] [j] + a [i] [k] * b [k] [j]

Khối cuối cùng tăng chỉ mục k và lặp lại nếu chỉ số không phải là 32. Nếu nó
là 32, và do đó kết thúc vòng lặp trong cùng, chúng ta cần lưu trữ số tiền tích
lũy vào f0 vào c [i] [j].
addi x7, x7, 1 // k = k +1
bltu x7, x28, L3 // nếu (k < 32) đi đến L3
fsd f0, 0 (x30) // c [i] [j] = f0

Tương tự, sáu hướng dẫn cuối cùng này làm tăng biến chỉ mục của các vòng
giữa và ngoài cùng, lặp lại nếu chỉ mục không phải là 32 và thoát nếu chỉ
mục là 32.
addi x6, x6 , 1 // j = j + 1
bltu x6, x28, L2 // nếu (j <32) đi đến L2
addi x5, x5 , 1 // i = i +1
bltu x5, x28, L1 // nếu (i < 32) đi đến L1
...

Nhìn về phía trước , Hình 3.20 bên dưới hiển thị mã ngôn ngữ lắp ráp x86
cho phiên bản DGEMM hơi khác Hình 3.19.

Xây dựng: C và nhiều ngôn ngữ lập trình khác sử dụng bố cục mảng thảo luận
trong ví dụ, được gọi hàng chính Fortran thay vì sử dụng. cột chính đặt hàng, theo đó
mảng được lưu trữ từng cột.
3.5 Điểm nổi 229

Xây dựng: Một lý do khác cho các số nguyên và thanh ghi dấu phẩy động riêng biệt là
rằng các bộ vi xử lý trong những năm 1980 đã không có đủ bóng bán dẫn để đặt đơn vị
dấu phẩy động trên cùng một chip với đơn vị số nguyên. Do đó, đơn vị điểm nổi, bao gồm
các thanh ghi điểm nổi, có sẵn tùy chọn dưới dạng chip thứ hai. Chip tăng tốc tùy chọn
như vậy được gọi chip đồng xử lýKể từ đầu những năm 1990, bộ vi xử lý đã tích hợp điểm
nổi (và mọi thứ khác) trên chip.

Xây dựng: Như đã đề cập trong Mục 3.4, tăng tốc phân chia là thách thức hơn
nhân. Ngoài SRT, một kỹ thuật khác để tận dụng hệ số nhân nhanh là Lặp lại lặp
Newton Newton, trong đó phân chia được đúc lại là tìm số 0 của hàm để tạo đối ứng
1 /c, sau đó được nhân với toán hạng khác. Kỹ thuật lặp không thể được làm tròn
đúng mà không tính nhiều bit thêm. Một chip TI đã giải quyết điều này vấn đề bằng
cách tính toán một đối ứng chính xác.

Xây dựng: Java bao gồm IEEE 754 theo tên trong định nghĩa của điểm nổi Java
loại dữ liệu và hoạt động. Do đó, mã trong ví dụ đầu tiên có thể đã được tạo cho một
phương thức lớp đã chuyển đổi Fahrenheit thành Celsius.
Ví dụ thứ hai ở trên sử dụng các mảng nhiều chiều, không được hỗ trợ rõ ràng
trong Java. Java cho phép các mảng của các mảng, nhưng mỗi mảng có thể có độ
dài riêng, không giống như các mảng nhiều chiều trong C. Giống như các ví dụ trong
Chương 2, một phiên bản Java của ví dụ thứ hai này sẽ yêu cầu rất nhiều mã kiểm bảo vệ Đầu tiên của hai
các bit thừa được giữ bên
tra cho các giới hạn mảng, bao gồm cả phép tính độ dài mới ở cuối các truy cập hàng.
phải trong quá trình tính
Nó cũng sẽ cần kiểm tra xem tham chiếu đối tượng không phải là null.
toán trung gian các số
dấu phẩy động; đã sử
Số học chính xác dụng
để cải thiện độ chính
Không giống như các số nguyên, có thể biểu thị chính xác mọi số giữa số nhỏ
xác làm tròn.
nhất và số lớn nhất, các số dấu phẩy động thường là xấp xỉ cho một số mà chúng
có thể thực sự đại diện. Lý do là vô số số thực tồn tại giữa, giả sử, 1 và 2, nhưng vòng Phương pháp để
không quá 253 có thể được thể hiện chính xác trong điểm nổi chính xác kép. Điều làm cho kết quả dấu
phẩy động trung gian
tốt nhất chúng ta có thể làm là đưa biểu diễn dấu phẩy động gần với số thực tế.
phù hợp với định dạng
Do đó, IEEE 754 cung cấp một số chế độ làm tròn để cho lập trình viên chọn xấp dấu phẩy động; mục tiêu
xỉ mong muốn. thường là tìm số gần nhất
Làm tròn âm thanh đủ đơn giản, nhưng để làm tròn chính xác đòi hỏi phần có thể được biểu diễn ở
cứng phải bao gồm các bit phụ trong tính toán. Trong các ví dụ trước, chúng tôi định dạng. Nó cũng là
đã mơ hồ về số lượng bit mà một đại diện trung gian có thể chiếm giữ, nhưng rõ tên của thứ hai trong hai
ràng, nếu mọi kết quả trung gian phải được cắt ngắn đến số chữ số chính xác, sẽ bit phụ được giữ ở bên
phải trong các tính toán
không có cơ hội để làm tròn. Do đó, IEEE 754 luôn giữ hai bit phụ ở bên phải dấu phẩy động trung gian,
trong khi can thiệp bổ sung, được gọi bảo vệ và vòng, tương ứng. Hãy để làm giúp cải thiện độ chính
một ví dụ thập phân để minh họa giá trị của chúng. xác làm tròn.
230 Chương 3 Số học cho máy tính

Làm tròn với các chữ số bảo vệ


VÍ DỤ
Thêm 2.56mười × 100 đến 2,34mười × 102, giả sử rằng chúng ta có ba chữ số
thập phân đáng kể. Làm tròn đến số thập phân gần nhất với ba chữ số thập
phân có nghĩa, đầu tiên là số bảo vệ và chữ số tròn, sau đó không có chúng.

Đầu tiên chúng ta phải chuyển số nhỏ hơn sang bên phải để căn chỉnh số mũ,
TRẢ LỜI vì vậy 2.56mười × 100 trở thành 0,0256mười × 102Vì chúng tôi có các chữ số
bảo vệ và tròn, chúng tôi có thể đại diện cho hai chữ số có nghĩa nhỏ nhất khi
chúng tôi căn chỉnh số mũ. Chữ số bảo vệ giữ 5 và chữ số tròn giữ 6. Tổng là.
2.3400mười
10,0256mười
2.3656mười
Do đó, tổng là 2.3656mười × 102Vì chúng tôi có hai chữ số để làm tròn, chúng tôi
muốn các giá trị từ 0 đến 49 làm tròn xuống và 51 đến 99 để làm tròn, với 50 là
bộ bẻ khóa. Làm tròn tổng với ba chữ số có nghĩa mang lại 2,37. mười × 102.
Làm điều này không có bảo vệ và chữ số tròn giảm hai chữ số từ tính toán.
Tổng mới là sau đó
2.34mười
10,02mười
2.36mười
Câu trả lời là 2.36mười × 102, tắt 1 trong chữ số cuối cùng từ tổng trên.

đơn vị ở nơi cuối Vì trường hợp xấu nhất để làm tròn sẽ là khi số thực tế nằm giữa hai biểu diễn
cùng (ulp) Số lượng dấu phẩy động, độ chính xác trong dấu phẩy động thường được đo bằng số bit bị
các bit bị lỗi trong các
lỗi trong các bit có ý nghĩa nhỏ nhất; số đo được gọi là số lượng đơn vị ở nơi cuối
bit có ý nghĩa nhỏ nhất
của ý nghĩa giữa số thực
cùng, hoặc là ợ nóngNếu một số bị tắt 2 trong các bit ít quan trọng nhất, nó sẽ bị
tế và số có thể được tắt bởi 2 ulps. Với điều kiện là không có lỗi tràn, dòng chảy hoặc ngoại lệ hoạt
biểu diễn. động không hợp lệ, IEEE 754 đảm bảo rằng máy tính sử dụng số trong vòng một
nửa.

Xây dựng: Mặc dù ví dụ trên thực sự cần chỉ một chữ số phụ, nhân lên có thể yêu cầu
hai. Một sản phẩm nhị phân có thể có một bit 0 hàng đầu; do đó, bước chuẩn hóa phải
dịch chuyển sản phẩm sang một chút. Điều này sẽ chuyển chữ số bảo vệ thành bit ít quan
trọng nhất của sản phẩm, để lại bit tròn để giúp làm tròn chính xác sản phẩm.
IEEE 754 có bốn chế độ làm tròn: luôn làm tròn (về phía +), luôn luôn làm tròn xuống
(về phía -∞), cắt ngắn và vòng đến gần nhất. Chế độ cuối cùng xác định phải làm gì nếu số
chính xác nằm giữa chừng. Hoa Kỳ . Dịch vụ doanh thu nội bộ (IRS) luôn làm tròn 0,5 đô la,
có thể là lợi ích của IRS. Một cách công bằng hơn
3.5 Điểm nổi 231

sẽ làm tròn trường hợp này một nửa thời gian và làm tròn nửa còn lại. IEEE 754 nói
rằng nếu bit ít quan trọng nhất được giữ lại trong trường hợp nửa chừng sẽ là số lẻ,
hãy thêm một; nếu nó thậm chí, cắt ngắn. Phương pháp này luôn tạo ra 0 trong bit ít
quan trọng nhất trong trường hợp phá vỡ, đặt tên cho chế độ làm tròn. Chế độ này
được sử dụng phổ biến nhất và là chế độ duy nhất mà Java hỗ trợ.
Mục tiêu của các bit làm tròn thêm là cho phép máy tính có được kết quả tương tự dính một chút Một
như khi các kết quả trung gian được tính đến độ chính xác vô hạn và sau đó được chút được sử dụng
làm tròn. Để hỗ trợ mục tiêu này và làm tròn đến mức gần nhất, tiêu chuẩn có một bit trong làm tròn ngoài
thứ ba ngoài bảo vệ và làm tròn; nó được đặt bất cứ khi nào có các bit khác không ở bảo vệ và làm tròn
bên phải của bit tròn. Điều này dính một chút cho phép máy tính thấy sự khác biệt được đặt bất cứ khi nào
giữa 0,5 ... 00mười và 0,50 01mười khi làm tròn. có các bit khác không ở
Bit dính có thể được đặt, ví dụ, trong quá trình thêm, khi số nhỏ hơn bên phải của bit tròn.
chuyển sang bên phải. Giả sử chúng tôi đã thêm 5,01mười × 10-1 đến 2,34mười × 102
trong ví dụ trên. Ngay cả với bảo vệ và vòng, chúng tôi sẽ thêm 0,0050 vào 2,34, với
một khoản tiền
2.3450. Bit dính sẽ được đặt, vì có các bit khác không ở bên phải. Nếu không có bit dính
để nhớ liệu có bất kỳ số 1 nào bị tắt hay không, chúng tôi sẽ cho rằng số này bằng
2.345000 ... 00 và làm tròn đến gần nhất thậm chí 2,34. Với bit dính để nhớ rằng số lượng
lớn hơn 2.345000 ... 00, chúng tôi làm tròn đến 2,35.

Xây dựng: RISC-V, MIPS-64, PowerPC, AMD SSE5 và Intel AVX đều có kiến trúc
cung cấp một lệnh duy nhất thực hiện nhân và thêm vào ba thanh ghi : a = a + (b × c).
Rõ ràng, hướng dẫn này cho phép hiệu suất dấu phẩy động cao hơn cho việc này
hoạt động chung. Điều quan trọng không kém là thay vì thực hiện hai vòng tròn sau hợp nhất nhân thêm
khi nhân và sau đó sau khi thêm vào đó sẽ xảy ra với các hướng dẫn riêng biệt, lệnh A lệnh dấu phẩy động
thêm nhân có thể thực hiện một vòng sau khi thêm. Một bước làm tròn duy nhất làm thực hiện cả phép nhân
tăng độ chính xác của phép cộng nhân. Các hoạt động như vậy với một làm tròn duy và phép cộng, nhưng chỉ
nhất được gọi hợp nhất nhân thêm Nó đã được thêm vào tiêu chuẩn IEEE 754-2008 làm tròn một lần sau khi
sửa đổi (xem. Mục 3.11). thêm.

Tóm tắt
Các Bức tranh lớn sau đó củng cố khái niệm chương trình được lưu trữ từ
Chương 2; ý nghĩa của thông tin không thể được xác định chỉ bằng cách nhìn vào
các bit, cho cùng một bit có thể đại diện cho nhiều đối tượng khác nhau. Phần này
cho thấy số học máy tính là hữu hạn và do đó có thể không đồng ý với số học tự
nhiên. Ví dụ: biểu diễn dấu phẩy động tiêu chuẩn IEEE 754

(21)5 3 (1 1 Phân số) 3 2(Số mũ2Xu hướng)


hầu như luôn luôn là một xấp xỉ của số thực. Các hệ thống máy tính phải cẩn thận để
giảm thiểu khoảng cách này giữa số học máy tính và số học trong thế giới thực và đôi khi
các lập trình viên cần phải nhận thức được ý nghĩa của phép tính gần đúng này.

Các mẫu bit không có ý nghĩa vốn có. Chúng có thể đại diện cho các số Các
nguyên đã ký, số nguyên không dấu, số dấu phẩy động, hướng dẫn,
chuỗi ký tự, v.v. Những gì được thể hiện phụ thuộc vào hướng dẫn hoạt LỚN
động trên các bit trong từ.
Hình ảnh
232 Chương 3 Số học cho máy tính

Sự khác biệt chính giữa số máy tính và số trong thế giới thực là số
máy tính có kích thước hạn chế và do đó độ chính xác hạn chế; Nó có
thể tính toán một số quá lớn hoặc quá nhỏ để được thể hiện bằng một từ
máy tính. Các lập trình viên phải nhớ những giới hạn này và viết chương
trình phù hợp.

Loại C Loại Java Truyền dữ liệu Hoạt động


int int lw, sw thêm, phụ, addi, mul, mulh ,
mulhu, mulhsu, div, divu ,
rem, remu, và, andi, hoặc ,
ori, xor, xori
không dấu - lw, sw thêm, phụ, addi, mul, mulh ,
int mulhu, mulhsu, div, divu ,
rem, remu, và, andi, hoặc ,
ori, xor, xori
char - lb, sb thêm, phụ, addi, mul, div ,
divu, rem, remu, và, andi ,
hoặc, ori, xor, xori
ngắn char lh, sh thêm, phụ, addi, mul, div ,
divu, rem, remu, và, andi ,
hoặc, ori, xor, xori
phao phao flw, fsw fadd.s, fsub.s, fmul.s ,
fdiv.s, feq.s, flt.s, fle.s
gấp đôi gấp đôi fld, fsd fadd.d, fsub.d, fmul.d ,
fdiv.d, feq.d, flt.d, fle.d

Giao diện Trong chương cuối, chúng tôi đã trình bày các lớp lưu trữ của ngôn ngữ lập trình
C (xem phần Giao diện phần cứng / phần mềm phần trong Mục 2.7). Bảng trên
phần cho thấy một số loại dữ liệu C và Java, hướng dẫn truyền dữ liệu và hướng dẫn
cứng / hoạt động trên các loại xuất hiện trong đó Chương 2 và chương này. Lưu ý rằng
phần Java bỏ qua các số nguyên không dấu.
mềm
Tiêu chuẩn IEEE 754-2008 sửa đổi đã thêm định dạng dấu phẩy động 16 bit với năm
bit số mũ. Bạn nghĩ gì về phạm vi số có khả năng nó có thể đại diện?

Kiểm tra 1. 1.0000 00 × 20 đến 1.1111 1111 11 × 231, 0


Bản thân bạn 2. ± 1.0000 0000 0 × 2-14 đến ± 1.1111 1111 1 × 215, ± 0, ±, NaN
3. ± 1.0000 0000 00 × 2-14 đến ± 1.1111 1111 11 × 215, ± 0, ±, NaN
4. ± 1.0000 0000 00 × 2-15 đến ± 1.1111 1111 11 × 214, ± 0, ±, NaN
3.6 Song song và số học máy tính: Song song Subword 233

Xây dựng: Để phù hợp với các so sánh có thể bao gồm NaN, tiêu chuẩn bao gồm
đặt hàng và không có trật tự như các tùy chọn để so sánh. RISC-V không cung cấp
hướng dẫn cho các so sánh không có thứ tự, nhưng một chuỗi các so sánh được đặt
hàng cẩn thận có tác dụng tương tự. (Java không hỗ trợ so sánh không có thứ tự.)
Trong nỗ lực siết từng chút chính xác từ thao tác dấu phẩy động, tiêu chuẩn cho phép một số
số được biểu diễn ở dạng không chuẩn hóa. Thay vì có khoảng cách giữa 0 và số chuẩn hóa
nhỏ nhất, IEEE cho phép số không chuẩn hóa (còn được gọi là ký túc xá hoặc là các tiểu định).
Chúng có số mũ tương đương với 0 nhưng phần không khác không. Chúng cho phép một số
xuống cấp về ý nghĩa cho đến khi nó trở thành 0, được gọi dần dần trànVí dụ, số chuẩn hóa
chính xác đơn dương nhỏ nhất là.

126
1.000000000000000000000000hai 3 22

nhưng số không chuẩn hóa chính xác nhỏ nhất là

126 149
0,000000000000000000000001hai 3 22 , hoặc là 1.0 hai 3 22

Đối với độ chính xác kép, khoảng cách denorm đi từ 1.0 × 2-1022 đến 1,0 × 2-1074.
Khả năng một toán hạng không bình thường hóa thỉnh thoảng đã gây ra những cơn
đau đầu cho các nhà thiết kế nổi, những người đang cố gắng xây dựng các đơn vị điểm
nổi nhanh. Do đó, nhiều máy tính gây ra ngoại lệ nếu một toán hạng bị không chuẩn hóa,
cho phép phần mềm hoàn thành thao tác. Mặc dù việc triển khai phần mềm là hoàn toàn
hợp lệ, nhưng hiệu suất thấp hơn của chúng đã làm giảm mức độ phổ biến của các
denorms trong phần mềm dấu phẩy động di động. Hơn nữa, nếu các lập trình viên không
mong đợi những kẻ chối bỏ, các chương trình của họ có thể làm họ ngạc nhiên.

Song song và số học máy tính :


3.6
Song song Subword

Vì mọi bộ vi xử lý trong điện thoại, máy tính bảng hoặc máy tính xách tay theo
định nghĩa đều có màn hình đồ họa riêng, vì ngân sách bóng bán dẫn tăng lên,
không thể tránh khỏi việc hỗ trợ cho các hoạt động đồ họa.
Nhiều hệ thống đồ họa ban đầu sử dụng 8 bit để thể hiện mỗi trong ba màu chính
cộng với 8 bit cho vị trí của pixel. Việc bổ sung loa và micrô cho hội nghị truyền
hình và trò chơi video cũng đề xuất hỗ trợ âm thanh. Các mẫu âm thanh cần độ chính
xác hơn 8 bit, nhưng 16 bit là đủ.
Mỗi bộ vi xử lý có hỗ trợ đặc biệt để các byte và nửa từ chiếm ít dung lượng hơn
khi được lưu trong bộ nhớ (xem Mục 2.9), nhưng do sự không thường xuyên của các
phép toán số học trên các kích thước dữ liệu này trong các chương trình số nguyên
điển hình, có rất ít sự hỗ trợ ngoài việc truyền dữ liệu. Các kiến trúc sư nhận ra rằng
nhiều ứng dụng đồ họa và âm thanh sẽ thực hiện thao tác tương tự trên các vectơ của
các dữ liệu này. Bằng cách phân vùng các chuỗi mang trong bộ cộng 128 bit, bộ xử
lý có thể sử dụng song song để thực hiện các hoạt động đồng thời trên các vectơ
ngắn mười sáu 8 bit toán hạng, tám toán hạng 16 bit, bốn toán hạng 32 bit hoặc hai
toán hạng 64 bit.
234 Chương 3 Số học cho máy tính

Chi phí của các bộ bổ sung được phân vùng như vậy là nhỏ nhưng tốc độ có
thể lớn. Cho rằng sự song song xảy ra trong một từ rộng, các phần mở rộng là
phân loại là song song tiểu từ Nó cũng được phân loại dưới tên chung hơn. song song
mức dữ liệu Chúng được biết đến cũng như vector hoặc SIMD, cho một lệnh duy
nhất, nhiều dữ liệu (xem. Mục 6.6). Sự phổ biến ngày càng tăng của các ứng dụng đa
phương tiện đã dẫn đến các hướng dẫn số học hỗ trợ các hoạt động hẹp hơn có thể dễ
dàng tính toán song song. Theo văn bản này, các hướng dẫn bổ sung để khai thác
song song từ con vẫn đang được RISC-V International phát triển, nhưng phần tiếp
theo trình bày một ví dụ thực tế về kiến trúc như vậy.

Real Stuff: Truyền phát phần mở rộng


SIMD
3.7 và phần mở rộng Vector nâng cao trong
x86

MMX gốc (Đa phương tiện eXtension) cho x86 bao gồm các hướng dẫn hoạt động
trên các vectơ ngắn của số nguyên. Sau đó, SSE (Truyền phát mở rộng SIMD) cung
cấp các hướng dẫn hoạt động trên các vectơ ngắn của các số dấu phẩy động chính
xác đơn. Chương 2 lưu ý rằng vào năm 2001, Intel đã thêm 144 hướng dẫn vào kiến
trúc của mình như là một phần của SSE2, bao gồm các thanh ghi và thao tác dấu
phẩy động chính xác kép. Nó bao gồm tám thanh ghi 64 bit có thể được sử dụng cho
các toán hạng dấu phẩy động. AMD đã mở rộng số lượng lên 16 thanh ghi, được gọi
là XMM, như một phần của AMD64, mà Intel đã dán nhãn lại EM64T để sử dụng.
Hình 3.18 tóm tắt các hướng dẫn SSE và SSE2.

HÌNH 3.18 Hướng dẫn dấu phẩy động SSE / SSE2 của x86. xmm có nghĩa là một toán hạng là một
thanh ghi SSE2 128 bit và {mem | xmm} có nghĩa là toán hạng khác nằm trong bộ nhớ hoặc nó là một thanh ghi
SSE2. Bảng sử dụng các biểu thức chính quy để hiển thị các biến thể của hướng dẫn. Như thế, BIẾN[AU]SS | PS
| SD | PD} đại diện cho tám hướng dẫn MOVASS,PHIM,BIẾN ĐỔI,BIẾN ĐỔI,PHONG CÁCH,PHONG
CÁCH,BIẾN, và MOVUPD. Chúng tôi sử dụng dấu ngoặc vuông [ để hiển thị các lựa chọn thay thế một chữ cái:
A có nghĩa là toán hạng 128 bit được căn chỉnh trong bộ nhớ; U có nghĩa là toán hạng 128 bit không được sắp
xếp trong bộ nhớ; H có nghĩa là di chuyển nửa cao của toán hạng 128 bit; và L có nghĩa là di chuyển nửa thấp của
toán hạng 128 bit. Chúng tôi sử dụng dấu ngoặc nhọn {} với thanh dọc | để hiển thị nhiều biến thể chữ cái của các
thao tác cơ bản: SS là viết tắt của Scalar đơn điểm nổi chính xác, hoặc một toán hạng 32 bit trong thanh ghi 128
bit; PS là viết tắt của Đóng gói đơn điểm nổi chính xác hoặc bốn toán hạng 32 bit trong thanh ghi 128 bit; SD là
viết tắt của điểm nổi chính xác Scalar Double, hoặc một toán hạng 64 bit trong thanh ghi 128 bit; PD là viết tắt
của Đóng gói đôi điểm nổi chính xác hoặc hai toán hạng 64 bit trong thanh ghi 128 bit.
3.7 Công cụ thực: Truyền phát tiện ích mở rộng SIMD và tiện ích mở rộng Vector nâng cao trong
x86 235

Ngoài việc giữ một số chính xác đơn hoặc chính xác kép trong một thanh ghi,
Intel cho phép nhiều toán hạng dấu phẩy động được đóng gói vào một thanh ghi
SSE2 128 bit duy nhất: bốn độ chính xác đơn hoặc hai độ chính xác kép. Do đó,
16 thanh ghi dấu phẩy động cho SSE2 thực sự rộng 128 bit. Nếu các toán hạng có
thể được sắp xếp trong bộ nhớ dưới dạng dữ liệu được căn chỉnh 128 bit, thì việc
truyền dữ liệu 128 bit có thể tải và lưu trữ nhiều toán hạng cho mỗi lệnh. Định
dạng dấu phẩy động được đóng gói này được hỗ trợ bởi các phép toán số học có
thể tính toán đồng thời trên bốn đĩa đơn (PS) hoặc hai đôi (PD).
Năm 2011, Intel đã tăng gấp đôi chiều rộng của các thanh ghi một lần nữa,
bây giờ được gọi là YMM, với Phần mở rộng Vector nâng cao (AVX). Do đó,
một thao tác duy nhất hiện có thể chỉ định tám thao tác dấu phẩy động 32 bit
hoặc bốn thao tác dấu phẩy động 64 bit. Các hướng dẫn SSE và SSE2 cũ hiện
hoạt động trên 128 bit thấp hơn của các thanh ghi YMM. Do đó, để đi từ các thao
tác 128 và 256 bit, bạn đặt trước chữ cái vv (cho vector) trước các hoạt động
ngôn ngữ lắp ráp SSE2 và sau đó sử dụng tên thanh ghi YMM thay vì tên thanh
ghi XMM. Ví dụ: lệnh SSE2 để thực hiện hai bổ sung dấu phẩy động 64 bit

addpd% xmm0,% xmm4


trở thành

vaddpd% ymm0,% ymm4


hiện tạo ra bốn bội số dấu phẩy động 64 bit. Vào năm 2015, Intel đã nhân đôi số
thanh ghi một lần nữa lên 512 bit, bây giờ được gọi là ZIMM, với AVX512 trong
một số bộ vi xử lý của nó. Intel đã công bố kế hoạch mở rộng các thanh ghi AVX
lên 1024 bit trong các phiên bản sau của kiến trúc x86.

Xây dựng: AVX cũng đã thêm ba hướng dẫn địa chỉ vào x86. Ví dụ, vaddpd bây
giờ có thể chỉ định
vaddpd% ymm0,% ymm1,% ymm4 //% ymm4 =% ymm0 +% ymm1
thay vì tiêu chuẩn, hai phiên bản địa chỉ
addpd% xmm0,% xmm4 //% xmm4 =% xmm4 +% xmm0
(Không giống như RISC-V, đích đến ở bên phải trong x86.) Ba địa chỉ có thể giảm số
lượng thanh ghi và hướng dẫn cần thiết cho một tính toán.
236 Chương 3 Số học cho máy tính

Đi nhanh hơn: Song song Subword và


3.8
Ma trận nhân

Nhớ lại điều đó Hình 2.43 trên trang 169 cho thấy một phiên bản DGEMM chưa
được tối ưu hóa trong C. Để chứng minh tác động hiệu suất của song song từ con,
chúng tôi chạy lại mã bằng AVX. Mặc dù các tác giả biên dịch cuối cùng có thể có
thể thường xuyên tạo ra mã chất lượng cao sử dụng các hướng dẫn AVX của x86,
bây giờ chúng ta phải gian lận bằng cách sử dụng nội tại C mà ít nhiều nói với trình
biên dịch chính xác cách tạo mã tốt. Hình 3.19 Hiển thị phiên bản nâng cao của Hình
2.43.
Tuyên bố trên dòng 7 của Hình 3.19 sử dụng __m512d kiểu dữ liệu, cho trình
biên dịch biết biến sẽ chứa tám giá trị dấu phẩy động chính xác kép (8 x 64 bit =
512 bit). Nội tại _mm512_load_pd () , cũng trên dòng 7, sử dụng các hướng dẫn
AVX để tải song song tám số dấu phẩy động chính xác kép (_pd) từ ma trận C
vào c0 Việc tính toán địa chỉ. C + i + j * n đại diện cho yếu tố C [i + j * n] Đối
xứng, bước cuối cùng trên dòng 13 sử dụng nội tại. _ mm256_store_pd () để lưu
trữ tám số dấu phẩy động chính xác kép từ c0 vào ma trận CKhi chúng ta đang
trải qua tám yếu tố mỗi lần lặp,. ở ngoài cho vòng lặp trên dòng 4 tăng Tôi bằng 8
thay vì 1 như trên dòng 3 của Hình 2.43 của Chương 2.
Bên trong các vòng lặp, trên dòng 10, trước tiên chúng tôi tải tám yếu tố A lại
sử dụng _ mm512_ load_pd ()Để nhân các yếu tố này với một yếu tố. B, chúng tôi
sử dụng đầu tiên nội tại _mm512_broadcast_sd (), trong đó làm cho tám bản sao
giống hệt nhau của số có độ chính xác kép vô hướng trong trường hợp này là một
yếu tố BMột trong những thanh ghi ZMM. Sau đó chúng tôi sử dụng
_mm512_fmadd_pd trên dòng 11 để nhân tám kết quả chính xác kép song song và
sau đó thêm tám sản phẩm vào tám tổng c0.
Hình 3.20 hiển thị mã x86 kết quả cho phần thân của các vòng lặp bên trong
được tạo ra bởi trình biên dịch. Bạn có thể thấy bốn hướng dẫn AVX512 mà tất
cả chúng bắt đầu v và sử dụng pd đối với độ chính xác kép song song tương ứng
với nội tại C đã đề cập ở trên. Mã này rất giống với mã trong Hình 2.44 của
Chương 2: các hướng dẫn số nguyên gần giống nhau (nhưng các thanh ghi khác
nhau) và sự khác biệt hướng dẫn dấu phẩy động thường chỉ đến từ vô hướng gấp
đôi (sd) sử dụng các thanh ghi XMM để song song (pd) với các thanh ghi ZMM.
Một ngoại lệ là dòng 4 của Hình 3.20 Mọi yếu tố của. A phải được nhân với một
yếu tố của B Một giải pháp là đặt tám bản sao giống hệt nhau của 64 bit. B phần
tử cạnh nhau trong thanh ghi ZMM 512 bit, đó chỉ là những gì hướng dẫn
vbroadcastsd làm. Sự khác biệt khác là chương trình ban đầu có phép nhân riêng
và thêm các phép toán dấu phẩy động, trong khi phiên bản AVX512 sử dụng một
thao tác dấu phẩy động duy nhất trong dòng 6 thực hiện nhân và thêm.
Phiên bản AVX nhanh gấp 7,8 lần, rất gần với hệ số tăng 8.0 mà bạn có thể hy
vọng sẽ thực hiện gấp tám lần số hoạt động tại một thời điểm bằng cách sử dụng
song song tiểu từ.
3.8 Nhanh hơn: Phép song song và ma trận nhân 237

1. bao gồm <x86intrin.h>


2. void dgemm (size_t n, double * A, double * B, double * C)
3. {
4. cho (kích thước_t i = 0; i <n; i + = 4)
5. cho (kích thước_t j = 0; j <n; j ++) {
6. __m256d c0 = _mm256_load_pd (C + i + j * n); / * c0 = C [i] [j] * /
7. cho (kích thước_t k = 0; k <n; k ++)
8. c0 = _mm256_add_pd (c0, / * c0 + = A [i] [k] * B [k] [j] * /
_mm256_mul_pd (_mm256_load_pd (A + i + k *
9. n) ,
10. _mm256_broadcast_sd (B + k + j * n));
11. _mm256_store_pd (C + i + j * n, c0); / * C [i] [j] = c0 * /
12. }
13. }

HÌNH 3.19 Phiên bản tối ưu hóa của DGEMM bằng cách sử dụng nội tại C để tạo các hướng dẫn song song với từ
phụ AVX512 cho x86. Hình 3.20 hiển thị ngôn ngữ lắp ráp được tạo bởi trình biên dịch cho vòng lặp bên trong.

1. vmovsd (% r10),% xmm0 # Tải 1 phần tử C vào% xmm0


di
2. chuyển % rsi,% rcx # đăng ký% RCx = % rsi
3. xor % thuế,% thuế # đăng ký% eax = 0
4. vmovsd (% RCx),% xmm1 # Tải 1 phần tử B vào% xmm1
5. thêm % r9,% RCx # đăng ký% RCx = % RCx +% r9
6. vmulsd (% r8,% rax, 8),% xmm1,% xmm1 # Nhân% xmm1, phần tử của A
7. thêm $ 0x1,% rax # đăng ký% rax = % rax + 1
số 8. cmp % thuế,% edi # so sánh% eax với % edi
9. vaddsd % xmm1,% xmm0,% xmm0 # Thêm% xmm1,% xmm0
10. jg 30 <dgemm + 0x30> # nhảy nếu% eax>% edi
11. thêm $ 0x1,% r11 # đăng ký% r11 = % r11 + 1
12. vmovsd % xmm0, (% r10) # Lưu% xmm0 vào phần tử C

HÌNH 3.20 Ngôn ngữ lắp ráp x86 cho thân của các vòng lồng nhau được tạo bằng cách biên dịch mã C được tối ưu hóa
Hình 3.19Lưu ý những điểm tương đồng với Hình 2.44 của. Chương 2, với sự khác biệt chính là điểm nổi ban đầu các hoạt
động hiện đang sử dụng các thanh ghi ZMM và pd các phiên bản của hướng dẫn cho độ chính xác kép song song thay vì
sd phiên bản cho độ chính xác kép vô hướng và nó đang thực hiện một lệnh nhân thêm thay vì nhân riêng biệt và thêm
hướng dẫn.
238 Chương 3 Số học cho máy tính

3.9 Ngụy biện và Cạm bẫy

Do đó toán học có Ngụy biện số học và cạm bẫy thường xuất phát từ sự khác biệt giữa độ chính xác
thể được định nghĩa hạn chế của số học máy tính và độ chính xác không giới hạn của số học tự nhiên.
là chủ đề mà chúng Fallacy: Giống như một lệnh dịch chuyển trái có thể thay thế một số nguyên
ta không bao giờ biết nhân bằng một lũy thừa 2, một dịch chuyển phải giống như một phép chia số
những gì chúng ta
nguyên bằng lũy thừa 2.
đang nói, cũng như
liệu những gì chúng
Nhớ lại rằng một số nhị phân x, Ở đâu xTôi có nghĩa là Tôibit, đại diện cho số
ta đang nói là đúng.
Bertrand Russell , Gần
đây Từ ngữ về các … 1 ( x 3 3 23 ) 1 ( x2 3 22 ) 1 ( x 1 3 21 ) 1 ( x0 3 20 )
nguyên tắc toán học,
1901 Chuyển các bit của c ngay bởi n các bit dường như giống như chia cho 2n Và
điều này. là đúng với số nguyên không dấu. Vấn đề là với số nguyên đã ký. Ví
dụ: giả sử chúng ta muốn chia −5mười bằng 4mười; thương số phải là −1mườiHai
đại diện bổ sung của −5.mười là

11111111 11111111 11111111 11111011hai

Theo sai lầm này, chuyển đổi ngay bởi hai nên chia cho 4mười (22):

0011111 111111111 11111111 11111110hai

Với 0 trong bit dấu, kết quả này rõ ràng là sai. Giá trị được tạo bởi quyền dịch
chuyển thực sự là 4.611.686.018.427.387.902mười thay vì −1mười.
Một giải pháp sẽ là có một số học phải dịch chuyển mở rộng bit dấu thay vì
dịch chuyển trong 0s. Một sự thay đổi số học 2 bit bên phải − 5mười sản xuất

11111111 111111111 11111111 11111110hai

Kết quả là −2mười thay vì −1mười; gần, nhưng không có xì gà.


Pitfall: Bổ sung điểm nổi không liên kết.
Liên kết giữ cho một chuỗi hai bổ sung số nguyên bổ sung, ngay cả khi tính toán
tràn ra. Than ôi, vì số dấu phẩy động là xấp xỉ của số thực và vì số học máy tính
có độ chính xác hạn chế, nó không giữ được số dấu phẩy động. Với phạm vi số
lượng lớn có thể được biểu thị bằng dấu phẩy động, các vấn đề xảy ra khi thêm
hai số lượng lớn các dấu hiệu ngược lại cộng với một số nhỏ. Ví dụ, hãy để xem
nếu c + (a + b) = (c + a) + b Giả sử. c = −1,5mười × 1038, a = 1,5mười × 1038, và b
= 1.0 và đây đều là những số chính xác duy nhất.
3.9 Ngụy biện và Cạm bẫy 239

1. (1 .
c (một b) 5mười 1038 5mười 1038 1.0)
1. (1 .5mườ
38 38
5mười 10 i 10 )
0 .0
(1 .5mườ 1.
(c + a) + b i 1038 5mười 1038 ) 1 .0
(0 .0mười ) 1 .0
1 .0
Vì số dấu phẩy động có độ chính xác hạn chế và dẫn đến xấp xỉ kết quả thực,
1,5mười × 1038 lớn hơn nhiều so với 1.0mười 1.5mười × 1038 + 1.0 vẫn là 1.5mười ×
1038 Đó là lý do tại sao tổng của. c, a, và b là 0,0 hoặc 1,0, tùy thuộc vào thứ tự
của các bổ sung dấu phẩy động, vì vậy c + (a + b) (c + a) + b Do đó, bổ sung
điểm nổi là. không phải liên kết.
Fallacy: Các chiến lược thực thi song song hoạt động cho các loại dữ liệu số
nguyên cũng hoạt động cho các loại dữ liệu dấu phẩy động.
Các chương trình thường được viết trước để chạy tuần tự trước khi được viết lại
để chạy đồng thời, vì vậy một câu hỏi tự nhiên là, Do Do hai phiên bản có cùng
một câu trả lời?Nếu câu trả lời là không, bạn cho rằng có một lỗi trong phiên bản
song song mà bạn cần theo dõi.
Cách tiếp cận này giả định rằng số học máy tính không ảnh hưởng đến kết quả
khi đi từ tuần tự sang song song. Đó là, nếu bạn đã thêm một triệu số vào nhau,
bạn sẽ nhận được kết quả tương tự cho dù bạn đã sử dụng một bộ xử lý hay 1000
bộ xử lý. Giả định này giữ cho hai số nguyên bổ sung, vì cộng số nguyên là liên
kết. Than ôi, vì bổ sung điểm nổi không liên quan, giả định không giữ.
Một phiên bản gây phiền nhiễu hơn của ngụy biện này xảy ra trên một máy tính
song song trong đó bộ lập lịch hệ điều hành có thể sử dụng một số bộ xử lý khác
nhau tùy thuộc vào những chương trình khác đang chạy trên máy tính song song. Vì
số lượng bộ xử lý khác nhau từ mỗi lần chạy sẽ khiến các tổng điểm nổi được tính
theo các đơn đặt hàng khác nhau, mỗi lần nhận được các câu trả lời hơi khác nhau
mặc dù chạy mã giống hệt nhau với đầu vào giống hệt nhau có thể làm cho các lập
trình viên song song không biết.
Với tình trạng khó khăn này, các lập trình viên viết mã song song với các số dấu phẩy
động cần xác minh xem kết quả có đáng tin hay không, ngay cả khi họ không đưa ra câu
trả lời chính xác giống như mã tuần tự. Lĩnh vực liên quan đến các vấn đề như vậy được
gọi là phân tích số, là chủ đề của sách giáo khoa theo đúng nghĩa của nó. Những lo ngại
như vậy là một lý do cho sự phổ biến của các thư viện số như LAPACK và ScaLAPAK,
đã được xác nhận ở cả hai dạng tuần tự và song song của chúng.
Fallacy: Chỉ các nhà toán học lý thuyết quan tâm đến độ chính xác của dấu phẩy động.
Tiêu đề báo chí tháng 11 năm 1994 chứng minh tuyên bố này là sai lầm (xem
Hình 3.21). Sau đây là câu chuyện bên trong đằng sau các tiêu đề.
Pentium sử dụng thuật toán phân chia điểm nổi tiêu chuẩn tạo ra nhiều bit thương số
mỗi bước, sử dụng các bit ước tính và cổ tức quan trọng nhất để đoán 2 bit tiếp theo của
thương số. Dự đoán được lấy từ một bảng tra cứu có chứa −2, 1, 0, +1 hoặc +2. Dự đoán
được nhân với ước số và trừ đi phần còn lại
240 Chương 3 Số học cho máy tính

HÌNH 3.21 Một mẫu các bài báo và tạp chí từ tháng 11 năm 1994, bao gồm cả Thời báo New York,
Tin tức thủy ngân San Jose, Biên niên sử San Francisco, và Infoworld. Lỗi phân chia điểm nổi
Pentium thậm chí còn tạo ra đoạn độc thoại hài hước mở đầu David Letterman Chương trình muộn trên truyền
hình. (Bạn biết những gì tuyệt vời với những con chip Pentium bị lỗi? Phá vỡ Pentium salsa!Intel) Cuối cùng đã
bỏ ra 500 triệu đô la để thay thế các chip lỗi.

để tạo ra một phần còn lại mới. Giống như bộ phận không quan tâm, nếu một dự
đoán trước đó quá lớn, phần còn lại được điều chỉnh trong một lần tiếp theo.
Rõ ràng, có năm yếu tố của bảng từ 80486 mà các kỹ sư Intel nghĩ rằng không bao giờ có
thể truy cập được và họ đã tối ưu hóa PLA để trả về 0 thay vì 2 trong các tình huống này trên
Pentium. Intel đã sai: trong khi 11 bit đầu tiên luôn chính xác, các lỗi sẽ thỉnh thoảng xuất hiện
ở các bit 12 đến 52 hoặc các chữ số thập phân thứ 4 đến 15.
Một giáo sư toán học tại Lynchburg College ở Virginia, Thomas Nicely, đã phát
hiện ra lỗi này vào tháng 9 năm 1994. Sau khi gọi hỗ trợ kỹ thuật của Intel và không
nhận được phản ứng chính thức, ông đã đăng khám phá của mình lên Internet. Bài
đăng này đã dẫn đến một câu chuyện trong một tạp chí thương mại, từ đó khiến Intel
đưa ra thông cáo báo chí. Nó gọi lỗi này là một trục trặc sẽ chỉ ảnh hưởng đến các nhà
toán học lý thuyết, với người dùng bảng tính trung bình nhìn thấy lỗi cứ sau 27.000
năm. Nghiên cứu của IBM đã sớm phản bác rằng người dùng bảng tính trung bình sẽ
thấy lỗi cứ sau 24 ngày. Intel đã sớm ném vào khăn bằng cách đưa ra thông báo sau
vào ngày 21 tháng 12 :
Chúng tôi tại Intel muốn chân thành xin lỗi vì đã xử lý lỗ hổng bộ xử lý Pentium
được công bố gần đây. Biểu tượng Intel Inside có nghĩa là máy tính của bạn có bộ vi
xử lý không thua kém chất lượng và hiệu suất. Hàng ngàn nhân viên của Intel làm
việc rất chăm chỉ để đảm bảo rằng điều này là đúng. Nhưng không có bộ vi xử lý là
bao giờ
3.10 Nhận xét kết luận 241

hoàn hảo. Những gì Intel tiếp tục tin là về mặt kỹ thuật, một vấn đề cực kỳ nhỏ đã xảy ra
với cuộc sống của chính nó. Mặc dù Intel chắc chắn đứng sau chất lượng của phiên bản
hiện tại của bộ xử lý Pentium, chúng tôi nhận ra rằng nhiều người dùng có mối quan tâm.
Chúng tôi muốn giải quyết những mối quan tâm này. Intel sẽ trao đổi phiên bản hiện tại
của bộ xử lý Pentium cho phiên bản cập nhật, trong đó lỗ hổng phân chia điểm nổi này
được sửa chữa, cho bất kỳ chủ sở hữu nào yêu cầu, miễn phí bất cứ lúc nào trong suốt
vòng đời của máy tính.

Các nhà phân tích ước tính rằng việc thu hồi này tiêu tốn 500 triệu đô la của
Intel và các kỹ sư của Intel đã không nhận được tiền thưởng Giáng sinh năm đó.
Câu chuyện này đưa ra một vài điểm để mọi người suy ngẫm. Nó sẽ rẻ hơn
bao nhiêu để sửa lỗi vào tháng 7 năm 1994? Chi phí để sửa chữa thiệt hại cho
danh tiếng của Intel? Và trách nhiệm của công ty trong việc tiết lộ lỗi trong một
sản phẩm được sử dụng rộng rãi và dựa vào như một bộ vi xử lý?

3.10 Kết luận

Trong nhiều thập kỷ, số học máy tính đã trở thành tiêu chuẩn hóa, giúp tăng
cường đáng kể tính di động của các chương trình. Hai số học số nguyên nhị phân
bổ sung được tìm thấy trong mỗi máy tính được bán ngày hôm nay và nếu nó bao
gồm hỗ trợ dấu phẩy động, nó cung cấp số học dấu phẩy động nhị phân IEEE
754.
Số học máy tính được phân biệt với số học giấy và bút chì bởi các ràng buộc của độ
chính xác hạn chế. Giới hạn này có thể dẫn đến các hoạt động không hợp lệ thông qua
việc tính toán các số lớn hơn hoặc nhỏ hơn các giới hạn được xác định trước. Những bất
thường như vậy, được gọi là tràn tràn ra, hoặc có thể dẫn đến các trường hợp ngoại lệ hoặc
gián đoạn, các sự kiện khẩn cấp tương tự như các cuộc gọi chương trình con không có kế
hoạch. Chương 4 và 5 thảo luận về các ngoại lệ chi tiết hơn.
Số học điểm nổi có thêm thách thức là xấp xỉ số thực và cần thận trọng để
đảm bảo rằng số máy tính được chọn là đại diện gần nhất với số thực. Những
thách thức của sự thiếu chính xác và đại diện hạn chế của điểm nổi là một phần
của cảm hứng cho lĩnh vực phân tích số. Việc chuyển sang song song sẽ chiếu
ánh sáng tìm kiếm vào phân tích số một lần nữa, vì các giải pháp được coi là an
toàn trên các máy tính tuần tự phải được xem xét lại khi cố gắng tìm thuật toán
nhanh nhất cho các máy tính song song vẫn đạt được kết quả chính xác.
Song song cấp dữ liệu, cụ thể là song song từ con, cung cấp một đường dẫn đơn giản
đến hiệu suất cao hơn cho các chương trình chuyên sâu về các phép toán số học cho dữ
liệu số nguyên hoặc dấu phẩy động. Chúng tôi đã chỉ ra rằng chúng tôi có thể tăng tốc ma
trận nhân gần gấp tám lần bằng cách sử dụng các hướng dẫn có thể thực hiện tám thao tác
dấu phẩy động cùng một lúc.
Với lời giải thích về số học máy tính trong chương này, một mô tả về nhiều
hơn nữa của tập lệnh RISC-V.
Hình 3.22 xếp hạng mức độ phổ biến của hai mươi hướng dẫn RISC-V phổ biến
nhất các điểm chuẩn số nguyên và dấu phẩy động của Spec CPU2006. Như bạn có
thể thấy, một số lượng tương đối nhỏ các hướng dẫn chi phối các bảng xếp hạng này.
Quan sát này có ý nghĩa quan trọng đối với thiết kế của bộ xử lý, như chúng ta sẽ thấy
Chương 4.
242 Chương 3 Số học cho máy tính

Hướng dẫn RISC-V Tên Tần suất Tích lũy

Thêm ngay lập tức addi 14,36% 14,36%


Tải từ lw 12,65% 27,01%
Thêm thanh ghi thêm 7,57% 34,58%
Tải fl. pt. gấp đôi fld 6,83% 41,41%
Lưu trữ từ sw 5,81% 47,22%
Chi nhánh nếu không bằng nhau bne 4,14% 51,36%
Chuyển sang trái ngay lập tức slli 3,65% 55,01%
Hợp nhất mul-thêm đôi fmadd.d 3,49% 58,50%
Chi nhánh nếu bằng nhau beq 3,27% 61,77%
Thêm từ ngay lập tức thêm vào 2,86% 64,63%
Lưu trữ fl. pt. gấp đôi fsd 2,24% 66,87%
Nhân fl. pt. gấp đôi fmul.d 2,02% 68,89%

HÌNH 3.22 Tần suất của các hướng dẫn RISC-V cho các điểm chuẩn của CPU2006. 17
hướng dẫn phổ biến nhất, chiếm 76% tổng số hướng dẫn được thực hiện, được bao gồm trong bảng.
Pseudoinstructions được chuyển đổi thành RISC-V trước khi thực hiện và do đó không xuất hiện ở đây,
giải thích một phần về mức độ phổ biến của addi.

Bất kể tập lệnh hay kích thước của nó là gì, RISC-V, MIPS, ARM, x86, không
bao giờ quên rằng các mẫu bit không có ý nghĩa cố hữu. Mẫu bit tương tự có thể
đại diện cho một số nguyên đã ký, số nguyên không dấu, số dấu phẩy động,
chuỗi, lệnh, v.v. Trong các máy tính chương trình được lưu trữ, chính hoạt động
trên mẫu bit quyết định ý nghĩa của nó.

Gresham từ Luật
(tiền xấu của Bad lái 3 11 Quan điểm lịch sử và hơn thế nữa
ra Good Good) cho
các máy tính sẽ nói, 2. Đọc hiểu
Nhanh The Fast loại
bỏ Chậm ngay cả khi Phần này khảo sát lịch sử của điểm nổi quay trở lại von Neumann, bao gồm cả
Fast sai.Giáo dục nỗ lực tiêu chuẩn gây tranh cãi đáng ngạc nhiên của IEEE, cộng với lý do cho
W. Kahan , 1992 kiến trúc ngăn xếp 80 bit cho điểm nổi trong x86. Xem phần còn lại của Mục
3.11 trực tuyến.

3.12 Tự học

Dữ liệu có thể là bất cứ điều gì. Trong phần Tự học ở cuối Chương 2, chúng tôi đã
thấy mẫu bit nhị phân 0000000101001011001000000000011hai trong thập lục phân

3.11 Quan điểm lịch sử và đọc thêm 242.e1

Gresham từ Luật
(tiền xấu của Bad lái
3.11 Quan điểm lịch sử và đọc thêm ra Good Good) cho
các máy tính sẽ nói,
Nhanh The Fast loại
Phần này khảo sát lịch sử của điểm nổi quay trở lại von Neumann, bao gồm nỗ
lực tiêu chuẩn IEEE gây tranh cãi đáng ngạc nhiên, lý do cho kiến trúc ngăn xếp bỏ Chậm ngay cả khi
80 bit cho điểm nổi trong IA-32 và cập nhật về vòng tiếp theo của tiêu chuẩn. Fast sai.Giáo dục
W. Kahan, 1992
Lúc đầu, có thể khó tưởng tượng một chủ đề ít phấn khích hơn tính chính xác
của số học máy tính hoặc độ chính xác của nó, và khó hiểu hơn tại sao một chủ
đề quá cũ và toán học lại gây tranh cãi như vậy. Số học máy tính cũng lâu đời
như chính máy tính, và một số khái niệm sớm nhất của chủ đề, như việc sử dụng
lại các thanh ghi trong quá trình nhân và chia nối tiếp, vẫn còn tôn trọng ngày
nay. Maurice Wilkes [1985] nhớ lại một cuộc trò chuyện về khái niệm đó trong
chuyến thăm Hoa Kỳ năm 1946, trước khi máy tính chương trình được lưu trữ
sớm nhất được chế tạo :
… một dự án dưới thời von Neumann sẽ được thành lập tại Viện nghiên cứu
nâng cao ở Princeton.... Goldstine giải thích cho tôi các tính năng chính của
thiết kế, bao gồm cả thiết bị theo đó các chữ số của hệ số nhân được đặt vào
đuôi của bộ tích lũy và chuyển ra khi phần ít quan trọng nhất của sản phẩm
được chuyển vào. Tôi bày tỏ sự ngưỡng mộ về cách sắp xếp các thanh ghi và
mạch chuyển đổi ... và Goldstine nhận xét rằng những thứ thuộc về bản chất
đó rất dễ đến với von Neumann.
Không có tranh cãi ở đây; nó khó có thể phát sinh trong bối cảnh số học số
nguyên chính xác, miễn là có thỏa thuận chung về số nguyên nào kết quả chính xác.
Tuy nhiên, ngay khi số học gần đúng đi vào bức tranh, thì tranh cãi cũng vậy, như thể
một người khác là một người không đáng kể, phải là một người khác.Giáo dục

Tranh chấp đầu tiên


Số học nổi bất đồng đã được xây dựng trước khi nó được xây dựng. John von
Neumann nhận thức được đề xuất của Konrad Zuse, cho một máy tính ở Đức vào
năm 1939 chưa từng được chế tạo, có lẽ vì điểm nổi khiến nó có vẻ quá phức tạp
để kết thúc trước khi người Đức dự kiến Thế chiến II kết thúc. Do đó, von
Neumann từ chối đưa nó vào máy tính mà ông đã chế tạo tại Princeton. Trong
một báo cáo có ảnh hưởng đồng tác giả vào năm 1946 với H. H. Goldstine và A.
W. Burks, ông đã đưa ra các lập luận cho và chống lại điểm nổi. Có lợi :
… để giữ lại trong một tổng hoặc sản phẩm càng nhiều chữ số quan trọng
càng tốt và ... để giải phóng người vận hành khỏi gánh nặng ước tính và chèn
vào một vấn đề Các yếu tố quy mô của các yếu tố quy mô khác nhau, các hằng
số đa biến phục vụ để giữ các số trong giới hạn của máy.
242.e2 3.11 Quan điểm lịch sử và đọc thêm

Điểm nổi đã được loại trừ vì nhiều lý do :


Tất nhiên, không thể phủ nhận thực tế là thời gian của con người được tiêu thụ để
sắp xếp cho việc đưa ra các yếu tố quy mô phù hợp. Chúng tôi chỉ lập luận rằng
thời gian tiêu thụ là một tỷ lệ rất nhỏ trong tổng thời gian chúng tôi sẽ dành để
chuẩn bị một vấn đề thú vị cho máy của chúng tôi. Ưu điểm đầu tiên của điểm nổi
là, chúng tôi cảm thấy, hơi ảo tưởng. Để có một điểm nổi như vậy, người ta phải
lãng phí dung lượng bộ nhớ mà có thể được sử dụng để mang nhiều chữ số hơn
cho mỗi từ. Do đó, dường như chúng ta không rõ liệu những lợi thế khiêm tốn của
điểm nhị phân nổi có bù đắp cho việc mất dung lượng bộ nhớ và độ phức tạp gia
tăng của các mạch số học và điều khiển hay không.
Đối số dường như là hầu hết các bit dành cho các trường số mũ sẽ bị lãng phí.
Kinh nghiệm đã được chứng minh khác.
Một cách tiếp cận phần mềm để phù hợp với thực tế mà không cần phần cứng
dấu phẩy động đã được gọi vectơ nổi; ý tưởng là tính toán theo hệ số một thang
đo thời gian chạy cho toàn bộ các số, chọn hệ số tỷ lệ sao cho số lớn nhất của
mảng sẽ hầu như không lấp đầy trường của nó. Đến năm 1951, James H.
Wilkinson đã sử dụng sơ đồ này rộng rãi cho các tính toán ma trận. Vấn đề đã
được chứng minh là một chương trình có thể gặp phải một giá trị rất lớn và do đó
yếu tố tỷ lệ phải phù hợp với những con số có kích thước hiếm này. Do đó, các số
phổ biến sẽ có nhiều số 0 đứng đầu, vì tất cả các số phải sử dụng một yếu tố quy
mô duy nhất. Độ chính xác đã bị hy sinh, bởi vì các bit ít quan trọng nhất phải bị
mất ở bên phải để phù hợp với 0s hàng đầu. Sự lãng phí này trở nên rõ ràng đối
với các học viên trên các máy tính ban đầu hiển thị tất cả các bit bộ nhớ của họ
dưới dạng các chấm trên các ống tia catốt (như màn hình TV) vì có thể nhìn thấy
sự mất độ chính xác. Trường hợp điểm nổi xứng đáng được sử dụng, không có sự
thay thế thực tế nào tồn tại.
Do đó, phần cứng dấu phẩy động thực sự trở nên phổ biến vì nó hữu ích. Đến năm
1957, phần cứng dấu phẩy động gần như có mặt khắp nơi. Một đơn vị dấu phẩy động
thập phân đã có sẵn cho IBM 650 và ngay sau đó, sê-ri IBM 704, 709, 7090, 7094 ...
sẽ cung cấp phần cứng dấu phẩy động nhị phân cho độ chính xác kép, cũng như độ
chính xác, đơn.
Kết quả là, mọi người đều có điểm nổi, nhưng mọi thực hiện đều khác nhau.

Đa dạng so với tính di động


Vì vòng cung cấp một số lỗi vào hầu hết tất cả các thao tác dấu phẩy động, để phàn
nàn về một lỗi khác có vẻ như picayune. Vì vậy, trong 20 năm, không ai phàn nàn
nhiều rằng những hoạt động đó hoạt động hơi khác một chút trên các máy tính khác
nhau. Nếu phần mềm yêu cầu các thủ thuật thông minh để phá vỡ các đặc điểm riêng
đó và cuối cùng cung cấp kết quả chính xác trong tất cả trừ một số bit cuối cùng, thì
các thủ thuật đó được coi là một phần của nghệ thuật lập trình viên. Trong một thời
gian dài, các tính toán ma trận làm bí ẩn hầu hết những người không có khái niệm
phân tích lỗi; có lẽ điều này tiếp tục là sự thật. Cái đó
3.11 Quan điểm lịch sử và đọc thêm 242.e3

có thể là lý do tại sao mọi người vẫn ngạc nhiên rằng các tính toán ma trận ổn định số
lượng phụ thuộc vào chất lượng số học ở rất ít nơi, ít hơn nhiều so với thường được
cho là. Sách của Wilkinson và các gói phần mềm được sử dụng rộng rãi như Linpack
và Eispack đã duy trì một ấn tượng sai lầm, phổ biến vào đầu những năm 1970, rằng
một mô-đun kỹ năng được tạo ra để sản xuất cầm tay phần mềm số.
Phần mềm di động ở đây có nghĩa là phần mềm được phân phối dưới dạng mã
nguồn trong một số ngôn ngữ tiêu chuẩn được biên dịch và thực thi trên thực tế
bất kỳ máy tính có ý nghĩa thương mại nào và sau đó nó sẽ thực hiện nhiệm vụ
của mình cũng như bất kỳ chương trình nào khác thực hiện nhiệm vụ đó trên máy
tính đó. Trong chừng mực phần mềm số thường được cho là bao gồm hoàn toàn
các công thức toán học độc lập với máy tính, tính di động của nó thường được coi
là điều hiển nhiên; sai lầm trong giả định đó sẽ sớm trở nên rõ ràng.
Các gói như Linpack và Eispack tốn rất nhiều tiền để phát triển trên một trăm
đô la cho mỗi dòng Fortran giao cho họ mà họ không thể được phát triển nếu
không có trợ cấp của chính phủ Hoa Kỳ; tính di động của họ là tiền đề cho trợ cấp
đó. Nhưng không ai nghĩ để phân biệt các thành phần khác nhau đóng góp vào chi
phí của họ. Một thành phần là thuật toán hóa ra một thuật toán xứng đáng để hoạt
động trên ít nhất một máy tính mặc dù các giới hạn làm tròn và quá / dưới của nó.
Một thành phần khác là nỗ lực kỹ thuật phần mềm cần thiết để đạt được và xác
nhận tính di động đối với các máy tính đa dạng có ý nghĩa thương mại tại thời
điểm đó; thành phần này ngày càng trở nên nặng nề hơn khi các loại mỹ phẩm nổi
đa dạng hơn nở rộ vào những năm 1970. Nhưng hiếm khi có ai nhận ra sự đa
dạng đó đã làm tăng chi phí của các gói phần mềm như vậy.

Một bước lùi


Bằng chứng ban đầu cho thấy các loại mỹ phẩm có phần khác nhau có thể gây ra
chi phí phát triển phần mềm khác nhau được trình bày vào năm 1964. Nó đã xảy
ra tại một cuộc họp của SHARE, nhóm người dùng máy tính lớn của IBM, tại đó
IBM đã công bố System / 360, kế thừa của loạt 7094. Một trong những diễn giả
đã mô tả các thủ thuật mà anh ta đã buộc phải đưa ra để đạt được mức chất lượng
cho thư viện S / 360 không quá cao như trước đây anh ta đã đạt được cho 7094.
Von Neumann có thể đã báo trước một phần của rắc rối, nếu anh ta vẫn còn
sống. Năm 1948, ông và Goldstine đã công bố một phân tích lỗi dài rất khó khăn
và bi quan đến mức hầu như không ai chú ý đến nó. Tuy nhiên, nó đã dự đoán
chính xác rằng các tính toán với các mảng dữ liệu lớn hơn có thể sẽ trở thành con
mồi để làm tròn thường xuyên hơn. IBM S / 360s có những ký ức lớn hơn 7094,
vì vậy mảng dữ liệu có thể phát triển lớn hơn và chúng đã làm được. Để làm cho
vấn đề tồi tệ hơn, S / 360 có các từ có độ chính xác đơn hẹp hơn (32 bit so với 36)
và sử dụng số học cruder (hexadecimal hoặc base 16 so với nhị phân hoặc base 2)
với độ chính xác trường hợp xấu nhất kém hơn (21 bit đáng kể so với 27) so với
7094 cũ. Do đó,
242.e4 3.11 Quan điểm lịch sử và đọc thêm

phần mềm hầu như luôn cung cấp độ chính xác thỏa đáng (hầu như) trên 7094
thường tạo ra kết quả không chính xác khi chạy trên S / 360. Cách nhanh nhất để
phục hồi độ chính xác đầy đủ là thay thế các mã cũ Khai báo độ chính xác đơn lẻ
với độ chính xác kép trước khi biên dịch lại cho S / 360. Thực hành này đã thực
hiện độ chính xác gấp đôi S / 360 nhiều hơn so với dự kiến.
Những rắc rối tồi tệ nhất đầu S / 360, là do thiếu một chữ số bảo vệ với độ
chính xác gấp đôi. Sự thiếu hụt này xuất hiện trong phép nhân là một thất bại của
danh tính như 1.0 * x = x vì nhân lên x bằng 1.0 giảm xChữ số thập lục phân cuối
cùng (4 bit). Tương tự, nếu x và y rất gần nhưng có số mũ khác nhau, phép trừ bỏ
chữ số cuối cùng của toán hạng nhỏ hơn trước khi tính toán x - ySự quang sai cuối
cùng này trong độ chính xác kép làm suy yếu một định lý quý giá mà độ chính
xác duy nhất sau đó (và bây giờ) được tôn vinh: Nếu 1/2.x/y ≤2, sau đó không có
lỗi làm tròn có thể xảy ra khi x - y được tính toán; nó phải được tính toán chính
xác.
Vô số tính toán đã được hưởng lợi từ định lý nhỏ này, thường là vô tình, trong
vài thập kỷ trước khi có thông báo và bằng chứng chính thức đầu tiên. Chúng tôi
đã được coi là tất cả những thứ này.
Các bản sắc và định lý về các mối quan hệ chính xác vẫn tồn tại, mặc dù đã
hoàn thành, với việc triển khai hợp lý số học gần đúng không được đánh giá cao
cho đến khi chúng bị mất. Trước đây, người ta đã nghĩ rằng những thứ quan
trọng là độ chính xác (có bao nhiêu chữ số có nghĩa được mang theo) và phạm vi
(sự lan truyền giữa các ngưỡng trên / dưới). Do độ chính xác kép S / 360, có độ
chính xác và phạm vi rộng hơn so với 7094, nên phần mềm dự kiến sẽ tiếp tục
hoạt động ít nhất cũng như trước đây. Nhưng nó đã không.
Các lập trình viên đã trưởng thành thành các nhà quản lý chương trình đã kinh
hoàng với chi phí chuyển đổi phần mềm 7094 để chạy trên S / 360s. Một tiểu ban
nhỏ của SHARE đã đề xuất cải tiến cho điểm nổi S / 360. Ủy ban này đã rất ngạc
nhiên và biết ơn khi có được một phần công bằng những gì họ yêu cầu từ IBM,
bao gồm các chữ số bảo vệ quan trọng. Đến năm 1968, những thứ này đã được
trang bị thêm cho S / 360 trong lĩnh vực này với chi phí đáng kể; tệ hơn thế là
khách hàng mất niềm tin vào tính không thể sai lầm của IBM (một bài học mà
Intel học được 30 năm sau; xem Hình 3.25). Nhân viên của IBM, những người có
thể nhớ vụ việc vẫn còn rùng mình.

Những người đã chế tạo bom


Seymour Cray đã liên kết trong nhiều thập kỷ với các máy tính CDC và Cray, khi
ông chế tạo chúng, thế giới lớn nhất và nhanh nhất thế giới. Anh ấy luôn hiểu
những gì khách hàng của mình muốn nhất : tốc độVà anh ấy đã đưa nó cho họ
ngay cả khi, khi làm như vậy, anh ấy cũng cho họ những món đồ mỹ phẩm thú vị
hơn nhiều so với bất kỳ ai khác. Trong số các khách hàng của ông có các phòng
thí nghiệm lớn của chính phủ như những người ở Livermore và Los Alamos, nơi
vũ khí hạt nhân được thiết kế. Những thách thức của những người yêu thích thú
vị của người Viking đã được thuần hóa đối với những người phải vượt qua
những thách thức của Mẹ thiên nhiên.
3.11 Quan điểm lịch sử và đọc thêm 242.e5

Có lẽ tất cả chúng ta đều có thể học cách sống với idiosyncrasy số học nếu chỉ
có một idiosyncrasies máy tính phải chịu đựng. Thay vào đó, khi tích lũy các
máy tính khác nhau, các dị thường khác nhau, phần mềm sẽ chết cái chết của
hàng ngàn vết cắt. Dưới đây là một ví dụ từ các máy tính Cray :
if (x == 0,0) y = 17,0 khác y = z / x

Có thể dừng câu lệnh này bằng một lỗi chia cho không? Trên một CDC 6600
nó có thể. Lý do là một cuộc xung đột giữa bộ cộng 6600, ở đâu x được so sánh
với 0,0 và số nhân và bộ chia. Các so sánh adder đã kiểm tra x13 bit hàng đầu của
Google, có hiệu lực để phân biệt 0 với các số dấu phẩy động khác không bình
thường xHệ số nhân và bộ chia chỉ kiểm tra 12 bit hàng đầu. Do đó, các số nhỏ
tồn tại không phải là không có của bộ cộng nhưng bằng 0 với số nhân và bộ chia.
Để tránh thảm họa với những con số nhỏ này, các lập trình viên đã học cách thay
thế các tuyên bố như trên!
if (1.0 * x == 0.0) y = 17.0 other y = z / x
Nhưng tuyên bố này không an toàn khi sử dụng trong phần mềm di động vì nó bị
trục trặc một cách khó hiểu trên các máy tính khác được thiết kế bởi Cray, những
máy tính được bán bởi Cray Research, Inc. Nếu x lớn đến mức 2.0 * x sẽ tràn,
sau đó 1.0 * x cũng có thể tràn ra! Sự tràn xảy ra do các máy tính Cray kiểm tra
số mũ của sản phẩm trước khi số mũ của sản phẩm đã được chuẩn hóa, chỉ để lưu
độ trễ của một cổng AND.
Sự bất thường về lỗi làm tròn tồi tệ hơn nhiều so với sự bất thường quá mức /
dòng chảy vừa được thảo luận cũng ảnh hưởng đến máy tính Cray. Lỗi tồi tệ nhất
đến từ việc thiếu một chữ số bảo vệ trong cộng / trừ, một vấn đề của IBM S / 360s.
Xui xẻo hơn nữa cho phần mềm được nhân dịp bởi cách Cray tiết kiệm số nhân
của mình; khoảng một phần ba số bit mà các mảng số nhân bình thường tạo ra đã
bị loại khỏi số nhân của anh ta, bởi vì chúng sẽ đóng góp ít hơn một đơn vị vào vị
trí cuối cùng của sản phẩm được làm tròn Cray cuối cùng. Do đó, một số nhân
Cray sai lầm nhiều hơn một chút so với dự kiến. Lỗi này được gộp khi phép chia
mất ba phép nhân để cải thiện đối ứng gần đúng của ước số và sau đó nhân tử số
với nó. Hợp chất gốc vuông một vài lỗi nhân.
Cách nhanh chóng lái xe chậm, mặc dù nhanh đôi khi hơi sai.

Làm cho thế giới an toàn cho điểm nổi, hoặc Vice Versa
William Kahan là một đại học tại Đại học Toronto vào năm 1953 khi anh học lập
trình máy tính Ferranti-Manchester Mark-I của nó. Vì anh vào lĩnh vực này sớm,
Kahan đã làm quen với một loạt các thiết bị và một tỷ lệ lớn các tính cách hoạt động
trong điện toán; số lượng của cả hai đều nhỏ tại thời điểm đó. Ông đã thực hiện tính
toán trên các quy tắc trượt, máy tính để bàn
242.e6 3.11 Quan điểm lịch sử và đọc thêm

máy tính cơ, máy phân tích vi phân tương tự để bàn, v.v. ông đã sử dụng tất cả
trừ các máy tính và máy tính điện tử sớm nhất được đề cập trong cuốn sách này.
Kahan sườn mong muốn cung cấp phần mềm đáng tin cậy đã dẫn đến sự quan
tâm đến phân tích lỗi tăng cường trong hai năm nghiên cứu sau tiến sĩ ở Anh, nơi
anh làm quen với Wilkinson. Năm 1960, ông tiếp tục giảng dạy tại Toronto, nơi
đã mua IBM 7090 và được cấp quyền tự do cho tinker với hệ điều hành, trình
biên dịch Fortran và thư viện thời gian chạy. (Anh ta phủ nhận rằng anh ta đã đến
gần phần cứng 7090 bằng một chiếc bàn ủi hàn nhưng thừa nhận yêu cầu làm
như vậy.) Một câu chuyện từ thời điểm đó cho thấy những quan niệm sai lầm và
sự bất thường về số trong các hệ thống máy tính có thể phải chịu những chi phí
ẩn tuyệt vời như thế nào.
Một sinh viên tốt nghiệp ngành kỹ thuật hàng không đã sử dụng 7090 để mô
phỏng đôi cánh mà anh ta đang thiết kế để cất cánh và hạ cánh ngắn. Anh ta biết
một cánh như vậy sẽ khó kiểm soát nếu đặc điểm của nó bao gồm sự khởi đầu đột
ngột của gian hàng, nhưng anh ta nghĩ rằng anh ta có thể tránh điều đó. Mô phỏng
của anh ấy đã nói với anh ấy khác. Chỉ để chắc chắn rằng vòng tròn không can
thiệp, anh ta đã lặp lại nhiều tính toán của mình với độ chính xác gấp đôi và nhận
được kết quả giống như những người độc thân; đôi cánh của anh đã bị đình trệ đột
ngột ở cả hai khu vực. Thất vọng, học sinh bỏ cuộc.
Trong khi đó, Kahan đã thay thế chương trình logarit (ALOG) của IBM bằng
một trong những chương trình của riêng mình, điều mà ông hy vọng sẽ cung cấp
độ chính xác tốt hơn. Trong khi thử nghiệm nó, Kahan chạy lại các chương trình
bằng phiên bản mới của ALOG. Kết quả học sinh đã thay đổi đáng kể; Kahan
tiếp cận anh ta để tìm hiểu những gì đã xảy ra.
Học sinh hoang mang. Nhiều khi học sinh thích kết quả được tạo ra với ALOG
mới, họ dự đoán một gian hàng dần dần, anh biết họ phải sai vì họ không đồng ý với
kết quả chính xác kép của mình. Sự khác biệt giữa kết quả chính xác đơn và kép đã
biến mất vài ngày sau đó khi một bản phát hành mới của phần mềm số học chính xác
kép của IBM cho 7090 xuất hiện. (7090 không có phần cứng có độ chính xác kép.)
Ông tiếp tục viết một luận án về nó và để xây dựng đôi cánh; họ thực hiện như dự
đoán. Nhưng đó không phải là kết thúc của câu chuyện.
Năm 1963, 7090 đã được thay thế bằng 7094 nhanh hơn với phần cứng điểm
nổi chính xác kép nhưng thực tế là cùng một hướng dẫn được đặt như 7090. Chỉ
trong độ chính xác kép và chỉ khi sử dụng phần cứng mới, cánh mới đột ngột trở
lại. Rất nhiều thời gian đã được dành để tìm hiểu tại sao. Phần cứng 7094 bật ra,
giống như phần mềm 7090 thay thế và S / 360 đầu sau đó, thiếu một chút bảo vệ
trong độ chính xác kép. Giống như rất nhiều lập trình viên trên các máy tính đó
và trên Cray, học sinh đã phát hiện ra một mẹo để bù đắp cho việc thiếu một chữ
số bảo vệ; ông viết biểu thức (0,5 - x) + 0,5 thay cho 1,0 - xNgày nay chúng ta sẽ
đỏ mặt nếu chúng ta phải giải thích tại sao một mánh khóe như vậy có thể cần
thiết, nhưng nó đã giải quyết được vấn đề của học sinh.
Trong khi đó, sự hấp dẫn của California đang làm việc với Kahan và gia đình anh
ta; họ đến Berkeley và anh đến Đại học California. Một cơ hội đã xuất hiện vào năm
1974 khi các câu hỏi chính xác khiến các nhà thiết kế máy tính Hewlett-Packard phải
gọi cho một nhà tư vấn. Nhà tư vấn là Kahan, và công việc của anh ta
3.11 Quan điểm lịch sử và đọc thêm 242.e7

cải thiện đáng kể độ chính xác của máy tính HP, nhưng đó là một câu chuyện
khác. Hợp tác hiệu quả với đồng nghiệp bẩm sinh, tuy nhiên, đã củng cố anh ta
cho cơ hội tiếp theo và quan trọng.
Nó xuất hiện vào năm 1976, khi John F. Palmer tại Intel được trao quyền chỉ định
số học dấu phẩy động tốt nhất có thể có cho tất cả các dòng sản phẩm của Intel, vì
Luật Moore hiện có thể tạo ra một đơn vị dấu phẩy động trên một chip. Tiêu chuẩn
dấu phẩy động ban đầu được bắt đầu cho iAPX-432, nhưng khi muộn, Intel đã bắt
đầu 8086 dưới dạng độc lập khẩn cấp ngắn hạn cho đến khi iAPX-432 sẵn sàng.
IAPX-432 không bao giờ trở nên phổ biến, vì vậy, ứng dụng khẩn cấp đã trở thành
người mang tiêu chuẩn cho Intel. Bộ đồng xử lý dấu phẩy động 8087 cho 8086 đã
được dự tính. (A bộ đồng xử lý chỉ đơn giản là một chip bổ sung giúp tăng tốc một
phần công việc của bộ xử lý; trong trường hợp này, nó đã tăng tốc tính toán dấu phẩy
động.)
Palmer đã lấy bằng tiến sĩ tại Stanford vài năm trước và biết ai sẽ gọi cho cố
vấn về sự hoàn hảo của Kah Kahan. Họ đã đưa ra một thiết kế rõ ràng là không
thể chỉ một vài năm trước đó và dường như không hoàn toàn có thể vào thời điểm
đó. Nhưng một nhóm nhân viên Intel mới của Israel do Rafi Navé dẫn đầu cảm
thấy bị thách thức để chứng minh năng lực của họ với người Mỹ và nhảy vào cơ
hội để đưa thứ gì đó không thể vào một con chip con số 8087.
Cho đến nay, các mỹ phẩm nổi chỉ đơn thuần là đa dạng trong các máy tính lớn
đã trở nên hỗn loạn giữa các bộ vi xử lý, một trong số đó có thể chứa một tá số
học trong phần mềm hoặc phần mềm ROM. Robert G. Stewart, một kỹ sư nổi bật
trong các hoạt động của IEEE, đã chán ngấy với tình trạng hỗn loạn này và đề
xuất rằng dự thảo của IEEE một tiêu chuẩn nổi tốt. Đồng thời, từ bị rò rỉ ở Thung
lũng Silicon rằng Intel sẽ đưa vào một con chip một số điểm nổi tuyệt vời vượt xa
mọi thứ mà các đối thủ cạnh tranh có trong tâm trí. Cuộc thi phải tìm cách làm
chậm Intel, vì vậy họ đã thành lập một ủy ban để làm những gì Stewart yêu cầu.
Các cuộc họp của ủy ban này đã bắt đầu vào cuối năm 1977 với rất nhiều bản
nháp cạnh tranh từ vô số nguồn và kéo vào năm 1985, khi Tiêu chuẩn 754 của
IEEE cho Điểm nổi nhị phân được chính thức. Bản nháp chiến thắng rất gần với
bản được gửi bởi Kahan, học sinh Jerome T. Coonen và Harold S. Stone, một giáo
sư đến thăm Berkeley vào thời điểm đó. Dự thảo của họ dựa trên thiết kế Intel, với
sự cho phép của Intel, tất nhiên, được đơn giản hóa bởi Coonen. Sự kết hợp hài
hòa của các tính năng, hầu như không ai trong số họ mới, ngay từ đầu đã thu hút
được nhiều sự hỗ trợ hơn trong ủy ban và từ các chuyên gia bên ngoài như
Wilkinson hơn bất kỳ dự thảo nào khác, nhưng họ đã phải giành được sự ủng hộ
gần như nhất trí trong ủy ban để giành được sự chứng thực chính thức của IEEE,
và điều đó đã mất thời gian.

Chip đầu tiên của IEEE 754


Năm 1980, Intel trở nên mệt mỏi vì phải chờ đợi và phát hành 8087 để sử dụng
trong PC của IBM. Kiến trúc dấu phẩy động của người bạn đồng hành 8087 phải
được trang bị thêm vào không gian opcode 8086, khiến việc cung cấp hai toán
hạng mỗi lần trở nên bất tiện
242.e8 3.11 Quan điểm lịch sử và đọc thêm

hướng dẫn như được tìm thấy trong phần còn lại của 8086. Do đó, quyết định
cho một toán hạng cho mỗi lệnh sử dụng một ngăn xếp: Nhiệm vụ của nhà thiết
kế là tạo ra một đức hạnh của sự cần thiết này.Giáo dục (Kahan từ [1990] lịch sử
của lựa chọn kiến trúc ngăn xếp cho 8087 là đọc giải trí.)
Thay vì kiến trúc ngăn xếp cổ điển, không có điều khoản để tránh các biểu thức
con phổ biến bị đẩy và bật từ bộ nhớ lên trên cùng của ngăn xếp được tìm thấy trong
các thanh ghi, Intel đã cố gắng kết hợp một tệp thanh ghi phẳng với một ngăn xếp.
Lý do là sự hạn chế của đỉnh stack là một toán hạng không quá tệ vì nó chỉ yêu cầu
thực hiện một FXCH hướng dẫn (đã hoán đổi các thanh ghi) để có kết quả tương tự
như hướng dẫn hai toán tử và FXCH nhanh hơn nhiều so với các hoạt động điểm nổi
của 8087.
Vì các biểu thức dấu phẩy động không phức tạp lắm, Kahan lý luận rằng tám
thanh ghi có nghĩa là ngăn xếp sẽ hiếm khi tràn. Do đó, ông kêu gọi 8087 sử
dụng sơ đồ lai này với điều khoản ngăn xếp tràn hoặc ngăn xếp theo dòng chảy
sẽ làm gián đoạn 8086 để phần mềm ngắt có thể tạo ảo giác cho người viết trình
biên dịch của một ngăn xếp không giới hạn cho dữ liệu dấu phẩy động.
Intel 8087 đã được thực hiện ở Israel, và 7500 dặm và 10 múi giờ làm cho giao
tiếp từ California khó khăn. Theo Palmer và Morse (Primer 8087, J. Wiley, New
York, 1984, tr. 93) :
Thật không may, không ai cố gắng viết một trình quản lý ngăn xếp phần mềm
cho đến khi 8087 được xây dựng, và sau đó thì đã quá muộn; những gì quá
phức tạp để thực hiện trong phần cứng hóa ra còn tồi tệ hơn trong phần mềm.
Một điều còn thiếu là khả năng xác định thuận tiện nếu một thao tác không
hợp lệ thực sự là do tràn ngăn xếp.... Cũng thiếu là khả năng khởi động lại
hướng dẫn gây ra tràn stack ...
Kết quả là các ngoại lệ ngăn xếp quá chậm để xử lý trong phần mềm. Như Kahan
[1990] nói:
Do đó, hầu hết tất cả các ngôn ngữ cấp cao hơn Trình biên dịch phát ra mã không
hiệu quả cho họ 80x87, làm giảm hiệu suất chip chip thường 50% với các cửa
hàng giả và tải cần thiết chỉ để ngăn chặn dòng chảy chồng lên nhau....
Tôi vẫn lấy làm tiếc rằng việc triển khai ngăn xếp 8087 không hoàn toàn gọn
gàng như ý định ban đầu của tôi.... Nếu thiết kế ban đầu đã được hiện thực
hóa, các trình biên dịch ngày nay sẽ sử dụng 80x87 và con cháu của nó hiệu
quả hơn và các đối thủ cạnh tranh của Intel có thể dễ dàng tiếp thị nhanh
hơn nhưng tương thích 80x87.
Năm 1982, Motorola đã công bố 68881, nơi tìm thấy một vị trí trong Sun 3s và
Macintosh IIs; Apple đã là một người ủng hộ đề xuất ngay từ đầu. Một sinh viên tốt
nghiệp khác của Berkeley, George S. Taylor, đã sớm thiết kế một triển khai tốc độ cao
của tiêu chuẩn đề xuất cho một siêu máy tính đầu tiên (ELXSI 6400). Tiêu chuẩn đã trở
thành thực tế trước khi mực dự thảo cuối cùng của nó khô.
3.11 Quan điểm lịch sử và đọc thêm 242.e9

Một đợt áp dụng sớm đã mang lại cho ngành công nghiệp điện toán ấn tượng
sai lầm rằng IEEE 754, giống như rất nhiều tiêu chuẩn khác, có thể được thực
hiện dễ dàng bằng cách làm theo một công thức tiêu chuẩn. Không đúng. Chỉ có
sự nhiệt tình và khéo léo của những người thực hiện sớm của nó làm cho nó dễ
dàng.
Trên thực tế, để thực hiện chính xác IEEE 754 đòi hỏi sự chú ý cực kỳ nghiêm
túc đến từng chi tiết; để làm cho nó chạy nhanh đòi hỏi sự khéo léo có thẩm
quyền của thiết kế. Nếu các nhà quản lý kỹ thuật của ngành công nghiệp nhận ra
điều này, họ có thể đã không nhanh chóng khẳng định rằng, như một vấn đề của
chính sách, chúng tôi tuân thủ tất cả các tiêu chuẩn áp dụng.Giáo dục

Hôm nay, 754


Thật không may, cộng đồng viết trình biên dịch không được thể hiện đầy đủ
trong cuộc tranh luận và một số tính năng đã không cân bằng các vấn đề ngôn
ngữ và trình biên dịch so với các điểm khác. Cộng đồng đó đã chậm chạp trong
việc cung cấp các tính năng khác thường của IEEE 754 cho các lập trình viên
ứng dụng. Xử lý ngoại lệ nhân đạo là một trong những tính năng khác thường
như vậy; hướng làm tròn khác. Không có hỗ trợ trình biên dịch, các tính năng
này đã bị teo.
Các phần thành công của IEEE 754 là nó là một tiêu chuẩn được triển khai
rộng rãi với định dạng dấu phẩy động phổ biến, nó đòi hỏi độ chính xác tối thiểu
đến một nửa ulp trong bit ít quan trọng nhất và các hoạt động phải được giao
hoán.
IEEE 754/854 đã được triển khai ở mức độ trung thực đáng kể trong ít nhất
một phần của dòng sản phẩm của mọi nhà sản xuất máy tính ở Bắc Mỹ. Các
trường hợp ngoại lệ quan trọng duy nhất là con cháu DEC VAX, IBM S / 370 và
siêu máy tính vector Cray Research và cả ba đều được thay thế bằng các máy tính
tuân thủ.
Các quy tắc của IEEE yêu cầu một tiêu chuẩn được xem xét lại định kỳ để cập
nhật. Một ủy ban bắt đầu vào năm 2000 và các bản nháp của các tiêu chuẩn sửa đổi
đã được lưu hành để bỏ phiếu và những điều này đã được phê duyệt vào năm 2008.
Tiêu chuẩn sửa đổi, IEEE Std 754-2008 [2008], bao gồm một số loại mới: điểm nổi
16 bit, được gọi độ chính xác một nửa; Điểm nổi 128 bit, được gọi độ chính xác quad;
và ba loại thập phân, khớp với độ dài của các định dạng nhị phân 32 bit, 64 bit và 128
bit. IEEE Std 754-2019 đã thực hiện những thay đổi nhỏ đối với tiêu chuẩn. Kế hoạch
là xem xét lại nó cứ sau 10 năm. Năm 1989, Hiệp hội Máy tính, thừa nhận những lợi
ích được trao cho ngành công nghiệp điện toán bởi IEEE 754, đã vinh danh Kahan
với Giải thưởng Turing. Khi chấp nhận nó, anh cảm ơn nhiều cộng sự của mình vì sự
hỗ trợ siêng năng của họ, và những kẻ thù của anh vì những sai lầm ngớ ngẩn của họ.
Vì thế . . . không phải tất cả các lỗi đều xấu.
242.e10 3.11 Quan điểm lịch sử và đọc thêm

Đọc thêm
Nếu bạn quan tâm đến việc tìm hiểu thêm về điểm nổi, hai ấn phẩm của David
Goldberg [1991, 2002] là điểm khởi đầu tốt; họ có rất nhiều con trỏ đến đọc thêm.
Một số câu chuyện được kể trong phần này đến từ Kahan [1972 , 1983]Từ mới
nhất về trạng thái của nghệ thuật trong số học máy tính thường được tìm thấy.
trong Thủ tục tố tụng của Hội nghị chuyên đề được tài trợ gần đây nhất của IEEE
về Số học máy tính, được tổ chức hai năm một lần; lần thứ 27 được tổ chức vào
năm 2020.
Burks, A. W., H. H. Goldstine và J. von Neumann [1946]. Thảo luận sơ bộ về thiết kế logic của một công
cụ điện toán điện tử, trực tiếp Báo cáo cho Phòng Quân sự Hoa Kỳ., tr. 1; cũng trong Giấy tờ của John
von Neumann, W. Aspray và A. Burks (Eds.), Nhà xuất bản MIT, Nhà xuất bản Cambridge, MA và
Tomash, Los Angeles , 1987, 97 bóng146.
Bài viết cổ điển này bao gồm các đối số chống lại phần cứng dấu phẩy động.

Goldberg, D. [2002]. Số học máy tính của người Viking. Phụ lục A của Kiến trúc máy tính: Cách tiếp cận
định lượng, ấn bản thứ ba, J. L. Hennessy và D. A. Patterson, Nhà xuất bản Morgan Kaufmann, San
Francisco.
Giới thiệu nâng cao hơn về số nguyên và số học dấu phẩy động, với trọng tâm là phần cứng. Nó bao gồm
Phần 3.4 .3.6 của cuốn sách này chỉ trong 10 trang, để lại 45 trang khác cho các chủ đề nâng cao.
Goldberg, D. [1991]. Những gì mọi nhà khoa học máy tính nên biết về số học dấu phẩy động , ACM Khảo
sát tính toán 23 (1), 5 trận48.
Một giới thiệu tốt khác về số học dấu phẩy động của cùng một tác giả, lần này nhấn mạnh vào phần mềm.

Kahan, W. [1972]. Một cuộc khảo sát về phân tích lỗi, trong Thông tin. Chế biến 71 (Proc. Đại hội IFIP 71
tại Ljubljana), Tập. 2, Nhà xuất bản Bắc Hà Lan, Amsterdam, 1214 Từ1239.
Khảo sát này là một nguồn câu chuyện về tầm quan trọng của số học chính xác.
Kahan, W. [1983]. Toán học viết bằng cát, giáo dục Proc. Amer. Thống kê. PGS. Các cuộc họp mùa hè
chung năm 1983 , Phần tính toán thống kê, 12 trận26.
Tiêu đề đề cập đến silicon và là một nguồn truyện khác minh họa tầm quan trọng của số học chính xác.

Kahan, W. [1990]. Về lợi thế của ngăn xếp 8087, ghi chú khóa học chưa được công bố, Phòng Khoa học
Máy tính, Đại học California, Berkeley.
Những gì kiến trúc điểm nổi 8087 có thể có được.
Kahan, W. [1997]. Có sẵn tại http://www.cims.nyu.edu/~dbindel/group/cs279/87stack.pdf.

Một bộ sưu tập các bản ghi nhớ liên quan đến điểm nổi, bao gồm cả những con số quái thú (một lỗi
Pentium ít nổi tiếng khác) Ghi chú trên số học dấu phẩy động của IEEE (bao gồm các ý kiến về cách một
số tính năng đang gây khó chịu) và các hiệu ứng kỳ quái của tính toán điểm chuẩn (về mối bận tâm không
lành mạnh về tốc độ so với tính chính xác, độ chính xác, dễ sử dụng, linh hoạt, ...).
Koren, I. [2002]. Thuật toán số học máy tính, phiên bản thứ hai, A. K. Peters, Natick, MA .
Một cuốn sách giáo khoa nhắm vào người cao niên và sinh viên tốt nghiệp năm thứ nhất giải thích các
nguyên tắc cơ bản của số học cơ bản, cũng như các hoạt động phức tạp như các hàm logarit và lượng
giác.
Wilkes, M. V. [1985]. Hồi ức của một tiên phong máy tính, Báo chí MIT, Cambridge, MA .
Hồi ức tiên phong trên máy tính này bao gồm việc tạo ra phần cứng tiêu chuẩn để nhân và chia được phát
triển bởi von Neumann.
3.12 Tự học 243

thập phân, và như một hướng dẫn ngôn ngữ lắp ráp MIPS. Số dấu phẩy động của
IEEE 754 đại diện cho nó?
Số lượng lớn. Số nguyên 32 bit lớn nhất, tích cực là gì? Có thể bạn đại diện
cho nó chính xác trong điểm nổi chính xác đơn của IEEE 754? Nếu không, bạn
có thể đến gần như thế nào? Điều gì về điểm nổi nửa chính xác của IEEE 754?
Số học nãoHọc máy đang bắt đầu làm việc tốt đến mức nó được. cách mạng hóa nhiều
ngành công nghiệp (xem Mục 6.6.5 của Chương 6). Nó sử dụng số dấu phẩy động để tìm
hiểu, nhưng không giống như lập trình khoa học, nó không cần nhiều độ chính xác. Điểm
nổi chính xác kép, người mang tiêu chuẩn của lập trình khoa học, là quá mức cần thiết, vì
32 bit là đủ. Lý tưởng nhất là nó có thể sử dụng một nửa chính xác (16 bit), vì điều đó hiệu
quả hơn nhiều trong tính toán và bộ nhớ. Tuy nhiên, đào tạo học máy thường xử lý các số
rất nhỏ, vì vậy phạm vi rất quan trọng.
Những quan sát về nhu cầu học máy đã dẫn đến một định dạng mới không
phải là một phần của tiêu chuẩn IEEE, được gọi Não nổi 16 (được đặt theo tên
của bộ phận Google Brain Brain, đã phát minh ra định dạng). Hình 3.23 hiển thị
ba định dạng.
Giả sử Brain float 16 tuân theo các quy ước tương tự như IEEE 754, chỉ với
các kích thước trường khác nhau. Số dương nhỏ nhất mà bạn có thể biểu thị ở ba
định dạng là gì? Con số đó nhỏ hơn bao nhiêu đối với Brain float 16 so với IEEE
fp32? Hơn cho fp16?
(Nếu bạn biết về các quy tắc phụ hoặc ký hiệu, hãy bỏ qua chúng cho câu hỏi này.)
Khu vực não và năng lượng. Một hoạt động phổ biến trong học máy là nhân lên
và tích lũy như chúng ta thấy trong DGEMM, với sự chiếm lĩnh đa dạng của hầu
hết khu vực silicon và sử dụng hầu hết năng lượng. Nếu chúng ta có số nhân
nhanh như trong Hình 3.7, chúng chủ yếu là một hàm của bình phương kích
thước của các đầu vào. Những gì là tỷ lệ chính xác của diện tích / năng lượng của
ba định dạng cho bội số?
1. 322 so với. 162 so với. 162 cho fp32, fp16 và Brain float, tương ứng
2. số 82 so với. 52 so với. số 82
3. 232 so với. 102 so với. 72
4. 242 so với. 112 so với. số 82
Lập trình nãoBạn có thể nghĩ về lợi ích phần mềm của IEEE fp32 và. Não
nổi 16 có số mũ cùng kích thước?
Lựa chọn não. Đối với miền cho máy học, trong đó sau đây là đúng về Brain
float 16 số học so với điểm nổi nửa chính xác của IEEE 754?
1. Bộ não nổi 16 số nhân có phần cứng ít hơn nhiều so với độ chính xác một
nửa của IEEE 754.
2. Brain float 16 bội số lấy năng lượng ít hơn nhiều so với độ chính xác một nửa của IEEE 754.
3. Brain float 16 dễ dàng hơn cho phần mềm so với độ chính xác một nửa của
IEEE 754 khi chuyển đổi từ phần mềm chính xác hoàn toàn của IEEE 754.
4. Tất cả những điều trên.
244 Chương 3 Số học cho máy tính

MIPS-32 còn lại Tên Định dạng MIPS giả Tên Định dạng

độc quyền hoặc (rs ⊕ rt) xor R giá trị tuyệt đối abs rd, rs
b
phủ định (đã ký ạ phủ
độc quyền hoặc ngay lập tức xori TÔI hoặc n đã ký) địnhS rd, rs
dịch chuyển số học phải sra R xoay trái rol rd, rs, rt
dịch chuyển biến logic trái sllv R xoay phải ror rd, rs, rt
b

dịch chuyển biến logic phải srlv R nhân và don kiểm tra oflw (đã ký hoặc n ns.) mulS rd, rs, rt
b

dịch chuyển biến số học phải srav R nhân và kiểm tra oflw (đã ký hoặc n ns.) muloS rd, rs, rt
chuyển đến Hi mthi R chia và kiểm tra tràn div rd, rs, rt
chuyển đến Lo mtlo R chia và don kiểm tra tràn divu rd, rs, rt
b
phần còn lại (đã ký ạ
tải nửa từ lh TÔI hoặc n đã ký) remS rd, rs, rt
tải byte lb TÔI tải ngay lập tức li thứ ba, imm
tải từ trái (không liên kết) lwl TÔI địa chỉ tải la rd, addr
tải từ đúng (không liên kết) lwr TÔI tải gấp đôi ld rd, addr
cửa hàng từ trái (không liên kết) swl TÔI cửa hàng đôi sd rd, addr
lưu trữ từ đúng (không liên kết) spr TÔI từ tải không được phân bổ ulw rd, addr
tải liên kết (cập nhật nguyên tử) sẽ TÔI từ cửa hàng không được phân bổ chúng tôi rd, addr
b
cửa hàng cond. (cập nhật nguyên nửa tải không được phân bổ (đã ký ạ
tử) sc TÔI hoặc nns.) ulhS rd, addr
di chuyển nếu không Movz R nửa cửa hàng không được phân bổ ồ rd, addr
di chuyển nếu không bằng không di chuyển R chi nhánh b Nhãn
b

nhân và thêm (S hoặc n ns.) điênS R nhánh trên bằng không beqz rs, L
b b
ạ chi nhánh trên so sánh (đã ký ạ
nhân và trừ (S hoặc n ns.) msubS TÔI hoặc n đã ký) bxS rs, rt, L
chi nhánh trên  không và liên kết bgezal TÔI (x = lt, le, gt, địa lý)
nhánh trên <0 và liên kết bltzal TÔI đặt bằng nhau seq rd, rs, rt
nhảy và đăng ký liên kết jalr R đặt không bằng nhau lẻn rd, rs, rt
b
đặt trên so sánh (đã ký ạ
nhánh so với không bxz TÔI hoặc n đã ký) sxS rd, rs, rt
nhánh so với không có khả năng bxzl TÔI (x = lt, le, gt, địa lý)
(x = lt, le, gt, địa lý) tải đến điểm nổi (s hoặc d) l.f rd, addr
chi nhánh so sánh reg có khả năng bxl TÔI cửa hàng từ điểm nổi (s hoặc d) S.f rd, addr
bẫy nếu so sánh reg tx R
bẫy nếu so sánh ngay lập tức txi TÔI
(x = eq, neq, lt, le, gt, địa lý)
trở về từ ngoại lệ rfe R
gọi hệ thống syscall TÔI
phá vỡ (gây ra ngoại lệ) phá vỡ TÔI
di chuyển từ FP sang số nguyên mfc1 R
di chuyển đến FP từ số nguyên mtc1 R
FP di chuyển (s hoặc d) di chuyển.f R
FP di chuyển nếu không (s hoặc d) Movz.f R
FP di chuyển nếu không bằng không di chuyển.f R
(s hoặc d)
Căn bậc hai FP (s hoặc d) sqrt.f R
Giá trị tuyệt đối của FP (s hoặc d) abs.f R
FP phủ định (s hoặc d) phủ định.f R
Chuyển đổi FP (w, s hoặc d) cvt.f.f R
FP so sánh un (s hoặc d) c.xn.f R

HÌNH 3.23 Định dạng điểm nổi cho độ chính xác đơn của IEEE 754 (fp32), độ chính xác nửa của IEEE
754 (fp16) , và não nổi 16. Phần cứng Google TPUv3 sử dụng Brain float 16 (xem Mục 6.11).
3.12 Tự học 245

Câu trả lời tự học


Dữ liệu có thể là bất cứ điều gì. Ánh xạ số nhị phân vào định dạng dấu phẩy
động của IEEE 754 :
Ký tên (1) Số mũ (8) Phân số (23)
0 00000010hai 10010110010100000100011hai
2mười 4.925.475mười
+
Vì độ lệch số mũ cho điểm nổi chính xác duy nhất là 127, số mũ thực sự là 2-
127 hoặc -125. Phần có thể được coi là 4.925.475mười / (223-1) = 4.925.475mười /
8.388.607mười = 0,58716244544mườiÝ nghĩa thực tế và thêm 1 ngầm, vì vậy số
thực mà mẫu nhị phân đại diện là 1.58716244544.mười x 2-125 hoặc khoảng
3.731401mười x 10-38.
Một lần nữa, bài tập này chứng minh rằng không có ý nghĩa cố hữu trong một
mẫu bit; nó chỉ phụ thuộc vào cách phần mềm diễn giải nó.
Số lượng lớn.
Số nguyên 32 bit bổ sung 2 tích cực lớn nhất là 231 - 1 = 2.147.483.647.
Bạn không thể biểu diễn chính xác trong điểm nổi chính xác đơn của IEEE 754.
Ký tên (1) Số mũ (8) Phân số (23)
0 00000010hai 000000000000000000000000hai
158mười 0mười
+

= 1.0 ∗2(158-127) = 1.0 ∗231= 2.147.483.648, do đó giảm 1 từ 231 - 1. Số


lượng lớn nhất bạn có thể đại diện trong độ chính xác một nửa của
IEEE 754 là

Ký tên (1) Số mũ (5) Phân số (10)


0 11110hai 1111111111hai
30mười 1023mười
+

= (1 + 1023/1024) ∗2(30-15) = 1.999 ∗ 215 = 65.504, do đó, nó bị tắt bởi nhiều bậc
độ lớn.
Chuyển đổi số nguyên sang số float chính xác một nửa của IEEE có thể gây ra
tràn. (Số mũ 5 bit 11111hai được dành riêng cho infinites và NaN với độ chính
xác một nửa, như số mũ 11111111hai được dành riêng cho độ chính xác duy nhất.)
Số học não. Số nonzero nhỏ nhất trên mỗi định dạng :
IEEE fp32 1.0 ∗ 2-126
IEEE fp16 1.0 ∗ 2-14.
Não phao16 1.0 ∗ 2-126
Vì IEEE fp32 và Brian float 16 có số mũ có cùng kích thước, chúng có thể đại
diện cho cùng một số dương nhỏ nhất khác không. Số nhỏ nhất họ có thể đại diện
là 2112 nhỏ hơn lần so với của IEEE fp16, hoặc khoảng 5 x1033.
Khu vực não và năng lượng
Các trường số mũ và dấu không liên quan đến phép nhân, vì vậy câu trả lời là một
hàm có kích thước của ý nghĩa. Vì có một ẩn 1 theo sau là phân số trong các định
dạng này, câu trả lời đúng là số 4: 242 so với. 112 so với. số 82Cái đó.
246 Chương 3 Số học cho máy tính

làm cho hệ số nhân của IEEE fp16 gấp khoảng hai lần (121/64) kích thước hoặc
năng lượng của Brain float 16 và IEEE fp32 lớn hơn khoảng chín (576/64) lần.
Lập trình nãoVì số mũ là như nhau, điều đó có nghĩa là phần mềm sẽ. có cùng hành
vi đối với các dòng chảy và tràn, Không phải là Số (NaN), vô hạn, v.v., có nghĩa là phần
mềm sử dụng bộ não nổi 16 để thay thế IEEE fp32 trong một số tính toán có thể sẽ có ít
vấn đề tương thích hơn so với chuyển sang IEEE fp16.
Không bao giờ nhượng Lựa chọn não. Câu trả lời là 4, tất cả những điều trên. Đáng chú ý, cho máy
bộ, không bao giờ ứng dụng học tập, Brain float 16 dễ dàng hơn cho cả nhà thiết kế phần cứng và
nhượng bộ, không bao lập trình viên phần mềm. Không có gì đáng ngạc nhiên, Brain float 16 rất phổ
giờ, không bao giờ, biến cho việc học máy và Googles TPUv2 và TPUv3 là những bộ xử lý đầu tiên
không bao giờ, không thực hiện nó (Xem Mục 6.11)
có gì, dù lớn hay nhỏ,
lớn hay nhỏ không bao
giờ nhượng bộ.
Winston Churchill, 3.13 Bài tập
địa chỉ tại trường
Harrow, 1941
3.1 [5] <§3.2> 5ED4 là gì - 07A4 khi các giá trị này đại diện cho 16 bit không dấu số
thập lục phân? Kết quả nên được viết bằng thập lục phân. Hiển thị công việc của bạn.
3.2 [5] <§3.2> 5ED4 là gì - 07A4 khi các giá trị này biểu thị các số thập lục
phân 16 bit đã ký được lưu trữ ở định dạng cường độ ký? Kết quả nên được viết
bằng thập lục phân. Hiển thị công việc của bạn.
3.3 [10] <§3.2> Chuyển đổi 5ED4 thành số nhị phân. Điều gì làm cho cơ sở 16
(hexadecimal) một hệ thống đánh số hấp dẫn để thể hiện các giá trị trong máy tính?
3.4 [5] <§3.2> 4365 là gì - 3412 khi các giá trị này đại diện cho 12 bit không
dấu số bát phân? Kết quả nên được viết bằng bát phân. Hiển thị công việc của
bạn.
3.5 [5] <§3.2> 4365 là gì - 3412 khi các giá trị này thể hiện 12 bit đã ký số bát
phân được lưu trữ ở định dạng cường độ ký? Kết quả nên được viết bằng bát
phân. Hiển thị công việc của bạn.
3.6 [5] <§3.2> Giả sử 185 và 122 là số nguyên thập phân 8 bit không dấu. Tính
toán 185 bóng122. Có tràn, tràn, hoặc không?
3.7 [5] <§3.2> Giả sử 185 và 122 là các số nguyên thập phân 8 bit được ký được lưu trữ
ở định dạng cường độ ký hiệu. Tính 185 + 122. Có tràn, tràn, hoặc không?
3.8 [5] <§3.2> Giả sử 185 và 122 là các số nguyên thập phân 8 bit được ký được lưu trữ
ở định dạng cường độ ký hiệu. Tính 185 - 122. Có tràn, tràn, hoặc không?
3.9 [10] <§3.2> Giả sử 151 và 214 là các số nguyên thập phân 8 bit được ký
được lưu trữ trong hai định dạng bổ sung. Tính 151 + 214 bằng số học bão hòa.
Kết quả nên được viết bằng số thập phân. Hiển thị công việc của bạn.
3.10 [10] <§3.2> Giả sử 151 và 214 được lưu trữ số nguyên thập phân 8 bit ở
định dạng bổ sung hai. Tính 151 - 214 bằng số học bão hòa. Kết quả nên được
viết bằng số thập phân. Hiển thị công việc của bạn.
3.13 Bài tập 247

3.11 [10] <§3.2> Giả sử 151 và 214 là số nguyên 8 bit không dấu. Tính 151+ 214 sử
dụng số học bão hòa. Kết quả nên được viết bằng số thập phân. Hiển thị công việc của
bạn.
3.12 [20] <§3.3> Sử dụng một bảng tương tự như bảng hiển thị trong Hình 3.6,
tính toán sản phẩm của số nguyên 6 bit không dấu 62 và 12 sử dụng phần cứng được
mô tả trong Hình 3.3Bạn nên hiển thị nội dung của mỗi thanh ghi trên mỗi bước.
3.13 [20] <§3.3> Sử dụng một bảng tương tự như bảng hiển thị trong Hình 3.6,
tính toán sản phẩm của số nguyên 8 bit không dấu 8-bit 62 và 12 sử dụng phần cứng
được mô tả trong Hình 3.5Bạn nên hiển thị nội dung của mỗi thanh ghi trên mỗi
bước.
3.14 [10] <§3.3> Tính thời gian cần thiết để thực hiện nhân bằng cách sử dụng
cách tiếp cận được đưa ra trong Hình 3.3 và 3.4 nếu một số nguyên rộng 8 bit và mỗi
bước của thao tác mất bốn đơn vị thời gian. Giả sử rằng trong bước 1a, một phép
cộng luôn được thực hiện, hoặc phép nhân sẽ được thêm vào, hoặc số 0 sẽ là. Cũng
giả sử rằng các thanh ghi đã được khởi tạo (bạn chỉ cần đếm thời gian để thực hiện
vòng lặp nhân). Nếu điều này đang được thực hiện trong phần cứng, sự dịch chuyển
của phép nhân và số nhân có thể được thực hiện đồng thời. Nếu điều này đang được
thực hiện trong phần mềm, chúng sẽ phải được thực hiện lần lượt. Giải quyết cho
từng trường hợp.
3.15 [10] <§3.3> Tính thời gian cần thiết để thực hiện nhân bằng cách sử dụng
cách tiếp cận được mô tả trong văn bản (31 người thêm được xếp theo chiều dọc)
nếu một số nguyên rộng 8 bit và một trình bổ sung mất bốn đơn vị thời gian.
3.16 [20] <§3.3> Tính thời gian cần thiết để thực hiện nhân bằng cách sử dụng phương
pháp đưa vào Hình 3.7 nếu một số nguyên rộng 8 bit và một bộ cộng mất bốn đơn vị thời
gian.
3.17 [20] <§3.3> Như đã thảo luận trong văn bản, một cải tiến hiệu suất có thể là để
thực hiện một ca và thêm thay vì một phép nhân thực tế. Chẳng hạn, vì 9 × 6, có thể
được viết (2 × 2 × 2 + 1) × 6, chúng ta có thể tính 9 × 6 bằng cách dịch 6 sang trái ba
lần và sau đó thêm 6 vào kết quả đó. Hiển thị cách tốt nhất để tính 0 × 33 × 0 × 55
bằng cách sử dụng các ca và thêm / trừ. Giả sử cả hai đầu vào là số nguyên không dấu
8 bit.
3.18 [20] <§3,4> Sử dụng một bảng tương tự như bảng hiển thị trong Hình 3.10, tính 74
chia cho 21 sử dụng phần cứng được mô tả trong Hình 3.8Bạn nên hiển thị nội dung của
mỗi thanh ghi trên mỗi bước. Giả sử cả hai đầu vào là số nguyên 6 bit không dấu.
3.19 [30] <§3,4> Sử dụng một bảng tương tự như bảng hiển thị trong Hình 3.10, tính 74
chia cho 21 sử dụng phần cứng được mô tả trong Hình 3.11 Bạn nên hiển thị nội dung của
mỗi thanh ghi trên mỗi bước. Giả sử A và B là số nguyên 6 bit không dấu. Thuật toán này
đòi hỏi một cách tiếp cận hơi khác so với phương pháp được hiển thị trong. Hình 3.9 Bạn
sẽ muốn suy nghĩ kỹ về điều này, thực hiện một hoặc hai thử nghiệm hoặc nếu không hãy
truy cập web để tìm ra cách thực hiện công việc này một cách chính xác. (Gợi ý: một giải
pháp có thể liên quan đến việc sử dụng thực tế đó. Hình 3.11 ngụ ý đăng ký còn lại có thể
được chuyển theo một trong hai hướng.)
3.20 [5] <§3,5> Số thập phân nào làm mẫu bit 0 × 0C00000 đại diện nếu nó là
một số nguyên bổ sung hai? Một số nguyên không dấu?
3.21 [10] <§3,5> Nếu mẫu bit 0 × 0000006F được đặt vào Hướng dẫn Đăng ký,
hướng dẫn RISC-V sẽ được thực thi?
248 Chương 3 Số học cho máy tính

3.22 [10] <§3,5> Số thập phân nào làm mẫu bit 0 × 0C00000 đại diện nếu nó là
một số dấu phẩy động? Sử dụng tiêu chuẩn IEEE 754.
3.23 [10] <§3,5> Viết đại diện nhị phân của số thập phân
63,25 giả sử định dạng chính xác duy nhất của IEEE 754.
3.24 [10] <§3,5> Viết đại diện nhị phân của số thập phân
63,25 giả sử định dạng chính xác kép của IEEE 754.
3.25 [10] <§3,5> Viết đại diện nhị phân của số thập phân 63,25 giả sử nó được
lưu trữ bằng định dạng IBM chính xác duy nhất (cơ sở 16, thay vì cơ sở 2, với 7
bit số mũ).
3.26 [20] <§3,5> Viết mẫu bit nhị phân để thể hiện -1,5625 × 10-1 giả sử một
định dạng tương tự như định dạng được sử dụng bởi DEC PDP-8 (12 bit ngoài
cùng bên trái là số mũ được lưu trữ dưới dạng số bổ sung hai và 24 bit ngoài
cùng bên phải là phân số được lưu trữ dưới dạng số bổ sung hai). Không có ẩn 1
được sử dụng. Nhận xét về phạm vi và độ chính xác của mẫu 36 bit này so với
các tiêu chuẩn IEEE 754 chính xác đơn và kép.
3.27 [20] <§3,5> IEEE 754-2008 chứa độ chính xác một nửa chỉ rộng 16 bit. Bit
ngoài cùng bên trái vẫn là bit dấu, số mũ rộng 5 bit và có độ lệch 15 và mantissa dài
10 bit. Một ẩn 1 được giả định. Viết mẫu bit để biểu thị −1.5625 × 10-1 giả sử một
phiên bản của định dạng này, sử dụng định dạng vượt quá 16 để lưu trữ số mũ. Nhận
xét về phạm vi và độ chính xác của định dạng dấu phẩy động 16 bit này so với tiêu
chuẩn IEEE 754 chính xác duy nhất.
3,28 [20] <§3,5> Hewlett-Packard 2114, 2115 và 2116 đã sử dụng định dạng với
16 bit ngoài cùng bên trái là phân số được lưu trữ ở định dạng bổ sung hai, tiếp theo
là một trường 16 bit khác có 8 bit ngoài cùng bên trái là phần mở rộng của phân số
(làm cho phân số dài 24 bit) và 8 bit ngoài cùng bên phải đại diện cho số mũ . Tuy
nhiên, trong một vòng xoắn thú vị, số mũ được lưu trữ ở định dạng cường độ ký hiệu
với bit dấu ở phía bên phải! Viết mẫu bit để biểu thị −1.5625
× 10-1 giả định định dạng này. Không có ẩn 1 được sử dụng. Nhận xét về phạm vi và
độ chính xác của mẫu 32 bit này so với tiêu chuẩn IEEE 754 chính xác duy nhất.
3.29 [20] <§3,5> Tính tổng 2.6125 × 101 và 4.150390625 × 10-1 bằng tay, giả
sử A và B được lưu trữ trong độ chính xác nửa 16 bit được mô tả trong Bài tập
3.27. Giả sử 1 bảo vệ, 1 bit tròn và 1 bit dính và làm tròn đến gần nhất. Hiển thị
tất cả các bước.
3.30 [30] <§3,5> Tính sản phẩm của Mạnh8.0546875 × 100 và −1.79931640625 ×
10Cẩu1 bằng tay, giả sử A và B được lưu trữ ở định dạng nửa chính xác 16 bit được
mô tả trong Bài tập 3.27. Giả sử 1 bảo vệ, 1 bit tròn và 1 bit dính và làm tròn đến gần
nhất. Hiển thị tất cả các bước; tuy nhiên, như được thực hiện trong ví dụ trong văn
bản, bạn có thể thực hiện phép nhân ở định dạng có thể đọc được của con người thay
vì sử dụng các kỹ thuật được mô tả trong Bài tập 3.12 đến 3.14. Cho biết nếu có tràn
hoặc tràn. Viết câu trả lời của bạn ở cả định dạng dấu phẩy động 16 bit được mô tả
trong Bài tập 3.27 và cũng là số thập phân. Làm thế nào chính xác là kết quả của bạn?
Làm thế nào để nó so sánh với số bạn nhận được nếu bạn thực hiện phép nhân trên
máy tính?
3.13 Bài tập 249

3.31 [30] <§3,5> Tính bằng tay 8.625 × 101 chia cho −4.875 × 100Chỉ. tất cả
các bước cần thiết để đạt được câu trả lời của bạn. Giả sử có một người bảo vệ,
một chút tròn và một chút dính, và sử dụng chúng nếu cần thiết. Viết câu trả lời
cuối cùng ở cả định dạng dấu phẩy động 16 bit được mô tả trong Bài tập 3.27 và
bằng số thập phân và so sánh kết quả thập phân với kết quả mà bạn nhận được
nếu bạn sử dụng máy tính.
3.32 [20] <§3.10> Tính (3.984375 × 10-1 + 3.4375 × 10-1) + 1.771 × 103 bằng
tay, giả sử mỗi giá trị được lưu trữ ở định dạng nửa chính xác 16 bit được mô tả
trong Bài tập 3.27 (và cũng được mô tả trong văn bản). Giả sử 1 bảo vệ, 1 bit
tròn và 1 bit dính và làm tròn đến mức gần nhất. Hiển thị tất cả các bước và viết
câu trả lời của bạn ở cả định dạng dấu phẩy động 16 bit và số thập phân.
3.33 [20] <§3.10> Tính 3.984375 × 10-1 + (3.4375 × 10-1 + 1.771 × 103) bằng
tay, giả sử mỗi giá trị được lưu trữ ở định dạng chính xác một nửa 16 bit được
mô tả trong Bài tập 3.27 (và cũng được mô tả trong văn bản). Giả sử 1 bảo vệ, 1
bit tròn và 1 bit dính và làm tròn đến mức gần nhất. Hiển thị tất cả các bước và
viết câu trả lời của bạn ở cả định dạng dấu phẩy động 16 bit và số thập phân.
3.34 [10] <§3.10> Dựa trên câu trả lời của bạn cho Bài tập 3.32 và 3.33, không
(3.984375 × 10-1 + 3,4375 × 10-1) + 1.771 × 103 = 3.984375 × 10-1 + (3.4375 ×
10-1 + 1.771 × 103)?
3,35 [30] <§3.10> Tính (3.41796875 × 10-3 × 6.34765625 × 10-3) × 1.05625 × 102
bằng tay, giả sử mỗi giá trị được lưu trữ ở định dạng nửa chính xác 16 bit được mô tả
trong Bài tập 3.27 (và cũng được mô tả trong văn bản). Giả sử 1 bảo vệ, 1 bit tròn và
1 bit dính và làm tròn đến mức gần nhất. Hiển thị tất cả các bước và viết câu trả lời
của bạn ở cả định dạng dấu phẩy động 16 bit và số thập phân.
3.36 [30] <§3.10> Tính 3.41796875 × 10-3 × (6.34765625 × 10-3 × 1.05625 × 102)
bằng tay, giả sử mỗi giá trị được lưu trữ ở định dạng chính xác một nửa 16 bit được
mô tả trong Bài tập 3.27 (và cũng được mô tả trong văn bản). Giả sử 1 bảo vệ, 1 bit
tròn và 1 bit dính và làm tròn đến mức gần nhất. Hiển thị tất cả các bước và viết câu
trả lời của bạn ở cả định dạng dấu phẩy động 16 bit và số thập phân.
3.37 [10] <§3.10> Dựa trên câu trả lời của bạn cho Bài tập 3.35 và 3.36, không
(3.41796875 × 10-3 × 6.34765625 × 10-3) × 1.05625 × 102 = 3,41796875 × 10-3 ×
(6.34765625 × 10-3 × 1.05625 × 102)?
3,38 [30] <§3.10> Tính 1.666015625 × 100 × (1.9760 × 104 + −1.9744 × 104) bằng
tay, giả sử mỗi giá trị được lưu trữ ở định dạng nửa chính xác 16 bit được mô tả
trong Bài tập 3.27 (và cũng được mô tả trong văn bản). Giả sử 1 bảo vệ, 1 bit tròn và
1 bit dính và làm tròn đến mức gần nhất. Hiển thị tất cả các bước và viết câu trả lời
của bạn ở cả định dạng dấu phẩy động 16 bit và số thập phân.
3,39 [30] <§3.10> Tính (1.666015625 × 100 × 1.9760 × 104) + (1.666015625 × 100 ×
−1.9744 × 104) bằng tay, giả sử mỗi giá trị được lưu trữ ở định dạng nửa chính xác 16 bit
được mô tả trong Bài tập 3.27 (và cũng được mô tả trong văn bản). Giả sử 1 bảo vệ, 1 bit
tròn và 1 bit dính và làm tròn đến gần nhất. Hiển thị tất cả các bước và viết câu trả lời của
bạn ở cả định dạng dấu phẩy động 16 bit và số thập phân.
250 Chương 3 Số học cho máy tính

3,40 [10] <§3.10> Dựa trên câu trả lời của bạn cho Bài tập 3.38 và 3.39, không
(1.666015625 × 100 × 1.9760 × 104) + (1.666015625 × 100 × −1.9744 × 104) =
1.666015625 × 100 × (1.9760 × 104 + −1.9744 × 104)?
3,41 [10] <§3,5> Sử dụng định dạng dấu phẩy động IEEE 754, ghi lại bit mẫu
sẽ đại diện cho −1/4. Bạn có thể đại diện chính xác −1/4?
3,42 [10] <§3,5> Bạn nhận được gì nếu bạn thêm −1/4 đến bốn lần? Những gì
là −1/4 × 4? Họ có giống nhau không? Họ nên là gì?
3,43 [10] <§3,5> Viết mẫu bit vào phần giá trị 1/3 giả sử một định dạng dấu phẩy
động sử dụng số nhị phân trong phân số. Giả sử có 24 bit và bạn không cần bình
thường hóa. Là đại diện này chính xác?
3,44 [10] <§3,5> Viết mẫu bit vào phần giá trị 1/3 giả sử một định dạng dấu
phẩy động sử dụng các số thập phân mã hóa nhị phân (cơ sở 10) trong phân số
thay vì cơ sở 2. Giả sử có 24 bit và bạn không cần bình thường hóa. Là đại diện
này chính xác?
3,45 [10] <§3,5> Viết mẫu bit giả định rằng chúng ta đang sử dụng cơ sở 15
các số trong phần giá trị 1/3 thay vì cơ sở 2. (Số cơ sở 16 sử dụng các ký hiệu 0
099 và A F. Số cơ sở 15 sẽ sử dụng 0 Tắt9 và ATHER E.) Giả sử có 24 bit và
bạn không cần phải bình thường hóa. Là đại diện này chính xác?
3,46 [20] <§3,5> Viết mẫu bit giả định rằng chúng tôi đang sử dụng cơ sở 30
các số trong phần giá trị 1/3 thay vì cơ sở 2. (Số cơ sở 16 sử dụng các ký hiệu 0
099 và A F. Số cơ sở 30 sẽ sử dụng 0 Tắt9 và ATHER T.) Giả sử có 20 bit và
bạn không cần phải bình thường hóa. Là đại diện này chính xác?
3,47 [45] <§ §3.6, 3.7> Mã C sau đây thực hiện bộ lọc FIR bốn chạm trên
mảng đầu vào sig_inGiả sử rằng tất cả các mảng là giá trị điểm cố định 16 bit.
cho (i = 3; i <128; i + +)
sigDef [i] = sig_in [i - 3] * f [0] + sig_in [i - 2] * f [1]
+ sig_in [i - 1] * f [2] + sig_in [i] * f [3];
Giả sử bạn phải viết một triển khai tối ưu của mã này bằng ngôn ngữ lắp ráp
trên bộ xử lý có hướng dẫn SIMD và thanh ghi 128 bit. Không biết chi tiết về tập
lệnh, mô tả ngắn gọn cách bạn sẽ thực hiện mã này, tối đa hóa việc sử dụng các
thao tác từ phụ và giảm thiểu lượng dữ liệu được truyền giữa các thanh ghi và bộ
Câu trả lời nhớ. Nêu tất cả các giả định của bạn về các hướng dẫn bạn sử dụng.
để kiểm tra
chính mình
§3.2, trang 193: 2.
§3.5, trang 232: 3.
4
Bộ xử lý
4.1 Giới thiệu 254
4.2 Công ước thiết kế logic 258
4.3 Xây dựng một Datapath 261
Trong một vấn đề 4.4 Một kế hoạch thực hiện đơn giản 269
lớn, không có chi 4.5 Thực hiện nhiều xe đạp 282
4.6 Tổng quan về đường ống
tiết nhỏ. 283
4.7 Datapath và điều khiển đường ống 296
Tục ngữ Pháp
4.8 Nguy cơ dữ liệu: Chuyển tiếp so
với đình trệ 313
4.9 Kiểm soát các mối nguy hiểm 325
4.10 Ngoại lệ 333
4.11 Song song thông qua Hướng dẫn 340

Tổ chức máy tính và thiết kế Phiên bản RISC-V. DOI: http://dx.doi.org/10.1016/B978-0-12-820331-6.00004-1 ©


2021 Elsevier Inc. Đã đăng ký Bản quyền.
4.12 Kết hợp tất cả lại với nhau: Intel Core i7 6700 và ARM
Cortex-A53 354
4.13 Nhanh hơn: Thuyết song song cấp độ hướng dẫn và
ma trận nhân 363

4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng


ngôn ngữ thiết kế phần cứng để mô tả và mô hình hóa một
đường ống và nhiều minh họa đường ống khác 365
4.15 Ngụy biện và Cạm bẫy 365
4.16 Kết luận 367

4.17 Quan điểm lịch sử và đọc thêm 368


4.18 Tự học 368
4.19 Bài tập 369

Năm thành phần cổ điển của một máy tính


254 Chương 4 Bộ xử lý

4.1 Giới thiệu

Chương 1 giải thích rằng hiệu suất của máy tính được xác định bởi ba khóa các
yếu tố: số lượng hướng dẫn, thời gian chu kỳ đồng hồ, và chu kỳ đồng hồ trên
mỗi hướng dẫn (CPI). Chương 2 giải thích mà trình biên dịch và kiến trúc tập
lệnh xác định số lượng hướng dẫn cần thiết cho một chương trình nhất định. Tuy
nhiên, việc triển khai bộ xử lý xác định cả thời gian chu kỳ đồng hồ và số chu kỳ
đồng hồ trên mỗi hướng dẫn. Trong chương này, chúng tôi xây dựng bộ dữ liệu
và bộ điều khiển cho hai triển khai khác nhau của tập lệnh RISC-V.
Chương này chứa một lời giải thích về các nguyên tắc và kỹ thuật được sử
dụng trong việc triển khai bộ xử lý, bắt đầu với một tổng quan rất trừu tượng và
đơn giản hóa trong phần này. Tiếp theo là phần xây dựng một datapath và xây
dựng một phiên bản đơn giản của bộ xử lý đủ để thực hiện một bộ hướng dẫn như
RISC-V. Phần lớn của chương bao gồm một thực tế hơn đường ống Triển khai
RISC-V, tiếp theo là phần phát triển các khái niệm cần thiết để thực hiện các bộ
hướng dẫn phức tạp hơn, như x86.
Đối với người đọc quan tâm đến việc hiểu cách giải thích cấp cao của các hướng
dẫn và tác động của nó đối với hiệu suất của chương trình, phần ban đầu này và Mục
4.6 trình bày các khái niệm cơ bản của đường ống. Xu hướng hiện tại được bao phủ
trong Mục
4.11, và Mục 4.12 mô tả Intel Core i7 và ARM Cortex-A53 gần đây kiến trúc. Mục
4.13 cho thấy cách sử dụng song song cấp độ lệnh để tăng gấp đôi hiệu suất của ma
trận nhân từ Mục 3.9Các phần này cung cấp đủ nền tảng để hiểu các khái niệm
đường ống ở mức cao.
Đối với người đọc quan tâm đến việc hiểu bộ xử lý và hiệu suất của nó sâu hơn ,
Phần 4.3, 4.4 và 4.7 sẽ hữu ích. Những người quan tâm đến việc học cách xây dựng
bộ xử lý cũng nên bao gồm Mục 4.2, 4.8 Từ4.10 Đối với độc giả quan tâm đến thiết
kế phần cứng hiện đại ,. Mục 4.14 mô tả cách phần cứng
ngôn ngữ thiết kế và các công cụ CAD được sử dụng để triển khai phần cứng và
sau đó cách sử dụng ngôn ngữ thiết kế phần cứng để mô tả việc triển khai đường
ống. Nó cũng cung cấp thêm một số minh họa về cách thực hiện phần cứng
đường ống.

Triển khai RISC-V cơ bản


Chúng tôi sẽ kiểm tra một triển khai bao gồm một tập hợp con của tập lệnh
RISC-V cốt lõi :
■ Các hướng dẫn tham khảo bộ nhớ tải từ (lw) và lưu trữ từ (sw)

■ Các hướng dẫn số học-logic thêm, phụ, và, và hoặc là


■ Các hướng dẫn chi nhánh có điều kiện nhánh nếu bằng nhau (beq)
Tập hợp con này không bao gồm tất cả các hướng dẫn số nguyên (ví dụ: dịch
chuyển, nhân và chia bị thiếu), cũng không bao gồm bất kỳ hướng dẫn dấu phẩy động
nào.
4.1 Giới thiệu 255

Tuy nhiên, nó minh họa các nguyên tắc chính được sử dụng trong việc tạo một
datapath và thiết kế điều khiển. Việc thực hiện các hướng dẫn còn lại là tương tự
nhau.
Khi kiểm tra việc triển khai, chúng ta sẽ có cơ hội để xem kiến trúc tập lệnh xác định
nhiều khía cạnh của việc triển khai và cách lựa chọn các chiến lược thực hiện khác nhau
ảnh hưởng đến tốc độ đồng hồ và CPI cho máy tính. Nhiều nguyên tắc thiết kế quan trọng
được giới thiệu trong Chương 1 có thể được minh họa bằng cách nhìn vào việc thực hiện,
chẳng hạn như Đơn giản ủng hộ sự đều đặnNgoài ra, hầu hết các khái niệm được sử dụng
để triển khai tập hợp con RISC-V trong chương này là cùng các ý tưởng cơ bản được sử
dụng để xây dựng một phổ rộng các máy tính, từ máy chủ hiệu suất cao đến bộ vi xử lý
đa năng đến bộ xử lý nhúng.

Tổng quan về việc thực hiện


Trong Chương 2, chúng tôi đã xem xét các hướng dẫn RISC-V cốt lõi, bao gồm
các hướng dẫn logic số học số nguyên, hướng dẫn tham chiếu bộ nhớ và hướng
dẫn nhánh. Phần lớn những gì cần phải làm để thực hiện các hướng dẫn này là
như nhau, độc lập với lớp hướng dẫn chính xác. Đối với mỗi hướng dẫn, hai bước
đầu tiên là giống hệt nhau :
1. Gửi quầy chương trình (PC) đến bộ nhớ chứa mã và lấy lệnh từ bộ nhớ đó.
2. Đọc một hoặc hai thanh ghi, sử dụng các trường của lệnh để chọn các
thanh ghi để đọc. Cho lw hướng dẫn, chúng ta chỉ cần đọc một thanh ghi,
nhưng hầu hết các hướng dẫn khác yêu cầu đọc hai thanh ghi.
Sau hai bước này, các hành động cần thiết để hoàn thành hướng dẫn phụ thuộc
vào lớp hướng dẫn. May mắn thay, đối với mỗi trong ba lớp lệnh (tham chiếu bộ
nhớ, logic số học và các nhánh), các hành động phần lớn giống nhau, không phụ
thuộc vào hướng dẫn chính xác. Sự đơn giản và đều đặn của tập lệnh RISC-V
đơn giản hóa việc thực hiện bằng cách thực hiện nhiều lớp lệnh tương tự nhau.
Ví dụ: tất cả các lớp lệnh sử dụng đơn vị số học-logic (ALU) sau khi đọc các
thanh ghi. Các hướng dẫn tham chiếu bộ nhớ sử dụng ALU để tính toán địa chỉ,
hướng dẫn logic số học để thực hiện thao tác và các nhánh có điều kiện để kiểm tra
đẳng thức. Sau khi sử dụng ALU, các hành động cần thiết để hoàn thành các lớp
hướng dẫn khác nhau khác nhau. Một hướng dẫn tham chiếu bộ nhớ sẽ cần truy cập
vào bộ nhớ để đọc dữ liệu để tải hoặc ghi dữ liệu cho một cửa hàng. Một lệnh số học
hoặc logic tải phải ghi dữ liệu từ ALU hoặc bộ nhớ trở lại vào một thanh ghi. Cuối
cùng, đối với một hướng dẫn nhánh có điều kiện, chúng ta có thể cần thay đổi địa chỉ
hướng dẫn tiếp theo dựa trên so sánh; mặt khác, PC nên được tăng thêm bốn để có
được địa chỉ của hướng dẫn tiếp theo.
Hình 4.1 cho thấy chế độ xem cấp cao của việc triển khai RISC-V, tập trung
vào các đơn vị chức năng khác nhau và kết nối của họ. Mặc dù con số này cho
thấy hầu hết luồng dữ liệu thông qua bộ xử lý, nhưng nó bỏ qua hai khía cạnh
quan trọng của việc thực hiện lệnh.
Đầu tiên, ở một số nơi , Hình 4.1 cho thấy dữ liệu đi đến một đơn vị cụ thể đến từ
hai nguồn khác nhau. Ví dụ: giá trị được ghi vào PC có thể đến
256 Chương 4 Bộ xử lý

từ một trong hai trình bổ sung, dữ liệu được ghi vào tệp đăng ký có thể đến từ
ALU hoặc bộ nhớ dữ liệu và đầu vào thứ hai cho ALU có thể đến từ một thanh
ghi hoặc trường tức thời của lệnh. Trong thực tế, các dòng dữ liệu này không thể
đơn giản được nối với nhau; chúng ta phải thêm một yếu tố logic chọn trong số
nhiều nguồn và điều khiển một trong những nguồn đó đến đích của nó. Lựa chọn
này thường được thực hiện với một thiết bị được gọi là a ghép kênh, mặc dù thiết
bị này có thể được gọi là a bộ chọn dữ liệu.Phụ lục A mô tả bộ ghép kênh, chọn
trong số một số đầu vào dựa trên cài đặt các dòng điều khiển của nó. Các dòng
điều khiển được đặt chủ yếu dựa trên thông tin được lấy từ lệnh đang được thực
thi.
Thiếu sót thứ hai trong Hình 4.1 là một số đơn vị phải được kiểm soát tùy thuộc
vào loại hướng dẫn. Ví dụ: bộ nhớ dữ liệu phải đọc trên một tải và ghi trên một cửa
hàng. Tệp đăng ký phải được viết chỉ trên một tải hoặc

Thêm vào Thêm vào

Dữ liệu

Đăng ký #
PC Địa chỉ Hướng dẫn Đăng ký ALU Địa chỉ
Đăng ký # Dữ liệu
Hướng dẫn
ký ức
ký ức Đăng ký #

Dữ liệu

HÌNH 4.1 Một cái nhìn trừu tượng về việc triển khai tập hợp con RISC-V cho thấy các đơn
vị chức năng chính và các kết nối chính giữa chúng. Tất cả các hướng dẫn bắt đầu bằng cách sử
dụng bộ đếm chương trình để cung cấp địa chỉ lệnh cho bộ nhớ lệnh. Sau khi tìm nạp lệnh, các toán hạng
thanh ghi được sử dụng bởi một lệnh được chỉ định bởi các trường của lệnh đó. Khi các toán hạng thanh
ghi đã được tìm nạp, chúng có thể được vận hành để tính toán địa chỉ bộ nhớ (cho tải hoặc lưu trữ), để tính
kết quả số học (cho một lệnh số học-logic) hoặc kiểm tra đẳng thức (cho một nhánh ). Nếu lệnh là một lệnh
số học-logic, kết quả từ ALU phải được ghi vào một thanh ghi. Nếu thao tác là tải hoặc lưu trữ, kết quả
ALU được sử dụng làm địa chỉ để tải giá trị từ bộ nhớ vào các thanh ghi hoặc lưu trữ giá trị từ các thanh
ghi. Kết quả từ ALU hoặc bộ nhớ được ghi lại vào tệp đăng ký. Các nhánh yêu cầu sử dụng đầu ra ALU để
xác định địa chỉ lệnh tiếp theo, xuất phát từ bộ cộng (trong đó tổng bù PC và nhánh) hoặc từ một bộ cộng
tăng PC hiện tại lên bốn. Các đường dày kết nối các đơn vị chức năng đại diện cho xe buýt, bao gồm nhiều
tín hiệu. Các mũi tên được sử dụng để hướng dẫn người đọc biết cách thông tin chảy. Vì các đường tín
hiệu có thể giao nhau, chúng tôi hiển thị rõ ràng khi các đường chéo được kết nối bằng sự hiện diện của
một dấu chấm nơi các đường giao nhau.
4.1 Giới thiệu 257

một hướng dẫn số học-logic. Và, tất nhiên, ALU phải thực hiện một trong một số
thao tác. (Phụ lục A mô tả thiết kế chi tiết của ALU.) Giống như các bộ ghép
kênh, các dòng điều khiển được đặt dựa trên các trường khác nhau trong hướng
dẫn chỉ đạo các thao tác này.
Hình 4.2 cho thấy datapath của Hình 4.1 với ba bộ ghép kênh cần thiết thêm vào,
cũng như các dòng điều khiển cho các đơn vị chức năng chính. A đơn vị điều khiển,
có hướng dẫn làm đầu vào, được sử dụng để xác định cách đặt các dòng điều khiển
cho các đơn vị chức năng và hai trong số các bộ ghép kênh. Bộ ghép kênh hàng đầu,

Chi nhánh

M
bạ
n
x

4
Thê
m Thêm vào M
vào
bạn
x

Hoạt động ALU


Dữ liệu

Ghi nhớ
Đăng ký #
PC Địa chỉ Hướng dẫn Đăng ký ALU Địa chỉ
Đăng ký # M Số không
Hướng dẫn bạn Dữ liệu
x ký ức
ký ức Đăng ký # RegWrite
Dữ
liệu Ghi nhớ

Điều khiển

HÌNH 4.2 Việc triển khai cơ bản của tập hợp con RISC-V, bao gồm các bộ ghép kênh và đường điều khiển cần thiết. Các bộ ghép
kênh trên cùng (của bộ chuyển đổi trực tiếp) kiểm soát giá trị nào thay thế PC (PC + 4 hoặc địa chỉ đích nhánh); bộ ghép kênh được điều khiển bởi
cổng mà AND ANDs cùng với đầu ra Zero của ALU và tín hiệu điều khiển cho biết rằng lệnh là một nhánh. Bộ ghép kênh giữa, có đầu ra trả về tệp
đăng ký, được sử dụng để điều khiển đầu ra của ALU (trong trường hợp hướng dẫn logic số học) hoặc đầu ra của bộ nhớ dữ liệu (trong trường hợp tải)
để ghi vào tập tin đăng ký. Cuối cùng, bộ ghép kênh dưới cùng được sử dụng để xác định xem đầu vào ALU thứ hai là từ các thanh ghi (cho một lệnh
logic số học hoặc một nhánh) hoặc từ trường bù của lệnh (cho tải hoặc lưu trữ). Các dòng điều khiển được thêm vào rất đơn giản và xác định thao tác
được thực hiện tại ALU, liệu bộ nhớ dữ liệu có nên đọc hoặc ghi hay không và liệu các thanh ghi có nên thực hiện thao tác ghi hay không. Các dòng
điều khiển được hiển thị màu sắc để làm cho chúng dễ nhìn hơn.
258 Chương 4 Bộ xử lý

xác định xem PC + 4 hoặc địa chỉ đích nhánh được ghi vào PC, được đặt dựa trên
đầu ra Zero của ALU, được sử dụng để thực hiện so sánh a beq chỉ dẫn. Tính đều
đặn và đơn giản của tập lệnh RISC-V có nghĩa là một quy trình giải mã đơn giản
có thể được sử dụng để xác định cách đặt các dòng điều khiển.
Trong phần còn lại của chương, chúng tôi tinh chỉnh chế độ xem này để điền vào
các chi tiết, yêu cầu chúng tôi thêm các đơn vị chức năng khác, tăng số lượng kết nối
giữa các đơn vị và, tất nhiên, tăng cường một đơn vị điều khiển để kiểm soát những
hành động được thực hiện cho các lớp hướng dẫn khác nhau. Phần 4.3 và 4.4 mô tả
một triển khai đơn giản sử dụng một chu kỳ đồng hồ dài duy nhất cho mọi hướng dẫn
và tuân theo hình thức chung Hình 4.1 và 4.2Trong thiết kế đầu tiên này, mọi lệnh bắt
đầu thực hiện trên một cạnh đồng hồ và hoàn thành thực thi trên cạnh đồng hồ tiếp
theo.
Mặc dù dễ hiểu hơn, cách tiếp cận này không thực tế, vì chu kỳ đồng hồ phải
được kéo dài nghiêm ngặt để phù hợp với hướng dẫn dài nhất. Sau khi thiết kế
điều khiển cho máy tính đơn giản này, chúng tôi sẽ xem xét việc triển khai nhanh
hơn với tất cả các phức tạp của chúng, bao gồm cả các ngoại lệ.

Kiểm tra Có bao nhiêu trong số năm thành phần cổ điển của một máy tính được hiển thị
Bản trên trang 253?
thân bạn

4.2 Công ước thiết kế logic

Để thảo luận về thiết kế của máy tính, chúng ta phải quyết định cách thức logic
phần cứng thực hiện máy tính sẽ hoạt động và cách máy tính được bấm giờ. Phần
này xem xét một vài ý tưởng chính trong logic kỹ thuật số mà chúng ta sẽ sử dụng
rộng rãi trong chương này. Nếu bạn có ít hoặc không có nền tảng về logic kỹ
thuật số, bạn sẽ thấy nó hữu ích để đọc Phụ lục A trước khi tiếp tục.
Các phần tử datapath trong triển khai RISC-V bao gồm hai loại phần tử logic khác
nhau: các phần tử hoạt động trên các giá trị dữ liệu và các phần tử có chứa trạng thái.
yếu tố kết hợp Một Các yếu tố hoạt động trên các giá trị dữ liệu là tất cả tổ hợp, có nghĩa là đầu ra của
hoạt động phần tử, họ chỉ phụ thuộc vào đầu vào hiện tại. Với cùng một đầu vào, một yếu tố kết hợp
chẳng hạn như cổng luôn tạo ra cùng một đầu ra. ALU trong Hình 4.1 và thảo luận trong Phụ lục A là một
AND hoặc ALU ví dụ về một yếu tố kết hợp. Với một tập hợp các đầu vào, nó luôn tạo ra cùng một
đầu ra vì nó không có bộ lưu trữ nội bộ.
Các yếu tố khác trong thiết kế không phải là tổ hợp, mà thay vào đó là chứa
yếu tố nhà nước Một tiểu bang Một phần tử chứa trạng thái nếu nó có một số lưu trữ nội bộ. Chúng tôi
ký ức phần tử, chẳng hạn gọi những yếu tố này. tiểu bang các yếu tố bởi vì, nếu chúng ta rút phích cắm
như một thanh ghi hoặc điện trên máy tính, chúng ta có thể khởi động lại nó chính xác bằng cách tải các
bộ nhớ.
phần tử trạng thái với các giá trị chúng chứa trước khi chúng tôi rút phích cắm.
Hơn nữa, nếu chúng ta lưu và khôi phục các yếu tố trạng thái, sẽ như thể máy
tính chưa bao giờ mất điện. Do đó, các yếu tố trạng thái này hoàn toàn đặc trưng
cho máy tính. Trong Hình 4.1, các bộ nhớ hướng dẫn và dữ liệu, cũng như các
thanh ghi, đều là các ví dụ về các yếu tố trạng thái.
4.2 Công ước thiết kế logic 259

Một phần tử trạng thái có ít nhất hai đầu vào và một đầu ra. Các đầu vào cần
thiết là giá trị dữ liệu được ghi vào phần tử và đồng hồ, xác định khi nào giá trị
dữ liệu được ghi. Đầu ra từ một phần tử trạng thái cung cấp giá trị được viết trong
một chu kỳ đồng hồ trước đó. Ví dụ: một trong những yếu tố trạng thái đơn giản
nhất về mặt logic là flip-flop loại D (xem Phụ lục A), có chính xác hai đầu vào
này (một giá trị và đồng hồ) và một đầu ra. Ngoài dép xỏ ngón, việc triển khai
RISC-V của chúng tôi sử dụng hai loại yếu tố trạng thái khác: bộ nhớ và thanh
ghi, cả hai đều xuất hiện Hình 4.1Đồng hồ được sử dụng để xác định khi nào nên
viết phần tử trạng thái; một yếu tố trạng thái có thể được đọc bất cứ lúc nào.
Các thành phần logic có chứa trạng thái cũng được gọi tuần tự, bởi vì đầu ra
của chúng phụ thuộc vào cả đầu vào của chúng và nội dung của trạng thái bên
trong. Ví dụ: đầu ra từ đơn vị chức năng đại diện cho các thanh ghi phụ thuộc cả
vào số thanh ghi được cung cấp và vào những gì được ghi vào các thanh ghi
trước đó. Phụ lục A thảo luận về hoạt động của cả các yếu tố kết hợp và tuần tự
và xây dựng của chúng chi tiết hơn.

Phương pháp đồng hồ


A phương pháp đồng hồ xác định khi nào tín hiệu có thể được đọc và khi nào đồng hồ
chúng có thể được viết. Điều quan trọng là chỉ định thời gian đọc và ghi, bởi vì phương pháp luận Các
nếu tín hiệu được viết cùng lúc với nó được đọc, giá trị của số đọc có thể tương tiếp cận được sử dụng để
ứng với giá trị cũ, giá trị mới được viết hoặc thậm chí là một số hỗn hợp của hai! xác định khi dữ liệu
hợp lệ và ổn định liên quan
Thiết kế máy tính không thể chịu đựng được sự khó đoán như vậy. Một phương đến
pháp đồng hồ được thiết kế để làm cho phần cứng có thể dự đoán được. đồng hồ.
Để đơn giản, chúng tôi sẽ giả định một đồng hồ kích hoạt cạnh phương pháp
luận. Phương pháp đồng hồ kích hoạt cạnh có nghĩa là mọi giá trị được lưu trữ đồng hồ kích hoạt
trong phần tử logic tuần tự chỉ được cập nhật trên cạnh đồng hồ, đây là sự cạnh Một chiếc đồng
hồ sơ đồ trong đó tất cả
chuyển đổi nhanh chóng từ thấp sang cao hoặc ngược lại (xem Hình 4.3). Bởi vì
các thay đổi trạng thái
chỉ các phần tử trạng thái có thể lưu trữ một giá trị dữ liệu, bất kỳ tập hợp logic xảy ra trên một cạnh
tổ hợp nào cũng phải có đầu vào của nó đến từ một tập hợp các phần tử trạng thái đồng hồ.
và đầu ra của nó được viết thành một tập hợp các phần tử trạng thái. Đầu vào là
các giá trị được viết trong chu kỳ xung nhịp trước đó, trong khi đầu ra là các giá
trị có thể được sử dụng trong chu kỳ xung nhịp sau.

Tiểu
Tiểu bang bang
thành thành
phần Logic kết hợp phần
1 2

Chu kỳ đồng hồ

HÌNH 4.3 Logic kết hợp, các yếu tố trạng thái và đồng hồ có liên quan chặt chẽ với nhau.
Trong một hệ thống kỹ thuật số đồng bộ, đồng hồ xác định khi nào các phần tử có trạng thái sẽ ghi giá trị
vào bộ lưu trữ nội bộ. Bất kỳ đầu vào nào cho một phần tử trạng thái phải đạt đến giá trị ổn định (nghĩa là
đã đạt đến giá trị mà từ đó chúng sẽ không thay đổi cho đến sau cạnh đồng hồ) trước khi cạnh đồng hồ
hoạt động làm cho trạng thái được cập nhật. Tất cả các yếu tố trạng thái trong chương này, bao gồm cả bộ
nhớ, được giả định là cạnh tích cực; nghĩa là, chúng thay đổi trên cạnh đồng hồ đang tăng.
260 Chương 4 Bộ xử lý

Hình 4.3 cho thấy hai yếu tố nhà nước xung quanh một khối tổ hợp logic, hoạt
động trong một chu kỳ đồng hồ duy nhất: tất cả các tín hiệu phải truyền từ phần
tử trạng thái 1, thông qua logic tổ hợp và đến phần tử trạng thái 2 trong thời gian
của một chu kỳ đồng hồ. Thời gian cần thiết để các tín hiệu đạt đến phần tử trạng
thái 2 xác định độ dài của chu kỳ đồng hồ.
tín hiệu điều khiển Để đơn giản, chúng tôi không hiển thị một bài viết tín hiệu điều khiển khi
Một tín hiệu được sử một phần tử trạng thái được viết trên mọi cạnh đồng hồ hoạt động. Ngược lại,
dụng để lựa chọn ghép nếu một phần tử trạng thái không được cập nhật trên mỗi đồng hồ, thì cần có tín
kênh hoặc để chỉ đạo hoạt hiệu điều khiển ghi rõ ràng. Cả tín hiệu đồng hồ và tín hiệu điều khiển ghi đều là
động của một đơn vị chức
đầu vào và phần tử trạng thái chỉ được thay đổi khi tín hiệu điều khiển ghi được
năng; tương phản với a tín
hiệu dữ liệu, trong đó có
xác nhận và xảy ra cạnh đồng hồ.
chứa thông tin được vận Chúng tôi sẽ sử dụng từ này khẳng định để chỉ ra một tín hiệu cao về mặt
hành bởi một đơn vị chức logic và khẳng định để xác định rằng tín hiệu phải được điều khiển cao về mặt
năng. logic và deassert hoặc là bị coi thường để đại diện cho logic thấp. Chúng tôi sử
khẳng định Tín hiệu
dụng các thuật ngữ xác nhận và hủy xác nhận bởi vì khi chúng tôi triển khai phần
cứng, tại thời điểm 1 đại diện cho logic cao và đôi khi nó có thể biểu thị thấp về
là logic cao hay đúng.
mặt logic.
bị coi thường Tín hiệu Một phương pháp kích hoạt cạnh cho phép chúng ta đọc nội dung của một
là logic thấp hoặc sai. thanh ghi, gửi giá trị thông qua một số logic tổ hợp và viết thanh ghi đó trong
cùng một chu kỳ đồng hồ. Hình 4.4 đưa ra một ví dụ chung. Không quan trọng
cho dù chúng tôi cho rằng tất cả các lần ghi diễn ra ở cạnh đồng hồ tăng (từ thấp
đến cao) hay trên cạnh đồng hồ rơi (từ cao đến thấp), vì các đầu vào của khối
logic tổ hợp không thể thay đổi ngoại trừ trên cạnh đồng hồ đã chọn. Trong cuốn
sách này, chúng tôi sử dụng cạnh đồng hồ tăng. Với một phương pháp thời gian
kích hoạt cạnh, có Không phản hồi trong một chu kỳ đồng hồ duy nhất và logic
trong Hình 4.4 hoạt động chính xác. Trong Phụ lục A, chúng tôi thảo luận ngắn
gọn về các hạn chế về thời gian bổ sung (như thời gian thiết lập và giữ) cũng như
các phương pháp thời gian khác.
Đối với kiến trúc RISC-V 32 bit, gần như tất cả các yếu tố trạng thái và logic này
sẽ có đầu vào và đầu ra rộng 32 bit, vì đó là chiều rộng của hầu hết dữ liệu được xử
lý bởi bộ xử lý. Chúng tôi sẽ làm rõ bất cứ khi nào một đơn vị có đầu vào hoặc đầu ra
khác với 32 bit chiều rộng. Các số liệu sẽ chỉ ra xe buýt, là các tín hiệu rộng hơn 1 bit,
với các đường dày hơn. Đôi khi, chúng tôi sẽ muốn kết hợp một số xe buýt để tạo
thành một xe buýt rộng hơn; ví dụ, chúng tôi có thể muốn có được một chiếc xe buýt
32 bit bằng cách kết hợp hai chiếc xe buýt 16 bit. Trong những trường hợp như vậy,
nhãn trên các tuyến xe buýt

Tiểu
bang
thành Logic kết hợp
phần

HÌNH 4.4 Phương pháp kích hoạt cạnh cho phép đọc và ghi phần tử trạng thái trong cùng
một chu kỳ đồng hồ mà không tạo ra một cuộc đua có thể dẫn đến các giá trị dữ liệu
không xác định. Tất nhiên, chu kỳ đồng hồ vẫn phải đủ dài để các giá trị đầu vào ổn định khi nào các
cạnh đồng hồ hoạt động xảy ra. Phản hồi không thể xảy ra trong một chu kỳ đồng hồ vì bản cập nhật kích
hoạt cạnh của phần tử trạng thái. Nếu phản hồi là có thể, thiết kế này không thể hoạt động đúng. Các thiết
kế của chúng tôi trong chương này và tiếp theo dựa trên phương pháp thời gian kích hoạt cạnh và trên các
cấu trúc giống như cấu trúc được hiển thị trong hình này.
4.3 Xây dựng một Datapath 261

sẽ làm rõ rằng chúng ta đang ghép các xe buýt để tạo thành một xe buýt rộng hơn.
Mũi tên cũng được thêm vào để giúp làm rõ hướng của luồng dữ liệu giữa các
phần tử. Cuối cùng, màu sắc chỉ ra tín hiệu điều khiển trái với tín hiệu mang dữ
liệu; sự khác biệt này sẽ trở nên rõ ràng hơn khi chúng ta tiến hành chương này.

Đúng hoặc sai: Vì tệp đăng ký vừa đọc vừa được ghi trên cùng một chu kỳ đồng Kiểm tra
hồ, nên bất kỳ biểu đồ RISC-V nào sử dụng ghi kích hoạt cạnh phải có nhiều hơn Bản thân bạn
một bản sao của tệp đăng ký.

Xây dựng: Ngoài ra còn có một phiên bản 64 bit của kiến trúc RISC-V, và, một
cách tự nhiên đủ, hầu hết các đường dẫn trong quá trình thực hiện sẽ rộng 64 bit.

4.3 Xây dựng một Datapath

Một cách hợp lý để bắt đầu thiết kế datapath là kiểm tra các thành phần chính cần
thiết để thực hiện từng loại hướng dẫn RISC-V. Hãy bắt đầu từ đầu bằng cách
nhìn vào đó yếu tố datapath mỗi hướng dẫn cần, và sau đó làm việc theo cách
của chúng tôi thông qua các cấp độ trừu tượngKhi chúng tôi hiển thị các yếu tố
datapath, chúng tôi cũng sẽ hiển thị tín hiệu điều khiển của chúng. Chúng tôi sử
dụng sự trừu tượng trong lời giải thích này, bắt đầu từ dưới lên.
Hình 4.5a hiển thị yếu tố đầu tiên chúng ta cần: một đơn vị bộ nhớ để lưu trữ
hướng dẫn của một chương trình và hướng dẫn cung cấp cho một địa chỉ. Hình 4.5b
cũng cho thấy bộ đếm chương trình (PC), mà như chúng ta đã thấy trong Chương 2
là một thanh ghi giữ địa chỉ của hướng dẫn hiện tại. Cuối cùng, chúng ta sẽ cần một yếu tố datapath A đơn
bộ cộng để tăng PC lên địa chỉ của hướng dẫn tiếp theo. Trình bổ sung này, có tính tổ vị được sử dụng để vận
hợp, có thể được xây dựng từ ALU được mô tả chi tiết trong Phụ lục A chỉ đơn giản hành trên hoặc giữ dữ
bằng cách nối các đường điều khiển để điều khiển luôn chỉ định thao tác thêm. Chúng liệu trong bộ xử lý. Trong
triển khai RISC-V, các
tôi sẽ vẽ một ALU như vậy với nhãn Thêm vào, như trong Hình 4.5c, để chỉ ra rằng
thành phần datapath bao
nó đã được tạo vĩnh viễn một bộ cộng và không thể thực hiện các chức năng ALU gồm các bộ nhớ hướng
khác. dẫn và dữ liệu, tệp đăng
Để thực hiện bất kỳ lệnh nào, chúng ta phải bắt đầu bằng cách lấy lệnh từ bộ ký, ALU và các bộ bổ
nhớ. Để chuẩn bị thực hiện hướng dẫn tiếp theo, chúng ta cũng phải tăng bộ đếm sung.
chương trình để nó trỏ vào hướng dẫn tiếp theo, 4 byte sau. Hình 4.6 cho thấy bộ đếm chương trình
làm thế nào để kết hợp ba yếu tố từ Hình 4.5 để tạo thành một phần của datapath (PC) Sổ đăng ký chứa
tìm nạp các hướng dẫn và tăng PC để có được địa chỉ của hướng dẫn tuần tự tiếp địa chỉ của lệnh trong
theo. chương trình đang được
Bây giờ hãy để xem xét các hướng dẫn định dạng R (xem Hình 2.19 trên trang thực thi.
127). Tất cả họ đều đọc hai thanh ghi, thực hiện thao tác ALU trên nội dung của
các thanh ghi và viết kết quả vào một thanh ghi. Chúng tôi gọi những hướng dẫn
này Loại R hướng dẫn hoặc là hướng dẫn số học-logic (vì họ thực hiện số học
hoặc hoạt động logic). Lớp hướng dẫn này bao gồm thêm, phụ, và, và hoặc là, cái
nào
262 Chương 4 Bộ xử lý

Hướng dẫn
Địa chỉ

Hướng Thêm vào Tổng


dẫn PC

Hướng dẫn
ký ức

a. Bộ nhớ hướng dẫn b. Bộ đếm chương trình c. Adder

HÌNH 4.5 Hai yếu tố trạng thái là cần thiết để lưu trữ và truy cập hướng dẫn và cần có một
bộ cộng để tính toán địa chỉ hướng dẫn tiếp theo. Các yếu tố nhà nước là hướng dẫn bộ nhớ và
bộ đếm chương trình. Bộ nhớ lệnh chỉ cần cung cấp quyền truy cập đọc vì datapath không viết hướng dẫn.
Vì bộ nhớ lệnh chỉ đọc, chúng tôi coi nó là logic tổ hợp: đầu ra bất cứ lúc nào phản ánh nội dung của vị trí
được chỉ định bởi đầu vào địa chỉ và không cần tín hiệu điều khiển đọc. (Chúng tôi sẽ cần viết bộ nhớ
hướng dẫn khi tải chương trình; điều này không khó để thêm và chúng tôi bỏ qua nó để đơn giản.) Bộ đếm
chương trình là một thanh ghi 32 bit được viết ở cuối mỗi chu kỳ đồng hồ và do đó không cần tín hiệu điều
khiển ghi. Trình bổ sung là ALU có dây để luôn thêm hai đầu vào 32 bit của nó và đặt tổng trên đầu ra của
nó.

đã được giới thiệu trong Chương 2.Hãy nhớ lại rằng một ví dụ điển hình của một
hướng dẫn như vậy là thêm x1, x2, x3, mà đọc x2 và x3 và viết tổng vào x1.
Các thanh ghi đa năng của bộ xử lý 32 được lưu trữ trong một cấu trúc gọi là a
đăng ký tập tin Một đăng ký tập tinMột tập tin đăng ký là một tập hợp các thanh ghi trong đó bất kỳ
nhà nước phần tử bao thanh ghi có thể. đọc hoặc viết bằng cách chỉ định số lượng đăng ký trong tệp.
gồm một tập hợp các Tệp đăng ký chứa trạng thái đăng ký của máy tính. Ngoài ra, chúng tôi sẽ cần
thanh ghi có thể được ALU để hoạt động trên các giá trị được đọc từ các thanh ghi.
đọc và viết bằng cách
Hướng dẫn định dạng R có ba toán hạng đăng ký, vì vậy chúng tôi sẽ cần đọc
cung cấp số thanh ghi
được truy cập. hai từ dữ liệu từ tệp đăng ký và ghi một từ dữ liệu vào tệp đăng ký cho mỗi lệnh.
Đối với mỗi từ dữ liệu được đọc từ các thanh ghi, chúng ta cần một đầu vào cho
tệp thanh ghi chỉ định số đăng ký được đọc và một đầu ra từ tệp đăng ký sẽ mang
giá trị đã được đọc từ các thanh ghi. Để viết một từ dữ liệu, chúng ta sẽ cần hai
đầu vào: một để chỉ định số đăng ký sẽ được viết và một để cung cấp dữ liệu
được viết vào sổ đăng ký. Tệp đăng ký luôn xuất nội dung của bất kỳ số đăng ký
nào trên đầu vào thanh ghi Đọc. Tuy nhiên, các văn bản được điều khiển bởi tín
hiệu điều khiển ghi, phải được xác nhận để ghi xảy ra ở cạnh đồng hồ. Hình 4.7a
cho thấy kết quả; chúng ta cần tổng cộng ba đầu vào (hai cho số đăng ký và một
cho dữ liệu) và hai đầu ra (cả cho dữ liệu). Các đầu vào số đăng ký rộng 5 bit để
chỉ định một trong 32 thanh ghi (32 = 25), trong khi đầu vào dữ liệu và hai bus
đầu ra dữ liệu rộng 32 bit.
Hình 4.7b hiển thị ALU, lấy hai đầu vào 32 bit và tạo ra 32 bit kết quả, cũng
như tín hiệu 1 bit nếu kết quả là 0. Tín hiệu điều khiển 4 bit của ALU được mô tả
chi tiết trong Phụ lục A; chúng tôi sẽ sớm xem xét kiểm soát ALU khi chúng tôi
cần biết cách đặt nó.
4.3 Xây dựng một Datapath 263

Thê
m
vào

Đọc
PC
Địa chỉ

Hướng dẫn

Hướng dẫn
ký ức

HÌNH 4.6 Một phần của datapath được sử dụng để tìm nạp các hướng dẫn và tăng bộ
đếm chương trình. Các hướng dẫn tìm nạp được sử dụng bởi các phần khác của datapath.

Hoạt động
5 Đọc ALU
4
đăng ký 1 Đọc
Đăng ký 5 Đọc dữ liệu 1
số đăng ký 2 Dữ Số không
5 Đăng ký liệu ALU ALU
Viết
kết quả
đăng ký Đọc
Viết dữ liệu 2
Dữ liệu
Dữ liệu

RegWrite

a. Đăng ký b. ALU

HÌNH 4.7 Hai yếu tố cần thiết để thực hiện các hoạt động ALU định dạng R là tệp đăng ký
và ALU . Tệp đăng ký chứa tất cả các thanh ghi và có hai cổng đọc và một viết cổng. Thiết kế của các tập
tin đăng ký đa báo cáo được thảo luận trong Mục A.8 của Phụ lục A Tệp đăng ký luôn xuất nội dung của
các thanh ghi tương ứng với các đầu vào thanh ghi Đọc trên các đầu ra; không có đầu vào điều khiển khác
là cần thiết. Ngược lại, ghi thanh ghi phải được chỉ định rõ ràng bằng cách xác nhận tín hiệu điều khiển ghi.
Hãy nhớ rằng viết được kích hoạt cạnh, để tất cả các đầu vào ghi (tức là., giá trị được ghi, số đăng ký và
tín hiệu điều khiển ghi) phải hợp lệ ở cạnh đồng hồ. Vì ghi vào tệp đăng ký được kích hoạt cạnh. thiết kế
của chúng tôi có thể đọc và viết cùng một thanh ghi trong một chu kỳ đồng hồ: số đọc sẽ nhận được giá trị
được viết trong một chu kỳ đồng hồ trước đó, trong khi giá trị được viết sẽ có sẵn để đọc trong một chu kỳ
đồng hồ tiếp theo, Các đầu vào mang số đăng ký vào tệp đăng ký đều rộng 5 bit, trong khi các dòng mang
giá trị dữ liệu rộng 32 bit. Thao tác được thực hiện bởi ALU được điều khiển bằng tín hiệu hoạt động ALU,
sẽ rộng 4 bit, sử dụng ALU được thiết kế trong. Phụ lục AChúng tôi sẽ sớm sử dụng đầu ra phát hiện Zero
của ALU để triển khai các nhánh có điều kiện.
264 Chương 4 Bộ xử lý

Tiếp theo, hãy xem xét hướng dẫn đăng ký tải RISC-V và lưu trữ, có dạng
chung lw x1, bù (x2) hoặc là sw x1, bù (x2) Các hướng dẫn này tính toán một địa
chỉ bộ nhớ bằng cách thêm thanh ghi cơ sở, đó là. x2, đến trường bù có chữ ký 12
bit có trong hướng dẫn. Nếu hướng dẫn là một cửa hàng, giá trị được lưu trữ cũng
phải được đọc từ tệp đăng ký nơi nó cư trú x1 Nếu lệnh là tải, giá trị đọc từ bộ
nhớ phải được ghi vào tệp đăng ký trong thanh ghi được chỉ định. x1 Vì vậy,
chúng tôi sẽ cần cả tệp đăng ký và ALU từ. Hình 4.7.
Hơn nữa, chúng tôi sẽ cần một đơn vị để gia hạn ký tên trường bù 12 bit trong
gia hạn ký tên Để tăng lệnh hướng dẫn đến giá trị đã ký 32 bit và đơn vị bộ nhớ dữ liệu để đọc hoặc ghi
kích thước của một mục vào. Bộ nhớ dữ liệu phải được viết trên hướng dẫn lưu trữ; do đó, bộ nhớ dữ liệu
dữ liệu bằng cách sao có tín hiệu điều khiển đọc và ghi, đầu vào địa chỉ và đầu vào cho dữ liệu được ghi
chép bit ký hiệu thứ tự vào bộ nhớ. Hình 4.8 cho thấy hai yếu tố này.
cao của mục dữ liệu gốc
trong các bit thứ tự cao
Các beq lệnh có ba toán hạng, hai thanh ghi được so sánh cho đẳng thức và bù
của mục dữ liệu đích lớn 12 bit được sử dụng để tính toán địa chỉ mục tiêu chi nhánh liên quan đến địa
hơn. chỉ hướng dẫn chi nhánh. Hình thức của nó là beq x1, x2, bù Để thực hiện hướng
dẫn này, chúng ta phải tính toán địa chỉ mục tiêu chi nhánh bằng cách thêm
địa chỉ mục tiêu chi
nhánh Địa chỉ được chỉ trường bù mở rộng dấu hiệu của hướng dẫn vào PC. Có hai chi tiết trong định
định trong một nhánh, trở nghĩa của hướng dẫn chi nhánh (xem. Chương 2) mà chúng ta phải chú ý :
thành bộ đếm chương ■ Kiến trúc tập lệnh chỉ định rằng cơ sở để tính toán địa chỉ nhánh là địa chỉ
trình mới (PC) nếu nhánh
được lấy. Trong kiến trúc
của lệnh nhánh.
RISC-V, mục tiêu nhánh ■ Kiến trúc cũng nói rằng trường bù được dịch sang trái 1 bit để nó được bù
được đưa ra bằng tổng một nửa chữ; sự thay đổi này làm tăng phạm vi hiệu quả của trường bù theo
của trường bù của lệnh và
địa chỉ của nhánh.
hệ số 2.
Để đối phó với sự phức tạp sau này, chúng ta sẽ cần thay đổi trường bù bằng 1.
chi nhánh lấy Cũng như tính toán địa chỉ mục tiêu nhánh, chúng ta cũng phải xác định xem
Một nhánh nơi điều kiện hướng dẫn tiếp theo là hướng dẫn theo tuần tự hay hướng dẫn tại địa chỉ mục tiêu
chi nhánh được thỏa mãn nhánh. Khi điều kiện là đúng (tức là., hai toán hạng bằng nhau), địa chỉ mục tiêu chi
và bộ đếm chương trình nhánh trở thành PC mới và chúng tôi nói rằng chi nhánh là lấy Nếu toán hạng không
(PC) trở thành mục tiêu
bằng 0, PC tăng sẽ thay thế PC hiện tại (giống như bất kỳ hướng dẫn thông thường
chi nhánh. Tất cả các
nhánh vô điều kiện được nào khác); trong trường hợp này, chúng tôi nói rằng. chi nhánh là không lấy.
lấy chi nhánh. Do đó, datapath nhánh phải thực hiện hai thao tác: tính toán địa chỉ mục tiêu
nhánh và kiểm tra nội dung đăng ký. (Chi nhánh cũng ảnh hưởng đến phần tìm nạp
chi nhánh không lấy hướng dẫn của datapath, vì chúng tôi sẽ giải quyết trong thời gian ngắn.) Hình 4.9
hoặc (nhánh chưa lấy) cho thấy cấu trúc của phân đoạn datapath xử lý các nhánh. Để tính toán địa chỉ mục
Một nhánh trong đó điều tiêu chi nhánh, datapath chi nhánh bao gồm một đơn vị thế hệ ngay lập tức, từ Hình
kiện nhánh là sai và bộ
4.8 và một adder. Để thực hiện so sánh, chúng ta cần sử dụng tệp đăng ký được hiển
đếm chương trình (PC)
trở thành địa chỉ của lệnh thị trong Hình 4.7a để cung cấp hai toán hạng đăng ký (mặc dù chúng tôi sẽ không
theo tuần tự sau nhánh. cần phải ghi vào tệp đăng ký). Ngoài ra, việc so sánh bình đẳng có thể được thực
hiện bằng ALU mà chúng tôi thiết kế Phụ lục AVì ALU cung cấp tín hiệu đầu ra cho
biết kết quả là 0, chúng tôi có thể gửi cả hai toán hạng đăng ký đến ALU.
4.3 Xây dựng một Datapath 265

Ghi nhớ
Đọc
Địa chỉ
dữ liệu
Tôi
Dữ liệu Gen
Viết ký ức
dữ liệu

Ghi nhớ

a. Đơn vị bộ nhớ dữ liệu b. Đơn vị thế hệ ngay lập tức

HÌNH 4.8 Hai đơn vị cần thiết để thực hiện tải và lưu trữ, ngoài tệp đăng ký và ALU củaHình 4.7,
là đơn vị bộ nhớ dữ liệu và đơn vị tạo ngay lập tức. Đơn vị bộ nhớ là một thành phần trạng thái với các
đầu vào cho địa chỉ và dữ liệu ghi và một đầu ra duy nhất cho kết quả đọc. Có các điều khiển đọc và ghi riêng biệt,
mặc dù chỉ một trong số này có thể được xác nhận trên bất kỳ đồng hồ nào. Đơn vị bộ nhớ cần tín hiệu đọc, vì,
không giống như tệp đăng ký, việc đọc giá trị của một địa chỉ không hợp lệ có thể gây ra sự cố, như chúng ta sẽ
thấy Chương 5 Đơn vị tạo ngay lập tức (ImmGen) có lệnh 32 bit làm đầu vào chọn trường 12 bit để tải, lưu trữ và
nhánh nếu bằng được mở rộng thành kết quả 32 bit xuất hiện trên đầu ra (xem. Chương 2). Chúng tôi giả sử bộ
nhớ dữ liệu được kích hoạt cạnh để ghi. Chip bộ nhớ tiêu chuẩn thực sự có tín hiệu kích hoạt ghi được sử dụng để
ghi. Mặc dù kích hoạt ghi không được kích hoạt cạnh, thiết kế kích hoạt cạnh của chúng tôi có thể dễ dàng được
điều chỉnh để hoạt động với chip bộ nhớ thực. Xem Mục A.8 của Phụ lục A để thảo luận thêm về cách chip bộ
nhớ thực sự hoạt động.

với bộ điều khiển để trừ hai giá trị. Nếu tín hiệu Zero ra khỏi đơn vị ALU được
xác nhận, chúng tôi biết rằng các giá trị thanh ghi bằng nhau. Mặc dù đầu ra Zero
luôn báo hiệu nếu kết quả là 0, chúng tôi sẽ chỉ sử dụng nó để thực hiện kiểm tra
đẳng thức của các nhánh có điều kiện. Sau đó, chúng tôi sẽ chỉ ra chính xác cách
kết nối các tín hiệu điều khiển của ALU để sử dụng trong datapath.
Hướng dẫn nhánh hoạt động bằng cách thêm PC với 12 bit của lệnh được dịch
sang trái 1 bit. Đơn giản chỉ cần ghép 0 vào phần bù nhánh hoàn thành ca này,
như được mô tả trong Chương 2.

Tạo một Datapath duy nhất


Bây giờ chúng tôi đã kiểm tra các thành phần datapath cần thiết cho các lớp lệnh
riêng lẻ, chúng tôi có thể kết hợp chúng thành một datapath duy nhất và thêm
điều khiển để hoàn thành việc thực hiện. Datapath đơn giản nhất này sẽ cố gắng
thực hiện tất cả các hướng dẫn trong một chu kỳ đồng hồ. Do đó, không có tài
nguyên datapath nào có thể được sử dụng nhiều lần cho mỗi lệnh, do đó, bất kỳ
yếu tố nào cần nhiều lần phải được sao chép. Do đó, chúng tôi cần một bộ nhớ
cho các hướng dẫn tách biệt với một cho dữ liệu. Mặc dù một số đơn vị chức
năng sẽ cần được sao chép, nhiều yếu tố có thể được chia sẻ bởi các luồng hướng
dẫn khác nhau.
266 Chương 4 Bộ xử lý

Hướng dẫn sử dụng


PCfrom datapath
Thê
m Chi nhánh
vào Tổng mục tiêu

Đọc
Hướng đăng ký 1 4 Hoạt động ALU
dẫn Đọc
Đọc dữ liệu 1
Số Để chi
đăng ký 2 khôn nhánh
ALU g kiểm soát
Viết Đăng ký logic
đăng ký Đọc
Viết dữ liệu 2
dữ liệu

RegWrite

Tôi
Gen

HÌNH 4.9 Phần của một datapath cho một nhánh sử dụng ALU để đánh giá điều kiện
nhánh và một bộ cộng riêng biệt để tính toán mục tiêu nhánh là tổng của PC và ngay lập
tức (chuyển vị nhánh). Logic điều khiển được sử dụng để quyết định xem PC có tăng hay không hoặc
mục tiêu chi nhánh sẽ thay thế PC, dựa trên đầu ra Zero của ALU .

Để chia sẻ phần tử datapath giữa hai lớp lệnh khác nhau, chúng ta có thể cần
cho phép nhiều kết nối với đầu vào của một phần tử, sử dụng tín hiệu ghép kênh
và điều khiển để chọn giữa nhiều đầu vào.

VÍ DỤ
Xây dựng một Datapath

Các hoạt động của các hướng dẫn số học-logic (hoặc loại R) và datapath
hướng dẫn bộ nhớ khá giống nhau. Sự khác biệt chính là như sau :
■ Các hướng dẫn số học-logic sử dụng ALU, với các đầu vào đến từ hai
thanh ghi. Các hướng dẫn bộ nhớ cũng có thể sử dụng ALU để thực
hiện tính toán địa chỉ, mặc dù đầu vào thứ hai là trường bù 12 bit được
mở rộng bằng dấu từ lệnh.
■ Giá trị
được
lưu trữ
vào một
thanh
ghi đích
đến từ
ALU
(đối với
lệnh loại
R) hoặc
bộ nhớ
(đối với
tải).
4.3 Xây dựng một Datapath 267

Chỉ ra cách xây dựng một biểu đồ cho phần vận hành của tham chiếu bộ
nhớ và hướng dẫn logic số học sử dụng một tệp đăng ký duy nhất và một
ALU duy nhất để xử lý cả hai loại hướng dẫn, thêm bất kỳ bộ ghép kênh cần
thiết nào.

Để tạo một datapath chỉ với một tệp đăng ký duy nhất và một ALU duy nhất,
chúng tôi phải hỗ trợ hai nguồn khác nhau cho đầu vào ALU thứ hai, cũng như
TRẢ LỜI
hai nguồn khác nhau cho dữ liệu được lưu trữ vào tệp đăng ký. Do đó, một bộ
ghép kênh được đặt ở đầu vào ALU và một bộ ghép kênh khác ở đầu vào dữ liệu
vào tệp đăng ký. Hình 4.10 cho thấy phần hoạt động của datapath kết hợp.

Bây giờ chúng ta có thể kết hợp tất cả các phần để tạo một biểu đồ đơn giản
cho kiến trúc RISC-V cốt lõi bằng cách thêm biểu đồ cho tìm nạp hướng dẫn
(Hình 4.6), datapath từ loại R và hướng dẫn bộ nhớ (Hình 4.10) và datapath cho
các chi nhánh (Hình 4.9). Hình 4.11 cho thấy datapath chúng ta có được bằng
cách soạn các phần riêng biệt. Hướng dẫn nhánh sử dụng ALU chính để so sánh
hai toán hạng thanh ghi cho đẳng thức, vì vậy chúng tôi phải giữ cho trình bổ
sung từ đó Hình 4.9 để tính toán địa chỉ mục tiêu chi nhánh. Cần có bộ ghép
kênh bổ sung để chọn địa chỉ lệnh tuần tự sau (PC + 4) hoặc địa chỉ mục tiêu
nhánh được ghi vào PC .

Đọc
4 Hoạt động ALU
đăng ký 1 Đọc
Ghi nhớ
dữ
Số
Đọc liệu 1
không MemtoReg
Hướng dẫn đăng ký 2
ALUSrc ALU ALU Đọc
Viết Đăng ký Đọc kết
dữ 0 quả Địa chỉ dữ liệu 1
liệu 2 M M
đăng ký bạn bạn
x x
Viết Dữ
1 0
dữ liệu liệu
Viết ký ức
RegWrite
dữ liệu

Tôi Ghi nhớ


Gen

HÌNH 4.10 Biểu dữ liệu cho các hướng dẫn bộ nhớ và hướng dẫn loại R. Ví dụ này cho thấy làm thế nào
một datapath duy nhất có thể được lắp ráp từ các mảnh trong Hình 4.7 và 4.8 bằng cách thêm bộ ghép kênh. Hai bộ ghép
kênh là cần thiết, như được mô tả trong ví dụ.
268 Chương 4 Bộ xử lý

PCSrc

Thêm M
bạ
vào n
x
Thêm vào
Tổng
4

Đọc
Đọc ALUSrc 4 Hoạt động ALU
PC Địa chỉ đăng ký 1 Đọc Ghi nhớ
Đọc dữ liệu 1 MemtoReg
đăng ký 2 Số không
Hướng dẫn Đăng ký ALU ALU Đọc
Viết Đọc Địa chỉ
Hướng dẫn đăng ký dữ liệu 2 M kết quả dữ liệu M
ký ức bạn bạn
Viết x x
dữ Dữ
liệu
Viết liệu
RegWrite dữ liệu ký ức

Ghi nhớ
Tôi
Gen

HÌNH 4.11 Biểu dữ liệu đơn giản cho kiến trúc RISC-V cốt lõi kết hợp các yếu tố được yêu
cầu bởi các lớp lệnh khác nhau. Các thành phần đến từ Hình 4.6, 4.9 và 4.10Điều này. datapath có
thể thực hiện các hướng dẫn cơ bản (đăng ký cửa hàng tải, hoạt động ALU và các nhánh) trong một chu kỳ
đồng hồ duy nhất. Chỉ cần một bộ ghép kênh bổ sung là cần thiết để tích hợp các nhánh.

Kiểm tra I. Cái nào sau đây là chính xác cho một hướng dẫn tải? Tham khảo Hình 4.10.
Bản a. MemtoReg nên được đặt để làm cho dữ liệu từ bộ nhớ được gửi đến
thân bạn tệp đăng ký.
b. MemtoReg phải được đặt để làm cho đích đăng ký chính xác được gửi
đến tệp đăng ký.
c. Chúng tôi không quan tâm đến việc thiết lập MemtoReg cho tải.
II. Datapath chu kỳ đơn được mô tả một cách khái niệm trong phần này phải
có hướng dẫn và bộ nhớ dữ liệu riêng biệt, bởi vì
a. các định dạng của dữ liệu và hướng dẫn là khác nhau trong RISC-V, và
do đó cần có những bộ nhớ khác nhau;
b. có những ký ức riêng biệt ít tốn kém hơn;
c. bộ xử lý hoạt động trong một chu kỳ đồng hồ và không thể sử dụng bộ
nhớ (một cổng) cho hai truy cập khác nhau trong chu kỳ đồng hồ đó.
4.4 Một kế hoạch thực hiện đơn giản 269

Bây giờ chúng tôi đã hoàn thành datapath đơn giản này, chúng tôi có thể thêm
đơn vị điều khiển. Đơn vị điều khiển phải có khả năng lấy đầu vào và tạo tín hiệu
ghi cho từng thành phần trạng thái, điều khiển bộ chọn cho từng bộ ghép kênh và
điều khiển ALU. Điều khiển ALU khác nhau theo một số cách và sẽ hữu ích khi
thiết kế nó trước khi chúng tôi thiết kế phần còn lại của bộ điều khiển.

Xây dựng: Logic thế hệ ngay lập tức phải chọn giữa mở rộng dấu hiệu trường 12
bit trong các bit lệnh 31:20 cho các hướng dẫn tải, bit 31:25 và 11: 7 cho các hướng
dẫn lưu trữ hoặc bit 31, 7, 30:25 và 11: 8 cho nhánh có điều kiện. Vì đầu vào là tất cả
32 bit của lệnh, nên nó có thể sử dụng các bit opcode của lệnh để chọn trường thích
hợp. RISC-V opcode bit 6 xảy ra là 0 cho các hướng dẫn truyền dữ liệu và 1 cho các
nhánh có điều kiện và RISC-V opcode bit 5 xảy ra là 0 cho các hướng dẫn tải và 1
cho hướng dẫn lưu trữ. Do đó, bit 5 và 6 có thể điều khiển bộ ghép kênh 3: 1 bên
trong logic tạo tức thời chọn trường 12 bit thích hợp để tải, lưu trữ và hướng dẫn
nhánh có điều kiện.

4.4 Một kế hoạch thực hiện đơn giản

Trong phần này, chúng tôi xem những gì có thể được coi là một triển khai đơn
giản của tập hợp con RISC-V của chúng tôi. Chúng tôi xây dựng triển khai đơn
giản này bằng cách sử dụng datapath của phần cuối cùng và thêm chức năng điều
khiển đơn giản. Việc thực hiện đơn giản này bao gồm tải từ (lw), lưu trữ từ ( sw),
nhánh nếu bằng nhau (beq) và các hướng dẫn số học-logic thêm, phụ, và, và hoặc là.

Kiểm soát ALU


ALU RISC-V trong Phụ lục A xác định bốn kết hợp sau của bốn đầu vào điều
khiển :

Đường điều khiển Chức năng


ALU
0000 VÀ
0001 HOẶC LÀ
0010 thêm
0110 trừ đi

Tùy thuộc vào lớp hướng dẫn, ALU sẽ cần thực hiện một trong bốn chức năng
này. Để tải và lưu trữ hướng dẫn, chúng tôi sử dụng ALU để tính toán địa chỉ bộ
nhớ bằng cách thêm vào. Đối với các hướng dẫn loại R, ALU cần thực hiện một
trong bốn hành động (VÀ, HOẶC LÀ, thêm, hoặc là trừ đi), tùy thuộc vào giá trị
của trường funct7 7 bit (bit 31:25) và trường funct3 3 bit (bit 14:12) trong hướng
dẫn (xem Chương 2). Đối với nhánh có điều kiện nếu hướng dẫn bằng nhau,
ALU trừ hai toán hạng và kiểm tra để xem kết quả có phải là 0 không.
270 Chương 4 Bộ xử lý

Chúng ta có thể tạo đầu vào điều khiển ALU 4 bit bằng một đơn vị điều khiển
nhỏ có đầu vào các trường func7 và func3 của lệnh và trường điều khiển 2 bit, mà
chúng ta gọi là ALUOp. ALUOp cho biết liệu thao tác được thực hiện có nên
thêm (00) cho tải và lưu trữ hay không, trừ và kiểm tra nếu không (01) cho
beqhoặc được xác định bởi thao tác được mã hóa trong các trường funct7 và
func3 (10). Đầu ra của bộ điều khiển ALU là tín hiệu 4 bit điều khiển trực tiếp
ALU bằng cách tạo một trong các kết hợp 4 bit được hiển thị trước đó.
Trong Hình 4.12, chúng tôi chỉ ra cách đặt các đầu vào điều khiển ALU dựa
trên các trường điều khiển ALUOp 2 bit, func7 và func3. Sau chương này, chúng
ta sẽ thấy các bit ALUOp được tạo từ đơn vị điều khiển chính như thế nào.
Kiểu sử dụng nhiều cấp độ giải mã, nghĩa là, đơn vị điều khiển chính tạo ra các bit
ALUOp, sau đó được sử dụng làm đầu vào cho điều khiển ALU tạo ra tín hiệu thực tế
để điều khiển đơn vị ALU là một kỹ thuật triển khai phổ biến. Sử dụng nhiều cấp độ
điều khiển có thể làm giảm kích thước của bộ điều khiển chính. Sử dụng một số đơn
vị điều khiển nhỏ hơn cũng có thể làm giảm độ trễ của đơn vị điều khiển. Tối ưu hóa
như vậy rất quan trọng, vì độ trễ của bộ điều khiển thường là yếu tố quan trọng trong
việc xác định thời gian chu kỳ đồng hồ.
Có một số cách khác nhau để thực hiện ánh xạ từ trường ALUOp 2 bit và các
trường func đến bốn bit điều khiển hoạt động ALU. Vì chỉ một số lượng nhỏ các giá
trị trường func có thể là các trường quan tâm và func chỉ được sử dụng khi các bit
ALUOp bằng 10, chúng ta có thể sử dụng một đoạn logic nhỏ nhận ra tập hợp con
của các giá trị có thể và tạo ra các tín hiệu điều khiển ALU thích hợp.

HÌNH 4.12 Cách đặt các bit điều khiển ALU phụ thuộc vào các bit điều khiển ALUOp và các
opcodes khác nhau cho lệnh loại R. Các hướng dẫn, được liệt kê trong cột đầu tiên, xác định cài đặt các bit
ALUOp. Tất cả các mã hóa được hiển thị trong nhị phân. Lưu ý rằng khi mã ALUOp là 00 hoặc 01, hành động
ALU mong muốn không phụ thuộc vào các trường funct7 hoặc funct3; trong trường hợp này, chúng tôi nói rằng
chúng tôi không quan tâm đến giá trị của opcode và các bit được hiển thị dưới dạng Xs. Khi giá trị ALUOp là 10,
thì các trường funct7 và func3 được sử dụng để đặt đầu vào điều khiển ALU. Xem Phụ lục A.
4.4 Một kế hoạch thực hiện đơn giản 271

Là một bước trong việc thiết kế logic này, nó rất hữu ích để tạo ra a bảng thật cho các
kết hợp thú vị của các trường funct và tín hiệu ALUOp, như chúng tôi đã thực hiện Hình
4.13; điều này bảng thật cho thấy cách điều khiển ALU 4 bit được đặt tùy thuộc vào các bảng thật Từ logic, a
trường đầu vào này. Vì bảng sự thật đầy đủ là rất lớn và chúng tôi không quan tâm đến giá biểu diễn một hoạt động
trị của điều khiển ALU đối với nhiều kết hợp đầu vào này, chúng tôi chỉ hiển thị các mục logic bằng cách liệt kê tất
nhập bảng sự thật mà điều khiển ALU phải có giá trị cụ thể. Trong suốt chương này, cả các giá trị của các đầu
vào và sau đó trong mỗi
chúng tôi sẽ sử dụng thực tiễn này chỉ hiển thị các mục nhập bảng thật cho các đầu ra phải
trường hợp cho thấy các
được xác nhận và không hiển thị những mục được phân tích hoặc không quan tâm. (Thực đầu ra kết quả sẽ là gì.
tiễn này có một bất lợi, mà chúng ta thảo luận trong Mục C.2 của Phụ lục C).
Bởi vì trong nhiều trường hợp, chúng tôi không quan tâm đến các giá trị của một
số đầu vào và vì chúng tôi muốn giữ cho các bảng nhỏ gọn, chúng tôi cũng bao gồm thời hạn chăm sóc
điều khoản chăm sóc don don Một thuật ngữ chăm sóc don don trong bảng sự thật don don An phần tử
này (được biểu thị bằng X trong cột đầu vào) chỉ ra rằng đầu ra không phụ thuộc vào của hàm logic trong đó
đầu ra không phụ thuộc
giá trị của đầu vào tương ứng với cột đó. Ví dụ: khi các bit ALUOp là 00, như trong
vào giá trị của tất cả các
hàng đầu tiên của. Hình 4.13, chúng tôi luôn đặt điều khiển ALU thành 0010, độc lập đầu vào. Các điều
với các trường func. Trong trường hợp này, sau đó, các đầu vào funct sẽ được don khoản chăm sóc Don
lồng quan tâm trong dòng này của bảng sự thật. Sau đó, chúng ta sẽ thấy các ví dụ về Don có thể được chỉ
một loại thuật ngữ chăm sóc don don khác. Nếu bạn không quen thuộc với khái niệm định theo những cách
về các điều khoản chăm sóc don don, hãy xem Phụ lục A để biết thêm thông tin. khác nhau.
Khi bảng sự thật đã được xây dựng, nó có thể được tối ưu hóa và sau đó biến thành
cổng. Quá trình này là hoàn toàn cơ học. Do đó, thay vì hiển thị các bước cuối cùng ở
đây, chúng tôi mô tả quá trình và kết quả trong Mục C.2 của Phụ lục C.

Thiết kế bộ điều khiển chính


Bây giờ chúng tôi đã mô tả cách thiết kế ALU sử dụng opcode và tín hiệu 2 bit
làm đầu vào điều khiển của nó, chúng tôi có thể quay lại xem phần còn lại của
điều khiển. Để bắt đầu quá trình này, hãy để xác định các trường của một lệnh và
các dòng điều khiển cần thiết cho datapath mà chúng tôi đã xây dựng Hình
4.11Để hiểu cách kết nối các trường của một hướng dẫn với datapath, rất hữu ích
để xem xét.

HÌNH 4.13 Bảng sự thật cho 4 bit điều khiển ALU (được gọi là Hoạt động). Các đầu vào là các trường ALUOp và func. Chỉ có
các mục mà kiểm soát ALU được khẳng định được hiển thị. Một số mục chăm sóc don don đã được thêm vào. Ví dụ: ALUOp không sử
dụng mã hóa 11, vì vậy bảng chân lý có thể chứa các mục 1X và X1, thay vì 10 và 01. Mặc dù chúng tôi hiển thị tất cả 10 bit của các trường
func, lưu ý rằng các bit duy nhất có các giá trị khác nhau cho bốn hướng dẫn định dạng R là các bit 30, 14, 13 và 12. Do đó, chúng tôi chỉ
cần bốn bit trường func này làm đầu vào cho điều khiển ALU thay vì tất cả 10 bit.
272 Chương 4 Bộ xử lý

HÌNH 4.14 Bốn lớp lệnh (số học, tải, lưu trữ và nhánh có điều kiện) sử dụng bốn định dạng lệnh khác nhau. (a) Định dạng hướng
dẫn cho các hướng dẫn số học loại R (mã op = 51mười), có ba toán hạng đăng ký : rs1, rs2 , và rd. Các trường rs1 và rd là các nguồn và rd là đích đến.
Hàm ALU nằm trong các trường func3 và func7 và được giải mã bởi thiết kế điều khiển ALU trong phần trước. Các hướng dẫn loại R mà chúng tôi
thực hiện là thêm, phụ và hoặc. (b) Định dạng hướng dẫn cho hướng dẫn tải loại I (opcode = 3 mười). Thanh ghi rs1 là thanh ghi cơ sở được thêm vào
trường tức thời 12 bit để tạo thành địa chỉ bộ nhớ. Trường rd là thanh ghi đích cho giá trị được tải. (c) Định dạng hướng dẫn cho hướng dẫn lưu trữ
loại S (opcode = 35mười). Thanh ghi rs1 là thanh ghi cơ sở được thêm vào trường tức thời 12 bit để tạo thành địa chỉ bộ nhớ. (Trường ngay lập tức
được chia thành một mảnh 7 bit và một mảnh 5 bit.) Trường rs2 là thanh ghi nguồn có giá trị sẽ được lưu vào bộ nhớ. (d) Định dạng hướng dẫn cho
các hướng dẫn nhánh có điều kiện loại SB (opcode = 99mười). Các thanh ghi rs1 và rs2 so sánh. Trường địa chỉ tức thời 12 bit được mở rộng bằng dấu,
dịch sang trái 1 bit và thêm vào PC để tính địa chỉ mục tiêu nhánh. Hình 4.17 và 4.18 đưa ra lý do cho việc đặt hàng bit bất thường cho loại SB.

các định dạng của bốn lớp lệnh: số học, tải, lưu trữ và hướng dẫn nhánh có điều
kiện. Hình 4.14 hiển thị các định dạng này.
Có một số quan sát chính về định dạng hướng dẫn này mà chúng tôi sẽ dựa
vào :
opcode Lĩnh vực đó
■ Các opcode lĩnh vực, như chúng ta đã thấy trong Chương 2, luôn ở bit 6: 0.
biểu thị hoạt động và
định dạng của một hướng Tùy thuộc vào opcode, trường func3 (bit 14:12) và trường func7 (bit 31:25)
dẫn. đóng vai trò là trường opcode mở rộng.
■ Toán hạng đăng ký đầu tiên luôn ở vị trí bit 19:15 (rs1) cho các hướng dẫn
loại R và hướng dẫn nhánh. Trường này cũng chỉ định đăng ký cơ sở cho tải
và hướng dẫn lưu trữ.
■ Toán hạng thanh ghi thứ hai luôn ở vị trí bit 24:20 (rs2) cho các hướng dẫn
loại R và hướng dẫn nhánh. Trường này cũng chỉ định toán hạng đăng ký
được sao chép vào bộ nhớ cho hướng dẫn lưu trữ.
■ Một toán hạng khác cũng có thể là phần bù 12 bit cho các hướng dẫn chi
nhánh hoặc cửa hàng tải.
■Thanh ghi đích luôn ở vị trí bit 11: 7 (rd) cho các hướng dẫn loại R và
hướng dẫn tải.
Nguyên tắc thiết kế đầu tiên từ Chương 2-đơn giản ủng hộ sự đều đặnCác
khoản thanh toán ở đây đơn giản hóa việc kiểm soát datapath.
4.4 Một kế hoạch thực hiện đơn giản 273

So với MIPS, RISC-V có các định dạng hướng dẫn trông phức tạp hơn nhưng thực sự Giao diện
đơn giản hóa phần cứng. Điều này thậm chí có thể cải thiện thời gian chu kỳ đồng hồ phần
của một số triển khai RISC-V, đặc biệt là các phiên bản được thiết kế mà chúng ta
thấy Mục 4.6Vì trình biên dịch, trình biên dịch và trình gỡ lỗi ẩn chi tiết của hướng cứng /
dẫn. định dạng từ lập trình viên, tại sao không chọn các định dạng giúp phần cứng? phần
Ví dụ đầu tiên là định dạng hướng dẫn cửa hàng. Hình 4.15 hiển thị các định mềm
dạng lệnh MIPS để truyền dữ liệu và hướng dẫn số học và tác động của chúng
đối với datapath. MIPS yêu cầu bộ ghép kênh 2: 1 để chỉ định trường nào cung
cấp số lượng thanh ghi được viết, điều này không cần thiết Hình 4.15Bộ ghép
kênh đó có thể nằm trên một đường dẫn thời gian quan trọng sẽ kéo dài thời gian
chu kỳ đồng hồ. Để giữ cho thanh ghi đích luôn ở các bit 11 đến 7 của tất cả các
hướng dẫn, định dạng RISC-V S phải chia trường ngay lập tức thành hai phần:
bit 31 đến 25 có ngay lập tức [11: 5] và bit 11 đến 7 có ngay lập tức [4 : 0]. Nó
trông kỳ lạ so với MIPS, giữ cho trường liền kề, nhưng trình biên dịch RISC-V
che giấu sự phức tạp này và lợi ích phần cứng.

op rs rt thứ hai shamt func


6 bit 5 bit 5 bit 5 bit 5 bit 6 bit Định dạng R: Số học

op rs rt hằng số hoặc địa chỉ


Tôi định dạng: Truyền
6 bit 5 bit 5 bit 16 bit dữ liệu ,
Bắt chước
Ví dụ thứ hai trông thậm chí còn đáng sợ hơn. Hình 4.16 cho thấy RISC-V có
hai định dạng trong đó tất cả các trường có cùng kích thước và ngay lập tức như
ở hai định dạng khác, SB SB so với S và UJ so với U, nhưng các bit được xoay
quanh.
Các định dạng SB và UJ một lần nữa đơn giản hóa phần cứng bằng cách cung cấp
cho trình biên dịch nhiều việc phải làm. Các số liệu dưới đây cho thấy phần cứng
máy phát điện tức thời phải làm gì cho RISC-V . Hình 4.17 cho thấy bit nào của lệnh
tương ứng
Hướng dẫn [25:21] Đọc
Đọc
đăng ký 1 Đọc
Địa chỉ
dữ liệu
Hướng dẫn [20:16] Đọc 1
Hướng dẫn
đăng ký 2
[31: 0] 0
Hướng dẫn M Viết Đọc
dữ liệu
ký ức
bạn đăng ký 2
Hướng dẫn [15:11] x
1
Viết
RegDst dữ liệu Đăng ký
HÌNH 4.15 MIPS, định dạng lệnh số học, định dạng lệnh truyền dữ liệu và tác động của
chúng đối với dữ liệu MIPS. Đối với hướng dẫn số học MIPS sử dụng định dạng R , thứ hai là thanh
ghi đích, rs là toán hạng thanh ghi đầu tiên và rt là toán hạng thanh ghi thứ hai. Đối với tải MIPS và hướng
dẫn ngay lập tức, rs vẫn là toán hạng đăng ký đầu tiên, nhưng rt hiện là thanh ghi đích. Do đó, cần có bộ
ghép kênh 2: 1 để chọn giữa các trường rd và rt để viết đúng thanh ghi.
274 Chương 4 Bộ xử lý

đến các bit trường ngay lập tức tùy thuộc vào loại hướng dẫn , nếu theo giả
thuyết, các hướng dẫn nhánh có điều kiện đã sử dụng định dạng S thay vì SB và
các hướng dẫn nhánh vô điều kiện đã sử dụng định dạng U thay vì UJ. Hàng cuối
cùng hiển thị số lượng đầu vào duy nhất trên mỗi bit đầu ra, xác định số lượng
cổng thành một bộ ghép kênh trong trình tạo tức thời.
Ngược lại , Hình 4.18 hiển thị các định dạng thực tế cho nhánh và nhảy, và số
lượng đầu vào duy nhất giảm. Các định dạng SB và UJ làm giảm các bộ ghép
kênh cho các bit ngay lập tức 19 đến 12 từ bộ ghép kênh 3: 1 đến 2: 1 và các bit
ngay lập tức 10 đến 1 từ 4: 1 đến 2: 1. Một lần nữa, các kiến trúc sư RISC-V đã
thiết kế các định dạng trông kỳ quặc nhưng hiệu quả, đơn giản hóa 18 bộ ghép
kênh 1 bit. Các khoản tiết kiệm không đáng kể cho các bộ xử lý cao cấp nhưng
hữu ích cho các bộ xử lý rất thấp và chi phí duy nhất do nhà lắp ráp (và tác giả
của bạn chịu).

Sử dụng thông tin này, chúng ta có thể thêm nhãn hướng dẫn vào datapath đơn
giản. Hình 4.19 hiển thị các bổ sung này cộng với khối điều khiển ALU, tín hiệu ghi
cho

HÌNH 4.16 Các định dạng RISC-V thực tế. Hình 4.16 giới thiệu các loại R-, I-, S- và U, rất đơn giản.

Đầu ra ngay lập tức Bit theo bit


31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 số 8 7 6 5 4 3 2 1 0
Định dạng Đầu vào ngay lập tức Bit
Hướng dẫn theo bit
Tải, Arith. Tôi. TÔI i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i30 i29 i28 i27 i26 i25 i24 i23 i22 i21 i20
Cửa hàng S Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc i11 i10 i9 i8 i7
Cond. Chi nhánh S Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc i30 i29 i28 i27 i26 i25 i24 Cúc Cúc Cúc Cúc 0
Vô điều kiện. Nhảy U Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc i30 i29 i28 i27 i26 i25 i24 i23 i22 i21 i20 i19 i18 i17 i16 i15 i14 i13 i12 Cúc
Tải Thượng Imm. U Cúc i30 i29 i28 i27 i26 i25 i24 i23 i22 i21 i20 i19 i18 i17 i16 i15 i14 i13 i12 0 0 0 0 0 0 0 0 0 0 0 Cúc
Đầu vào độc đáo 1 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 3

HÌNH 4.17 Đầu vào ngay lập tức nếu các nhánh có điều kiện giả định sử dụng định dạng S và nếu nhảy, hãy sử dụng định
dạng U.

Đầu ra ngay lập tức Bit theo bit


31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 số 8 7 6 5 4 3 2 1 0
Định dạng Đầu vào ngay lập tức Bit
Hướng dẫn theo bit
Tải, Arith. Tôi. TÔI i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i31 i30 i29 i28 i27 i26 i25 i24 i23 i22 i21 i20
Cửa hàng S Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc i11 i10 i9 i8 i7
Cond. Chi nhánh SB Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc i7 Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc 0
Vô điều kiện. Nhảy UJ Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc i19 i18 i17 i16 i15 i14 i13 i12 i20 Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc
Tải Thượng Imm. U Cúc i30 i29 i28 i27 i26 i25 i24 i23 i22 i21 i20 Cúc Cúc Cúc Cúc Cúc Cúc Cúc Cúc 0 0 0 0 0 0 0 0 0 0 0 Cúc
Đầu vào độc đáo 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 3 3 3 3 3
HÌNH 4.18 Đầu vào ngay lập tức cho rằng các nhánh sử dụng định dạng SB và nhảy sử dụng định dạng UJ, đó là
những gì RISC-V sử dụng.
4.4 Một kế hoạch thực hiện đơn giản 275

PCSrc

0
Thê M
m
vào bạn

Thêm vào x
Tổng
4 1
RegWrite

Hướng dẫn [19-15] Đọc


Đọc đăng ký Ghi nhớ
PC Địa chỉ 1 Đọc
dữ liệu
Hướng dẫn [24-20] Đọc 1
đăng ký
Hướng dẫn 2 ALUSrc Số không MemtoReg
[31-0] Đọc ALU ALU Đọc
Hướng dẫn [11-7] Viết dữ liệu 0 kết quả Địa chỉ dữ liệu 1
Hướng dẫn đăng ký 2 M M
ký ức bạn bạn
x x
Viết 1 0
Dữ
dữ liệu Đăng ký liệu
Viết ký ức
dữ liệu
Hướng dẫn [31-0] Tôi ALU
Gen
điều khiển Ghi nhớ

Hướng dẫn [30,14-12]


ALUOp

HÌNH 4.19 Biểu đồ của Hình 4.11 với tất cả các bộ ghép kênh cần thiết và tất cả các dòng
điều khiển được xác định. Các dòng điều khiển được hiển thị màu. Khối điều khiển ALU cũng đã
được thêm vào, trong đó phụ thuộc vào trường func3 và một phần của trường funct7. PC không yêu cầu
điều khiển ghi, vì nó được viết một lần vào cuối mỗi chu kỳ đồng hồ; logic điều khiển nhánh xác định xem
nó được viết bằng PC tăng hay địa chỉ mục tiêu nhánh.

các phần tử trạng thái, tín hiệu đọc cho bộ nhớ dữ liệu và tín hiệu điều khiển cho
bộ ghép kênh. Vì tất cả các bộ ghép kênh có hai đầu vào, mỗi đầu vào yêu cầu
một dòng điều khiển duy nhất.
Hình 4.19 hiển thị sáu dòng điều khiển một bit cộng với điều khiển ALUOp 2
bit tín hiệu. Chúng tôi đã xác định cách thức tín hiệu điều khiển ALUOp hoạt
động và rất hữu ích khi xác định sáu tín hiệu điều khiển khác làm gì không chính
thức trước khi chúng tôi xác định cách đặt các tín hiệu điều khiển này trong khi
thực hiện lệnh. Hình 4.20 mô tả chức năng của sáu dòng điều khiển này.
Bây giờ chúng tôi đã xem xét chức năng của từng tín hiệu điều khiển, chúng
tôi có thể xem cách đặt chúng. Đơn vị điều khiển có thể đặt tất cả trừ một trong
các tín hiệu điều khiển chỉ dựa trên các trường opcode và func của lệnh. Dòng
điều khiển PCSrc là ngoại lệ. Đường điều khiển đó phải được xác nhận nếu lệnh
là nhánh nếu bằng (một quyết định mà đơn vị điều khiển có thể đưa ra) và đầu ra
Zero của ALU, được sử dụng cho thử nghiệm đẳng thức, được khẳng định. Để
tạo tín hiệu PCSrc, chúng ta sẽ cần VÀ cùng một tín hiệu từ bộ điều khiển mà
chúng ta gọi Chi nhánh, với tín hiệu Zero ra khỏi ALU .
Tám tín hiệu điều khiển này (sáu từ Hình 4.20 và hai cho ALUOp) hiện có thể
được đặt dựa trên các tín hiệu đầu vào cho đơn vị điều khiển, đó là các bit opcode 6:
0. Hình 4.21 hiển thị datapath với bộ điều khiển và tín hiệu điều khiển.
276 Chương 4 Bộ xử lý

HÌNH 4.20 Ảnh hưởng của mỗi sáu tín hiệu điều khiển. Khi điều khiển 1 bit thành bộ ghép kênh
hai chiều được khẳng định, bộ ghép kênh sẽ chọn đầu vào tương ứng với 1. Mặt khác, nếu điều khiển được
phân tách, bộ ghép kênh sẽ chọn đầu vào 0. Hãy nhớ rằng tất cả các thành phần trạng thái đều có đồng hồ
làm đầu vào ngầm và đồng hồ được sử dụng trong kiểm soát ghi. Việc đưa đồng hồ ra bên ngoài một yếu
tố trạng thái có thể tạo ra các vấn đề về thời gian. (Xem Phụ lục A để thảo luận thêm về vấn đề này.)

Trước khi chúng tôi cố gắng viết một tập hợp các phương trình hoặc bảng
chân lý cho đơn vị điều khiển, sẽ rất hữu ích khi cố gắng xác định chức năng
điều khiển một cách không chính thức. Vì cài đặt của các dòng điều khiển chỉ
phụ thuộc vào opcode, chúng tôi xác định xem mỗi tín hiệu điều khiển nên là 0, 1
hay don don care (X) cho mỗi giá trị opcode. Hình 4.22 xác định cách đặt tín
hiệu điều khiển cho mỗi opcode; thông tin này theo trực tiếp từ Hình 4.12, 4.20
và 4.21.

Hoạt động của Datapath


Với thông tin có trong Hình 4.20 và 4.22, chúng ta có thể thiết kế logic đơn vị
điều khiển, nhưng trước khi chúng ta làm điều đó, hãy để Nhìn vào cách mỗi
lệnh sử dụng datapath. Trong một vài hình tiếp theo, chúng tôi cho thấy dòng
chảy của ba lớp hướng dẫn khác nhau thông qua datapath. Các tín hiệu điều
khiển được khẳng định và các phần tử datapath hoạt động được tô sáng trong mỗi
phần tử này. Lưu ý rằng một bộ ghép kênh có điều khiển là 0 có hành động xác
định, ngay cả khi dòng điều khiển của nó không được tô sáng. Tín hiệu điều
khiển nhiều bit được tô sáng nếu có bất kỳ tín hiệu cấu thành nào được khẳng
định.
Hình 4.23 hiển thị hoạt động của datapath cho một lệnh loại R, như vậy như
thêm x1, x2, x3Mặc dù mọi thứ xảy ra trong một chu kỳ đồng hồ, chúng ta có thể
nghĩ ra bốn bước để thực hiện hướng dẫn; các bước này được sắp xếp theo luồng
thông tin :.
1. Hướng dẫn được tìm nạp và PC được tăng lên.
2. Hai thanh ghi , x2 và x3, được đọc từ tập tin đăng ký; Ngoài ra, đơn vị điều
khiển chính tính toán cài đặt các dòng điều khiển trong bước này.
4.4 Một kế hoạch thực hiện đơn giản 277

0
Thê M
m
vào bạn
x
Tổng
4 Thêm vào 1

Chi nhánh
Ghi nhớ
Hướng dẫn [6-0] MemtoReg
Điều khiển
ALUOp
Ghi nhớ
ALUSrc
RegWrite

Hướng dẫn [19-15] Đọc


Đọc
đăng ký
PC Địa chỉ 1 Đọc
dữ liệu
Hướng dẫn [24-20] Đọc 1
đăng ký Số không
Hướng dẫn 2
Hướng dẫn [11- Đọc
[31-0] 7] Viết Đọc 0 ALU ALU Địa chỉ 1
dữ liệu
Hướng dẫn đăng ký 2 M kết quả dữ liệu M
b b
ạ ạ
ký ức n n
Viết x x
dữ liệu Đăng ký 1 Viết Dữ liệu 0
dữ
liệu ký ức
Hướng dẫn [31-
0] Tôi ALU
Gen điều khiển

Hướng dẫn [30,14-12]

HÌNH 4.21 Hình dữ liệu đơn giản với bộ điều khiển. Đầu vào cho đơn vị điều khiển là trường opcode 7 bit từ lệnh. Các đầu ra của
đơn vị điều khiển bao gồm hai tín hiệu 1 bit được sử dụng để điều khiển bộ ghép kênh (ALUSrc và MemtoReg) ba tín hiệu để kiểm soát đọc
và ghi trong tệp đăng ký và bộ nhớ dữ liệu (RegWrite, Ghi nhớ, và MemWrite) tín hiệu 1 bit được sử dụng để xác định xem có thể phân
nhánh hay không (Chi nhánh) và tín hiệu điều khiển 2 bit cho ALU (ALUOp). Cổng AND được sử dụng để kết hợp tín hiệu điều khiển
nhánh và đầu ra Zero từ ALU; đầu ra cổng AND kiểm soát việc lựa chọn PC tiếp theo. Lưu ý rằng PCSrc hiện là tín hiệu dẫn xuất, thay vì
tín hiệu đến trực tiếp từ bộ điều khiển. Vì vậy, chúng tôi bỏ tên tín hiệu trong các số liệu tiếp theo.

3. ALU hoạt động trên dữ liệu đọc từ tệp đăng ký, sử dụng các phần của
opcode để tạo chức năng ALU.
4. Kết quả từ ALU được ghi vào sổ đăng ký đích (x1) trong tập tin đăng ký.
Tương tự, chúng ta có thể minh họa việc thực hiện một thanh ghi tải, chẳng hạn như
lw x1, bù (x2)
theo phong cách tương tự Hình 4.23.Hình 4.24 hiển thị các đơn vị chức năng
hoạt động và các dòng điều khiển được xác nhận cho một tải. Chúng ta có thể
nghĩ về một lệnh tải như hoạt động theo năm bước (tương tự như cách thực hiện
kiểu R trong bốn) :
278 Chương 4 Bộ xử lý

HÌNH 4.22 Cài đặt của các dòng điều khiển được xác định hoàn toàn bởi các trường opcode của lệnh. Đầu tiên hàng của bảng
tương ứng với các hướng dẫn định dạng R (thêm, phụ và hoặc). Đối với tất cả các hướng dẫn này, các trường đăng ký nguồn là rs1 và rs2 và trường
đăng ký đích là rd; điều này xác định cách các tín hiệu ALUSrc được đặt. Hơn nữa, một lệnh loại R ghi một thanh ghi (RegWrite = 1), nhưng không
đọc cũng không ghi bộ nhớ dữ liệu. Khi tín hiệu điều khiển Chi nhánh là 0, PC được thay thế vô điều kiện bằng PC + 4; mặt khác, PC được thay thế
bằng mục tiêu nhánh nếu sản lượng Zero của ALU cũng cao. Trường ALUOp cho các hướng dẫn loại R được đặt thành 10 để chỉ ra rằng điều khiển
ALU phải được tạo từ các trường func. Các hàng thứ hai và thứ ba của bảng này cung cấp các cài đặt tín hiệu điều khiển cho lw và sw. Các trường
ALUSrc và ALUOp này được đặt để thực hiện tính toán địa chỉ. MemRead và MemWrite được thiết lập để thực hiện truy cập bộ nhớ. Cuối cùng,
RegWrite được đặt cho một tải để làm cho kết quả được lưu trữ trong thanh ghi rd. Trường ALUOp cho nhánh được đặt cho phép trừ (ALU control =
01), được sử dụng để kiểm tra tính bằng. Lưu ý rằng trường MemtoReg không liên quan khi tín hiệu RegWrite
0: do thanh ghi không được ghi, giá trị của dữ liệu trên cổng ghi dữ liệu thanh ghi không được sử dụng. Do đó, mục nhập MemtoReg trong
hai hàng cuối của bảng được thay thế bằng X để chăm sóc don. Loại chăm sóc don don này phải được thêm bởi nhà thiết kế, vì nó phụ thuộc
vào kiến thức về cách thức hoạt động của datapath.

0
Thê M
m b

vào n
x
Tổng
4 Thêm vào 1

Chi nhánh
Hướng dẫn [6 Ghi nhớ
trận0] MemtoReg
Điều khiển ALUOp
Ghi nhớ
ALUSrc
RegWrite
Hướng dẫn [19
bóng15] Đọc
Đọc
đăng ký
PC Địa chỉ 1 Đọc
Hướng dẫn [24 dữ liệu
trận20] Đọc 1
đăng ký Số không
Hướng dẫn 2
[31 Hướng dẫn [11 ALU Đọc
con0] trận7] Viết Đọc 0 ALU Địa chỉ 1
dữ liệu
Hướng dẫn đăng ký 2 M kết quả dữ liệu M
b b
ạ ạ
ký ức n n
Viết x x
dữ liệu Đăng ký 1 Viết Dữ liệu 0
dữ
liệu ký ức
Hướng dẫn [31
trận0] Tôi ALU
Gen điều khiển
Hướng dẫn [30,14
Từ12]
HÌNH 4.23 Biểu dữ liệu đang hoạt động cho một lệnh loại R, chẳng hạn như thêm x1, x2, x3. Các dòng điều khiển, datapath
các đơn vị và kết nối đang hoạt động được tô sáng.
4.4 Một kế hoạch thực hiện đơn giản 279

1. Một lệnh được lấy từ bộ nhớ lệnh và PC được tăng lên.


2. Một đăng ký (x2) giá trị được đọc từ tệp đăng ký.
3. ALU tính tổng giá trị đọc từ tệp đăng ký và 12 bit được mở rộng bằng dấu
của lệnh (bù đắp).
4. Tổng từ ALU được sử dụng làm địa chỉ cho bộ nhớ dữ liệu.
5. Dữ liệu từ đơn vị bộ nhớ được ghi vào tệp đăng ký (x1).

0
Thê M
m b

vào n
x
Tổng
4 Thêm vào 1

Chi nhánh
Hướng dẫn [6 Ghi nhớ
trận0] MemtoReg
Điều khiển ALUOp
Ghi nhớ
ALUSrc
RegWrite
Hướng dẫn [19
bóng15] Đọc
Đọc
PC Địa chỉ đăng ký 1 Đọc
Hướng dẫn [24 dữ liệu
trận20] Đọc 1
Hướng dẫn đăng ký 2 Số không
[31 Hướng dẫn [11 ALU Đọc
con0] trận7] Viết Đọc 0 ALU Địa chỉ 1
dữ liệu
Hướng dẫn đăng ký 2 M kết quả dữ liệu M
b b
ạ ạ
ký ức n n
Viết x x
dữ liệu Đăng ký 1 Viết Dữ liệu 0
dữ
liệu ký ức
Hướng dẫn [31
trận0] Tôi ALU
Gen điều khiển

Hướng dẫn [30,14-12]


HÌNH 4.24 Datapath đang hoạt động cho một lệnh tải. Các đường điều khiển, đơn vị datapath và các kết nối đang hoạt động được
làm nổi bật. Một hướng dẫn cửa hàng sẽ hoạt động rất tương tự. Sự khác biệt chính là điều khiển bộ nhớ sẽ chỉ ra ghi chứ không phải đọc,
giá trị đăng ký thứ hai sẽ được sử dụng cho dữ liệu để lưu trữ và hoạt động ghi giá trị bộ nhớ dữ liệu vào tệp đăng ký sẽ không xảy ra.
280 Chương 4 Bộ xử lý

Cuối cùng, chúng ta có thể hiển thị hoạt động của hướng dẫn chi nhánh, chẳng
hạn như beq x1, x2, bù, trong cùng một thời trang. Nó hoạt động giống như một định
dạng R hướng dẫn, nhưng đầu ra ALU được sử dụng để xác định xem PC được viết
bằng PC + 4 hay địa chỉ mục tiêu nhánh. Hình 4.25 hiển thị bốn bước thực hiện :
1. Một lệnh được lấy từ bộ nhớ lệnh và PC được tăng lên.
2. Hai thanh ghi , x1 và x2, được đọc từ tập tin đăng ký.

0
Thê M
m
vào bạn
x
4 Thêm vào Tổng 1

Chi nhánh
Hướng dẫn [6 Ghi nhớ
trận0] MemtoReg
Điều khiển ALUOp
Ghi nhớ
ALUSrc
RegWrite
Hướng dẫn [19
bóng15] Đọc
Đọc
PC Địa chỉ đăng ký 1 Đọc
Hướng dẫn [24 dữ liệu
trận20] Đọc 1
Hướng dẫn đăng ký 2 Số không
[31 Hướng dẫn [11 ALU Đọc
con0] trận7] Viết Đọc 0 ALU Địa chỉ 1
dữ liệu
Hướng dẫn đăng ký 2 M kết quả dữ liệu M
b b
ạ ạ
ký ức n n
Viết x x
dữ liệu Đăng ký 1 Viết Dữ liệu 0
dữ
liệu ký ức
Hướng dẫn [31
trận0] Tôi ALU
Gen điều khiển

Hướng dẫn [30,14-12]


HÌNH 4.25 Datapath đang hoạt động cho một hướng dẫn chi nhánh nếu bằng nhau. Các đường điều khiển, đơn vị datapath
và các kết nối đang hoạt động được làm nổi bật. Sau khi sử dụng tệp đăng ký và ALU để thực hiện so sánh, đầu ra Zero được sử dụng để
chọn bộ đếm chương trình tiếp theo từ giữa hai ứng cử viên.
4.4 Một kế hoạch thực hiện đơn giản 281

3. ALU trừ một giá trị dữ liệu khỏi giá trị dữ liệu khác, cả hai đều đọc từ tệp
đăng ký. Giá trị của PC được thêm vào phần mở rộng có dấu, 12 bit của
lệnh (bù đắp) trái chuyển bởi một; kết quả là địa chỉ mục tiêu chi nhánh.
4. Thông tin trạng thái Zero từ ALU được sử dụng để quyết định kết quả bổ
sung nào sẽ lưu trữ trong PC .

Hoàn thiện kiểm soát


Bây giờ chúng ta đã thấy các hướng dẫn hoạt động theo các bước như thế nào,
hãy để Tiếp tục với việc thực hiện kiểm soát. Hàm điều khiển có thể được xác
định chính xác bằng cách sử dụng nội dung của Hình 4.22Các đầu ra là các dòng
điều khiển và các đầu vào là các bit opcode. Do đó, chúng ta có thể tạo một bảng
sự thật cho từng đầu ra dựa trên mã hóa nhị phân của các opcodes.
Hình 4.26 định nghĩa logic trong đơn vị điều khiển là một bảng chân lý lớn kết
hợp tất cả các đầu ra và sử dụng các bit opcode làm đầu vào. Nó hoàn toàn chỉ
định chức năng điều khiển và chúng ta có thể triển khai trực tiếp tại các cổng
theo kiểu tự động. Chúng tôi chỉ ra bước cuối cùng này trong Mục C.2 trong
Phụ lục C.

HÌNH 4.26 Chức năng điều khiển để thực hiện một chu kỳ đơn giản được chỉ định hoàn
toàn bởi bảng sự thật này. Bảy hàng trên cùng của bảng cung cấp cho các kết hợp tín hiệu đầu vào
tương ứng với bốn lớp lệnh, mỗi lớp một cột, xác định cài đặt đầu ra điều khiển. Phần dưới cùng của bảng
cung cấp các đầu ra cho mỗi trong bốn opcodes. Do đó, RegWrite đầu ra được khẳng định cho hai kết hợp
đầu vào khác nhau. Nếu chúng ta chỉ xem xét bốn opcodes được hiển thị trong bảng này, thì chúng ta có
thể đơn giản hóa bảng sự thật bằng cách sử dụng don sắt quan tâm trong phần đầu vào. Ví dụ: chúng ta có
thể phát hiện một lệnh định dạng R với biểu thức Op4 ∙ Op5, vì điều này là đủ để phân biệt các hướng dẫn
định dạng R với lw, sw và beq. Chúng tôi không tận dụng sự đơn giản hóa này, vì phần còn lại của các
opcodes RISC-V được sử dụng trong một triển khai đầy đủ.
282 Chương 4 Bộ xử lý

Tại sao một triển khai một chu kỳ không được sử dụng ngày
nay
Mặc dù thiết kế một chu kỳ sẽ hoạt động chính xác, nhưng nó quá kém hiệu quả
để được sử dụng trong các thiết kế hiện đại. Để xem tại sao lại như vậy, hãy chú ý
rằng chu trình đồng hồ phải có cùng độ dài cho mọi hướng dẫn trong thiết kế chu
kỳ đơn này. Tất nhiên, đường dẫn dài nhất có thể trong bộ xử lý xác định chu kỳ
đồng hồ. Đường dẫn này rất có thể là một lệnh tải, sử dụng năm đơn vị chức năng
trong chuỗi: bộ nhớ lệnh, tệp đăng ký, ALU, bộ nhớ dữ liệu và tệp đăng ký. Mặc
dù CPI là 1 (xem Chương 1), hiệu suất tổng thể của việc thực hiện một chu kỳ có
thể sẽ kém, vì chu kỳ đồng hồ quá dài.
Hình phạt cho việc sử dụng thiết kế một chu kỳ với chu kỳ đồng hồ cố định là rất đáng
kể, nhưng có thể được coi là chấp nhận được đối với tập lệnh nhỏ này. Trong lịch sử, các
máy tính ban đầu với các bộ hướng dẫn rất đơn giản đã sử dụng kỹ thuật thực hiện này.
Tuy nhiên, nếu chúng tôi cố gắng triển khai đơn vị dấu phẩy động hoặc bộ lệnh với các
hướng dẫn phức tạp hơn, thiết kế chu kỳ đơn này sẽ không hoạt động tốt.
Bởi vì chúng ta phải cho rằng chu kỳ đồng hồ bằng với độ trễ trong trường hợp
xấu nhất cho tất cả các hướng dẫn, nên nó vô dụng để thử các kỹ thuật thực hiện làm
giảm độ trễ của trường hợp chung nhưng không cải thiện thời gian chu kỳ trong
trường hợp xấu nhất. Do đó, việc thực hiện một chu kỳ vi phạm ý tưởng tuyệt vời từ
đó Chương 1 làm cho
trường hợp phổ biến nhanh.
Trong Mục 4.6, chúng tôi sẽ xem xét một kỹ thuật triển khai khác, được gọi là
Kiểm đường ống, sử dụng một datapath rất giống với datapath một chu kỳ nhưng hiệu
tra quả hơn nhiều bằng cách có thông lượng cao hơn nhiều. Đường ống cải thiện hiệu
Bản quả bằng cách thực hiện nhiều hướng dẫn cùng một lúc
thân bạn Nhìn vào các tín hiệu điều khiển trong Hình 4.26Bạn có thể kết hợp bất kỳ với
nhau. Bất kỳ đầu ra tín hiệu điều khiển nào trong hình có thể được thay thế bằng
nghịch đảo của cái khác? (Gợi ý: hãy tính đến việc don don quan tâm?) Nếu vậy,
bạn có thể sử dụng một tín hiệu cho tín hiệu khác mà không cần thêm biến tần.

4.5 Một triển khai nhiều xe đạp

Trong phần trước, chúng tôi đã chia từng hướng dẫn thành một loạt các bước
tương ứng với các hoạt động của đơn vị chức năng cần thiết. Chúng ta có thể sử
dụng các bước này để tạo a thực hiện nhiều xe đạp Trong một thực hiện nhiều
xe đạp, mỗi. bước trong thực hiện sẽ mất 1 chu kỳ đồng hồ. Việc triển khai nhiều
bánh cho phép một đơn vị chức năng được sử dụng nhiều lần cho mỗi hướng dẫn,
miễn là nó được sử dụng trên các chu kỳ đồng hồ khác nhau. Chia sẻ này có thể
giúp giảm lượng phần cứng cần thiết. Khả năng cho phép các hướng dẫn thực
hiện các số chu kỳ đồng hồ khác nhau và khả năng chia sẻ các đơn vị chức năng
trong khi thực hiện một hướng dẫn là những lợi thế chính của thiết kế nhiều xe
đạp. Phần trực tuyến này mô tả việc triển khai MIPS nhiều xe đạp .
Mặc dù nó có thể giảm chi phí phần cứng, nhưng hầu hết tất cả các chip ngày nay
đều sử dụng đường ống thay thế để tăng hiệu suất trong một lần thực hiện chu kỳ, vì
vậy một số độc giả có thể muốn bỏ qua nhiều xe đạp và đi thẳng vào đường ống. Tuy
nhiên, một số
4.5 Một triển khai nhiều xe đạp 282.e1

4.56 Một triển khai nhiều xe đạp

Hình e4.5.1 cho thấy phiên bản trừu tượng của datapath nhiều xe đạp. Nếu chúng
ta so sánh Hình 4.27 đến datapath cho phiên bản một chu kỳ trong Hình 4.11 trên
trang 250 , chúng ta có thể thấy sự khác biệt sau :
■ Một đơn vị bộ nhớ duy nhất được sử dụng cho cả hướng dẫn và dữ liệu.
■ Có một ALU duy nhất, thay vì ALU và hai người thêm.
■ Một hoặc nhiều thanh ghi được thêm vào sau mỗi đơn vị chức năng chính
để giữ đầu ra của đơn vị đó cho đến khi giá trị được sử dụng trong một chu
kỳ xung nhịp tiếp theo.
Vào cuối chu kỳ đồng hồ, tất cả dữ liệu được sử dụng trong các chu kỳ đồng
hồ tiếp theo phải được lưu trữ trong một thành phần trạng thái. Dữ liệu được sử
dụng bởi hướng dẫn tiếp theo trong một chu kỳ đồng hồ sau được lưu trữ vào
một trong các thành phần trạng thái có thể nhìn thấy của lập trình viên: tệp đăng
ký, PC hoặc bộ nhớ. Ngược lại, dữ liệu được sử dụng bởi cùng hướng dẫn trong
một chu kỳ sau phải được lưu trữ vào một trong những thanh ghi bổ sung này
được thêm vào mỗi đơn vị chức năng.
Do đó, vị trí của các thanh ghi bổ sung được xác định bởi hai yếu tố sau: đơn vị tổ
hợp nào sẽ phù hợp trong một chu kỳ đồng hồ và dữ liệu nào là cần thiết trong các
chu kỳ sau thực hiện hướng dẫn. Trong thiết kế đa xe này, chúng tôi giả định rằng
chu trình đồng hồ có thể đáp ứng hầu hết các thao tác sau: truy cập bộ nhớ, truy cập
tệp đăng ký (hai lần đọc hoặc một lần ghi) hoặc thao tác ALU. Do đó,

Hướng
dẫn
đăng ký Dữ liệu
PC Địa chỉ
A
Hướng dẫn Đăng ký #
hoặc dữ ALU ALUOut
Ký ức liệu Đăng ký
Đăng ký # B
Ký ức
Dữ liệu dữ liệu Đăng ký #
đăng ký

HÌNH e4.5.1 Chế độ xem cấp cao của datapath nhiều xe đạp. Hình ảnh này cho thấy các yếu tố chính của datapath :
một đơn vị bộ nhớ dùng chung, một ALU duy nhất được chia sẻ giữa các hướng dẫn và các kết nối giữa các đơn vị được chia
sẻ này. Việc sử dụng các đơn vị chức năng được chia sẻ đòi hỏi phải thêm hoặc mở rộng bộ ghép kênh cũng như các thanh ghi
tạm thời mới giữ dữ liệu giữa các chu kỳ đồng hồ của cùng một lệnh. Các thanh ghi bổ sung là thanh ghi Hướng dẫn (IR),
thanh ghi dữ liệu Bộ nhớ (MDR), A, B và ALUOut.
282.e2 4.5 Một triển khai nhiều xe đạp

bất kỳ dữ liệu nào được tạo bởi một trong ba đơn vị chức năng này (bộ nhớ, tệp
đăng ký hoặc ALU) phải được lưu vào một thanh ghi tạm thời để sử dụng trong
một chu kỳ sau. Nếu nó không được lưu, thì khả năng của một cuộc đua thời gian
có thể xảy ra, dẫn đến việc sử dụng một giá trị không chính xác.
Các thanh ghi tạm thời sau đây được thêm vào để đáp ứng các yêu cầu sau :
■ Thanh ghi lệnh (IR) và thanh ghi dữ liệu bộ nhớ (MDR) được thêm vào để
lưu đầu ra của bộ nhớ cho một chỉ dẫn đọc và đọc dữ liệu, tương ứng. Hai
thanh ghi riêng biệt được sử dụng, vì, sẽ sớm rõ ràng, cả hai giá trị đều cần
thiết trong cùng một chu kỳ đồng hồ.
■ Các thanh ghi A và B được sử dụng để giữ các giá trị toán hạng thanh ghi
được đọc từ tệp thanh ghi.
■ Thanh ghi ALUOut giữ đầu ra của ALU .
Tất cả các thanh ghi ngoại trừ IR chỉ giữ dữ liệu giữa một cặp chu kỳ xung
nhịp liền kề và do đó sẽ không cần tín hiệu điều khiển ghi. IR cần giữ lệnh cho
đến khi kết thúc thực hiện lệnh đó và do đó sẽ yêu cầu tín hiệu điều khiển ghi. Sự
khác biệt này sẽ trở nên rõ ràng hơn khi chúng tôi hiển thị các chu kỳ đồng hồ
riêng cho từng hướng dẫn.
Bởi vì một số đơn vị chức năng được chia sẻ cho các mục đích khác nhau,
chúng tôi cần cả hai để thêm bộ ghép kênh và để mở rộng bộ ghép kênh hiện có.
Ví dụ: vì một bộ nhớ được sử dụng cho cả hướng dẫn và dữ liệu, chúng tôi cần
một bộ ghép kênh để chọn giữa hai nguồn cho một địa chỉ bộ nhớ, cụ thể là PC
(để truy cập hướng dẫn) và ALUOut (để truy cập dữ liệu).
Thay thế ba ALU của datapath một chu kỳ bằng một ALU duy nhất có nghĩa là
ALU đơn phải chứa tất cả các đầu vào được sử dụng để đi đến ba ALU khác nhau.
Xử lý các đầu vào bổ sung yêu cầu hai thay đổi đối với datapath :
1. Một bộ ghép kênh bổ sung được thêm vào cho đầu vào ALU đầu tiên. Bộ
ghép kênh chọn giữa thanh ghi A và PC .
2. Bộ ghép kênh trên đầu vào ALU thứ hai được thay đổi từ bộ ghép hai
chiều sang bộ ghép ba chiều. Hai đầu vào bổ sung cho bộ ghép kênh là
hằng số 4 (được sử dụng để tăng PC) và được tạo ngay lập tức.
Hình e4.5.2 hiển thị các chi tiết của datapath với các bộ ghép kênh bổ sung
này. Bằng cách giới thiệu một vài thanh ghi và bộ ghép kênh, chúng tôi có thể
giảm số lượng đơn vị bộ nhớ từ hai xuống còn một và loại bỏ hai bộ cộng. Vì các
thanh ghi và bộ ghép kênh khá nhỏ so với đơn vị bộ nhớ hoặc ALU, điều này có
thể giúp giảm đáng kể chi phí phần cứng.
Bởi vì datapath hiển thị trong Hình e4.5.2 mất nhiều chu kỳ đồng hồ cho mỗi
hướng dẫn, nó sẽ yêu cầu một bộ tín hiệu điều khiển khác nhau. Các đơn vị trạng thái
có thể nhìn thấy lập trình viên (PC, bộ nhớ và các thanh ghi) cũng như IR sẽ cần tín
hiệu điều khiển ghi. Bộ nhớ cũng sẽ cần tín hiệu đọc. Chúng ta có thể sử dụng bộ
điều khiển ALU từ datapath một chu kỳ (xem Phụ lục B) để kiểm soát ALU ở
đây là tốt. Cuối cùng, mỗi bộ ghép kênh hai đầu vào yêu cầu một bộ
4.5 Một triển khai nhiều xe đạp 282.e3

0
PC M Hướng dẫn Đọc 0
bạn Địa chỉ [19 trận15] đăng ký 1 Đọc M
bạn
x A
dữ liệu
1 Hướng dẫn Đọc 1 x
Ký ức [24 con20] đăng ký 2 1 Số không
MemData Hướng dẫn Đăng ký ALU ALU ALUOut
[11 trận7] Viết kết quả
Đọc
dữ liệu
Viết đăng ký 2 B 0
dữ liệu Hướng dẫn 4 1M
đăng ký Viết bạn
0 dữ liệu 2 x
Hướng dẫn M
bạn
[31 con0] x
1
Ký ức Tôi
dữ liệu
Gen
đăng ký

HÌNH e4.5.2 Datapath nhiều xe đạp cho RISC-V xử lý các hướng dẫn cơ bản. Mặc dù datapath này hỗ trợ tăng bình thường của PC,
sẽ cần thêm một vài kết nối và bộ ghép kênh cho các nhánh và nhảy; chúng tôi sẽ thêm những điều này trong thời gian ngắn. Các bổ sung so với
datapath một giờ bao gồm một số thanh ghi (IR, MDR, A, B, ALUOut), bộ ghép kênh cho địa chỉ bộ nhớ, bộ ghép kênh cho đầu vào ALU trên
cùng và mở rộng bộ ghép kênh ở đầu vào ALU dưới cùng thành một bộ chọn bốn chiều. Những bổ sung nhỏ này cho phép chúng tôi loại bỏ hai
bổ sung và một đơn vị bộ nhớ.

đường điều khiển, trong khi bộ ghép kênh bốn đầu vào yêu cầu hai đường điều
khiển. Hình e4.5.3 hiển thị datapath của Hình 4.28 với các dòng điều khiển được
thêm vào.
Datapath nhiều xe đạp vẫn yêu cầu bổ sung để hỗ trợ các nhánh và nhảy; sau
những bổ sung này, chúng ta sẽ thấy các hướng dẫn được sắp xếp theo trình tự và
sau đó tạo ra điều khiển datapath.
Với hướng dẫn nhảy và hướng dẫn nhánh, có hai nguồn có thể cho giá trị
được ghi vào PC :
1. Đầu ra của ALU, là giá trị PC + 4 trong quá trình tìm nạp lệnh. Giá trị
này nên được lưu trữ trực tiếp vào PC .
2. ALUOut đăng ký, đó là nơi chúng tôi sẽ lưu trữ địa chỉ của mục tiêu chi
nhánh sau khi được tính toán.
Như chúng tôi đã quan sát khi chúng tôi thực hiện điều khiển một chu kỳ, PC
được viết cả vô điều kiện và có điều kiện. Trong một mức tăng bình thường và
cho các bước nhảy, PC được viết vô điều kiện. Nếu lệnh là một nhánh có điều
kiện, PC tăng được thay thế bằng giá trị trong ALUOut chỉ khi hai thanh ghi
được chỉ định bằng nhau. Do đó, việc triển khai của chúng tôi sử dụng hai tín
hiệu điều khiển riêng biệt: PCWrite, gây ra sự ghi vô điều kiện của PC và
PCWriteCond, gây ra sự ghi của PC nếu điều kiện nhánh cũng đúng.
282.e4 4.5 Một triển khai nhiều xe đạp

Ghi nhớ IorD MemWrite IRWrite RegWrite ALUSrcA

0
PC M Hướng dẫn Đọc 0
bạn Địa chỉ [19-15] đăng ký 1 M
Đọc
bạ
x dữ liệu A n
1 Hướng dẫn Đọc 1 x
Ký ức [24-20] 1 Số không
đăng ký 2
MemData Hướng dẫn Đăng ký ALU ALU ALUOut
[11-7] Viết Đọc kết quả
dữ liệu
Viết đăng ký 2 B 0M
dữ liệu Hướng dẫn 4 1 bạn
Viết
đăng ký 0 2x
dữ liệu
Hướng dẫn M
bạn
[31 con0] x
1
Ký ức Tôi
dữ liệu Gen ALU
đăng ký điều
khiển

Hướng dẫn [6-0]

MemtoReg ALUSrcB ALUOp

HÌNH e4.5.3 Datapath nhiều xe đạp từ Hình 4.28 với các dòng điều khiển được hiển thị. Các tín hiệu ALUOp và
ALUSrcB là tín hiệu điều khiển 2 bit, trong khi tất cả các dòng điều khiển khác là tín hiệu 1 bit. Không đăng ký A và B yêu cầu tín
hiệu ghi, vì nội dung của chúng chỉ được đọc trên chu kỳ ngay sau khi được ghi. Thanh ghi dữ liệu bộ nhớ đã được thêm vào để giữ
dữ liệu từ một tải khi dữ liệu trở về từ bộ nhớ. Dữ liệu từ tải trở về từ bộ nhớ không thể được ghi trực tiếp vào tệp đăng ký vì chu kỳ
đồng hồ không thể phù hợp với thời gian cần thiết cho cả truy cập bộ nhớ và ghi tệp đăng ký. Tín hiệu MemRead đã được chuyển lên
đầu bộ nhớ để đơn giản hóa các số liệu. Toàn bộ các biểu đồ và dòng điều khiển cho các nhánh sẽ sớm được thêm vào.

Chúng ta cần kết nối hai tín hiệu điều khiển này với điều khiển ghi PC. Giống như
chúng ta đã làm trong datapath một chu kỳ, chúng ta sẽ sử dụng một vài cổng để lấy
tín hiệu điều khiển ghi PC từ PCWrite, PCWriteCond và tín hiệu Zero của ALU,
được sử dụng để phát hiện xem hai thanh ghi có hoạt động của một beq không bằng
nhau. Để xác định xem PC có nên được viết trong một nhánh có điều kiện hay không,
chúng tôi VÀ cùng với tín hiệu Zero của ALU với PCWriteCond. Đầu ra của cổng
AND này sau đó được ORed với PCWrite, đây là tín hiệu ghi PC vô điều kiện. Đầu
ra của cổng OR này được kết nối với tín hiệu điều khiển ghi cho PC .
Hình e4.5.4 cho thấy đơn vị điều khiển và điều khiển đa xe đạp hoàn chỉnh, bao
gồm các tín hiệu điều khiển và bộ ghép kênh bổ sung để thực hiện cập nhật PC.
Trước khi kiểm tra các bước để thực hiện từng hướng dẫn, chúng ta hãy kiểm
tra không chính thức hiệu quả của tất cả các tín hiệu điều khiển (giống như chúng
ta đã làm cho thiết kế một chu kỳ trong Hình 5.16 trên trang 306). Hình e4.5.5
cho thấy những gì mỗi tín hiệu điều khiển làm khi khẳng định và bảo đảm.
4.5 Một triển khai nhiều xe đạp 282.e5

PCWriteCond Nguồn PC

PCWrite Đầu ra ALUOp


IorD
Điều ALUSrcB
Ghi nhớ khiển
ALUSrcA
Ghi nhớ
MemtoReg Op RegWrite
[6-0]
IRWrite 0M
bạn
x
1
Hướng dẫn
[6-0]
PC 0
M Hướng dẫn Đọc 0
bạn Địa chỉ [19-15] đăng ký 1 M
Đọc
bạ
x dữ liệu A n
1 Hướng dẫn Đọc 1 x
Ký ức [24-20] 1 Số không
đăng ký 2 ALU
MemData Hướng dẫn Đăng ký ALU ALUOut
[11-7] Viết Đọc kết quả
dữ liệu
Viết đăng ký 2 B 0 M
dữ liệu Hướng dẫn 4 1 bạn
Viết
đăng ký 0 2x
dữ liệu
Hướng dẫn M
bạn
[31-0] x
1
Ký ức
dữ liệu Tôi ALU
đăng ký Gen điều khiển

Hướng dẫn [6-0]

HÌNH e4.5.4 Biểu dữ liệu hoàn chỉnh để thực hiện nhiều xe đạp cùng với các dòng điều khiển cần thiết. Các dòng điều
khiển của Hình e4.5.3 được gắn vào bộ điều khiển và các yếu tố điều khiển và dữ liệu cần thiết để thực hiện các thay đổi đối với PC được
bao gồm. Các bổ sung chính từ Hình 4.29 bao gồm bộ ghép kênh được sử dụng để chọn nguồn của giá trị PC mới; cổng được sử dụng để
kết hợp tín hiệu ghi PC; và các tín hiệu điều khiển PCSource, PCWrite và PCWriteCond. Tín hiệu PCWriteCond được sử dụng để quyết
định xem có nên sử dụng nhánh có điều kiện hay không.

Xây dựng: Để giảm số lượng đường tín hiệu kết nối các đơn vị chức năng , nhà thiết kế
có thể sử dụng xe buýt dùng chung. Xe buýt dùng chung là một tập hợp các tuyến kết nối
nhiều đơn vị; trong hầu hết các trường hợp, chúng bao gồm nhiều nguồn có thể đặt dữ
liệu trên xe buýt và nhiều trình đọc của giá trị. Giống như chúng tôi đã giảm số lượng đơn
vị chức năng cho datapath, chúng tôi có thể giảm số lượng xe buýt kết nối các đơn vị này
bằng cách chia sẻ xe buýt. Ví dụ: có sáu nguồn đến ALU; tuy nhiên, chỉ có hai trong số
chúng là cần thiết bất cứ lúc nào. Như thế, một cặp xe buýt có thể được sử dụng để giữ
các giá trị đang được gửi đến ALU. Thay vì đặt một bộ ghép kênh lớn trước ALU, một nhà
thiết kế có thể sử dụng xe buýt dùng chung và sau đó đảm bảo rằng chỉ một trong các
nguồn đang lái xe buýt tại bất kỳ điểm nào. Mặc dù điều này lưu các đường tín hiệu, cùng
số dòng điều khiển
282.e6 4.5 Một triển khai nhiều xe đạp

Hành động của tín hiệu điều khiển 1 bit


Tên tín hiệu Hiệu quả khi khử khí Hiệu lực khi được khẳng định
RegWrite Không ai. Thanh ghi mục đích chung được chọn bởi số thanh ghi Viết là
được viết với giá trị của đầu vào dữ liệu ghi.
ALUSrcA Toán hạng ALU đầu tiên là PC . Toán hạng ALU đầu tiên đến từ thanh ghi A.
Nội dung của bộ nhớ tại vị trí được chỉ định bởi đầu vào Địa chỉ được
Ghi nhớ Không ai. đặt
trên đầu ra dữ liệu bộ nhớ.
Ghi nhớ Không ai. Nội dung bộ nhớ tại vị trí được chỉ định bởi đầu vào Địa chỉ là
được thay thế bằng giá trị trên đầu vào dữ liệu ghi.
Giá trị được cung cấp cho tệp đăng ký Viết dữ Giá trị được cung cấp cho tệp đăng ký Ghi dữ liệu đầu vào đến từ
MemtoReg liệu đầu vào MDR .
đến từ ALUOut.
IorD PC được sử dụng để cung cấp địa chỉ cho ALUOut được sử dụng để cung cấp địa chỉ cho đơn vị bộ nhớ.
đơn vị bộ nhớ.
IRWrite Không ai. Đầu ra của bộ nhớ được ghi vào IR .
PCWrite Không ai. PC được viết; nguồn được kiểm soát bởi PCSource.
PCWriteCond Không ai. PC được viết nếu đầu ra Zero từ ALU cũng hoạt động.

Hành động của tín hiệu điều khiển 2 bit


Tên tín hiệu Giá trị (nhị Hiệu ứng
phân)
ALUOp 00 ALU thực hiện một hoạt động thêm.
01 ALU thực hiện thao tác trừ.
10 Trường func của lệnh xác định hoạt động ALU.
ALUSrcB 00 Đầu vào thứ hai cho ALU đến từ thanh ghi B.
01 Đầu vào thứ hai cho ALU là hằng số 4.
10 Đầu vào thứ hai cho ALU là được tạo ngay lập tức từ IR .
Nguồn PC 00 Đầu ra của ALU (PC + 4) được gửi đến PC để viết.
01 Nội dung của ALUOut (địa chỉ mục tiêu chi nhánh) được gửi đến PC để viết.
10 Địa chỉ mục tiêu nhảy (IR [25: 0] đã dịch chuyển sang trái 2 bit và được nối với nhau
PC + 4 [31:28]) được gửi đến PC để viết.

HÌNH e4.5.5 Hành động gây ra bởi cài đặt của từng tín hiệu điều khiển Hình e4.5.4 trên trang 323. Bàn trên cùng mô tả
các tín hiệu điều khiển 1 bit, trong khi bảng dưới cùng mô tả các tín hiệu 2 bit. Chỉ những dòng điều khiển ảnh hưởng đến bộ ghép kênh
mới có hành động khi chúng được khử. Thông tin này tương tự như trongHình 5.16 trên trang 306 cho datapath một chu kỳ, nhưng thêm
một số dòng điều khiển mới (IRWrite, PCWrite, PCWriteCond, ALUSrcB và PCSource) và xóa các dòng điều khiển không còn được sử
dụng hoặc đã được thay thế (PCSrc và Branch).

sẽ cần thiết để kiểm soát những gì đi trên xe buýt. Hạn chế chính của việc sử dụng
các cấu trúc xe buýt như vậy là một hình phạt hiệu suất tiềm năng, vì xe buýt không
có khả năng nhanh như kết nối điểm-điểm.

Phá vỡ việc thực hiện hướng dẫn vào chu kỳ đồng hồ


Đưa ra datapath trong Hình e4.5.4, bây giờ chúng ta cần xem xét những gì sẽ xảy ra
trong mỗi chu kỳ đồng hồ của việc thực hiện nhiều bánh, vì điều này sẽ xác định
những tín hiệu điều khiển bổ sung nào có thể cần thiết, cũng như cài đặt tín hiệu điều
khiển. Mục tiêu của chúng tôi trong việc phá vỡ thực thi thành các chu kỳ đồng hồ
nên là tối đa hóa hiệu suất. Chúng ta có thể bắt đầu bằng cách chia việc thực hiện bất
kỳ hướng dẫn nào thành một loạt các bước, mỗi bước thực hiện một chu kỳ đồng hồ,
cố gắng giữ số lượng công việc trên mỗi chu kỳ gần bằng nhau. Ví dụ: chúng tôi sẽ
hạn chế từng bước để chứa
4.5 Một triển khai nhiều xe đạp 282.e7

tại hầu hết một thao tác ALU hoặc một truy cập tệp đăng ký hoặc một truy cập
bộ nhớ. Với hạn chế này, chu kỳ đồng hồ có thể ngắn nhất trong các hoạt động
này.
Hãy nhớ lại rằng vào cuối mỗi chu kỳ đồng hồ, mọi giá trị dữ liệu sẽ cần trong
một chu kỳ tiếp theo phải được lưu trữ vào một thanh ghi, có thể là một trong
những yếu tố chính của trạng thái (ví dụ:., PC, tệp đăng ký hoặc bộ nhớ), một
thanh ghi tạm thời được viết trên mỗi chu kỳ đồng hồ (ví dụ:., A, B, MDR hoặc
ALUOut) hoặc đăng ký tạm thời với điều khiển ghi (ví dụ:., IR). Cũng nên nhớ
rằng vì thiết kế của chúng tôi được kích hoạt cạnh, chúng tôi có thể tiếp tục đọc
giá trị hiện tại của một thanh ghi; giá trị mới không xuất hiện cho đến chu kỳ
đồng hồ tiếp theo.
Trong datapath chu kỳ đơn, mỗi lệnh sử dụng một tập hợp các phần tử
datapath để thực hiện thực thi. Nhiều phần tử datapath hoạt động nối tiếp, sử
dụng đầu ra của phần tử khác làm đầu vào. Một số phần tử datapath hoạt động
song song; ví dụ, PC được tăng lên và hướng dẫn được đọc cùng một lúc. Một
tình huống tương tự tồn tại trong datapath nhiều xe đạp. Tất cả các thao tác được
liệt kê trong một bước xảy ra song song trong vòng 1 chu kỳ đồng hồ, trong khi
các bước liên tiếp hoạt động nối tiếp theo các chu kỳ đồng hồ khác nhau. Giới
hạn của một thao tác ALU, một truy cập bộ nhớ và một truy cập tệp đăng ký xác
định những gì có thể phù hợp trong một bước.
Lưu ý rằng chúng tôi phân biệt giữa đọc hoặc ghi vào PC hoặc một trong các
thanh ghi độc lập và đọc hoặc ghi vào tệp đăng ký. Trong trường hợp trước, đọc
hoặc ghi là một phần của chu kỳ đồng hồ, trong khi đọc hoặc viết kết quả vào tệp
đăng ký sẽ có thêm một chu kỳ đồng hồ. Lý do cho sự khác biệt này là tệp đăng
ký có quyền kiểm soát và truy cập bổ sung so với các thanh ghi độc lập duy nhất.
Do đó, giữ cho chu kỳ đồng hồ ngắn thúc đẩy dành các chu kỳ đồng hồ riêng cho
truy cập tệp đăng ký.

Các bước thực hiện tiềm năng và hành động của họ được đưa ra dưới đây.
Mỗi hướng dẫn RISC-V cần từ ba đến năm trong số các bước sau :

1. Hướng dẫn tìm nạp bước


Lấy lệnh từ bộ nhớ và tính địa chỉ của lệnh tuần tự tiếp theo :
IR <= Bộ nhớ [PC];
PC <= PC + 4;

Hoạt động: Gửi PC đến bộ nhớ làm địa chỉ, thực hiện đọc và ghi hướng dẫn vào
thanh ghi Hướng dẫn (IR), nơi nó sẽ được lưu trữ. Ngoài ra, tăng PC lên 4.
Chúng tôi sử dụng biểu tượng Cúc <= từ Verilog; nó chỉ ra rằng các mặt bên tay
được đánh giá và sau đó tất cả các bài tập được thực hiện, đó là cách hiệu quả
của phần cứng thực thi trong chu kỳ đồng hồ.
Để thực hiện bước này, chúng ta sẽ cần xác nhận tín hiệu điều khiển
MemRead và IRWrite và đặt IorD thành 0 để chọn PC làm nguồn của địa chỉ.
Chúng tôi cũng tăng PC lên 4, yêu cầu đặt tín hiệu ALUSrcA thành 0
282.e8 4.5 Một triển khai nhiều xe đạp

(gửi PC đến ALU), tín hiệu ALUSrcB đến 01 (gửi 4 đến ALU) và ALUOp đến
00 (để thêm ALU). Cuối cùng, chúng tôi cũng sẽ muốn lưu trữ địa chỉ hướng dẫn
tăng trở lại vào PC, yêu cầu đặt nguồn PC thành 0 và đặt PCWrite. Sự gia tăng
của PC và truy cập bộ nhớ lệnh có thể xảy ra song song. Giá trị mới của PC
không hiển thị cho đến chu kỳ đồng hồ tiếp theo. (PC tăng cũng sẽ được lưu trữ
vào ALUOut, nhưng hành động này là lành tính.)

2. Hướng dẫn giải mã và đăng ký bước tìm nạp


Trong bước trước và trong cái này, chúng tôi chưa biết hướng dẫn là gì, vì vậy
chúng tôi chỉ có thể thực hiện các hành động có thể áp dụng cho tất cả các hướng
dẫn (chẳng hạn như tìm nạp hướng dẫn trong bước 1) hoặc không gây hại, trong
trường hợp hướng dẫn không phải là những gì chúng ta nghĩ nó có thể. Do đó,
trong bước này, chúng ta có thể đọc hai thanh ghi được chỉ định bởi các trường
lệnh rs1 và rs2, vì nó không có hại khi đọc chúng ngay cả khi nó không cần thiết.
Các giá trị được đọc từ tệp đăng ký có thể cần thiết trong các giai đoạn sau, vì
vậy chúng tôi đọc chúng từ tệp đăng ký và lưu các giá trị vào các thanh ghi tạm
thời A và B .
Chúng tôi cũng sẽ tính toán địa chỉ mục tiêu chi nhánh với ALU, điều này
cũng không có hại vì chúng tôi có thể bỏ qua giá trị nếu hướng dẫn hóa ra không
phải là một nhánh. Mục tiêu chi nhánh tiềm năng được lưu trong ALUOut. Thực
hiện sớm các hành động lạc quan này có thể có lợi ích là giảm số chu kỳ đồng hồ
cần thiết để thực hiện một hướng dẫn. Chúng tôi có thể thực hiện những hành
động lạc quan này sớm vì tính thường xuyên của các định dạng hướng dẫn.
Chẳng hạn, nếu lệnh có hai đầu vào thanh ghi, chúng luôn nằm trong các trường
rs1 và rs2 :
A <= Reg [IR [19:15]];
B <= Reg [IR [24:20]];
ALUOut <= PC + ngay lập tức;

Hoạt động: Truy cập tệp đăng ký để đọc các thanh ghi rs1 và rs2 và lưu trữ kết
quả vào các thanh ghi A và B. Vì A và B được ghi đè trên mỗi chu kỳ, tệp đăng
ký có thể được đọc trên mọi chu kỳ với các giá trị được lưu trữ vào A và B. Bước
này cũng tính toán địa chỉ mục tiêu chi nhánh và lưu địa chỉ trong ALUOut, nơi
nó sẽ được sử dụng trên chu kỳ đồng hồ tiếp theo nếu hướng dẫn là một nhánh.
Điều này yêu cầu đặt ALUSrcA thành 0 (để PC được gửi đến ALU), ALUSrcB
thành giá trị 10 (để ngay lập tức được gửi đến ALU) và ALUOp đến 00 (vì vậy
ALU thêm vào). Việc truy cập tệp đăng ký và tính toán mục tiêu chi nhánh xảy ra
song song. Sau chu kỳ đồng hồ này, việc xác định hành động cần thực hiện có thể
phụ thuộc vào nội dung hướng dẫn.

3. Thực hiện, tính toán địa chỉ bộ nhớ hoặc hoàn thành chi nhánh
Đây là chu kỳ đầu tiên trong đó thao tác datapath được xác định bởi lớp lệnh.
Trong mọi trường hợp, ALU đang hoạt động trên các toán hạng được chuẩn bị ở
bước trước, thực hiện một trong bốn chức năng, tùy thuộc
4.5 Một triển khai nhiều xe đạp 282.e9

trên lớp hướng dẫn. Chúng tôi chỉ định hành động được thực hiện tùy thuộc vào
lớp hướng dẫn.

Tham khảo bộ nhớ :

ngay lập tức


Hoạt động: ALU đang thêm các toán hạng để tạo thành địa chỉ bộ nhớ. Điều này
yêu cầu đặt ALUSrcA thành 1 (để đầu vào ALU đầu tiên được đăng ký A) và đặt
ALUSrcB thành 10 (để đầu ra của đơn vị tạo tức thời được sử dụng cho đầu vào
ALU thứ hai). Các tín hiệu ALUOp sẽ cần được đặt thành 00 (khiến ALU thêm
vào).

Hướng dẫn số học-logic (loại R) :

ALUOut <= A op B;
Hoạt động: ALU đang thực hiện thao tác được chỉ định bởi opcode trên hai giá trị
đọc từ tệp đăng ký trong chu kỳ trước. Điều này yêu cầu đặt ALUSrcA = 1 và đặt
ALUSrcB = 00, cùng nhau làm cho các thanh ghi A và B được sử dụng làm đầu
vào ALU. Các tín hiệu ALUOp sẽ cần được đặt thành 10 (để opcode được sử
dụng để xác định cài đặt tín hiệu điều khiển ALU).

Chi nhánh:

if (A == B) PC <= ALUOut;
Hoạt động: ALU được sử dụng để thực hiện so sánh bằng nhau giữa hai đăng ký
đọc ở bước trước. Tín hiệu Zero ra khỏi ALU được sử dụng để xác định xem có
nên phân nhánh hay không. Điều này yêu cầu đặt ALUSrcA = 1 và đặt ALUSrcB
= 00 (để đầu ra tệp đăng ký là đầu vào ALU). Các tín hiệu ALUOp sẽ cần được
đặt thành 01 (khiến ALU bị trừ) để kiểm tra đẳng thức. Tín hiệu PCWriteCond sẽ
cần được xác nhận để cập nhật PC nếu đầu ra Zero của ALU được xác nhận.
Bằng cách đặt PCSource thành 1, giá trị được ghi vào PC sẽ đến từ ALUOut, giữ
địa chỉ mục tiêu chi nhánh được tính trong chu kỳ trước. Đối với các nhánh có
điều kiện được thực hiện, chúng tôi thực sự viết PC hai lần: một lần từ đầu ra của
ALU (trong quá trình giải mã / lấy đăng ký Hướng dẫn) và một lần từ ALUOut
(trong bước hoàn thành Chi nhánh). Giá trị cuối cùng được ghi vào PC là giá trị
được sử dụng cho lần tìm nạp lệnh tiếp theo.

4. Bước truy cập bộ nhớ hoặc bước hoàn thành hướng dẫn loại R
Trong bước này, một lệnh tải hoặc lưu trữ truy cập bộ nhớ và một lệnh logic số
học ghi kết quả của nó. Khi một giá trị được lấy từ bộ nhớ, nó được lưu vào
thanh ghi dữ liệu bộ nhớ (MDR), nơi nó phải được sử dụng trên chu kỳ đồng hồ
tiếp theo.
282.e10 4.5 Một triển khai nhiều xe đạp

Tham khảo bộ nhớ :

MDR <= Bộ nhớ [ALUOut];


hoặc là

Bộ nhớ [ALUOut] <= B;


Hoạt động: Nếu lệnh là tải, một từ dữ liệu được lấy từ bộ nhớ và được viết vào
MDR. Nếu hướng dẫn là một cửa hàng, thì dữ liệu được ghi vào bộ nhớ. Trong
cả hai trường hợp, địa chỉ được sử dụng là địa chỉ được tính trong bước trước đó
và được lưu trữ trong ALUOut. Đối với một cửa hàng, toán hạng nguồn được lưu
trong B. (B thực sự được đọc hai lần, một lần ở bước 2 và một lần ở bước 3. May
mắn thay, cùng một giá trị được đọc cả hai lần, vì số đăng ký, được lưu trữ trong
IR và được sử dụng để đọc từ tệp đăng ký, không thay đổi.) Tín hiệu MemRead
(cho tải) hoặc MemWrite (cho cửa hàng) sẽ cần được xác nhận. Ngoài ra, đối với
tải và lưu trữ, tín hiệu IorD được đặt thành 1 để buộc địa chỉ bộ nhớ đến từ ALU,
thay vì PC. Vì MDR được viết trên mỗi chu kỳ đồng hồ, không cần xác nhận tín
hiệu điều khiển rõ ràng.

Hướng dẫn số học-logic (loại R) :

Reg [IR [11: 7]] <= ALUOut;


Hoạt động: Đặt nội dung của ALUOut, tương ứng với đầu ra của hoạt động ALU
trong chu kỳ trước, vào thanh ghi Kết quả. Tín hiệu RegDst phải được đặt thành
1 để buộc trường rd (bit 11: 7) được sử dụng để chọn mục nhập tệp đăng ký để
ghi. RegWrite phải được xác nhận và MemtoReg phải được đặt thành 0 để đầu ra
của ALU được ghi, trái ngược với đầu ra dữ liệu bộ nhớ.

5. Bộ nhớ đọc bước hoàn thành


Trong bước này, tải hoàn thành bằng cách ghi lại giá trị từ bộ nhớ.

Tải:

Reg [IR [11: 7]] <= MDR;


Hoạt động: Viết dữ liệu tải, được lưu trữ vào MDR trong chu kỳ trước , vào tập
tin đăng ký. Để thực hiện việc này, chúng tôi đặt MemtoReg = 1 (để viết kết quả
từ bộ nhớ) và xác nhận RegWrite (để tạo một chữ viết).
Trình tự năm bước này được tóm tắt trong Hình e4.5.6Từ trình tự này, chúng
ta có thể xác định những gì điều khiển phải làm trên mỗi chu kỳ đồng hồ.
4.5 Một triển khai nhiều xe đạp 282.e11

Hành động cho Hành động cho các Hành động cho
Bước tên loại R hướng dẫn tham khảo cành
hướng dẫn bộ nhớ
Hướng dẫn lấy IR <= Bộ nhớ [PC]
PC <= PC + 4
Hướng dẫn giải mã / đăng ký lấy A <= Reg [IR [19:15]]
B <= Reg [IR [24:20]]
ALUOut <= PC + ngay lập tức
Thi công, tính toán địa chỉ , ALUOut <= A op B ALUOut <= A + ngay lập tức nếu (A == B)
hoàn thành chi nhánh / nhảy PC <= ALUOut
Truy cập bộ nhớ hoặc loại R Reg [IR [11: 7]] <= Tải: MDR <= Bộ nhớ [ALUOut]
hoàn thành ALUOut hoặc là
Lưu trữ: Bộ nhớ [ALUOut] <= B
Bộ nhớ đọc hoàn thành Tải: Reg [IR [11: 7]] <= MDR

HÌNH e4.5.6 Tóm tắt các bước được thực hiện để thực hiện bất kỳ lớp lệnh nào. Hướng dẫn lấy từ ba
đến năm bước thực hiện. Hai bước đầu tiên độc lập với lớp hướng dẫn. Sau các bước này, một hướng dẫn sẽ mất từ
một đến ba chu kỳ nữa để hoàn thành, tùy thuộc vào lớp hướng dẫn. Các mục trống cho bước truy cập Bộ nhớ hoặc
bước hoàn thành đọc Bộ nhớ cho biết rằng lớp lệnh cụ thể có ít chu kỳ hơn. Trong triển khai nhiều xe đạp, một
hướng dẫn mới sẽ được bắt đầu ngay khi hướng dẫn hiện tại hoàn thành, vì vậy các chu kỳ này không nhàn rỗi hoặc
lãng phí. Như đã đề cập trước đó, tệp đăng ký thực sự đọc mọi chu kỳ, nhưng miễn là IR không thay đổi, các giá trị
được đọc từ tệp đăng ký là giống hệt nhau. Cụ thể, giá trị được đọc vào thanh ghi B trong giai đoạn giải mã lệnh,
đối với lệnh nhánh hoặc kiểu R, giống như giá trị được lưu vào B trong giai đoạn Thực thi và sau đó được sử dụng
trong giai đoạn truy cập Bộ nhớ cho lệnh từ lưu trữ .

Xác định điều khiển


Bây giờ chúng tôi đã xác định tín hiệu điều khiển là gì và khi nào chúng phải
được xác nhận, chúng tôi có thể thực hiện đơn vị điều khiển. Để thiết kế đơn vị
điều khiển cho datapath một chu kỳ, chúng tôi đã sử dụng một tập hợp các bảng
chân lý chỉ định cài đặt tín hiệu điều khiển dựa trên lớp lệnh. Đối với datapath
nhiều bánh, điều khiển phức tạp hơn vì lệnh được thực thi theo một loạt các bước.
Điều khiển cho datapath nhiều bánh phải chỉ định cả hai tín hiệu sẽ được đặt
trong bất kỳ bước nào và bước tiếp theo trong chuỗi.
Mục 4.14 cho thấy cách sử dụng ngôn ngữ thiết kế phần cứng để thiết kế
bộ xử lý hiện đại với các ví dụ về cả datapath đa xe đạp và điều khiển trạng thái
hữu hạn. Trong thiết kế hệ thống kỹ thuật số hiện đại, bước cuối cùng để đưa mô
tả phần cứng vào các cổng thực tế được xử lý bằng các công cụ tổng hợp logic và
datapath. Phụ lục C cho thấy quá trình này hoạt động như thế nào bằng cách
dịch điều khiển đa xe đạp đơn vị để thực hiện phần cứng chi tiết. Các ý tưởng
chính của kiểm soát có thể được nắm bắt từ chương này mà không cần kiểm
tra tài liệu về ngôn ngữ mô tả phần cứng hoặc Phụ lục CTuy nhiên, nếu
bạn muốn thực sự làm một số phần cứng. thiết kế, Phụ lục B có thể cho bạn
thấy những gì các triển khai có khả năng nhìn như ở cấp cổng.
282.e12 4.5 Một triển khai nhiều xe đạp

VÍ DỤ
CPI trong CPU nhiều bánh

Sử dụng hỗn hợp hướng dẫn SpecINT2006 được hiển thị trong Hình 3.24CPI
là gì, giả sử rằng mỗi trạng thái trong CPU đa bánh yêu cầu 1 chu kỳ đồng hồ?

Hỗn hợp này là tải 20%, 8% cửa hàng, 10% chi nhánh và 62% ALU (tất cả phần
TRẢ LỜI còn lại của hỗn hợp, mà chúng tôi giả sử là hướng dẫn ALU). Từ Hình 5.30 trên
trang 329, số chu kỳ đồng hồ cho mỗi lớp lệnh như sau :
■ Tải: 5
■ Cửa hàng: 4
■ Hướng dẫn ALU: 4
■ Chi nhánh: 3

Số lượng hướng dẫnTôi ⋅

CPITôi
--CPU-------------đồng hồ---------------chu kỳ------------
CPI = -- =
Số lượng hướng
dẫn -------------Hướng dẫn-----------------------------đếm-------------------------

Số lượng hướng dẫnTôi


= ------------------------------------------- ⋅ CPITôi
Số lượng hướng dẫn

Tỷ lệ
Số lượng hướng dẫnTôi
-------------------------------------------------- -------
Số lượng hướng dẫn
CPI được đưa ra bởi những điều sau đây :

chỉ đơn giản là tần số hướng dẫn cho lớp hướng dẫn TôiDo đó chúng ta có
thể thay thế để có được.

CPI = 0,20 × 5 + 0,08 × 4 + 0,62 × 4 + 0,10 × 3 = 4.10

CPI này tốt hơn CPI trường hợp xấu nhất là 5.0 khi tất cả các hướng dẫn
đều có cùng số chu kỳ đồng hồ. Tất nhiên, chi phí chung trong cả hai thiết kế
có thể làm giảm hoặc tăng sự khác biệt này. Thiết kế nhiều xe đạp có lẽ cũng
hiệu quả hơn về chi phí, vì nó sử dụng ít thành phần riêng biệt hơn trong
datapath.

Phương pháp chúng tôi sử dụng để chỉ định điều khiển đa xe là a máy trạng thái
hữu hạn Một máy trạng thái hữu hạn bao gồm một tập hợp các trạng thái và hướng
dẫn về cách thay
đổi trạng thái. Các
hướng được xác
định bởi a. chức
năng trạng thái
tiếp theo, mà bản
đồ hiện tại
4.5 Một triển khai nhiều xe đạp 282.e13

nhà nước và các đầu vào cho một nhà nước mới. Khi chúng ta sử dụng máy trạng máy trạng thái hữu
thái hữu hạn để điều khiển, mỗi trạng thái cũng chỉ định một tập hợp các đầu ra hạn A hàm logic tuần tự
được xác nhận khi máy ở trạng thái đó. Việc triển khai máy trạng thái hữu hạn bao gồm một tập hợp các
thường giả định rằng tất cả các đầu ra không được khẳng định rõ ràng đều được đầu vào và đầu ra, hàm
nextstate ánh xạ trạng thái
xác định lại. Tương tự, hoạt động chính xác của datapath phụ thuộc vào thực tế là hiện tại và các đầu vào
một tín hiệu không được xác nhận rõ ràng được xác định lại, thay vì hoạt động sang trạng thái mới và
như một sự chăm sóc don don. Ví dụ: tín hiệu RegWrite chỉ được xác nhận khi hàm đầu ra ánh xạ trạng
ghi mục nhập tệp đăng ký; khi nó không được xác nhận rõ ràng, nó phải được xác thái hiện tại và có thể là
nhận lại. đầu vào cho một tập hợp
Điều khiển ghép kênh hơi khác nhau, vì chúng chọn một trong các đầu vào cho dù các đầu ra được xác nhận.
chúng là 0 hay 1. Do đó, trong máy trạng thái hữu hạn, chúng tôi luôn chỉ định cài
đặt của tất cả các điều khiển ghép kênh mà chúng tôi quan tâm. Khi chúng tôi triển chức năng trạng thái
khai máy trạng thái hữu hạn bằng logic, việc đặt điều khiển thành 0 có thể là mặc tiếp theo A hàm tổ hợp,
định và do đó có thể không yêu cầu bất kỳ cổng nào. Một ví dụ đơn giản về một máy với các đầu vào và trạng
trạng thái hữu hạn xuất hiện trong thái hiện tại, xác định
Phụ lục Bvà nếu bạn không quen thuộc với khái niệm về một cỗ máy trạng trạng thái tiếp theo của
thái hữu hạn , bạn có thể muốn kiểm tra Phụ lục B trước khi tiến hành. máy trạng thái hữu hạn.
Điều khiển trạng thái hữu hạn về cơ bản tương ứng với năm bước thực hiện
được hiển thị trên các trang từ 325 đến 329; mỗi trạng thái trong máy trạng thái
hữu hạn sẽ mất 1 chu kỳ đồng hồ. Máy trạng thái hữu hạn sẽ bao gồm một số bộ
phận. Vì hai bước thực hiện đầu tiên giống hệt nhau cho mọi lệnh, hai trạng thái
ban đầu của máy trạng thái hữu hạn sẽ phổ biến cho tất cả các hướng dẫn. Các
bước 3 đến 5 khác nhau, tùy thuộc vào opcode. Sau khi thực hiện bước cuối cùng
cho một lớp lệnh cụ thể, máy trạng thái hữu hạn sẽ trở về trạng thái ban đầu để
bắt đầu tìm nạp lệnh tiếp theo.
Hình e4.5.7 cho thấy đại diện trừu tượng này của máy trạng thái hữu hạn. Để
điền vào các chi tiết của máy trạng thái hữu hạn, trước tiên chúng tôi sẽ mở rộng
phần tìm nạp và giải mã lệnh, sau đó chúng tôi sẽ hiển thị các trạng thái (và hành
động) cho các lớp lệnh khác nhau.
Chúng tôi chỉ ra hai trạng thái đầu tiên của máy trạng thái hữu hạn Hình
e4.5.8 sử dụng một đại diện đồ họa truyền thống. Chúng tôi đánh số các trạng
thái để đơn giản hóa lời giải thích, mặc dù các con số là tùy ý. Trạng thái 0,
tương ứng với bước 1, là trạng thái bắt đầu của máy.
Các tín hiệu được xác nhận ở mỗi trạng thái được hiển thị trong vòng tròn đại
diện cho trạng thái. Các cung giữa các trạng thái xác định trạng thái tiếp theo và
được gắn nhãn với các điều kiện chọn trạng thái tiếp theo cụ thể khi có thể có
nhiều trạng thái tiếp theo. Sau trạng thái 1, các tín hiệu được xác nhận phụ thuộc
vào lớp lệnh. Do đó, máy trạng thái hữu hạn có bốn cung thoát trạng thái 1, tương
ứng với bốn lớp lệnh: tham chiếu bộ nhớ, loại R, nhánh trên bằng nhau và nhảy.
Quá trình phân nhánh này đến các trạng thái khác nhau tùy thuộc vào hướng dẫn
được gọi giải mã, kể từ khi lựa chọn trạng thái tiếp theo, và do đó các hành động
tiếp theo , phụ thuộc vào lớp hướng dẫn.
Hình e4.5.9 cho thấy phần của máy trạng thái hữu hạn cần thiết để thực hiện các
hướng dẫn tham khảo bộ nhớ. Đối với các hướng dẫn tham chiếu bộ nhớ, trạng thái
đầu tiên sau khi tìm nạp lệnh và các thanh ghi sẽ tính toán địa chỉ bộ nhớ (trạng thái
2). Để tính toán địa chỉ bộ nhớ, bộ ghép kênh đầu vào ALU
282.e14 4.5 Một triển khai nhiều xe đạp

Khởi đầu

Hướng dẫn lấy / giải mã và đăng ký tìm nạp


(Hình e4.5.8)

Truy cập bộ nhớ Hướng dẫn loại R Hướng dẫn chi


hướng dẫn (Hình e4.5.10) nhánh
(Hình e4.5.9) (Hình e4.5.11)

HÌNH e4.5.7 Chế độ xem cấp cao của điều khiển máy trạng thái hữu hạn. Các bước đầu tiên là
độc lập với lớp hướng dẫn; sau đó một loạt các chuỗi phụ thuộc vào opcode lệnh được sử dụng để hoàn
thành mỗi lớp lệnh. Sau khi hoàn thành các hành động cần thiết cho lớp lệnh đó, điều khiển sẽ quay lại để
tìm một hướng dẫn mới. Mỗi hộp trong hình này có thể đại diện cho một đến một số tiểu bang. Các vòng
cung dán nhãn Khởi đầu đánh dấu trạng thái bắt đầu khi hướng dẫn đầu tiên được tìm nạp.
Hướng dẫn lấy
Giải mã hướng dẫn
/
Đăng ký lấy
Ghi nhớ
0 ALUSrcA = 0 1
IorD = 0
Khởi IRWrite ALUSrcA = 0
đầu ALUSrcB = 01 ALUSrcB = 10
ALUOp = 00 ALUOp = 00
PCWrite
Nguồn PC = 0

=
'SW')
)

(Op
hoặc là - loại) 'BEQ'
W ') R =

=
'L

=
(Op
(Op (Op

Tham chiếu bộ nhớ FSM FSM loại R Chi nhánh FSM


(Hình e4.5.9) (Hình e4.5.10) (Hình 4.37)

HÌNH e4.5.8 Phần tìm nạp và giải mã lệnh của mỗi lệnh là giống hệt nhau. Các trạng thái này tương
ứng với hộp trên cùng trong máy trạng thái hữu hạn trừu tượng trong Hình 4.33Ở trạng thái đầu tiên, chúng tôi
khẳng định hai tín hiệu để làm cho bộ nhớ đọc một lệnh và ghi nó vào thanh ghi Hướng dẫn (MemRead và
IRWrite) và chúng tôi đặt IorD thành 0 để chọn PC làm nguồn địa chỉ. Các tín hiệu ALUSrcA, ALUSrcB,
ALUOp, PCWrite và PCSource được đặt để tính toán PC + 4 và lưu trữ nó vào PC. (Nó cũng sẽ được lưu trữ vào
ALUOut, nhưng không bao giờ được sử dụng từ đó. Ở trạng thái tiếp theo. chúng tôi tính toán địa chỉ mục tiêu
chi nhánh bằng cách đặt ALUSrcB thành 11 ,làm cho 16 bit thấp hơn được dịch chuyển và mở rộng bằng dấu
được gửi đến ALU( đặt ALUSrcA thành 0 và ALUOp thành 00) chúng tôi lưu trữ kết quả trong thanh ghi
ALUOut; được viết trên mỗi chu kỳ, Có bốn trạng thái tiếp theo phụ thuộc vào lớp của hướng dẫn, được biết đến
trong trạng thái này. Đầu vào đơn vị điều khiển, được gọi là Op, được sử dụng để xác định cung nào trong số các
cung này sẽ theo sau. Hãy nhớ rằng tất cả các tín hiệu không được khẳng định rõ ràng đều được xác định lại; điều
này đặc biệt quan trọng đối với các tín hiệu điều khiển ghi. Đối với điều khiển ghép kênh, thiếu cài đặt cụ thể cho
biết rằng chúng tôi không quan tâm đến cài đặt của bộ ghép kênh.
4.5 Một triển khai nhiều xe đạp 282.e15

phải được đặt sao cho đầu vào đầu tiên là thanh ghi A, trong khi đầu vào thứ hai
là trường dịch chuyển mở rộng dấu hiệu; kết quả được ghi vào thanh ghi ALUOut.
Sau khi tính toán địa chỉ bộ nhớ, bộ nhớ phải được đọc hoặc ghi; điều này đòi hỏi
hai trạng thái khác nhau. Nếu opcode hướng dẫn là lw , sau đó nêu 3 (tương ứng
với bước Truy cập bộ nhớ) làm bộ nhớ đọc (MemRead được xác nhận). Đầu ra
của bộ nhớ luôn được ghi vào MDR. Nếu nó là sw, trạng thái 5 thực hiện ghi bộ
nhớ (MemWrite được xác nhận). Ở trạng thái 3 và 5, tín hiệu IorD được đặt thành
1 để buộc địa chỉ bộ nhớ đến từ ALU. Sau khi thực hiện một bài viết, hướng dẫn
sw đã hoàn thành thực thi và trạng thái tiếp theo là trạng thái 0. Tuy nhiên, nếu
hướng dẫn là tải, thì cần có trạng thái khác (trạng thái 4) để viết

Từ tiểu bang 1
(Op = 'LW') hoặc (Op =
'SW')

Tính toán địa chỉ bộ nhớ


2
ALUSrcA = 1
ALUSrcB = 10
ALUOp = 00
(Op = 'LW')

Ký ức Ký ức
truy cập truy cập
3 5

Ghi nhớ Ghi nhớ


IorD = 1 IorD = 1

Bộ nhớ đọc bước hoàn thành


4
RegWrite
Để nêu 0
MemtoReg = 1
(Hình e4.5.8)
RegDst = 0

HÌNH e4.5.9 Máy trạng thái hữu hạn để điều khiển hướng dẫn tham chiếu bộ nhớ có bốn
trạng thái. Các trạng thái này tương ứng với hộp có nhãn Hướng dẫn truy cập bộ nhớ của Cameron Hình
e4.5.7Sau khi thực hiện tính toán địa chỉ bộ nhớ, cần có một chuỗi riêng để tải và lưu trữ. Cài đặt tín hiệu
điều khiển ALUSrcA, ALUSrcB và ALUOp được sử dụng để gây ra tính toán địa chỉ bộ nhớ ở trạng thái 2.
Tải yêu cầu một trạng thái bổ sung để ghi kết quả từ MDR (trong đó kết quả được ghi ở trạng thái 3) vào
tệp đăng ký.
282.e16 4.5 Một triển khai nhiều xe đạp

kết quả từ bộ nhớ vào tập tin đăng ký. Đặt các điều khiển ghép kênh MemtoReg
= 1 và RegDst = 0 sẽ gửi giá trị được tải trong MDR để được ghi vào tệp đăng ký.
Sau trạng thái này, tương ứng với bước hoàn thành đọc Bộ nhớ, trạng thái tiếp
theo là trạng thái 0.
Để thực hiện các hướng dẫn loại R yêu cầu hai trạng thái tương ứng với các
bước 3 (Thực hiện) và 4 (hoàn thành loại R). Hình e4.5.10 cho thấy phần hai
trạng thái này của máy trạng thái hữu hạn. Bang 6 khẳng định ALUSrcA và đặt
tín hiệu ALUSrcB thành 00; điều này buộc hai thanh ghi đã được đọc từ tệp
thanh ghi được sử dụng làm đầu vào cho ALU. Đặt ALUOp thành 10 khiến bộ
điều khiển ALU sử dụng trường chức năng để đặt tín hiệu điều khiển ALU. Ở
bang 7, RegWrite được khẳng định là khiến tệp đăng ký ghi, RegDst được khẳng
định là làm cho trường rd được sử dụng làm số đăng ký của điểm đến, và
MemtoReg được phân tích để chọn ALUOut làm nguồn của giá trị để ghi vào tệp
đăng ký.
Đối với các nhánh, chỉ cần một trạng thái bổ sung duy nhất vì chúng hoàn
thành thực thi trong bước thứ ba thực hiện lệnh. Trong trạng thái này, các

Từ tiểu bang 1

(Op = loại R)

Thi hành án
6
ALUSrcA = 1
ALUSrcB = 00
ALUOp = 10

Hoàn thành loại R


7
RegDst = 1
RegWrite
MemtoReg = 0

Để nêu 0
(Hình e4.5.8)

HÌNH e4.5.10 Hướng dẫn loại R có thể được thực hiện với máy hoàn thiện hai trạng thái
đơn giản. Các trạng thái này tương ứng với hộp có nhãn hướng dẫn loại R R Hình e4.5.7. Trạng thái đầu
tiên khiến hoạt động ALU xảy ra, trong khi trạng thái thứ hai làm cho kết quả ALU (trong ALUOut) được
ghi vào tệp đăng ký. Ba tín hiệu được xác nhận trong trạng thái 7 khiến nội dung của ALUOut được ghi
vào tệp đăng ký trong mục được chỉ định bởi trường rd của thanh ghi Hướng dẫn.
4.5 Một triển khai nhiều xe đạp 282.e17

Từ tiểu bang 1

(Op = "BEQ")

Hoàn thành chi nhánh


số 8
ALUSrcA = 1
ALUSrcB = 00
ALUOp = 01
PCWriteCond
Nguồn PC = 1

Để nêu 0
(Hình e4.5.8)

HÌNH e4.5.11 Hướng dẫn nhánh yêu cầu một trạng thái duy nhất. Ba đầu ra đầu tiên mà được
khẳng định khiến ALU so sánh các thanh ghi (ALUSrcA, ALUSrcB và ALUOp), trong khi các tín hiệu
PCSource và PCWriteCond thực hiện ghi có điều kiện nếu điều kiện nhánh là đúng. Lưu ý rằng chúng tôi
không sử dụng giá trị được ghi vào ALUOut; thay vào đó, chúng tôi chỉ sử dụng đầu ra Zero của ALU. Địa
chỉ mục tiêu nhánh được đọc từ ALUOut, nơi nó được lưu ở cuối trạng thái 1.

các tín hiệu điều khiển khiến ALU so sánh nội dung của các thanh ghi A và B phải
được đặt và các tín hiệu khiến PC được viết có điều kiện với địa chỉ trong thanh ghi
ALUOut cũng được đặt. Để thực hiện so sánh, chúng tôi yêu cầu ALUSrcA và đặt
ALUSrcB thành 00 và đặt giá trị ALUOp thành 01 (buộc trừ). (Chúng tôi chỉ sử dụng
đầu ra Zero của ALU, không phải kết quả của phép trừ.) Để kiểm soát việc ghi PC,
chúng tôi khẳng định PCWriteCond và đặt PCSource = 01, điều này sẽ gây ra giá trị
trong thanh ghi ALUOut (có chứa địa chỉ nhánh được tính ở trạng thái 1 , Hình
e4.5.8 trên trang 333) sẽ được ghi vào PC nếu bit Zero ra khỏi ALU được xác nhận.
Hình e4.5.11 cho thấy trạng thái duy nhất này.
Bây giờ chúng ta có thể đặt các phần này của máy trạng thái hữu hạn lại với
nhau để tạo thành một đặc tả cho đơn vị điều khiển, như được hiển thị trong Hình
e4.5.12Ở mỗi trạng thái, các tín hiệu được khẳng định được hiển thị. Trạng thái
tiếp theo phụ thuộc vào các bit opcode của lệnh, vì vậy chúng tôi gắn nhãn cho
các cung với sự so sánh cho các opcodes lệnh tương ứng.
Một máy trạng thái hữu hạn có thể được thực hiện với một thanh ghi tạm thời
giữ trạng thái hiện tại và một khối logic tổ hợp xác định cả tín hiệu datapath sẽ
được xác nhận và trạng thái tiếp theo. Hình 4.39 cho thấy một thực hiện như vậy
có thể nhìn như thế nào. Phụ lục B mô tả chi tiết như thế nào máy trạng thái
hữu hạn được thực hiện bằng cách sử dụng cấu trúc này. Trong Mục B.3,
logic điều khiển tổ hợp cho máy trạng thái hữu hạn của Hình e4.5.12 được
triển khai cả với ROM (bộ nhớ chỉ đọc) và PLA (mảng logic lập trình).
(Cũng thấy Phụ lục A cho một mô tả của các yếu tố logic.) Trong phần tiếp
theo của chương này, chúng tôi xem xét một cách khác để thể hiện sự kiểm
soát. Cả hai kỹ thuật này chỉ đơn giản là các biểu diễn khác nhau của cùng
một thông tin kiểm soát.
282.e18 4.5 Một triển khai nhiều xe đạp

Hướng dẫn lấy Giải mã hướng dẫn


/
đăng ký lấy
Ghi nhớ
0 ALUSrcA = 0 1
IorD = 0
Khởi IRWrite ALUSrcA = 0
đầu ALUSrcB = 01 ALUSrcB = 10
ALUOp = 00 ALUOp = 00
PCWrite
Nguồn PC = 0

'SW')
=

(Op
hoặc là -type)
W ')
'BEQ')

'L
=R =
=

(Op (Op (Op

Địa chỉ bộ nhớ Chi nhánh


tính toán Thi hành án hoàn thành
2 6 số
8
ALUSrcA = 1 ) ALUSrcA = 1 ALUSrcA = 1
ALUSrcB = 10 ALUSrcB = 00 ALUSrcB = 00
W
L

ALUOp = 00 ALUOp = 10 ALUOp = 01


)
'

'

PCWriteCond
(Op Nguồn PC = 1
=

'SW'

=
O
p
(

Ký ức Ký ức
truy cập truy cập
Hoàn thành loại R
3 5 7

Ghi nhớ Ghi nhớ RegDst = 1


IorD = 1 IorD = 1 RegWrite
MemtoReg = 0

Ký ức đọc
bước hoàn thành
4

RegDst = 0
RegWrite
MemtoReg = 1

HÌNH e4.5.12 Tanh ta hoàn thành kiểm soát máy trạng thái hữu hạn cho datapath được
hiển thị trong Hình e4.5.4Các nhãn trên cung là các điều kiện được kiểm tra để xác định trạng thái nào là
trạng thái tiếp theo;. khi trạng thái tiếp theo là vô điều kiện, không có nhãn nào được đưa ra. Các nhãn bên
trong các nút cho biết các tín hiệu đầu ra được khẳng định trong trạng thái đó; chúng tôi luôn chỉ định cài
đặt tín hiệu điều khiển ghép kênh nếu thao tác chính xác yêu cầu. Do đó, ở một số tiểu bang, điều khiển
ghép kênh sẽ được đặt thành 0.
4.5 Một triển khai nhiều xe đạp 282.e19

Kết hợp
kiểm soát logic Đầu ra điều khiển Datapath

Đầu ra

Đầu vào

Tiểu bang tiếp theo


Đầu vào từ hướng Đăng ký nhà
dẫn nước
đăng ký trường
opcode

HÌNH e4.5.13 Bộ điều khiển máy trạng thái hữu hạn thường được triển khai bằng cách sử
dụng một khối logic tổ hợp và một thanh ghi để giữ trạng thái hiện tại. Các đầu ra của tổ hợp
logic là số trạng thái tiếp theo và các tín hiệu điều khiển được xác nhận cho trạng thái hiện tại. Các đầu
vào cho logic tổ hợp là trạng thái hiện tại và bất kỳ đầu vào nào được sử dụng để xác định trạng thái tiếp
theo. Trong trường hợp này, các đầu vào là các bit opcode đăng ký lệnh. Lưu ý rằng trong máy trạng thái
hữu hạn được sử dụng trong chương này, các đầu ra chỉ phụ thuộc vào trạng thái hiện tại, không phụ thuộc
vào đầu vào. Các chi tiết dưới đây giải thích điều này chi tiết hơn..

Pipeling, chủ đề của phần tiếp theo, hầu như luôn được sử dụng để tăng tốc
thực hiện các hướng dẫn. Đối với các hướng dẫn đơn giản, đường ống có khả
năng đạt được tốc độ đồng hồ cao hơn của thiết kế nhiều bánh và CPI một chu kỳ
của thiết kế đồng hồ đơn. Tuy nhiên, trong hầu hết các bộ xử lý đường ống, một
số hướng dẫn mất nhiều thời gian hơn một chu kỳ và yêu cầu điều khiển đa xe
đạp. Hướng dẫn điểm nổi là một ví dụ phổ quát. Có nhiều ví dụ trong kiến trúc
IA-32 yêu cầu sử dụng điều khiển đa xe đạp.

Xây dựng: Phong cách của máy trạng thái hữu hạn trong Hình 4.39 được gọi là
Moore máy, sau Edward Moore. Đặc điểm nhận dạng của nó là đầu ra chỉ phụ thuộc
vào trạng thái hiện tại. Đối với máy Moore, hộp có nhãn logic điều khiển
Combinational có thể được chia thành hai phần. Một mảnh có đầu ra điều khiển và
chỉ đầu vào trạng thái, trong khi mảnh còn lại chỉ có đầu ra trạng thái tiếp theo. Một
phong cách thay thế của máy là một máy Mealy, được đặt theo tên của George
Mealy. Máy Mealy cho phép cả đầu vào và trạng thái hiện tại được sử dụng để xác
định đầu ra. Máy Moore có lợi thế triển khai tiềm năng về tốc độ và kích thước của bộ
điều khiển. Tốc độ
282.e20 4.5 Một triển khai nhiều xe đạp

lợi thế phát sinh vì các đầu ra điều khiển, cần thiết sớm trong chu kỳ đồng hồ, không phụ
thuộc vào đầu vào, mà chỉ phụ thuộc vào trạng thái hiện tại. Trong Phụ lục C, khi nào
việc triển khai máy trạng thái hữu hạn này được đưa xuống cổng logic, lợi thế
kích thước có thể được nhìn thấy rõ. Nhược điểm tiềm năng của máy Moore là
nó có thể yêu cầu các trạng thái bổ sung. Ví dụ: trong các tình huống có sự khác
biệt một trạng thái giữa hai chuỗi trạng thái, máy Mealy có thể thống nhất các
trạng thái bằng cách làm cho các đầu ra phụ thuộc vào đầu vào.

Hiểu hiệu suất Đối với bộ xử lý có tốc độ xung nhịp nhất định, hiệu suất tương đối giữa hai
phân đoạn mã sẽ được xác định bởi sản phẩm của CPI và số lệnh để thực thi
chương trình từng phân đoạn. Như chúng ta đã thấy ở đây, hướng dẫn có thể khác nhau
trong CPI của họ, ngay cả đối với một bộ xử lý đơn giản. Trong hai chương tiếp
theo, chúng ta sẽ thấy rằng việc giới thiệu đường ống và sử dụng bộ nhớ cache
tạo ra cơ hội lớn hơn để thay đổi CPI. Mặc dù nhiều yếu tố ảnh hưởng đến CPI
được kiểm soát bởi nhà thiết kế phần cứng, lập trình viên, trình biên dịch, và hệ
thống phần mềm chỉ ra những hướng dẫn được thực hiện, và chính quá trình
này sẽ xác định CPI hiệu quả cho chương trình sẽ là gì. Các lập trình viên tìm
cách cải thiện hiệu suất phải hiểu vai trò của CPI và các yếu tố ảnh hưởng đến
nó.

Kiểm tra
Bản thân bạn Đúng, sai hoặc có thể: Tín hiệu điều khiển PCWriteCond có thể được
thay thế bằng PCSource.
4.6 Tổng quan về đường ống 283

giáo viên hướng dẫn thấy lợi thế sư phạm để giải thích việc thực hiện nhiều xe
đạp trước khi đường ống, vì vậy chúng tôi bỏ qua tùy chọn triển khai trực tuyến
này.
tải đồ giặt tuần tự mất
gấp 20 lần tải. Nó chỉ
nhanh hơn 2,3 lần
4.6 Tổng quan về đường ống Hình 4.27, bởi vì
chúng tôi
Đường ống là một kỹ thuật thực hiện trong đó có nhiều hướng dẫn chồng chéo
trong thực thi. Hôm nay, đường ống gần như phổ quát.
Phần này phụ thuộc rất nhiều vào một sự tương tự để đưa ra một cái nhìn tổng
quan về các điều khoản và vấn đề đường ống. Nếu bạn quan tâm chỉ là bức tranh lớn,
bạn nên tập trung vào phần này và sau đó bỏ qua Phần 4.11 và 4.12 để xem phần giới
thiệu về các kỹ thuật đường ống tiên tiến được sử dụng trong các bộ xử lý gần đây
như Intel Core i7 và ARM Cortex-A53. Nếu bạn tò mò về việc khám phá giải phẫu
của một máy tính có đường ống, phần này là một giới thiệu tốt Mục 4.7 đến 4.10.
Bất cứ ai đã thực hiện rất nhiều đồ giặt đều sử dụng đường ống trực quan. Các
không đường ống tiếp cận với giặt ủi như sau :
1. Đặt một tải quần áo bẩn trong máy giặt.
2. Khi máy giặt hoàn thành, đặt tải ướt vào máy sấy.
3. Khi máy sấy hoàn thành, đặt tải khô lên bàn và gập lại.
4. Khi gấp xong, yêu cầu bạn cùng phòng của bạn để quần áo đi.
Khi tải này được thực hiện, bắt đầu lại với tải bẩn tiếp theo.
Các đường ống cách tiếp cận mất ít thời gian hơn, như Hình 4.27 chương trình.
Ngay sau khi máy giặt được hoàn thành với tải đầu tiên và được đặt trong máy sấy,
bạn tải máy giặt với tải bẩn thứ hai. Khi tải đầu tiên khô, bạn đặt nó lên bàn để bắt
đầu gấp, di chuyển tải ướt đến máy sấy và đặt tải bẩn tiếp theo vào máy giặt. Tiếp
theo, bạn cùng phòng của bạn đặt tải đầu tiên đi, bạn bắt đầu gấp tải thứ hai, máy sấy
có tải thứ ba và bạn đặt tải thứ tư vào máy giặt. Tại thời điểm này, tất cả các bước
được gọi là giai đoạn trong đường ống dẫn đang hoạt động đồng thời. Miễn là chúng
tôi có các tài nguyên riêng cho từng giai đoạn, chúng tôi có thể điều chỉnh các nhiệm
vụ.
Nghịch lý đường ống là thời gian từ khi đặt một chiếc tất bẩn duy nhất vào
máy giặt cho đến khi nó được sấy khô, gấp lại, và đưa đi không phải là ngắn hơn
cho đường ống; lý do đường ống nhanh hơn cho nhiều tải là mọi thứ đều hoạt
động song song, vì vậy nhiều tải được hoàn thành mỗi giờ. Đường ống cải thiện
thông lượng của hệ thống giặt ủi của chúng tôi. Do đó, đường ống sẽ không giảm
thời gian để hoàn thành một tải đồ giặt, nhưng khi chúng ta có nhiều tải đồ giặt
để làm, việc cải thiện thông lượng sẽ làm giảm tổng thời gian để hoàn thành công
việc.
Nếu tất cả các giai đoạn mất cùng một khoảng thời gian và có đủ việc phải làm,
thì việc tăng tốc do đường ống bằng với số giai đoạn trong đường ống, trong trường
hợp này là bốn: rửa, sấy, gấp, và bỏ đi. Do đó, giặt là có khả năng nhanh hơn bốn lần
so với không được trang bị: 20 tải sẽ mất khoảng năm lần so với một tải, trong khi 20
Không bao giờ lãng phí thời gian.
Tục ngữ Mỹ

đường ống An kỹ thuật thực hiện trong đó nhiều hướng dẫn được chồng chéo trong thực thi, giống
như một dây chuyền lắp ráp.
284 Chương 4 Bộ xử lý

6 giờ 2 giờ
Thời chiều 7 số 8 9 10 11 12 1 sáng
gian
Nhiệm
vụ
đặt
hàng
A

6 giờ 2 giờ
Thời chiều 7 số 8 9 10 11 12 1 sáng
gian

Nhiệm vụ
đặt hàng
A

HÌNH 4.27 Sự tương tự giặt cho đường ống. Ann, Brian, Cathy và Don đều bẩn quần áo được giặt,
sấy khô, gấp lại, và cất đi. Máy giặt, máy sấy, thư mục, máy tính và máy lưu trữ, mỗi người mất 30 phút
cho nhiệm vụ của mình. Giặt tuần tự mất 8 giờ cho bốn lần giặt, trong khi giặt bằng ống chỉ mất 3,5 giờ.
Chúng tôi hiển thị giai đoạn đường ống của các tải khác nhau theo thời gian bằng cách hiển thị các bản sao
của bốn tài nguyên trên dòng thời gian hai chiều này, nhưng chúng tôi thực sự chỉ có một trong mỗi tài
nguyên.

chỉ hiển thị bốn tải. Lưu ý rằng ở đầu và cuối khối lượng công việc trong phiên
bản đường ống trong Hình 4.27, đường ống không hoàn toàn đầy đủ; khởi động
và giảm gió này ảnh hưởng đến hiệu suất khi số lượng nhiệm vụ không lớn so
với số lượng giai đoạn trong đường ống. Nếu số lượng tải lớn hơn bốn, thì các
giai đoạn sẽ đầy hầu hết thời gian và sự gia tăng thông lượng sẽ rất gần với bốn.
Các nguyên tắc tương tự áp dụng cho các bộ xử lý nơi chúng tôi thực hiện
hướng dẫn đường ống. Hướng dẫn RISC-V thực hiện một cách kinh điển năm
bước :
1. Lấy hướng dẫn từ bộ nhớ.
2. Đọc các thanh ghi và giải mã hướng dẫn.
3. Thực hiện các hoạt động hoặc tính toán một địa chỉ.
4. Truy cập một toán hạng trong bộ nhớ dữ liệu (nếu cần).
5. Viết kết quả vào một thanh ghi (nếu cần).
4.6 Tổng quan về đường ống 285

Do đó, đường ống RISC-V mà chúng tôi khám phá trong chương này có năm
giai đoạn. Ví dụ sau đây cho thấy đường ống tăng tốc thực hiện hướng dẫn giống
như nó tăng tốc độ giặt.

Hiệu suất một chu kỳ so với đường ống


VÍ DỤ
Để làm cho cuộc thảo luận này cụ thể, hãy để Lừa tạo ra một đường ống.
Trong ví dụ này và trong phần còn lại của chương này, chúng tôi giới hạn sự
chú ý của chúng tôi trong bảy hướng dẫn: tải từ (lw), lưu trữ từ (sw), thêm
(thêm), trừ (phụ), VÀ (và), HOẶC LÀ (hoặc là) và chi nhánh nếu bằng (beq).
Tương phản thời gian trung bình giữa các hướng dẫn thực hiện một chu
kỳ, trong đó tất cả các hướng dẫn đều thực hiện một chu kỳ đồng hồ, để thực
hiện đường ống. Giả sử rằng thời gian hoạt động của các đơn vị chức năng
chính trong ví dụ này là 200 ps để truy cập bộ nhớ cho các hướng dẫn hoặc
dữ liệu, 200 ps cho hoạt động ALU và 100 ps cho đọc hoặc ghi tệp đăng ký.
Trong mô hình chu kỳ đơn, mọi lệnh đều có chính xác một chu kỳ đồng hồ,
do đó chu trình đồng hồ phải được kéo dài để phù hợp với hướng dẫn chậm
nhất.

Hình 4.28 hiển thị thời gian cần thiết cho mỗi trong bảy hướng dẫn. Các thiết TRẢ LỜI
kế một chu kỳ phải cho phép hướng dẫn chậm nhất trong Hình 4.28 nó là
lwThời gian cần thiết cho mỗi hướng dẫn là 800 ps. Tương tự như vậy Hình
4.27, Hình 4.29 so sánh thực hiện không đường ống và đường ống của ba
hướng dẫn đăng ký tải. Do đó, thời gian giữa các hướng dẫn thứ nhất và thứ
tư trong thiết kế không đường ống là 3 × 800 ps hoặc 2400 ps.
Tất cả các giai đoạn đường ống có một chu kỳ đồng hồ duy nhất, vì vậy chu
kỳ đồng hồ phải đủ dài để phù hợp với hoạt động chậm nhất. Giống như thiết kế
chu kỳ đơn phải có chu kỳ đồng hồ có vỏ xấu nhất là 800 ps, mặc dù một số
hướng dẫn có thể nhanh tới 500 ps, chu trình đồng hồ thực hiện được điều khiển
phải có chu kỳ đồng hồ có vỏ xấu nhất là 200 ps, mặc dù một số giai đoạn chỉ
mất 100 ps. Pipeling vẫn cung cấp một cải tiến hiệu suất gấp bốn lần: thời gian
giữa các hướng dẫn thứ nhất và thứ tư là 3 × 200 ps hoặc 600 ps.

HÌNH 4.28 Tổng thời gian cho mỗi hướng dẫn được tính từ thời gian cho từng thành phần.
Tính toán này giả định rằng bộ ghép kênh, bộ điều khiển, truy cập PC và đơn vị mở rộng dấu hiệu không
có độ trễ.
286 Chương 4 Bộ xử lý

Chương
trình
Thời
thi công gian 200 400 600 800 1000 1200 1400 1600 1800
đặt hàng
(theo hướng dẫn)
Hướng dẫn Reg ALU Dữ liệu Reg
lw x1, 100 (x4)
lấy truy cập
800 ps Hướng dẫn Reg ALU Dữ liệu Reg
lw x2, 200 (x4)
lấy truy cập
Hướng dẫn
lw x3, 400 (x4)
800 ps lấy

800 ps

Chương trình
thi công Thời 200 400 600 800 1000 1200 1400
gian
đặt hàng
(theo hướng dẫn)
Hướng dẫn Dữ liệu
lw x1, 100 (x4) Reg ALU Reg
lấy truy cập

lw x2, 200 (x4) Hướng dẫn Dữ liệu


200 ps lấy Reg ALU truy cập Reg

lw x3, 400 (x4) Hướng


dẫn Dữ liệu
200 ps lấy Reg ALU truy cập Reg

200 ps 200 ps 200 ps 200 ps 200 ps

HÌNH 4.29 Thực hiện một chu kỳ, không đường ống (trên cùng) so với thực thi đường ống
(dưới cùng). Cả hai đều sử dụng các thành phần phần cứng giống nhau, có thời gian được liệt kê Hình
4.28Trong trường hợp này, chúng tôi thấy. tăng tốc gấp bốn lần thời gian trung bình giữa các hướng dẫn, từ
800 ps xuống còn 200 ps. So sánh con số này với Hình 4.27Đối với giặt ủi, chúng tôi giả định tất cả các giai
đoạn là bằng nhau. Nếu máy sấy chậm nhất, thì giai đoạn máy sấy. sẽ thiết lập thời gian sân khấu. Thời gian
giai đoạn đường ống của máy tính cũng bị giới hạn bởi tài nguyên chậm nhất, hoặc hoạt động ALU hoặc truy
cập bộ nhớ. Chúng tôi giả sử việc ghi vào tệp đăng ký xảy ra trong nửa đầu của chu kỳ đồng hồ và việc đọc từ
tệp đăng ký xảy ra trong nửa sau. Chúng tôi sử dụng giả định này trong suốt chương này.

Chúng ta có thể biến cuộc thảo luận tăng tốc đường ống ở trên thành một công
thức. Nếu các giai đoạn được cân bằng hoàn hảo, thì thời gian giữa các hướng
dẫn trên bộ xử lý đường ống, giả sử điều kiện lý tưởng là bằng nhau
Thời gian giữa các hướng
Thời gian giữa các hướng dẫnđường ống =

dẫn
không đường ống Số lượng

đường ống

Trong điều kiện lý tưởng và với một số lượng lớn các hướng dẫn, tốc độ tăng
từ đường ống xấp xỉ bằng số giai đoạn đường ống; một đường ống năm tầng
nhanh hơn gần năm lần.
Công thức cho thấy rằng một đường ống năm giai đoạn sẽ cung cấp sự cải thiện
gần gấp năm lần so với thời gian không được trang bị 800 ps hoặc chu kỳ đồng hồ
160 ps. Ví dụ cho thấy, tuy nhiên, các giai đoạn có thể được cân bằng không hoàn
hảo. Hơn nữa, đường ống liên quan đến một số chi phí, nguồn gốc sẽ sớm rõ ràng
hơn.
4.6 Tổng quan về đường ống 287

Do đó, thời gian cho mỗi hướng dẫn trong bộ xử lý đường ống sẽ vượt quá mức
tối thiểu có thể và tốc độ tăng sẽ nhỏ hơn số giai đoạn đường ống.
Tuy nhiên, ngay cả yêu cầu cải tiến gấp bốn lần của chúng tôi đối với ví dụ của
chúng tôi cũng không được phản ánh trong tổng thời gian thực hiện cho ba hướng
dẫn: nó 1400 ps so với 2400 ps. Tất nhiên, điều này là do số lượng hướng dẫn không
lớn. Điều gì sẽ xảy ra nếu chúng tôi tăng số lượng hướng dẫn? Chúng tôi có thể mở
rộng các số liệu trước đó lên 1.000.003 hướng dẫn. Chúng tôi sẽ thêm 1.000.000
hướng dẫn trong ví dụ đường ống; mỗi hướng dẫn thêm 200 ps vào tổng thời gian
thực hiện. Tổng thời gian thực hiện sẽ là 1.000.000 × 200 ps + 1400 ps, hoặc
200.001.400 ps. Trong ví dụ không được cung cấp, chúng tôi sẽ thêm 1.000.000
hướng dẫn, mỗi hướng dẫn 800 ps, vì vậy tổng thời gian thực hiện sẽ là 1.000.000 ×
800 ps + 2400 ps, hoặc 800.002.400 ps. Trong các điều kiện này, tỷ lệ tổng thời gian
thực hiện cho các chương trình thực trên bộ xử lý không được xử lý cho đường ống
gần với tỷ lệ thời gian giữa các hướng dẫn :

800.002, 400 ps 800 ps


4,00
200.001, 400 ps 200 ps

Đường ống cải thiện hiệu suất bằng cách tăng thông lượng hướng dẫn, trong
tương phản với việc giảm thời gian thực hiện của một hướng dẫn riêng lẻ, nhưng
hướng dẫn thông lượng là số liệu quan trọng vì các chương trình thực thực hiện
hàng tỷ hướng dẫn.

Thiết kế bộ hướng dẫn cho đường ống


Ngay cả với lời giải thích đơn giản về đường ống này, chúng ta có thể hiểu rõ hơn về
thiết kế của bộ hướng dẫn RISC-V, được thiết kế để thực hiện đường ống.
Đầu tiên, tất cả các hướng dẫn RISC-V đều có cùng độ dài. Hạn chế này giúp
dễ dàng lấy các hướng dẫn trong giai đoạn đường ống đầu tiên và giải mã chúng
trong giai đoạn thứ hai. Trong một tập lệnh như x86, trong đó các hướng dẫn thay
đổi từ 1 byte đến 15 byte, việc đặt ống là thử thách đáng kể hơn. Việc triển khai
hiện đại của kiến trúc x86 thực sự chuyển các hướng dẫn x86 thành các thao tác
đơn giản trông giống như hướng dẫn RISC-V và sau đó đưa ra các thao tác đơn
giản thay vì hướng dẫn x86 gốc! (Xem Mục 4.11).
Thứ hai, RISC-V chỉ có một vài định dạng hướng dẫn, với các trường đăng ký
nguồn và đích được đặt ở cùng một vị trí trong mỗi hướng dẫn.
Thứ ba, toán hạng bộ nhớ chỉ xuất hiện trong tải hoặc lưu trữ trong RISC-V. Hạn
chế này có nghĩa là chúng ta có thể sử dụng giai đoạn thực thi để tính địa chỉ bộ nhớ
và sau đó truy cập bộ nhớ trong giai đoạn sau. Nếu chúng ta có thể hoạt động trên các
toán hạng trong bộ nhớ, như trong x86, giai đoạn 3 và 4 sẽ mở rộng sang giai đoạn địa
chỉ, giai đoạn bộ nhớ và sau đó thực hiện giai đoạn. Chúng tôi sẽ sớm thấy nhược
điểm của đường ống dài hơn.

Đường ống nguy hiểm


Có các tình huống trong đường ống khi lệnh tiếp theo không thể thực hiện trong
chu kỳ đồng hồ sau. Những sự kiện này được gọi mối nguy hiểmvà có ba loại
khác nhau.
288 Chương 4 Bộ xử lý

Nguy cơ cấu trúc


nguy cơ cấu trúc Khi Mối nguy hiểm đầu tiên được gọi là a nguy cơ cấu trúcĐiều đó có nghĩa là phần
nào một lệnh được lên kế
cứng không thể hỗ trợ kết hợp các hướng dẫn mà chúng tôi muốn thực hiện trong
hoạch không thể thực thi
trong chu kỳ đồng hồ thích cùng một chu kỳ đồng hồ. Một mối nguy hiểm về cấu trúc trong phòng giặt ủi sẽ
hợp vì phần cứng không hỗ xảy ra nếu chúng ta sử dụng kết hợp máy giặt-máy sấy thay vì máy giặt và máy
trợ kết hợp các lệnh được sấy riêng, hoặc nếu bạn cùng phòng của chúng ta bận làm việc khác và sẽ bỏ
đặt để thực thi. quần áo đi. Kế hoạch đường ống được lên lịch cẩn thận của chúng tôi sau đó sẽ
bị thất bại.
Như chúng tôi đã nói ở trên, bộ hướng dẫn RISC-V được thiết kế để được thiết
kế, giúp các nhà thiết kế dễ dàng tránh các mối nguy về cấu trúc khi thiết kế
đường ống. Tuy nhiên, giả sử rằng chúng ta có một ký ức duy nhất thay vì hai ký
ức. Nếu đường ống vào Hình 4.29 có một hướng dẫn thứ tư, chúng ta sẽ thấy
rằng trong cùng một chu kỳ đồng hồ, hướng dẫn đầu tiên là truy cập dữ liệu từ bộ
nhớ trong khi hướng dẫn thứ tư đang tìm nạp một lệnh từ cùng bộ nhớ đó. Không
có hai ký ức, đường ống của chúng tôi có thể có một mối nguy hiểm về cấu trúc.
nguy hiểm dữ liệu
Cũng thế gọi là a dữ Nguy cơ dữ liệu
liệu đường ống Nguy hiểm dữ liệu xảy ra khi đường ống phải bị đình trệ vì một bước phải chờ
nguy hiểmKhi một kế để người khác hoàn thành. Giả sử bạn tìm thấy một chiếc tất ở trạm gấp mà
hoạch. lệnh không thể
không có trận đấu nào tồn tại. Một chiến lược có thể là chạy xuống phòng của
thực thi trong chu kỳ
đồng hồ thích hợp vì dữ bạn và tìm kiếm thông qua văn phòng quần áo của bạn để xem bạn có thể tìm
liệu cần thiết để thực thấy trận đấu không. Rõ ràng, trong khi bạn đang thực hiện tìm kiếm, tải đã hoàn
hiện lệnh chưa có sẵn. thành sấy khô đã sẵn sàng để gấp và những người đã giặt xong đã sẵn sàng để
khô.
Trong một đường ống máy tính, các mối nguy dữ liệu phát sinh từ sự phụ thuộc
của một hướng dẫn vào hướng dẫn trước đó vẫn còn trong đường ống (một mối quan
hệ không thực sự tồn tại khi giặt giũ). Ví dụ: giả sử chúng ta có một lệnh thêm theo
sau ngay lập tức bằng một lệnh trừ sử dụng tổng đó (x19):
thêm x19, x0, x1
phụ x2 , x19, x3

chuyển tiếp Cũng được Nếu không có sự can thiệp, một mối nguy dữ liệu có thể làm trì hoãn nghiêm
gọi bỏ quaMột phương trọng đường ống. Hướng dẫn thêm không viết kết quả của nó cho đến giai đoạn
pháp. giải quyết mối thứ năm, có nghĩa là chúng ta sẽ phải lãng phí ba chu kỳ đồng hồ trong đường ống.
nguy dữ liệu bằng cách Mặc dù chúng tôi có thể cố gắng dựa vào trình biên dịch để loại bỏ tất cả các
truy xuất phần tử dữ liệu
mối nguy hiểm như vậy, nhưng kết quả sẽ không thỏa đáng. Những sự phụ thuộc
bị thiếu từ bộ đệm bên
trong thay vì chờ nó đến này xảy ra quá thường xuyên và sự chậm trễ là quá dài để mong đợi trình biên
từ các thanh ghi hoặc bộ dịch giải cứu chúng ta khỏi tình trạng khó xử này.
nhớ hiển thị của lập trình Giải pháp chính dựa trên quan sát rằng chúng tôi không cần phải chờ hướng
viên. dẫn hoàn thành trước khi cố gắng giải quyết nguy cơ dữ liệu. Đối với chuỗi mã ở
trên, ngay khi ALU tạo tổng cho phần bổ sung, chúng tôi có thể cung cấp nó làm
đầu vào cho phần trừ. Thêm phần cứng bổ sung để lấy mục còn thiếu sớm từ tài
nguyên nội bộ được gọi chuyển tiếp hoặc là
bỏ qua.
4.6 Tổng quan về đường ống 289

Chuyển tiếp với hai hướng dẫn


VÍ DỤ
Đối với hai hướng dẫn ở trên, hãy chỉ ra các giai đoạn đường ống sẽ được
kết nối bằng cách chuyển tiếp. Sử dụng bản vẽ trong Hình 4.30 để đại diện
cho datapath trong năm giai đoạn của đường ống. Căn chỉnh một bản sao của
datapath cho mỗi hướng dẫn, tương tự như đường ống giặt trong Hình 4.27.
Hình 4.31 hiển thị kết nối để chuyển tiếp giá trị trong x1 sau khi giai đoạn
thực hiện của thêm hướng dẫn làm đầu vào cho giai đoạn thực hiện của phụ TRẢ LỜI
chỉ dẫn.

Trong biểu diễn đồ họa này của các sự kiện, các đường dẫn chuyển tiếp chỉ có
giá trị nếu giai đoạn đích muộn hơn giai đoạn nguồn. Ví dụ: không thể có một
đường dẫn chuyển tiếp hợp lệ từ đầu ra của giai đoạn truy cập bộ nhớ trong
hướng dẫn đầu tiên đến đầu vào của giai đoạn thực hiện sau, vì điều đó có nghĩa
là đi ngược thời gian.
Chuyển tiếp hoạt động rất tốt và được mô tả chi tiết trong Mục 4.8 Nó không nguy hiểm dữ liệu sử
thể ngăn chặn tất cả các quầy hàng đường ống, tuy nhiên. Ví dụ, giả sử hướng dẫn dụng tải Một dạng
đầu tiên là tải. x1 thay vì một bổ sung. Như chúng ta có thể tưởng tượng từ việc nguy hiểm dữ liệu cụ
nhìn vào Hình 4.31, dữ liệu mong muốn sẽ chỉ có sẵn sau giai đoạn thứ tư của thể trong đó dữ liệu
hướng dẫn đầu tiên trong sự phụ thuộc, quá muộn cho đầu vào của giai đoạn thứ được tải bởi một lệnh tải
chưa có sẵn khi chúng
ba phụ Do đó, ngay cả khi chuyển tiếp, chúng ta sẽ phải trì hoãn một giai đoạn cho cần theo một hướng dẫn
a. nguy hiểm dữ liệu sử dụng tải, như Hình 4.32 chương trình. Con số này cho khác.
thấy một khái niệm đường ống quan trọng, chính thức được gọi là a gian hàng
đường ống, nhưng thường được đặt biệt danh bong bóng Chúng ta sẽ thấy các
quầy hàng ở nơi khác trong đường ống. Mục 4.8 cho thấy cách chúng ta có thể xử gian hàng đường ống
lý các trường hợp cứng như thế này, bằng cách sử dụng phát hiện phần cứng và Cũng được gọi bong
quầy hàng hoặc phần mềm sắp xếp lại mã để cố gắng tránh các quầy hàng đường bóngMột gian hàng bắt
đầu. để giải quyết một
ống sử dụng tải, như ví dụ này minh họa. mối nguy hiểm.

Thời 200 400 600 800 1000


gian

THÀ
NẾ NH
thêm x1, x2, x3 U TÔI EX VIÊN WB

HÌNH 4.30 Biểu diễn đồ họa của đường ống dẫn, có tinh thần tương tự như đường ống giặt
Hình 4.27.Ở đây chúng tôi sử dụng các biểu tượng đại diện cho các tài nguyên vật lý với các chữ viết tắt
cho các giai đoạn đường ống được sử dụng trong suốt chương. Các biểu tượng cho năm giai đoạn : NẾU cho
giai đoạn tìm nạp hướng dẫn, với hộp biểu thị bộ nhớ lệnh; TÔI cho giai đoạn đọc tập tin giải mã / đăng ký
hướng dẫn, với bản vẽ hiển thị tập tin đăng ký đang đọc; EX cho giai đoạn thực hiện, với bản vẽ đại diện cho
ALU; THÀNH VIÊN cho giai đoạn truy cập bộ nhớ, với hộp đại diện cho bộ nhớ dữ liệu; và WB cho giai
đoạn ghi lại, với bản vẽ hiển thị tệp đăng ký được viết. Bóng cho biết phần tử được sử dụng bởi hướng dẫn.
Do đó, MEM có nền trắng vì add không truy cập vào bộ nhớ dữ liệu. Tạo bóng ở nửa bên phải của tệp đăng
ký hoặc bộ nhớ có nghĩa là phần tử được đọc trong giai đoạn đó và tô bóng của nửa bên trái có nghĩa là nó
được viết trong giai đoạn đó. Do đó, nửa bên phải của ID được tô bóng trong giai đoạn thứ hai vì tệp đăng
ký được đọc và nửa bên trái của WB được tô bóng ở giai đoạn thứ năm vì tệp đăng ký được ghi.
290 Chương 4 Bộ xử lý

Chương trình
thi công Thời
200 400 600 800 1000
đặt hàng gian
(theo hướng
dẫn)
THÀ
NẾ NH
thêm x1, x2, x3 U TÔI EX VIÊN WB

THÀ
NẾ NH
phụ x4 , x1, x5 U TÔI EX VIÊN WB

HÌNH 4.31 Biểu diễn đồ họa của chuyển tiếp. Kết nối cho thấy đường dẫn chuyển tiếp từ đầu ra
của giai đoạn EX của thêm vào đầu vào của giai đoạn EX cho phụ, thay thế giá trị từ thanh ghi x1 đọc
trong giai đoạn thứ hai của phụ.

Chương trình
thi công
Thời 200 400 600 800 1000 1200 1400
đặt hàng gian
(theo hướng dẫn)
THÀN
lw x1, 0 H
(x2) NẾU TÔI EX VIÊN WB

bong bong bong bong bong


bóng bóng bóng bóng bóng

THÀNH
phụ x4 , x1, x5 NẾU TÔI EX VIÊN WB

HÌNH 4.32 Chúng ta cần một gian hàng ngay cả khi chuyển tiếp khi một lệnh định dạng R
theo tải cố gắng sử dụng dữ liệu. Không có gian hàng, đường dẫn từ đầu ra giai đoạn truy cập bộ nhớ
đến thực thi đầu vào giai đoạn sẽ đi ngược thời gian, điều này là không thể. Con số này thực sự là một sự
đơn giản hóa, vì chúng ta không thể biết cho đến khi hướng dẫn trừ được tìm nạp và giải mã cho dù một
VÍ DỤ gian hàng có cần thiết hay không. Mục 4.7 cho thấy các chi tiết của những gì thực sự xảy ra trong trường
hợp nguy hiểm.

Sắp xếp lại mã để tránh các quầy hàng đường ống

Hãy xem xét phân đoạn mã sau trong C :

a = b + e;
c = b + f;

Dưới đây
là mã RISC-
V được tạo
cho phân
đoạn này, giả
sử tất cả các
biến đều nằm
trong bộ nhớ
và có thể
được xác
định là các bù
đắp từ đó x31:
4.6 Tổng quan về đường ống 291

lw x1, 0 (x31) // Tải b


lw x2, 8 (x31) // Tải e
thêm x3, x1, x2 // b + e
sw x3, 24 (x31) // Lưu trữ a
ld x4, 16 (x31) // Tải f
thêm x5, x1, x4 // b + f
sw x5, 32 (x31) // Lưu trữ c

Tìm các mối nguy hiểm trong phân đoạn mã trước và sắp xếp lại các hướng
dẫn để tránh bất kỳ quầy hàng đường ống nào.

Cả hai thêm hướng dẫn có một mối nguy hiểm vì sự phụ thuộc tương ứng của
họ vào trước đó lw chỉ dẫn. Lưu ý rằng chuyển tiếp loại bỏ một số mối nguy TRẢ LỜI
tiềm ẩn khác, bao gồm cả sự phụ thuộc của đầu tiên thêm trên đầu tiên lw và
bất kỳ mối nguy hiểm cho hướng dẫn cửa hàng. Di chuyển lên thứ ba lw chỉ
dẫn để trở thành hướng dẫn thứ ba loại bỏ cả hai mối nguy hiểm :
lw x1, 0 (x31)
lw x2, 4 (x31)
lw x4, 8 (x31)
thêm x3, x1, x2
sw x3, 12 (x31)
thêm x5, x1, x4
sw x5, 16 (x31)

Trên bộ xử lý đường ống có chuyển tiếp, trình tự sắp xếp lại sẽ hoàn thành
trong hai chu kỳ ít hơn so với phiên bản gốc.

Chuyển tiếp mang lại một cái nhìn sâu sắc khác về kiến trúc RISC-V, ngoài ba
đề cập ở trang 287. Mỗi hướng dẫn RISC-V viết nhiều nhất một kết quả và thực
hiện điều này trong giai đoạn cuối của đường ống. Chuyển tiếp khó hơn nếu có
nhiều kết quả để chuyển tiếp cho mỗi hướng dẫn hoặc nếu có nhu cầu viết kết
quả sớm trong thực hiện hướng dẫn.

Xây dựng: Tên chuyển tiếp xuất phát từ ý tưởng rằng kết quả được thông qua
chuyển tiếp từ một hướng dẫn trước đó đến một hướng dẫn sau. Vượt qua đến từ
việc chuyển kết quả xung quanh tệp đăng ký đến đơn vị mong muốn.
kiểm soát nguy cơ Cũng
thế gọi nguy hiểm chi
Kiểm soát các mối nguy hiểm nhánhKhi hướng dẫn
Loại nguy hiểm thứ ba được gọi là a kiểm soát nguy cơ, phát sinh từ nhu cầu đưa ra thích hợp không thể thực
hiện trong chu trình đồng
quyết định dựa trên kết quả của một hướng dẫn trong khi những người khác đang
hồ đường ống thích hợp vì
thực hiện. hướng dẫn đã được tìm
Giả sử đội giặt ủi của chúng tôi được giao nhiệm vụ hạnh phúc là làm sạch đồng nạp không phải là hướng
phục của một đội bóng đá. Cho biết đồ giặt bẩn như thế nào, chúng ta cần xác định dẫn cần thiết; nghĩa là,
xem liệu chất tẩy rửa và nhiệt độ nước mà chúng ta chọn có đủ mạnh để làm sạch luồng địa chỉ lệnh không
phải là những gì đường
đồng phục hay không nhưng không mạnh đến mức đồng phục bị mòn sớm hơn.
ống mong đợi.
Trong giặt ủi của chúng tôi
292 Chương 4 Bộ xử lý

đường ống, chúng ta phải đợi đến giai đoạn thứ hai để kiểm tra đồng phục khô để
xem liệu chúng ta có cần thay đổi thiết lập máy giặt hay không. Phải làm gì?
Đây là giải pháp đầu tiên trong hai giải pháp để kiểm soát các mối nguy hiểm
trong phòng giặt ủi và máy tính tương đương.
Gian hàng: Chỉ cần hoạt động tuần tự cho đến khi đợt đầu tiên khô và sau đó
lặp lại cho đến khi bạn có công thức đúng.
Tùy chọn bảo thủ này chắc chắn hoạt động, nhưng nó chậm.
Nhiệm vụ quyết định tương đương trong máy tính là hướng dẫn nhánh có điều
kiện. Lưu ý rằng chúng ta phải bắt đầu tìm nạp hướng dẫn theo nhánh trên chu kỳ
đồng hồ sau. Tuy nhiên, đường ống không thể biết hướng dẫn tiếp theo nên là gì,
vì nó chỉ nhận được hướng dẫn nhánh từ bộ nhớ! Cũng giống như với giặt ủi,
một giải pháp khả thi là dừng ngay sau khi chúng tôi lấy một nhánh, đợi cho đến
khi đường ống xác định kết quả của nhánh và biết địa chỉ hướng dẫn nào cần lấy
từ đó.
Hãy giả sử rằng chúng tôi đặt đủ phần cứng bổ sung để chúng tôi có thể kiểm tra
một thanh ghi, tính toán địa chỉ chi nhánh và cập nhật PC trong giai đoạn thứ hai của
đường ống (xem Mục 4.9 để biết chi tiết). Ngay cả với phần cứng được thêm vào này,
đường ống liên quan đến các nhánh có điều kiện sẽ trông như thế nào Hình
4.33Hướng dẫn được thực thi nếu nhánh bị đình trệ thêm một chu kỳ đồng hồ 200 ps
trước khi bắt đầu.

VÍ DỤ

Hiệu suất của gian hàng trên nhánh nhánh

Ước tính tác động đến chu kỳ đồng hồ trên mỗi hướng dẫn (CPI) của việc
đình trệ trên các chi nhánh. Giả sử tất cả các hướng dẫn khác có CPI là 1.

Chương
trình
thi công Thời 200 400 600 800 1000 1200 1400
gian
đặt hàng
(theo hướng dẫn)
Hướng
thêm x4, x5, dẫn Dữ liệu
x6 lấy
Reg ALU
truy cập
Reg
Hướng
beq x1, x0, 40 dẫn Dữ liệu
Reg ALU Reg
lấy truy cập
200 ps
bong bóng bong bóng bong bong
bong bóng bóng bóng
hoặc x7, x8,
Hướng dẫn Dữ liệu
x9 Reg ALU Reg
400 ps lấy truy cập

HÌNH 4.33 Đường ống cho thấy sự đình trệ trên mọi nhánh có điều kiện là giải pháp để
kiểm soát các mối nguy hiểm. Ví dụ này giả định nhánh có điều kiện được thực hiện và hướng dẫn tại
đích đến nhánh là hoặc hướng dẫn. Có một gian hàng đường ống một giai đoạn, hoặc bong bóng, sau chi
nhánh. Trong thực tế, quá trình tạo ra một gian hàng phức tạp hơn một chút, như chúng ta sẽ thấy Mục
4.9Tuy nhiên, ảnh hưởng đến hiệu suất cũng giống như xảy ra nếu một bong bóng được chèn vào.
4.6 Tổng quan về đường ống 293

Hình 3.22 trong Chương 3 chương trình các nhánh có điều kiện là 10% của
hướng dẫn thực hiện trong Specint2006. Vì các hướng dẫn khác chạy có a TRẢ LỜI CPI là 1
và các nhánh có điều kiện đã lấy thêm một chu kỳ đồng hồ cho gian hàng, sau đó chúng ta sẽ thấy
CPI là 1,10 và do đó làm chậm 1,10 so với trường hợp lý tưởng.
Nếu chúng ta không thể giải quyết nhánh trong giai đoạn thứ hai, như thường lệ
đối với các đường ống dài hơn, thì chúng ta sẽ thấy sự chậm lại thậm chí còn lớn hơn
nếu chúng ta bị đình trệ trên các nhánh có điều kiện. Chi phí của tùy chọn này quá
cao đối với hầu hết các máy tính sử dụng và thúc đẩy giải pháp thứ hai cho nguy cơ
kiểm soát bằng cách sử dụng một trong những ý tưởng tuyệt vời của chúng tôi
Chương 1 :
Dự đoán: Nếu bạn chắc chắn rằng bạn có công thức phù hợp để giặt đồng phục, thì chỉ
cần dự đoán rằng nó sẽ hoạt động và rửa tải thứ hai trong khi chờ tải đầu tiên khô.
Tùy chọn này không làm chậm đường ống khi bạn đúng. Tuy nhiên, khi bạn
sai, bạn cần làm lại tải đã được rửa trong khi đoán quyết định.
Máy tính thực sự sử dụng dự đoán để xử lý các nhánh có điều kiện. Một cách
tiếp cận đơn giản là luôn dự đoán rằng các nhánh có điều kiện sẽ không được
thực hiện. Khi bạn đúng, đường ống tiến hành ở tốc độ tối đa. Chỉ khi các nhánh
có điều kiện được thực hiện thì gian hàng đường ống. Hình 4.34 cho thấy một ví
dụ như vậy :
Chương
trình
thi công Thời 200 400 600 800 1000 1200 1400
gian
đặt hàng
(theo hướng dẫn)
Hướng dẫn Dữ liệu
thêm x4, x5, Reg ALU Reg
lấy truy cập
x6
Hướng
dẫn Dữ liệu
beq x1, x0, 40 Reg ALU Reg
lấy truy cập
200 ps
Hướng dẫn Dữ liệu
lw x3, 400 (x0) Reg ALU Reg
200 ps lấy truy cập

Chương
trình
thi công Thời 200 400 600 800 1000 1200 1400
gian
đặt hàng
(theo hướng dẫn)
Hướng dẫn Dữ liệu
Reg ALU Reg
thêm x4, x5, x6 lấy truy cập
Hướng
dẫn Dữ liệu
beq x1, x0, 40 Reg ALU Reg
200 ps lấy truy cập
bong bóng bong bóng bong bóng bong
bóng bong bóng
hoặc x7, x8, x9
Hướng dẫn Dữ liệu
Reg ALU Reg
400 ps lấy truy cập
HÌNH 4.34 Dự đoán rằng các nhánh không được coi là một giải pháp để kiểm soát nguy cơ. Các
bản vẽ trên cùng cho thấy đường ống khi chi nhánh không được thực hiện. Bản vẽ dưới cùng cho thấy đường ống
khi nhánh được lấy. Như chúng tôi đã lưu ý Hình 4.33, việc chèn bong bóng theo kiểu này giúp đơn giản hóa
những gì thực sự xảy ra, ít nhất là trong chu kỳ đồng hồ đầu tiên ngay sau nhánh. Mục 4.9 sẽ tiết lộ các chi tiết.
294 Chương 4 Bộ xử lý

dự đoán chi nhánh Một phiên bản tinh vi hơn của dự đoán chi nhánh sẽ có một số nhánh có điều
Một phương pháp giải kiện được dự đoán là đã lấy và một số chưa được thực hiện. Theo cách tương tự
quyết mối nguy hiểm chi của chúng tôi, đồng phục tối hoặc đồng phục gia đình có thể có một công thức
nhánh giả định một kết trong khi đồng phục ánh sáng hoặc đường có thể mất một công thức khác. Trong
quả nhất định cho chi
nhánh có điều kiện và
trường hợp lập trình, ở dưới cùng của các vòng lặp là các nhánh có điều kiện
tiến hành từ giả định đó phân nhánh trở lại đầu vòng lặp. Vì chúng có khả năng được lấy và chúng phân
thay vì chờ đợi để xác nhánh ngược, chúng tôi luôn có thể dự đoán được các nhánh có điều kiện phân
định kết quả thực tế. nhánh đến một địa chỉ trước đó.
Các cách tiếp cận cứng nhắc như vậy để dự đoán chi nhánh dựa trên hành vi rập
khuôn và tài khoản don cho tính cá nhân của một hướng dẫn chi nhánh cụ thể. Năng
động các yếu tố dự đoán phần cứng, ngược lại hoàn toàn, đưa ra dự đoán của họ tùy
thuộc vào hành vi của từng nhánh có điều kiện và có thể thay đổi dự đoán cho một
nhánh có điều kiện trong suốt vòng đời của chương trình. Theo sự tương tự của
chúng tôi, trong dự đoán động, một người sẽ nhìn vào đồng phục bẩn như thế nào và
đoán công thức, điều chỉnh tiếp theo dự đoán tùy thuộc vào sự thành công của
những dự đoán gần đây.
Một cách tiếp cận phổ biến để dự đoán động của các nhánh có điều kiện là giữ
một lịch sử cho từng nhánh có điều kiện như được thực hiện hoặc chưa được
thực hiện, và sau đó sử dụng hành vi trong quá khứ gần đây để dự đoán tương lai.
Như chúng ta sẽ thấy sau này, số lượng và loại lịch sử được lưu giữ đã trở nên
rộng rãi, với kết quả là các bộ dự đoán nhánh động có thể dự đoán chính xác các
nhánh có điều kiện với độ chính xác hơn 90% (xem Mục 4.9). Khi đoán sai, điều
khiển đường ống phải đảm bảo rằng các hướng dẫn theo nhánh điều kiện được
đoán sai không có hiệu lực và phải khởi động lại đường ống từ địa chỉ nhánh
thích hợp. Trong tương tự giặt ủi của chúng tôi, chúng tôi phải ngừng tải mới để
chúng tôi có thể khởi động lại tải mà chúng tôi dự đoán không chính xác.
Như trong trường hợp của tất cả các giải pháp khác để kiểm soát các mối nguy
hiểm, các đường ống dài hơn làm trầm trọng thêm vấn đề, trong trường hợp này
bằng cách tăng chi phí dự đoán sai. Các giải pháp để kiểm soát các mối nguy
hiểm được mô tả chi tiết hơn trong Mục 4.9.

Xây dựng: Có một cách tiếp cận thứ ba đối với mối nguy kiểm soát, được gọi là a
quyết định chậm trễ. Theo cách tương tự của chúng tôi, bất cứ khi nào bạn sẽ đưa ra
quyết định như vậy về việc giặt giũ, chỉ cần đặt một đống quần áo không bóng đá vào
máy giặt trong khi chờ đồng phục bóng đá khô. Miễn là bạn có đủ quần áo bẩn không
bị ảnh hưởng bởi thử nghiệm, giải pháp này hoạt động tốt.
Gọi là chi nhánh bị trì hoãn trong máy tính, đây là giải pháp thực sự được sử dụng bởi
kiến trúc MIPS. Chi nhánh bị trì hoãn luôn thực hiện hướng dẫn tuần tự tiếp theo, với chi
nhánh đang diễn ra sau rằng một hướng dẫn trì hoãn. Nó được ẩn khỏi lập trình viên ngôn
ngữ lắp ráp MIPS vì trình biên dịch có thể tự động sắp xếp các hướng dẫn để có được
hành vi nhánh mà lập trình viên mong muốn. Phần mềm MIPS sẽ đặt một lệnh ngay sau
khi hướng dẫn nhánh bị trì hoãn không bị ảnh hưởng bởi nhánh và một nhánh được lấy sẽ
thay đổi địa chỉ của lệnh đó theo sau hướng dẫn an toàn này. Trong ví dụ của chúng tôi,
the thêm hướng dẫn trước khi chi nhánh vào Hình 4.33 không ảnh hưởng đến chi nhánh
và có thể được di chuyển sau chi nhánh để ẩn chi nhánh trì hoãn đầy đủ. Vì các nhánh bị
trì hoãn rất hữu ích khi các nhánh ngắn, rất hiếm khi thấy bộ xử lý có nhánh bị trì hoãn hơn
một chu kỳ. Đối với độ trễ nhánh dài hơn, dự đoán nhánh dựa trên phần cứng thường
được sử dụng.
4.6 Tổng quan về đường ống 295

Tóm tắt tổng quan về đường ống


Pipeling là một kỹ thuật khai thác song song giữa các hướng dẫn trong một
luồng hướng dẫn tuần tự. Nó có lợi thế đáng kể rằng, không giống như lập trình
một bộ xử lý đa xử lý (xem Chương 6), về cơ bản là vô hình đối với lập trình
viên.
Trong một vài phần tiếp theo của chương này, chúng tôi đề cập đến khái niệm
đường ống sử dụng tập hợp con lệnh RISC-V từ việc triển khai một chu kỳ trong
Mục 4.4 và hiển thị một phiên bản đơn giản của đường ống của nó. Sau đó chúng tôi
xem xét các vấn đề đó đường ống giới thiệu và hiệu suất đạt được trong các tình
huống điển hình.
Nếu bạn muốn tập trung nhiều hơn vào phần mềm và ý nghĩa hiệu suất của
đường ống, bây giờ bạn có đủ nền tảng để bỏ qua Mục 4.11.Mục 4.11 giới thiệu
các khái niệm đường ống tiên tiến, chẳng hạn như siêu âm và động lập kế hoạch,
và Mục 4.12 kiểm tra các đường ống của bộ vi xử lý gần đây.
Ngoài ra, nếu bạn quan tâm đến việc hiểu cách thức đường ống được xử lý và các
thách thức trong việc xử lý các mối nguy hiểm, bạn có thể tiến hành kiểm tra thiết kế
của một datapath đường ống và điều khiển cơ bản, được giải thích trong Mục 4.7 Sau
đó, bạn có thể sử dụng sự hiểu biết này để khám phá việc thực hiện chuyển tiếp và
quầy hàng. Mục 4.8 Bạn có thể đọc tiếp theo. Mục 4.9 để tìm hiểu thêm về các giải
pháp cho các mối nguy hiểm của chi nhánh và cuối cùng xem các trường hợp ngoại
Kiểm tra
lệ được xử lý như thế nào Mục 4.10.
Bản thân bạn
Đối với mỗi chuỗi mã dưới đây, hãy nêu rõ nó phải bị đình trệ, có thể tránh các
quầy hàng chỉ sử dụng chuyển tiếp hoặc có thể thực thi mà không bị đình trệ
hoặc chuyển tiếp.
Trình tự 1 Trình tự 2 Trình tự 3
lw x10, 0 (x10) thêm x11, x10, x10 addi x11, x10, 1
thêm x11, x10, x10 addi x12, x10, 5 addi x12, x10, 2
addi x14, x11, 5 addi x13, x10, 3
addi x14, x10, 4
addi x15, x10, 5

Hiểu hiệu suất Bên ngoài hệ thống bộ nhớ, hoạt động hiệu quả của đường ống thường là yếu tố
quan trọng nhất trong việc xác định CPI của bộ xử lý và do đó hiệu suất của nó.
chương trình Như chúng ta sẽ thấy trong Mục 4.11, hiểu hiệu suất của bộ xử lý đường ống đa
vấn đề hiện đại rất phức tạp và đòi hỏi sự hiểu biết nhiều hơn là những vấn đề
phát sinh trong một bộ xử lý đường ống đơn giản. Tuy nhiên, các mối nguy về
cấu trúc, dữ liệu và kiểm soát vẫn rất quan trọng trong cả các đường ống đơn
giản và các đường ống tinh vi hơn.
Đối với các đường ống hiện đại, các mối nguy cấu trúc thường xoay quanh
đơn vị điểm nổi, có thể không được xử lý đầy đủ, trong khi các mối nguy kiểm
soát thường là vấn đề trong các chương trình số nguyên, có xu hướng có tần số
nhánh có điều kiện
cao hơn cũng như các
nhánh ít dự đoán hơn.
Nguy cơ dữ liệu có
thể
296 Chương 4 Bộ xử lý

tắc nghẽn hiệu suất trong cả chương trình số nguyên và dấu phẩy động. Thông
thường sẽ dễ dàng hơn để đối phó với các mối nguy dữ liệu trong các chương
trình dấu phẩy động vì tần số nhánh có điều kiện thấp hơn và các mẫu truy cập bộ
nhớ thông thường hơn cho phép trình biên dịch cố gắng lên lịch các hướng dẫn
để tránh các mối nguy hiểm. Việc thực hiện tối ưu hóa như vậy trong các chương
trình số nguyên có ít truy cập bộ nhớ thường xuyên hơn, liên quan đến việc sử
dụng nhiều con trỏ hơn. Như chúng ta sẽ thấy trong Mục 4.11, có nhiều trình biên
dịch và kỹ thuật phần cứng tham vọng hơn để giảm sự phụ thuộc dữ liệu thông
qua lập lịch.

Các
LỚN Đường ống tăng số lượng hướng dẫn thực hiện đồng thời và tốc độ bắt
Hình ảnh đầu và hoàn thành các hướng dẫn. Đường ống không làm giảm thời gian
cần thiết để hoàn thành một hướng dẫn riêng lẻ, còn được gọi là độ trễ
độ trễ (đường ống)
Ví dụ, đường ống năm giai đoạn vẫn mất năm chu kỳ đồng hồ để hướng
Các số lượng giai đoạn
trong một đường ống
dẫn hoàn thành. Trong các điều khoản được sử dụng trong. Chương 1,
hoặc số giai đoạn giữa đường ống cải thiện hướng dẫn thông lượng thay vì hướng dẫn cá nhân
hai hướng dẫn trong khi thời gian thực hiện hoặc là độ trễ.
thực hiện. Các bộ hướng dẫn có thể làm cho cuộc sống khó khăn hơn hoặc đơn
giản hơn đối với các nhà thiết kế đường ống, những người phải đối phó
với các mối nguy về cấu trúc, kiểm soát và dữ liệu. Chi nhánh dự đoán
và chuyển tiếp giúp làm cho một máy tính nhanh chóng trong khi vẫn
nhận được câu trả lời đúng.

4.7 Datapath và điều khiển đường ống

Hình 4.35 cho thấy datapath một chu kỳ từ Mục 4.4 với đường ống giai đoạn xác
định. Việc phân chia một hướng dẫn thành năm giai đoạn có nghĩa là một đường ống
năm giai đoạn, điều này có nghĩa là tối đa năm hướng dẫn sẽ được thực hiện trong bất
kỳ chu kỳ đồng hồ nào. Do đó, chúng ta phải tách datapath thành năm phần, với mỗi
phần được đặt tên tương ứng với giai đoạn thực hiện lệnh :
Có ít trong này 1. IF: Hướng dẫn lấy
hơn là bắt mắt.
2. ID: Hướng dẫn giải mã và đăng ký đọc tập tin
Tallulah
Bankhead, nhận xét 3. EX: Thi công hoặc tính toán địa chỉ
đến Alexander
Woollcott, 1922
4. MEM: Truy cập bộ nhớ dữ liệu
5. WB: Viết lại
Trong Hình 4.35, năm thành phần này tương ứng với cách vẽ đường dẫn dữ
liệu; hướng dẫn và dữ liệu di chuyển nói chung từ trái sang phải thông qua
4.7 Datapath và điều khiển đường ống 297

IF: Hướng dẫn lấy ID: Giải mã hướng dẫn / EX: Thực hiện / MEM: Truy cập bộ nhớ WB: Viết lại
đăng ký tập tin đọc tính toán địa chỉ

4
Thêm
vào
THÊM
Tổng

0
Đọc Đọc
M
bạ đăng ký 1 dữ liệu 1 Số
n PC Địa chỉ không
x Đọc
1 đăng ký 2 ALU ALU Địa chỉ
kết 1
Hướng dẫn Đăng ký 0 quả Đọc M
M
dữ liệu bạn
Viết Đọc Dữ liệu
Hướng dẫn đăng ký dữ liệu 2 bạn ký ức x
x 0
ký ức Viết 1
dữ liệu Viết
dữ liệu

Tôi
Gen

HÌNH 4.35 Datapath một chu kỳ từ Mục 4.4 (tương tự như Hình 4.21). Mỗi bước của hướng dẫn có thể được ánh xạ vào datapath
từ trái sang phải. Các ngoại lệ duy nhất là bản cập nhật của PC và bước ghi lại, được hiển thị bằng màu, sẽ gửi kết quả ALU hoặc dữ liệu từ
bộ nhớ sang trái để ghi vào tệp đăng ký. (Thông thường chúng tôi sử dụng các dòng màu để kiểm soát, nhưng đây là các dòng dữ liệu.)

năm giai đoạn khi họ hoàn thành thực hiện. Quay trở lại sự tương tự giặt ủi của
chúng tôi, quần áo trở nên sạch hơn, khô hơn và có tổ chức hơn khi chúng di
chuyển qua đường dây và chúng không bao giờ di chuyển về phía sau.
Tuy nhiên, có hai trường hợp ngoại lệ đối với luồng hướng dẫn từ trái sang phải này :

■ Giai đoạn ghi lại, đặt kết quả trở lại vào tệp đăng ký ở giữa datapath
■ Việc lựa chọn giá trị tiếp theo của PC, lựa chọn giữa PC tăng dần và địa chỉ
nhánh từ giai đoạn MEM

Dữ liệu chảy từ phải sang trái không ảnh hưởng đến hướng dẫn hiện tại; những
chuyển động dữ liệu ngược này chỉ ảnh hưởng đến các hướng dẫn sau trong
đường ống. Lưu ý rằng luồng dữ liệu từ phải sang trái đầu tiên có thể dẫn đến các
mối nguy dữ liệu và lần thứ hai dẫn đến các mối nguy kiểm soát.
298 Chương 4 Bộ xử lý

Một cách để chỉ ra những gì xảy ra trong thực thi đường ống là giả vờ rằng mỗi
lệnh có biểu đồ riêng, và sau đó đặt các biểu đồ này trên một dòng thời gian để thể
hiện mối quan hệ của chúng. Hình 4.36 cho thấy việc thực hiện các hướng dẫn trong
Hình 4,29 bằng cách hiển thị các biểu đồ riêng của họ trên một dòng thời gian chung.
Chúng tôi sử dụng một cách điệu phiên bản của datapath trong Hình 4.35 để thể hiện
các mối quan hệ trong Hình 4.36.
Hình 4.36 dường như đề nghị rằng ba hướng dẫn cần ba datapaths. Thay vào
đó, chúng tôi thêm các thanh ghi để giữ dữ liệu để các phần của một datapath có
thể được chia sẻ trong khi thực hiện lệnh.
Ví dụ như Hình 4.36 cho thấy, bộ nhớ lệnh được sử dụng chỉ trong một trong
năm giai đoạn của một lệnh, cho phép nó được chia sẻ bằng cách làm theo các
hướng dẫn trong bốn giai đoạn khác. Để giữ lại giá trị của một lệnh riêng lẻ cho
bốn giai đoạn khác của nó, giá trị đọc từ bộ nhớ lệnh phải được lưu trong một
thanh ghi. Các đối số tương tự áp dụng cho mọi giai đoạn đường ống, vì vậy
chúng ta phải đặt các thanh ghi ở bất cứ nơi nào có các đường phân chia giữa các
giai đoạn Hình 4.35Quay trở lại sự tương tự giặt ủi của chúng tôi, chúng tôi có
thể có một giỏ giữa mỗi cặp giai đoạn để giữ quần áo cho bước tiếp theo.
Hình 4.37 cho thấy datapath đường ống với các thanh ghi đường ống được chiếu
sáng cao. Tất cả các hướng dẫn trước trong mỗi chu kỳ đồng hồ từ một thanh ghi
đường ống

Thời gian (theo chu kỳ


đồng hồ)
Chương trình
thi công CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7
đặt hàng
(theo hướng dẫn)

lw x, 100 (x4) IM Reg Reg


ALU DM

lw x2, 200 (x4) IM Reg ALU DM Reg

lw x3, 400 (x4) IM Reg ALU DM Reg

HÌNH 4.36 Hướng dẫn được thực hiện bằng cách sử dụng datapath một chu kỳ trong Hình 4.35,
giả sử thực hiện đường ống. Tương tự như Hình 4.30 đến 4.32, con số này giả vờ rằng mỗi hướng dẫn có
datapath riêng và tô màu từng phần theo cách sử dụng. Không giống như những số liệu đó, mỗi giai đoạn được
dán nhãn bởi tài nguyên vật lý được sử dụng trong giai đoạn đó, tương ứng với các phần của datapath trong Hình
4,48. IM đại diện cho bộ nhớ lệnh và PC trong giai đoạn tìm nạp lệnh , Reg là viết tắt của đăng ký tệp và ký mở
rộng trong giai đoạn đọc tệp giải mã / đăng ký hướng dẫn (ID), v.v. Để duy trì thứ tự thời gian thích hợp, datapath
cách điệu này chia tệp đăng ký thành hai phần logic: các thanh ghi đọc trong quá trình tìm nạp đăng ký (ID) và các
thanh ghi được viết trong khi ghi lại (WB). Việc sử dụng kép này được thể hiện bằng cách vẽ nửa bên trái không
được tô bóng của tệp đăng ký bằng cách sử dụng các dòng được gạch ngang trong giai đoạn ID, khi nó không
được viết và nửa bên phải không được tô màu trong các dòng được gạch ngang trong giai đoạn WB, khi nó không
được đọc . Như trước đây, chúng tôi giả sử tệp đăng ký được viết trong nửa đầu của chu kỳ đồng hồ và tệp đăng
ký được đọc trong nửa sau.
4.7 Datapath và điều khiển đường ống 299

tiếp theo. Các thanh ghi được đặt tên cho hai giai đoạn được phân tách bằng thanh ghi đó.
Ví dụ: thanh ghi đường ống giữa các giai đoạn IF và ID được gọi là IF / ID .
Lưu ý rằng không có đăng ký đường ống ở cuối giai đoạn ghi lại. Tất cả các
hướng dẫn phải cập nhật một số trạng thái trong bộ xử lý, tập tin đăng ký, bộ nhớ
hoặc PC, vì vậy một thanh ghi đường ống riêng biệt là dự phòng cho trạng thái được
cập nhật. Ví dụ: một lệnh tải sẽ đặt kết quả của nó vào một trong 32 thanh ghi và bất
kỳ lệnh nào sau này cần dữ liệu đó sẽ chỉ cần đọc thanh ghi thích hợp.
Tất nhiên, mọi lệnh đều cập nhật PC, cho dù bằng cách tăng nó hoặc bằng
cách đặt nó thành địa chỉ đích nhánh. PC có thể được coi là một thanh ghi đường
ống: một trong đó cung cấp cho giai đoạn IF của đường ống. Không giống như
các thanh ghi đường ống bóng mờ trong Hình 4.37, tuy nhiên, PC là một phần
của trạng thái kiến trúc có thể nhìn thấy; nội dung của nó phải được lưu khi có
ngoại lệ, trong khi nội dung của các thanh ghi đường ống có thể bị loại bỏ. Trong
tương tự giặt, bạn có thể nghĩ về PC tương ứng với giỏ chứa tải quần áo bẩn
trước bước giặt.
Để cho thấy cách thức hoạt động của đường ống, trong suốt chương này, chúng tôi
hiển thị các chuỗi số liệu để chứng minh hoạt động theo thời gian. Những trang phụ
này dường như đòi hỏi nhiều thời gian hơn để bạn hiểu. Đừng sợ; các chuỗi mất ít
thời gian hơn nó có thể xuất hiện, bởi vì bạn có thể so sánh chúng để xem những thay
đổi xảy ra trong mỗi chu kỳ đồng hồ. Mục 4.8 mô tả những gì xảy ra khi có các mối
nguy dữ liệu giữa các hướng dẫn đường ống; bỏ qua chúng bây giờ.

NẾU / ID ID / EX EX / MEM MEM / WB

Thêm vào

4 Thêm vào Tổng


H
ư

n
g

d

n

M
bạ
n PC Địa chỉ Đọc
x
Đọc
1 đăng ký 1 dữ liệu 1
Số
Đọc không 1
Hướng dẫn đăng ký 2 ALU ALU Đọc M
kết dữ bạn
x
ký ức Đăng ký Đọc 0 quả Địa chỉ liệu
Viết dữ liệu 2
M 0
đăng ký bạn Dữ liệu
Viết ký ức
x
dữ liệu 1
Viết
dữ liệu

Tôi
Gen

HÌNH 4.37 Phiên bản đường ống của datapath in Hình 4.35.Các thanh ghi đường ống, màu sắc, tách biệt từng giai đoạn đường
ống. Chúng được dán nhãn bởi các giai đoạn mà chúng tách ra; ví dụ, đầu tiên được dán nhãn NẾU / ID bởi vì nó tách các giai đoạn tìm nạp
lệnh và giải mã lệnh. Các thanh ghi phải đủ rộng để lưu trữ tất cả dữ liệu tương ứng với các dòng đi qua chúng. Ví dụ: thanh ghi IF / ID phải
rộng 96 bit, vì nó phải giữ cả lệnh 32 bit được lấy từ bộ nhớ và địa chỉ PC 64 bit tăng dần. Chúng tôi sẽ mở rộng các thanh ghi này trong
suốt chương này, nhưng hiện tại ba thanh ghi đường ống khác chứa lần lượt 256, 193 và 128 bit.
300 Chương 4 Bộ xử lý

Hình 4.38 đến 4.41, trình tự đầu tiên của chúng tôi, hiển thị các phần hoạt động
của datapath được tô sáng dưới dạng một lệnh tải đi qua năm giai đoạn thực hiện
đường ống. Chúng tôi hiển thị tải đầu tiên vì nó hoạt động trong cả năm giai đoạn.
Như trong Số liệu 4,30 đến 4,32, chúng tôi nhấn mạnh đúng một nửa của thanh ghi
hoặc bộ nhớ khi chúng là đang tồn tại đọc và làm nổi bật nửa tráikhi họ đang được
bằng văn bản.
Chúng tôi chỉ dẫn lw với tên của giai đoạn ống đang hoạt động trong mỗi hình.
Năm giai đoạn như sau :
1. Hướng dẫn tìm nạp : Phần trên cùng của Hình 4.38 cho thấy hướng dẫn
được đọc từ bộ nhớ bằng địa chỉ trong PC và sau đó được đặt trong thanh
ghi đường ống IF / ID. Địa chỉ PC được tăng thêm 4 và sau đó được ghi lại
vào PC để sẵn sàng cho chu kỳ đồng hồ tiếp theo. PC này cũng được lưu
trong thanh ghi đường ống IF / ID trong trường hợp cần thiết sau này cho
một hướng dẫn, chẳng hạn như beqMáy tính không thể biết loại hướng dẫn
nào đang được tìm nạp, vì vậy nó phải chuẩn bị cho bất kỳ hướng dẫn nào,
chuyển thông tin cần thiết tiềm năng xuống đường ống.
2. Hướng dẫn giải mã và đăng ký tập tin đọc : Phần dưới cùng của Hình 4.38
hiển thị phần hướng dẫn của thanh ghi đường ống IF / ID cung cấp trường
ngay lập tức, được mở rộng bằng dấu tới 64 bit và số thanh ghi để đọc hai
thanh ghi. Tất cả ba giá trị được lưu trữ trong thanh ghi đường ống ID / EX,
cùng với địa chỉ PC. Chúng tôi một lần nữa chuyển mọi thứ có thể cần
theo bất kỳ hướng dẫn nào trong chu kỳ đồng hồ sau này.
3. Thực hiện hoặc tính toán địa chỉ : Hình 4.39 cho thấy rằng hướng dẫn tải
đọc nội dung của một thanh ghi và dấu hiệu được mở rộng ngay lập tức từ
thanh ghi đường ống ID / EX và thêm chúng bằng ALU. Tổng đó được đặt
trong thanh ghi đường ống EX / MEM.
4. Truy cập bộ nhớ : Phần trên cùng của Hình 4.40 hiển thị hướng dẫn tải đọc
bộ nhớ dữ liệu bằng cách sử dụng địa chỉ từ thanh ghi đường ống EX /
MEM và tải dữ liệu vào thanh ghi đường ống MEM / WB.
5. Viết lại : Phần dưới cùng của Hình 4.40 cho thấy bước cuối cùng: đọc dữ
liệu từ đường ống MEM / WB đăng ký và ghi nó vào tệp đăng ký ở giữa
hình.
Hướng dẫn tải này cho thấy rằng bất kỳ thông tin nào cần thiết trong giai đoạn
đường ống sau đó phải được chuyển đến giai đoạn đó thông qua một thanh ghi
đường ống. Đi qua một hướng dẫn cửa hàng cho thấy sự tương đồng của thực
hiện hướng dẫn, cũng như truyền thông tin cho các giai đoạn sau. Dưới đây là
năm giai đoạn ống của hướng dẫn cửa hàng :
1. Hướng dẫn tìm nạp : Hướng dẫn được đọc từ bộ nhớ bằng địa chỉ trong PC
và sau đó được đặt trong thanh ghi đường ống IF / ID. Giai đoạn này xảy ra
trước khi hướng dẫn được xác định, vì vậy phần trên cùng của Hình 4.38
làm việc cho cửa hàng cũng như tải.
4.7 Datapath và điều khiển đường ống 301

lw

Hướng dẫn lấy

NẾU /
ID ID / EX EX / MEM MEM / WB

Thêm vào

4 Thêm vào
Tổng
H
ư

n
g

d

n
0
M
bạn PC Địa chỉ Đọc
Đọc dữ
x đăng ký 1
liệu 1
1
Đọc Số
đăng ký 2 không
Hướng dẫn Đọc
Đăng ký Đọc ALU 1
ký ức ALU Địa chỉ dữ
kết M
Viết dữ liệu 2 đăng ký 0 quả liệu bạn
Viết M x
bạ Dữ liệu 0
dữ liệu
n ký ức

1x Viết
dữ liệu
Tôi
Gen

lw

Hướng dẫn giải mã

NẾU / ID / EX EX / MEM MEM / WB


ID

Thêm vào
Thêm vào
4 Tổng
H
ư

n
g

d

n

0
M Đọc
Đọc dữ
bạn PC Địa chỉ đăng ký 1
liệu 1
x
1 Đọc Số
đăng ký 2 không Đọc
Hướng dẫn Đăng ký Đọc ALU 1
ALU Địa chỉ dữ
ký ức kết M
Viết dữ liệu 2 đăng ký 0 quả liệu bạn
Viết M x
bạ Dữ liệu 0
dữ liệu
n ký ức

1x Viết
dữ liệu
Tôi
Gen

HÌNH 4.38 IF và ID: Các giai đoạn ống thứ nhất và thứ hai của một hướng dẫn, với các phần hoạt động của datapath
trong Hình 4.37 nhấn mạnh. Quy ước làm nổi bật giống như quy ước được sử dụng trong Hình 4.30Như trong. Mục 4.2, không có sự
nhầm lẫn khi đọc và ghi sổ đăng ký, vì nội dung chỉ thay đổi trên cạnh đồng hồ. Mặc dù tải chỉ cần đăng ký hàng đầu trong giai đoạn 2,
nhưng nó không bị tổn thương khi làm thêm công việc, vì vậy nó ký mở rộng hằng số và đọc cả hai thanh ghi vào thanh ghi đường ống ID /
EX. Chúng tôi không cần cả ba toán hạng, nhưng nó đơn giản hóa việc kiểm soát để giữ cả ba.
302 Chương 4 Bộ xử lý

lw

Thi hành
án

NẾU / ID ID / EX EX / MEM MEM / WB

Thêm vào
Thêm
4 vàoTổng

M
H

bạ
ư

n
g
d

n

n PC Địa chỉ Đọc


x Đọc
1 đăng ký 1 dữ liệu 1
Đọc Số không
ALU 1
Hướng dẫn đăng ký 2 ALU Đọc M
Đăng ký Địa chỉ dữ bạn
ký ức Viết Đọc 0 kết quả liệu x
M
đăng ký dữ liệu 2 bạn Dữ liệu 0
Viết x ký ức
dữ liệu 1
Viết
dữ liệu

Tôi
Gen

HÌNH 4.39 EX: Giai đoạn ống thứ ba của lệnh tải, làm nổi bật các phần của datapath trong Hình 4.37 được sử dụng
trong giai đoạn ống này. Thanh ghi được thêm vào dấu mở rộng ngay lập tức và tổng được đặt trong thanh ghi đường ống EX / MEM.

2. Hướng dẫn giải mã và đăng ký tập tin đọc : Các hướng dẫn trong đường
ống IF / ID đăng ký cung cấp số đăng ký để đọc hai thanh ghi và mở rộng
dấu hiệu của toán hạng ngay lập tức. Ba giá trị 64 bit này đều được lưu trữ
trong thanh ghi đường ống ID / EX. Phần dưới cùng của Hình 4.38 cho
hướng dẫn tải cũng cho thấy các hoạt động của giai đoạn thứ hai cho các
cửa hàng. Hai giai đoạn đầu tiên này được thực hiện bởi tất cả các hướng
dẫn, vì còn quá sớm để biết loại hướng dẫn. (Trong khi hướng dẫn cửa
hàng sử dụng trường rs2 để đọc thanh ghi thứ hai trong giai đoạn đường
ống này, chi tiết đó không được hiển thị trong sơ đồ đường ống này, vì vậy
chúng tôi có thể sử dụng cùng một hình cho cả hai.)
3. Thực hiện và tính toán địa chỉ : Hình 4.41 cho thấy bước thứ ba; hiệu quả
địa chỉ được đặt trong thanh ghi đường ống EX / MEM.
4. Truy cập bộ nhớ : Phần trên cùng của Hình 4.42 cho thấy dữ liệu được viết để
nhớ. Lưu ý rằng thanh ghi chứa dữ liệu sẽ được lưu trữ đã được đọc ở giai
đoạn trước và được lưu trữ trong ID / EX. Cách duy nhất để cung cấp dữ liệu
trong giai đoạn MEM là đặt dữ liệu vào thanh ghi đường ống EX / MEM trong
giai đoạn EX, giống như chúng tôi đã lưu địa chỉ hiệu quả vào EX / MEM .
5. Viết lại : Phần dưới cùng của Hình 4.42 cho thấy bước cuối cùng của cửa
hàng. Đối với hướng dẫn này, không có gì xảy ra trong giai đoạn viết lại.
Vì mọi hướng dẫn đằng sau cửa hàng đã được tiến hành, chúng tôi không
có cách nào
4.7 Datapath và điều khiển đường ống 303

lw

Ký ức

NẾU / ID / EX EX / MEM / WB
ID MEM

Thêm vào

4 Thêm vào
Tổng
H
ư

n
g

d

0 n
M Đọc
Đọc dữ
bạn PC Địa chỉ đăng ký 1
liệu 1
x
1 Đọc
đăng ký 2 Số Đọc
Hướng dẫn Đăng ký Đọc không 0
Địa chỉ dữ
ký ức Viết ALU ALU M
dữ liệu 2 đăng ký bạn
kết liệu
Viết 0 quả x
M Dữ liệu 1
dữ liệu
bạ ký ức
n

Viết
1x dữ liệu
Tôi
Gen

lw

Viết lại

NẾU / ID / EX EX / MEM / WB
ID MEM

Thêm vào

4 Thêm vào
Tổng
H
ư

n
g

d

n

0
M Đọc
Đọc dữ
bạn PC Địa chỉ đăng ký 1
liệu 1
x
1 Đọc
đăng ký 2 Số Đọc
Hướng dẫn Đăng ký Đọc không 1
Địa chỉ dữ
ký ức ALU ALU M
Viết dữ liệu 2 đăng ký kết liệu bạn
Viết 0 quả x
M Dữ liệu 0
dữ liệu
bạ ký ức
n

x Viết
1 dữ liệu
Tôi
Gen

HÌNH 4,40 MEM và WB: Các giai đoạn ống thứ tư và thứ năm của một hướng dẫn tải, làm nổi bật các phần của
datapath trong Hình 4.37 được sử dụng trong giai đoạn ống này. Bộ nhớ dữ liệu được đọc bằng địa chỉ trong các thanh ghi
đường ống EX / MEM và dữ liệu được đặt trong thanh ghi đường ống MEM / WB. Tiếp theo, dữ liệu được đọc từ thanh ghi đường ống
MEM / WB và được ghi vào tệp đăng ký ở giữa datapath. Lưu ý: có một lỗi trong thiết kế này được sửa chữa Hình 4.43.
304 Chương 4 Bộ xử lý

sw

Thi hành
án

NẾU / ID ID / EX EX / MEM MEM / WB

Thêm vào
Thêm
4 vàoTổng
Hướng dẫn

0
M
bạ Đọc
Địa chỉ Đọc
n PC đăng ký 1
dữ liệu 1
x Đọc Số không
1 đăng ký 2 ALU ALU Đọc 1
Hướng dẫn Đăng kýĐọc Địa chỉ dữ M
ký ức Viết 0 kết quả liệu
M bạn
đăng ký dữ liệu 2 bạn Dữ liệu x

x 0
Viết 1 ký ức
dữ liệu
Viết
dữ liệu

Tôi
Gen

HÌNH 4.41 EX: Giai đoạn ống thứ ba của hướng dẫn cửa hàng. Không giống như giai đoạn thứ ba của hướng dẫn tải trong Hình
4.39, các giá trị đăng ký thứ hai được tải vào thanh ghi đường ống EX / MEM sẽ được sử dụng trong giai đoạn tiếp theo. Mặc dù sẽ rất đau
khi luôn viết đăng ký thứ hai này vào thanh ghi đường ống EX / MEM, chúng tôi chỉ viết thanh ghi thứ hai trên một hướng dẫn của cửa
hàng để làm cho đường ống dễ hiểu hơn.

để tăng tốc những hướng dẫn đó. Do đó, một hướng dẫn đi qua một giai
đoạn ngay cả khi không có gì để làm, bởi vì các hướng dẫn sau này đã tiến
triển ở mức tối đa.
Hướng dẫn của cửa hàng một lần nữa minh họa rằng để chuyển một cái gì đó từ
giai đoạn ống sớm sang giai đoạn ống sau, thông tin phải được đặt trong một thanh
ghi đường ống; mặt khác, thông tin bị mất khi hướng dẫn tiếp theo bước vào giai
đoạn đường ống đó. Đối với hướng dẫn lưu trữ, chúng tôi cần chuyển một trong các
thanh ghi được đọc trong giai đoạn ID sang giai đoạn MEM, nơi nó được lưu trữ
trong bộ nhớ. Dữ liệu đầu tiên được đặt trong thanh ghi đường ống ID / EX và sau đó
được chuyển đến thanh ghi đường ống EX / MEM.
Tải và lưu trữ minh họa một điểm chính thứ hai: mỗi thành phần logic của
datapath, chẳng hạn như bộ nhớ lệnh, cổng đọc đăng ký, ALU, bộ nhớ dữ liệu và
cổng ghi đăng ký chỉ có thể được sử dụng trong a độc thân giai đoạn đường ống.
Nếu không, chúng tôi sẽ có một nguy cơ cấu trúc (xem trang 287). Do đó, các
thành phần này và kiểm soát của chúng có thể được liên kết với một giai đoạn
đường ống duy nhất.
Bây giờ chúng ta có thể phát hiện ra một lỗi trong thiết kế của hướng dẫn tải.
Bạn đã nhìn thấy nó? Đăng ký nào được thay đổi trong giai đoạn cuối của tải? Cụ
thể hơn, hướng dẫn nào cung cấp số đăng ký ghi? Hướng dẫn trong thanh ghi
đường ống IF / ID cung cấp số thanh ghi ghi, tuy nhiên hướng dẫn này xảy ra
đáng kể sau hướng dẫn tải!
4.7 Datapath và điều khiển đường ống 305

sw

Ký ức

NẾU / ID / EX EX / MEM / WB
ID MEM

Thêm vào

4 Thêm vào
Tổng
H
ư

n
g

d

0 n
M Đọc
Đọc dữ
bạn PC Địa chỉ đăng ký 1
liệu 1
x
1 Đọc
đăng ký 2 Số Đọc
Hướng dẫn Đăng ký Đọc không 0
Địa chỉ dữ
ký ức ALU ALU M
Viết dữ liệu 2 đăng ký kết liệu bạn
Viết 0 quả x
Dữ liệu 1
dữ liệu M
bạ ký ức
n

x Viết
1 dữ liệu
Tôi
Gen

sw

Viết lại

NẾU / ID / EX EX / MEM / WB
ID MEM

Thêm vào

4 Thêm vào
Tổng
H
ư

n
g

d

n

0
M Đọc
Đọc dữ
bạn PC Địa chỉ đăng ký 1
liệu 1
x
1 Đọc
đăng ký 2 Số Đọc
Hướng dẫn Đăng ký Đọc không 1
Địa chỉ dữ
ký ức ALU ALU M
Viết dữ liệu 2 đăng ký kết liệu bạn
Viết 0 quả x
M Dữ liệu 0
dữ liệu
bạ ký ức
n

x Viết
1 dữ liệu
Tôi
Gen

HÌNH 4.42 MEM và WB: Giai đoạn ống thứ tư và thứ năm của hướng dẫn cửa hàng. Trong giai đoạn thứ tư, dữ liệu được viết
vào bộ nhớ dữ liệu cho cửa hàng. Lưu ý rằng dữ liệu đến từ thanh ghi đường ống EX / MEM và không có gì thay đổi trong thanh ghi đường
ống MEM / WB. Khi dữ liệu được ghi trong bộ nhớ, không còn gì để hướng dẫn cửa hàng thực hiện, vì vậy không có gì xảy ra trong giai
đoạn 5.
306 Chương 4 Bộ xử lý

Do đó, chúng ta cần bảo toàn số thanh ghi đích trong hướng dẫn tải. Giống
như cửa hàng đã thông qua đăng ký giá trị từ ID / EX đến các thanh ghi đường
ống EX / MEM để sử dụng trong giai đoạn MEM, tải phải vượt qua thanh ghi số
từ ID / EX đến EX / MEM đến đăng ký đường ống MEM / WB để sử dụng trong
giai đoạn WB. Một cách khác để suy nghĩ về việc vượt qua số đăng ký là để chia
sẻ datapath đường ống, chúng ta cần duy trì hướng dẫn đọc trong giai đoạn IF, vì
vậy mỗi thanh ghi đường ống chứa một phần hướng dẫn cần thiết cho giai đoạn
đó và các giai đoạn sau.
Hình 4.43 hiển thị phiên bản chính xác của datapath, chuyển qua thanh ghi ghi
số đầu tiên vào thanh ghi ID / EX, sau đó đến thanh ghi EX / MEM và cuối cùng
là thanh ghi MEM / WB. Số đăng ký được sử dụng trong giai đoạn WB để chỉ
định đăng ký được viết. Hình 4.44 là một bản vẽ duy nhất của datapath đã sửa,
làm nổi bật phần cứng được sử dụng trong tất cả năm giai đoạn của hướng dẫn
đăng ký tải trong Hình 4,38 đến 4,40Xem. Mục 4.9 cho một lời giải thích về cách
làm cho hướng dẫn chi nhánh làm việc như mong đợi.

Đại diện đồ họa đường ống


Đường ống có thể khó thành thạo, vì nhiều hướng dẫn đang thực hiện đồng thời trong
một datapath duy nhất trong mỗi chu kỳ đồng hồ. Để hỗ trợ sự hiểu biết, có hai kiểu
cơ bản của số liệu đường ống : sơ đồ đường ống nhiều chu kỳ, chẳng hạn như Hình
4.36 trên trang 298, và sơ đồ đường ống một chu kỳ, chẳng hạn như Hình 4.38 đến
4.42Các sơ đồ nhiều chu kỳ đồng hồ đơn giản hơn nhưng không chứa. tất cả các chi
tiết. Ví dụ: xem xét trình tự năm hướng dẫn sau :

NẾU / ID / EX EX / MEM MEM / WB


ID

Thêm vào

4 Thêm vào
Tổng

0
M
bạn PC Địa chỉ Đọc
Đọc dữ
Hướng dẫn

x đăng ký 1
liệu 1
1
Đọc Số
đăng ký 2 không
Hướng dẫn Đọc
Đăng ký Đọc ALU 1
ký ức ALU Địa chỉ dữ
kết M
Viết dữ liệu 2 đăng ký 0 quả liệu bạn
Viết M x
bạ Dữ liệu 0
dữ liệu
n ký ức

x
1 Viết
dữ liệu
Tôi
Gen

HÌNH 4.43 Datapath đường ống đã sửa để xử lý đúng hướng dẫn tải. Số đăng ký viết bây giờ đến từ thanh ghi đường ống
MEM / WB cùng với dữ liệu. Số thanh ghi được chuyển từ giai đoạn ống ID cho đến khi nó đạt đến thanh ghi đường ống MEM / WB, thêm
năm bit nữa vào ba thanh ghi đường ống cuối cùng. Con đường mới này được hiển thị màu sắc.
4.7 Datapath và điều khiển đường ống 307

lw x10, 40 (x1)
phụ x11, x2, x3
thêm x12, x3, x4
lw x13, 48 (x1)
thêm x14, x5, x6

Hình 4.45 hiển thị sơ đồ đường ống nhiều chu kỳ cho các hướng dẫn này. Thời
gian tiến từ trái sang phải trên trang trong các sơ đồ này và các hướng dẫn tiến từ trên
xuống dưới cùng của trang, tương tự như đường ống giặt ủi Hình 4.27Một đại diện
của các giai đoạn đường ống được đặt trong mỗi phần dọc theo. trục chỉ dẫn, chiếm
các chu kỳ đồng hồ thích hợp. Các datapath được cách điệu này đại diện cho năm giai
đoạn của đường ống của chúng tôi bằng đồ họa, nhưng một hình chữ nhật đặt tên cho
mỗi giai đoạn đường ống cũng hoạt động tốt. Hình 4.46 cho thấy phiên bản truyền
thống hơn của sơ đồ đường ống nhiều chu kỳ. Lưu ý rằng Hình 4.45 cho thấy các tài
nguyên vật lý được sử dụng ở mỗi giai đoạn, trong khi Hình 4.46 sử dụng tên của
từng giai đoạn.
Các sơ đồ đường ống một chu kỳ cho thấy trạng thái của toàn bộ datapath trong
một chu kỳ đồng hồ duy nhất và thường tất cả năm hướng dẫn trong đường ống được
xác định bởi các nhãn trên các giai đoạn đường ống tương ứng của chúng. Chúng tôi
sử dụng loại hình này để hiển thị chi tiết về những gì đang xảy ra trong đường ống
trong mỗi chu kỳ đồng hồ; thông thường, các bản vẽ xuất hiện trong các nhóm để
hiển thị hoạt động của đường ống qua một chuỗi các chu kỳ đồng hồ. Chúng tôi sử
dụng sơ đồ nhiều chu kỳ để đưa ra tổng quan về các tình huống đường ống. ( Mục
4.14 cung cấp thêm hình minh họa của đồng hồ đơn sơ đồ nếu bạn muốn xem thêm
chi tiết về Hình 4.45.) Sơ đồ chu kỳ đơn đồng hồ biểu thị một lát dọc của một
chu kỳ đồng hồ thông qua một tập hợp các sơ đồ chu kỳ nhiều đồng hồ, cho thấy
việc sử dụng datapath theo từng hướng dẫn trong đường ống tại chu kỳ đồng hồ
được chỉ định. Ví dụ, Hình 4.47 cho thấy

NẾU / ID / EX EX / MEM MEM / WB


ID

Thêm vào

4 Thêm vào
Tổng

0
M
bạn PC Địa chỉ Đọc
Đọc dữ
Hướng dẫn

x đăng ký 1
liệu 1
1
Đọc Số
đăng ký 2 không Đọc
Hướng dẫn
Đăng ký Đọc ALU ALU 1
ký ức Địa chỉ dữ
kết M
Viết dữ liệu 2 đăng ký 0 quả liệu bạn
Viết M x
bạ Dữ liệu 0
dữ liệu
n ký ức

x
1 Viết
dữ liệu
Tôi
Gen

HÌNH 4.44 Phần của datapath trong Hình 4.43 được sử dụng trong tất cả năm giai đoạn của một hướng dẫn tải.
308 Chương 4 Bộ xử lý

Thời gian (theo chu kỳ


đồng hồ) CC 4 CC5 CC6 CC7 CC8 CC9
CC1 CC2 CC3

Chương trình
thi công
đặt hàng
(theo hướng dẫn)
DM Reg
lw x10, 40 (x1) IM Reg ALU

phụ x11, x2, x3


IM Reg ALU DM Reg

thêm x12, x3, x4


IM Reg ALU DM Reg

lw x13, 48 (x1) Reg ALU


IM DM Reg

thêm x14, x5, x6 Reg ALU


IM DM Reg

HÌNH 4.45 Sơ đồ đường ống nhiều chu kỳ của năm hướng dẫn. Phong cách đại diện đường ống này cho thấy sự hoàn chỉnh thực
hiện các hướng dẫn trong một hình duy nhất. Các hướng dẫn được liệt kê theo thứ tự thực hiện lệnh từ trên xuống dưới và chu kỳ đồng hồ di
chuyển từ trái sang phải. Không giốngHình 4.26, ở đây chúng tôi hiển thị các thanh ghi đường ống giữa mỗi giai đoạn. Hình 4.59 cho thấy
cách truyền thống để vẽ sơ đồ này.

Thời gian (theo chu kỳ đồng hồ)


CC1 CC2 CC3 CC4 CC5 CC6 CC7 CC8 CC9
Chương trình
thi công
đặt hàng
(theo hướng
dẫn)
Hướng dẫn Hướng dẫn Dữ liệu
Thi hành án Viết lại
lấy giải mã truy cập
lw x10, 40 (x1)
Hướng dẫn Hướng dẫn Dữ liệu
Thi hành án Viết lại
lấy giải mã truy cập
phụ x11, x2, x3
Thi hành
Hướng dẫn Hướng dẫn án Dữ liệu Viết lại
thêm x12, x3, lấy giải mã truy cập
x4 Thi hành
Hướng dẫn Hướng dẫn án Dữ liệu Viết lại
lw x13, 48 (x1) lấy giải mã truy cập
Hướng Thi hành
thêm x14, x5, x6 Hướng dẫn dẫn án Dữ liệu Viết lại
lấy giải mã truy cập

HÌNH 4.46 Sơ đồ đường ống truyền thống nhiều chu kỳ của năm hướng dẫn trong Hình 4.45.
4.7 Datapath và điều khiển đường ống 309

thêm x14, x5, x6 lw x13, 48 (x1) thêm x12, x3, x4 phụ x11, x2, x3 lw x10, 40 (x1)
Hướng dẫn lấy Hướng dẫn giải mã Thi hành án Ký ức Viết lại

NẾU / ID / EX EX / MEM MEM / WB


ID

Thêm vào Thêm


vào Tổng
4

0
M Đọc
đăng ký 1 Đọc
H
ư

n
g
d

n

bạ
n PC Địa chỉ dữ liệu 1
Số
x Đọc không
1 đăng ký 2
ALU ALU Đọc
Hướng dẫn Đăng ký Đọc Địa chỉ 1
kết dữ
ký ức Viết dữ liệu 2
0 quả liệu
M
M
đăng ký bạn Dữ liệu bạn
Viết x ký ức x
0
dữ liệu 1

Viết
dữ liệu

Tôi
Gen

HÌNH 4.47 Sơ đồ chu trình đơn đồng hồ tương ứng với chu kỳ đồng hồ 5 của đường ống Hình 4.45 và 4.46.
Như bạn có thể thấy, một hình chu kỳ một đồng hồ là một lát dọc thông qua sơ đồ nhiều chu kỳ.
4. Thay vì cố
sơ đồ chu kỳ đơn tương ứng với chu kỳ đồng hồ 5 của Hình 4.45 và 4.46Rõ ràng, gắng làm cho
các sơ đồ chu kỳ đơn có nhiều chi tiết hơn và có nhiều không gian hơn để hiển thị các hướng dẫn
cùng một số chu kỳ đồng hồ. Các bài tập yêu cầu bạn tạo các sơ đồ như vậy cho mất ít chu kỳ
các chuỗi mã khác. hơn, chúng ta
Một nhóm sinh viên đang tranh luận về hiệu quả của đường ống năm giai đoạn nên khám phá
khi một sinh viên chỉ ra rằng không phải tất cả các hướng dẫn đều hoạt động làm cho đường
trong mọi giai đoạn của đường ống. Sau khi quyết định bỏ qua các tác động của ống dài hơn, để
các mối nguy hiểm, họ đã đưa ra bốn tuyên bố sau đây. Những cái nào là chính các hướng dẫn
xác? có nhiều chu
1. Cho phép các nhánh và hướng dẫn ALU thực hiện ít giai đoạn hơn năm kỳ hơn, nhưng
giai đoạn theo yêu cầu của hướng dẫn tải sẽ tăng hiệu suất đường ống các chu kỳ
trong mọi trường hợp. ngắn hơn. Điều
2. Cố gắng cho phép một số hướng dẫn thực hiện ít chu kỳ hơn không giúp này có thể cải
ích gì, vì thông lượng được xác định bởi chu kỳ đồng hồ; số lượng giai thiện hiệu suất.
đoạn ống trên mỗi hướng dẫn ảnh hưởng đến độ trễ, không phải thông
lượng.
3. Bạn không thể thực hiện các hướng dẫn ALU mất ít chu kỳ hơn vì kết quả
ghi lại, nhưng các nhánh có thể mất ít chu kỳ hơn, vì vậy có một số cơ hội
để cải thiện.
Kiểm tra
Bản thân bạn
310 Chương 4 Bộ xử lý

Trong Máy tính 6600, có Kiểm soát đường ống


lẽ thậm chí nhiều hơn Giống như chúng tôi đã thêm quyền kiểm soát vào datapath một chu kỳ trong
bất kỳ máy tính nào Mục 4.4, bây giờ chúng tôi thêm điều khiển vào datapath đường ống. Chúng tôi
trước đây, hệ thống điều bắt đầu với một thiết kế đơn giản để xem vấn đề thông qua kính màu hoa hồng.
khiển là sự khác biệt. Bước đầu tiên là dán nhãn các dòng điều khiển trên datapath hiện có. Hình
James Thornton , Thiết 4.61 cho thấy những dòng đó. Chúng tôi mượn càng nhiều càng tốt từ sự kiểm
kế của một máy tính: Dữ soát cho datapath đơn giản trong Hình 4.21 Cụ thể, chúng tôi sử dụng cùng logic
liệu điều khiển 6600, điều khiển ALU, logic nhánh và các dòng điều khiển. Các hàm này được xác
1970 định trong. Hình 4.12, 4.20 và 4.22 Chúng tôi sao chép thông tin chính trong.
Hình 4,49 đến 4,51 trên hai trang trong phần này để làm cho các cuộc thảo luận
sau dễ tiếp thu hơn.
Như trường hợp thực hiện một chu kỳ, chúng tôi giả định rằng PC được viết
trên mỗi chu kỳ đồng hồ, vì vậy không có tín hiệu ghi riêng cho PC. Theo cùng
một lập luận, không có tín hiệu ghi riêng cho các thanh ghi đường ống (NẾU / ID,
ID / EX, EX / MEM, và MEM / WB) vì các thanh ghi đường ống cũng được viết
trong mỗi chu kỳ đồng hồ.
Để chỉ định điều khiển cho đường ống, chúng ta chỉ cần đặt các giá trị điều
khiển trong mỗi giai đoạn đường ống. Vì mỗi đường điều khiển được liên kết với
một thành phần chỉ hoạt động trong một giai đoạn đường ống duy nhất, chúng ta
có thể chia các đường điều khiển thành năm nhóm theo giai đoạn đường ống.

PCSrc

NẾU / ID ID / EX EX / MEM MEM / WB

Thêm vào

4 Thêm vàoTổng
Chi nhánh

0
H

RegWrite
ư

n
g

d

n

M
bạn PC Địa chỉ Đọc
x Đọc
1 đăng ký 1 dữ liệu 1 Ghi nhớ
MemtoReg
Đọc ALUSrc Số không
Hướng dẫn Đọc
đăng ký 2

Thêm vào ALU


1
dữ M
ký ức Viết Đăng kýĐọc 0 kết quả Địa chỉ liệu bạn
đăng ký dữ liệu 2 M x
bạn Dữ liệu
0
Viết x ký ức
dữ
liệu 1
Viết
Hướng dữ liệu
dẫn
[31 con0] Tôi
Hướng Gen Ghi nhớ
dẫn ALU
[30, 14-12] điều
khiển
Hướng
dẫn
[11-7] ALUOp

HÌNH 4.48 Datapath đường ống của Hình 4.43 với các tín hiệu điều khiển được xác định. Datapath này mượn sự kiểm soát
logic cho nguồn PC, đăng ký số đích và kiểm soát ALU từ đó Mục 4.4Lưu ý rằng bây giờ chúng ta cần các trường func của hướng dẫn trong
giai đoạn EX làm đầu vào cho điều khiển ALU, vì vậy các bit này cũng phải được đưa vào thanh ghi đường ống ID / EX.
4.7 Datapath và điều khiển đường ống 311

1. Hướng dẫn tìm nạp : Các tín hiệu điều khiển để đọc bộ nhớ hướng dẫn và
viết PC luôn được khẳng định, vì vậy không có gì đặc biệt để kiểm soát
trong giai đoạn đường ống này.
2. Hướng dẫn giải mã / đăng ký tập tin đọc : Hai thanh ghi nguồn luôn ở
trong cùng một vị trí trong các định dạng hướng dẫn RISC-V, do đó không
có gì đặc biệt để kiểm soát trong giai đoạn đường ống này.
3. Thực hiện / tính toán địa chỉ : Các tín hiệu được đặt là ALUOp và
ALUSrc (xem Hình 4,49 và 4,50). Các tín hiệu chọn hoạt động ALU và
Đọc dữ liệu 2 hoặc mở rộng dấu hiệu ngay lập tức làm đầu vào cho ALU .
4. Truy cập bộ nhớ : Các dòng điều khiển được đặt trong giai đoạn này là
Branch, MemRead , và MemWrite. Chi nhánh nếu bằng nhau, tải và
hướng dẫn lưu trữ đặt các tín hiệu này tương ứng. Nhớ lại rằng PCSrc
trong Hình 4.50 chọn địa chỉ tuần tự tiếp theo trừ khi kiểm soát khẳng định
Chi nhánh và kết quả ALU là 0.
5. Viết lại : Hai dòng điều khiển là MemtoReg, quyết định giữa gửi kết quả
ALU hoặc giá trị bộ nhớ đến tệp đăng ký và RegWrite, ghi giá trị đã chọn.

Vì đường ống dẫn dữ liệu không thay đổi ý nghĩa của các đường điều khiển,
chúng ta có thể sử dụng các giá trị điều khiển tương tự. Hình 4.51 có các giá trị
tương tự như trong Mục 4.4, nhưng bây giờ bảy dòng điều khiển được nhóm theo
giai đoạn đường ống.
Kiểm soát thực hiện có nghĩa là đặt bảy dòng điều khiển cho các giá trị này
trong mỗi giai đoạn cho mỗi lệnh.
Vì phần còn lại của các dòng điều khiển bắt đầu với giai đoạn EX, chúng ta có thể
tạo thông tin điều khiển trong quá trình giải mã lệnh cho các giai đoạn sau. Cách đơn
giản nhất để vượt qua các tín hiệu điều khiển này là mở rộng các thanh ghi đường
ống để bao gồm thông tin điều khiển. Hình 4.52 ở trên cho thấy các tín hiệu điều
khiển này sau đó được sử dụng trong giai đoạn đường ống thích hợp khi lệnh di
chuyển xuống đường ống, giống như số thanh ghi đích cho tải di chuyển xuống
đường ống Hình 4.43. Hình 4.53 hiển thị datapath đầy đủ với các thanh ghi đường
ống mở rộng và với các đường điều khiển được kết nối với giai đoạn thích hợp. (
Mục 4.14 cho nhiều hơn
ví dụ về mã RISC-V thực thi trên phần cứng được thiết kế bằng sơ đồ một đồng
hồ, nếu bạn muốn xem thêm chi tiết.)
312 Chương 4 Bộ xử lý

HÌNH 4,49 Một bản sao của Hình 4.12.Hình này cho thấy các bit điều khiển ALU được đặt tùy thuộc
vào cách các bit điều khiển ALUOp và các opcodes khác nhau cho lệnh loại R.

HÌNH 4.50 Một bản sao của Hình 4.20.Chức năng của mỗi sáu tín hiệu điều khiển được xác định. Các dòng điều khiển ALU (ALUOp)
được xác định trong cột thứ hai của Hình 4.49 Khi điều khiển 1 bit thành bộ ghép kênh hai chiều được khẳng định, bộ ghép kênh sẽ chọn
đầu vào tương ứng với 1. Mặt khác, nếu điều khiển được phân tách, bộ ghép kênh sẽ chọn đầu vào 0. Lưu ý rằng PCSrc được điều khiển bởi
cổng AND. Hình 4.48Nếu tín hiệu Chi nhánh và tín hiệu ALU Zero đều được đặt, thì PCSrc là 1; mặt khác, nó là 0. Điều khiển chỉ đặt tín
hiệu Chi nhánh trong lệnh beq; mặt khác, PCSrc được đặt thành 0.

HÌNH 4.51 Các giá trị của các dòng điều khiển giống như trong Hình 4.22, nhưng họ đã bị
xáo trộn thành ba nhóm tương ứng với ba giai đoạn đường ống cuối cùng.
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình trệ 313

WB

Hướng Điều WB
dẫn khiển M

M WB
EX

NẾU / ID ID / EX EX / MEM MEM / WB

HÌNH 4.52 Bảy dòng điều khiển cho ba giai đoạn cuối. Lưu ý rằng hai trong số bảy các đường
điều khiển được sử dụng trong pha EX, với năm đường điều khiển còn lại được chuyển đến thanh ghi
đường ống EX / MEM được mở rộng để giữ các đường điều khiển; ba được sử dụng trong giai đoạn MEM
và hai cuối cùng được chuyển đến MEM / WB để sử dụng trong giai đoạn WB.
lập trình viên dự định
rằng −20 sẽ được sử
dụng trong các
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình hướng dẫn sau đây đề
trệ cập đến đăng ký x2.

Các ví dụ trong phần trước cho thấy sức mạnh của việc thực thi đường ống và
cách phần cứng thực hiện nhiệm vụ. Bây giờ, thời gian để tháo kính màu hoa
hồng và xem xét những gì xảy ra với các chương trình thực sự. Các hướng dẫn
RISC-V trong Hình 4,45 đến 4,47 đã độc lập; không ai trong số họ sử dụng kết
quả được tính bởi bất kỳ ai khác. Tuy nhiên, trong Mục 4.6, chúng tôi đã thấy
rằng các mối nguy dữ liệu là trở ngại cho việc thực hiện đường ống.
Hãy cùng nhìn vào một chuỗi có nhiều phụ thuộc, được hiển thị bằng màu :

phụ x2, x1, x3 // Đăng ký z2 được viết bởi phụ


và x12 , x2, x5 // Toán hạng 1 (x2) phụ thuộc vào phụ
hoặc
là x13, x6 , x2 // Toán hạng 2 (x2) phụ thuộc vào phụ
thêm x14 , x2, x2 // 1st (x2) & 2nd (x2) phụ thuộc vào phụ
sw x15 , 100 (x2) // Cơ sở (x2) phụ thuộc vào phụ

Bốn hướng dẫn cuối cùng đều phụ thuộc vào kết quả trong đăng ký x2 của
hướng dẫn đầu tiên. Nếu đăng ký x2 có giá trị 10 trước lệnh trừ và −20 sau đó,
Ý bạn là gì, tại sao nó phải được xây dựng? Nó là một đường vòng. Bạn đã xây dựng
đường tránh.
Douglas Adams , Các Hướng dẫn Hitchhiker về thiên hà, 1979
314 Chương 4 Bộ xử lý

PCSrc

ID / EX

WB EX / MEM

Điều
khiển M WB MEM / WB

EX M WB
NẾU / ID

Thêm vào

4 Thêm vàoTổng


h

n
h
Chi nhánh

i
RegWrit ALUSrc
e
0
H
ư

n
g
d

n

PC Địa chỉ Đọc

MemtoReg
đăng ký 1 Đọc
1 dữ liệu 1 Số
Đọc không
ALU
Hướng dẫn đăng ký 2 ALU Đọc
dữ
ký ức Viết Đăng kýĐọc 0 kết quả Địa chỉ liệu 1
đăng ký dữ liệu 2 Dữ liệu
Viết ký ức 0
dữ
liệu 1
Viết
Hướng dữ liệu
dẫn
[31 con0] Tôi
Hướng Gen Ghi nhớ
dẫn ALU
[30, 14-12] điều khiển
Hướng
dẫn ALUOp
[11-7]

HÌNH 4.53 Datapath đường ống của Hình 4.48, với các tín hiệu điều khiển được kết nối với các phần điều khiển của các thanh
ghi đường ống. Các giá trị điều khiển cho ba giai đoạn cuối được tạo trong giai đoạn giải mã lệnh và sau đó được đặt trong ID / EX đăng ký
đường ống. Các đường điều khiển cho từng giai đoạn ống được sử dụng và các đường điều khiển còn lại sau đó được chuyển sang giai đoạn đường
ống tiếp theo.

Làm thế nào trình tự này sẽ thực hiện với đường ống của chúng tôi? Hình 4.54
minh họa việc thực hiện các hướng dẫn này bằng cách sử dụng biểu diễn đường ống
nhiều chu kỳ. Để chứng minh việc thực hiện chuỗi lệnh này trong đường ống hiện tại
của chúng tôi, đầu trang Hình 4.54 hiển thị giá trị của đăng ký x2, thay đổi vào giữa
chu kỳ đồng hồ 5, khi phụ hướng dẫn viết kết quả của nó.
Tiềm năng của thêm nguy hiểm có thể được giải quyết bằng thiết kế phần cứng
tệp đăng ký: Điều gì xảy ra khi một thanh ghi được đọc và viết trong cùng một
chu kỳ đồng hồ? Chúng tôi giả định rằng chữ viết nằm trong nửa đầu của chu kỳ
đồng hồ và số đọc là trong nửa sau, vì vậy số đọc cung cấp những gì được viết.
Như trường hợp của nhiều triển khai tệp đăng ký, chúng tôi không có nguy cơ dữ
liệu trong trường hợp này.
Hình 4.67 cho thấy các giá trị đọc để đăng ký x2 sẽ không phải là kết quả của
các phụ hướng dẫn trừ khi đọc xảy ra trong chu kỳ đồng hồ 5 trở lên. Do đó, các
hướng dẫn sẽ nhận được giá trị chính xác của −20 là thêm và sw; các và và hoặc là
hướng dẫn sẽ nhận được giá trị không chính xác 10! Sử dụng phong cách vẽ này,
như vậy vấn đề trở nên rõ ràng khi một dòng phụ thuộc đi ngược thời gian.
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình trệ 315

Như đã đề cập trong Mục 4.6, kết quả mong muốn có sẵn ở cuối giai đoạn EX của
phụ hướng dẫn hoặc chu trình đồng hồ 3. Khi nào dữ liệu thực sự cần thiết bởi và và
hoặc là hướng dẫn? Câu trả lời là ở phần đầu của giai đoạn EX và và hoặc là hướng
dẫn, hoặc chu kỳ đồng hồ 4 và 5, tương ứng. Như vậy, chúng ta có thể thực hiện
phân khúc này không có quầy hàng nếu chúng ta đơn giản ở đằng trước dữ liệu ngay
khi có sẵn cho bất kỳ đơn vị nào cần nó trước khi nó sẵn sàng đọc từ tệp đăng ký.
Làm thế nào để chuyển tiếp làm việc? Để đơn giản trong phần còn lại của phần
này, chúng tôi chỉ xem xét thách thức chuyển tiếp đến một hoạt động trong giai đoạn
EX, có thể là một hoạt động ALU hoặc tính toán địa chỉ hiệu quả. Điều này có nghĩa
là khi một lệnh cố gắng sử dụng một thanh ghi trong giai đoạn EX của nó mà một
lệnh trước đó dự định viết trong giai đoạn WB của nó, chúng ta thực sự cần các giá trị
làm đầu vào cho ALU .
Một ký hiệu đặt tên cho các trường của các thanh ghi đường ống cho phép ký hiệu
phụ thuộc chính xác hơn. Ví dụ: ID ID / EX.RegisterRs1, đề cập đến số lượng một
thanh ghi có giá trị được tìm thấy trong ID / EX đăng ký đường ống; đó là một trong
những cổng đọc đầu tiên của tệp đăng ký. Phần đầu tiên của tên, ở bên trái của thời kỳ,
là tên của thanh ghi đường ống; phần thứ hai là tên của trường trong thanh ghi đó. Sử
dụng ký hiệu này, hai cặp điều kiện nguy hiểm là

1a. EX / MEM.RegisterRd = ID / EX.RegisterRs1


1b. EX / MEM.RegisterRd = ID / EX.RegisterRs2
2a. MEM / WB.RegisterRd = ID / EX.RegisterRs1
2b. MEM / WB.RegisterRd = ID / EX.RegisterRs2

Mối nguy hiểm đầu tiên trong chuỗi trên trang 313 là trên sổ đăng ký x2, giữa
kết quả của phụ x2, x1, x3 và toán hạng đọc đầu tiên của và x12, x2, x5 Nguy cơ này
có thể được phát hiện khi. và hướng dẫn ở giai đoạn EX và hướng dẫn trước nằm
trong giai đoạn MEM, vì vậy đây là mối nguy hiểm 1a :

EX / MEM.RegisterRd = ID / EX.RegisterRs1 = x2

VÍ DỤ
Phát hiện sự phụ thuộc

Phân loại các phụ thuộc trong chuỗi này từ trang 313 :

phụ x2, x1, x3 // Đăng ký bộ x2 bởi phụ


và x12 , x2, x5 // Toán hạng 1 (z2) bộ bởi phụ
hoặc
là x13 , x6 , x2 // Toán hạng 2 (x2) bởi phụ
thêm x14 , x2, x2 // 1 (x2) & 2 (x2) được đặt theo phụ
sw x15 , 100 (x2) // Chỉ số (x2) đặt theo phụ
316 Chương 4 Bộ xử lý

Thời gian (theo chu kỳ đồng hồ)


Giá trị của CC 1 CC2 CC3 CC4 CC5 CC6 CC7 CC8 CC9
đăng ký x2 : 10 10 10 10 10 / Cẩu20 Cẩu20 Cẩu20 Cẩu20
Cẩu20
Chương trình
thi công
đặt hàng
(theo hướng dẫn)

phụ x2, x1, x3 IM


Reg DM Reg

và x12 , x2, x5 DM Reg


IM Reg

hoặc x13, x6 , x2 Reg


IM DM Reg

thêm x14 , x2, x2 IM Reg DM Reg

sw x15, 100 (x2) IM Reg DM Reg

HÌNH 4.54 Phụ thuộc đường ống trong chuỗi năm hướng dẫn sử dụng các biểu đồ đơn giản hóa để hiển thị các phụ thuộc. Tất
cả các hành động phụ thuộc được hiển thị bằng màu sắc và trên CC CC 1 ở đầu hình có nghĩa là chu kỳ đồng hồ 1. Hướng dẫn đầu tiên viết vào x2 và
tất cả các hướng dẫn sau đây đọc x2. Thanh ghi này được viết theo chu kỳ đồng hồ 5, vì vậy giá trị phù hợp không khả dụng trước chu kỳ đồng hồ 5.
(Việc đọc một thanh ghi trong chu kỳ đồng hồ trả về giá trị được viết vào cuối nửa đầu của chu kỳ, khi việc ghi như vậy xảy ra.) Các đường màu từ
datapath trên cùng đến các đường dưới cho thấy sự phụ thuộc. Những người phải đi ngược thời gian là mối nguy dữ liệu đường ống.

Như đã đề cập ở trên, các phụ và là một loại nguy hiểm 1a. Các mối nguy
TRẢ LỜI hiểm còn lại như sau :
■ Các phụ hoặc là loại nguy hiểm 2b :
MEM / WB.RegisterRd = ID / EX.RegisterRs2 = x2
■ Hai người phụ thuộc vào thêm phụ không phải là mối nguy hiểm vì tệp
đăng ký cung cấp dữ liệu phù hợp trong giai đoạn ID thêm.
■ Không có dữ liệu nguy hiểm giữa phụ và sw bởi vì sw đọc x2 chu kỳ
đồng hồ sau phụ viết x2.
Bởi vì một số hướng dẫn không viết sổ đăng ký, chính sách này là không chính
xác; đôi khi nó sẽ chuyển tiếp khi nó không nên. Một giải pháp đơn giản là kiểm tra
xem tín hiệu RegWrite có hoạt động hay không: kiểm tra trường điều khiển WB của
thanh ghi đường ống trong các giai đoạn EX và MEM xác định xem RegWrite có
được xác nhận hay không. Hãy nhớ lại rằng RISC-V yêu cầu mọi hoạt động sử dụng
x0 là một toán hạng phải mang lại giá trị toán hạng là 0. Nếu một hướng dẫn trong
đường ống có x0 là điểm đến của nó (cho
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình trệ 317

ví dụ, addi x0, x1, 2), chúng tôi muốn tránh chuyển tiếp giá trị kết quả khác không
có thể của nó. Không chuyển tiếp kết quả định mệnh x0 giải phóng lập trình viên
lắp ráp và trình biên dịch của bất kỳ yêu cầu nào để tránh sử dụng x0 như một
điểm đến. Do đó, các điều kiện trên hoạt động chính xác miễn là chúng tôi thêm
EX / MEM.RegisterRd ≠ 0 vào điều kiện nguy hiểm đầu tiên và MEM /
WB.RegisterRd ≠ 0 vào lần thứ hai.
Bây giờ chúng tôi có thể phát hiện các mối nguy hiểm, một nửa vấn đề đã
được giải quyết nhưng chúng tôi vẫn phải chuyển tiếp dữ liệu thích hợp.
Hình 4.55 cho thấy sự phụ thuộc giữa các thanh ghi đường ống và các đầu vào
đến ALU cho cùng một chuỗi mã như trong Hình 4.54 Sự thay đổi là sự phụ
thuộc bắt đầu từ a. đường ống đăng ký, thay vì chờ giai đoạn WB viết tệp đăng
ký. Do đó, dữ liệu cần thiết tồn tại kịp thời cho các hướng dẫn sau này, với các
thanh ghi đường ống giữ dữ liệu sẽ được chuyển tiếp.
Nếu chúng ta có thể lấy đầu vào cho ALU từ bất kỳ đăng ký đường ống thay
vì chỉ ID / EX, sau đó chúng tôi có thể chuyển tiếp dữ liệu chính xác. Bằng cách
thêm bộ ghép kênh vào đầu vào
Thời gian (theo chu kỳ
đồng hồ)
CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8 CC 9
giá trị của thanh ghi Cẩu2 Cẩu
x2 : 10 10 10 10 10 / Cẩu20 0 Cẩu20 Cẩu20 20

Chương trình
thi công
đặt hàng
(theo hướng dẫn)

phụ x2, x1, x3 IM Reg DM Reg

và x12 , x2, x5 IM Reg DM Reg

hoặc x13, x6 , x2
IM Reg DM Reg

thêm x14 , x2, x2


IM Reg DM Reg

sw x15, 100 (x2)


IM Reg DM Reg

HÌNH 4.55 Sự phụ thuộc giữa các thanh ghi đường ống di chuyển về phía trước theo thời gian, do đó có thể cung cấp
các đầu vào cho ALU cần thiết và hướng dẫn và hoặc là hướng dẫn bằng cách chuyển tiếp các kết quả tìm thấy trong
các thanh ghi đường ống. Các giá trị trong các thanh ghi đường ống cho thấy giá trị mong muốn có sẵn trước khi nó được ghi vào tệp
thanh ghi. Chúng tôi giả định rằng tệp đăng ký chuyển tiếp các giá trị được đọc và ghi trong cùng một chu kỳ đồng hồ, do đó, phần bổ sung
không bị đình trệ, nhưng các giá trị đến từ tệp đăng ký thay vì đăng ký đường ống. Đăng ký tập tin Chuyển tiếp trực tuyến, đó là, đọc nhận
được giá trị của ghi trong chu kỳ đồng hồ đó là lý do tại sao chu kỳ đồng hồ 5 hiển thị thanh ghi x2 có giá trị 10 ở đầu và −20 ở cuối chu kỳ
đồng hồ.
318 Chương 4 Bộ xử lý

ID / EX EX / MEM MEM / WB

Đăng ký
ALU

Dữ liệu
ký ức

a. Không chuyển tiếp

EX / MEM /
ID / EX MEM WB

Chuyển
Đăng ký tiếpA
ALU

Dữ liệu
ký ức

Chuyển tiếpB

1 rupee
2 rupee EX / MEM.RegisterRd
Rd

Chuyển tiếp
MEM / WB.RegisterRd
đơn vị

b. Với chuyển tiếp

HÌNH 4.56 Trên cùng là ALU và các thanh ghi đường ống trước khi thêm chuyển tiếp. Trên
phía dưới, các bộ ghép kênh đã được mở rộng để thêm các đường dẫn chuyển tiếp và chúng tôi hiển thị đơn
vị chuyển tiếp. Phần cứng mới được hiển thị màu. Hình này là một bản vẽ cách điệu, tuy nhiên, để lại chi
tiết từ datapath đầy đủ như phần cứng mở rộng dấu hiệu.
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình trệ 319

HÌNH 4.57 Các giá trị điều khiển cho bộ ghép kênh chuyển tiếp trong Hình 4.56.Việc ký kết
ngay lập tức đó là một đầu vào khác cho ALU được mô tả trong Xây dựng ở cuối phần này.

của ALU và với các điều khiển thích hợp, chúng ta có thể chạy đường ống ở tốc
độ tối đa với sự có mặt của các mối nguy dữ liệu này.
Hiện tại, chúng tôi sẽ giả sử các hướng dẫn duy nhất chúng tôi cần chuyển tiếp
là bốn hướng dẫn định dạng R : thêm, phụ, và, và hoặc là.Hình 4.56 hiển thị cận
cảnh ALU và đăng ký đường ống trước và sau khi thêm chuyển tiếp. Hình 4.57
hiển thị các giá trị của các dòng điều khiển cho bộ ghép kênh ALU chọn giá trị
tệp đăng ký hoặc một trong các giá trị được chuyển tiếp.
Điều khiển chuyển tiếp này sẽ ở giai đoạn EX, bởi vì bộ ghép kênh chuyển
tiếp ALU được tìm thấy trong giai đoạn đó. Do đó, chúng ta phải chuyển các số
đăng ký toán hạng từ giai đoạn ID thông qua thanh ghi đường ống ID / EX để xác
định xem có nên chuyển tiếp giá trị hay không. Trước khi chuyển tiếp, thanh ghi
ID / EX không cần bao gồm khoảng trắng để giữ các trường rs1 và rs2. Do đó,
chúng đã được thêm vào ID / EX .
Bây giờ hãy viết cả hai điều kiện để phát hiện các mối nguy hiểm và các tín
hiệu điều khiển để giải quyết chúng :
1. Nguy hiểm EX :
nếu (EX / MEM.RegWrite
và (EX / MEM.RegisterRd ≠ 0)
và (EX / MEM.RegisterRd = ID / EX.RegisterRs1)) ForwardA = 10
nếu (EX / MEM.RegWrite
và (EX / MEM.RegisterRd ≠ 0)
và (EX / MEM.RegisterRd = ID / EX.RegisterRs2)) ForwardB = 10

Trường hợp này chuyển tiếp kết quả từ hướng dẫn trước sang đầu vào
của ALU. Nếu hướng dẫn trước sẽ ghi vào tệp đăng ký, và số đăng ký ghi
khớp với số đăng ký đọc của ALU đầu vào A hoặc B, miễn là nó không
đăng ký 0, sau đó điều khiển bộ ghép kênh để chọn giá trị thay vì từ thanh
ghi đường ống EX / MEM .
2. Nguy cơ MEM :
nếu (MEM / WB.RegWrite
và (MEM / WB.RegisterRd ≠ 0)
và (MEM / WB.RegisterRd = ID / EX.RegisterRs1)) ForwardA = 01
320 Chương 4 Bộ xử lý

nếu (MEM / WB.RegWrite


và (MEM / WB.RegisterRd ≠ 0)
và (MEM / WB.RegisterRd = ID / EX.RegisterRs2)) ForwardB = 01

Như đã đề cập ở trên, không có mối nguy hiểm nào trong giai đoạn WB, bởi
vì chúng tôi cho rằng tệp đăng ký cung cấp kết quả chính xác nếu hướng dẫn
trong giai đoạn ID đọc cùng một thanh ghi được viết bởi hướng dẫn trong giai
đoạn WB. Một tệp đăng ký như vậy thực hiện một hình thức chuyển tiếp khác,
nhưng nó xảy ra trong tệp đăng ký.
Một biến chứng là các mối nguy dữ liệu tiềm ẩn giữa kết quả của hướng dẫn trong giai
đoạn WB, kết quả của hướng dẫn trong giai đoạn MEM và toán hạng nguồn của hướng
dẫn trong giai đoạn ALU. Ví dụ: khi tổng hợp một vectơ số trong một thanh ghi, một
chuỗi các hướng dẫn sẽ đọc và ghi vào cùng một thanh ghi :

thêm x1, x1, x2


thêm x1, x1, x3
thêm x1, x1, x4
...

Trong trường hợp này, kết quả sẽ được chuyển tiếp từ giai đoạn MEM vì kết
quả trong giai đoạn MEM là kết quả gần đây hơn. Do đó, kiểm soát đối với mối
nguy MEM sẽ là (với các bổ sung được tô sáng) :
nếu (MEM / WB.RegWrite
và (MEM / WB.RegisterRd ≠ 0)
và không (EX / MEM.RegWrite và (EX / MEM.RegisterRd ≠ 0)
và (EX / MEM.RegisterRd = ID / EX.RegisterRs1))
và (MEM / WB.RegisterRd = ID / EX.RegisterRs1)) ForwardA = 01

nếu (MEM / WB.RegWrite


và (MEM / WB.RegisterRd ≠ 0)
và không (EX / MEM.RegWrite và (EX / MEM.RegisterRd ≠ 0)
và (EX / MEM.RegisterRd = ID / EX.RegisterRs2))
và (MEM / WB.RegisterRd = ID / EX.RegisterRs2)) ForwardB = 01

Hình 4.58 hiển thị phần cứng cần thiết để hỗ trợ chuyển tiếp cho các hoạt động sử
dụng kết quả trong giai đoạn EX. Lưu ý rằng trường EX / MEM.RegisterRd là đích
đăng ký cho lệnh ALU hoặc tải.
Nếu bạn muốn xem các ví dụ minh họa hơn bằng cách sử dụng bản vẽ đường
ống một chu kỳ , Mục 4.14 có số liệu cho thấy hai đoạn mã RISC-V với mối
nguy hiểm gây ra chuyển tiếp.

Xây dựng: Chuyển tiếp cũng có thể giúp đỡ với các mối nguy hiểm khi hướng dẫn cửa
hàng phụ thuộc vào các hướng dẫn khác. Vì họ chỉ sử dụng một giá trị dữ liệu trong giai
đoạn MEM, nên việc chuyển tiếp rất dễ dàng. Tuy nhiên, hãy xem xét tải ngay sau các cửa
hàng, hữu ích khi thực hiện các bản sao bộ nhớ trong kiến trúc RISC-V. Vì các bản sao là
thường xuyên, chúng tôi cần thêm phần cứng chuyển tiếp để làm cho chúng chạy nhanh
hơn.
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình trệ 321

ID / EX
WB
EX / MEM
Điều khiển M WB MEM / WB
NẾU /
ID EX M WB

Hướng dẫn

Đăng ký
ALU
Hướng dẫn
PC
ký ức Dữ liệu
ký ức

IF /
ID.RegisterRs1 1 rupee
IF /
ID.RegisterRs2 2 rupee
IF / ID.RegisterRd Rd EX / MEM.RegisterRd

Chuyển tiếp MEM / WB.RegisterRd


đơn vị

HÌNH 4.58 Datapath được sửa đổi để giải quyết các mối nguy hiểm thông qua chuyển tiếp. So với datapath trong Hình 4.53,
các bổ sung là bộ ghép kênh cho các đầu vào của ALU. Tuy nhiên, hình này là một bản vẽ cách điệu hơn, để lại các chi tiết từ datapath đầy
đủ, chẳng hạn như phần cứng nhánh và phần cứng mở rộng dấu hiệu.

Nếu chúng ta vẽ lại Hình 4.55, thay thế phụ và và hướng dẫn với lw và sw, chúng ta
sẽ thấy rằng có thể tránh được một gian hàng, vì dữ liệu tồn tại trong MEM / WB
đăng ký một hướng dẫn tải kịp thời để sử dụng nó trong giai đoạn MEM của hướng
dẫn lưu trữ. Chúng ta sẽ cần thêm chuyển tiếp vào giai đoạn truy cập bộ nhớ cho tùy
chọn này. Chúng tôi để lại sửa đổi này như là một bài tập cho người đọc.
Ngoài ra, đầu vào ngay lập tức đã ký vào ALU, cần thiết bởi tải và cửa hàng, bị thiếu
trong datapath Hình 4.58 Do kiểm soát trung tâm quyết định giữa thanh ghi và ngay lập
tức và vì đơn vị chuyển tiếp chọn thanh ghi đường ống cho đầu vào thanh ghi vào ALU,
giải pháp dễ nhất là thêm bộ ghép kênh 2: 1 chọn giữa đầu ra bộ ghép kênh ForwardB và
ngay lập tức đã ký. Hình 4.59 cho thấy sự bổ sung này.

Nguy cơ dữ liệu và quầy hàng


Như chúng tôi đã nói Mục 4.6, một trường hợp chuyển tiếp không thể lưu ngày Nếu lúc đầu bạn
là khi một lệnh cố đọc một thanh ghi theo một lệnh tải viết cùng một thanh ghi. không thành
Hình 4.60 minh họa vấn đề. Dữ liệu vẫn đang được đọc từ bộ nhớ trong chu kỳ công, hãy xác
đồng hồ 4 trong khi ALU đang thực hiện thao tác cho hướng dẫn sau. Một cái gì định lại thành
đó phải dừng đường ống cho sự kết hợp tải theo sau là một hướng dẫn đọc kết
công.
quả của nó.
Vô danh
Do đó, ngoài một đơn vị chuyển tiếp, chúng ta cần a đơn vị phát hiện nguy
hiểmNó hoạt động trong giai đoạn ID để có thể chèn gian hàng giữa tải và.
322 Chương 4 Bộ xử lý

MEM /
ID / EX EX / MEM WB

Đăng ký
ALUSrc
ALU

Dữ liệu
ký ức

Chuyển tiếp
đơn vị

HÌNH 4.59 Cận cảnh datapath trong Hình 4.56 hiển thị bộ ghép kênh 2: 1, đã được thêm vào để chọn đầu vào ALU
được ký ngay lập tức.

hướng dẫn phụ thuộc vào nó. Kiểm tra hướng dẫn tải, điều khiển cho đơn vị phát
hiện nguy hiểm là điều kiện duy nhất này :
nếu (ID / EX.MemRead và
((ID / EX.RegisterRd = IF / ID.RegisterRs1) hoặc (ID /
EX.RegisterRd = IF / ID.RegisterRs2))) dừng đường ống

Hãy nhớ lại rằng chúng tôi đang sử dụng RegisterRd để giới thiệu thanh ghi được
chỉ định trong các bit lệnh 11: 7 cho cả hướng dẫn tải và loại R. Dòng đầu tiên kiểm
tra xem hướng dẫn có phải là tải hay không: lệnh duy nhất đọc bộ nhớ dữ liệu là tải.
Hai dòng tiếp theo kiểm tra xem trường đăng ký đích của tải trong giai đoạn EX có
khớp với thanh ghi nguồn của lệnh trong giai đoạn ID hay không. Nếu điều kiện giữ,
hướng dẫn sẽ dừng một chu kỳ đồng hồ. Sau gian hàng một chu kỳ này, logic chuyển
tiếp có thể xử lý sự phụ thuộc và tiến hành thực hiện. (Nếu không có chuyển tiếp, thì
hướng dẫn trong Hình 4.60 sẽ cần một chu kỳ gian hàng khác.)
Nếu hướng dẫn trong giai đoạn ID bị đình trệ, thì hướng dẫn trong giai đoạn IF
cũng phải bị đình trệ; nếu không, chúng tôi sẽ mất hướng dẫn tìm nạp. Ngăn chặn hai
hướng dẫn này để đạt được tiến bộ được thực hiện đơn giản bằng cách ngăn chặn
4.8 Nguy cơ dữ liệu: Chuyển tiếp so với đình trệ 323

Thời gian (theo chu kỳ đồng hồ)


CC1 CC2 CC3 CC4 CC5 CC6 CC7 CC8 CC9

Chương trình
thi công
đặt hàng
(theo hướng dẫn)

lw x2, 20 (x1) IM Reg DM Reg

và x4, x2, x5 Reg


IM DM Reg

hoặc x8, x2, x6 Reg


IM DM Reg

thêm x9, x4, x2 Reg


IM DM Reg

phụ x1, x6, x7 Reg


IM DM Reg

HÌNH 4.60 Một chuỗi các hướng dẫn. Vì sự phụ thuộc giữa tải và hướng dẫn sau (và) đi ngược thời gian, mối nguy hiểm này không thể được
giải quyết bằng cách chuyển tiếp. Do đó, sự kết hợp này phải dẫn đến một gian hàng bởi đơn vị phát hiện nguy hiểm.

thanh ghi PC và thanh ghi đường ống IF / ID thay đổi. Với điều kiện các thanh
ghi này được bảo tồn, hướng dẫn trong giai đoạn IF sẽ tiếp tục được đọc bằng
cùng một PC và các thanh ghi trong giai đoạn ID sẽ tiếp tục được đọc bằng cách
sử dụng cùng các trường lệnh trong thanh ghi đường ống IF / ID. Quay trở lại sự
tương tự yêu thích của chúng tôi, nó như thể bạn khởi động lại máy giặt với cùng
một bộ quần áo và để máy sấy tiếp tục đổ rỗng. Tất nhiên, giống như máy sấy,
nửa sau của đường ống bắt đầu với giai đoạn EX phải làm gì đó; những gì nó
đang làm là thực hiện các hướng dẫn không có tác dụng : Rất tiếc. Rất tiếc Một chỉ dẫn
Làm thế nào chúng ta có thể chèn các nút này, hoạt động như bong bóng, vào không có hoạt động để
đường ống? Trong Hình 4.51, chúng ta thấy rằng việc phân tách tất cả bảy tín hiệu thay đổi trạng thái.
điều khiển (đặt chúng thành 0) trong EX , Các giai đoạn MEM và WB sẽ tạo ra một
hướng dẫn không làm gì cả. Bằng cách xác định mối nguy hiểm trong giai đoạn ID,
chúng ta có thể chèn bong bóng vào đường ống bằng cách thay đổi các trường kiểm
soát EX, MEM và WB của đăng ký đường ống ID / EX thành 0. Các giá trị điều
khiển lành tính này được tô màu về phía trước tại mỗi chu kỳ đồng hồ có hiệu lực
phù hợp: không có thanh ghi hoặc bộ nhớ nào được viết nếu tất cả các giá trị điều
khiển là 0.
Hình 4.44 cho thấy những gì thực sự xảy ra trong phần cứng: khe thực hiện đường ống
liên kết với và hướng dẫn được biến thành một nop và tất cả các hướng dẫn bắt đầu
324 Chương 4 Bộ xử lý

Thời gian (theo chu kỳ


đồng hồ) CC 9 CC 10
CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8

Chương trình
thi công
đặt hàng
(theo hướng dẫn)

lw x2, 20 (x1) IM Reg DM Reg

bong bóng
và trở thành
không IM Reg DM Reg

và x4, x2, x5 IM Reg DM Reg

hoặc x8 , x2, x6 IM Reg DM Reg

Reg
thêm x9 , x4, x2 IM Reg DM

HÌNH 4.61 Cách các quầy hàng thực sự được đưa vào đường ống. Một bong bóng được chèn bắt đầu trong chu kỳ đồng hồ 4,
bằng cách thay đổi và hướng dẫn cho một nop. Lưu ý rằng hướng dẫn và thực sự được tìm nạp và giải mã trong chu kỳ đồng hồ 2 và 3,
nhưng giai đoạn EX của nó bị trì hoãn cho đến chu kỳ đồng hồ 5 (so với vị trí không được đặt trong chu kỳ đồng hồ 4). Tương tự, hướng
dẫn hoặc được tìm nạp trong chu kỳ đồng hồ 3, nhưng giai đoạn ID của nó bị trì hoãn cho đến chu kỳ đồng hồ 5 (so với vị trí chu kỳ 4 của
đồng hồ không được cài đặt). Sau khi chèn bong bóng, tất cả các phụ thuộc đều đi về phía trước kịp thời và không có mối nguy hiểm nào
nữa xảy ra.

với và hướng dẫn bị trì hoãn một chu kỳ. Giống như một bong bóng khí trong
ống nước, một bong bóng gian hàng làm trì hoãn mọi thứ đằng sau nó và tiến
xuống ống dẫn hướng một giai đoạn mỗi chu kỳ đồng hồ cho đến khi nó thoát ra
ở cuối. Trong ví dụ này, các mối nguy hiểm buộc và và hoặc là hướng dẫn lặp lại
trong chu kỳ đồng hồ 4 những gì họ đã làm trong chu kỳ đồng hồ 3 : và đọc các
thanh ghi và giải mã, và hoặc là được tinh chỉnh từ bộ nhớ lệnh. Như vậy công
việc lặp đi lặp lại là những gì một gian hàng trông như thế nào, nhưng hiệu quả
của nó là kéo dài thời gian của và và hoặc là hướng dẫn và trì hoãn việc tìm nạp
thêm chỉ dẫn.
Hình 4.62 làm nổi bật các kết nối đường ống cho cả phát hiện nguy hiểm đơn vị và
đơn vị chuyển tiếp. Như trước đây, đơn vị chuyển tiếp kiểm soát các bộ ghép kênh
ALU để thay thế giá trị từ một thanh ghi mục đích chung bằng giá trị từ thanh ghi
đường ống thích hợp. Đơn vị phát hiện nguy hiểm kiểm soát việc ghi các thanh ghi
PC và IF / ID cộng với bộ ghép kênh chọn giữa các giá trị điều khiển thực và tất cả 0s.
Đơn vị phát hiện nguy hiểm ngăn chặn và phân tích các trường kiểm soát nếu thử
nghiệm nguy cơ sử dụng tải ở trên là đúng. Nếu bạn muốn xem thêm chi tiết ,
Mục 4.14 đưa ra một ví dụ minh họa bằng cách sử dụng sơ đồ đường ống đơn
đồng hồ mã RISC-V với các mối nguy hiểm gây ra sự đình trệ.
Kiểm soát các mối
4.9 nguy hiểm 325

Nguy hiểm ID / EX.MemRead


phát hiện

DWrit
đơn vị

IF /

e
WB
ID / EX
EX / MEM
PCWrite

Điều khiển M WB MEM / WB


NẾU / ID 0 EX M WB
Hướng
dẫn

Hướng dẫn Đăng ký


Chuyển tiếpA ALU
PC
ký ức Dữ liệu
ký ức

Chuyển tiếpB
IF /
ID.RegisterRs1
IF /
ID.RegisterRs2

IF / ID.RegisterRd Rd

1 rupee Chuyển tiếp


2 rupee đơn vị

HÌNH 4.62 Tổng quan về điều khiển đường ống, hiển thị hai bộ ghép kênh để chuyển tiếp, bộ phát hiện nguy hiểm và
bộ phận chuyển tiếp. Mặc dù các giai đoạn ID và EX đã được đơn giản hóa, nhưng logic mở rộng ngay lập tức và logic nhánh bị thiếu
bản vẽ này đưa ra bản chất của các yêu cầu phần cứng chuyển tiếp.

Các
Mặc dù trình biên dịch thường dựa vào phần cứng để giải quyết các mối
nguy hiểm và do đó đảm bảo thực hiện đúng, trình biên dịch phải hiểu LỚN
đường ống để đạt được hiệu suất tốt nhất. Nếu không, các quầy hàng bất Hình ảnh
ngờ sẽ làm giảm hiệu suất của mã được biên dịch.

Xây dựng: Về nhận xét trước đó về việc đặt các dòng điều khiển thành 0 để tránh
ghi các thanh ghi hoặc bộ nhớ: chỉ các tín hiệu RegWrite và MemWrite cần là 0, trong
khi các tín hiệu điều khiển khác có thể được don don quan tâm.
Mục 4.6, cũng có
những mối nguy đường
ống liên quan đến các
4.9 Kiểm soát các mối nguy hiểm nhánh có điều kiện.
Hình 4.63 hiển thị một
chuỗi các hướng dẫn và
Cho đến nay, chúng tôi đã giới hạn mối quan tâm của chúng tôi đối với các mối nguy
liên quan đến hoạt động số học và truyền dữ liệu. Tuy nhiên, như chúng ta đã thấy
Có một ngàn hack tại các nhánh của cái ác đối với một người đang nổi bật ở
gốc.
Henry David Thoreau , Walden, 1854
326 Chương 4 Bộ xử lý

cho biết khi nào chi nhánh sẽ xảy ra trong đường ống này. Một hướng dẫn phải
được tìm nạp ở mọi chu kỳ đồng hồ để duy trì đường ống, tuy nhiên trong thiết
kế của chúng tôi, quyết định về việc có nên phân nhánh không xảy ra cho đến
giai đoạn đường ống MEM. Như đã đề cập trong Mục 4.6, sự chậm trễ này trong
việc xác định hướng dẫn thích hợp để tìm nạp được gọi là a kiểm soát nguy cơ
hoặc là nguy hiểm chi nhánh, trái ngược với mối nguy dữ liệu chúng tôi vừa kiểm
tra.
Phần này về các mối nguy kiểm soát ngắn hơn các phần trước về các mối nguy
dữ liệu. Lý do là các mối nguy kiểm soát tương đối đơn giản để hiểu, chúng xảy
ra ít thường xuyên hơn các mối nguy dữ liệu và không có gì hiệu quả chống lại
các mối nguy kiểm soát vì chuyển tiếp chống lại các mối nguy dữ liệu. Do đó,
chúng tôi sử dụng các chương trình đơn giản hơn. Chúng tôi xem xét hai kế
hoạch để giải quyết các mối nguy kiểm soát và một tối ưu hóa để cải thiện các
chương trình này.

Giả sử chi nhánh không được thực hiện


Như chúng ta đã thấy Mục 4.6, bị đình trệ cho đến khi chi nhánh hoàn thành là
quá chậm. Một cải tiến so với đình trệ chi nhánh là dự đoán rằng nhánh có điều
kiện sẽ không được thực hiện và do đó tiếp tục thực hiện xuống luồng lệnh tuần
tự. Nếu nhánh có điều kiện được thực hiện, các hướng dẫn đang được tìm nạp và
giải mã phải được loại bỏ. Thi hành tiếp tục tại mục tiêu chi nhánh. Nếu các
nhánh có điều kiện được tháo ra một nửa thời gian và nếu chi phí ít để loại bỏ các
tuôn ra Để loại bỏ hướng dẫn, tối ưu hóa này sẽ giảm một nửa chi phí cho các mối nguy kiểm soát.
hướng dẫn trong một Để loại bỏ các hướng dẫn, chúng tôi chỉ thay đổi các giá trị điều khiển ban đầu
đường ống, thường là do thành 0, giống như chúng tôi đã làm để ngăn chặn nguy cơ sử dụng dữ liệu tải. Sự
một sự kiện bất ngờ. khác biệt là chúng ta cũng phải thay đổi ba hướng dẫn trong các giai đoạn IF, ID và
EX khi nhánh đạt đến giai đoạn MEM; đối với các quầy hàng sử dụng tải, chúng tôi
chỉ thay đổi điều khiển thành 0 trong giai đoạn ID và để chúng thấm qua đường ống.
Loại bỏ các hướng dẫn, sau đó, có nghĩa là chúng ta phải có khả năng tuôn ra hướng
dẫn trong các giai đoạn IF, ID và EX của đường ống.

Giảm sự chậm trễ của các chi nhánh


Một cách để cải thiện hiệu suất chi nhánh có điều kiện là giảm chi phí của chi
nhánh đã lấy. Cho đến nay, chúng tôi đã giả định PC tiếp theo cho một nhánh
được chọn trong giai đoạn MEM, nhưng nếu chúng tôi di chuyển thực thi nhánh
có điều kiện sớm hơn trong đường ống, thì cần phải có ít hướng dẫn hơn. Di
chuyển quyết định chi nhánh lên đòi hỏi hai hành động xảy ra sớm hơn: tính toán
địa chỉ mục tiêu chi nhánh và đánh giá quyết định chi nhánh. Phần dễ dàng của
thay đổi này là để tăng tính toán địa chỉ chi nhánh. Chúng tôi đã có giá trị PC và
trường ngay lập tức trong thanh ghi đường ống IF / ID, vì vậy chúng tôi chỉ cần
di chuyển trình bổ sung nhánh từ giai đoạn EX sang giai đoạn ID; tất nhiên, việc
tính toán địa chỉ cho các mục tiêu chi nhánh sẽ được thực hiện cho tất cả các
hướng dẫn, nhưng chỉ được sử dụng khi cần thiết.
Phần khó hơn là quyết định chi nhánh. Đối với nhánh nếu bằng nhau, chúng tôi sẽ
so sánh hai lần đọc đăng ký trong giai đoạn ID để xem chúng có bằng nhau không.
Bình đẳng có thể
được kiểm tra bằng
cách XOR các vị trí
bit riêng lẻ của hai
thanh ghi và HOẶC
kết quả XORed. (Đầu
ra bằng 0 của cổng
OR có nghĩa là hai
thanh ghi bằng nhau.)
Di chuyển
4.9 Kiểm soát các mối nguy hiểm 327

thử nghiệm nhánh đến giai đoạn ID ngụ ý phần cứng phát hiện mối nguy và
chuyển tiếp bổ sung, vì một nhánh phụ thuộc vào kết quả vẫn còn trong đường
ống vẫn phải hoạt động đúng với tối ưu hóa này. Ví dụ: để triển khai nhánh nếu
bằng (và nghịch đảo của nó), chúng ta sẽ cần chuyển tiếp kết quả đến logic kiểm
tra đẳng thức hoạt động trong ID. Có hai yếu tố phức tạp :

1. Trong ID, chúng ta phải giải mã hướng dẫn, quyết định xem có cần bỏ qua
đơn vị kiểm tra đẳng thức hay không và hoàn thành kiểm tra đẳng thức để nếu
hướng dẫn là một nhánh, chúng ta có thể đặt PC thành địa chỉ mục tiêu nhánh.
Chuyển tiếp cho toán hạng của các nhánh trước đây được xử lý bởi logic
chuyển tiếp ALU, nhưng việc giới thiệu đơn vị kiểm tra đẳng thức trong ID sẽ
yêu cầu logic chuyển tiếp mới. Lưu ý rằng các toán hạng nguồn bị bỏ qua của
một nhánh có thể đến từ các thanh ghi đường ống EX / MEM hoặc MEM /
WB.
2. Bởi vì giá trị trong so sánh chi nhánh là cần thiết trong ID nhưng có thể
được tạo ra sau đó, có thể xảy ra nguy cơ dữ liệu và sẽ cần một gian hàng.
Ví dụ: nếu một lệnh ALU ngay trước một nhánh tạo ra toán hạng cho thử
nghiệm trong nhánh có điều kiện, thì sẽ cần một gian hàng, vì giai đoạn
EX cho lệnh ALU sẽ xảy ra sau chu kỳ ID của nhánh. Bằng cách mở rộng,
nếu một tải ngay lập tức theo sau bởi một nhánh có điều kiện phụ thuộc
vào kết quả tải, hai chu kỳ gian hàng sẽ là cần thiết, là kết quả từ tải xuất
hiện ở cuối chu trình MEM nhưng cần thiết ở đầu ID cho nhánh.

Mặc dù có những khó khăn này, việc chuyển việc thực hiện nhánh có điều kiện
sang giai đoạn ID là một sự cải tiến, bởi vì nó làm giảm hình phạt của một nhánh chỉ
còn một hướng dẫn nếu nhánh được thực hiện, cụ thể là, hiện đang được tìm nạp.
Các bài tập khám phá các chi tiết của việc thực hiện đường chuyển tiếp và phát hiện
mối nguy hiểm.
Để xóa các hướng dẫn trong giai đoạn IF, chúng tôi thêm một dòng điều khiển,
được gọi IF.Flush, số không đó là trường lệnh của thanh ghi đường ống IF / ID.
Xóa thanh ghi sẽ chuyển đổi hướng dẫn tìm nạp thành a không, một hướng dẫn
không có hành động và thay đổi không có trạng thái.

Chi nhánh đường ống

Hiển thị những gì xảy ra khi nhánh được thực hiện trong chuỗi lệnh này, giả
sử đường ống được tối ưu hóa cho các nhánh không được thực hiện và chúng VÍ DỤ
tôi đã chuyển thực thi nhánh sang giai đoạn ID :
36 phụ x10, x4, x8
40 beq x1 , x3, 16 // Chi nhánh tương đối PC đến 40 + 16 * 2 = 72
44 và x12 , x2 , x5
48 hoặc x13 , x2 , x6
328 Chương 4 Bộ xử lý

Thời gian (theo chu kỳ


đồng hồ)
CC 1 CC 2 CC 3 CC 4 CC 5 CC 6 CC 7 CC 8 CC 9

Chương trình
thi công
đặt hàng
(theo hướng dẫn)

40 beq x1, x0, 16 Reg


IM DM Reg

44 và x12, x2, x5 Reg


IM DM Reg

48 hoặc x13, x6, x2 Reg


IM DM Reg

52 thêm x14, x2, x2 Reg


IM DM Reg

72 lw x4, 100 (x7)


IM Reg DM Reg

HÌNH 4.63 Tác động của đường ống đến hướng dẫn nhánh. Các số ở bên trái của hướng dẫn (40, 44 , ...) là địa chỉ của các
hướng dẫn. Vì hướng dẫn nhánh quyết định có phân nhánh trong chu kỳ đồng hồ MEM giai đoạn 4 cho hướng dẫn beq ở trên, nên ba hướng
dẫn tuần tự theo nhánh sẽ được tìm nạp và bắt đầu thực hiện. Nếu không có sự can thiệp, ba hướng dẫn sau đây sẽ bắt đầu thực hiện trước
khi các nhánh beq đến lw tại vị trí 72. (Hình 4.33 giả định phần cứng bổ sung để giảm nguy cơ điều khiển xuống một chu kỳ đồng hồ; con
số này sử dụng datapath không được tối ưu hóa.)

Thêm 52 x14 , x4 , x2
56 phụ x15 , x6 , x7
...
72 lw x4, 50 (x7)

Hình 4.64 cho thấy những gì xảy ra khi một nhánh có điều kiện được thực
TRẢ LỜI
hiện. Không giống Hình 4.63, chỉ có một bong bóng đường ống trên một
nhánh.

Dự đoán chi nhánh động


Giả sử một nhánh có điều kiện không được thực hiện là một hình thức đơn giản dự
đoán chi nhánhTrong trường hợp đó, chúng tôi dự đoán rằng các nhánh có điều kiện
không được thực
hiện, xả đường
ống khi chúng tôi
sai. Đối với đường
ống năm giai đoạn
đơn giản, cách tiếp
cận như vậy ,.
4.9 Kiểm soát các mối nguy hiểm

HÌNH 4.64 Giai đoạn ID của chu kỳ đồng hồ 3 xác định rằng phải lấy một nhánh, vì vậy nó chọn 72 làm địa chỉ PC tiếp
theo và số không hướng dẫn được tìm nạp cho chu kỳ đồng hồ tiếp theo. Chu kỳ đồng hồ 4 hiển thị hướng dẫn tại vị trí 72
tìm nạp và hướng dẫn bong bóng hoặc nop duy nhất trong đường ống vì nhánh đã lấy.
330 Chương 4 Bộ xử lý

có thể kết hợp với dự đoán dựa trên trình biên dịch, có lẽ là đủ. Với các đường
ống sâu hơn, hình phạt nhánh tăng lên khi được đo theo chu kỳ đồng hồ. Tương
tự, với nhiều vấn đề (xem Mục 4.11), hình phạt chi nhánh tăng theo hướng dẫn bị
mất. Sự kết hợp này có nghĩa là trong một đường ống tích cực, một sơ đồ dự đoán
tĩnh đơn giản có thể sẽ lãng phí quá nhiều hiệu suất. Như chúng tôi đã đề cập
trong Mục 4.6, với nhiều phần cứng hơn có thể cố gắng dự đoán hành vi chi
dự đoán nhánh động nhánh trong quá trình thực hiện chương trình.
Dự đoán của chi nhánh Một cách tiếp cận là tìm kiếm địa chỉ của hướng dẫn để xem liệu nhánh có
tại thời gian chạy sử dụng
điều kiện được thực hiện lần cuối cùng lệnh này được thực thi hay không, và nếu
thông tin thời gian chạy.
vậy, để bắt đầu tìm nạp các hướng dẫn mới từ cùng một nơi như lần trước. Kỹ
bộ đệm dự đoán
thuật này được gọi dự đoán nhánh động.
nhánh Cũng được Một thực hiện của phương pháp đó là a bộ đệm dự đoán nhánh hoặc là chi
gọi nhánh lịch sử bàn. Một bộ đệm dự đoán nhánh là một bộ nhớ nhỏ được lập chỉ
lịch sử chi nhánh bàn. mục bởi thấp hơn một phần địa chỉ của hướng dẫn chi nhánh. Bộ nhớ chứa một
Một bộ nhớ nhỏ được lập chút cho biết liệu nhánh gần đây có được lấy hay không.
chỉ mục bởi phần dưới Dự đoán này sử dụng loại bộ đệm đơn giản nhất; Trên thực tế, chúng tôi không
của địa chỉ của lệnh biết, nếu dự đoán là đúng một thì nó có thể được đặt ở đó bởi một nhánh có điều
nhánh và chứa một hoặc
kiện khác có cùng bit địa chỉ bậc thấp. Tuy nhiên, điều này không ảnh hưởng đến
nhiều bit cho biết liệu
nhánh đó có được lấy gần
tính chính xác. Dự đoán chỉ là một gợi ý mà chúng tôi hy vọng là chính xác để
đây hay không. việc tìm nạp bắt đầu theo hướng dự đoán. Nếu gợi ý hóa ra là sai, các hướng dẫn
dự đoán không chính xác sẽ bị xóa, bit dự đoán được đảo ngược và được lưu lại
và trình tự thích hợp được tìm nạp và thực thi.
Sơ đồ dự đoán 1 bit đơn giản này có một thiếu sót về hiệu suất: ngay cả khi
một nhánh có điều kiện hầu như luôn được thực hiện, chúng ta có thể dự đoán
không chính xác hai lần, thay vì một lần, khi nó không được thực hiện. Ví dụ sau
đây cho thấy tình huống khó xử này.

Vòng lặp và Dự đoán


VÍ DỤ
Hãy xem xét một nhánh vòng lặp phân nhánh chín lần liên tiếp, và sau đó
không được thực hiện một lần. Độ chính xác dự đoán cho nhánh này là gì,
giả sử bit dự đoán cho nhánh này vẫn nằm trong bộ đệm dự đoán?

Hành vi dự đoán trạng thái ổn định sẽ dự đoán sai về các lần lặp đầu tiên và
TRẢ LỜI cuối cùng. Việc dự đoán lần lặp cuối cùng là không thể tránh khỏi vì bit dự
đoán sẽ chỉ ra, vì nhánh đã được thực hiện chín lần liên tiếp tại thời điểm đó.
Việc xác định sai về lần lặp đầu tiên xảy ra do bit được lật khi thực hiện lần
lặp cuối cùng của vòng lặp, vì nhánh không được thực hiện trên lần lặp đó.
Do đó, độ chính xác dự đoán cho nhánh này được thực hiện 90% thời gian
chỉ là 80% (hai dự đoán không chính xác và tám dự đoán chính xác).
4.9 Kiểm soát các mối nguy hiểm 331

Lý tưởng nhất là độ chính xác của bộ dự đoán sẽ khớp với tần số nhánh đã lấy cho
các nhánh rất đều đặn này. Để khắc phục điểm yếu này, chúng ta có thể sử dụng
nhiều bit dự đoán hơn. Trong sơ đồ 2 bit, một dự đoán phải sai hai lần trước khi nó
được thay đổi. Hình 4.65 hiển thị máy trạng thái hữu hạn cho sơ đồ dự đoán 2 bit.
Một bộ đệm dự đoán nhánh có thể được thực hiện dưới dạng một bộ đệm nhỏ, đệm mục tiêu nhánh
đặc biệt được truy cập với địa chỉ lệnh trong giai đoạn ống IF. Nếu hướng dẫn Một cấu trúc lưu trữ PC
được dự đoán là đã thực hiện, quá trình tìm nạp bắt đầu từ mục tiêu ngay khi PC đích hoặc hướng dẫn
được biết đến; như đã đề cập ở trang 308, nó có thể sớm nhất là giai đoạn ID. đích cho một nhánh. Nó
thường được tổ chức
Nếu không, tìm nạp tuần tự và thực hiện tiếp tục. Nếu dự đoán hóa ra là sai, các dưới dạng bộ đệm với
bit dự đoán sẽ được thay đổi hiển thị Hình 4.65. các thẻ, làm cho nó tốn
kém hơn bộ đệm dự
Xây dựng: Một công cụ dự báo chi nhánh cho chúng ta biết liệu một nhánh có điều đoán đơn giản.
kiện được thực hiện , nhưng vẫn yêu cầu tính toán mục tiêu chi nhánh. Trong đường
ống năm giai đoạn, phép tính này mất một chu kỳ, có nghĩa là các chi nhánh bị phạt dự đoán tương quan
sẽ bị phạt một chu kỳ. Một cách tiếp cận là sử dụng bộ đệm để giữ bộ đếm chương Một công cụ dự báo chi
trình đích hoặc hướng dẫn đích bằng cách sử dụng a đệm mục tiêu nhánh. nhánh kết hợp hành vi
địa phương của một chi
nhánh cụ thể và thông tin
Lược đồ dự đoán động 2 bit chỉ sử dụng thông tin về một nhánh cụ thể. Các toàn cầu về hành vi của
nhà nghiên cứu nhận thấy rằng việc sử dụng thông tin về cả một nhánh địa một số chi nhánh được
phương và hành vi toàn cầu của các nhánh được thực hiện gần đây cùng nhau thực hiện gần đây.
mang lại độ chính xác dự đoán lớn hơn cho cùng một số bit dự đoán. Dự đoán
như vậy được gọi dự đoán tương quanMột bộ dự đoán tương quan điển hình có
thể có hai bộ dự đoán 2 bit cho mỗi nhánh, với sự lựa chọn giữa các bộ dự đoán
được thực hiện dựa trên việc nhánh được thực hiện cuối cùng có được thực hiện
hay không. Do đó, hành vi nhánh toàn cầu có thể được coi là thêm các bit chỉ
mục bổ sung cho tra cứu dự đoán.
Một cách tiếp cận khác để dự đoán chi nhánh là việc sử dụng các dự đoán giải
đấu. A dự báo chi nhánh giải đấu sử dụng nhiều dự đoán, theo dõi, cho từng dự báo chi nhánh giải
chi nhánh , mà dự đoán mang lại kết quả tốt nhất. Một công cụ dự đoán giải đấu đấu Một chi nhánh dự
điển hình có thể chứa hai dự đoán cho mỗi chỉ số chi nhánh: một dựa trên thông đoán với nhiều dự đoán
cho từng nhánh và cơ
tin địa phương và một dựa trên hành vi chi nhánh toàn cầu. Một bộ chọn sẽ chọn chế lựa chọn chọn dự
bộ dự đoán nào sẽ sử dụng cho bất kỳ dự đoán nào. Bộ chọn có thể hoạt động đoán nào sẽ cho phép
tương tự như bộ dự đoán 1 hoặc 2 bit, ưu tiên bất kỳ bộ dự đoán nào trong hai bộ một nhánh nhất định.
dự đoán chính xác hơn. Một số bộ vi xử lý gần đây sử dụng các bộ dự đoán như
vậy.

Xây dựng: Một cách để giảm số lượng các nhánh có điều kiện là thêm vào có điều kiện
di chuyển hướng dẫn. Thay vì thay đổi PC với một nhánh có điều kiện, hướng dẫn có điều
kiện thay đổi thanh ghi đích của di chuyển. Ví dụ: kiến trúc tập lệnh ARMv8 có một lệnh
chọn có điều kiện được gọi CSEL Nó chỉ định một thanh ghi đích, hai thanh ghi nguồn và
một điều kiện. Thanh ghi đích nhận được giá trị của toán hạng đầu tiên nếu điều kiện là
đúng và toán hạng thứ hai khác. Như thế,. CSEL X8, X11, X4, ĐB sao chép nội dung của
đăng ký 11 vào đăng ký 8 nếu điều kiện mã cho biết kết quả của hoạt động không bằng 0
hoặc bản sao của thanh ghi 4 vào thanh ghi 11 nếu nó bằng không. Do đó, các chương
trình sử dụng tập lệnh ARMv8 có thể có ít nhánh có điều kiện hơn các chương trình được
viết bằng RISC-V .
332 Chương 4 Bộ xử lý

Lấy

Không lấy
Dự đoán Dự đoán
Lấy

Không lấy Lấy

Không lấy
Dự đoán không được thực hiện Dự đoán không được thực
hiện
Lấy

Không lấy

HÌNH 4.65 Các trạng thái trong sơ đồ dự đoán 2 bit. Bằng cách sử dụng 2 bit chứ không phải 1,
một nhánh ủng hộ mạnh mẽ hay không lấy đi vì nhiều chi nhánh làm giáo dục sẽ chỉ bị đánh giá sai một
lần. 2 bit được sử dụng để mã hóa bốn trạng thái trong hệ thống. Lược đồ 2 bit là một ví dụ chung của một
bộ dự đoán dựa trên bộ đếm, được tăng lên khi dự đoán là chính xác và được đánh dấu khác, và sử dụng
điểm giữa của phạm vi của nó làm phân chia giữa thực hiện và không được thực hiện.

Tóm tắt đường ống


Chúng tôi bắt đầu trong phòng giặt ủi, thể hiện các nguyên tắc đường ống trong
một khung cảnh hàng ngày. Sử dụng sự tương tự đó làm hướng dẫn, chúng tôi đã
giải thích từng bước hướng dẫn, bắt đầu với datapath một chu kỳ và sau đó thêm
các thanh ghi đường ống, đường dẫn chuyển tiếp, phát hiện nguy hiểm dữ liệu,
dự đoán nhánh và hướng dẫn xả nước trên các nhánh bị đánh giá sai hoặc tải - sử
dụng các mối nguy dữ liệu. Hình 4.66 cho thấy sự phát triển và kiểm soát cuối
cùng. Bây giờ chúng tôi đã sẵn sàng cho một mối nguy hiểm kiểm soát khác: vấn
đề dính của các trường hợp ngoại lệ.
Kiểm tra
Bản Xem xét ba sơ đồ dự đoán nhánh: dự đoán không được thực hiện, dự đoán được
thân bạn thực hiện và dự đoán động. Giả sử rằng tất cả họ đều có hình phạt bằng không
khi họ dự đoán chính xác và hai chu kỳ khi họ sai. Giả sử rằng độ chính xác dự
đoán trung bình của bộ dự đoán động là 90%. Dự đoán nào là lựa chọn tốt nhất
cho các nhánh sau?
1. Một nhánh có điều kiện được thực hiện với tần suất 5%
2. Một nhánh có điều kiện được thực hiện với tần suất 95%
3. Một nhánh có điều kiện được thực hiện với tần suất 70%
4.10 Ngoại lệ 333

Để làm m

4.10

Kiểm soát là khía cạnh thách thức nhất của thiết kế bộ xử lý: nó là khó nhất không ph
một phần để có được quyền và phần khó nhất để làm cho nhanh chóng. Một trong những nhiệm vụ đòi hỏi
của
bởi vì số
kiểm soát đang thực hiện ngoại lệ và ngắt lờiCác tổ chức khác ngoài các chi nhánh hướng dẫ
thay đổi luồng thực hiện lệnh thông thường. Chúng ban đầu được tạo ra để
giai đoạn
xử lý các sự kiện bất ngờ từ bên trong bộ xử lý, giống như một hướng dẫn không xác định.
khi tín hiệ
Cơ chế cơ bản tương tự đã được mở rộng cho các thiết bị I / O để giao tiếp với xảy ra có

bộ xử lý, như chúng ta sẽ thấy trong Chương 5.


Nhiều kiến trúc và tác giả không phân biệt giữa các ngắt và
ngoại lệ, thường sử dụng một trong hai tên để chỉ cả hai loại sự kiện. Ví dụ, một hệ th
Intel x86 sử dụng ngắt. Chúng tôi sử dụng thuật ngữ này ngoại lệ để tham khảo bất kỳ bất ngờ Dự án căn
ngoại lệ
thay đổi trong luồng điều khiển mà không phân biệt liệu nguyên nhân là nội bộ hay
gọi ngắt l
ở bên ngoài; chúng tôi sử dụng thuật ngữ này ngắt lời chỉ khi sự kiện được gây ra bên ngoài. Đây sự kiện độ
là những ví dụ cho thấy liệu tình huống có được tạo ra bên trong bởi bộ xử lý hay không làm gián đ

hoặc được tạo ra bên ngoài và tên mà RISC-V sử dụng :


hướng dẫn không xác định.
ngắt lời Một ngoại lệ
điều đó đến từ bên ngoài
của bộ xử lý. (Một số

IF.Flush
Nguy hiểm

HÌNH 4.66 Biểu đồ và kiểm soát cuối cùng cho chương này. Lưu ý rằng đây là một hình cách điệu chứ không phải là một hình dữ
liệu chi tiết, vì vậy Nó thiếu ALUsrc Mux từ Hình 4.55 và các điều khiển ghép kênh từ Hình 4.53.
334 Chương 4 Bộ xử lý

Loại sự kiện Từ đâu? Thuật ngữ RISC-V


Thiết lập lại hệ thống Bên ngoài Ngoại lệ
I / O yêu cầu thiết bị Bên ngoài Ngắt lời
Gọi hệ điều hành từ chương trình người dùng Nội bộ Ngoại lệ
Sử dụng một hướng dẫn không xác định Nội bộ Ngoại lệ
Phần cứng bị trục trặc Hoặc là Hoặc là

Nhiều yêu cầu để hỗ trợ các ngoại lệ đến từ tình huống cụ thể gây ra ngoại lệ
xảy ra. Theo đó, chúng tôi sẽ trở lại chủ đề này trong Chương 5, khi chúng ta sẽ
hiểu rõ hơn động lực cho các khả năng bổ sung trong cơ chế ngoại lệ. Trong
phần này, chúng tôi xử lý việc triển khai kiểm soát để phát hiện các loại ngoại lệ
phát sinh từ các phần của tập lệnh và triển khai mà chúng tôi đã thảo luận.
Phát hiện các điều kiện đặc biệt và thực hiện hành động thích hợp thường nằm trên
đường dẫn thời gian quan trọng của bộ xử lý, xác định thời gian chu kỳ đồng hồ và
do đó hiệu suất. Nếu không chú ý đúng đến các ngoại lệ trong quá trình thiết kế bộ
điều khiển, các nỗ lực thêm ngoại lệ vào việc triển khai phức tạp có thể làm giảm
đáng kể hiệu suất, cũng như làm phức tạp nhiệm vụ làm cho thiết kế chính xác.

Làm thế nào các ngoại lệ được xử lý trong Kiến trúc RISC-V
Các loại ngoại lệ duy nhất mà việc triển khai hiện tại của chúng tôi có thể tạo ra
là thực thi một lệnh không xác định hoặc sự cố phần cứng. Chúng tôi sẽ giả định
một sự cố phần cứng xảy ra trong quá trình hướng dẫn thêm x11, x12, x11 như ví
dụ ngoại lệ trong vài trang tiếp theo. Hành động cơ bản mà bộ xử lý phải thực
hiện khi xảy ra ngoại lệ là lưu địa chỉ của hướng dẫn không may trong giám sát
viên ngoại lệ nguyên nhân đăng ký (SEPC) và sau đó chuyển điều khiển sang hệ
điều hành tại một số địa chỉ được chỉ định.
Sau đó, hệ điều hành có thể thực hiện hành động thích hợp, có thể liên quan đến
việc cung cấp một số dịch vụ cho chương trình người dùng, thực hiện một số hành
động được xác định trước để đối phó với sự cố hoặc dừng thực hiện chương trình và
báo cáo lỗi. Sau khi thực hiện bất kỳ hành động nào được yêu cầu vì ngoại lệ, hệ điều
hành có thể chấm dứt chương trình hoặc có thể tiếp tục thực hiện, sử dụng SEPC để
xác định nơi khởi động lại việc thực hiện chương trình. Trong Chương 5, chúng tôi
sẽ xem xét kỹ hơn về vấn đề khởi động lại việc thực hiện.
Để hệ điều hành xử lý ngoại lệ, nó phải biết lý do cho ngoại lệ, ngoài hướng dẫn
gây ra nó. Có hai phương pháp chính được sử dụng để truyền đạt lý do cho một ngoại
lệ. Phương pháp được sử dụng trong kiến trúc RISC-V là bao gồm một thanh ghi
(được gọi là Giám sát ngoại lệ Nguyên nhân Đăng ký hoặc là SCAUSE), giữ một
trường chỉ ra lý do cho ngoại lệ.
can thiệp An ngắt mà Một phương pháp thứ hai là sử dụng gián đoạn vectơTrong một ngắt vectơ,
địa chỉ mà điều khiển địa chỉ mà điều khiển được truyền được xác định bởi nguyên nhân của ngoại lệ,
được chuyển được xác có thể được thêm vào một thanh ghi cơ sở trỏ đến phạm vi bộ nhớ cho các ngắt
định bởi nguyên nhân được kiểm tra. Ví dụ: chúng ta có thể xác định các địa chỉ vectơ ngoại lệ sau để
của ngoại lệ.
phù hợp với các loại ngoại lệ này :.
4.10 Ngoại lệ 335

Địa chỉ vector ngoại lệ được thêm vào


Loại ngoại lệ để đăng ký cơ sở bảng Vector
Hướng dẫn không xác định 00 0100 0000hai
Lỗi hệ thống (sự cố phần cứng) 01 1000 0000hai

Hệ điều hành biết lý do cho ngoại lệ bởi địa chỉ mà nó được bắt đầu. Khi ngoại lệ
không được kiểm tra, như trong RISC-V, một điểm nhập duy nhất cho tất cả các ngoại lệ
có thể được sử dụng và hệ điều hành giải mã thanh ghi trạng thái để tìm nguyên nhân. Đối
với các kiến trúc có ngoại lệ được kiểm tra, các địa chỉ có thể được phân tách bằng 32
byte hoặc tám hướng dẫn và hệ điều hành phải ghi lại lý do cho ngoại lệ và có thể thực
hiện một số xử lý giới hạn trong chuỗi này.
Chúng tôi có thể thực hiện xử lý cần thiết cho các trường hợp ngoại lệ bằng
cách thêm một vài thanh ghi và tín hiệu điều khiển bổ sung vào triển khai cơ bản
của chúng tôi và bằng cách điều khiển mở rộng một chút. Hãy giả sử rằng chúng
tôi đang triển khai hệ thống ngoại lệ với điểm nhập ngắt duy nhất là địa chỉ 0000
0000 1C09 0000hex(Thực hiện các ngoại lệ vectơ không còn khó khăn nữa.)
Chúng tôi sẽ cần thêm hai thanh ghi bổ sung vào triển khai RISC-V hiện tại của
chúng tôi :.

■ SEPC : Một thanh ghi 64 bit được sử dụng để giữ địa chỉ của hướng dẫn bị
ảnh hưởng. (Một đăng ký như vậy là cần thiết ngay cả khi các trường hợp
ngoại lệ được kiểm tra.)
■ SCAUSE : Một thanh ghi được sử dụng để ghi lại nguyên nhân của ngoại lệ.
Trong RISC-V kiến trúc, thanh ghi này là 64 bit, mặc dù hầu hết các bit
hiện không được sử dụng. Giả sử có một trường mã hóa hai nguồn ngoại lệ
có thể được đề cập ở trên, với 2 đại diện cho một lệnh không xác định và 12
đại diện cho sự cố phần cứng.

Các ngoại lệ trong một triển khai đường ống


Một triển khai đường ống coi các ngoại lệ là một hình thức nguy hiểm kiểm soát
khác. Ví dụ: giả sử có sự cố phần cứng trong hướng dẫn thêm. Giống như chúng tôi
đã làm cho chi nhánh đã lấy trong phần trước, chúng tôi phải tuôn ra các hướng dẫn
tuân theo thêm hướng dẫn từ đường ống và bắt đầu tìm nạp hướng dẫn từ địa chỉ mới.
Chúng tôi sẽ sử dụng cùng một cơ chế mà chúng tôi đã sử dụng cho các nhánh đã lấy,
nhưng lần này ngoại lệ gây ra việc khử các đường điều khiển.
Khi chúng tôi xử lý sai lầm chi nhánh, chúng tôi đã thấy cách xóa hướng dẫn
trong giai đoạn IF bằng cách biến nó thành a khôngĐể xóa các hướng dẫn trong
giai đoạn ID, chúng tôi sử dụng bộ ghép kênh đã có trong giai đoạn ID mà tín
hiệu điều khiển số không cho các quầy hàng. Tín hiệu điều khiển mới, được gọi
là ID.Flush, được OR với tín hiệu dừng từ đơn vị phát hiện nguy hiểm để tuôn ra
trong ID. Để xóa hướng dẫn trong pha EX, chúng tôi sử dụng tín hiệu mới có tên
EX.Flush để làm cho bộ ghép kênh mới bằng 0 các dòng điều khiển. Để bắt đầu
tìm nạp hướng dẫn từ vị trí 0000 0000 1C09 0000.hex, mà chúng tôi đang sử dụng
làm địa chỉ ngoại lệ RISC-V, chúng tôi chỉ cần thêm một đầu vào bổ sung vào bộ
ghép kênh PC gửi 0000 0000 1C09 0000hex đến PC . Hình 4.67 cho thấy những
thay đổi này.
336 Chương 4 Bộ xử lý

Ví dụ này chỉ ra một vấn đề với các ngoại lệ: nếu chúng ta không ngừng thực
thi ở giữa hướng dẫn, lập trình viên sẽ không thể thấy giá trị ban đầu của thanh
ghi x1 bởi vì nó sẽ được đóng dấu là thanh ghi đích của thêm chỉ dẫn. Nếu chúng
tôi giả định ngoại lệ được phát hiện trong giai đoạn EX, chúng tôi có thể sử dụng
tín hiệu EX.Flush để ngăn hướng dẫn trong giai đoạn EX ghi kết quả của nó trong
giai đoạn WB. Nhiều trường hợp ngoại lệ yêu cầu cuối cùng chúng tôi hoàn thành
hướng dẫn gây ra ngoại lệ như thể nó được thực thi bình thường. Cách dễ nhất để
làm điều này là tuôn ra hướng dẫn và khởi động lại nó ngay từ đầu sau khi ngoại
lệ được xử lý.
Bước cuối cùng là lưu địa chỉ của hướng dẫn vi phạm trong giám sát viên
quầy chương trình ngoại lệ (SEPC). Hình 4.67 cho thấy một phiên bản cách điệu
của datapath, bao gồm phần cứng chi nhánh và chỗ ở cần thiết để xử lý các
trường hợp ngoại lệ.

VÍ DỤ Ngoại lệ trong một máy tính đường ống

Đưa ra trình tự hướng dẫn này ,


40
hex phụ x11, x2, x4
44
hex và x12, x2, x5
hoặc
48
hex là x13, x2, x6
4C
hex thêm x1, x2, x1
50
hex phụ x15, x6, x7
54
hex lw x16, 100 (x7)
...

giả sử các hướng dẫn được gọi trên một ngoại lệ bắt đầu như thế này :
1C090000hex sw x26, 1000 (x10)
1C090004hex sw x27, 1008 (x10)
...

Hiển thị những gì xảy ra trong đường ống nếu một ngoại lệ sự cố phần
cứng xảy ra trong thêm chỉ dẫn.

TRẢ LỜI Hình 4.68 hiển thị các sự kiện, bắt đầu với hướng dẫn thêm trong giai đoạn
EX. Giả sử sự cố phần cứng được phát hiện trong giai đoạn đó và 0000 0000
1C09 0000hex bị ép vào PC. Đồng hồ chu kỳ 7 cho thấy rằng thêm và các
hướng dẫn sau được tuôn ra và hướng dẫn đầu tiên của mã xử lý ngoại lệ
được tìm nạp. Lưu ý rằng địa chỉ của thêm hướng dẫn được lưu: 4Chex.
4.10 Ngoại lệ 337

EX.Flush
IF.Flush

ID.Flush
Nguy hiểm
phát hiện
đơn vị

ID / EX

WB 0 EX / MEM
M
b

Điều khiển n M WB MEM / WB
x SCAUSE
NẾU / ID +
0 EX SEPC 0 M WB

+
4

Đăng ký =
ALU
1C090000 PC Hướng dẫn
ký ức Dữ liệu
ký ức

Tôi
Gen

Chuyển tiếp
đơn vị

HÌNH 4.67 Biểu đồ có điều khiển để xử lý các ngoại lệ. Các bổ sung chính bao gồm một đầu vào mới với giá trị 0000 0000 1C09
0000hex trong bộ ghép kênh cung cấp giá trị PC mới; một thanh ghi SCAUSE để ghi lại nguyên nhân của ngoại lệ; và một thanh ghi SEPC
để lưu địa chỉ của lệnh gây ra ngoại lệ. 0000 0000 1C09 0000 hex đầu vào cho bộ ghép kênh là địa chỉ ban đầu để bắt đầu tìm nạp hướng dẫn
trong trường hợp có ngoại lệ.

Chúng tôi đã đề cập đến một số ví dụ về các trường hợp ngoại lệ ở trang 333
và chúng tôi sẽ thấy những người khác ở Chương 5Với năm hướng dẫn hoạt
động trong bất kỳ chu kỳ đồng hồ nào, thử thách là liên kết một ngoại lệ với
hướng dẫn phù hợp. Hơn nữa, nhiều trường hợp ngoại lệ có thể xảy ra đồng thời
trong một chu kỳ đồng hồ duy nhất. Giải pháp là ưu tiên các ngoại lệ để dễ dàng
xác định cái nào được phục vụ trước. Trong triển khai RISC-V, phần cứng sắp
xếp các ngoại lệ để hướng dẫn sớm nhất bị gián đoạn.
Yêu cầu thiết bị I / O và sự cố phần cứng không được liên kết với một hướng dẫn
cụ thể, do đó việc triển khai có một số tính linh hoạt khi nào làm gián đoạn đường
ống. Do đó, cơ chế được sử dụng cho các trường hợp ngoại lệ khác hoạt động tốt.
Thanh ghi SEPC nắm bắt địa chỉ của các hướng dẫn bị gián đoạn và thanh ghi
SCAUSE ghi lại ngoại lệ ưu tiên cao nhất trong chu kỳ đồng hồ nếu có nhiều hơn
một ngoại lệ xảy ra.
338 Chương 4 Bộ xử lý

HÌNH 4.68 Kết quả của một ngoại lệ do sự cố phần cứng trong hướng dẫn thêm. Ngoại lệ được phát hiện trong giai đoạn EX
của đồng hồ 6, lưu địa chỉ của hướng dẫn thêm trong thanh ghi SEPC (4C hex). Nó làm cho tất cả các tín hiệu Flush được đặt ở gần cuối chu
kỳ đồng hồ này, phân tích các giá trị điều khiển (đặt chúng thành 0) cho phần bổ sung. Chu kỳ đồng hồ 7 cho thấy các hướng dẫn được
chuyển đổi thành bong bóng trong đường ống cộng với việc tìm nạp hướng dẫn đầu tiên của thói quen ngoại lệ, sw x26, 1000 (x0) Vị trí
hướng dẫn từ 0000 0000 1C09 0000hexLưu ý rằng và hoặc hướng dẫn, trước khi thêm, vẫn hoàn tất.
4.10 Ngoại lệ 339

Phần cứng và hệ điều hành phải hoạt động kết hợp để các ngoại lệ hoạt động như bạn Giao diện
mong đợi. Hợp đồng phần cứng thường dừng hướng dẫn vi phạm ở giữa dòng, để tất phần
cả các hướng dẫn trước hoàn tất, xóa tất cả các hướng dẫn sau, đặt một thanh ghi để
hiển thị nguyên nhân của ngoại lệ, lưu địa chỉ của hướng dẫn vi phạm và sau đó phân cứng /
nhánh đến địa chỉ được sắp xếp trước . Hợp đồng hệ điều hành là xem xét nguyên phần
nhân của ngoại lệ và hành động phù hợp. Đối với một hướng dẫn không xác định mềm
hoặc lỗi phần cứng, hệ điều hành thường giết chết chương trình và trả về một chỉ báo
về lý do. Đối với yêu cầu thiết bị I / O hoặc cuộc gọi dịch vụ hệ điều hành, hệ điều
hành sẽ lưu trạng thái của chương trình, thực hiện nhiệm vụ mong muốn và, tại một
số điểm trong tương lai, sẽ khôi phục chương trình để tiếp tục thực hiện. Trong
trường hợp yêu cầu thiết bị I / O, chúng tôi thường có thể chọn chạy một tác vụ khác
trước khi tiếp tục tác vụ yêu cầu I / O, vì nhiệm vụ đó thường không thể tiến hành
cho đến khi I / O hoàn thành. Ngoại lệ là lý do tại sao khả năng lưu và khôi phục
trạng thái của bất kỳ nhiệm vụ nào là rất quan trọng. Một trong những cách sử dụng
ngoại lệ quan trọng và thường xuyên nhất là xử lý lỗi trang; Chương 5 mô tả những
ngoại lệ này và xử lý của họ chi tiết hơn.

Xây dựng: Khó khăn của việc luôn luôn liên kết các ngoại lệ thích hợp với chính xác
hướng dẫn trong máy tính đường ống đã khiến một số nhà thiết kế máy tính nới lỏng yêu không chính xác
cầu này trong các trường hợp không quan trọng. Bộ xử lý như vậy được cho là có ngắt ngắt lời Cũng được gọi
chính xác hoặc là ngoại lệ không chính xácTrong ví dụ trên, PC thường có 58.hex khi bắt ngoại lệ không chính
đầu chu kỳ đồng hồ sau khi phát hiện ngoại lệ, mặc dù hướng dẫn vi phạm nằm ở địa chỉ xác. Sự gián đoạn hoặc
4ChexMột bộ xử lý có ngoại lệ không chính xác có thể đặt 58.hex vào SEPC và để nó cho hệ ngoại lệ trong các máy
điều hành để xác định hướng dẫn nào gây ra sự cố. RISC-V và phần lớn các máy tính hiện
tính được đặt ống không
nay hỗ trợ ngắt chính xác hoặc là chính xác ngoại lệMột lý do là các nhà thiết kế của một
liên quan đến hướng dẫn
chính xác là nguyên nhân
bộ xử lý đường ống sâu hơn có thể bị cám dỗ. để ghi lại một giá trị khác trong SEPC, điều
của sự gián đoạn hoặc
này sẽ tạo ra đau đầu cho HĐH. Để ngăn chặn chúng, đường ống sâu hơn có thể sẽ được
ngoại lệ.
yêu cầu ghi lại cùng một PC đã được ghi lại trong đường ống năm giai đoạn. Thay vào đó,
mọi người chỉ cần ghi lại PC của hướng dẫn lỗi. (Một lý do khác là để hỗ trợ bộ nhớ ảo, mà ngắt chính xác Cũng
chúng ta sẽ thấy Chương 5).
thế gọi ngoại lệ chính
xácMột ngắt hoặc ngoại
Xây dựng: Chúng tôi cho thấy RISC-V sử dụng địa chỉ nhập ngoại lệ 0000 0000 lệ luôn được liên kết với
1C09 0000hex, được chọn phần nào tùy ý. Nhiều máy tính RISC-V lưu trữ địa chỉ hướng dẫn chính xác
nhập ngoại lệ trong một thanh ghi đặc biệt có tên Giám sát bẫy Vector (STVEC), mà trong các máy tính được
HĐH có thể tải với giá trị mà nó chọn. đặt ống.

Ngoại lệ nào cần được công nhận đầu tiên trong chuỗi này? Kiểm
1. xxx x11, x12, x11 // hướng dẫn không xác định tra
Bản
thân
bạn
2. lỗi phụ x11, x12, x11 // phần cứng
340 Chương 4 Bộ xử lý

4.11 Song song thông qua Hướng dẫn

Được cảnh báo trước: phần này là một tổng quan ngắn gọn về các chủ đề hấp dẫn
nhưng phức tạp. Nếu bạn muốn tìm hiểu thêm chi tiết, bạn nên tham khảo cuốn
sách nâng cao hơn của chúng tôi ,
Kiến trúc máy tính: Cách tiếp cận định lượng, phiên bản thứ sáu, nơi vật liệu
được bao phủ trong 13 trang này được mở rộng đến gần 200 trang (bao gồm cả các
phụ lục)! Đường ống khai thác tiềm năng song song trong số các hướng dẫn. Điều
này song song được gọi, đủ tự nhiên , song song cấp độ hướng dẫn (ILP)Có hai
phương pháp chính để tăng lượng song song cấp độ giảng dạy tiềm năng. Đầu tiên là
tăng độ sâu của đường ống để chồng lên nhiều hướng dẫn hơn. Sử dụng sự tương tự
giặt ủi của chúng tôi và giả định rằng chu trình giặt dài hơn các máy khác, chúng tôi
có thể chia máy giặt của chúng tôi thành ba máy thực hiện các bước rửa, rửa và quay
của máy giặt truyền thống. Sau đó chúng tôi sẽ chuyển từ một đường ống bốn tầng
song song cấp độ sang một đường ống sáu tầng. Để tăng tốc hoàn toàn, chúng ta cần cân bằng lại các
hướng dẫn Các bước còn lại để chúng có cùng thời lượng, trong bộ xử lý hoặc trong giặt ủi. Lượng
song song giữa các
song song được khai thác cao hơn, vì có nhiều hoạt động được chồng chéo. Hiệu suất
hướng dẫn.
có khả năng lớn hơn kể từ đồng hồ.
chu kỳ có thể ngắn hơn.
Một cách tiếp cận khác là sao chép các thành phần bên trong của máy tính để
nhiều vấn đề A sơ đồ nó có thể khởi chạy nhiều hướng dẫn trong mọi giai đoạn đường ống. Tên chung
theo đó nhiều hướng dẫn cho kỹ thuật này là nhiều vấn đềMột máy giặt nhiều vấn đề sẽ thay thế máy giặt
được đưa ra trong một chu và máy sấy gia đình của chúng tôi bằng ba máy giặt và ba máy sấy. Bạn cũng sẽ
kỳ đồng hồ. phải tuyển thêm trợ lý để gấp và cất đi gấp ba lần số lần giặt trong cùng một
khoảng thời gian. Nhược điểm là công việc phụ để giữ cho tất cả các máy bận
rộn và chuyển tải sang giai đoạn đường ống tiếp theo.
Khởi chạy nhiều hướng dẫn cho mỗi giai đoạn cho phép tốc độ thực hiện lệnh vượt
quá tốc độ xung nhịp hoặc, được nêu thay thế, CPI nhỏ hơn 1. Như đã đề cập trong
Chương 1, đôi khi rất hữu ích để lật số liệu và sử dụngIPC, hoặc là hướng dẫn mỗi đồng
vấn đề tĩnh nhiều An hồ chu kỳDo đó, bộ vi xử lý đa vấn đề 3 GHz có thể thực hiện tốc độ cực đại. 12 tỷ hướng
cách tiếp cận để thực hiện dẫn mỗi giây và có CPI trường hợp tốt nhất là 0,33 hoặc IPC là 3. Giả sử một đường ống
bộ xử lý nhiều vấn đề trong
năm tầng, một bộ xử lý như vậy sẽ có tới 20 hướng dẫn thực hiện tại bất kỳ thời điểm nào.
đó nhiều quyết định được
Ngày nay, bộ vi xử lý cao cấp của Lít cố gắng phát hành từ ba đến sáu hướng dẫn trong
đưa ra bởi trình biên dịch
trước khi thực hiện. mỗi chu kỳ đồng hồ. Ngay cả các thiết kế vừa phải cũng sẽ nhắm đến IPC cao điểm là 2.
Tuy nhiên, thông thường, có nhiều ràng buộc về loại hướng dẫn nào có thể được thực thi
đồng thời và điều gì xảy ra khi sự phụ thuộc phát sinh.
vấn đề động nhiều Có hai cách chính để thực hiện bộ xử lý nhiều vấn đề, với sự khác biệt chính
Một cách tiếp cận triển là phân chia công việc giữa trình biên dịch và phần cứng. Bởi vì sự phân chia
khai bộ xử lý nhiều vấn
đề trong đó nhiều quyết công việc quyết định liệu các quyết định đang được đưa ra một cách tĩnh (nghĩa
định được đưa ra trong là tại thời điểm biên dịch) hay động (nghĩa là trong khi thực hiện), các cách tiếp
quá trình thực hiện bởi cận đôi khi được gọi vấn đề tĩnh nhiều và vấn đề động nhiềuNhư chúng ta sẽ
bộ xử lý. thấy, cả hai cách tiếp cận đều có những tên khác, được sử dụng phổ biến hơn, có
thể ít chính xác hơn hoặc hạn chế hơn.
4.11 Song song thông qua Hướng dẫn 341

Hai trách nhiệm chính và riêng biệt phải được xử lý trong một đường ống
nhiều vấn đề :
1. Hướng dẫn đóng gói vào phát hành khe: làm thế nào để bộ xử lý xác định phát hành khe Các vị trí
có bao nhiêu hướng dẫn và hướng dẫn nào có thể được ban hành trong một từ đó các hướng dẫn có
chu kỳ đồng hồ nhất định? Trong hầu hết các bộ xử lý vấn đề tĩnh, quá thể phát hành trong một
chu kỳ đồng hồ nhất định;
trình này ít nhất được xử lý một phần bởi trình biên dịch; trong thiết kế vấn
bằng cách tương tự, chúng
đề năng động, nó thường được xử lý tại thời gian chạy bởi bộ xử lý, mặc tương ứng với các vị trí tại
dù trình biên dịch thường đã cố gắng giúp cải thiện tỷ lệ phát hành bằng các khối bắt đầu cho một
cách đặt các hướng dẫn theo thứ tự có lợi. lần chạy nước rút.
2. Xử lý các mối nguy dữ liệu và kiểm soát: trong các bộ xử lý sự cố tĩnh, trình
biên dịch xử lý một số hoặc tất cả các hậu quả của dữ liệu và kiểm soát các
mối nguy hiểm tĩnh. Ngược lại, hầu hết các bộ xử lý sự cố động đều cố gắng
giảm bớt ít nhất một số loại mối nguy bằng cách sử dụng các kỹ thuật phần
cứng hoạt động tại thời điểm thực hiện.
Mặc dù chúng tôi mô tả đây là những cách tiếp cận riêng biệt, nhưng trong
thực tế, một cách tiếp cận thường mượn các kỹ thuật từ phương pháp khác và
không phương pháp nào có thể tuyên bố là hoàn toàn thuần túy.

Khái niệm đầu cơ


Một trong những phương pháp quan trọng nhất để tìm và khai thác nhiều ILP
hơn là đầu cơ. Dựa trên ý tưởng tuyệt vời của dự đoán, đầu cơ là một cách tiếp
cận cho phép trình biên dịch hoặc bộ xử lý để đoán về các thuộc tính của một
lệnh, để cho phép thực thi bắt đầu cho các hướng dẫn khác có thể phụ thuộc vào
hướng dẫn được suy đoán. Ví dụ: chúng tôi có thể suy đoán về kết quả của một
chi nhánh, để các hướng dẫn sau chi nhánh có thể được thực hiện trước đó. Một
ví dụ khác là chúng ta có thể suy đoán rằng một cửa hàng đi trước tải không đề
cập đến cùng một địa chỉ, điều này sẽ cho phép tải được thực hiện trước cửa hàng.
Khó khăn với suy đoán là nó có thể sai. Vì vậy, bất kỳ cơ chế đầu cơ nào cũng
phải bao gồm cả phương pháp để kiểm tra xem dự đoán có đúng không và đầu cơ An cách tiếp cận
phương pháp để bỏ kiểm soát hoặc rút lại các tác động của các hướng dẫn được theo đó trình biên dịch
thực hiện một cách suy đoán. Việc thực hiện khả năng dự phòng này làm tăng hoặc bộ xử lý đoán kết quả
của một lệnh để loại bỏ nó
thêm sự phức tạp. như là một sự phụ thuộc
Đầu cơ có thể được thực hiện trong trình biên dịch hoặc bằng phần cứng. Ví trong việc thực hiện các
dụ: trình biên dịch có thể sử dụng đầu cơ để sắp xếp lại các hướng dẫn, di chuyển hướng dẫn khác.
một hướng dẫn qua một nhánh hoặc tải trên một cửa hàng. Phần cứng bộ xử lý có
thể thực hiện chuyển đổi tương tự khi chạy bằng các kỹ thuật mà chúng ta thảo
luận sau trong phần này.
Các cơ chế phục hồi được sử dụng cho đầu cơ không chính xác là khá khác
nhau. Trong trường hợp đầu cơ trong phần mềm, trình biên dịch thường chèn các
hướng dẫn bổ sung để kiểm tra tính chính xác của đầu cơ và cung cấp thói quen
sửa chữa để sử dụng khi đầu cơ sai. Trong đầu cơ phần cứng, bộ xử lý thường
đệm các kết quả đầu cơ cho đến khi nó biết rằng chúng không còn là đầu cơ nữa.
Nếu đầu cơ là chính xác, các hướng dẫn được hoàn thành bởi
342 Chương 4 Bộ xử lý

cho phép nội dung của bộ đệm được ghi vào sổ đăng ký hoặc bộ nhớ. Nếu đầu cơ
không chính xác, phần cứng sẽ xóa bộ đệm và thực hiện lại trình tự hướng dẫn
chính xác. Sự thiếu sót thường đòi hỏi đường ống phải được xả, hoặc ít nhất là bị
đình trệ, và do đó làm giảm thêm hiệu suất.
Đầu cơ giới thiệu một vấn đề có thể khác: suy đoán theo một số hướng dẫn
nhất định có thể đưa ra các ngoại lệ trước đây không có. Ví dụ: giả sử một lệnh
tải được di chuyển theo cách đầu cơ, nhưng địa chỉ mà nó sử dụng không nằm
trong giới hạn khi đầu cơ không chính xác. Kết quả sẽ là một ngoại lệ không nên
xảy ra sẽ xảy ra. Vấn đề rất phức tạp bởi thực tế là nếu hướng dẫn tải không được
đầu cơ, thì ngoại lệ phải xảy ra! Trong đầu cơ dựa trên trình biên dịch, các vấn đề
như vậy được tránh bằng cách thêm hỗ trợ đầu cơ đặc biệt cho phép bỏ qua các
ngoại lệ đó cho đến khi rõ ràng rằng chúng thực sự nên xảy ra. Trong đầu cơ dựa
trên phần cứng, các ngoại lệ chỉ được đệm cho đến khi rõ ràng rằng hướng dẫn
gây ra chúng không còn là đầu cơ và sẵn sàng hoàn thành; tại thời điểm đó, ngoại
lệ được nêu ra và tiến hành xử lý ngoại lệ thông thường.

Vì đầu cơ có thể cải thiện hiệu suất khi được thực hiện đúng và giảm hiệu suất
khi được thực hiện một cách bất cẩn, nên nỗ lực đáng kể sẽ quyết định khi nào nó
phù hợp để suy đoán. Sau này trong phần này, chúng tôi sẽ kiểm tra cả kỹ thuật
tĩnh và động để đầu cơ.

Vấn đề nhiều tĩnh


Tất cả các bộ xử lý đa vấn đề tĩnh đều sử dụng trình biên dịch để hỗ trợ các hướng
dẫn đóng gói và xử lý các mối nguy hiểm. Trong bộ xử lý sự cố tĩnh, bạn có thể nghĩ
về bộ hướng dẫn được ban hành trong một chu kỳ đồng hồ nhất định, được gọi là an
phát hành gói Bộ của phát hành gói, như một hướng dẫn lớn với nhiều thao tác. Quan điểm này là nhiều
các hướng dẫn phát hơn một sự tương tự. Vì bộ xử lý nhiều vấn đề tĩnh thường hạn chế kết hợp các hướng
hành cùng nhau trong dẫn có thể được bắt đầu trong một chu kỳ đồng hồ nhất định, nên rất hữu ích khi nghĩ
một chu kỳ đồng hồ; gói gói vấn đề là một lệnh duy nhất cho phép một số thao tác trong các trường được xác
có thể được xác định
định trước. Quan điểm này đã dẫn đến tên ban đầu cho phương pháp này : Từ hướng
tĩnh bởi trình biên dịch
hoặc động bởi bộ xử lý.
dẫn rất dài (VLIW).
Hầu hết các bộ xử lý vấn đề tĩnh cũng dựa vào trình biên dịch để chịu trách nhiệm
Từ hướng dẫn rất dài
xử lý dữ liệu và kiểm soát các mối nguy hiểm. Các trách nhiệm của trình biên dịch có
(VLIW) A kiến trúc tập
lệnh kiểu khởi chạy nhiều
thể bao gồm dự đoán nhánh tĩnh và lập lịch mã để giảm hoặc ngăn chặn tất cả các
thao tác được xác định là mối nguy hiểm. Hãy cùng xem xét một phiên bản sự cố tĩnh đơn giản của bộ xử lý
độc lập trong một lệnh RISC-V, trước khi chúng tôi mô tả việc sử dụng các kỹ thuật này trong các bộ xử lý
rộng, thường có nhiều tích cực hơn.
trường opcode riêng biệt.
Một ví dụ: Nhiều vấn đề tĩnh với ISC-V ISA
Để tạo ra hương vị của nhiều vấn đề tĩnh, chúng tôi xem xét bộ xử lý RISC-V hai vấn
đề đơn giản, trong đó một trong các hướng dẫn có thể là một hoạt động hoặc nhánh
ALU số nguyên và cái còn lại có thể là tải hoặc lưu trữ. Một thiết kế như vậy là
giống như được sử dụng trong một số bộ xử lý nhúng. Phát hành hai hướng dẫn cho
mỗi chu kỳ sẽ yêu cầu tìm nạp và giải mã 64 bit hướng dẫn. Trong nhiều bộ xử lý đa
vấn đề tĩnh, và
4.11 Song song thông qua Hướng dẫn 343

HÌNH 4.69 Đường ống hai vấn đề tĩnh đang hoạt động. ALU và hướng dẫn truyền dữ liệu được
ban hành cùng một lúc. Ở đây chúng tôi đã giả định cấu trúc năm giai đoạn tương tự như được sử dụng cho
đường ống phát hành đơn. Mặc dù điều này không thực sự cần thiết, nhưng nó có một số lợi thế. Cụ thể,
việc giữ cho thanh ghi ở cuối đường ống giúp đơn giản hóa việc xử lý các ngoại lệ và duy trì một mô hình
ngoại lệ chính xác, trở nên khó khăn hơn trong các bộ xử lý đa vấn đề.

về cơ bản tất cả các bộ xử lý VLIW, bố cục của các hướng dẫn phát hành đồng
thời bị hạn chế để đơn giản hóa vấn đề giải mã và hướng dẫn. Do đó, chúng tôi sẽ
yêu cầu các hướng dẫn được ghép nối và căn chỉnh trên ranh giới 64 bit, với phần
ALU hoặc phần nhánh xuất hiện trước. Hơn nữa, nếu một lệnh của cặp không thể
được sử dụng, chúng tôi yêu cầu nó phải được thay thế bằng a không Do đó, các
hướng dẫn luôn luôn phát hành theo cặp, có thể với a. không trong một khe. Hình
4.69 cho thấy các hướng dẫn trông như thế nào khi chúng đi vào đường ống theo
cặp.
Bộ xử lý đa vấn đề tĩnh khác nhau về cách chúng đối phó với dữ liệu tiềm
năng và kiểm soát các mối nguy hiểm. Trong một số thiết kế, trình biên dịch chịu
trách nhiệm hoàn toàn cho việc loại bỏ tất cả các mối nguy hiểm, lập lịch mã và
chèn no-ops để mã thực thi mà không cần phát hiện nguy hiểm hoặc các quầy
hàng do phần cứng tạo ra. Ở những người khác, phần cứng phát hiện các mối
nguy dữ liệu và tạo ra các ngăn giữa hai gói vấn đề, trong khi yêu cầu trình biên
dịch tránh tất cả các phụ thuộc trong một gói hướng dẫn. Mặc dù vậy, một mối
nguy hiểm thường buộc toàn bộ gói vấn đề có chứa hướng dẫn phụ thuộc bị đình
trệ. Cho dù phần mềm phải xử lý tất cả các mối nguy hiểm hay chỉ cố gắng giảm
một phần các mối nguy hiểm giữa các gói vấn đề riêng biệt, sự xuất hiện của một
lệnh lớn với nhiều thao tác được củng cố. Chúng tôi sẽ giả định cách tiếp cận thứ
hai cho ví dụ này.

Để phát hành ALU và hoạt động truyền dữ liệu song song, nhu cầu đầu tiên về
phần cứng bổ sung ngoài khả năng phát hiện nguy hiểm thông thường và logic gian
hàng là các cổng bổ sung trong tệp đăng ký (xem Hình 4,70). Trong một chu kỳ đồng
hồ, chúng ta có thể cần đọc hai thanh ghi cho hoạt động ALU và hai thanh ghi nữa
cho một cửa hàng, và cũng có một cổng ghi cho hoạt động ALU và một cổng ghi để
tải. Vì ALU được gắn cho hoạt động ALU, chúng tôi cũng cần một bộ cộng riêng để
tính hiệu quả
344 Chương 4 Bộ xử lý

4
ALU

Đăng ký
Hướng dẫn
1C090000 PC
ký ức
Viết
dữ liệu
Dữ liệu
Tôi ALU
Gen Tôi
ký ức
Gen
Địa chỉ

HÌNH 4,70 Một datapath hai vấn đề tĩnh. Các bổ sung cần thiết cho vấn đề kép được tô sáng: 32 bit khác từ hướng dẫn bộ nhớ, hai
cổng đọc thêm và một cổng ghi nữa trên tệp đăng ký và ALU khác. Giả sử ALU dưới cùng xử lý các tính toán địa chỉ để truyền dữ liệu và
ALU hàng đầu xử lý mọi thứ khác.

địa chỉ để chuyển dữ liệu. Nếu không có các nguồn lực bổ sung này, đường ống
hai vấn đề của chúng ta sẽ bị cản trở bởi các mối nguy cấu trúc.
Rõ ràng, bộ xử lý hai vấn đề này có thể cải thiện hiệu suất lên đến hai yếu tố!
Tuy nhiên, làm như vậy đòi hỏi phải có gấp đôi số hướng dẫn được chồng chéo
trong thực thi và sự chồng chéo bổ sung này làm tăng tổn thất hiệu suất tương
đối từ các mối nguy dữ liệu và kiểm soát. Ví dụ, trong đường ống năm tầng đơn
sử dụng độ trễ Số giản của chúng tôi, tải có a sử dụng độ trễ của một chu kỳ đồng hồ, ngăn một
của đồng hồ quay giữa
một lệnh tải và một
lệnh sử dụng kết quả mà không bị đình trệ. Trong đường ống hai vấn đề, năm
lệnh có thể sử dụng kết giai đoạn, kết quả của một hướng dẫn tải không thể được sử dụng ở lần tiếp theo
quả của tải mà không bị đồng hồ chu kỳĐiều này có nghĩa là tiếp theo. hai hướng dẫn không thể sử dụng
đình trệ đường ống. kết quả tải mà không bị đình trệ. Hơn nữa, các hướng dẫn ALU không có độ trễ
sử dụng trong đường ống năm tầng đơn giản hiện có độ trễ sử dụng một hướng
dẫn, vì kết quả không thể được sử dụng trong tải hoặc lưu trữ được ghép nối. Để
khai thác hiệu quả tính song song có sẵn trong bộ xử lý nhiều vấn đề, cần có
trình biên dịch hoặc kỹ thuật lập lịch phần cứng tham vọng hơn và nhiều vấn đề
tĩnh đòi hỏi trình biên dịch phải đảm nhận vai trò này.
4.11 Song song thông qua Hướng dẫn 345

HÌNH 4.71 Mã theo lịch trình như nó sẽ xem trên đường ống RISC-V hai vấn đề. Các khe
trống là không có. Lưu ý rằng vì chúng tôi đã di chuyển addi trước sw, chúng tôi phải điều chỉnh bù sw bù
bằng 4.

Lập lịch mã nhiều vấn đề đơn giản


VÍ DỤ
Làm thế nào vòng lặp này sẽ được lên lịch trên một đường ống hai vấn đề tĩnh
cho RISC-V?
Vòng lặp: lw x31, 0 (x20) // x31 = mảng thành phần
thêm x31, x31, x21 // thêm vô hướng trong x21
sw x31, 0 (x20) // kết quả cửa hàng
addi x20, x20, -4 // suy đồi con trỏ
blt x22 , x20, Vòng lặp // so sánh với giới hạn vòng lặp ,
// nhánh nếu x20> x22
Sắp xếp lại các hướng dẫn để tránh càng nhiều quầy hàng đường ống càng tốt.
Giả sử các nhánh được dự đoán, do đó các mối nguy kiểm soát được xử lý bởi
phần cứng.
TRẢ LỜI
Ba hướng dẫn đầu tiên có sự phụ thuộc dữ liệu, cũng như hai hướng dẫn tiếp
theo. Hình 4,71 cho thấy lịch trình tốt nhất cho các hướng dẫn này. Lưu ý
rằng chỉ cần một cặp hướng dẫn có cả hai khe vấn đề được sử dụng. Phải mất
năm đồng hồ trên mỗi vòng lặp; tại bốn đồng hồ để thực hiện năm hướng
vòng lặp không kiểm
dẫn, chúng tôi nhận được CPI đáng thất vọng là 0,8 so với trường hợp tốt
soát A kỹ thuật để có
nhất là 0,5 hoặc IPC là 1,25 so với 2,0. Lưu ý rằng trong tính toán CPI hoặc được hiệu suất cao hơn
IPC, chúng tôi không tính bất kỳ nút nào được thực hiện dưới dạng các từ các vòng truy cập
hướng dẫn hữu ích. Làm như vậy sẽ cải thiện CPI, nhưng không hiệu suất! vào mảng, trong đó
nhiều bản sao của thân
vòng lặp được tạo và
Một kỹ thuật biên dịch quan trọng để có được hiệu suất cao hơn từ các vòng
các hướng dẫn từ các
lặp là vòng lặp không kiểm soát, nơi nhiều bản sao của thân vòng được tạo ra. lần lặp khác nhau được
Sau khi không kiểm soát, có có nhiều ILP hơn bằng cách hướng dẫn chồng chéo lên lịch cùng nhau.
từ các lần lặp khác nhau.
346 Chương 4 Bộ xử lý

HÌNH 4.72 Mã chưa được kiểm soát và theo lịch trình của Hình 4.71 vì nó sẽ nhìn vào một
đường ống RISC-V hai vấn đề tĩnh. Các khe trống là không có. Kể từ khi hướng dẫn đầu tiên trong
các vòng lặp x20 x 16, các địa chỉ được tải là giá trị ban đầu của x20, sau đó địa chỉ đó trừ 4, trừ 8 và trừ
12.

Vòng lặp không kiểm soát đối với đường ống nhiều vấn đề
VÍ DỤ
Xem cách lặp vòng lặp không kiểm soát và lập lịch làm việc trong ví dụ trên.
Để đơn giản, giả sử rằng chỉ mục vòng lặp là bội số của bốn.

Để giảm đáng kể độ trễ trong vòng lặp, chúng ta cần tạo bốn bản sao của thân
TRẢ LỜI vòng lặp. Sau khi hủy kiểm soát và loại bỏ các hướng dẫn trên không vòng lặp
không cần thiết, vòng lặp sẽ chứa bốn bản sao mỗi bản lw, thêm, và sw, cộng với
một addivà một blt.Hình 4.85 hiển thị mã chưa được kiểm soát và theo lịch trình.
đăng ký đổi tên Các Trong quá trình hủy kiểm soát, trình biên dịch đã giới thiệu các thanh ghi bổ
đổi tên các thanh ghi sung (x28, x29, x30). Mục tiêu của quá trình này, được gọi đăng ký đổi tên, là để
bằng trình biên dịch hoặc loại bỏ các phụ thuộc không phải là phụ thuộc dữ liệu thực sự, nhưng có thể dẫn
phần cứng để loại bỏ các đến các mối nguy tiềm ẩn hoặc ngăn trình biên dịch lập lịch mã linh hoạt. Hãy
phần mềm chống lại. xem xét cách mã không được kiểm soát sẽ chỉ sử dụng x31 Sẽ có nhiều trường
hợp lặp đi lặp lại. lw x31, 0 (x20), thêm x31, x31, x21 theo sau là sw x31, 8 (x20),
chống phụ thuộc Cũng
nhưng những chuỗi này, mặc dù sử dụng x31, thực sự là hoàn toàn độc lập không
được gọi là phụ thuộc có giá trị dữ liệu chảy giữa một bộ các hướng dẫn này và tập tiếp theo. Trường
tên An đặt hàng bị ép hợp này là những gì được gọi là an chống độc hoặc là tên phụ thuộc, đó là một
buộc bởi việc sử dụng lại đơn đặt hàng bị ép buộc hoàn toàn bởi việc sử dụng lại tên, thay vì phụ thuộc dữ
tên, thường là một thanh liệu thực sự còn được gọi là phụ thuộc thực sự.
ghi, thay vì phụ thuộc Đổi tên các thanh ghi trong quá trình hủy kiểm soát cho phép trình biên
thực sự mang một giá trị dịch di chuyển các hướng dẫn độc lập này sau đó để lên lịch tốt hơn cho mã.
giữa hai hướng dẫn.
Quá trình đổi tên giúp loại bỏ các phụ thuộc tên, trong khi vẫn giữ được các
phụ thuộc thực sự.
4.11 Song song thông qua Hướng dẫn 347

Lưu ý rằng 12 trong số 14 hướng dẫn trong vòng lặp thực thi dưới dạng
cặp. Phải mất tám đồng hồ cho bốn lần lặp vòng lặp, mang lại IPC là 14/8 =
1,75. Vòng lặp không kiểm soát và lập lịch hiệu suất cao hơn gấp đôi 8 so
với 20 chu kỳ đồng hồ cho 4 lần lặp lại một phần từ việc giảm các hướng
dẫn điều khiển vòng lặp và một phần từ thực thi vấn đề kép. Chi phí cho cải
tiến hiệu suất này là sử dụng bốn thanh ghi tạm thời chứ không phải một,
cũng như nhiều hơn gấp đôi kích thước mã.

Bộ xử lý đa vấn đề động
Bộ xử lý đa vấn đề động còn được gọi là siêu âm bộ xử lý, hoặc đơn giản là siêu siêu âm An kỹ thuật
âm. Trong bộ xử lý superscalar đơn giản nhất, các hướng dẫn phát hành theo thứ đường ống tiên tiến cho
phép bộ xử lý thực hiện
tự và bộ xử lý quyết định liệu 0, một hoặc nhiều hướng dẫn có thể phát hành
nhiều hơn một lệnh cho
trong một chu kỳ đồng hồ nhất định hay không. Rõ ràng, để đạt được hiệu suất
mỗi chu kỳ đồng hồ bằng
tốt trên bộ xử lý như vậy vẫn yêu cầu trình biên dịch cố gắng lên lịch các hướng cách chọn chúng trong khi
dẫn để di chuyển các phụ thuộc và do đó cải thiện tỷ lệ vấn đề hướng dẫn. Ngay thực hiện.
cả với lịch trình biên dịch như vậy, có một sự khác biệt quan trọng giữa siêu máy
tính đơn giản này và bộ xử lý VLIW: mã, dù được lên lịch hay không, được phần
cứng đảm bảo thực thi chính xác. Hơn nữa, mã được biên dịch sẽ luôn chạy chính
xác độc lập với tốc độ phát hành hoặc cấu trúc đường ống của bộ xử lý. Trong
một số thiết kế VLIW, điều này đã không xảy ra và việc biên dịch lại được yêu
cầu khi di chuyển qua các mô hình bộ xử lý khác nhau; trong các bộ xử lý vấn đề
tĩnh khác, mã sẽ chạy chính xác trên các triển khai khác nhau, nhưng thường kém
đến mức làm cho việc biên dịch được yêu cầu một cách hiệu quả.
Nhiều siêu sao mở rộng khuôn khổ cơ bản của các quyết định vấn đề động bao
lập kế hoạch đường
gồm lập kế hoạch đường ống độngLập lịch đường ống động chọn hướng dẫn ống động Phần cứng hỗ
nào để thực hiện trong một chu kỳ đồng hồ nhất định trong khi cố gắng tránh các trợ sắp xếp lại thứ tự thực
mối nguy hiểm và quầy hàng. Hãy bắt đầu với một ví dụ đơn giản về việc tránh hiện lệnh để tránh các
nguy cơ dữ liệu. Hãy xem xét trình tự mã sau :. quầy hàng.

lw x31, 0 (x21)
thêm x1 , x31, x2
phụ x23, x23, x3
andi x5 , x23, 20

Mặc dù phụ hướng dẫn đã sẵn sàng để thực hiện, nó phải chờ lw và thêm để
hoàn thành trước, có thể mất nhiều chu kỳ đồng hồ nếu bộ nhớ chậm. (Chương 5
giải thích các bộ nhớ cache, lý do mà việc truy cập bộ nhớ đôi khi rất chậm.)
Năng động đường ống lập lịch cho phép tránh các mối nguy hiểm như vậy một
cách đầy đủ hoặc một phần.

Lập kế hoạch đường ống động


Lập lịch đường ống động chọn hướng dẫn nào để thực hiện tiếp theo, có thể sắp xếp
lại chúng để tránh các quầy hàng. Trong các bộ xử lý như vậy, đường ống được chia
thành ba đơn vị chính: đơn vị tìm nạp và phát hành hướng dẫn, nhiều đơn vị chức
năng
348 Chương 4 Bộ xử lý

Hướng dẫn lấy


Vấn đề theo thứ tự
và giải mã đơn vị

Đặt phòng Đặt Đặt phòng Đặt


...
phòng phòng
trạm trạm trạm trạm

Số Thực hiện ngoài trật


Chức năng Nổi Tải-
Số nguyên nguyên ... tự
đơn vị điểm cửa hàng

Cam kết Cam kết theo thứ tự


đơn vị

HÌNH 4.73 Ba đơn vị chính của một đường ống được lên lịch động. Bước cuối cùng của cập
nhật nhà nước cũng được gọi là nghỉ hưu hoặc tốt nghiệp.

đơn vị cam kết Các đơn (một tá trở lên trong các thiết kế cao cấp vào năm 2020), và a đơn vị cam
vị trong một đường ống kết.Hình 4. 86 cho thấy mô hình. Đơn vị đầu tiên tìm nạp các hướng dẫn, giải mã
thực thi động hoặc không
theo thứ tự quyết định khi
chúng và gửi từng lệnh đến một đơn vị chức năng tương ứng để thực hiện. Mỗi
nào an toàn để giải phóng đơn vị chức năng có bộ đệm, được gọi trạm đặt phòng, trong đó giữ các toán
kết quả của một hoạt hạng và hoạt động. (Trong phần tiếp theo, chúng tôi sẽ thảo luận về một giải
động cho các thanh ghi và pháp thay thế cho các trạm đặt phòng được sử dụng bởi nhiều bộ xử lý gần đây.)
bộ nhớ hiển thị của lập Ngay khi bộ đệm chứa tất cả các toán hạng của nó và đơn vị chức năng đã sẵn
trình viên. sàng để thực thi, kết quả được tính toán. Khi kết quả được hoàn thành, nó được
trạm đặt phòng A bộ gửi đến bất kỳ trạm đặt phòng nào đang chờ kết quả cụ thể này cũng như cho đơn
đệm trong một đơn vị vị cam kết, bộ đệm kết quả cho đến khi an toàn để đưa kết quả vào tệp đăng ký
chức năng giữ các toán hoặc, cho một cửa hàng, vào bộ nhớ . Bộ đệm trong đơn vị cam kết, thường được
hạng và hoạt động. gọi là đặt hàng lại bộ đệm, cũng được sử dụng để cung cấp các toán hạng, theo
cách tương tự như logic chuyển tiếp trong một đường ống theo lịch trình tĩnh.
đặt hàng lại bộ đệm Các
Khi một kết quả được cam kết với tệp đăng ký, nó có thể được lấy trực tiếp từ đó,
bộ đệm giữ kết quả trong giống như trong một đường ống thông thường.
bộ xử lý được lên lịch động Sự kết hợp của các toán hạng đệm trong các trạm đặt trước và kết quả là bộ
cho đến khi an toàn để lưu đệm sắp xếp lại cung cấp một hình thức đổi tên thanh ghi, giống như được trình
kết quả vào bộ nhớ hoặc biên dịch sử dụng trong ví dụ không kiểm soát vòng lặp trước đó của chúng tôi
thanh ghi. trên trang 346. Để xem cách thức hoạt động của khái niệm này, hãy xem xét các
bước sau :
1. Khi một lệnh
phát hành, nó
được sao chép
vào một trạm
đặt chỗ cho đơn
vị chức năng
thích hợp. Bất
kỳ toán hạng
nào có sẵn trong
tệp đăng ký
hoặc bộ đệm sắp
xếp lại cũng
ngay lập tức
được sao chép
vào trạm đặt
phòng.
4.11 Song song thông qua Hướng dẫn 349

Hướng dẫn được đệm trong trạm đặt phòng cho đến khi tất cả các toán
hạng và đơn vị chức năng có sẵn. Đối với hướng dẫn phát hành, bản sao
đăng ký của toán hạng không còn cần thiết nữa và nếu ghi vào thanh ghi
đó xảy ra, giá trị có thể được ghi đè.
2. Nếu một toán hạng không có trong tệp đăng ký hoặc bộ đệm sắp xếp lại,
thì nó phải chờ để được tạo bởi một đơn vị chức năng. Tên của đơn vị
chức năng sẽ tạo ra kết quả được theo dõi. Khi đơn vị đó cuối cùng tạo ra
kết quả, nó được sao chép trực tiếp vào trạm đặt phòng chờ từ đơn vị chức
năng bỏ qua các thanh ghi. thực hiện ngoài trật tự
Một tình huống trong
Các bước này sử dụng hiệu quả bộ đệm sắp xếp lại và các trạm đặt phòng để
thực thi đường ống khi
thực hiện đổi tên đăng ký. một lệnh bị chặn thực thi
Về mặt khái niệm, bạn có thể nghĩ về một đường ống được lên lịch động khi không khiến các hướng
phân tích cấu trúc luồng dữ liệu của một chương trình. Bộ xử lý sau đó thực hiện dẫn sau phải chờ.
các hướng dẫn theo một số thứ tự bảo toàn thứ tự luồng dữ liệu của chương trình.
Phong cách thực hiện này được gọi là an thực hiện ngoài trật tự, vì các hướng cam kết theo thứ tự
dẫn có thể được thực hiện theo một thứ tự khác với chúng được tìm nạp. A cam kết trong đó các
kết quả thực hiện đường
Để làm cho các chương trình hoạt động như thể chúng đang chạy trên một
ống được ghi vào trạng
đường ống đơn giản theo thứ tự, đơn vị tìm nạp và giải mã hướng dẫn được yêu thái hiển thị của lập
cầu để ban hành hướng dẫn theo thứ tự, cho phép các phụ thuộc được theo dõi, và trình viên theo cùng thứ
đơn vị cam kết được yêu cầu ghi kết quả vào các thanh ghi và bộ nhớ theo thứ tự tự mà các hướng dẫn
tìm nạp chương trình. Chế độ bảo thủ này được gọi cam kết theo thứ tựDo đó, được tìm nạp.
nếu một ngoại lệ xảy ra, máy tính có thể trỏ đến lệnh cuối cùng được thực thi và
các thanh ghi duy nhất được cập nhật sẽ là những thanh ghi được viết bởi các
hướng dẫn trước khi lệnh gây ra ngoại lệ. Mặc dù mặt trước (tìm nạp và phát
hành) và mặt sau (cam kết) của đường ống chạy theo thứ tự, các đơn vị chức năng
có thể tự do bắt đầu thực hiện bất cứ khi nào dữ liệu họ cần có sẵn. Ngày nay, tất
cả các đường ống được lên lịch động sử dụng cam kết theo thứ tự.
Lập lịch động thường được mở rộng bằng cách bao gồm đầu cơ dựa trên phần
cứng, đặc biệt là kết quả của chi nhánh. Bằng cách dự đoán hướng của một
nhánh, bộ xử lý được lên lịch động có thể tiếp tục tìm nạp và thực hiện các
hướng dẫn dọc theo đường dẫn dự đoán. Vì các hướng dẫn được cam kết theo
thứ tự, chúng tôi biết liệu chi nhánh có được dự đoán chính xác hay không trước
khi bất kỳ hướng dẫn nào từ đường dẫn dự đoán được cam kết. Một đường ống
được lên lịch động, đầu cơ cũng có thể hỗ trợ đầu cơ vào các địa chỉ tải, cho
phép sắp xếp lại cửa hàng tải và sử dụng đơn vị cam kết để tránh đầu cơ không
chính xác. Trong phần tiếp theo, chúng ta sẽ xem xét việc sử dụng lập lịch động
với đầu cơ trong thiết kế Intel Core i7.

Việc thực hiện ngoài trật tự tạo ra các mối nguy hiểm đường ống mới mà chúng Giao diện
tôi đã không nhìn thấy trong các đường ống trước đó. A tên phụ thuộc xảy ra khi phần
hai hướng dẫn sử dụng giống nhau
cứng /
phần mềm
350 Chương 4 Bộ xử lý

đăng ký hoặc vị trí bộ nhớ, được gọi là a tên, nhưng không có luồng dữ liệu giữa các
hướng dẫn được liên kết với tên đó. Có hai loại phụ thuộc tên giữa một lệnh i đi
trước hướng dẫn j theo thứ tự chương trình :
1. An chống độc giữa các hướng dẫn i và j xảy ra khi hướng dẫn j viết một
thanh ghi hoặc vị trí bộ nhớ mà hướng dẫn tôi đọc. Thứ tự ban đầu phải
được bảo tồn để đảm bảo rằng tôi đọc đúng giá trị.
2. An phụ thuộc đầu ra xảy ra khi hướng dẫn i và j viết cùng một thanh ghi hoặc
vị trí bộ nhớ. Thứ tự giữa các hướng dẫn phải được bảo tồn để đảm bảo rằng
giá trị cuối cùng được viết tương ứng với hướng dẫn j.
Nguy cơ đường ống ban đầu của chúng tôi là kết quả của những gì được gọi là
a dữ liệu thật sự phụ thuộc.
Ví dụ, trong mã dưới đây có sự chống đối giữa swc1 và addiu trên đăng ký x1
và sự phụ thuộc dữ liệu thực sự giữa lwc1 và thêm.s trên đăng ký f0. Mặc dù
không có phụ thuộc đầu ra giữa các hướng dẫn trong một vòng lặp, nhưng có
giữa các lần lặp khác nhau của vòng lặp, ví dụ, giữa các vòng lặp addiu hướng
dẫn của lần lặp thứ nhất và thứ hai.
Vòng lặp: lwc1 $ f0,0 (x1) // f0 = phần tử mảng
thêm.s $ f4, $ f0, $ f2 // thêm vô hướng trong f2
swc1 $ f4,0 (x1) // kết quả cửa hàng
addiu x1, x1,4 // con trỏ phân rã 8 byte
bne x1, x2, Vòng lặp // chi nhánh nếu x1 != x2

Một mối nguy hiểm đường ống tồn tại bất cứ khi nào có tên hoặc sự phụ thuộc
dữ liệu giữa các hướng dẫn và chúng đủ gần để sự chồng chéo trong khi thực
hiện sẽ thay đổi thứ tự truy cập vào toán hạng liên quan đến sự phụ thuộc. Chúng
dẫn đến những tên trực quan hơn về các mối nguy đường ống :
1. An chống độc có thể dẫn đến nguy cơ ghi sau khi đọc (WAR).
2. An phụ thuộc đầu ra có thể dẫn đến nguy cơ ghi sau khi ghi (WAW).
3. A phụ thuộc dữ liệu thực sự hoặc một mối nguy đọc sau khi viết.
Chúng tôi không có các mối nguy WAR hoặc WAW trong các đường ống
trước đó của chúng tôi vì tất cả các hướng dẫn thực hiện theo thứ tự và việc ghi
chỉ xảy ra trong giai đoạn đường ống cuối cùng để đăng ký hướng dẫn đăng ký
cũng như luôn trong cùng giai đoạn đường ống để truy cập dữ liệu trong tải và
hướng dẫn lưu trữ.
4.11 Song song thông qua Hướng dẫn 351

Cho rằng các trình biên dịch cũng có thể lên lịch mã xung quanh các phụ thuộc Hiểu hiệu suất
dữ liệu, bạn có thể hỏi tại sao bộ xử lý siêu âm sẽ sử dụng lập lịch động. Có ba lý
do chính. Đầu tiên, không phải tất cả các quầy hàng đều có thể dự đoán được.
chương trình
Đặc biệt, bộ nhớ cache bị bỏ lỡ (xem Chương 5) trong hệ thống phân cấp bộ
nhớ gây ra các quầy hàng không thể đoán trước. Lập lịch động cho phép bộ xử lý
ẩn một số gian hàng đó bằng cách tiếp tục thực hiện các hướng dẫn trong khi chờ
gian hàng kết thúc.
Thứ hai, nếu bộ xử lý suy đoán về kết quả chi nhánh bằng cách sử dụng nhánh
động dự đoán, nó không thể biết thứ tự chính xác của các hướng dẫn tại thời điểm
biên dịch, vì nó phụ thuộc vào hành vi dự đoán và thực tế của các chi nhánh. Kết hợp
đầu cơ động để khai thác nhiều hơn song song cấp độ hướng dẫn (ILP) mà không kết
hợp lập lịch động sẽ hạn chế đáng kể lợi ích của đầu cơ.
Thứ ba, khi độ trễ đường ống và độ rộng vấn đề thay đổi từ triển khai này sang triển
khai khác, cách tốt nhất để biên dịch một chuỗi mã cũng thay đổi. Ví dụ: cách lên lịch một
chuỗi các hướng dẫn phụ thuộc bị ảnh hưởng bởi cả chiều rộng và độ trễ của vấn đề. Cấu
trúc đường ống ảnh hưởng đến cả số lần một vòng lặp phải được kiểm soát để tránh các
quầy hàng cũng như quá trình đổi tên thanh ghi dựa trên trình biên dịch. Lập lịch động
cho phép phần cứng ẩn hầu hết các chi tiết này. Do đó, người dùng và nhà phân phối phần
mềm không cần phải lo lắng về việc có nhiều phiên bản của chương trình để triển khai Các
khác nhau của cùng một bộ hướng dẫn. Tương tự, mã cũ sẽ nhận được nhiều lợi ích của
việc triển khai mới mà không cần phải biên dịch lại. LỚN
Hình ảnh

Cả hai đường ống và thực thi nhiều vấn đề làm tăng thông lượng lệnh
tối đa và cố gắng khai thác cấp độ hướng dẫn song song (ILP). Tuy
nhiên, sự phụ thuộc dữ liệu và kiểm soát trong các chương trình cung
cấp giới hạn trên về hiệu suất bền vững vì đôi khi bộ xử lý phải chờ giải
quyết sự phụ thuộc. Các cách tiếp cận tập trung vào phần mềm để khai
thác ILP dựa trên khả năng của trình biên dịch để tìm và giảm tác động
của các phụ thuộc đó, trong khi các phương pháp tập trung vào phần
cứng dựa vào các phần mở rộng cho các cơ chế phát hành và đường ống.
Đầu cơ, được thực hiện bởi trình biên dịch hoặc phần cứng, có thể tăng
lượng ILP có thể được khai thác thông qua dự đoán, mặc dù phải cẩn
thận vì suy đoán không chính xác có khả năng giảm hiệu suất.
352 Chương 4 Bộ xử lý

Giao diện Bộ vi xử lý hiện đại, hiệu suất cao có khả năng ban hành một số hướng dẫn cho
phần mỗi đồng hồ; Thật không may, duy trì tỷ lệ vấn đề đó là rất khó khăn. Ví dụ, mặc
dù sự tồn tại của bộ xử lý với bốn đến sáu vấn đề mỗi đồng hồ, rất ít ứng dụng có
cứng / thể duy trì nhiều hơn hai hướng dẫn mỗi đồng hồ. Có hai lý do chính cho việc
phần này.
mềm Đầu tiên, trong đường ống, các nút thắt hiệu suất chính phát sinh từ các phụ thuộc
không thể giảm bớt, do đó làm giảm sự song song giữa các hướng dẫn và tỷ lệ vấn đề
được duy trì. Mặc dù ít có thể được thực hiện về sự phụ thuộc dữ liệu thực, nhưng
thường thì trình biên dịch hoặc phần cứng không biết chính xác liệu sự phụ thuộc có
tồn tại hay không, và do đó phải bảo thủ một cách bảo thủ sự phụ thuộc tồn tại. Ví dụ:
mã sử dụng con trỏ, đặc biệt theo cách có thể dẫn đến răng cưa, sẽ dẫn đến sự phụ
thuộc tiềm năng ngụ ý nhiều hơn. Ngược lại, tính đều đặn của các truy cập mảng
thường cho phép trình biên dịch suy ra rằng không có sự phụ thuộc nào tồn tại.
Tương tự, các nhánh không thể dự đoán chính xác liệu tại thời gian chạy hoặc thời
gian biên dịch sẽ giới hạn khả năng khai thác ILP. Thông thường, ILP bổ sung có sẵn,
nhưng khả năng của trình biên dịch hoặc phần cứng để tìm ILP có thể được phân tách
rộng rãi (đôi khi bằng cách thực hiện hàng ngàn hướng dẫn) bị hạn chế.
Thứ hai, thua lỗ trong hệ thống phân cấp bộ nhớ (chủ đề của Chương 5) cũng
giới hạn khả năng giữ cho đường ống đầy. Một số quầy hàng của hệ thống bộ nhớ có
thể bị ẩn, nhưng số lượng ILP hạn chế cũng giới hạn mức độ mà các quầy hàng đó có
thể bị ẩn.

Hiệu quả năng lượng và đường ống tiên tiến


Nhược điểm của việc khai thác ngày càng song song cấp độ hướng dẫn thông qua
nhiều vấn đề động và đầu cơ là năng lượng không hiệu quả. Mỗi sự đổi mới có
thể biến nhiều bóng bán dẫn thành hiệu suất, nhưng chúng thường làm như vậy
rất không hiệu quả. Bây giờ chúng ta đã va chạm với bức tường điện, chúng ta
đang thấy các thiết kế có nhiều bộ xử lý trên mỗi chip trong đó các bộ xử lý
không được đặt sâu hoặc đầu cơ mạnh mẽ như những người tiền nhiệm của nó.
Niềm tin là trong khi các bộ xử lý đơn giản hơn không nhanh như anh em tinh
vi của họ, họ cung cấp hiệu suất tốt hơn cho mỗi Joule, để họ có thể cung cấp
hiệu suất cao hơn trên mỗi chip khi các thiết kế bị hạn chế nhiều năng lượng hơn
so với số lượng bóng bán dẫn.
Hình 4.87 cho thấy số lượng các giai đoạn đường ống, chiều rộng vấn đề, đầu
cơ mức độ, tốc độ đồng hồ, lõi trên mỗi chip và sức mạnh của một số bộ vi xử lý
Intel trong quá khứ và gần đây. Lưu ý sự sụt giảm trong các giai đoạn đường ống
và sức mạnh khi các công ty chuyển sang thiết kế đa lõi.
4.11 Song song thông qua Hướng dẫn 353

Đồng Đường Vấn Ra lệnh / Lõi /


Bộ vi xử lý Năm hồ ống Quyền lực
đề Đầu cơ Chip
Tỷ lệ Các giai Chiều
đoạn rộng
Intel 486 1989 25 MHz 5 1 Không 1 5W
Intel Pentium 1993 66 MHz 5 2 Không 1 10W
Intel Pentium Pro 1997 200 MHz 10 3 Đúng 1 29W
Intel Pentium 4 Willamette 2001 2000 MHz 22 3 Đúng 1 75W
Intel Pentium 4 Prescott 2004 3600 MHz 31 3 Đúng 1 103W
Intel Core 2006 3000 MHz 14 4 Đúng 2 75W
Intel Core i7 Nehalem 2008 3600 MHz 14 4 Đúng 2-4 87W
Intel Core West 4.0.3 2010 3730 MHz 14 4 Đúng 6 130W
Cầu Intel Core i7 Ivy 2012 3400 MHz 14 4 Đúng 6 130W
Intel Core Broadwell 2014 3700 MHz 14 4 Đúng 10 140W
Intel Core i9 Skylake 2016 3100 MHz 14 4 Đúng 14 165W
Hồ băng Intel 2018 4200 MHz 14 4 Đúng 16 185W

HÌNH 4.74 Bản ghi của Bộ vi xử lý Intel về độ phức tạp của đường ống, số lượng lõi và công suất. Pentium 4 giai đoạn
đường ống không bao gồm các giai đoạn cam kết. Nếu chúng tôi bao gồm chúng, các đường ống Pentium 4 sẽ còn sâu hơn nữa.
9. Đăng ký đổi tên
Xây dựng: Một đơn vị cam kết kiểm soát các bản cập nhật cho tập tin đăng ký và ký ức. Một
số bộ xử lý được lên lịch động cập nhật tệp đăng ký ngay lập tức trong khi thực hiện, sử dụng
các thanh ghi bổ sung để thực hiện chức năng đổi tên và bảo quản bản sao cũ của thanh ghi cho
đến khi lệnh cập nhật thanh ghi không còn được suy đoán. Các bộ xử lý khác đệm kết quả, như
đã đề cập ở trên, thường nằm trong một cấu trúc được gọi là bộ đệm sắp xếp lại và cập nhật
thực tế cho tệp đăng ký xảy ra sau đó như là một phần của cam kết. Các cửa hàng vào bộ nhớ
phải được đệm cho đến khi thời gian cam kết trong a lưu trữ bộ đệm (xem Chương 5) hoặc trong
bộ đệm sắp xếp lại. Đơn vị cam kết cho phép cửa hàng ghi vào bộ nhớ từ bộ đệm khi bộ đệm có
địa chỉ hợp lệ và dữ liệu hợp lệ và khi cửa hàng không còn phụ thuộc vào các nhánh dự đoán.

Xây dựng: Truy cập bộ nhớ được hưởng lợi từ bộ nhớ đệm không chặn, mà tiếp
tục phục vụ truy cập bộ đệm trong khi bỏ lỡ bộ nhớ cache (xem Chương 5). Bộ xử lý
thực thi không theo thứ tự cần bộ đệm để cho phép các hướng dẫn thực hiện trong
khi bỏ lỡ.

Cho biết liệu các kỹ thuật hoặc thành phần sau có liên quan chủ yếu đến cách
tiếp cận dựa trên phần mềm hoặc phần cứng để khai thác ILP hay không. Trong
một số trường hợp, câu trả lời có thể là cả hai.
1. Dự đoán chi nhánh
2. Nhiều vấn đề
3. VLIW
4. Siêu sao
5. Lập kế hoạch động
6. Thực hiện ngoài trật tự
7. Đầu cơ
8. Sắp xếp lại bộ đệm
Kiểm tra
Bản thân bạn
354 Chương 4 Bộ xử lý

Vấn
F1 F2 F3 F4 đề Ex1 Ex2 Sai
Số nguyên thực thi và lưu trữ
tải
Hướng dẫn lấy và dự đoán

Ống ALU 0
Số nguyên
AGU đăng ký
+ tập tin Ống ALU 1
TLB Lai
Hướng dẫn người dự đoán
bộ nhớ Ống MAC
cache Gián tiếp Viết lại
người dự đoán
Chia ống

Vấn đề Tải ống

Lưu trữ đường ống

Giải mã hướng dẫn Điểm nổi thực thi


Ống MUL / DIV /
13 mục
KHÔNG SQRT
nhập
Sớm Chính Muộn rồi đăng ký
chỉ dẫn
giải mã xếp hàng giải mã giải mã tập tin Ống ALU

D1 D2 D3 F1 F2 F3 F4 F5

HÌNH 4.75 Cấu trúc cơ bản của đường ống số nguyên A53 có tám giai đoạn: F1 và F2 lấy lệnh, D1 và D2 thực hiện giải mã cơ
bản và D3 giải mã các hướng dẫn phức tạp hơn và được chồng chéo với giai đoạn đầu tiên của đường ống thực thi (ISS) . Sau
các giai đoạn ISS, các giai đoạn Ex1, EX2 và WB hoàn thành đường ống số nguyên. Chi nhánh sử dụng bốn yếu tố dự đoán khác nhau tùy thuộc vào
loại. Đường ống thực hiện điểm nổi sâu 5 chu kỳ ngoài 5 chu kỳ cần thiết để tìm nạp và giải mã, mang lại tổng cộng 10 giai đoạn. AGU là viết tắt của
đơn vị tạo địa chỉ và TLB cho bộ đệm giao dịch (Xem Chương 5). Thiết bị NEON thực hiện các hướng dẫn SIMD ARM cùng tên. (Từ Hennessy JL,
Patterson DA : Kiến trúc máy tính: Một cách tiếp cận định lượng, 6e, Cambridge MA, 2018, Morgan Kaufmann.)

Kết hợp tất cả lại với nhau: Intel Core i7


4.12
6700 và ARM Cortex-A53
Trong phần này, chúng tôi khám phá thiết kế của hai bộ xử lý đa vấn đề: lõi
ARM Cortex-A53, được sử dụng làm cơ sở cho một số máy tính bảng và điện
thoại di động và Intel Core i7 6700, một bộ xử lý đầu cơ cao cấp, được lên lịch
động , dành cho máy tính để bàn cao cấp và các ứng dụng máy chủ. Chúng tôi
bắt đầu với bộ xử lý đơn giản hơn. Phần này dựa trên Mục 3.12 của Kiến trúc
máy tính: A Phương pháp định lượng, tái bản lần thứ sáu.

ARM Cortex-A53
A53 là vấn đề kép, siêu âm theo lịch trình tĩnh với phát hiện sự cố động, cho phép bộ
xử lý đưa ra hai hướng dẫn cho mỗi đồng hồ. Hình 4,75 cho thấy cấu trúc cơ bản của
đường ống. Đối với hướng dẫn số nguyên nonbranch , có tám giai đoạn F1, F2, D1,
D2, D3 / ISS, EX1, EX2 và WB, như được mô tả trong chú thích. Các đường ống
theo thứ tự, vì vậy một hướng dẫn có thể bắt đầu thực hiện
4.12 Kết hợp tất cả lại với nhau: Intel Core i7 6700 và ARM Cortex-A53 355

22% 21,0%
20%
tỷ lệ

18%
16%
13,4%
Brnach dự đoán sai

14%
12% 11,1%
10%
8%
5,9%
6%
4.2% 3,7% 3,9% 3,9%
4% 2,9% 2,6% 2,9%
2% 1,3%

0%
r c k r h g

asta bzip2 gc mcf sjen


yêu tinh h264ref hmme libquantum omnetpp perlbenc xalancbmk

HÌNH 4.76 Tỷ lệ dự đoán sai của bộ dự báo nhánh A53 cho Specint2006. (Chuyển thể từ Hennessy JL, Patterson DA :
Kiến trúc máy tính: Một cách tiếp cận định lượng, 6e, Cambridge MA, 2018, Morgan Kaufmann.)

chỉ khi kết quả của nó có sẵn và hướng dẫn tiến hành đã bắt đầu. Do đó, nếu hai
hướng dẫn tiếp theo phụ thuộc, cả hai có thể tiến tới đường ống thực hiện phù
hợp, nhưng chúng sẽ được tuần tự hóa khi chúng bắt đầu đường ống đó. Khi
logic vấn đề đường ống chỉ ra rằng kết quả từ hướng dẫn đầu tiên có sẵn, hướng
dẫn thứ hai có thể phát hành.
Bốn chu trình tìm nạp lệnh bao gồm một đơn vị tạo địa chỉ tạo ra PC tiếp theo bằng
cách tăng PC cuối cùng hoặc từ một trong bốn dự đoán :
1. Bộ đệm mục tiêu nhánh đơn chứa hai tìm nạp bộ đệm lệnh (hai hướng dẫn
tiếp theo sau nhánh, giả sử dự đoán là chính xác). Bộ đệm đích này được
kiểm tra trong chu kỳ tìm nạp đầu tiên nếu nó chạm vào; sau đó hai hướng
dẫn tiếp theo được cung cấp từ bộ đệm đích. Trong trường hợp có một cú
đánh và dự đoán chính xác, nhánh được thực hiện không có chu kỳ trễ.
2. Một bộ dự đoán lai 3072 nhập được sử dụng cho tất cả các hướng dẫn
không nhấn vào bộ đệm mục tiêu nhánh và hoạt động trong F3. Các nhánh
được xử lý bởi bộ dự đoán này phải chịu độ trễ hai chu kỳ.
3. Một bộ dự báo chi nhánh gián tiếp nhập 256 hoạt động trong F4; các nhánh
được dự đoán bởi bộ dự đoán này phải chịu độ trễ ba chu kỳ khi dự đoán
chính xác.
4. Một ngăn xếp trở lại tám sâu hoạt động trong F4 và phát sinh độ trễ ba chu kỳ.
Các quyết định chi nhánh được đưa ra trong ống ALU 0, dẫn đến hình phạt sai
lầm chi nhánh là tám chu kỳ. Hình 4.76 cho thấy tỷ lệ sai lầm cho Specint2006.
Số lượng công việc bị lãng phí phụ thuộc vào cả tỷ lệ dự đoán sai và tỷ lệ phát
hành được duy trì trong thời gian mà chi nhánh bị đánh giá sai được tuân theo.
Như Hình 4.77 cho thấy, công việc lãng phí thường theo tỷ lệ sai lầm, mặc dù nó
có thể lớn hơn hoặc đôi khi ngắn hơn.
356 Chương 4 Bộ xử lý

22%
19,6%
20%
18% 16,7%
người công
việc

16% 14,7%
14%
12%
sói

10% 8,5% 8,5% 8.2%


7,2% 7,2%
8% 6,5%
Phần
trăm

6% 4,6%
4% 2,3%
2% 0,3%
0%

astar bzip2 gcc mcf sjeng

yêu tinh h264ref hmmer libquantum omnetpp perlbench xalancbmk

HÌNH 4.77 Công việc bị lãng phí do dự đoán sai chi nhánh trên A53. Do A53 là một máy theo thứ tự, nên lượng công
việc bị lãng phí phụ thuộc vào nhiều yếu tố bao gồm sự phụ thuộc dữ liệu và bỏ lỡ bộ đệm, cả hai sẽ gây ra một gian
hàng. (Chuyển thể từ Hennessy JL, Patterson DA : Kiến trúc máy tính: Một cách tiếp cận định lượng, 6e, Cambridge MA, 2018 , Morgan
Kaufmann.)

Hiệu suất của Đường ống A53


A53 có CPI lý tưởng là 0,5 vì cấu trúc phát hành kép. Các quầy hàng đường ống
có thể phát sinh từ ba nguồn :
1. Các mối nguy chức năng, xảy ra do hai hướng dẫn liền kề được chọn cho
vấn đề đồng thời sử dụng cùng một đường ống chức năng. Vì A53 được lên
lịch tĩnh, trình biên dịch nên cố gắng tránh những xung đột đó. Khi các
hướng dẫn như vậy xuất hiện tuần tự, chúng sẽ được tuần tự hóa khi bắt
đầu đường ống thực hiện khi chỉ có lệnh đầu tiên sẽ bắt đầu thực hiện.
2. Các mối nguy dữ liệu, được phát hiện sớm trong đường ống và có thể trì hoãn cả
hai hướng dẫn (nếu lần đầu tiên không thể phát hành, lần thứ hai luôn bị đình trệ)
hoặc lần thứ hai của một cặp. Một lần nữa, trình biên dịch nên cố gắng ngăn chặn
các quầy hàng như vậy khi có thể.
3. Kiểm soát các mối nguy hiểm, chỉ phát sinh khi các chi nhánh bị đánh giá
sai.
Cả TLB (Chương 5) và bỏ lỡ bộ nhớ cache cũng gây ra các quầy hàng. Hình
4.78 cho thấy CPI và đóng góp ước tính từ các nguồn khác nhau.
A53 sử dụng đường ống nông và bộ dự báo nhánh khá tích cực, dẫn đến tổn
thất đường ống khiêm tốn trong khi cho phép bộ xử lý đạt được tốc độ đồng hồ
cao ở mức tiêu thụ điện năng khiêm tốn. So với i7, A53 tiêu thụ khoảng 1/200
năng lượng cho bộ xử lý lõi tứ!
4.12 Kết hợp tất cả lại với nhau: Intel Core i7 6700 và ARM Cortex-A53 357

10

Hệ thống phân cấp bộ


9
nhớ
Gian hàng đường ống
8,56
CPI lý
s tưởng

8

4
3.37

2.14
1,75 1.76
2

1.33 1,39
1.17 1.22
0,97 1.04 1,07
1

0
hmmer h264ref libquantum perlbench sjeng bzip2 yêu tinh xalancbmk gcc astar omnetpp mcf

HÌNH 4.78 Thành phần ước tính của CPI trên ARM A53 cho thấy các quầy hàng đường
ống rất quan trọng nhưng vượt trội so với các bộ nhớ cache trong các chương trình hoạt
động kém nhất (Chương 5). Chúng được trừ khỏi CPI được đo bằng một trình giả lập chi tiết để có
được đường ống quầy hàng. Các quầy hàng đường ống bao gồm cả ba mối nguy hiểm. (Từ Hennessy JL,
Patterson DA : Kiến trúc máy tính: Một cách tiếp cận định lượng, 6e, Cambridge MA, 2018, Morgan
Kaufmann.)

Xây dựng: Cortex-A53 là lõi có thể định cấu hình hỗ trợ lệnh ARMv8 thiết lập kiến trúc.
Nó được phân phối dưới dạng IP (sở hữu trí tuệ) cốt lõi. Lõi IP là hình thức phân phối công
nghệ chủ yếu trong thiết bị di động cá nhân nhúng và các thị trường liên quan; hàng tỷ bộ
xử lý ARM và MIPS đã được tạo ra từ các lõi IP này. Lưu ý rằng lõi IP khác với lõi trong
máy tính đa lõi Intel i7. Một lõi IP (mà bản thân nó có thể là một đa lõi) được thiết kế để kết
hợp với logic khác (do đó, nó là lõi lõi của một con chip) bao gồm các bộ xử lý dành riêng
cho ứng dụng (chẳng hạn như bộ mã hóa hoặc bộ giải mã cho video) Giao diện I / O, và
giao diện bộ nhớ, và sau đó được chế tạo để mang lại một bộ xử lý được tối ưu hóa cho
một ứng dụng cụ thể. Mặc dù lõi bộ xử lý gần như giống hệt nhau, các chip kết quả có
nhiều điểm khác biệt. Một tham số là kích thước của bộ đệm L2, có thể thay đổi theo hệ số
16.

Intel Core i7 6700


Bộ vi xử lý x86 sử dụng các phương pháp tiếp cận đường ống tinh vi, sử dụng cả
vấn đề động và lập lịch đường ống động với thực thi ngoài trật tự và đầu cơ cho
đường ống 14 giai đoạn của nó. Những bộ xử lý này ,
358 Chương 4 Bộ xử lý

tuy nhiên, vẫn phải đối mặt với thách thức khi thực hiện bộ hướng dẫn x86 phức
tạp, được mô tả trong Chương 2 Intel tìm nạp các hướng dẫn x86 và chuyển
chúng thành các hướng dẫn giống như MIPS nội bộ mà Intel gọi. hoạt động vi
môCác hoạt động vi mô sau đó được thực hiện bởi một đường ống đầu cơ tinh vi,
được lên lịch linh hoạt, có khả năng duy trì tốc độ thực hiện lên tới sáu hoạt động
vi mô trên mỗi chu kỳ đồng hồ. Phần này tập trung vào đường ống vận hành vi
mô đó.

kiến trúc vi mô Các tổ Khi chúng tôi xem xét thiết kế của bộ xử lý tinh vi, được lên lịch động, thiết
chức của bộ xử lý, bao kế của các đơn vị chức năng, tệp bộ đệm và đăng ký, vấn đề hướng dẫn và điều
gồm các đơn vị chức khiển đường ống tổng thể trở nên xen kẽ, gây khó khăn cho việc tách datapath
năng chính, kết nối và khỏi đường ống. Do sự phụ thuộc lẫn nhau này, nhiều kỹ sư và nhà nghiên cứu
kiểm soát của chúng.
sử dụng thuật ngữ này kiến trúc vi mô để chỉ kiến trúc bên trong chi tiết của bộ
xử lý.
kiến trúc Intel Core i7 sử dụng sơ đồ để giải quyết các phản diện và đầu cơ không chính
sổ đăng ký Hướng dẫn xác sử dụng bộ đệm sắp xếp lại cùng với việc đổi tên thanh ghi. Đăng ký đổi tên
bộ thanh ghi hiển thị của rõ ràng đổi tên đăng ký kiến trúc trong bộ xử lý (16 trong trường hợp phiên bản
bộ xử lý; ví dụ, trong 64 bit của kiến trúc x86) cho một bộ thanh ghi vật lý lớn hơn. Core i7 sử dụng đổi
RISC-V, có 32 thanh ghi tên đăng ký để loại bỏ các phản diện. Đăng ký đổi tên yêu cầu bộ xử lý duy trì
số nguyên và 32 điểm nổi. bản đồ giữa các thanh ghi kiến trúc và vật lý, cho biết thanh ghi vật lý nào là bản
sao mới nhất của thanh ghi kiến trúc. Bằng cách theo dõi các đổi tên đã xảy ra,
việc đổi tên đăng ký cung cấp một cách tiếp cận khác để phục hồi trong trường
hợp suy đoán không chính xác: chỉ cần hoàn tác các ánh xạ đã xảy ra kể từ hướng
dẫn đầu tiên được suy đoán không chính xác. Điều này sẽ khiến trạng thái của bộ
xử lý trở về lệnh được thực thi chính xác cuối cùng, giữ ánh xạ chính xác giữa
các thanh ghi kiến trúc và vật lý.
Hình 4.79 cho thấy cấu trúc tổng thể của đường ống i7. Chúng tôi sẽ kiểm tra
đường ống bằng cách bắt đầu với tìm nạp hướng dẫn và tiếp tục cam kết hướng
dẫn, theo tám bước được dán nhãn trong hình.
1. Hướng dẫn tìm nạp bộ xử lý sử dụng bộ dự báo nhánh đa cấp tinh vi để đạt
được sự cân bằng giữa tốc độ và độ chính xác dự đoán. Ngoài ra còn có một
ngăn xếp địa chỉ trả về để tăng tốc độ trả về chức năng. Mispredictions gây ra
một hình phạt khoảng 17 chu kỳ. Sử dụng địa chỉ dự đoán, đơn vị tìm nạp lệnh
lấy 16 byte từ bộ đệm lệnh.
2. 16 byte được đặt trong bộ đệm lệnh tiền mã hóa, giai đoạn tiền mã hóa
cũng chia 16 byte thành các hướng dẫn x86 riêng lẻ. Tiền mã này không
cần thiết vì độ dài của lệnh x86 có thể từ 1 đến 17 byte và tiền mã hóa phải
xem qua một số byte trước khi biết độ dài lệnh. Hướng dẫn x86 riêng lẻ
được đặt vào hàng đợi hướng dẫn.
4.12 Kết hợp tất cả lại với nhau: Intel Core i7 6700 và ARM Cortex-A53 359

128-Entry 32 KB Inst. bộ nhớ cache (liên kết 8


inst. TLB chiều)
(8 chiều)
Giải mã trước+vĩ mô-op
phản ứng tổng hợp, tìm nạp bộ đệm

Hướng dẫn
lấy Hướng dẫn xếp hàng
phần cứng

Phức tạp Đơn giản Đơn giản Đơn giản


vĩ mô-op vĩ mô-op vĩ mô-op vĩ mô-op
Vi mô
bộ giải mã bộ giải mã bộ giải mã bộ giải mã
-mã
Phát hiện dòng vòng lặp micro-op 64-Entry

Đăng ký bảng bí danh và phân bổ


Nghỉ hưu
Bộ đệm sắp xếp lại 224-
đăng ký tập tin Entry

Trạm đặt phòng 97-Entry


Cửa
ALU ALU Tải Cửa hàng hàng ALU
ca làm ca làm ca làm
việc việc Địa chỉ Địa chỉ dữ liệu việc

SSE SSE SSE


xáo
xáo trộn xáo trộn Bộ nhớ thứ tự bộ nhớ trộn
(72 tải; 56 cửa hàng đang chờ xử
ALU ALU lý) ALU
128 bit 128 bit Cửa 128 bit
LỪA hàng LỪA
LỪA ĐẢO ĐẢO ĐẢO
FDIV FDIV & tải FDIV

1536-Entry thống Dữ liệu nhập cảnh Dữ liệu báo cáo kép 32- 256 KB thống
nhất 64 TLB (Liên kết 4 KB nhất l2
L2 TLB (12 chiều) chiều) bộ nhớ cache (liên kết 8 bộ nhớ cache (4
chiều) chiều)

8 MB tất cả các L3 được chia sẻ và Trọng tài Uncore (lập lịch xử lý và


bao gồm L3 sự khác biệt trạng thái đồng hồ / sức
bộ nhớ cache (liên kết 16 chiều) mạnh)

HÌNH 4.79 Cấu trúc đường ống Intel Core i7 được hiển thị với các thành phần hệ thống bộ
nhớ. Tổng độ sâu đường ống là 14 giai đoạn, với các dự đoán sai nhánh thường có giá 17 chu kỳ và thêm
vài chu kỳ có thể do thời gian để thiết lập lại bộ dự đoán nhánh. Thiết kế này có thể đệm 72 tải và 56 cửa
hàng. Sáu đơn vị chức năng độc lập mỗi có thể bắt đầu thực hiện một hoạt động vi mô sẵn sàng trong cùng
một chu kỳ. Tối đa bốn thao tác vi mô có thể được xử lý trong bảng đăng ký đổi tên. Bộ xử lý i7 đầu tiên
được giới thiệu vào năm 2008; i7 6700 là thế hệ thứ sáu. Cấu trúc cơ bản của i7 là tương tự nhau, nhưng
các thế hệ kế tiếp đã tăng cường hiệu suất bằng cách thay đổi chiến lược bộ đệm (Chương 5), tăng băng
thông bộ nhớ, mở rộng số lượng hướng dẫn trong chuyến bay, tăng cường dự đoán chi nhánh và cải thiện
hỗ trợ đồ họa. (Từ Hennessy JL, Patterson DA : Kiến trúc máy tính: Một cách tiếp cận định lượng, 6e ,
Cambridge MA, 2018, Morgan Kaufmann.)
360 Chương 4 Bộ xử lý

3. Micro-op giải mã ba trong số các bộ giải mã xử lý các hướng dẫn x86 dịch
trực tiếp thành một thao tác vi mô (micro-op). Đối với các hướng dẫn x86
có ngữ nghĩa phức tạp hơn, có một công cụ vi mã được sử dụng để tạo ra
chuỗi hoạt động vi mô; nó có thể tạo ra tối đa bốn hoạt động vi mô mỗi
chu kỳ và tiếp tục cho đến khi trình tự vận hành vi mô cần thiết được tạo
ra. Các hoạt động vi mô được đặt theo thứ tự của các hướng dẫn x86 trong
bộ đệm hoạt động vi mô 64 mục.
4. Các phôi đệm hoạt động vi mô phát hiện luồng vòng lặpNếu có một chuỗi
hướng dẫn nhỏ (dưới 64 hướng dẫn) bao gồm trong một vòng lặp, máy dò
luồng vòng lặp sẽ tìm thấy vòng lặp và trực tiếp phát hành các hoạt động
vi mô từ bộ đệm, loại bỏ nhu cầu kích hoạt tìm nạp lệnh và giải mã hướng
dẫn các giai đoạn.
5. Thực hiện vấn đề hướng dẫn cơ bản, tìm kiếm vị trí đăng ký trong các
bảng đăng ký, đổi tên các thanh ghi, phân bổ một mục đệm sắp xếp lại và
tìm nạp bất kỳ kết quả nào từ các thanh ghi hoặc bộ đệm sắp xếp lại trước
khi gửi các hoạt động vi mô đến các trạm đặt phòng. Tối đa bốn thao tác vi
mô có thể được xử lý mỗi chu kỳ đồng hồ; chúng được chỉ định các mục
đệm sắp xếp lại có sẵn tiếp theo.
6. I7 sử dụng một trạm đặt phòng tập trung được chia sẻ bởi sáu đơn vị chức
năng. Tối đa sáu hoạt động vi mô có thể được gửi đến các đơn vị chức
năng mỗi chu kỳ đồng hồ.
7. Các đơn vị chức năng riêng lẻ thực hiện các hoạt động vi mô, và sau đó kết
quả được gửi trở lại bất kỳ trạm đặt phòng chờ cũng như đơn vị nghỉ hưu đăng
ký, nơi họ sẽ cập nhật trạng thái đăng ký sau khi biết rằng hướng dẫn không
còn là suy đoán nữa. Mục nhập tương ứng với hướng dẫn trong bộ đệm sắp
xếp lại được đánh dấu là hoàn thành.
8. Khi một hoặc nhiều hướng dẫn ở đầu bộ đệm sắp xếp lại đã được đánh dấu
là hoàn chỉnh, việc ghi chờ xử lý trong đơn vị nghỉ hưu của thanh ghi được
thực thi và các hướng dẫn được xóa khỏi bộ đệm sắp xếp lại.

Xây dựng: phần cứng trong bước thứ hai và thứ tư có thể kết hợp hoặc cầu chì
hoạt động cùng nhau để giảm số lượng các hoạt động phải được thực hiện. Hợp nhất
vĩ mô trong bước thứ hai có các kết hợp lệnh x86, chẳng hạn như so sánh theo sau
bởi một nhánh và hợp nhất chúng thành một thao tác duy nhất. Vi mạch trong bước
thứ tư kết hợp các cặp vận hành vi mô như hoạt động tải / ALU và vận hành / lưu trữ
ALU và đưa chúng vào một trạm đặt phòng duy nhất (nơi chúng vẫn có thể phát hành
độc lập), do đó làm tăng việc sử dụng bộ đệm. Trong một nghiên cứu về kiến trúc
Intel Core cũng kết hợp microfusion và macrofusion , Chim et al. [2007] phát hiện ra
rằng vi lọc có ít tác động đến hiệu suất, trong khi đó macrofusion dường như có tác
động tích cực khiêm tốn đến hiệu suất số nguyên và ít tác động đến hiệu suất điểm
nổi.
4.12 Kết hợp tất cả lại với nhau: Intel Core i7 6700 và ARM Cortex-A53 361

2.5

2
chỉ dẫn

1.44
1.5 1.37
Chu kỳ
mỗi

1
0,81
0,71 0,76
0,68
0,54 0,60
0,47
0,5 0,42 0,41 0,38

0
k

astar bzip2 gcc mcf sjeng

yêu tinh h264ref hmmer libquantum omnetpp perlbench xalancbm

HÌNH 4.80 CPI cho các điểm chuẩn SPECCPUint2006 trên i7 6700. Các dữ liệu trong này phần
được thu thập bởi Giáo sư Lu Peng và nghiên cứu sinh Qun Liu, cả hai trường Đại học bang Louisiana.
(Chuyển thể từ Hennessy JL, Patterson DA : Kiến trúc máy tính: Một cách tiếp cận định lượng, 6e,
Cambridge MA, 2018, Morgan Kaufmann.)

Hiệu suất của i7


Do sự hiện diện của đầu cơ tích cực, rất khó để quy chính xác khoảng cách giữa
hiệu suất lý tưởng hóa và thực tế. Các hàng đợi và bộ đệm rộng rãi trên 6700 làm
giảm đáng kể xác suất của các quầy hàng vì thiếu trạm đặt chỗ, đăng ký đổi tên
hoặc bộ đệm sắp xếp lại.
Do đó, hầu hết các tổn thất đến từ các dự đoán sai nhánh hoặc bỏ lỡ bộ nhớ
cache. Chi phí của một sai lầm chi nhánh là 17 chu kỳ, trong khi chi phí bỏ lỡ L1
là khoảng 10 chu kỳ (Chương 5). Việc bỏ lỡ L2 tốn kém hơn 3 lần so với bỏ lỡ
L1 và bỏ lỡ L3 có giá gấp khoảng 13 lần so với chi phí bỏ lỡ L1 (130 chu kỳ135).
Mặc dù bộ xử lý sẽ cố gắng tìm các hướng dẫn thay thế để thực hiện trong khi bỏ
lỡ L2 và L3, nhưng có khả năng một số bộ đệm sẽ điền trước khi bỏ lỡ hoàn tất,
khiến bộ xử lý ngừng phát hành hướng dẫn.
Hình 4.80 hiển thị CPI tổng thể cho 19 điểm chuẩn SPECCPUint2006. CPI
trung bình trên i7 6700 là 0,71. Hình 4.81 cho thấy tỷ lệ sai lầm
362 Chương 4 Bộ xử lý

10%
tỷ lệ

8.2%
8%
Brnach dự đoán sai

5,7%
6%
4,8%
4.2%
4% 3.0%
2,3%
2% 1,9% 1,5%
0,8% 0,9% 0,7%
0,3%
0%
r c k r h k

asta bzip2 gc mcf sjeng


yêu
tinh h264ref hmme libquantum omnetpp perlbenc xalancbm

HÌNH 4.81 Tỷ lệ sai cho số nguyên chuẩn SPECCPU2006 trên Intel Core i7 6700. Tỷ lệ dự đoán sai được tính bằng tỷ
lệ của các chi nhánh đã hoàn thành bị dự đoán sai so với tất cả các chi nhánh đã hoàn thành. (Phỏng theo từ Hennessy JL,
Patterson DA : Kiến trúc máy tính: Một cách tiếp cận định lượng , 6e, Cambridge MA, 2018, Morgan Kaufmann.)

của các bộ dự báo chi nhánh của Intel i7 6700. Tỷ lệ dự đoán sai là khoảng một
nửa so với A53 Hình 4.82Trung vị trung bình là 2,3% so với 3,9% đối với
Spec2006 và CPI chưa đến một nửa: trung vị là 0,64 so với 1,36 đối với kiến trúc
hung hăng hơn nhiều. Tốc độ xung nhịp là 3,4 GHz trên i7 so với lên tới 1,3 GHz
cho A53, do đó thời gian hướng dẫn trung bình là 0,64 x 1 / 3,4 GHz = 0,18 ns so
với 1,36 x 1 / 1,3 Ghz = 1,05 ns, hoặc hơn năm lần nhanh. Mặt khác, i7 sử dụng
sức mạnh gấp 200 lần!

Hiểu hiệu suất Intel Core i7 kết hợp một đường ống 14 giai đoạn và nhiều vấn đề tích cực để đạt
được hiệu suất cao. Bằng cách giữ độ trễ cho các hoạt động back-to-back thấp,
chương trình tác động của sự phụ thuộc dữ liệu sẽ giảm. Các nút thắt hiệu suất tiềm năng
nghiêm trọng nhất cho các chương trình chạy trên bộ xử lý này là gì? Danh sách
sau đây bao gồm một số vấn đề về hiệu suất có thể xảy ra, ba vấn đề cuối cùng
có thể áp dụng dưới một số hình thức cho bất kỳ bộ xử lý đường ống hiệu suất
cao nào.
■ Việc sử dụng các hướng dẫn x86 không ánh xạ tới một vài thao tác vi mô đơn
giản
■ Các nhánh khó dự đoán, gây ra các quầy hàng sai lầm và khởi động lại khi
đầu cơ thất bại
■ Sự phụ thuộc dài hạn thường được gây ra bởi các hướng dẫn chạy dài hoặc
hệ thống phân cấp bộ nhớGiáo sư dẫn đến quầy hàng
■ Sự chậm trễ hiệu suất phát sinh trong việc truy cập bộ nhớ (xem Chương 5)
khiến bộ xử lý bị đình trệ
4.13 Nhanh hơn: Tính song song cấp độ hướng dẫn và ma trận nhân 363

Nhanh hơn: Thuyết song song


4.13
cấp độ hướng dẫn và ma trận
nhân
Quay trở lại ví dụ DGEMM từ Chương 3, chúng ta có thể thấy tác động của song
song cấp độ hướng dẫn bằng cách hủy bỏ vòng lặp để bộ xử lý thực thi nhiều vấn
đề, không theo thứ tự có nhiều hướng dẫn để làm việc. Hình 4.82 hiển thị phiên
bản chưa được kiểm soát của Hình 3.20, chứa nội tại C để tạo ra các hướng dẫn
AVX.
Giống như ví dụ không kiểm soát trong Hình 4.85 ở trên, chúng tôi sẽ hủy đăng ký
vòng lặp bốn lần. Thay vì tự hủy đăng ký vòng lặp trong C bằng cách tạo bốn bản sao của
mỗi nội tại Hình 3.20, chúng ta có thể dựa vào trình biên dịch gcc để thực hiện việc bỏ
kiểm soát tối ưu hóa −O3. (Chúng tôi sử dụng UNROLL không đổi trong mã C để kiểm
soát số lượng không kiểm soát trong trường hợp chúng tôi muốn thử các giá trị khác.)
Chúng tôi bao quanh mỗi nội tại với một đơn giản cho vòng lặp với bốn lần lặp (dòng 9,
15 và 19) và thay thế vô hướng C0 trong Hình 3.20 với một mảng bốn yếu tố c [] (dòng 8,
10, 16 và 20).

1. #include <x86intrin.h>
2. #define UNROLL (4)
3.
4. void dgemm (int n, double * A, double * B, double * C)
5. {
6. cho (int i = 0; i <n; i + = UNROLL * 8)
7. cho (int j = 0; j <n; ++ j) {
8. __m512d c [UNROLL];
9. cho (int r = 0; r <UNROLL; r ++)
10. c [r] = _mm512_load_pd (C + i + r * 8 + j * n); // [UNROLL];
11.
12. cho (int k = 0; k <n; k ++)
13. {
14. __m512d bb = _mm512_broadcastsd_pd (_mm_load_sd (B + j * n + k));
15. cho (int r = 0; r <UNROLL; r ++)
16. c [r] = _mm512_fmadd_pd (_mm512_load_pd (A + n * k + r * 8 + i), bb, c
[r]);
17. }
18.
19. cho (int r = 0; r <UNROLL; r ++)
20. _mm512_store_pd (C + i + r * 8 + j * n, c [r]);
21. }
22. }

HÌNH 4.82 Phiên bản DGEMM được tối ưu hóa C bằng cách sử dụng nội tại C để tạo các hướng dẫn song song với từ
phụ AVX cho x86 (Hình 3.20) và lặp không kiểm soát để tạo ra nhiều cơ hội hơn cho song song cấp độ hướng dẫn.
Hình 4.96 hiển thị ngôn ngữ lắp ráp được tạo bởi trình biên dịch cho vòng lặp bên trong, nó bỏ qua ba cơ thể vòng lặp để phơi bày song
song cấp độ hướng dẫn.
364 Chương 4 Bộ xử lý

Hình 4.83 hiển thị đầu ra ngôn ngữ lắp ráp của mã chưa được kiểm soát. Như
dự kiến, trong Hình 4.83 có bốn phiên bản của mỗi hướng dẫn AVX trong Hình
3.23, với một ngoại lệ. Chúng tôi chỉ cần một bản sao của vbroadcastsd hướng dẫn,
vì chúng ta có thể sử dụng tám bản sao của phần tử B trong thanh ghi % ymm0
lặp đi lặp lại trong suốt vòng lặp. Do đó, năm hướng dẫn AVX trong Hình 3.23
trở thành 13 trong Hình 4.83và bảy hướng dẫn số nguyên xuất hiện trong cả hai,
mặc dù các hằng số và thay đổi địa chỉ để giải thích cho việc bỏ kiểm soát. Do đó,
mặc dù không kiểm soát được bốn lần, số lượng hướng dẫn trong phần thân của
vòng lặp chỉ tăng gấp đôi: từ 11 đến 20.
Tối ưu hóa cho song song tiểu từ và song song cấp độ hướng dẫn
dẫn đến tốc độ tổng thể 8,59 so với DGEMM không được tối ưu hóa Hình 3.19
So với phiên bản Python trong. Chương 1, nó nhanh gấp 4600 lần.

Xây dựng: Không có quầy hàng đường ống mặc dù sử dụng lại đăng ký % zmm5
trong dòng 9 đến 12 của Hình 4.83 bởi vì đường ống Intel Core i7 đổi tên các thanh
ghi.

1 . vmovapd (% r11),% zmm4 # Tải 8 phần tử C vào% zmm4


2 . di chuyển % rbx,% rcx # đăng ký% RCx =% rbx
3 . xor % thuế,% thuế # đăng ký% eax = 0
4 . vmovapd 0x20 (% r11),% zmm3 # Tải 8 phần tử C vào% zmm3
5 . vmovapd 0x40 (% r11),% zmm2 # Tải 8 phần tử C vào% zmm2
6 . vmovapd 0x60 (% r11),% zmm1 # Tải 8 phần tử C vào% zmm1
# Tạo 8 bản sao của phần tử B bằng%
7 . vbroadcastsd (% rax,% r8,8),% zmm0 zmm0
số # đăng ký% rax =% rax + 8
8 . thêm $ 0,% rax
9 . vfmadd231pd (% RCx),% zmm0,% zmm4 # Mul song song và thêm% zmm0,% zmm4
0x20 (% rcx),% zmm0,%
10 . vfmadd231pd zmm3 # Mul song song và thêm% zmm0,% zmm3
0x40 (% rcx),% zmm0,%
11 . vfmadd231pd zmm2 # Mul song song và thêm% zmm0,% zmm2
0x60 (% rcx),% zmm0,%
12 . vfmadd231pd zmm1 # Mul song song và thêm% zmm0,% zmm1
13 . thêm % r9,% RCx # đăng ký% RCx =% RCx
14 . cmp % r10,% rax # so sánh% r10 với% rax
15 . jne 50 <dgemm + 0x50> # nhảy nếu không% r10 !=% rax
16 . thêm $ 0x1,% esi # đăng ký% esi =% esi + 1
17 . vmovapd % zmm4, (% r11) # Lưu trữ% zmm4 thành 8 phần tử C
18 . vmovapd % zmm3, 0x20 (% r11) # Lưu trữ% zmm3 thành 8 phần tử C
19 . vmovapd % zmm2, 0x40 (% r11) # Lưu trữ% zmm2 thành 8 phần tử C
20 . vmovapd % zmm1, 0x60 (% r11) # Lưu% zmm1 vào 8 phần tử C

HÌNH 4.83 Ngôn ngữ lắp ráp x86 cho thân của các vòng lồng nhau được tạo bằng cách biên dịch mã C chưa được
kiểm soát Hình 4.82.
4.15 Ngụy biện và Cạm bẫy 365

Là những tuyên bố sau đúng hay sai? Kiểm tra


Bản thân bạn
1. Intel Core i7 sử dụng đường ống nhiều vấn đề để thực hiện trực tiếp các
hướng dẫn x86.
2. Cả Cortex-A53 và Core i7 đều sử dụng nhiều vấn đề động.
3. Kiến trúc vi mô Core i7 có nhiều thanh ghi hơn x86 yêu cầu.
4. Intel Core i7 sử dụng ít hơn một nửa các giai đoạn đường ống của Intel
Pentium 4 Prescott trước đó (xem Hình 4.57).

Chủ đề nâng cao: Giới thiệu về Kỹ thuật số


4.14 Thiết kế bằng ngôn ngữ thiết kế phần cứng
để mô tả và mô hình một đường ống
và nhiều hình minh họa đường ống
Thiết kế kỹ thuật số hiện đại được thực hiện bằng ngôn ngữ mô tả phần cứng và
các công cụ tổng hợp hỗ trợ máy tính hiện đại có thể tạo ra các thiết kế phần cứng
chi tiết từ các mô tả bằng cả thư viện và tổng hợp logic. Toàn bộ sách được viết
trên các ngôn ngữ như vậy và sử dụng chúng trong thiết kế kỹ thuật số. Phần này,
xuất hiện trực tuyến, giới thiệu ngắn gọn và cho thấy cách ngôn ngữ thiết kế phần
cứng, Verilog trong trường hợp này, có thể được sử dụng để mô tả bộ xử lý điều
khiển cả về hành vi và ở dạng phù hợp để tổng hợp phần cứng. Sau đó, nó cung
cấp một loạt các mô hình hành vi trong Verilog của đường ống năm giai đoạn.
Mô hình ban đầu bỏ qua các mối nguy hiểm và bổ sung vào mô hình nêu bật các
thay đổi để chuyển tiếp, các mối nguy dữ liệu và các mối nguy hiểm của nhánh.
Sau đó, chúng tôi cung cấp khoảng một chục hình minh họa bằng cách sử
dụng biểu diễn đường ống đồ họa một chu kỳ cho những người đọc muốn xem
chi tiết hơn về cách các đường ống hoạt động trong một vài chuỗi hướng dẫn
RISC-V.

4.15 Ngụy biện và Cạm bẫy

Ngụy biện: Đường ống rất dễ.


Sách của chúng tôi làm chứng cho sự tinh tế của việc thực hiện đường ống chính
xác. Cuốn sách tiên tiến của chúng tôi đã có một lỗi đường ống trong phiên bản đầu
tiên của nó, mặc dù nó đã được hơn 100 người xem xét và được kiểm tra lớp học tại
18 trường đại học. Lỗi chỉ được phát hiện khi ai đó cố gắng xây dựng máy tính trong
cuốn sách đó. Thực tế là Verilog
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e1

Chủ đề nâng cao: Giới thiệu về


4.14 Thiết kế kỹ thuật số sử dụng thiết kế phần cứng
Ngôn ngữ để mô tả và mô hình hóa một
đường ống và nhiều minh họa đường
ống khác

Phần trực tuyến này bao gồm các ngôn ngữ mô tả phần cứng và sau đó đưa ra
hàng tá ví dụ về sơ đồ đường ống, bắt đầu từ trang 366.e18.
Như đã đề cập trong Phụ lục A, Verilog có thể mô tả bộ xử lý để mô phỏng
hoặc với ý định rằng đặc tả Verilog được tổng hợp. Để đạt được kết quả tổng hợp
có thể chấp nhận về kích thước và tốc độ, và một đặc điểm kỹ thuật hành vi dành
cho tổng hợp phải phân định cẩn thận các phần có tính tổ hợp cao của thiết kế,
chẳng hạn như một datapath, từ điều khiển. Datapath sau đó có thể được tổng hợp
bằng cách sử dụng các thư viện có sẵn. Một đặc điểm kỹ thuật Verilog dành cho
tổng hợp thường dài hơn và phức tạp hơn.
Chúng tôi bắt đầu với một mô hình hành vi của đường ống năm giai đoạn. Để
minh họa sự phân đôi giữa các thiết kế hành vi và tổng hợp, sau đó chúng tôi đưa
ra hai mô tả Verilog về bộ xử lý RISC-V đa chu kỳ trên mỗi hướng dẫn: một chỉ
dành cho mô phỏng và một phù hợp để tổng hợp.

Sử dụng Verilog cho Đặc tả hành vi với Mô phỏng cho


Đường ống năm giai đoạn
Hình e4.14.1 cho thấy một mô tả hành vi Verilog của đường ống xử lý Hướng dẫn
ALU cũng như tải và lưu trữ. Nó không chứa các nhánh (thậm chí không chính xác!),
mà chúng tôi hoãn lại bao gồm cho đến sau trong chương.
Vì Verilog thiếu khả năng xác định các thanh ghi với các trường được đặt tên
như cấu trúc trong C, chúng tôi sử dụng một số thanh ghi độc lập cho mỗi thanh
ghi đường ống. Chúng tôi đặt tên cho các thanh ghi này với một tiền tố sử dụng
cùng một quy ước; do đó, IFIDIR là phần IR của thanh ghi đường ống IFID.
Phiên bản này là một mô tả hành vi không dành cho tổng hợp. Các hướng dẫn
có cùng số chu kỳ đồng hồ với thiết kế phần cứng của chúng tôi, nhưng điều
khiển được thực hiện theo cách đơn giản hơn bằng cách giải mã liên tục các
trường của hướng dẫn trong mỗi giai đoạn ống. Do sự khác biệt này, thanh ghi
lệnh (IR) là cần thiết trong toàn bộ đường ống và toàn bộ IR được truyền từ giai
đoạn đường ống đến giai đoạn đường ống. Khi bạn đọc các mô tả Verilog trong
chương này, hãy nhớ rằng các hành động trong luôn luôn tất cả các khối xảy ra
song song trên mỗi chu kỳ đồng hồ. Vì không có bài tập chặn, thứ tự của các sự
kiện trong luôn luôn khối là tùy ý.
365.e2 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

mô-đun RISCVCPU (đồng hồ);


// Hướng dẫn opcodes
tham số LW = 7'b000_0011, SW = 7'b010_0011, BEQ = 7'b110_0011, NOP = 32'h0000_0013, ALUop
= 7'b001_0011;
đồng hồ đầu vào;

reg [31: 0] PC, Regs [0:31], IDEXA, IDEXB, EXMEMB, EXMEMALUOut,


MEMWBValue;
reg [31: 0] IMemory [0: 1023], DMemory [0: 1023], // bộ nhớ riêng IFIDIR, IDEXIR, EXMEMIR,
MEMWBIR; // đăng ký đường ống
dây [4: 0] IFIDrs1, IFIDrs2, MEMWBrd; // Truy cập các trường đăng ký dây [6: 0] IDEXop,
EXMEMop, MEMWBop; // Truy cập dây opcodes [31: 0] Ain, Bin; // đầu vào ALU

// Các bài tập này xác định các trường từ các thanh ghi đường ống gán IFIDrs1 = IFIDIR
[19:15]; // trường rs1
gán IFIDrs2 = IFIDIR [24:20]; // trường rs2
gán IDEXop = IDEXIR [6: 0]; // opcode
chỉ định EXMEMop = EXMEMIR [6: 0]; // opcode
chỉ định MEMWBop = MEMWBIR [6: 0]; // opcode
chỉ định MEMWBrd = MEMWBIR [11: 7]; // trường rd
// Đầu vào cho ALU đến trực tiếp từ các thanh ghi đường ống ID / EX được gán Ain = IDEXA;

gán Bin = IDEXB;

số nguyên i; // được sử dụng để khởi tạo các thanh ghi


ban đầu
bắt đầu
PC = 0;
IFIDIR = NOP; IDEXIR = NOP; EXMEMIR = NOP; MEMWBIR = NOP; // đặt NOP vào sổ đăng ký
đường ống
cho (i = 0; i <= 31; i = i + 1) Regs [i] = i; // khởi tạo các thanh ghi - chỉ để chúng không quan tâm

kết thúc

// Hãy nhớ rằng TẤT CẢ những hành động này xảy ra ở mọi giai đoạn đường ống và với việc sử dụng
<= chúng xảy ra song song!
luôn luôn @ (đồng hồ định vị) bắt
đầu

// hướng dẫn đầu tiên trong đường ống đang được tìm nạp
// Lấy và tăng PC
IFIDIR <= IMemory [PC >> 2];
PC <= PC + 4;

// hướng dẫn thứ hai trong đường ống là tìm nạp các thanh ghi
IDEXA <= Regs [IFIDrs1]; IDEXB <= Regs [IFIDrs2]; // nhận hai thanh ghi IDEXIR <= IFIDIR; //
đi dọc theo IR - có thể xảy ra ở bất cứ đâu, vì điều này
chỉ ảnh hưởng đến giai đoạn tiếp theo!

// hướng dẫn thứ ba đang thực hiện tính toán địa chỉ hoặc thao tác ALU nếu (IDEXop == LW)

EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:20]}; khác nếu
(IDEXop == SW)
EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:25] ,
IDEXIR [11: 7]};
khác nếu (IDEXop == ALUop)
trường hợp (IDEXIR [31:25]) // trường hợp cho các hướng dẫn loại R khác nhau 0:
EXMEMALUOut <= Ain + Bin; // thêm hoạt động

HÌNH e4.14.1 Mô hình hành vi Verilog cho đường ống năm tầng RISC-V, bỏ qua các mối
nguy hiểm về chi nhánh và dữ liệu. Như trong thiết kế trước đó trong Chương 4, chúng tôi sử dụng
hướng dẫn và dữ liệu riêng biệt bộ nhớ, sẽ được thực hiện bằng cách sử dụng bộ nhớ riêng như chúng tôi
mô tả Chương 5.
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e3

mặc định :; // các hoạt động loại R khác: trừ, SLT, v.v.
kết thúc
EXMEMIR <= IDEXIR; EXMEMB <= IDEXB; // vượt qua đăng ký IR & B // Giai đoạn Mem của
đường ống
if (EXMEMop == ALUop) MEMWBValue <= EXMEMALUOut; // vượt qua kết quả ALU

khác nếu (EXMEMop == LW) MEMWBValue <= DMemory [EXMEMALUOut >> 2]; khác nếu
(EXMEMop == SW) DMemory [EXMEMALUOut>> 2] <= EXMEMB; // lưu trữ MEMWBIR <=
EXMEMIR. // đi dọc

// Giai đoạn WB
if (((MEMWBop == LW) || (MEMWBop == ALUop)) && (MEMWBrd != 0)) // đăng ký cập
nhật nếu tải / hoạt động ALU và đích không 0
Regs [MEMWBrd] <= MEMWBValue;
kết thúc
mô-đun cuối

HÌNH e4.14.1 Mô hình hành vi Verilog cho đường ống năm tầng RISC-V, bỏ qua các mối
nguy hiểm về chi nhánh và dữ liệu. (Tiếp tục)

Thực hiện chuyển tiếp trong Verilog


Để mở rộng mô hình Verilog hơn nữa , Hình e4.14.2 cho thấy việc bổ sung logic
chuyển tiếp cho trường hợp khi nguồn và đích là hướng dẫn ALU. Không có
quầy hàng tải cũng không có chi nhánh được xử lý; chúng tôi sẽ thêm những điều
này trong thời gian ngắn. Những thay đổi từ mô tả Verilog trước đó được tô sáng.

Ai đó đã đề xuất chuyển văn bản cho kết quả từ hướng dẫn ALU từ WB sang giai Kiểm tra
đoạn MEM, chỉ ra rằng điều này sẽ làm giảm độ dài tối đa chuyển tiếp từ hướng Bản thân bạn
dẫn ALU theo một chu kỳ. Mà sau đây là lý do chính xác không đến xem xét
một sự thay đổi như vậy?
1. Nó sẽ không thực sự thay đổi logic chuyển tiếp, vì vậy nó không có lợi thế.
2. Không thể thực hiện thay đổi này trong bất kỳ trường hợp nào vì việc ghi
kết quả ALU phải ở cùng giai đoạn đường ống với ghi cho kết quả tải.
3. Di chuyển ghi cho các hướng dẫn ALU sẽ tạo ra khả năng ghi xảy ra từ hai
hướng dẫn khác nhau trong cùng một chu kỳ đồng hồ. Một cổng ghi thêm
sẽ được yêu cầu trên tệp đăng ký hoặc một nguy cơ cấu trúc sẽ được tạo.
4. Kết quả của một hướng dẫn ALU không có sẵn kịp thời để thực hiện ghi
trong MEM .
Verilog hành vi với phát hiện gian hàng
Nếu chúng ta bỏ qua các nhánh, các quầy hàng cho các mối nguy dữ liệu trong
đường ống RISC-V bị giới hạn trong một trường hợp đơn giản: tải có kết quả
hiện đang ở giai đoạn đồng hồ WB. Do đó, việc mở rộng Verilog để xử lý tải với
đích là hướng dẫn ALU hoặc tính toán địa chỉ hiệu quả là khá đơn giản và Hình
e4.14.3 cho thấy một vài bổ sung cần thiết.
365.e4 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

mô-đun RISCVCPU (đồng hồ);


// Hướng dẫn opcodes
tham số LW = 7'b000_0011, SW = 7'b010_0011, BEQ = 7'b110_0011, NOP = 32'h0000_0013, ALUop
= 7'b001_0011;
đồng hồ đầu vào;

reg [31: 0] PC, Regs [0:31], IDEXA, IDEXB, EXMEMB, EXMEMALUOut,


MEMWBValue;
reg [31: 0] IMemory [0: 1023], DMemory [0: 1023], // bộ nhớ riêng IFIDIR, IDEXIR, EXMEMIR,
MEMWBIR; // đăng ký đường ống
dây [4: 0] IFIDrs1, IFIDrs2, IDEXrs1, IDEXrs2, EXMEMrd, MEMWBrd; // Truy cập các trường
đăng ký

dây [6: 0] IDEXop, EXMEMop, MEMWBop; // Truy cập dây opcodes [31: 0]
Ain, Bin; // đầu vào ALU
// khai báo tín hiệu bỏ qua
bypass dâyAfromMEM, bypassAfromALUinWB ,
bypassBfromMEM, bypassBfromALUinWB ,
bypassAfromLDinWB, bypassBfromLDinWB;

chỉ định IFIDrs1 = IFIDIR [19:15];


chỉ định IFIDrs2 = IFIDIR [24:20];
gán IDEXop = IDEXIR [6: 0];
gán IDEXrs1 = IDEXIR [19:15];
gán IDEXrs2 = IDEXIR [24:20];
chỉ định EXMEMop = EXMEMIR [6: 0];
chỉ định EXMEMrd = EXMEMIR [11: 7];
chỉ định = MEMWBIR [6: 0];
MEMWBop = MEMWBIR [11: 7];
chỉ định MEMWBrd
// Bỏ qua để nhập A từ giai đoạn MEM cho hoạt động ALU gán bypassAfromMEM =
(IDEXrs1 == EXMEMrd) && (IDEXrs1 != 0) &&
(EXMEMop == ALUop);
// Bỏ qua đầu vào B từ giai đoạn MEM cho hoạt động ALU gán bypassBfromMEM =
(IDEXrs2 == EXMEMrd) && (IDEXrs2 != 0) &&
(EXMEMop == ALUop);
// Việc bỏ qua để nhập A từ giai đoạn WB cho một hoạt động ALU chỉ định
bypassAfromALUinWB = (IDEXrs1 == MEMWBrd) && (IDEXrs1 != 0) &&
(MEMWBop == ALUop);
// Việc bỏ qua đầu vào B từ giai đoạn WB cho hoạt động ALU chỉ định bypassBfromALUinWB =
(IDEXrs2 == MEMWBrd) && (IDEXrs2 != 0) &&
(MEMWBop == ALUop);
// Bỏ qua để nhập A từ giai đoạn WB cho một hoạt động LW gán bypassAfromLDinWB =
(IDEXrs1 == MEMWBrd) && (IDEXrs1 != 0) &&
(MEMWBop == LW);
// Việc bỏ qua đầu vào B từ giai đoạn WB cho một hoạt động LW chỉ định bypassBfromLDinWB
= (IDEXrs2 == MEMWBrd) && (IDEXrs2 != 0) &&
(MEMWBop == LW);
// Đầu vào A cho ALU được bỏ qua từ MEM nếu có đường tránh ở đó ,

// Mặt khác từ WB nếu có một đường vòng ở đó, và nếu không thì đến từ thanh ghi IDEX

gán Ain = bypassAfromMEM ? EXMEMALUOut :


(bypassAfromALUinWB || bypassAfromLDinWB) ? MEMWBValue :
IDEXA;
// Đầu vào B cho ALU được bỏ qua từ MEM nếu có đường tránh ở đó ,

// Mặt khác từ WB nếu có một đường vòng ở đó, và nếu không thì đến từ thanh ghi IDEX

HÌNH e4.14.2 Một định nghĩa hành vi của đường ống RISC-V năm giai đoạn với việc bỏ qua các
hoạt động ALU và tính toán địa chỉ. Mã được thêm vào Hình e4.14.1 để xử lý bỏ qua là nhấn mạnh. Bởi vì
các đường vòng này chỉ yêu cầu thay đổi nơi đầu vào ALU đến, nên những thay đổi duy nhất cần có là logic tổ
hợp chịu trách nhiệm chọn đầu vào ALU. (Tiếp tục trên trang tiếp theo)
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e5

gán Bin = bypassBfromMEM ? EXMEMALUOut :


(bypassBfromALUinWB || bypassBfromLDinWB) ? MEMWBValue :
IDEXB;

số nguyên i; // được sử dụng để khởi tạo các thanh ghi


ban đầu
bắt đầu
PC = 0;
IFIDIR = NOP; IDEXIR = NOP; EXMEMIR = NOP; MEMWBIR = NOP; // đặt NOP vào sổ đăng ký
đường ống
cho (i = 0; i <= 31; i = i + 1) Regs [i] = i; // khởi tạo các thanh ghi - chỉ để chúng không quan tâm

kết thúc

// Hãy nhớ rằng TẤT CẢ những hành động này xảy ra ở mọi giai đoạn đường ống và với việc sử dụng
<= chúng xảy ra song song!
luôn luôn @ (đồng hồ định vị) bắt
đầu

// hướng dẫn đầu tiên trong đường ống đang được tìm nạp
// Lấy và tăng PC
IFIDIR <= IMemory [PC >> 2];
PC <= PC + 4;

// hướng dẫn thứ hai trong đường ống là tìm nạp các thanh ghi
IDEXA <= Regs [IFIDrs1]; IDEXB <= Regs [IFIDrs2]; // nhận hai thanh ghi IDEXIR <= IFIDIR; //
đi dọc theo IR - có thể xảy ra ở bất cứ đâu, vì điều này
chỉ ảnh hưởng đến giai đoạn tiếp theo!

// hướng dẫn thứ ba đang thực hiện tính toán địa chỉ hoặc thao tác ALU nếu (IDEXop == LW)

EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:20]}; khác nếu
(IDEXop == SW)
EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:25] ,
IDEXIR [11: 7]};
khác nếu (IDEXop == ALUop)
trường hợp (IDEXIR [31:25]) // trường hợp cho các hướng dẫn loại R khác nhau 0:
EXMEMALUOut <= Ain + Bin; // thêm hoạt động
mặc định :; // các hoạt động loại R khác: trừ, SLT, v.v.
kết thúc
EXMEMIR <= IDEXIR; EXMEMB <= IDEXB; // vượt qua đăng ký IR & B // Giai đoạn Mem của
đường ống
if (EXMEMop == ALUop) MEMWBValue <= EXMEMALUOut; // vượt qua kết quả ALU

khác nếu (EXMEMop == LW) MEMWBValue <= DMemory [EXMEMALUOut >> 2]; khác nếu
(EXMEMop == SW) DMemory [EXMEMALUOut>> 2] <= EXMEMB; // lưu trữ MEMWBIR <=
EXMEMIR. // đi dọc

// Giai đoạn WB
if (((MEMWBop == LW) || (MEMWBop == ALUop)) && (MEMWBrd != 0)) // đăng ký cập
nhật nếu tải / hoạt động ALU và đích không 0
Regs [MEMWBrd] <= MEMWBValue;
kết thúc
mô-đun cuối

HÌNH e4.14.2 Một định nghĩa hành vi của đường ống RISC-V năm giai đoạn với việc bỏ
qua các hoạt động ALU và tính toán địa chỉ. (Tiếp tục)
mô-đun RISCVCPU (đồng hồ);
// Hướng dẫn opcodes
tham số LW = 7'b000_0011, SW = 7'b010_0011, BEQ = 7'b110_0011, NOP = 32'h0000_0013, ALUop
= 7'b001_0011;
đồng hồ đầu vào;

reg [31: 0] PC, Regs [0:31], IDEXA, IDEXB, EXMEMB, EXMEMALUOut,


MEMWBValue;
reg [31: 0] IMemory [0: 1023], DMemory [0: 1023], // bộ nhớ riêng IFIDIR, IDEXIR, EXMEMIR,
MEMWBIR; // đăng ký đường ống
dây [4: 0] IFIDrs1, IFIDrs2, IDEXrs1, IDEXrs2, EXMEMrd, MEMWBrd; // Truy cập các trường
đăng ký

dây [6: 0] IDEXop, EXMEMop, M EMWBop; // Truy cập dây opcodes [31: 0]
Ain, Bin; // đầu vào ALU
// khai báo tín hiệu bỏ qua
bypass dâyAfromMEM, bypassAfromALUinWB ,
bypassBfromMEM, bypassBfromALUinWB ,
bypassAfromLDinWB, bypassBfromLDinWB;
gian hàng dây; // tín hiệu gian hàng

chỉ định IFIDrs1 = IFIDIR [19:15];


chỉ định IFIDrs2 = IFIDIR [24:20];
gán IDEXop = IDEXIR [6: 0];
gán IDEXrs1 = IDEXIR [19:15];
gán IDEXrs2 = IDEXIR [24:20];
chỉ định EXMEMop = EXMEMIR [6: 0];
chỉ định EXMEMrd = EXMEMIR [11: 7];
chỉ định MEMWBop = MEMWBIR [6: 0];
chỉ định MEMWBrd = MEMWBIR [11: 7];

// Bỏ qua để nhập A từ giai đoạn MEM cho thao tác ALU gán bypassAfromMEM = (IDEXrs1
== EXMEMrd) && (IDEXrs1 != 0) &&
(EXMEMop == ALUop);
// Bỏ qua đầu vào B từ giai đoạn MEM cho hoạt động ALU gán bypassBfromMEM =
(IDEXrs2 == EXMEMrd) && (IDEXrs2 != 0) &&
(EXMEMop == ALUop);
// Việc bỏ qua để nhập A từ giai đoạn WB cho một hoạt động ALU chỉ định
bypassAfromALUinWB = (IDEXrs1 == MEMWBrd) && (IDEXrs1 != 0) &&
(MEMWBop == ALUop);
// Việc bỏ qua đầu vào B từ giai đoạn WB cho hoạt động ALU chỉ định bypassBfromALUinWB =
(IDEXrs2 == MEMWBrd) && (IDEXrs2 != 0) &&
(MEMWBop == ALUop);
// Bỏ qua để nhập A từ giai đoạn WB cho một hoạt động LW gán bypassAfromLDinWB =
(IDEXrs1 == MEMWBrd) && (IDEXrs1 != 0) &&
(MEMWBop == LW);
// Việc bỏ qua đầu vào B từ giai đoạn WB cho một hoạt động LW chỉ định bypassBfromLDinWB
= (IDEXrs2 == MEMWBrd) && (IDEXrs2 != 0) &&
(MEMWBop == LW);
// Đầu vào A cho ALU được bỏ qua từ MEM nếu có đường tránh ở đó ,

// Mặt khác từ WB nếu có một đường vòng ở đó, và nếu không thì đến từ thanh ghi IDEX

gán Ain = bypassAfromMEM ? EXMEMALUOut :


(bypassAfromALUinWB || bypassAfromLDinWB) ? MEMWBValue :
IDEXA;
// Đầu vào B cho ALU được bỏ qua từ MEM nếu có đường tránh ở đó ,

// Mặt khác từ WB nếu có một đường vòng ở đó, và nếu không thì đến từ thanh ghi IDEX

gán Bin = bypassBfromMEM ? EXMEMALUOut :


(bypassBfromALUinWB || bypassBfromLDinWB) ? MEMWBValue :
IDEXB;

HÌNH e4.14.3 Một định nghĩa hành vi của đường ống RISC-V năm giai đoạn với các quầy
hàng để tải khi đích đến là một hướng dẫn ALU hoặc tính toán địa chỉ hiệu quả. Các thay
đổi từ Hình e4.14.2 được làm nổi bật. (Tiếp tục trên trang tiếp theo)
// Tín hiệu phát hiện gian hàng dựa trên việc sử dụng kết quả từ đó
LW
gán stall = (MEMWBop == LW) && (// hướng dẫn nguồn là tải
(((IDEXop == LW) || (IDEXop == SW)) && (IDEXrs1 == MEMWBrd))
|| // gian hàng cho calc địa chỉ
((IDEXop == ALUop) && ((IDEXrs1 == MEMWBrd) || (IDEXrs2
== MEMWBrd))); // Sử dụng ALU

số nguyên i; // được sử dụng để khởi tạo các thanh ghi


ban đầu
bắt đầu
PC = 0;
IFIDIR = NOP; IDEXIR = NOP; EXMEMIR = NOP; MEMWBIR = NOP; // đặt NOP vào sổ đăng
ký đường ống
cho (i = 0; i <= 31; i = i + 1) Regs [i] = i; // khởi tạo các thanh ghi - chỉ để chúng không quan tâm

kết thúc

// Hãy nhớ rằng TẤT CẢ những hành động này xảy ra ở mọi giai đoạn đường ống và với việc sử dụng
<= chúng xảy ra song song!
luôn luôn @ (đồng hồ định vị) bắt
đầu

nếu (~ cài đặt)


bắt đầu // ba giai đoạn đường ống đầu tiên bị đình trệ nếu có nguy cơ tải

// hướng dẫn đầu tiên trong đường ống đang được tìm nạp
// Lấy và tăng PC
IFIDIR <= IMemory [PC >> 2];
PC <= PC + 4;

// hướng dẫn thứ hai trong đường ống là tìm nạp các thanh ghi
IDEXA <= Regs [IFIDrs1]; IDEXB <= Regs [IFIDrs2]; // nhận hai
sổ đăng ký
IDEXIR <= IFIDIR; // vượt qua IR - có thể xảy ra ở bất cứ đâu, vì điều này chỉ ảnh hưởng đến giai
đoạn tiếp theo!

// hướng dẫn thứ ba đang thực hiện tính toán địa chỉ hoặc thao tác ALU nếu (IDEXop == LW)

EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:20]}; khác nếu
(IDEXop == SW)
EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:25] ,
IDEXIR [11: 7]};
khác nếu (IDEXop == ALUop)
trường hợp (IDEXIR [31:25]) // trường hợp cho các hướng dẫn loại R khác nhau 0:
EXMEMALUOut <= Ain + Bin; // thêm hoạt động
mặc định :; // các hoạt động loại R khác: trừ, SLT, v.v.
kết thúc
EXMEMIR <= IDEXIR; EXMEMB <= IDEXB; // vượt qua đăng ký IR & B

kết thúc
khác EXMEMIR <= NOP; // Đóng băng ba giai đoạn đầu tiên của đường ống; tiêm một nop vào đầu
ra EX

// Giai đoạn Mem của đường ống


if (EXMEMop == ALUop) MEMWBValue <= EXMEMALUOut; // vượt qua kết quả ALU

khác nếu (EXMEMop == LW) MEMWBValue <= DMemory [EXMEMALUOut >> 2]; khác nếu
(EXMEMop == SW) DMemory [EXMEMALUOut>> 2] <= EXMEMB; // lưu trữ MEMWBIR <=
EXMEMIR. // đi dọc

// Giai đoạn WB
if (((MEMWBop == LW) || (MEMWBop == ALUop)) && (MEMWBrd != 0)) // đăng ký cập
nhật nếu tải / hoạt động ALU và đích không 0
Regs [MEMWBrd] <= MEMWBValue;
kết thúc
mô-đun cuối

HÌNH e4.14.3 Một định nghĩa hành vi của đường ống RISC-V năm giai đoạn với các quầy
hàng để tải khi đích đến là một hướng dẫn ALU hoặc tính toán địa chỉ hiệu quả. (Tiếp tục)
365.e8 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

Kiểm tra Ai đó đã hỏi về khả năng các mối nguy dữ liệu xảy ra thông qua bộ nhớ, trái với
Bản thông qua một thanh ghi. Những tuyên bố nào sau đây về những mối nguy hiểm
thân bạn như vậy là đúng?
1. Vì việc truy cập bộ nhớ chỉ xảy ra trong giai đoạn MEM, tất cả các thao
tác bộ nhớ được thực hiện theo cùng thứ tự như thực thi lệnh, khiến cho
những mối nguy hiểm đó là không thể xảy ra trong đường ống này.
2. Những mối nguy hiểm như vậy là có thể trong đường ống này; chúng tôi chưa thảo
luận về họ.
3. Không có đường ống nào có thể có một mối nguy hiểm liên quan đến bộ
nhớ, vì đây là công việc của lập trình viên để giữ cho thứ tự các tham
chiếu bộ nhớ chính xác.
4. Các mối nguy về bộ nhớ có thể xảy ra ở một số đường ống, nhưng chúng
không thể xảy ra trong đường ống cụ thể này.
5. Mặc dù việc kiểm soát đường ống sẽ có nghĩa vụ duy trì trật tự giữa các
tham chiếu bộ nhớ để tránh các mối nguy hiểm, nhưng không thể thiết kế
một đường ống nơi các tham chiếu có thể không hoạt động.

Thực hiện Logic Hazard Chi nhánh trong Verilog


Chúng tôi có thể mở rộng mô hình hành vi Verilog của mình để thực hiện kiểm
soát cho các chi nhánh. Chúng tôi thêm mã vào mô hình chi nhánh bằng cách sử
dụng chiến lược dự đoán không được thực hiện. Mã Verilog được hiển thị trong
Hình e4.14.4. Nó thực hiện nguy cơ nhánh bằng cách phát hiện một nhánh được
lấy trong ID và sử dụng tín hiệu đó để xóa hướng dẫn trong IF (bằng cách đặt IR
thành 0x00000013, đó là một hiệu quả NOP trong RISC-V); Ngoài ra, PC được
gán cho mục tiêu chi nhánh. Lưu ý rằng để ngăn chặn một chốt bất ngờ, điều
quan trọng là PC phải được chỉ định rõ ràng trên mọi đường dẫn qua khối luôn
luôn; do đó, chúng tôi chỉ định PC trong một nếu tuyên bố. Cuối cùng, lưu ý
rằng mặc dù Hình e4,14.4 kết hợp logic cơ bản cho các nhánh và kiểm soát các
mối nguy hiểm, hỗ trợ các chi nhánh yêu cầu bỏ qua bổ sung và phát hiện nguy
cơ dữ liệu, mà chúng tôi chưa bao gồm.

Sử dụng Verilog cho Đặc tả hành vi với Tổng hợp


Để chứng minh các loại Verilog tương phản, chúng tôi hiển thị hai mô tả về một
kiểu triển khai RISC-V khác nhau, không được trang bị, sử dụng nhiều chu kỳ
đồng hồ cho mỗi hướng dẫn. (Vì một số người hướng dẫn thực hiện mô tả tổng
hợp về dự án đường ống RISC-V cho một lớp học, chúng tôi đã chọn không đưa
nó vào đây. Nó cũng sẽ dài.)
Hình e4.14.5 đưa ra một đặc điểm kỹ thuật hành vi của một thực hiện nhiều xe
đạp của bộ xử lý RISC-V. Do việc sử dụng các hoạt động hành vi, sẽ khó tổng hợp
một đơn vị kiểm soát và dữ liệu riêng biệt với bất kỳ hiệu quả hợp lý nào. Phiên
bản này thể hiện một cách tiếp cận khác đối với điều khiển bằng cách sử dụng máy
trạng thái hữu hạn Mealy (xem thảo luận trong Mục A.10 của Phụ lục A). Việc sử
dụng máy Mealy, cho phép đầu ra phụ thuộc cả vào đầu vào và trạng thái hiện tại,
cho phép chúng tôi giảm tổng số trạng thái.
mô-đun RISCVCPU (đồng hồ);
// Hướng dẫn opcodes
tham số LW = 7'b000_0011, SW = 7'b010_0011, BEQ = 7'b110_0011, NOP = 32'h0000_0013,
ALUop = 7'b001_0011;
đồng hồ đầu vào;

reg [31: 0] PC, Regs [0:31], IDEXA, IDEXB, EXMEMB, EXMEMALUOut,


MEMWBValue;
reg [31: 0] IMemory [0: 1023], DMemory [0: 1023], // bộ nhớ riêng IFIDIR, IDEXIR,
EXMEMIR, MEMWBIR; // đăng ký đường ống
dây [4: 0] IFIDrs1, IFIDrs2, IDEXrs1, IDEXrs2, EXMEMrd, MEMWBrd; // Truy cập các
trường đăng ký
dây [6: 0] IFIDop, IDEXop, EXMEMop, MEMWBop; // Truy cập dây opcodes [31: 0]
Ain, Bin; // đầu vào ALU
// khai báo tín hiệu bỏ qua
bypass dâyAfromMEM, bypassAfromALUinWB ,
bypassBfromMEM, bypassBfromALUinWB ,
bypassAfromLDinWB, bypassBfromLDinWB;
gian hàng dây; // tín hiệu gian hàng
dây điện;

chỉ định IFIDop = IFIDIR [6: 0];


chỉ định IFIDrs1 = IFIDIR [19:15];
chỉ định IFIDrs2 = IFIDIR [24:20];
gán IDEXop = IDEXIR [6: 0];
gán IDEXrs1 = IDEXIR [19:15];
gán IDEXrs2 = IDEXIR [24:20];
chỉ định EXMEMop = EXMEMIR [6: 0];
chỉ định EXMEMrd = EXMEMIR [11: 7];
chỉ định MEMWBop = MEMWBIR [6: 0];
chỉ định MEMWBrd = MEMWBIR [11: 7];

// Bỏ qua để nhập A từ giai đoạn MEM cho hoạt động ALU gán bypassAfromMEM =
(IDEXrs1 == EXMEMrd) && (IDEXrs1 != 0) &&
(EXMEMop == ALUop);
// Bỏ qua đầu vào B từ giai đoạn MEM cho hoạt động ALU gán bypassBfromMEM =
(IDEXrs2 == EXMEMrd) && (IDEXrs2 != 0) &&
(EXMEMop == ALUop);
// Việc bỏ qua để nhập A từ giai đoạn WB cho một hoạt động ALU được gán bởi pas
sAlfromALUinWB = (IDEXrs1 == MEMWBrd) && (IDEXrs1 != 0) &&
(MEMWBop == ALUop);
// Việc bỏ qua đầu vào B từ giai đoạn WB cho hoạt động ALU chỉ định
bypassBfromALUinWB = (IDEXrs2 == MEMWBrd) && (IDEXrs2 != 0) &&
(MEMWBop == ALUop);
// Bỏ qua để nhập A từ giai đoạn WB cho một hoạt động LW gán bypassAfromLDinWB =
(IDEXrs1 == MEMWBrd) && (IDEXrs1 != 0) &&
(MEMWBop == LW);
// Việc bỏ qua đầu vào B từ giai đoạn WB cho một hoạt động LW chỉ định
bypassBfromLDinWB = (IDEXrs2 == MEMWBrd) && (IDEX rs2 != 0) &&
(MEMWBop == LW);
// Đầu vào A cho ALU được bỏ qua từ MEM nếu có đường tránh ở đó ,

// Mặt khác từ WB nếu có một đường vòng ở đó, và nếu không thì đến từ thanh ghi IDEX
gán Ain = bypassAfromMEM ? EXMEMALUOut :
(bypassAfromALUinWB || bypassAfromLDinWB) ? MEMWBValue :
IDEXA;

// Đầu vào B cho ALU được bỏ qua từ MEM nếu có đường tránh ở đó ,

// Mặt khác từ WB nếu có một đường vòng ở đó, và nếu không thì đến từ thanh ghi IDEX
gán Bin = bypassBfromMEM ? EXMEMALUOut :
(bypassBfromALUinWB || bypassBfromLDinWB) ? MEMWBValue :

HÌNH e4.14.4 Một định nghĩa hành vi của đường ống RISC-V năm giai đoạn với các quầy
hàng để tải khi đích đến là một hướng dẫn ALU hoặc tính toán địa chỉ hiệu quả. Các thay
đổi từ Hình e4.14.2 được làm nổi bật. (Tiếp tục trên trang tiếp theo)
IDEXB;
// Tín hiệu phát hiện gian hàng dựa trên việc sử dụng kết quả từ đó
LW
gán stall = (MEMWBop == LW) && (// hướng dẫn nguồn là tải
(((IDEXop == LW) || (IDEXop == SW)) && (IDEXrs1 == MEMWBrd))
|| // gian hàng cho calc địa chỉ
((IDEXop == ALUop) && ((IDEXrs1 == MEMWBrd) || (IDEXrs2
== MEMWBrd))); // Sử dụng ALU
// Tín hiệu cho một nhánh đã lấy: hướng dẫn là BEQ và các thanh ghi là
bằng nhau
gán tabranch = (IFIDop == BEQ) && (Regs [IFIDrs1] == Regs [IFIDrs2]);

số nguyên i; // được sử dụng để khởi tạo các thanh ghi


ban đầu
bắt đầu
PC = 0;
IFIDIR = NOP; IDEXIR = NOP; EXMEMIR = NOP; MEMWBIR = NOP; // đặt NOP vào sổ đăng ký
đường ống
cho (i = 0; i <= 31; i = i + 1) Regs [i] = i; // khởi tạo các thanh ghi - chỉ để chúng không quan tâm

kết thúc

// Hãy nhớ rằng TẤT CẢ những hành động này xảy ra ở mọi giai đoạn đường ống và với việc sử dụng
<= chúng xảy ra song song!
luôn luôn @ (đồng hồ định vị) bắt
đầu

nếu (~ cài đặt)


bắt đầu // ba giai đoạn đường ống đầu tiên bị đình trệ nếu có nguy cơ tải

nếu (~ Takebranch)
bắt đầu // hướng dẫn đầu tiên trong đường ống đang được tìm nạp bình thường

IFIDIR <= IMemory [PC >> 2]; PC <=


PC + 4;
kết
thúc
khác
bắt đầu // một nhánh được lấy trong ID; hướng dẫn trong IF là sai; chèn NOP và đặt lại PC

IFIDIR <= NOP;


PC <= PC + {{52 {IFIDIR [31]}}, IFIDIR [7], IFIDIR [30:25], IFIDIR [11: 8],
1'b0};

kết thúc

// hướng dẫn thứ hai trong đường ống là tìm nạp các thanh ghi
IDEXA <= Regs [IFIDrs1]; IDEXB <= Regs [IFIDrs2]; // nhận hai
sổ đăng ký
IDEXIR <= IFIDIR; // vượt qua IR - có thể xảy ra ở bất cứ đâu, vì điều này chỉ ảnh hưởng đến giai
đoạn tiếp theo!

// hướng dẫn thứ ba đang thực hiện tính toán addre ss hoặc thao tác ALU nếu (IDEXop == LW)

EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:20]}; khác nếu
(IDEXop == SW)
EXMEMALUOut <= IDEXA + {{53 {IDEXIR [31]}}, IDEXIR [30:25], IDEXIR
[11: 7]};
khác nếu (IDEXop == ALUop)
trường hợp (IDEXIR [31:25]) // trường hợp cho các hướng dẫn loại R khác nhau 0:
EXMEMALUOut <= Ain + Bin; // thêm hoạt động

HÌNH e4.14.4 Một định nghĩa hành vi của đường ống RISC-V năm giai đoạn với các quầy
hàng để tải khi đích đến là một hướng dẫn ALU hoặc tính toán địa chỉ hiệu quả. (Tiếp tục)
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e11

mặc định :; // các hoạt động loại R khác: trừ, SLT, v.v.
kết thúc
EXMEMIR <= IDEXIR; EXMEMB <= IDEXB; // vượt qua đăng ký IR & B

kết thúc
khác EXMEMIR <= NOP; // Đóng băng ba giai đoạn đầu tiên của đường ống; tiêm một nop vào đầu
ra EX

// Giai đoạn Mem của đường ống


if (EXMEMop == ALUop) MEMWBValue <= EXMEMALUOut; // vượt qua kết quả ALU

khác nếu (EXMEMop == LW) MEMWBValue <= DMemory [EXMEMALUOut >> 2]; khác nếu
(EXMEMop == SW) DMemory [EXMEMALUOut>> 2] <= EXMEMB; // lưu trữ MEMWBIR <=
EXMEMIR. // đi dọc

// Giai đoạn WB
if (((MEMWBop == LW) || (MEMWBop == ALUop)) && (MEM WBrd != 0)) // đăng ký cập
nhật nếu tải / hoạt động ALU và đích không 0
Regs [MEMWBrd] <= MEMWBValue;
kết thúc
mô-đun cuối

HÌNH e4.14.4 Một định nghĩa hành vi của đường ống RISC-V năm giai đoạn với các quầy
hàng để tải khi đích đến là một hướng dẫn ALU hoặc tính toán địa chỉ hiệu quả. (Tiếp tục)

Do một phiên bản của thiết kế RISC-V dành cho tổng hợp phức tạp hơn đáng
kể, chúng tôi đã dựa vào một số mô-đun Verilog được chỉ định trong Phụ lục A,
bao gồm những điều sau đây :
■ Bộ ghép kênh 4 trên 1 được hiển thị trong Hình A.4.2 và bộ ghép kênh 2
trên 1 có thể được lấy một cách tầm thường dựa trên bộ ghép kênh 4 trên 1.
■ ALU RISC-V được hiển thị trong Hình A.5.15.
■ Điều khiển ALU RISC-V được xác định trong Hình A.5.16.
■ Tệp đăng ký RISC-V được xác định trong Hình A.8.11.
Bây giờ, hãy cùng xem phiên bản Verilog của bộ xử lý RISC-V dành cho tổng hợp.
Hình e4.14.6 hiển thị phiên bản cấu trúc của datapath RISC-V. Hình e4.14.7 sử dụng
mô-đun datapath để chỉ định CPU RISC-V. Phiên bản này cũng cho thấy một cách
tiếp cận khác để thực hiện đơn vị điều khiển, cũng như một số tối ưu hóa dựa trên
mối quan hệ giữa các tín hiệu điều khiển khác nhau. Quan sát rằng đặc tả máy trạng
thái chỉ cung cấp các hành động giải trình tự.
Việc thiết lập các dòng điều khiển được thực hiện với một loạt giao các câu
lệnh phụ thuộc vào trạng thái cũng như trường opcode của thanh ghi lệnh. Nếu
người ta gấp cài đặt điều khiển vào đặc tả trạng thái, thì nó sẽ trông giống như
một đơn vị điều khiển trạng thái hữu hạn kiểu Mealy. Bởi vì cài đặt của các dòng
điều khiển được chỉ định bằng cách sử dụng giao tuyên bố bên ngoài luôn luôn
khối, hầu hết các hệ thống tổng hợp logic sẽ tạo ra một triển khai nhỏ của một
máy trạng thái hữu hạn
365.e12 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

mô-đun RISCVCPU (đồng hồ);


tham số LW = 7'b000_0011, SW = 7'b010_0011, BEQ = 7'b110_0011, ALUop
= 7'b001_0011;
đồng hồ đầu vào; // đồng hồ là một đầu vào bên ngoài

// Các thanh ghi có thể nhìn thấy về mặt kiến trúc và các thanh ghi cào để thực hiện

reg [31: 0] PC, Regs [0:31], ALUOut, MDR, A, B; reg [31: 0] Bộ


nhớ [0: 1023], IR;
reg [2: 0] trạng thái; // trạng thái bộ xử lý
dây [6: 0] opcode; // sử dụng để có được opcode dễ dàng dây [31: 0]
ImmGen; // được sử dụng để tạo ngay lập tức

gán opcode = IR [6: 0]; // opcode thấp hơn 7 bit


gán ImmGen = (opcode == LW) ? {{53 {IR [31]}}, IR [30:20]} :
/ * (opcode == SW) * / {53 {IR [31]}}, IR [30:25], IR [11: 7]}; gán PCOfferet =
{52 {IR [31]}}, IR [7], IR [30:25], IR [11: 8], ;

// đặt PC thành 0 và bắt đầu điều khiển ở trạng thái 1 bắt đầu ban đầu PC
= 0; trạng thái = 1; kết thúc

// Máy trạng thái - kích hoạt trên đồng hồ đang tăng luôn @ (đồng hồ
đo)
bắt đầu
Regs [0] <= 0; // lối tắt để đảm bảo R0 luôn là 0 trường hợp (trạng thái) // hành động
phụ thuộc vào trạng thái
1: bắt đầu // bước đầu tiên: tìm nạp hướng dẫn, PC tăng, chuyển sang trạng thái tiếp theo

IR <= Bộ nhớ [PC >> 2]; PC <=


PC + 4;
tiểu bang <= 2; // cuối tiểu bang tiếp
theo

2: bắt đầu // bước thứ hai: Giải mã lệnh, tìm nạp đăng ký, cũng tính toán địa chỉ nhánh

A <= Regs [IR [19:15]]; B <=


Regs [IR [24:20]];
ALUOut <= PC + PC Offerset; // tính trạng thái mục tiêu nhánh tương đối PC <= 3;

kết thúc
3: bắt đầu // bước thứ ba: Thực hiện cửa hàng tải, thực hiện ALU, hoàn thành chi nhánh

if ((opcode == LW) || (opcode == SW)) bắt đầu

ALUOut <= A + ImmGen; // tính trạng thái địa chỉ hiệu quả <= 4;

kết thúc
khác nếu (opcode == ALUop) bắt
đầu

trường hợp (IR [31:25]) // trường hợp cho các hướng dẫn loại R khác nhau
0: ALUOut <= A + B; // thêm hoạt động
mặc định :; // các hoạt động loại R khác: trừ, SLT, v.v.
kết thúc
trạng thái <= 4;
kết thúc
khác nếu (opcode == BEQ)
bắt đầu
nếu (A == B) bắt đầu
PC <= ALUOut; // chi nhánh lấy - cập nhật PC
kết thúc

HÌNH e4.14.5 Một đặc điểm kỹ thuật hành vi của thiết kế RISC-V đa xe đạp. Cái này có hành vi
chu kỳ tương tự như thiết kế nhiều xe đạp, nhưng hoàn toàn dành cho mô phỏng và đặc điểm kỹ thuật. Nó
không thể được sử dụng để tổng hợp. (Tiếp tục trên trang tiếp theo)
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e13

trạng thái <= 1;


kết thúc
khác ; // opcodes khác hoặc ngoại lệ cho hướng dẫn không xác định sẽ đi đến đây

kết thúc
4: bắt đầu
nếu (opcode == ALUop)
bắt đầu // Hoạt động ALU
Regs [IR [11: 7]] <= ALUOut; // viết kết quả
trạng thái <= 1;
kết thúc // kết thúc loại R
khác nếu (mã nội dung == LW)
bắt đầu // hướng dẫn tải
MDR <= Bộ nhớ [ALUOut >> 2]; // đọc bộ nhớ
tiểu bang <= 5; // tiểu bang tiếp theo
kết thúc
khác nếu (opcode == SW)
bắt đầu // hướng dẫn lưu trữ
Bộ nhớ [ALUOut >> 2] <= B; // viết bộ nhớ
trạng thái <= 1; // trở về trạng thái 1
kết thúc
khác ; // hướng dẫn khác đi đây
kết thúc
5: start // LW là hướng dẫn duy nhất còn trong thực thi Regs [IR [11: 7]] <= MDR; //
ghi MDR vào trạng thái đăng ký <= 1;

kết thúc // hoàn thành một hướng dẫn LW


kết thúc
kết thúc
mô-đun cuối

HÌNH e4.14.5 Một đặc điểm kỹ thuật hành vi của thiết kế RISC-V đa xe đạp. (Tiếp tục)

xác định cài đặt của thanh ghi trạng thái và sau đó sử dụng logic bên ngoài để lấy
các đầu vào điều khiển cho datapath.
Khi viết phiên bản điều khiển này, chúng tôi cũng đã tận dụng một số hiểu
biết về mối quan hệ giữa các tín hiệu điều khiển khác nhau cũng như các tình
huống mà chúng tôi không quan tâm đến giá trị tín hiệu điều khiển; một số ví dụ
về những điều này được đưa ra trong phần xây dựng sau đây.

Thêm minh họa về thực thi hướng dẫn trên phần


cứng
Để giảm chi phí của cuốn sách này, bắt đầu với phiên bản thứ ba, chúng tôi đã chuyển
các phần và số liệu được sử dụng bởi một số ít người hướng dẫn trực tuyến. Tiểu mục
này lấy lại những số liệu cho những độc giả muốn có thêm tài liệu bổ sung để hiểu rõ
hơn về đường ống. Đây là tất cả các sơ đồ đường ống một chu kỳ, trong đó có nhiều
số liệu để minh họa việc thực hiện một chuỗi các hướng dẫn.
Ba ví dụ tương ứng cho mã không có mối nguy hiểm, một ví dụ về chuyển
tiếp trên triển khai đường ống và một ví dụ về bỏ qua việc thực hiện đường ống.
mô-đun Datapath (ALUOp, MemtoReg, MemRead, MemWrite, IorD, RegWrite, IRWrite ,

PCWrite, PCWriteCond, ALUSrcA, ALUSrcB, PCSource, opcode, đồng


hồ); // đầu vào điều khiển + đồng hồ
tham số LW = 7'b000_0011, SW = 7'b010_0011;
đầu vào [1: 0] ALUOp, ALUSrcB; // Tín hiệu điều khiển 2 bit
đầu vào MemtoReg, MemRead, MemWrite, IorD, RegWrite, IRWrite, PCWrite, PCWriteCond ,

ALUSrcA, PCSource, đồng hồ; // Tín hiệu điều khiển 1 bit


opcode đầu ra [6: 0]; // opcode là cần thiết như một đầu ra bằng điều khiển
reg [31: 0] PC, MDR, ALUOut; // Trạng thái CPU + một số thời gian
reg [31: 0] Bộ nhớ [0: 1023], IR; // Trạng thái CPU + một số thời gian
dây [31: 0] A, B, SignExtend Offerset, PCOfferets, ALUResultOut, PCValue, JumpAddr, Writeata,
ALUAin ,
ALUBin, MemOut; // đây là những tín hiệu thu được từ dây thanh ghi [3: 0] ALUCtl; //
dây điều khiển ALU không; // tín hiệu Zero out từ ALU

PC ban đầu = 0; // khởi động PC ở 0


// Tín hiệu kết hợp được sử dụng trong datapath
// Đọc bằng địa chỉ từ với ALUOut hoặc PC làm nguồn địa chỉ

gán MemOut = MemRead ? Bộ nhớ [(IorD ? ALUOut: PC) >> 2]: 0; gán opcode = IR [6: 0]; //
lối tắt opcode
// Nhận dữ liệu đăng ký ghi từ ALUOut hoặc từ MDR gán Writitedata = MemtoReg ? MDR:
ALUOut;
// Tạo ngay lập tức
gán ImmGen = (opcode == LW) ? {{53 {IR [31]}}, IR [30:20]} :
/ * (opcode == SW) * / {{53 {IR [31]}}, IR [30:25], IR [11: 7]}; // Tạo bù pc cho
các nhánh
gán PCOfferet = {{52 {IR [31]}}, IR [7], IR [30:25], IR [11: 8], 1'b0};
// Đầu vào A cho ALU là thanh ghi rs hoặc PC gán ALUAin = ALUSrcA ? A: PC; //
Đầu vào ALU là PC hoặc A

// Tạo một thể hiện của đơn vị điều khiển ALU (xem mô-đun được xác định trong Hình B.5.16

// ALUOp đầu vào được tập hợp đơn vị điều khiển và được sử dụng để mô tả lớp lệnh
như trong Chương 4
// Đầu vào IR [31:25] là trường mã chức năng cho lệnh ALU
// ALUCtl đầu ra là các bit điều khiển ALU thực tế như trong Chương 4
ALUControl alucontroller (ALUOp, IR [31:25], ALUCtl); // Kiểm soát ALU
đơn vị

// Tạo bộ ghép kênh 2 trên 1 được sử dụng để chọn nguồn tiếp theo
PC
// Đầu vào là ALUResultOut (PC tăng), ALUOut (địa chỉ chi nhánh)

// PCSource là đầu vào bộ chọn và PCValue là bộ ghép kênh


đầu ra
Mult2to1 PCdatasrc (ALUResultOut, ALUOut, PCSource, PCValue);

// Tạo bộ ghép kênh 4 trên 1 được sử dụng để chọn đầu vào B của ALU
// Đầu vào là thanh ghi B, hằng số 4, được tạo ngay lập tức, bù PC
// ALUSrcB là chọn hoặc nhập
// ALUBin là đầu ra ghép kênh
Mult4to1 ALUBinput (B, 32'd4, ImmGen, PCOfferet, ALUSrcB, ALUBin);

// Tạo ALU RISC-V


// Đầu vào là ALUCtl (điều khiển ALU), đầu vào giá trị ALU (ALUAin, ALUBin)

// Đầu ra là ALUResultOut (đầu ra 32 bit) và Zero (đầu ra phát hiện bằng không)

RISCVALU ALU (ALUCtl, ALUAin, ALUBin, ALUResultOut, Zero); // ALU

HÌNH e4.14.6 Một phiên bản Verilog của datapath RISC-V đa xe đạp phù hợp để tổng hợp.
Datapath này dựa trên một số đơn vị từPhụ lục ABáo cáo ban đầu không tổng hợp ,. và một phiên bản được
sử dụng để tổng hợp sẽ phải kết hợp tín hiệu đặt lại có hiệu ứng này. Cũng lưu ý rằng đặt lại R0 đến 0 trên
mỗi đồng hồ không phải là cách tốt nhất để đảm bảo điều đó R0 ở mức 0; thay vào đó, sửa đổi mô-đun tệp
đăng ký để tạo 0 bất cứ khi nào R0 được đọc và bỏ qua viết để R0 sẽ là một giải pháp hiệu quả hơn. (Tiếp
tục trên trang tiếp theo)
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e15

// Tạo tệp đăng ký RISC-V


// Đầu vào là các trường rs1 và rs2 của IR được sử dụng để chỉ định các thanh ghi nào sẽ đọc ,

// Writereg (số đăng ký ghi), Writedata (dữ liệu được viết) ,

// RegWrite (chỉ ra một chữ viết), đồng hồ


// Đầu ra là A và B, các thanh ghi đọc
registerfile regs (IR [19:15], IR [24:20], IR [11: 7], Writedata, RegWrite, A, B, đồng hồ); //
Đăng ký tập tin

// Các hành động kích hoạt đồng hồ của datapath luôn @ (đồng hồ
định vị)
bắt đầu
if (MemWrite) Bộ nhớ [ALUOut >> 2] <= B; // Viết bộ nhớ - phải là a
cửa hàng
ALUOut <= ALUResultOut; // Lưu kết quả ALU để sử dụng trong chu kỳ đồng hồ sau này

if (IRWrite) IR <= MemOut; // Viết IR nếu một lệnh tìm nạp MDR <= MemOut; // Luôn lưu giá
trị đọc bộ nhớ
// PC được viết cả hai điều kiện (được điều khiển bởi PCWrite) và vô điều kiện

kết thúc
mô-đun cuối

HÌNH e4.14.6 Một phiên bản Verilog của datapath RISC-V đa xe đạp phù hợp để tổng hợp.
(Tiếp tục)

Không có minh họa nguy hiểm


Trên trang 285, chúng tôi đã đưa ra trình tự mã ví dụ :

lw x10, 40 (x1)
phụ x11, x2, x3
thêm x12, x3 , x4
lw x13, 48 (x1)
thêm x14, x5 , x6
Hình 4.59 và 4.60 cho thấy các sơ đồ đường ống nhiều chu kỳ cho trình tự hai hướng
dẫn này thực hiện trong sáu chu kỳ đồng hồ. Số liệu e4.14.8 thông qua e4,14.10 hiển thị
các sơ đồ đường ống một chu kỳ tương ứng cho hai hướng dẫn. Lưu ý rằng thứ tự của các
hướng dẫn khác nhau giữa hai loại sơ đồ này: hướng dẫn mới nhất là ở dưới cùng và
bên phải của sơ đồ đường ống nhiều chu kỳ, và nó nằm trên trái trong sơ đồ đường ống
một chu kỳ.

Thêm ví dụ
Để hiểu cách thức kiểm soát đường ống hoạt động, hãy để xem xét năm hướng
dẫn này đi qua đường ống :
lw x10, 40 (x1)
phụ x11, x2, x3
và x12, x4, x5
hoặc là x13, x6 , x7
thêm x14, x8 , x9
365.e16 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

mô-đun RISCVCPU (đồng hồ);


tham số LW = 7'b000_0011, SW = 7'b010_0011, BEQ = 7'b110_0011, ALUop
= 7'b001_0011;
đồng hồ đầu vào;

reg [2: 0] trạng thái;


dây [1: 0] ALUOp, ALUSrcB; dây [6:
0] opcode;
dây MemtoReg, MemRead, MemWrite, IorD, RegWrite, IRWrite, PCWriteCond,
ALUSrcA, PCSource, MemoryOp;

// Tạo một thể hiện của datapath RISC-V, các đầu vào là các tín hiệu điều khiển; opcode chỉ
là đầu ra
Datapath RISCVDP (ALUOp, MemtoReg, MemRead, MemWrite, IorD, RegWrite, IRWrite ,

PCWrite, PCWriteCond, ALUSrcA, ALUSrcB, PCSource ,


opcode, đồng hồ);

trạng thái bắt đầu ban đầu = 1; kết thúc // khởi động máy trạng thái ở trạng thái 1 // Đây là các
định nghĩa về tín hiệu điều khiển
gán MemoryOp = (opcode == LW) || (opcode == SW); // một hoạt động bộ nhớ

gán ALUOp = ((trạng thái == 1) || (trạng thái == 2) | | ((trạng thái == 3) && MemoryOp)) ?
2'b00: // thêm

((trạng thái == 3) && (mã số == BEQ)) ? 2'b01: 2'b10; // trừ hoặc sử dụng mã
chức năng
gán MemtoReg = ((trạng thái == 4) && (opcode == ALUop)) ? 0: 1; gán MemRead = (trạng thái
== 1) | | ((trạng thái == 4) && (mã == LW)); gán MemWrite = (trạng thái == 4) & (mã == SW);

gán IorD = (trạng thái == 1) ? 0: 1;


gán RegWrite = (trạng thái == 5) | ((trạng thái == 4) && (opcode == ALUop));
gán IRWrite = (trạng thái == 1);
gán PCWrite = (trạng thái == 1);
gán PCWriteCond = (trạng thái == 3) && (mã số == BEQ); gán ALUSrcA =
((trạng thái == 1) || (trạng thái == 2)) ? 0: 1;
gán ALUSrcB = ((trạng thái == 1) | | ((trạng thái == 3) && (mã op == BEQ)) ?
2'b01 :
(trạng thái == 2) ? 2'b11 :
((trạng thái == 3) && MemoryOp) ? 2'b10: 2'b00; // bộ nhớ
hoạt động hoặc khác
gán PCSource = (trạng thái == 1) ? 0: 1;

// Đây là máy trạng thái, chỉ phải sắp xếp các trạng thái luôn @ (đồng hồ định vị)

bắt đầu // tất cả các cập nhật trạng thái trên vỏ cạnh đồng hồ dương (trạng
thái)

1: trạng thái <= 2; // trạng thái tiếp theo vô điều kiện


2: trạng thái <= 3; // trạng thái tiếp theo vô điều kiện
3: trạng thái <= (mã op == BEQ) ? 1: 4; // chi nhánh quay trở lại khác tiếp theo
tiểu bang
4: trạng thái <= (mã số == LW) ? 5: 1; // Loại R và LW kết thúc
5: trạng thái <= 1; // quay trở lại
kết thúc
kết thúc
mô-đun cuối

HÌNH e4.14.7 CPU RISC-V sử dụng datapath từ Hình e4.14.6.


4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e17

lw x10, 40 (x1)
Hướng dẫn lấy

0
M
bạn
x
1

NẾU / ID ID / EX EX / MEM MEM / WB

Thêm vào
Thê
m
4 vào Tổng
Hướ

dẫn
ng

Đọc
PC Địa chỉ đăng ký 1 Đọc
Đọc dữ liệu 1 Số
không
Hướng dẫn đăng ký 2
Đọc 0 ALU ALU
ký ức Viết dữ liệu 2 M kết quả Địa chỉ Đọc 1
dữ
đăng ký liệu M
b
bạ Dữ ạ
n liệu n
Viết Đăng ký x ký ức x
dữ liệu 1 0
Viết
dữ liệu

Đồng hồ 1

phụ x11, x2, x3 lw x10, 40 (x1)


Hướng dẫn giải
Hướng dẫn lấy mã

0
M
bạn
x
1

NẾU / ID / EX EX / MEM MEM / WB


ID
Thêm Thê
vào m
vào Tổng
4

Đọc
đăng ký 1
Đọc
Đọc Số
PC Địa chỉ dữ
Hướng

đăng ký 2 liệu 1 không


Đọc
dẫn

0 ALU ALU
Hướng dẫn Viết Đọc Địa chỉ 1
M kết quả
ký ức M
đăng dữ bạ
Dữ liệu bạn
ký liệu 2 n
x dữ liệu ký x
Viết ức 0
1
dữ liệu Viết
Đăng ký dữ liệu

Đồng hồ 2

HÌNH e4.14.8 Sơ đồ đường ống một chu kỳ cho chu kỳ đồng hồ 1 (sơ đồ trên cùng) và 2 (sơ đồ dưới cùng). Phong cách
này của biểu diễn đường ống là một ảnh chụp nhanh của mọi hướng dẫn thực hiện trong một chu kỳ đồng hồ. Ví dụ của chúng tôi có nhưng
hai hướng dẫn, vì vậy, nhiều nhất hai giai đoạn được xác định trong mỗi chu kỳ đồng hồ; thông thường, tất cả năm giai đoạn được chiếm.
Các phần được tô sáng của datapath đang hoạt động trong chu kỳ đồng hồ đó. Tải được lấy trong chu kỳ đồng hồ 1 và được giải mã trong
chu kỳ đồng hồ 2, với phần trừ được lấy trong chu kỳ đồng hồ thứ hai. Để làm cho các số liệu dễ hiểu hơn, các giai đoạn đường ống khác
trống rỗng, nhưng thông thường có một hướng dẫn trong mọi giai đoạn đường ống.
365.e18 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

phụ x11, x2, x3 lw x10, 40 (x1)


Hướng dẫn giải mã Thi hành án
0
M
bạn
x
1

NẾU / ID /
ID EX EX / MEM MEM / WB
Thêm
vào
Thêm
4 vào Tổng
Hướn
g dẫn

Đọc
PC Địa chỉ đăng ký 1 Đọc
Đọc dữ liệu 1 Số không
Hướng dẫn đăng ký 2
ký ức Đọc 0 ALU ALU
Viết dữ liệu 2 M kết quả Địa chỉ Đọc 1
dữ
đăng ký liệu M
b
bạ ạ
n Dữ liệu n
Viết Đăng ký x ký ức x
dữ liệu 1 0
Viết
dữ liệu

Đồng hồ 3

phụ x11, x2, x3 lw x10, x1 (40)


0 Thi hành án Ký ức
M
bạn
x
1

NẾU / ID /
Thêm ID EX EX / MEM MEM / WB
vào

4 Thêm
vào Tổng
Hướ

dẫn
ng

PC Địa chỉ Đọc Số không


đăng ký 2

đăng ký 1 Đọc
Hướng dẫn dữ liệu 1
Đọc
ký ức
Đọc 0 ALU ALU
Viết dữ liệu 2 M kết quả Địa chỉ Đọc 1
bạ dữ
đăng ký n Dữ liệu liệu M
bạ
n
x ký ức x
Viết 1
dữ liệu Đăng ký Viết 0
dữ liệu

Đồng hồ 4

HÌNH e4.14.9 Sơ đồ đường ống một chu kỳ cho chu kỳ đồng hồ 3 (sơ đồ trên cùng) và 4 (sơ đồ dưới cùng). Trong đồng
hồ thứ ba chu kỳ trong sơ đồ trên cùng , lw bước vào giai đoạn EX. Đồng thời, phụ nhập ID. Trong chu kỳ đồng hồ thứ tư (datapath dưới
cùng) , lw di chuyển vào giai đoạn MEM, đọc bộ nhớ bằng địa chỉ được tìm thấy trong EX / MEM khi bắt đầu chu kỳ đồng hồ 4. Đồng thời,
ALU trừ đi và sau đó đặt sự khác biệt vào EX / MEM vào cuối chu kỳ đồng hồ.
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e19

phụ x11, x2, x3 lw x10, 40 (x1)


Ký ức Viết lại
0
M
bạn
x
1

NẾU ID / EX EX / MEM MEM / WB


/ ID
Thêm
vào Thêm vào
Tổng
4

Đọc
đăng ký 1 Đọc
PC Địa chỉ Đọc dữ liệu 1
Hướng

Số không
đăng ký 2
Đọc 0 ALU ALU
dẫn

Hướng Viết Địa chỉ Đọc 1


dữ liệu 2 M kết quả dữ
dẫn đăng ký bạ
ký ức n liệu M
x Dữ b
Viết Đăng ký ạ
liệu n
dữ liệu 1 ký ức x
Viết 0
Tôi dữ liệu
Gen

Đồng hồ
5

phụ x11, x2, x3


Viết lại
0
M
bạn
x
1

NẾU / MEM /
ID ID / EX EX / MEM WB
Thêm
vào
Thêm
4 vào
Tổng
Hướng

Đọc
dẫn

PC Địa chỉ đăng ký 1 Đọc


Đọc dữ liệu 1
Hướng đăng ký 2 Số không
dẫn Đọc 0 ALU ALU
ký ức Viết dữ liệu 2 M kết quả Địa chỉ Đọc 0
Dữ
đăng ký bạn liệu dữ liệu M
bạ
n
x ký ức x
Viết 1
dữ liệu Đăng ký Viết 1
dữ liệu

Tôi
Gen

Đồng
hồ 6

HÌNH e4.14.10 Sơ đồ đường ống một chu kỳ cho chu kỳ đồng hồ 5 (sơ đồ trên cùng) và 6 (sơ đồ dưới cùng). Trong chu
kỳ đồng hồ 5 , lw hoàn thành bằng cách ghi dữ liệu vào MEM / WB vào thanh ghi 10 và phụ gửi sự khác biệt trong EX / MEM đến MEM /
WB Trong chu kỳ đồng hồ tiếp theo ,. phụ viết giá trị trong MEM / WB để đăng ký 11.
365.e20 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

Số liệu e4.14.11 đến e4.14.15 hiển thị các hướng dẫn tiến hành thông qua chín
chu kỳ đồng hồ cần chúng để hoàn thành thực hiện, làm nổi bật những gì đang
hoạt động trong một giai đoạn và xác định hướng dẫn được liên kết với từng giai
đoạn trong một chu kỳ đồng hồ. Nếu bạn kiểm tra chúng cẩn thận, bạn có thể
nhận thấy :
■ Trong Hình e4.14.13 bạn có thể thấy chuỗi số đăng ký đích từ trái sang phải ở
dưới cùng của các thanh ghi đường ống. Các số tiến về bên phải trong mỗi chu
kỳ đồng hồ, với thanh ghi đường ống MEM / WB cung cấp số lượng thanh ghi
được viết trong giai đoạn WB.
■ Khi một giai đoạn không hoạt động, các giá trị của các dòng điều khiển
được phân tách được hiển thị là 0 hoặc X (đối với chăm sóc don don).
■ Trình tự kiểm soát được nhúng trong chính cấu trúc đường ống. Đầu tiên, tất cả
các hướng dẫn đều có cùng số chu kỳ đồng hồ, do đó không có điều khiển đặc
biệt cho thời lượng hướng dẫn. Thứ hai, tất cả thông tin điều khiển được tính
toán trong quá trình giải mã lệnh và sau đó được chuyển qua các thanh ghi
đường ống.

Chuyển tiếp minh họa


Chúng ta có thể sử dụng các sơ đồ đường ống một chu kỳ để cho biết cách thức
chuyển tiếp hoạt động, cũng như cách điều khiển kích hoạt các đường dẫn
chuyển tiếp. Hãy xem xét trình tự mã sau đây trong đó các phụ thuộc đã được tô
sáng :
phụ x2, x1, x3
và x4, x2, x5
hoặc là x4, x4, x2
thêm x9 , x4, x2

Hình e4.14.16 và e4.14.17 hiển thị các sự kiện trong chu kỳ đồng hồ 3 trận6
trong khi thực hiện của những hướng dẫn này.
Do đó, trong chu kỳ xung nhịp 5, bộ chuyển tiếp chọn thanh ghi đường ống
EX / MEM cho đầu vào phía trên cho ALU và thanh ghi đường ống MEM / WB
cho đầu vào thấp hơn cho ALU. Sau đây thêm hướng dẫn đọc cả hai đăng ký x4,
mục tiêu của và hướng dẫn và đăng ký x2, mà phụ hướng dẫn đã được viết. Lưu ý
rằng hai hướng dẫn trước cả hai đăng ký viết x4, vì vậy đơn vị chuyển tiếp phải
chọn ngay trước đó (giai đoạn MEM).
Trong chu kỳ xung nhịp 6, đơn vị chuyển tiếp do đó chọn thanh ghi đường
ống EX / MEM, chứa kết quả của hoặc là hướng dẫn, cho đầu vào ALU trên
nhưng sử dụng giá trị thanh ghi không chuyển tiếp cho đầu vào thấp hơn cho
ALU .

Minh họa đường ống với quầy hàng và giao nhận


Chúng ta có thể sử dụng các sơ đồ đường ống một chu kỳ để cho biết cách điều khiển
cho các quầy hàng hoạt động. Số liệu e4.14.18 đến e4.14.20 hiển thị sơ đồ chu kỳ
đơn cho đồng hồ 2 đến 7 cho chuỗi mã sau (phụ thuộc được tô sáng) :
lw x2, 40 (x1)
và x4, x2, x5
hoặc là x4, x4, x2
thêm x9 , x4, x2
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e21

TÔI: EX: THÀNH VIÊN: WB :


IF: lw x10, 40 (x1)trước <1> trước <2> trước <3> trước <4>

NẾU /
0 ID ID / EX EX / MEM MEM / WB
M
bạn
x
1

RegWrite
Thêm vào
Thêm
vào Tổng Chi
4 nhánh

MemtoReg
ớng

Ghi nhớ
Đọc ALUSrc
dẫn

đăng ký 1 Đọc
Địa chỉ
Đọc dữ liệu 1
đăng ký 2 Số không
Hướng dẫn Đọc
Viết 0 ALU ALU
ký ức dữ liệu 2 Địa chỉ Đọc 1
đăng ký M kết quả
bạ Dữ
n liệu dữ liệu M
Viết Đăng ký x bạn

ký ức x
dữ liệu 1 0
Viết
Hướng dữ
liệu
dẫn
[31 con0] Tôi
Hướng Gen
dẫn
[30, 14
trận12]
Hướng
dẫn
[11 trận7]
Đồng hồ 1

TÔ THÀNH
NẾU: I: EX: VIÊN: WB :
phụ x11, x2, x3 lw x10, 40 (x1) trước <1> trước <2> trước <3>
NẾU /
0 ID ID / EX EX / MEM MEM / WB
M
bạn
x
1 ld
RegWrite

Thêm vào
Thêm vào

4 Tổng Chi
nhánh
Hướn
g dẫn

Memt
oReg

ALUSrc
1 Đọc
x1
Ghi nhớ

Địa chỉ đăng ký 1 Đọc


X Đọc dữ liệu 1 Số không
Hướng dẫn đăng ký 2 X ALU ALU
Đọc
ký ức Viết dữ liệu 2 0 kết quả Địa chỉ Đọc 1
đăng ký M
dữ liệu M
b

n Dữ liệu bạn
Viết Đăng ký x ký ức x
dữ liệu 1 Viết 0
dữ
liệu
Hướng dẫn
[31 con0] Tôi 40 ALU
điều
Hướng dẫn Gen khiển
[30, 14
trận12] 3
ALUOp
Hướng dẫn
[11 trận7] 10
Đồng hồ 2
HÌNH e4.14.11 Đồng hồ chu kỳ 1 và 2. Cụm từtrước <Tôi>"Có nghĩa là Tôihướng dẫn trước lwCác. lw hướng dẫn ở trên cùng datapath đang
ở giai đoạn IF. Vào cuối chu kỳ đồng hồ, the lw hướng dẫn nằm trong các thanh ghi đường ống IF / ID. Trong chu kỳ đồng hồ thứ hai, nhìn thấy
trong datapath dưới cùng, the lw chuyển sang giai đoạn ID, và phụ bước vào giai đoạn IF. Lưu ý rằng các giá trị của các trường lệnh và các thanh ghi
nguồn đã chọn được hiển thị trong giai đoạn ID. Do đó, đăng ký x1 và hằng số 40, toán hạng của lw, được ghi vào sổ đăng ký đường ống ID / EX. Số
10, đại diện cho số đăng ký đích của lw, cũng được đặt trong ID / EX. Đầu của thanh ghi đường ống ID / EX hiển thị các giá trị điều khiển cho ld
được sử dụng trong các giai đoạn còn lại. Các giá trị kiểm soát này có thể được đọc từ lw hàng của bảng trong Hình 4.22.
365.e22 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

TÔ THÀNH
NẾU: I: EX: VIÊN: WB :
và x12, x4, x5 phụ x11, x2, x3 lw x10 , ... trước <1> trước <2>

NẾU /
0 ID ID / EX EX / MEM MEM / WB
M 11
bạn 10 WB
x
phụ Điều khiển
000
1 M 010 WB 00
0 0
0
100 EX 00 M WB 0
1 0

Reg
Writ
Thêm vào

e
Thêm vào

Ghi nhớ
4 Tổng Chi

R
e

e
g
t
H
ư

n
g

d

n

nhánh

Đọc ALUSrc
2 đăng ký 1 Đọc x2
PC Địa chỉ x1
Đọc dữ liệu 1
3 đăng ký 2 Số không
Hướng dẫn Viết Đọc x3 ALU ALU
ký ức đăng ký dữ liệu 2 0 kết quả Địa chỉ Đọc 1
M
dữ
b liệu M

Viết n Dữ liệu bạn
dữ liệu Đăng ký x ký ức x
1 0
Viết
dữ
Hướng
liệu
dẫn
[31 con0] Tôi X 40 ALU Ghi nhớ
Hướng điều
dẫn Gen khiển
[30, 14
trận12] số 8 3
ALUOp
Hướng
dẫn
[11 trận7] 11 10
Đồng hồ 3

NẾU: hoặc x13, x6, x7 TÔI: và x12, x4, x5 EX: phụ x11 , ... THÀNH VIÊN: lw x10 , ... WB: trước <1>

NẾU /
0 ID ID / EX EX / MEM MEM / WB
M 10 10
bạn WB
x
Tương phảnl
000 11
1 và M 000 WB
0 0
100 10 1
M
EX 0 0 WB 0
W
R
e
g

e
r

t
i

Thêm vào
Thêm vào
4 Tổng
oR
ớng
dẫn

eg
mt

Chi
M

Ghi nhớ

nhánh
c
4 Đọc
x4
PC Địa chỉ đăng ký 1 Đọc x2
5 Đọc dữ liệu 1 Số không
Hướng dẫn đăng ký 2 x5 x3 ALU ALU
ký ức Viết Đọc 0 Địa chỉ Đọc 1
dữ liệu 2 M kết quả dữ
đăng ký b liệu M

n Dữ liệu bạn
Viết Đăng ký x ký ức x
dữ liệu 1 Viết 0
dữ
Hướng
liệu
dẫn
[31 con0] Tôi X ALU Ghi nhớ
Hướng Gen điều khiển
dẫn
[30, 14
trận12] 7 số 8
Hướng ALUOp
dẫn
[11 trận7] 12 11 10
Đồng hồ 4

HÌNH e4.14.12 Đồng hồ chu kỳ 3 và 4. Trong sơ đồ trên cùng , lw bước vào giai đoạn EX trong chu kỳ đồng hồ thứ ba, thêm vào x1
và 40 đến tạo thành địa chỉ trong thanh ghi đường ống EX / MEM. (Các lw hướng dẫn được viết lw x10, ... khi đạt đến EX, vì không cần
phải xác định danh tính của các toán hạng lệnh bởi EX hoặc các giai đoạn tiếp theo. Trong phiên bản đường ống này, các hành động của EX,
MEM và WB chỉ phụ thuộc vào hướng dẫn và thanh ghi đích hoặc địa chỉ đích của nó.) Đồng thời , phụ nhập ID, đọc sổ đăng ký x2 và x3và
và hướng dẫn bắt đầu IF. Trong chu kỳ đồng hồ thứ tư (datapath dưới cùng) , lw di chuyển vào giai đoạn MEM, đọc bộ nhớ bằng cách sử
dụng giá trị trong EX / MEM làm địa chỉ. Trong cùng một chu kỳ đồng hồ, ALU trừ đi x3 từ x2 và đặt sự khác biệt vào EX / MEM, đọc các
thanh ghi x4 và x5 trong ID và hoặc là hướng dẫn nhập IF. Hai sơ đồ cho thấy các tín hiệu điều khiển được tạo trong giai đoạn ID và được
bóc ra khi chúng được sử dụng trong các giai đoạn ống tiếp theo.
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e23

TÔ THÀNH
NẾU: I: EX: VIÊN: WB :
thêm x14, x8, x9 hoặc x13, x6, x7 và x12 , ... phụ x11 , ... lw x10 , ...

NẾU /
0 ID ID / EX EX / MEM MEM / WB
M 10
bạn 10 WB
x
Điều khiển
hoặ WB 10
000
1 c là M 000 0 1

100 10 M 0 WB 1
EX 0 0

Reg
Writ
e
Thêm vào

Hướn
g dẫn
Thêm vào
Tổng Chi
4 nhánh

Ghi nhớ
Đọc ALUSrc

MemtoReg
6 đăng ký 1
PC Địa chỉ Đọc x6 x4
Đọc dữ liệu 1
7 đăng ký 2 Số không
Hướng dẫn Đọc x7 x5
10 Viết 0 ALU ALU
ký ức đăng ký dữ liệu 2 M kết quả Địa chỉ Đọc 1
b dữ
ạ Dữ liệu M
bạ
Viết n liệu n
Đăng ký x ký ức x
dữ liệu
1 Viết 0
Hướng dữ
dẫn liệu
[31 con0] Tôi X ALU
Hướng điều Ghi nhớ
dẫn Gen khiển
[30, 14
trận12] 6 7
ALUOp
Hướng
dẫn 11 10
[11 trận7] 13 12
Đồng hồ 5
THÀNH
VIÊN: WB :
TÔI và x12 , ... phụ x11 , ...
NẾU: : EX:
sau <1> thêm x14, x8, x9 hoặc x13 , ...
EX / MEM MEM / WB
NẾU /
0 ID ID / EX
M 10 10
WB 10
bạn WB
x
thê Tương
0 1

1 m phảnl 000 M 000 M 0 WB 0


0

100
EX 10
0
RegWrit

Thêm vào Chi


Thêm vào nhánh
e

4 Tổng
Ghi nhớ

MemtoReg
Hướng dẫn

số c
8 Đọc
PC Địa chỉ đăng ký 1 Đọc x8 x6 Địa chỉ Đọc 1
9 dữ liệu Dữ dữ liệu M
Đọc 1 Số không liệu bạ
n
Hướng dẫn đăng ký 2 x9 x7 ALU ALU ký ức x
ký ức 11 Viết Đọc 0
dữ liệu Viết 0
2 M kết quả dữ
đăng ký b
ạ liệu
n
Viết Đăng ký x
Ghi nhớ
dữ liệu 1
Hướng
dẫn
[31 con0] Tôi X ALU
điều
Hướng 12 11
Gen khiển
dẫn
[30, 14
trận12] 0 6
Hướng ALUOp
dẫn
[11 trận7] 14 13
Đồng
hồ 6

HÌNH e4.14.13 Đồng hồ chu kỳ 5 và 6. Với thêm, hướng dẫn cuối cùng trong ví dụ này, nhập IF vào datapath hàng đầu, tất cả các
hướng dẫn đang đính hôn. Bằng cách viết dữ liệu trong MEM / WB vào đăng ký 10 , lw hoàn thành; cả dữ liệu và số đăng ký đều nằm
trong MEM / WB. Trong cùng một chu kỳ đồng hồ , phụ gửi sự khác biệt trong EX / MEM đến MEM / WB và phần còn lại của hướng dẫn
di chuyển về phía trước. Trong chu kỳ đồng hồ tiếp theo , phụ chọn giá trị trong MEM / WB để ghi vào số đăng ký 11, một lần nữa được
tìm thấy trong MEM / WB. Các hướng dẫn còn lại chơi theo dõi người dẫn đầu: ALU tính OR của x6 và x7 cho hoặc là hướng dẫn trong
giai đoạn EX và đăng ký x8 và x9 được đọc trong giai đoạn ID cho thêm chỉ dẫn. Các hướng dẫn sau thêm được hiển thị là không hoạt
động chỉ để nhấn mạnh những gì xảy ra cho năm hướng dẫn trong ví dụ. Cụm từ sau <i> có nghĩa là Tôihướng dẫn sau thêm.
365.e24 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

NẾU: TÔI: EX: THÀNH VIÊN: WB :


sau <2> sau <1> thêm x14 , ... hoặc x13 , ... và x12 , ...

MEM /
0 NẾU / ID ID / EX EX / MEM WB
M 10
bạn 00 WB
x
Điều khiển
WB 10
000
1 M 000 0 1
000 EX 10 M 0 WB 0
0 0

Reg
Writ
Thêm vào

e

Thêm vào

ớn

dẫ
g

n
4 Tổng Chi
nhánh
đăng ký 2 Số không

Ghi nhớ
Đọc ALUSrc

MemtoReg
đăng ký 1 Đọc x8
PC Địa chỉ
Đọc dữ liệu 1
Hướng dẫn Viết Đọc x9 ALU ALU
ký ức 12 đăng ký dữ liệu 2 0
kết quả Địa chỉ Đọc 1
M
bạn dữ
Viết Đăng ký x Dữ liệu M
bạ
dữ liệu 1 liệu n

Hướng ký ức x
dẫn Viết 0
[31 con0] Tôi dữ
ALU
liệu
Hướng điều
dẫn Gen khiển
Ghi nhớ
[30, 14 trận12] 0
ALUOp
Hướng
dẫn
Đồng hồ [11 trận7] 14
7 13 12

NẾU: TÔI: EX: THÀNH


sau <3> sau <2> sau <1> VIÊN: WB :
thêm x14 , ... hoặc x13 , ...
EX / MEM /
NẾU ID / MEM WB
0 / ID EX
M
bạn
00 WB 00
x W
Tương B 10
1
phảnl 000 M 000
0 1
000 0
EX 00 M WB 0
0 0
Thêm
Reg
Writ

vào
e
Hướng dẫn

Thêm vào
4 Tổng
Chi
nhánh
Ghi nhớ

MemtoReg
c
Đọc
PC Địa chỉ đăng ký
Hướng 1 Đọc
dẫn Số
ký ức Đọc dữ liệu 1 không
đăng ký Địa chỉ Đọc 1
2 dữ
13 Viết Đọc 0 ALU ALU liệu M
Dữ b
dữ liệu 2 M
bạ
kết quả

đăng ký n liệu n
x ký ức x
Viết Đăng ký
Viết 0
dữ liệu 1
dữ
Hướng liệu
dẫn
[31 con0] Tôi ALU Ghi nhớ
Hướng điều
dẫn Gen khiển
[30, 14
trận12]
ALUOp
Hướng dẫn
[11 trận7] 14 13
Đồng hồ 8

HÌNH e4.14.14 Đồng hồ chu kỳ 7 và 8. Trong datapath hàng đầu, các thêm hướng dẫn đưa lên phía
sau , thêm các giá trị tương ứng với các thanh ghi x8 và x9 trong giai đoạn EX. Kết quả của hoặc là hướng
dẫn được chuyển từ EX / MEM sang MEM / WB trong giai đoạn MEM và giai đoạn WB viết kết quả của
và hướng dẫn trong MEM / WB để đăng ký x12 Lưu ý rằng các tín hiệu điều khiển được phân tách (đặt
thành 0) trong giai đoạn ID, vì không có lệnh nào được thực thi. Trong chu kỳ đồng hồ sau (bản vẽ thấp
hơn), giai đoạn WB ghi kết quả để đăng ký. x13, qua đó hoàn thành hoặc làvà giai đoạn MEM vượt qua
tổng từ thêm trong EX / MEM đến MEM / WB. Các hướng dẫn sau thêm được hiển thị là không hoạt
động vì lý do sư phạm.
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e25

THÀNH
NẾU: TÔI: EX: VIÊN: WB :
sau <4> sau <3> sau <2> sau <1> thêm x14 , ...

0 NẾU / ID ID / EX EX / MEM MEM / WB


M 00
bạn 00 WB
x
Tương phảnl
000
1 M 000 WB 00
0 1
000 00 0

EX 0 M 0 WB 0
W
R

ri
e
g

e
t
Thêm vào
Thêm vào
4 Tổng Chi

Ghi nhớ

to
M

R
nhánh

e
g
H
ư

n
g
d

n

Đọc
PC Địa chỉ đăng ký 1 Đọc
Đọc dữ liệu 1 Số không
Hướng dẫn đăng ký 2 ALU ALU
ký ức 14 Viết Đọc 0 Địa chỉ Đọc 1
đăng ký dữ liệu 2 M kết quả dữ liệu M
Dữ
bạn liệu bạn
Viết Đăng ký x ký ức x
dữ liệu 1 Viết 0
Hướng dữ
liệu
dẫn
[31 con0] Tôi ALU Ghi nhớ
Hướng điều
dẫn Gen khiển
[30, 14
trận12]
Hướng ALUOp
dẫn
[11 trận7] 14
Đồng hồ
9

HÌNH e4.14.15 Chu kỳ đồng hồ 9. Giai đoạn WB ghi kết quả ALU trong MEM / WB vào đăng ký x14, hoàn thành thêm và trình tự
năm hướng dẫn. Các hướng dẫn sau thêm được hiển thị là không hoạt động vì lý do sư phạm.
365.e26 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

hoặc x4, x4, x2 và x4, x2, x5 phụ x2, x1, x3 trước <1> trước <2>

ID / EX

10 WB 10
EX / MEM

Điều khiển M WB
MEM / WB

EX M WB
NẾU / ID
ớng
dẫn

2 x2 x1
M Dữ liệu
5 bạn
x
Đăng ký
ALU
PC Bộ nhớ
x5 x3 ký ức M
hướng b
dẫn ạ
n
M x
bạn
x

2 1
5 3
4 2

Chuyển tiếp
đơn vị

Đồng hồ 3

thêm x9, x4, x2 hoặc x4, x4, x2 và x4, x2, x5 phụ X2 , ... trước <1>

ID / EX

WB
10
10 EX / MEM

Điều khiển M WB 10
MEM / WB

EX M WB
NẾU / ID
ớng
dẫn

4 x4 x2
M Dữ liệu
2 bạn
x
Đăng ký
ALU
PC Bộ nhớ x2 x5 ký ức M
hướng b
dẫn ạ
n
M x
bạn
x

4 2
2 5
4 4 2

Chuyển tiếp
đơn vị

Đồng hồ 4

HÌNH e4.14.16 Đồng hồ chu kỳ 3 và 4 của chuỗi lệnh trên trang 366.e26. Các dòng in đậm là những người hoạt động trong a
chu kỳ đồng hồ và số đăng ký in nghiêng có màu cho thấy mối nguy hiểm. Đơn vị chuyển tiếp được tô sáng bằng cách tô bóng khi chuyển
tiếp dữ liệu tới ALU. Các hướng dẫn trước phụ được hiển thị là không hoạt động chỉ để nhấn mạnh những gì xảy ra cho bốn hướng dẫn
trong ví dụ. Tên toán tử được sử dụng trong EX để kiểm soát chuyển tiếp; do đó chúng được bao gồm trong nhãn hướng dẫn cho EX. Tên
toán tử không cần thiết trong MEM hoặc WB, vì vậy ... được sử dụng. So sánh điều này với Số liệu e4.14.12 đến e4.14.15, trong đó hiển thị
datapath mà không chuyển tiếp trong đó ID là giai đoạn cuối cùng cần thông tin toán hạng.
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e27

sau <1> thêm x9, x4, x2 hoặc x4, x4, x2 và x4 ,... phụ x2 , ..

ID / EX

10 WB 10
EX / MEM
Điều 10
khiển M WB
MEM / WB
1
NẾU / ID EX M WB

4 x4 x4
H
ư

n
g

d

n

M
2 2 bạn Dữ liệu
x
Đăng ký
PC Bộ nhớ ALU
ký ức M
x2 x2
hướng bạn
M x
dẫn bạn
x

4 4
2 2
9 4 4 2

Chuyển tiếp
đơn vị

Đồng hồ 5
sau <2> sau <1> thêm x9, x4, x2 hoặc x4 , ... và x4 , ..

ID / EX
EX /
WB 10 MEM
10
Điều khiển M WB
MEM / WB
1
NẾU / ID EX M WB

x4
Hướng dẫn

M
bạn
x
Đăng ký
Hướng dẫn 4 ALU
Dữ liệu
PC ký ức M
ký ức x2 bạn
M x
bạn
x

4
2
9 4 4

Chuyển tiếp
đơn vị

Đồng hồ 6

HÌNH e4.14.17 Đồng hồ chu kỳ 5 và 6 của chuỗi lệnh trên trang 366.e26. Đơn vị chuyển tiếp được tô sáng khi đó là chuyển tiếp
dữ liệu đến ALU. Hai hướng dẫn sau khi thêm được hiển thị là không hoạt động chỉ để nhấn mạnh những gì xảy ra cho bốn hướng dẫn
trong ví dụ. Các đường in đậm là những đường được kích hoạt trong một chu kỳ đồng hồ và các số thanh ghi in nghiêng có màu cho thấy
mối nguy hiểm.
365.e28 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

và x4, x2, x5 lw x2, 40 (x1) trước <1> trước <2> trước <3>

W
D
F

e
r
I

t
i
Nguy hiểm ID / EX.MemRead
phát hiện
1
đơn vị ID / EX
X
Điều 11
khiển bạn
M WB
WB EX / MEM
M
x MEM / WB
0
NẾU / ID EX M WB
PCWrit

Hướng
dẫn

1 x1
e

M Dữ liệu
X bạn
x
Đăng ký
Hướng dẫn ALU
PC ký ức XX ký ức M
bạn
M x
bạn
x

1
X
2

ID / EX.RegisterRd Chuyển tiếp


đơn vị

Đồng
hồ 2

hoặc x4, x4, x2 và x4, x2, x5 lw x2, 40 (x1) trước <1> trước <2>
W
D
F

e
r
I

t
i

Nguy hiểm
phát hiện ID / EX.MemRead
2
5 đơn vị ID / EX
Điều
khiển 00 WB 11
M
WB MEM / WB
EX / MEM
M
bạn
x
0
NẾU / ID EX M WB
PCWrit

Hướng
dẫn

2 x2 x1
e

M Dữ liệu
5 bạn
x
Đăng ký
Hướng dẫn ALU
PC ký ức ký ức M
x5 XX bạn
M x
bạn
x

2 1
5 X
4 2

ID / EX.RegisterRd Chuyển tiếp


đơn vị

Đồng hồ 3

HÌNH e4.14.18 Đồng hồ chu kỳ 2 và 3 của chuỗi lệnh trên trang 366.e26 với tải thay thế phụ.Các các đường in đậm là những
đường được kích hoạt trong một chu kỳ đồng hồ, các số đăng ký in nghiêng có màu cho thấy mối nguy hiểm và ... ở vị trí của toán hạng có
nghĩa là danh tính của chúng là thông tin không cần thiết trong giai đoạn đó. Các giá trị của các dòng điều khiển, thanh ghi và số thanh ghi
quan trọng được dán nhãn trong các hình. Các và hướng dẫn muốn đọc giá trị được tạo bởi lw hướng dẫn trong chu kỳ đồng hồ 3, vì vậy
đơn vị phát hiện nguy hiểm ngăn chặn và và hoặc là hướng dẫn. Do đó, đơn vị phát hiện nguy hiểm được làm nổi bật.
4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng 365.e29

hoặc x4, x4, x2 và x4, x2, x5 Bong bóng lw x2 ,... trước <1>
Nguy hiểm ID / EX.MemRead
phát hiện
2
đơn vị ID / EX
W
D
F

e
r
I

t
5

i
00
10 WB EX / MEM
M
Điều 11
khiển bạn M WB
x MEM / WB
0
NẾU / ID EX M WB

2 x2 x2
M
PCWrite

Hướng dẫn

5 bạn
x
Đăng ký
Hướng dẫn ALU Dữ liệu
PC ký ức x5 x5 ký ức M
bạn
M x
bạn
x

2 2
5 5
4 4 2

ID / EX.RegisterRd Chuyển tiếp


đơn vị

Đồng
hồ 4

thêm x9, x4, x2 hoặc x4, x4, x2 và x4, x2, x5 Bong bóng lw x2 ,...
Nguy hiểm
phát hiện ID / EX.MemRead
4
đơn vị ID / EX
W

2
D
F

e
r
I

t
i

10
10 WB EX / MEM
M
Điều 0
khiển bạn M WB MEM / WB
x

0
11
NẾU / ID EX M WB

4 x4 x2
M
PCWrite

Hướng dẫn

2 bạn
x
Đăng ký
2 Dữ liệu
Hướng dẫn ALU
PC ký ức x2 x5 ký ức M
bạn
M x
bạn
x

4 2
2 5
4 4 2

ID / EX.RegisterRd Chuyển tiếp


đơn vị

Đồng hồ 5

HÌNH e4.14.19 Đồng hồ chu kỳ 4 và 5 của chuỗi lệnh trên trang 366.e26 với tải thay thế phụ.Các bong bóng được chèn vào
đường ống trong chu kỳ đồng hồ 4, và sau đó là và hướng dẫn được phép tiến hành trong chu kỳ đồng hồ 5. Đơn vị chuyển tiếp được tô
sáng trong chu kỳ đồng hồ 5 vì nó đang chuyển tiếp dữ liệu từ đó lw đến ALU. Lưu ý rằng trong chu kỳ đồng hồ 4, đơn vị chuyển tiếp
chuyển tiếp địa chỉ của lw như thể đó là nội dung của đăng ký x2; điều này được làm cho vô hại bằng cách chèn bong bóng. Các đường in
đậm là những đường được kích hoạt trong một chu kỳ đồng hồ và các số thanh ghi in nghiêng có màu cho thấy mối nguy hiểm.
365.e30 4.14 Chủ đề nâng cao: Giới thiệu về thiết kế kỹ thuật số sử dụng ngôn ngữ thiết kế phần cứng

sau <1> thêm x9, x4, x2 hoặc x4, x4, x2 và x4 , ... Bong bóng
W
D
F

e
r
I

t
i
Nguy hiểm ID / EX.MemRead
phát hiện
4
đơn vị ID / EX
2
Điều 10
khiển 10 WB WB 10
bạn M

EX / MEM
M
x MEM / WB
0
NẾU 0
/ ID EX M WB
PCWri

Hướng
te

4 x4 x4
dẫn

M Dữ liệu
2 bạn
x
Đăng ký
Hướng dẫn ALU
PC ký ức x2 x2 ký ức M
bạn
M x
bạn
x

4 4
2 2

9 4 4

ID / EX.RegisterRd Chuyển tiếp


đơn vị

Đồng hồ
6

sau <2> sau <1> thêm x9, x4, x2 hoặc x4 , ... và x4 , ...
W
D
F

e
r
I

t
i

Nguy hiểm
phát hiện ID / EX.MemRead
đơn vị ID / EX
Điều
khiển bạn
10 WB 10
M
WB 10
EX / MEM
M
x MEM / WB
0
NẾU 1
/ ID EX M WB
PCWri

Hướng

x4
te

dẫn

4 M Dữ liệu
bạn
x
Đăng ký
Hướng dẫn ALU
PC ký ức x2 ký ức M
bạn
M x
bạn
x

4
2

9 4 4

ID / EX.RegisterRd Chuyển tiếp


đơn vị

Đồng hồ 7

HÌNH e4.14.20 Đồng hồ chu kỳ 6 và 7 của chuỗi lệnh trên trang 366.e26 với tải thay thế phụ.Ghi chú không giống như trong
Hình e4.14.17, gian hàng cho phép lw để hoàn thành, và do đó không có chuyển tiếp từ MEM / WB trong chu kỳ đồng hồ 6. Đăng ký x4
cho thêm trong giai đoạn EX vẫn phụ thuộc vào kết quả từ hoặc trong EX / MEM, do đó, đơn vị chuyển tiếp chuyển kết quả đến ALU. Các
dòng in đậm hiển thị các dòng đầu vào ALU hoạt động trong một chu kỳ đồng hồ và các số đăng ký in nghiêng cho thấy mối nguy hiểm.
Các hướng dẫn sau thêm được hiển thị là không hoạt động vì lý do sư phạm.
366 Chương 4 Bộ xử lý

để mô tả một đường ống như thế trong Intel Core i7 sẽ có hàng trăm ngàn dòng
là một dấu hiệu cho thấy sự phức tạp. Coi chừng!
Fallacy: Ý tưởng đường ống có thể được thực hiện độc lập với công nghệ.
Khi số lượng bóng bán dẫn trên chip và tốc độ của bóng bán dẫn làm cho một
đường ống năm giai đoạn trở thành giải pháp tốt nhất, thì nhánh bị trì hoãn (xem
Xây dựng trên trang 274) là một giải pháp đơn giản để kiểm soát các mối nguy
hiểm. Với các đường ống dài hơn, thực thi siêu thanh và dự đoán nhánh động,
giờ đây nó là dư thừa. Đầu những năm 1990, việc lập lịch đường ống động đã
chiếm quá nhiều tài nguyên và không cần thiết cho hiệu suất cao, nhưng khi ngân
sách bóng bán dẫn tiếp tục tăng gấp đôi do Định luật Moore và logic trở nên
nhanh hơn nhiều so với bộ nhớ, thì nhiều đơn vị chức năng và đường ống động
có ý nghĩa hơn. Ngày nay, những lo ngại về sức mạnh đang dẫn đến các thiết kế
ít tích cực và hiệu quả hơn.
Pitfall: Việc không xem xét thiết kế tập lệnh có thể ảnh hưởng xấu đến đường ống.
Nhiều khó khăn của đường ống phát sinh do các biến chứng của tập lệnh.
Dưới đây là một số ví dụ :
■ Độ dài lệnh và thời gian chạy thay đổi rộng có thể dẫn đến sự mất cân bằng
giữa các giai đoạn đường ống và làm phức tạp nghiêm trọng việc phát hiện
nguy cơ trong một thiết kế được thiết kế ở cấp độ tập lệnh. Vấn đề này đã
được khắc phục, ban đầu trong DEC VAX 8500 vào cuối những năm 1980,
sử dụng sơ đồ vi mô và sơ đồ vi mô mà Intel Core i7 sử dụng ngày nay. Tất
nhiên, chi phí dịch thuật và duy trì sự tương ứng giữa các hoạt động vi mô
và các hướng dẫn thực tế vẫn còn.
■ Các chế độ giải quyết tinh vi có thể dẫn đến các loại vấn đề khác nhau. Các
chế độ giải quyết cập nhật các thanh ghi làm phức tạp phát hiện nguy hiểm.
Các chế độ địa chỉ khác yêu cầu nhiều truy cập bộ nhớ làm phức tạp đáng
kể việc kiểm soát đường ống và gây khó khăn cho việc giữ cho đường ống
chạy trơn tru.
■ Có lẽ ví dụ tốt nhất là DEC Alpha và DEC NVAX. Trong công nghệ so
sánh, kiến trúc tập lệnh mới hơn của Alpha cho phép triển khai có hiệu suất
nhanh hơn gấp đôi so với NVAX. Trong một ví dụ khác, Bhandarkar và
Clark [1991] đã so sánh MIPS M / 2000 và DEC VAX 8700 bằng cách
đếm chu kỳ đồng hồ của các điểm chuẩn của Spec; họ kết luận rằng mặc dù
MIPS M / 2000 thực hiện nhiều hướng dẫn hơn, VAX trung bình thực hiện
gấp 2,7 lần chu kỳ đồng hồ, vì vậy MIPS nhanh hơn.
4.16 Nhận xét kết luận 367

Chín phần mười của


trí tuệ bao gồm khôn
4.16 Kết luận ngoan trong thời
gian.
Như chúng ta đã thấy trong chương này, cả datapath và điều khiển cho bộ xử lý Tục ngữ Mỹ
đều có thể được thiết kế bắt đầu với kiến trúc tập lệnh và hiểu về các đặc tính cơ
bản của công nghệ. Trong Mục 4.3, chúng tôi đã thấy cách dữ liệu cho bộ xử lý
RISC-V có thể được xây dựng dựa trên kiến trúc và quyết định xây dựng triển
khai một chu kỳ. Tất nhiên, công nghệ cơ bản cũng ảnh hưởng đến nhiều quyết
định thiết kế bằng cách chỉ ra những thành phần nào có thể được sử dụng trong
datapath, cũng như liệu việc thực hiện một chu kỳ thậm chí có ý nghĩa hay không.
Đường ống cải thiện thông lượng nhưng không phải là thời gian thực hiện
vốn có, hoặc độ trễ hướng dẫn, của hướng dẫn; đối với một số hướng dẫn, độ
trễ là tương tự nhau theo chiều dài của phương pháp một chu kỳ. Nhiều vấn đề
hướng dẫn thêm phần cứng datapath bổ sung để cho phép nhiều hướng dẫn bắt
đầu mỗi chu kỳ đồng hồ, nhưng ở mức tăng độ trễ hiệu quả. Pipeling được trình
bày là làm giảm thời gian chu kỳ đồng hồ của datapath đơn giản. Nhiều vấn đề
hướng dẫn, so sánh, rõ ràng tập trung vào việc giảm chu kỳ đồng hồ trên mỗi độ trễ hướng dẫn Các
hướng dẫn (CPI). thời gian thực hiện vốn
Đường ống và nhiều vấn đề đều cố gắng khai thác song song cấp độ hướng có cho một hướng dẫn.
dẫn. Sự hiện diện của dữ liệu và sự phụ thuộc kiểm soát, có thể trở thành mối
nguy hiểm, là những hạn chế chính về mức độ song song có thể được khai thác.
Lập kế hoạch và đầu cơ thông qua dự đoán, cả về phần cứng và phần mềm, là
các kỹ thuật chính được sử dụng để giảm tác động hiệu suất của các phụ thuộc.
Chúng tôi đã chỉ ra rằng việc hủy đăng ký vòng lặp DGEMM bốn lần cho thấy
nhiều hướng dẫn hơn có thể tận dụng công cụ thực thi không theo thứ tự của
Core i7 để tăng hơn gấp đôi hiệu suất.
Việc chuyển sang các đường ống dài hơn, nhiều vấn đề về hướng dẫn và lập lịch
động vào giữa những năm 1990 đã giúp duy trì mức tăng hiệu suất bộ xử lý 60% mỗi
năm bắt đầu vào đầu những năm 1980. Như đã đề cập trong Chương 1, các bộ vi xử
lý này bảo tồn mô hình lập trình tuần tự, nhưng cuối cùng chúng đã chạy vào bức
tường điện. Do đó, ngành công nghiệp đã buộc phải chuyển sang bộ đa xử lý, khai
thác tính song song ở nhiều mức độ thô hơn (chủ đề của Chương 6). Xu hướng này
cũng đã khiến các nhà thiết kế đánh giá lại ý nghĩa hiệu suất năng lượng của một số
phát minh kể từ giữa những năm 1990, dẫn đến việc đơn giản hóa các đường ống
trong các phiên bản kiến trúc vi mô gần đây.
Để duy trì những tiến bộ trong xử lý hiệu suất thông qua bộ xử lý song song ,
Luật Amdahl sườn cho thấy rằng một phần khác của hệ thống sẽ trở thành nút cổ chai.
Nút thắt đó là chủ đề của chương tiếp theo: the hệ thống phân cấp bộ nhớ.
368 Chương 4 Bộ xử lý

4.17 Quan điểm lịch sử và hơn thế nữa


Đọc hiểu
Phần này, xuất hiện trực tuyến, thảo luận về lịch sử của các bộ xử lý đường ống
đầu tiên, siêu sao sớm nhất và phát triển các kỹ thuật đầu cơ và đầu cơ, cũng như
những phát triển quan trọng trong công nghệ biên dịch đi kèm.

4.18 Tự học

Trong khi các bộ xử lý hiệu suất cao hơn có các đường ống dài hơn nhiều so với
năm giai đoạn, một số bộ xử lý năng lượng rất thấp hoặc chi phí thấp có các
đường ống ngắn hơn. Giả sử cùng thời gian của các thành phần datapath như
trong Hình 4.43 và 4.44.
Ống ba giai đoạnLàm thế nào bạn sẽ chia datapath thành các giai đoạn nếu
đường ống của nó. có ba giai đoạn chứ không phải năm?
Tỷ lệ đồng hồ. Bỏ qua tác động của các thanh ghi đường ống hoặc logic chuyển
tiếp trên đồng hồ thời gian chu kỳ, tốc độ đồng hồ cho các đường ống năm giai đoạn
so với ba giai đoạn là bao nhiêu? Giả sử cùng thời gian của các thành phần datapath
như trong Hình 4.43 và 4.44.
Đăng ký Viết / Đọc các mối nguy dữ liệu? Bạn vẫn có chúng với ba giai đoạn?
Nếu vậy, sẽ chuyển tiếp sửa chúng?
Tải dữ liệu nguy hiểm? Bạn vẫn có chúng với ba giai đoạn? Làm bạn cần
phải trì hoãn đường ống, hoặc có thể chuyển tiếp sửa chúng?
Kiểm soát các mối nguy hiểm? Bạn vẫn có chúng với ba giai đoạn? Nếu vậy,
làm thế nào bạn có thể giảm tác động của họ?
CPIĐồng hồ trên mỗi hướng dẫn của đường ống ba giai đoạn sẽ cao hơn hoặc.
thấp hơn so với đường ống năm giai đoạn?

Câu trả lời

Ống ba giai đoạn. Trong khi có nhiều giải pháp có thể, đây là một giải pháp hợp
lý chia tay:
1. Hướng dẫn tìm nạp, đăng ký đọc (300 ps)
2. ALU (200 ps)
3. Truy cập dữ liệu, ghi đăng ký (300 ps)
300 600 900 1200 1500
Hướng dẫn lấy Đăng ký đọc ALU Ngày truy cập Đăng ký viết
Ngày truy
Hướng dẫn lấy Đăng ký đọc ALU cập Đăng ký viết
Ngày truy
Hướng dẫn lấy Đăng ký đọc ALU cập Đăng ký viết
4.16 Quan điểm lịch sử và đọc thêm 368.e1

siêu máy tính : Bất


kỳ máy vẫn còn trên
4.17 Quan điểm lịch sử và đọc thêm bảng vẽ.
Stan Kelly-Bootle ,
Các Từ điển quỷ dữ
Phần này thảo luận về lịch sử của các bộ xử lý đường ống ban đầu, siêu sao sớm DP, 1981
nhất và sự phát triển của các kỹ thuật đầu cơ và trật tự, cũng như những phát triển
quan trọng trong công nghệ biên dịch đi kèm.
Người ta thường đồng ý rằng một trong những máy tính có mục đích chung đầu
tiên là Stretch, IBM 7030 (Hình e4.17.1). Stretch theo IBM 704 và có mục tiêu nhanh
hơn 100 lần so với 704. Các mục tiêu là một đoạn đường dài của người Viking về tình
trạng của nghệ thuật tại thời điểm đó, do đó, biệt danh. Kế hoạch là để có được hệ số
1.6 từ quá trình tìm nạp, giải mã và thực hiện bằng cách sử dụng đường ống bốn giai
đoạn. Rõ ràng, phần còn lại là đến từ phần cứng nhiều hơn và logic nhanh hơn.
Stretch cũng là nơi đào tạo cho cả các kiến trúc sư của IBM 360, Gerrit Blaauw và
Fred Brooks, Jr.và kiến trúc sư của IBM RS / 6000, John Cocke.

HÌNH e4.17.1 Máy tính Stretch, một trong những máy tính được thiết kế đầu tiên.
368.e2 4.16 Quan điểm lịch sử và đọc thêm

Cả Brooks và Cooke sau đó đã giành được ACM A.M. Turing Awards, danh
hiệu cao quý nhất trong khoa học máy tính.
Kiểm soát tập đoàn dữ liệu (CDC) đã cung cấp những gì được coi là đầu tiên
siêu máy tính, CDC 6600, năm 1964 (Hình e4.17.2). Các hướng dẫn cốt lõi của
các máy tính tiếp theo Cray có nhiều điểm tương đồng với các máy tính CDC
6600 ban đầu. CDC 6600 là duy nhất theo nhiều cách. Sự tương tác giữa thiết kế
đường ống và thiết kế tập lệnh đã được hiểu và tập lệnh được giữ đơn giản để
thúc đẩy đường ống. CDC 6600 cũng sử dụng công nghệ đóng gói tiên tiến. Cuốn
sách của James Thornton, [1970] cung cấp một mô tả tuyệt vời về toàn bộ máy
tính, từ công nghệ đến kiến trúc, và bao gồm một lời tựa của Seymour Cray.
(Thật không may, cuốn sách này hiện không được in.) Jim Smith, sau đó làm việc
tại CDC, đã phát triển sơ đồ dự đoán nhánh 2 bit ban đầu và khám phá một số kỹ
thuật để tăng cường vấn đề hướng dẫn cho CDC Cyber 180/990. Cray, Thornton
và Smith từng giành được giải thưởng ACM Eckert-Mauchly (lần lượt vào năm
1989, 1994 và 1999).
IBM 360/91 đã giới thiệu nhiều khái niệm mới, bao gồm phát hiện động các
mối nguy bộ nhớ, chuyển tiếp tổng quát và các trạm đặt phòng (Hình e4.17.3).
Cách tiếp cận thường được đặt tên Thuật toán Tomasulo, sau khi một kỹ sư làm
việc trong dự án. Nhóm đã tạo ra 360/91 được dẫn dắt bởi Michael Flynn, người
được trao Giải thưởng ACM Eckert-Mauchly năm 1992, một phần vì những
đóng góp của ông cho IBM 360/91; vào năm 1997, giải thưởng tương tự đã thuộc
về Robert Tomasulo cho công việc tiên phong của ông về xử lý ngoài trật tự.

HÌNH e4.17.2 CDC 6600, siêu máy tính đầu tiên.


4.16 Quan điểm lịch sử và đọc thêm 368.e3

HÌNH e4.17.3 IBM 360/91 đã thúc đẩy tình trạng nghệ thuật trong việc thực hiện đường ống
khi nó được công bố vào năm 1966.

Tổ chức nội bộ của 360/91 chia sẻ nhiều tính năng với Pentium III và Pentium 4,
cũng như với một số bộ vi xử lý khác. Một điểm khác biệt chính là không có dự đoán
chi nhánh trong 360/91 và do đó không có suy đoán. Một sự khác biệt lớn khác là
không có đơn vị cam kết, vì vậy một khi các hướng dẫn hoàn thành thực hiện, họ đã
cập nhật các thanh ghi. Cam kết hướng dẫn ngoài trật tự dẫn đến ngắt chính xác, điều
này tỏ ra không phổ biến và dẫn đến các đơn vị cam kết trong các bộ xử lý đường
ống được lên lịch động kể từ thời điểm đó. Mặc dù 360/91 không thành công, nhưng
những ý tưởng chính của nó đã được hồi sinh sau đó và tồn tại dưới một hình thức
nào đó trong phần lớn các bộ vi xử lý máy tính để bàn và máy chủ kể từ năm 2000.

Cải thiện hiệu quả đường ống và thêm nhiều vấn đề


Các bộ xử lý RISC đã tinh chỉnh khái niệm về các đường ống được lập lịch trình
vào đầu những năm 1980. Các khái niệm về các nhánh bị trì hoãn và tải chậm trễ
phổ biến trong chương trình vi mô đã được mở rộng sang kiến trúc cấp cao. Trên
thực tế, bộ xử lý Stanford dẫn đến kiến trúc MIPS thương mại được gọi là Bộ vi
xử lý không có các giai đoạn đường ống lồng vào nhau vì nó tùy thuộc vào trình
biên dịch hoặc trình biên dịch để tránh các nguy cơ dữ liệu.
Ngoài những đóng góp cho sự phát triển của các khái niệm RISC, IBM đã làm
công việc tiên phong về nhiều vấn đề. Vào những năm 1960, một dự án có tên ACS
đã được tiến hành. Nó bao gồm các khái niệm vấn đề đa hướng dẫn và khái niệm tích
hợp
368.e4 4.16 Quan điểm lịch sử và đọc thêm

trình biên dịch và thiết kế kiến trúc, nhưng nó không bao giờ đạt đến giai đoạn sản
phẩm. Đề xuất sớm nhất cho một bộ xử lý siêu âm tự động đưa ra quyết định vấn đề
là của John Cocke; ông đã mô tả những ý tưởng quan trọng trong một số cuộc đàm
phán vào giữa những năm 1980 và, với Tilak Agarwala, đặt ra tên siêu âmThiết kế
ban đầu này là một cỗ máy hai vấn đề có tên Cheetah, được theo sau bởi một cỗ máy
bốn vấn đề được thảo luận rộng rãi hơn có tên là America. Kiến trúc IBM Power-1,
được sử dụng trong dòng RS / 6000, dựa trên những ý tưởng này và PowerPC là một
biến thể của kiến trúc Power-1.
Vấn đề tĩnh nhiều, như được minh họa bởi từ hướng dẫn dài (LIW) hoặc đôi khi
từ hướng dẫn rất dài (VLIW) tiếp cận, xuất hiện trong các thiết kế thực sự trước khi
tiếp cận siêu thanh. Trên thực tế, các máy đa vấn đề sớm nhất là bộ xử lý gắn đặc biệt
được thiết kế cho các ứng dụng khoa học. Culler Khoa học và Hệ thống điểm nổi là
hai trong số những nhà sản xuất nổi bật nhất của các máy tính như vậy. Một nguồn
cảm hứng khác cho việc sử dụng nhiều thao tác cho mỗi lệnh đến từ những người làm
việc trên các trình biên dịch mã vi mô. Cảm hứng như vậy đã dẫn đến một dự án
nghiên cứu tại Yale do Josh Fisher dẫn đầu, người đã đặt ra thuật ngữ VLIW.
Cydrom và Multiflow là hai công ty đầu tiên tham gia xây dựng siêu máy tính mini
sử dụng bộ xử lý có khả năng phát hành nhiều vấn đề. Các bộ xử lý này, được xây
dựng với các triển khai mảng cổng bit và nhiều chip, đã xuất hiện trên thị trường
cùng lúc với các bộ vi xử lý RISC ban đầu. Mặc dù có một số hiệu suất đầy hứa hẹn
trên các mã khoa học cao cấp, chi phí / hiệu suất tốt hơn của các máy tính dựa trên bộ
vi xử lý đã làm thất bại thế hệ máy tính VLIW đầu tiên. Bob Rau và Josh Fisher đã
lần lượt giành giải thưởng Eckert-Mauchly vào năm 2002 và 2003 vì những đóng góp
của họ cho việc phát triển nhiều bộ xử lý và kỹ thuật phần mềm để khai thác ILP .
Đầu những năm 1990 đã chứng kiến các bộ xử lý siêu âm đầu tiên sử dụng lập lịch
tĩnh và không có suy đoán, bao gồm các phiên bản của kiến trúc MIPS và PowerPC.
Đầu những năm 1990 cũng chứng kiến nghiên cứu quan trọng tại một số trường đại
học, bao gồm Wisconsin, Stanford, Illinois và Michigan, tập trung vào các kỹ thuật
khai thác ILP bổ sung thông qua nhiều vấn đề có và không có đầu cơ. Những hiểu
biết nghiên cứu này đã được sử dụng để xây dựng các bộ xử lý đầu cơ theo lịch trình
động, bao gồm Motorola 88110, MIPS R10000, DEC Alpha 21264, PowerPC 603 và
Intel Pentium Pro, Pentium III và Pentium 4.
Năm 2001, Intel đã giới thiệu kiến trúc IA-64 và triển khai đầu tiên, Itanium.
Itanium đại diện cho sự trở lại với cách tiếp cận chuyên sâu hơn về trình biên
dịch mà họ gọi là EPIC. EPIC đại diện cho một sự cải tiến đáng kể so với các
kiến trúc VLIW ban đầu, loại bỏ nhiều nhược điểm của chúng. Nó đã có doanh
số khiêm tốn. Năm 2019, Intel tuyên bố sẽ ngừng bộ xử lý Itanium 9700-series,
chip EPIC cuối cùng trên thị trường.

Công nghệ biên dịch để khai thác ILP


Phát triển thành công bộ xử lý để khai thác ILP đã phụ thuộc vào sự tiến bộ trong
công nghệ trình biên dịch. Khái niệm về việc hủy đăng ký vòng lặp đã được hiểu
sớm và một số công ty và nhà nghiên cứu, bao gồm Hệ thống điểm nổi, Cray và
dự án MIPS Stanford đã phát triển các trình biên dịch sử dụng vòng lặp
4.16 Quan điểm lịch sử và đọc thêm 368.e5

không kiểm soát và lập lịch đường ống để cải thiện thông lượng hướng dẫn. Một
bộ xử lý chuyên dùng có tên WARP, được thiết kế tại Đại học Carnegie Mellon,
đã truyền cảm hứng cho sự phát triển của đường ống phần mềm, một cách tiếp
cận mang tính biểu tượng của các vòng lặp.
Để khai thác mức ILP cao hơn, cần có công nghệ biên dịch tích cực hơn. Dự
án VLIW tại Yale đã phát triển khái niệm lập lịch theo dõi mà Multi-flow thực
hiện trong trình biên dịch của họ. Lập lịch theo dõi dựa trên việc bỏ vòng lặp tích
cực và dự đoán đường dẫn để biên dịch các dấu vết thực thi được ưa thích một
cách hiệu quả. Các nhà thiết kế Cydrom đã tạo ra các phiên bản đầu tiên của sự
tiên đoán và hỗ trợ cho đường ống phần mềm. Hwu tại Illinois đã làm việc trên
các phiên bản mở rộng của việc hủy đăng ký vòng lặp, được gọi siêu xevà các kỹ
thuật để biên dịch với sự tiên đoán. Các khái niệm từ Multiflow, Cydrom và
nhóm nghiên cứu tại Illinois đóng vai trò là cơ sở kiến trúc và biên dịch cho kiến
trúc IA-64.

Đọc thêm
Bhandarkar, D. và D.W. Clark [1991]. Hiệu suất của kiến trúc: So sánh RISC và CISC với các tổ chức
phần cứng tương tự, Proc. Thứ tư Conf. về Hỗ trợ kiến trúc cho các ngôn ngữ lập trình và Hệ điều hành,
IEEE / ACM (Tháng 4), Palo Alto, CA, 310 Tiết19.
Một so sánh định lượng của RISC và CISC được viết bởi các học giả đã tranh luận về CISC cũng như xây
dựng chúng; họ kết luận rằng MIPS nhanh hơn từ 2 đến 4 lần so với VAX được chế tạo với công nghệ
tương tự, với giá trị trung bình là 2,7.
Ngư dân, J.A. và B.R. Rau [1993]. Tạp chí siêu máy tính (Tháng 1), Kluwer.

Toàn bộ vấn đề này được dành cho chủ đề khai thác ILP. Nó chứa các bài viết về cả kiến trúc và phần
mềm và là một nguồn tuyệt vời để tham khảo thêm.
Hennessy, J. L. và D. A. Patterson [2001]. Kiến trúc máy tính: Cách tiếp cận định lượng, phiên bản thứ tư,
Morgan Kaufmann, San Francisco.
Chương 2 và Phụ lục A đi sâu vào chi tiết hơn đáng kể về bộ xử lý đường ống (gần 200 trang) , bao gồm
bộ xử lý superscalar và bộ xử lý VLIW. Phụ lục G mô tả Itanium.
Jouppi, N.P. và D.W. Tường [1989]. Có sẵn song song cấp độ hướng dẫn cho bộ xử lý siêu âm và siêu
đường, trực tiếp Proc. Thứ ba Conf. về Hỗ trợ kiến trúc cho các ngôn ngữ lập trình và hệ điều hành, IEEE
/ ACM (Tháng 4), Boston, 272 Từ82.
Một so sánh của các hệ thống đường ống sâu (còn gọi là superpipeled) và superscalar.
Kogge, P. M. [1981]. Kiến trúc của máy tính đường ống, McGraw-Hill, New York.
Một văn bản chính thức về kiểm soát đường ống, nhấn mạnh vào các nguyên tắc cơ bản.
Russell, R. M. [1978]. Hệ thống máy tính CRAY-1 , Thông tin. của ACM 21: 1 (tháng 1), 63 trận72.

Một bản tóm tắt ngắn về một máy tính cổ điển sử dụng các vectơ hoạt động để loại bỏ các quầy hàng đường ống.
Smith, A. và J. Lee [1984]. Chiến lược dự đoán chi nhánh và thiết kế bộ đệm mục tiêu chi nhánh , Máy vi
tính 17: 1 (tháng 1), 6 trận22.
Một cuộc khảo sát sớm về dự đoán chi nhánh.
368.e6 4.16 Quan điểm lịch sử và đọc thêm

Smith, J. E. và A. R. Plezkun [1988]. Thực hiện các ngắt chính xác trong bộ xử lý đường ống IEEE Trans.
trên máy tính 37: 5 (tháng 5), 562 bóng73.

Bao gồm những khó khăn trong việc làm gián đoạn máy tính đường ống.
Thornton, J. E. [1970]. Thiết kế máy tính. Dữ liệu điều khiển 6600, Glenview, IL: Scott, Foresman.
Một cuốn sách cổ điển mô tả một máy tính cổ điển, được coi là siêu máy tính đầu tiên.
4.19 Bài tập 369

Tỷ lệ đồng hồ. Hình 4.44 cho thấy thời gian chu kỳ đồng hồ của đường ống
năm giai đoạn là 200 ps, vì vậy tốc độ xung nhịp là 1/200 ps hoặc 5 GHz. Giai
đoạn tồi tệ nhất cho đường ống ba giai đoạn là 300 ps, vì vậy tốc độ xung nhịp là
1/300 ps hoặc 3,33 GHz.
Đăng ký Viết / Đọc các mối nguy dữ liệu. Như bản vẽ đường ống ở trên cho thấy, có
vẫn là một nguy cơ ghi / đọc. Hướng dẫn đầu tiên không viết dữ liệu vào các thanh ghi ở
giai đoạn thứ ba, nhưng hướng dẫn tiếp theo cần giá trị mới ở đầu giai đoạn thứ hai. Các
giải pháp chuyển tiếp trong Mục 4.8 hoạt động tốt cho đường ống ba giai đoạn, vì kết quả
ALU của hướng dẫn trước đã sẵn sàng trước khi bắt đầu giai đoạn thứ hai.
Tải dữ liệu nguy hiểm. Ngay cả với ba giai đoạn, chúng ta phải trì hoãn một
chu kỳ đồng hồ cho một nguy cơ sử dụng tải như trong Mục 4.8Dữ liệu không có
sẵn cho đến giai đoạn thứ ba của hướng dẫn tải, nhưng hướng dẫn sau cần dữ liệu
mới ở đầu giai đoạn thứ hai.
Kiểm soát các mối nguy hiểm. Mối nguy hiểm này là nơi đường ống ba giai đoạn
tỏa sáng. Chúng ta có thể sử dụng tối ưu hóa tương tự như trong Mục 4.9 để tính địa
chỉ chi nhánh và so sánh các thanh ghi cho đẳng thức trước giai đoạn ALU, như
chúng tôi đã làm Hình 4.79Tính toán đó được thực hiện trước khi tìm nạp hướng dẫn
của hướng dẫn sau, do đó logic nhánh sớm giải quyết nguy cơ kiểm soát mà không bị
phạt đường ống.
CPIĐồng hồ trung bình trên mỗi hướng dẫn sẽ co lại (tốt hơn) với đường ống
ba giai đoạn vì một vài lý do :.
■ Cho rằng chu kỳ đồng hồ dài hơn, sẽ mất ít chu kỳ đồng hồ hơn để truy cập
bộ nhớ DRAM, điều này sẽ ảnh hưởng đến CPI khi chúng ta bị bỏ lỡ trong
bộ đệm (xem Chương 5).
■ Các nhánh sẽ luôn thực hiện trong một chu kỳ đồng hồ, trong khi bất kỳ sơ
đồ phần mềm và phần cứng nào để tăng tốc các nhánh với năm giai đoạn sẽ
thất bại một thời gian, làm tăng CPI hiệu quả .
■ Thời gian chu kỳ đồng hồ của chúng tôi dài hơn cho ALU, có thể cho phép
một số thao tác phức tạp có thể mất nhiều hơn một chu kỳ đồng hồ trong
đường ống năm giai đoạn. Ví dụ: số nguyên nhân hoặc chia có thể cần ít
hơn các chu kỳ đồng hồ dài hơn này so với đường ống năm giai đoạn.

4.19 Bài tập

4.1 Hãy xem xét các hướng dẫn sau :


Hướng dẫn: và rd, rs1, rs2
Giải thích: Reg [rd] = Reg [rs1] VÀ Reg [rs2]
4.1.1 [5] <§4.3> Các giá trị của tín hiệu điều khiển được tạo ra bởi điều khiển
là gì trong Hình 4.10 cho hướng dẫn này?
4.1.2 [5] <§4.3> Những tài nguyên (khối) thực hiện một chức năng hữu ích
cho việc này chỉ dẫn?
370 Chương 4 Bộ xử lý

4.1.3 [10] <§4.3> Những tài nguyên (khối) không tạo ra đầu ra cho việc này
chỉ dẫn? Những tài nguyên sản xuất đầu ra không được sử dụng?

4.2 [10] <§4.4> Giải thích từng vấn đề của don don quan tâm đến Hình 4.22.

4.3 Hãy xem xét hỗn hợp hướng dẫn sau :


Loại R Cửa hàng nhảy chi
Tải loại I (không phải lw) nhánh
24% 28% 25% 10% 11% 2%

4.3.1 [5] <§4.4> Phần nào của tất cả các hướng dẫn sử dụng bộ nhớ dữ liệu?
4.3.2 [5] <§4.4> Phần nào của tất cả các hướng dẫn sử dụng bộ nhớ hướng dẫn?
4.3.3 [5] <§4.4> Phần nào của tất cả các hướng dẫn sử dụng mở rộng dấu hiệu?
4.3.4 [5] <§4.4> Dấu hiệu mở rộng làm gì trong các chu kỳ trong đó đầu ra của
nó không cần thiết?

4.4 Khi chip silicon được chế tạo, các khuyết tật về vật liệu (ví dụ:., silicon) và
lỗi sản xuất có thể dẫn đến các mạch bị lỗi. Một khiếm khuyết rất phổ biến là một
dây tín hiệu để có được sự cố bị hỏng và luôn đăng ký logic 0. Điều này thường
được gọi là lỗi của Stuck-at-0.
4.4.1 [5] <§4.4> Những hướng dẫn không hoạt động chính xác nếu MemToReg
dây bị kẹt ở 0?
4.4.2 [5] <§4.4> Những hướng dẫn không hoạt động chính xác nếu ALUSrc
dây bị kẹt ở 0?

4.5 Trong bài tập này, chúng tôi kiểm tra chi tiết cách thực hiện một lệnh trong
a datapath một chu kỳ. Các vấn đề trong bài tập này đề cập đến một chu kỳ đồng
hồ trong đó bộ xử lý tìm từ hướng dẫn sau : 0x00c6ba23.
4.5.1 [10] <§4.4> Các giá trị của đơn vị điều khiển ALU đầu vào cho việc này
là gì chỉ dẫn?
4.5.2 [5] <§4.4> Địa chỉ PC mới sau khi lệnh này được thực thi là gì? Làm nổi
bật đường dẫn mà qua đó giá trị này được xác định.
4.5.3 [10] <§4.4> Đối với mỗi mux, hiển thị các giá trị của đầu vào và đầu ra của
nó trong suốt việc thực hiện hướng dẫn này. Liệt kê các giá trị là đầu ra đăng ký tại
Reg [xn].
4.5.4 [10] <§4.4> Các giá trị đầu vào cho ALU và hai đơn vị bổ sung là gì?
4.5.5 [10] <§4.4> Các giá trị của tất cả các đầu vào cho đơn vị đăng ký là gì?
4.19 Bài tập 371

4.6 Mục 4.4 không thảo luận về hướng dẫn loại I như addi hoặc là andi.
4.6.1 [5] <§4.4> Những khối logic bổ sung nào, nếu có, là cần thiết để thêm
loại I hướng dẫn về CPU được hiển thị trong Hình 4.21 Thêm bất kỳ khối logic
cần thiết để? Hình 4.21 và giải thích mục đích của họ.
4.6.2 [10] <§4.4> Liệt kê các giá trị của các tín hiệu được tạo bởi đơn vị điều
khiển cho addiGiải thích lý do cho bất kỳ tín hiệu điều khiển nào của don don
care.

4.7 Các vấn đề trong bài tập này cho rằng các khối logic được sử dụng để thực
hiện a bộ xử lý dữ liệu dữ liệu có độ trễ sau :

I-Mem / Đăng ký Độc


D-Mem Tập thân Đăng ký Đăng ký Ký tên
tin mở rộng Kiểm
Cổng Adder ALU Đọc Thiết lập soát
250 ps 150 25 ps 200 ps 5 30 20 50 50 ps
ps 150 ps ps ps ps ps

Đăng ký đọc sách là thời gian cần thiết sau khi cạnh đồng hồ tăng để giá trị đăng
ký mới xuất hiện trên đầu ra. Giá trị này chỉ áp dụng cho PC. Thiết lập Đăng ký
của Nhật Bản là thời gian đầu vào dữ liệu của Đăng ký phải ổn định trước khi
cạnh tăng của đồng hồ. Giá trị này áp dụng cho cả PC và Đăng ký tệp.
4.7.1 [5] <§4.4> Độ trễ của lệnh loại R là gì (tức là., phải bao lâu thời gian
đồng hồ là để đảm bảo rằng hướng dẫn này hoạt động chính xác)?
4.7.2 [10] <§4.4> Độ trễ của là gì lw? (Kiểm tra câu trả lời của bạn một cách
cẩn thận. Nhiều học sinh đặt thêm muxes trên con đường quan trọng.)
4.7.3 [10] <§4.4> Độ trễ của là gì sw? (Kiểm tra câu trả lời của bạn một cách
cẩn thận. Nhiều học sinh đặt thêm muxes trên con đường quan trọng.)
4.7.4 [5] <§4.4> Độ trễ của là gì beq?
4.7.5 [5] <§4.4> Độ trễ của loại số học, logic hoặc dịch chuyển I là gì (không
tải) hướng dẫn?
4.7.6 [5] <§4.4> Thời gian đồng hồ tối thiểu cho CPU này là bao nhiêu?

4.8 [10] <§4.4> Giả sử bạn có thể xây dựng CPU trong đó thời gian chu kỳ
đồng hồ khác nhau cho mỗi hướng dẫn. Việc tăng tốc của CPU mới này sẽ vượt
qua CPU được trình bày trong đó Hình 4.25 đưa ra hỗn hợp hướng dẫn dưới đây?

Loại R / loại I (không lw sw beq


phải ld)
52% 25% 11% 12%

4.9 Hãy xem xét việc bổ sung một số nhân vào CPU được hiển thị trong Hình
4.25Điều này. bổ sung sẽ thêm 300 ps vào độ trễ của ALU, nhưng sẽ giảm 5% số
lượng hướng dẫn (vì sẽ không còn cần phải mô phỏng hướng dẫn nhân).
372 Chương 4 Bộ xử lý

4.9.1 [5] <§4.4> Thời gian chu kỳ đồng hồ có và không có cải tiến này là gì?
4.9.2 [10] <§4.4> Speedup đạt được là gì bằng cách thêm cải tiến này?
4.9.3 [10] <§4.4> ALU mới chậm nhất có thể và vẫn dẫn đến là gì cải thiện
hiệu suất?

4.10 Khi các nhà thiết kế bộ xử lý xem xét một cải tiến có thể cho bộ xử lý
datapath, quyết định thường phụ thuộc vào sự đánh đổi chi phí / hiệu suất. Trong ba
vấn đề sau, giả sử rằng chúng ta đang bắt đầu với datapath từ đó Hình 4.25, độ trễ từ
Bài tập 4.7 và các chi phí sau :

Đăng ký Độc
Tôi- Tập tin thân Ký tên Độc thân
Mem Đăng ký Mux ALU Adder D-Mem mở rộng kiểm soát cổng
1000 200 10 100 30 2000 5 100 1 500

Giả sử nhân đôi số lượng thanh ghi mục đích chung từ 32 đến 64 sẽ làm giảm số
lượng lw và sw hướng dẫn được thực hiện 12%, nhưng tăng độ trễ của tệp đăng
ký từ 150 ps lên 160 ps và tăng gấp đôi chi phí từ 200 lên 400. (Sử dụng hỗn hợp
hướng dẫn từ Bài tập 4.8.)
4.10.1 [5] <§4.4> Speedup đạt được là gì bằng cách thêm cải tiến này?
4.10.2 [10] <§4.4> So sánh sự thay đổi trong hiệu suất với sự thay đổi trong
chi phí.
4.10.3 [10] <§4.4> Với tỷ lệ chi phí / hiệu suất bạn vừa tính , mô tả một tình
huống có ý nghĩa để thêm nhiều thanh ghi và mô tả một tình huống mà nó không
có ý nghĩa để thêm nhiều thanh ghi.

4.11 Kiểm tra độ khó của việc thêm một đề xuất lwi.d rd, rs1, rs2 (CàngLoad
With TÔIhướng dẫn ncrement) để RISC-V .
Giải thích: Reg [rd] = Mem [Reg [rs1] + Reg [rs2]]
4.11.1 [5] <§4.4> Những khối chức năng mới (nếu có) chúng ta cần cho điều
này chỉ dẫn?
4.11.2 [5] <§4.4> Những khối chức năng hiện có (nếu có) yêu cầu sửa đổi?
4.11.3 [5] <§4.4> Những đường dẫn dữ liệu mới (nếu có) chúng ta cần cho hướng
dẫn này?
4.11.4 [5] <§4.4> Những tín hiệu mới nào chúng ta cần (nếu có) từ đơn vị điều
khiển đến hỗ trợ hướng dẫn này?

4.12 Kiểm tra độ khó của việc thêm một đề xuất hoán đổi rs1, rs2 hướng dẫn
RISC-V .
Giải thích: Reg [rs2] = Reg [rs1]; Reg [rs1] = Reg [rs2]
4.19 Bài tập 373

4.12.1 [5] <§4.4> Những khối chức năng mới (nếu có) chúng ta cần cho điều
này chỉ dẫn?
4.12.2 [10] <§4.4> Những khối chức năng hiện có (nếu có) yêu cầu sửa đổi?
4.12.3 [5] <§4.4> Những đường dẫn dữ liệu mới nào chúng ta cần (nếu có) để
hỗ trợ điều này chỉ dẫn?
4.12.4 [5] <§4.4> Những tín hiệu mới nào chúng ta cần (nếu có) từ đơn vị điều
khiển đến hỗ trợ hướng dẫn này?
4.12.5 [5] <§4.4> Sửa đổi Hình 4.25 để chứng minh việc thực hiện điều này
hướng dẫn mới.

4.13 Kiểm tra độ khó của việc thêm một đề xuất ss rs1, rs2, im (Sxé Sừm)
hướng dẫn cho RISC-V .
Giải thích: Mem [Reg [rs1]] = Reg [rs2] + ngay lập tức
4.13.1 [10] <§4.4> Những khối chức năng mới (nếu có) chúng ta cần cho điều
này chỉ dẫn?
4.13.2 [10] <§4.4> Những khối chức năng hiện có (nếu có) yêu cầu sửa đổi?
4.13.3 [5] <§4.4> Những đường dẫn dữ liệu mới nào chúng ta cần (nếu có) để
hỗ trợ điều này chỉ dẫn?
4.13.4 [5] <§4.4> Những tín hiệu mới nào chúng ta cần (nếu có) từ đơn vị điều
khiển đến hỗ trợ hướng dẫn này?
4.13.5 [5] <§4.4> Sửa đổi Hình 4.25 để chứng minh việc thực hiện điều này
hướng dẫn mới.

4.14 [5] <§4.4> Đối với hướng dẫn (nếu có) là khối Imm Gen trên con đường
quan trọng?

4.15 lw là hướng dẫn có độ trễ dài nhất trên CPU từ Mục 4.4. Nếu chúng tôi sửa
đổi lw và sw để không có sự bù đắp (tức là., địa chỉ được tải từ / lưu trữ phải được
tính toán và đặt vào rs1 trước khi gọi lw / sw), sau đó không có hướng dẫn nào sẽ
sử dụng cả bộ nhớ ALU và Dữ liệu. Điều này sẽ cho phép chúng tôi giảm thời
gian chu kỳ đồng hồ. Tuy nhiên, nó cũng sẽ tăng số lượng hướng dẫn, bởi vì
nhiều lw và sw hướng dẫn sẽ cần phải được thay thế bằng lw / thêm hoặc là sw /
thêm kết hợp.
4.15.1 [5] <§4.4> Thời gian chu kỳ đồng hồ mới sẽ là gì?
374 Chương 4 Bộ xử lý

4.15.2 [10] <§4.4> Một chương trình với hỗn hợp hướng dẫn được trình bày trong
Bài tập 4.7 chạy nhanh hơn hoặc chậm hơn trên CPU mới này? Bao nhiêu? (Để đơn
giản, giả sử mọi lw và sw hướng dẫn được thay thế bằng một chuỗi hai hướng dẫn.)
4.15.3 [5] <§4.4> Yếu tố chính ảnh hưởng đến việc một chương trình là gì sẽ
chạy nhanh hơn hoặc chậm hơn trên CPU mới?
4.15.4 [5] <§4.4> Bạn có xem xét CPU gốc (như được hiển thị trong Hình 4.25)
một thiết kế tổng thể tốt hơn; hoặc bạn có coi CPU mới là một thiết kế tổng thể
tốt hơn? Tại sao?

4.16 Trong bài tập này, chúng tôi kiểm tra cách đường ống ảnh hưởng đến thời
gian chu kỳ đồng hồ của bộ xử lý. Các vấn đề trong bài tập này cho rằng các giai
đoạn riêng lẻ của datapath có độ trễ sau :
NẾ T EX THÀ WB
U Ô NH
I VIÊN
250 350 150 ps 300 200 ps
ps ps ps
Ngoài ra, giả sử rằng các hướng dẫn được thực thi bởi bộ xử lý được chia nhỏ
như sau :
ALU / Nhảy / chi Tải Cửa hàng
Logic nhánh
45% 20% 20% 15%

4.16.1 [5] <§4.6> Thời gian chu kỳ đồng hồ trong một đường ống và không
đường ống là gì bộ xử lý?
4.16.2 [10] <§4.6> Tổng độ trễ của một là gì lw hướng dẫn trong một đường
ống và bộ xử lý không đường ống?
4.16.3 [10] <§4.6> Nếu chúng ta có thể chia một giai đoạn của datapath đường
ống thành hai các giai đoạn mới, mỗi giai đoạn có một nửa độ trễ của giai đoạn
ban đầu, giai đoạn nào bạn sẽ phân chia và thời gian chu kỳ đồng hồ mới của bộ
xử lý là gì?
4.16.4 [10] <§4.6> Giả sử không có quầy hàng hoặc mối nguy hiểm, việc sử
dụng là gì của bộ nhớ dữ liệu?
4.16.5 [10] <§4.6> Giả sử không có quầy hàng hoặc mối nguy hiểm, việc sử
dụng là gì của cổng đăng ký viết của đơn vị Đăng ký Đăng ký?

4.17 [10] <§4.6> Số lượng chu kỳ tối thiểu cần thiết để hoàn toàn là bao nhiêu
thi hành n hướng dẫn về CPU với a k đường ống giai đoạn? Biện minh cho công
thức của bạn.
4.18 [5] <§4.6> Giả sử rằng x11 được khởi tạo thành 11 và x12 được khởi tạo
thành 22. Giả sử bạn đã thực thi mã dưới đây trên một phiên bản của đường ống
từ đó Mục
4.19 Bài tập 375

4.6 điều đó không xử lý các mối nguy dữ liệu (tức là., lập trình viên chịu trách
nhiệm giải quyết các mối nguy dữ liệu bằng cách chèn NOP hướng dẫn khi cần
thiết). Những giá trị cuối cùng của thanh ghi sẽ là gì x13 và x14 được?
addi x11, x12, 5
thêm x13, x11, x12
addi x14, x11, 15

4.19 [10] <§4.6> Giả sử rằng x11 được khởi tạo thành 11 và x12 được khởi tạo để
22. Giả sử bạn đã thực thi mã dưới đây trên một phiên bản của đường ống từ đó
Mục 4.6 điều đó không xử lý các mối nguy dữ liệu (tức là., lập trình viên chịu
trách nhiệm giải quyết các mối nguy dữ liệu bằng cách chèn các hướng dẫn NOP
khi cần thiết). Những giá trị cuối cùng của đăng ký sẽ là gì x15 được? Giả sử tệp
đăng ký được viết vào đầu chu kỳ và đọc vào cuối chu kỳ. Do đó, giai đoạn ID sẽ
trả về kết quả của trạng thái WB xảy ra trong cùng một chu kỳ. Xem Mục 4.8 và
Hình 4.68 để biết chi tiết.
addi x11, x12, 5
thêm x13, x11, x12
addi x14, x11 , 15
thêm x15, x11 , x11

4.20 [5] <§4.5> Thêm vào NOP hướng dẫn mã dưới đây để nó sẽ chạy chính
xác trên một đường ống không xử lý các mối nguy dữ liệu.
addi x11, x12, 5
thêm x13, x11, x12
addi x14, x11 , 15
thêm x15, x13 , x12

4.21 Hãy xem xét một phiên bản của đường ống từ Mục 4.6 điều đó không xử
lý mối nguy dữ liệu (tức là., lập trình viên chịu trách nhiệm giải quyết các mối
nguy dữ liệu bằng cách chèn NOP hướng dẫn khi cần thiết). Giả sử rằng (sau khi
tối ưu hóa) một điển hình nchương trình -inocate yêu cầu bổ sung 4 * n NOP
hướng dẫn xử lý chính xác các mối nguy dữ liệu.
4.21.1 [5] <§4.6> Giả sử rằng thời gian chu kỳ của đường ống này mà không cần
chuyển tiếp là 250 ps. Giả sử rằng việc thêm phần cứng chuyển tiếp sẽ làm giảm số
lượng NOPtừ .4 * n đến 0,05 * n, nhưng tăng thời gian chu kỳ lên 300 ps. Tốc độ của
đường ống mới này so với đường ống không chuyển tiếp là gì?
376 Chương 4 Bộ xử lý

4.21.2 [10] <§4.6> Các chương trình khác nhau sẽ yêu cầu số lượng khác nhau
NOPS. Bao nhiêu NOPs (tính theo phần trăm của hướng dẫn mã) có thể vẫn còn
trong chương trình điển hình trước khi chương trình đó chạy chậm hơn trên
đường ống với chuyển tiếp?
4.21.3 [10] <§4.6> Lặp lại 4.21.2; Tuy nhiên, lần này hãy để x đại diện cho số
của NOP hướng dẫn liên quan đến n (Trong 4.21.2 ,. x bằng nhau .4.) Câu trả lời
của bạn sẽ liên quan đến x.
4.21.4 [10] <§4.6> Có thể một chương trình chỉ với 0,075 * n NOP có thể chạy
nhanh hơn trên đường ống với chuyển tiếp? Giải thích tại sao hoặc tại sao không.
4.21.5 [10] <§4.6> Tối thiểu, bao nhiêu NOPs (tính theo phần trăm của mã
hướng dẫn) phải có chương trình trước khi nó có thể chạy nhanh hơn trên đường
ống với chuyển tiếp?

4.22 [5] <§4.6> Hãy xem xét các mảnh của lắp ráp RISC-V dưới đây :

sw x29, 12 (x16)
lw x29, 8 (x16)
phụ x17, x15, x14
beqz x17, nhãn
thêm x15, x11, x14
phụ x15, x30, x14

Giả sử chúng tôi sửa đổi đường ống để nó chỉ có một bộ nhớ (xử lý cả hướng dẫn
và dữ liệu). Trong trường hợp này, sẽ có một mối nguy hiểm về cấu trúc mỗi khi
chương trình cần tìm nạp một hướng dẫn trong cùng một chu kỳ trong đó một
hướng dẫn khác truy cập dữ liệu.
4.22.1 [5] <§4.6> Vẽ một sơ đồ đường ống để hiển thị là mã trên sẽ gian hàng.
4.22.2 [5] <§4.6> Nói chung, có thể giảm số lượng quầy hàng /NOPS kết quả
từ mối nguy cấu trúc này bằng cách sắp xếp lại mã?
4.22.3 [5] <§4.6> Phải xử lý nguy cơ cấu trúc này trong phần cứng? Chúng tôi có
thấy rằng các mối nguy dữ liệu có thể được loại bỏ bằng cách thêm NOPs đến mã.
Bạn có thể làm tương tự với nguy cơ cấu trúc này? Nếu vậy, giải thích làm thế nào.
Nếu không, giải thích tại sao không.
4.22.4 [5] <§4.6> Khoảng bao nhiêu quầy hàng bạn sẽ mong đợi điều này
nguy cơ cấu trúc để tạo ra trong một chương trình điển hình? (Sử dụng hỗn hợp
hướng dẫn từ Bài tập 4.8.)

4.23 Nếu chúng tôi thay đổi hướng dẫn tải / lưu trữ để sử dụng thanh ghi (không có
bù) như địa chỉ, những hướng dẫn này không còn cần sử dụng ALU. (Xem Bài tập
4.15.)
4.19 Bài tập 377

Do đó, các giai đoạn MEM và EX có thể được chồng chéo và đường ống chỉ có
bốn giai đoạn.
4.23.1 [10] <§4.6> Việc giảm độ sâu đường ống sẽ ảnh hưởng đến chu kỳ như
thế nào thời gian?
4.23.2 [5] <§4.6> Làm thế nào thay đổi này có thể cải thiện hiệu suất của
đường ống?
4.23.3 [5] <§4.6> Làm thế nào điều này có thể thay đổi làm giảm hiệu suất của
đường ống?
4.24 [10] <§4.8> Mà trong hai sơ đồ đường ống dưới đây mô tả tốt hơn hoạt
động của đơn vị phát hiện nguy hiểm đường ống? Tại sao?
Lựa chọn 1 :

lw x11, 0 (x12) : NẾU ID EX ME WB


thêm x13, x11, x14 : NẾU ID EX..ME WB
hoặc x15, x16, x17: IF ID..EX ME WB

Lựa chọn 2 :

lw x11, 0 (x12): NẾU ID EX ME WB


thêm x13, x11, x14: IF ID..EX ME WB
hoặc x15, x16, x17: IF..ID EX ME WB

4.25 Hãy xem xét vòng lặp sau.

LOOP: lw x10, 0 (x13)


lw x11 , 8 (x13)
thêm x12 , x10, x11
addi x13, x13, 16
bnez x12, LOOP

Giả sử rằng dự đoán nhánh hoàn hảo được sử dụng (không có quầy hàng do các
mối nguy kiểm soát), rằng không có khe trễ, đường ống có hỗ trợ chuyển tiếp
đầy đủ và các nhánh được giải quyết trong giai đoạn EX (trái ngược với ID).
4.25.1 [10] <§4.8> Hiển thị sơ đồ thực hiện đường ống cho hai lần lặp đầu tiên
của vòng lặp này.
4.25.2 [10] <§4.8> Đánh dấu các giai đoạn đường ống không thực hiện công
việc hữu ích. Làm sao thường trong khi đường ống đầy, chúng ta có một chu kỳ
trong đó cả năm giai đoạn đường ống đang làm công việc hữu ích? (Bắt đầu với
chu kỳ trong đó addi đang ở giai đoạn IF. Kết thúc với chu kỳ trong đó bnez đang
ở giai đoạn IF.)
378 Chương 4 Bộ xử lý

4.26 Bài tập này nhằm giúp bạn hiểu chi phí / độ phức tạp / hiệu suất đánh đổi
chuyển tiếp trong một bộ xử lý đường ống. Các vấn đề trong bài tập này đề cập
đến các datapaths đường ống từ Hình 4,70Các vấn đề này giả định rằng, trong tất
cả các hướng dẫn được thực thi trong bộ xử lý, phần sau của các hướng dẫn này
có một loại phụ thuộc dữ liệu RAW cụ thể. Loại phụ thuộc dữ liệu RAW được
xác định bởi giai đoạn tạo ra kết quả (EX hoặc MEM) và hướng dẫn tiếp theo tiêu
thụ kết quả (hướng dẫn thứ nhất tuân theo kết quả tạo ra kết quả, hướng dẫn thứ 2
theo sau hoặc cả hai). Chúng tôi giả định rằng việc ghi sổ đăng ký được thực hiện
trong nửa đầu của chu kỳ đồng hồ và việc đọc đăng ký được thực hiện trong nửa
sau của chu kỳ, do đó, các khoản phụ thuộc của EX EX đến 3 và MEM đến 3
không được tính vì chúng không thể dẫn đến trong các mối nguy dữ liệu. Chúng
tôi cũng cho rằng các nhánh được giải quyết trong giai đoạn EX (trái ngược với
giai đoạn ID) và CPI của bộ xử lý là 1 nếu không có mối nguy dữ liệu.

EX MEM đến EX đến MEM đến EX đến 1st và


đến 1st 2thứ hai 2thứ hai EX
1st Chỉ Chỉ Chỉ Chỉ đến thứ 2
5% 20% 5% 10% 10%

Giả sử các độ trễ sau cho các giai đoạn đường ống riêng lẻ. Đối với giai đoạn
EX, độ trễ được cung cấp riêng cho bộ xử lý mà không cần chuyển tiếp và cho
bộ xử lý với các loại chuyển tiếp khác nhau.

EX (FW EX (FW
EX EX (đầy
N T (không đủ từ EX / từ MEM / THÀ WB
Ế Ô FW) FW) Chỉ có MEM) Chỉ WB) NH
U
I VIÊN
120 100 110 ps 130 120 ps 120 120 ps 100 ps
ps ps ps ps

4.26.1 [5] <§4.8> Đối với mỗi phụ thuộc RAW được liệt kê ở trên, hãy đưa ra
một chuỗi tại ít nhất ba tuyên bố lắp ráp thể hiện sự phụ thuộc đó.
4.26.2 [5] <§4.8> Đối với mỗi phụ thuộc RAW ở trên, có bao nhiêu NOPs sẽ
cần được chèn để cho phép mã của bạn từ 4.26.1 chạy chính xác trên đường ống
mà không bị chuyển tiếp hoặc phát hiện nguy hiểm? Hiển thị nơi NOPs có thể
được chèn.
4.26.3 [10] <§4.8> Phân tích từng hướng dẫn một cách độc lập sẽ đếm quá mức số
lượng NOPs cần thiết để chạy một chương trình trên một đường ống không có chuyển
tiếp hoặc phát hiện nguy hiểm. Viết một chuỗi gồm ba hướng dẫn lắp ráp để khi bạn
xem xét từng hướng dẫn trong chuỗi một cách độc lập, tổng số các quầy hàng lớn
hơn số lượng quầy hàng mà trình tự thực sự cần để tránh các mối nguy dữ liệu.
4.26.4 [5] <§4.8> Giả sử không có mối nguy hiểm nào khác, CPI cho chương
trình là gì được mô tả bởi bảng trên khi chạy trên một đường ống không có
chuyển tiếp? Bao nhiêu phần trăm của chu kỳ là quầy hàng? (Để đơn giản, giả
định rằng tất cả các trường hợp cần thiết được liệt kê ở trên và có thể được điều
trị độc lập.)
4.26.5 [5] <§4.8> CPI là gì nếu chúng ta sử dụng chuyển tiếp đầy đủ (chuyển
tiếp tất cả các kết quả có thể được chuyển tiếp)? Bao nhiêu phần trăm của chu kỳ
là quầy hàng?
4.19 Bài tập 379

4.26.6 [10] <§4.8> Hãy để chúng tôi giả định rằng chúng tôi không thể đủ khả
năng để có ba đầu vào bộ ghép kênh cần thiết để chuyển tiếp đầy đủ. Chúng tôi
phải quyết định xem tốt hơn là chỉ chuyển tiếp từ thanh ghi đường ống EX /
MEM (chuyển tiếp chu kỳ tiếp theo) hoặc chỉ từ thanh ghi đường ống MEM /
WB (chuyển tiếp hai chu kỳ). CPI cho mỗi tùy chọn là gì?
4.26.7 [5] <§4.8> Đối với các xác suất nguy hiểm nhất định và độ trễ giai đoạn
đường ống , tốc độ đạt được của từng loại chuyển tiếp (EX / MEM, MEM / WB,
là gì) so với một đường ống không có chuyển tiếp?
4.26.8 [5] <§4.8> Điều gì sẽ là tăng tốc bổ sung (liên quan đến nhanh nhất bộ
xử lý từ 4.26.7) là nếu chúng tôi thêm chuyển tiếp du hành thời gian của Google
để loại bỏ tất cả các mối nguy dữ liệu? Giả sử rằng mạch du hành thời gian chưa
được phát minh sẽ thêm 100 ps vào độ trễ của giai đoạn EX chuyển tiếp đầy đủ.
4.26.9 [5] <§4.8> Bảng các loại nguy hiểm có các mục riêng biệt cho EX EX đến
1stGiáo dục và EX EX đến 1st và EX đến 2thứ haiGiáo dục. Tại sao không có mục nhập
cho MEM MEM đến 1st và MEM đến 2thứ haiGiáo dục?

4.27 Các vấn đề trong bài tập này đề cập đến trình tự hướng dẫn sau đây, và
giả sử rằng nó được thực thi trên một datapath năm giai đoạn :
thêm x15, x12 , x11
lw x13, 8 (x15)
lw x12, 0 (x2)
hoặc
là x13, x15 , x13
sw x13, 0 (x15)

4.27.1 [5] <§4.8> Nếu không có chuyển tiếp hoặc phát hiện nguy hiểm, chèn
NOPs đến đảm bảo thực hiện đúng.
4.27.2 [10] <§4.8> Bây giờ, thay đổi và / hoặc sắp xếp lại mã để giảm thiểu số
lượng NOPs cần thiết. Bạn có thể giả định đăng ký x17 có thể được sử dụng để
giữ các giá trị tạm thời trong mã sửa đổi của bạn.
4.27.3 [10] <§4.8> Nếu bộ xử lý có chuyển tiếp, nhưng chúng tôi quên thực
hiện đơn vị phát hiện nguy hiểm, những gì xảy ra khi mã ban đầu thực thi?
4.27.4 [20] <§4.8> Nếu có chuyển tiếp, trong bảy chu kỳ đầu tiên trong thực
thi mã này, chỉ định tín hiệu nào được xác nhận trong mỗi chu kỳ bởi các đơn vị
phát hiện và chuyển tiếp nguy hiểm Hình 4.76.
4.27.5 [10] <§4.8> Nếu không có chuyển tiếp, những tín hiệu đầu vào và đầu
ra mới chúng ta có cần cho đơn vị phát hiện nguy hiểm trong Hình 4.76? Sử
dụng chuỗi hướng dẫn này làm ví dụ, giải thích tại sao mỗi tín hiệu là cần thiết.
380 Chương 4 Bộ xử lý

4.27.6 [20] <§4.8> Đối với đơn vị phát hiện nguy hiểm mới từ 4.26.5, chỉ định
đơn vị nào tín hiệu đầu ra mà nó khẳng định trong mỗi năm chu kỳ đầu tiên trong
quá trình thực thi mã này.

4,28 Tầm quan trọng của việc có một công cụ dự đoán chi nhánh tốt phụ thuộc
vào tần suất các nhánh có điều kiện được thực hiện. Cùng với độ chính xác của
bộ dự báo nhánh, điều này sẽ xác định thời gian bị đình trệ do các nhánh bị đánh
giá sai. Trong bài tập này, giả định rằng việc phân tích các hướng dẫn động thành
các loại hướng dẫn khác nhau như sau :

Loại R beqz / bnez jal lw sw


40% 25% 5% 25% 5%

Ngoài ra, giả sử độ chính xác dự đoán nhánh sau :

Luôn luôn thực hiện Luôn luôn-Không-Lấy 2-bit


45% 55% 85%

4.28.1 [10] <§4.9> Chu kỳ bị đình chỉ do các chi nhánh bị đánh giá sai làm tăng
CPI . CPI thêm là gì do các nhánh bị đánh giá sai với bộ dự đoán luôn được thực hiện?
Giả sử rằng các kết quả của nhánh được xác định trong giai đoạn ID và được áp dụng
trong giai đoạn EX rằng không có mối nguy dữ liệu nào và không có khe trễ nào
được sử dụng.
4.28.2 [10] <§4.9> Lặp lại 4.28.1 cho bộ dự đoán luôn luôn không được thực
hiện.
4.28.3 [10] <§4.9> Lặp lại 4.28.1 cho bộ dự đoán 2 bit.
4.28.4 [10] <§4.9> Với bộ dự đoán 2 bit, tốc độ sẽ đạt được nếu chúng tôi có
thể chuyển đổi một nửa hướng dẫn chi nhánh sang một số hướng dẫn ALU? Giả
sử rằng các hướng dẫn dự đoán chính xác và không chính xác có cùng cơ hội
được thay thế.
4.28.5 [10] <§4.9> Với bộ dự đoán 2 bit, tốc độ sẽ đạt được nếu chúng tôi có
thể chuyển đổi một nửa các hướng dẫn nhánh theo cách thay thế từng hướng dẫn
nhánh bằng hai hướng dẫn ALU? Giả sử rằng các hướng dẫn dự đoán chính xác
và không chính xác có cùng cơ hội được thay thế.
4.28.6 [10] <§4.9> Một số hướng dẫn chi nhánh dễ dự đoán hơn nhiều khác.
Nếu chúng ta biết rằng 80% của tất cả các hướng dẫn nhánh được thực hiện là
các nhánh lặp lại dễ dự đoán luôn được dự đoán chính xác, độ chính xác của bộ
dự đoán 2 bit trên 20% còn lại của hướng dẫn nhánh là bao nhiêu?
4,29 Bài tập này kiểm tra tính chính xác của các yếu tố dự báo chi nhánh khác
nhau cho theo mẫu lặp lại (ví dụ:., trong một vòng lặp) của kết quả chi nhánh : T,
NT, T, T, NT.
4.19 Bài tập 381

4.29.1 [5] <§4.9> Độ chính xác của luôn luôn được thực hiện và luôn luôn
không được thực hiện là gì dự đoán cho chuỗi kết quả chi nhánh này?
4.29.2 [5] <§4.9> Độ chính xác của bộ dự đoán 2 bit cho bốn đầu tiên là gì các
nhánh trong mẫu này, giả sử rằng bộ dự đoán bắt đầu ở trạng thái dưới cùng bên
trái từ Hình 4.78 (dự đoán không được thực hiện)?
4.29.3 [10] <§4.9> Độ chính xác của bộ dự đoán 2 bit là gì nếu mẫu này là lặp
đi lặp lại mãi mãi?
4.29.4 [30] <§4.9> Thiết kế một bộ dự đoán sẽ đạt được độ chính xác hoàn hảo
nếu mô hình này được lặp đi lặp lại mãi mãi. Bộ dự báo của bạn phải là một
mạch tuần tự với một đầu ra cung cấp dự đoán (1 cho đã lấy, 0 cho không được
thực hiện) và không có đầu vào nào ngoài đồng hồ và tín hiệu điều khiển chỉ ra
rằng lệnh là một nhánh có điều kiện.
4.29.5 [10] <§4.9> Độ chính xác của bộ dự đoán của bạn từ 4.29.4 là bao
nhiêu đưa ra một mô hình lặp lại hoàn toàn ngược lại với mô hình này?
4.29.6 [20] <§4.9> Lặp lại 4.29.4, nhưng bây giờ người dự đoán của bạn sẽ có
thể cuối cùng (sau một giai đoạn khởi động trong đó nó có thể đưa ra dự đoán sai)
bắt đầu dự đoán hoàn hảo cả mô hình này và ngược lại. Dự đoán của bạn nên có
một đầu vào cho nó biết kết quả thực sự là gì. Gợi ý: đầu vào này cho phép người
dự đoán của bạn xác định mẫu nào trong hai mẫu lặp lại được đưa ra.

4.30 Bài tập này khám phá cách xử lý ngoại lệ ảnh hưởng đến thiết kế đường
ống. Các ba vấn đề đầu tiên trong bài tập này đề cập đến hai hướng dẫn sau :

Hướng dẫn 1 Hướng dẫn 2


beqz x11, LABEL lw x11, 0 (x12)

4.30.1 [5] <§4.10> Những ngoại lệ nào có thể kích hoạt từng hướng dẫn này?
Cho mỗi trường hợp ngoại lệ này, chỉ định giai đoạn đường ống mà nó được phát
hiện.
4.30.2 [10] <§4.10> Nếu có một địa chỉ xử lý riêng cho từng ngoại lệ , cho
thấy cách tổ chức đường ống phải được thay đổi để có thể xử lý ngoại lệ này.
Bạn có thể giả định rằng địa chỉ của những trình xử lý này được biết khi bộ xử lý
được thiết kế.
4.30.3 [10] <§4.10> Nếu hướng dẫn thứ hai được lấy ngay sau hướng dẫn đầu
tiên, mô tả những gì xảy ra trong đường ống khi hướng dẫn đầu tiên gây ra ngoại
lệ đầu tiên bạn liệt kê trong Bài tập 4.30.1. Hiển thị sơ đồ thực hiện đường ống từ
thời điểm lệnh đầu tiên được tìm nạp cho đến khi hướng dẫn đầu tiên của trình xử
lý ngoại lệ được hoàn thành.
4.30.4 [20] <§4.10> Trong xử lý ngoại lệ vectơ, bảng ngoại lệ địa chỉ xử lý
nằm trong bộ nhớ dữ liệu tại một địa chỉ đã biết (đã sửa). Thay đổi
382 Chương 4 Bộ xử lý

đường ống để thực hiện cơ chế xử lý ngoại lệ này. Lặp lại Bài tập 4.30.3 bằng
cách sử dụng đường ống đã được sửa đổi này và xử lý ngoại lệ được kiểm tra.
4.30.5 [15] <§4.10> Chúng tôi muốn mô phỏng xử lý ngoại lệ được kiểm tra
(mô tả trong Bài tập 4.30.4) trên một máy chỉ có một địa chỉ xử lý cố định. Viết
mã nên ở địa chỉ cố định đó. Gợi ý: mã này sẽ xác định ngoại lệ, lấy đúng địa chỉ
từ bảng vector ngoại lệ và chuyển thực thi sang trình xử lý đó.

4.31 Trong bài tập này, chúng tôi so sánh hiệu suất của 1 vấn đề và 2 vấn đề bộ
xử lý, có tính đến các biến đổi chương trình có thể được thực hiện để tối ưu hóa
cho việc thực hiện 2 vấn đề. Các vấn đề trong bài tập này đề cập đến vòng lặp
sau (được viết bằng C) :
cho (i = 0; i!= j; i + = 2)
b [i] = a [i] Mạnha [i + 1];

Trình biên dịch thực hiện ít hoặc không tối ưu hóa có thể tạo ra mã lắp ráp
RISC-V sau :
addi x12, x0, 0
jal ENT
HÀNG ĐẦU:
slli x5, x12, 3
thêm x6, x10, x5
lw x7, 0 (x6)
lw x29, 8 (x6)
phụ x30, x7, x29
thêm x31, x11, x5
sw x30, 0 (x31)
addi x12, x12, 2
x12, x13, HÀNG
ENT: bne ĐẦU
Mã trên sử dụng các thanh ghi sau :

Tạm thời
Tôi j a b giá trị
x12 x13 x10 x11 x5, x7, x29, x31

Giả sử bộ xử lý hai vấn đề, theo lịch tĩnh cho bài tập này có các thuộc tính
sau :
1. Một hướng dẫn phải là một hoạt động bộ nhớ; cái khác phải là một hướng
dẫn số học / logic hoặc một nhánh.
2. Bộ xử lý có tất cả các đường dẫn chuyển tiếp có thể giữa các giai đoạn
(bao gồm đường dẫn đến giai đoạn ID để giải quyết chi nhánh).
3. Bộ xử lý có dự đoán chi nhánh hoàn hảo.
4. Hai lệnh có thể không phát hành cùng nhau trong một gói nếu một tùy
thuộc vào khác. (Xem trang 342.)
4.19 Bài tập 383

5. Nếu một gian hàng là cần thiết, cả hai hướng dẫn trong gói vấn đề phải bị
đình trệ. (Xem trang 342.)
Khi bạn hoàn thành các bài tập này, hãy chú ý bao nhiêu nỗ lực để tạo mã sẽ
tạo ra tốc độ gần tối ưu.
4.31.1 [30] <§4.11> Vẽ sơ đồ đường ống cho biết mã RISC-V được cung cấp
như thế nào ở trên thực hiện trên bộ xử lý hai vấn đề. Giả sử rằng vòng lặp thoát
ra sau hai lần lặp.
4.31.2 [10] <§4.11> Việc tăng tốc từ một vấn đề sang bộ xử lý hai vấn đề là gì?
(Giả sử vòng lặp chạy hàng ngàn lần lặp.)
4.31.3 [10] <§4.11> Sắp xếp lại / viết lại mã RISC-V được đưa ra ở trên để đạt
được hiệu suất tốt hơn trên bộ xử lý một vấn đề. Gợi ý: Sử dụng hướng dẫnbeqz
x13, DONGĐể bỏ qua vòng lặp hoàn toàn nếu j = 0.
4.31.4 [20] <§4.11> Sắp xếp lại / viết lại mã RISC-V được đưa ra ở trên để đạt
được hiệu suất tốt hơn trên bộ xử lý hai vấn đề. (Tuy nhiên, không bỏ qua vòng lặp.)
4.31.5 [30] <§4.11> Lặp lại bài tập 4.31.1, nhưng lần này sử dụng tối ưu hóa
của bạn mã từ Bài tập 4.31.4.
4.31.6 [10] <§4.11> Tốc độ của việc đi từ bộ xử lý một vấn đề đến bộ xử lý
hai vấn đề khi chạy mã được tối ưu hóa từ Bài tập 4.31.3 và 4.31.4.
4.31.7 [10] <§4.11> Bỏ mã RISC-V khỏi Bài tập 4.31.3 sao cho mỗi mã lặp
của vòng lặp không được kiểm soát xử lý hai lần lặp của vòng lặp gốc. Sau đó,
sắp xếp lại / viết lại mã chưa kiểm soát của bạn để đạt được hiệu suất tốt hơn trên
bộ xử lý một vấn đề. Bạn có thể cho rằng j là bội số của 4.
4.31.8 [20] <§4.11> Bỏ mã RISC-V khỏi Bài tập 4.31.4 để mỗi mã lặp của
vòng lặp không được kiểm soát xử lý hai lần lặp của vòng lặp gốc. Sau đó, sắp
xếp lại / viết lại mã chưa kiểm soát của bạn để đạt được hiệu suất tốt hơn trên bộ
xử lý hai vấn đề. Bạn có thể cho rằng j là bội số của 4. (Gợi ý: Sắp xếp lại vòng
lặp để một số phép tính xuất hiện cả bên ngoài vòng lặp và ở cuối vòng lặp. Bạn
có thể cho rằng các giá trị trong các thanh ghi tạm thời là không cần thiết sau
vòng lặp.)
4.31.9 [10] <§4.11> Tốc độ của việc đi từ bộ xử lý một vấn đề đến bộ xử lý
hai vấn đề khi chạy mã chưa được kiểm soát, tối ưu hóa từ Bài tập 4.31.7 và
4.31.8?
4.31.10 [30] <§4.11> Lặp lại các bài tập 4.31.8 và 4.31.9, nhưng lần này giả sử
bộ xử lý hai vấn đề có thể chạy hai hướng dẫn số học / logic với nhau. (Nói cách
khác, lệnh đầu tiên trong gói có thể là bất kỳ loại lệnh nào, nhưng lệnh thứ hai
phải là lệnh số học hoặc logic. Hai thao tác bộ nhớ không thể được lên lịch cùng
một lúc.)
384 Chương 4 Bộ xử lý

4.32 Bài tập này khám phá hiệu quả năng lượng và mối quan hệ của nó với hiệu
suất. Các vấn đề trong bài tập này giả định mức tiêu thụ năng lượng sau đây cho
hoạt động trong Bộ nhớ hướng dẫn, Đăng ký và Bộ nhớ dữ liệu. Bạn có thể giả
định rằng các thành phần khác của datapath tiêu thụ một lượng năng lượng không
đáng kể. (Đăng ký của Nhật Bản Đọc và Đăng ký Viết Viết chỉ tham khảo tệp
đăng ký.)
Tôi- 1 Đăng ký Đọc Đăng ký Viết D-Mem Đọc D-Mem Viết
Mem
140pJ 70pJ 60pJ 140pJ 120pJ

Giả sử rằng các thành phần trong datapath có độ trễ sau. Bạn có thể giả định
rằng các thành phần khác của datapath có độ trễ không đáng kể.
Tôi- Điều Đăng ký Đọc hoặc Viết ALU D-Mem Đọc hoặc Viết
Mem khiển
200 150 ps 90 90 ps 250 ps
ps ps

4.32.1 [5] <§ §4.3, 4.7, 4.15> Bao nhiêu năng lượng được sử dụng để thực
hiện một thêm hướng dẫn trong thiết kế một chu kỳ và trong thiết kế đường ống
năm giai đoạn?
4.32.2 [10] <§ §4.7, 4.15> Hướng dẫn RISC-V trong trường hợp xấu nhất về
mặt nào tiêu thụ năng lượng? Năng lượng dành để thực hiện nó là gì?
4.32.3 [10] <§ §4.7, 4.15> Nếu giảm năng lượng là tối quan trọng, làm thế nào
bạn sẽ thay đổi thiết kế đường ống? Việc giảm phần trăm năng lượng chi tiêu của
một lw hướng dẫn sau sự thay đổi này?
4.32.4 [10] <§ §4.7, 4.15> Những hướng dẫn khác có thể có khả năng được
hưởng lợi từ sự thay đổi được thảo luận trong Bài tập 4.32.3?
4.32.5 [10] <§ §4.7, 4.15> Làm thế nào để thay đổi của bạn từ Bài tập 4.32.3
ảnh hưởng đến hiệu suất của một CPU đường ống?
4.32.6 [10] <§ §4.7, 4.15> Chúng ta có thể loại bỏ Ghi nhớ tín hiệu điều khiển
và có bộ nhớ dữ liệu được đọc trong mỗi chu kỳ, tức là., chúng ta có thể có vĩnh
viễn MemRead = 1Giải thích tại sao bộ xử lý vẫn hoạt động chính xác sau thay đổi
này. Nếu 25% hướng dẫn là tải, ảnh hưởng của thay đổi này đến tần số đồng hồ
và mức tiêu thụ năng lượng là bao nhiêu.

4.33 Khi chip silicon được chế tạo, các khuyết tật về vật liệu (ví dụ:., silicon) và
lỗi sản xuất có thể dẫn đến các mạch bị lỗi. Một khiếm khuyết rất phổ biến là một
dây ảnh hưởng đến tín hiệu ở dây khác. Đây được gọi là lỗi nói chuyện chéo. Một
loại lỗi nói chuyện chéo đặc biệt là khi tín hiệu được kết nối với dây có giá trị
logic không đổi (ví dụ:., một dây cung cấp điện). Các lỗi này, trong đó tín hiệu bị
ảnh hưởng luôn có giá trị logic là 0 hoặc 1 được gọi là lỗi bị kẹt ở mức 0 hoặc lỗi
bị kẹt ở mức 1. Các vấn đề sau liên quan đến bit 0 của đầu vào Đăng ký ghi trên
tệp đăng ký Hình 4.25.
4.33.1 [10] <§ §4.3, 4.4> Chúng ta hãy giả sử rằng thử nghiệm bộ xử lý được
thực hiện bởi (1)
điền vào PC, sổ đăng ký và bộ nhớ dữ liệu và hướng dẫn với một số giá trị (bạn
4.19 Bài tập 385

6. Phần cứng. 7. Cả
có thể chọn giá trị nào), (2) để một lệnh duy nhất thực thi, sau đó (3) đọc PC, bộ nhớ hai. số 8. Phần cứng.
và thanh ghi. Các giá trị này sau đó được kiểm tra để xác định xem có lỗi cụ thể nào 9. Cả hai.
không. Bạn có thể thiết kế một thử nghiệm (giá trị cho PC, bộ nhớ và thanh ghi) để §4.13, trang 365: Hai
xác định xem có lỗi bị kẹt ở mức 0 trên tín hiệu này hay không? cái đầu tiên là sai và
4.33.2 [10] <§ §4.3, 4.4> Lặp lại Bài tập 4.33.1 cho lỗi bị kẹt ở 1. Bạn có thể hai cái cuối cùng là
đúng.
sử dụng một thử nghiệm duy nhất cho cả bị mắc kẹt ở mức 0 và bị kẹt ở mức 1?
Nếu có, giải thích làm thế nào; nếu không, giải thích tại sao không.
4.33.3 [10] <§ §4.3, 4.4> Nếu chúng ta biết rằng bộ xử lý có lỗi bị kẹt ở 1 tín hiệu
này, là bộ xử lý vẫn có thể sử dụng? Để có thể sử dụng được, chúng tôi phải có khả
năng chuyển đổi bất kỳ chương trình nào thực thi trên bộ xử lý RISC-V thông thường
thành chương trình hoạt động trên bộ xử lý này. Bạn có thể giả định rằng có đủ bộ
nhớ lệnh và bộ nhớ dữ liệu miễn phí để cho phép bạn làm cho chương trình dài hơn
và lưu trữ dữ liệu bổ sung.
4.33.4 [10] <§ §4.3, 4.4> Lặp lại bài tập 4.33.1; nhưng bây giờ lỗi để kiểm tra
là cho dù Ghi nhớ tín hiệu điều khiển trở thành 0 nếu chi nhánh tín hiệu điều khiển
là 0, không có lỗi khác.
4.33.5 [10] <§ §4.3, 4.4> Lặp lại bài tập 4.33.1; nhưng bây giờ lỗi để kiểm tra
là liệu Ghi nhớ tín hiệu điều khiển trở thành 1 nếu RegRd tín hiệu điều khiển là 1,
không có lỗi khác. Gợi ý: Vấn đề này đòi hỏi kiến thức về hệ điều hành. Xem xét
những gì gây ra lỗi phân khúc.

§4.1, trang 258: 3 trên 5: Kiểm soát, Datapath, Ký ức. Đầu vào và đầu ra bị thiếu.
§4.2, trang 261: sai. Các yếu tố trạng thái kích hoạt cạnh làm cho đọc đồng thời và
viết cả có thể và không mơ hồ.
§4.3, trang 268: I. a. II. c.
§4.4, trang 285: Có, Chi nhánh và ALUOp0 giống hệt nhau. Ngoài ra, bạn có thể sử
dụng tính linh hoạt của các bit chăm sóc don don để kết hợp các tín hiệu khác với
nhau. ALUSrc và MemtoReg có thể được tạo giống nhau bằng cách đặt hai bit chăm
sóc don don của MemtoReg thành 1 và 0. ALUOp1 và MemtoReg có thể được tạo
thành đảo ngược của nhau bằng cách đặt bit chăm sóc don don của MemtoReg thành
1. Bạn không cần một biến tần; chỉ cần sử dụng tín hiệu khác và lật thứ tự của các
đầu vào vào bộ ghép kênh MemtoReg!
§4.5, Có thể: Nếu tín hiệu PCSource luôn được đặt thành 0 khi đó là dịch vụ
chăm sóc don don (là hầu hết các trạng thái), thì nó giống hệt với PCWriteCond.
§4.6, trang 295: 1. Gian hàng do nguy cơ dữ liệu sử dụng tải của lw kết quả. 2.
Tránh bị đình trệ trong hướng dẫn thứ ba về nguy cơ dữ liệu đọc sau khi ghi x11
bằng cách chuyển tiếp thêm kết quả. 3. Nó không cần phải bị đình trệ, thậm chí
không chuyển tiếp. §4.7, trang 309: Tuyên bố 2 và 4 là chính xác; phần còn lại
không chính xác.
§4.9, trang 332: 1. Dự đoán không được thực hiện. 2. Dự đoán. 3. Dự đoán động.
§4.10, trang 339: Hướng dẫn đầu tiên, vì nó được thực thi một cách hợp lý trước các
hướng dẫn khác.
§4.11, trang 353: 1. Cả hai. 2. Cả hai. 3. Phần mềm. 4. Phần cứng. 5. Phần cứng.
Câu trả lời để kiểm tra chính mình
5
Lý tưởng nhất là người ta
mong muốn có một dung
Lớn và nhanh:
lượng bộ nhớ lớn vô thời hạn
như bất kỳ đặc biệt nào ... từ
Khai thác phân
sẽ có sẵn ngay lập tức. ...
Chúng tôi là ... buộc phải
cấp bộ nhớ
nhận ra khả năng xây dựng 5.1 Giới thiệu 388
một hệ thống phân cấp các ký 5.2 Công nghệ bộ nhớ 392
ức, mỗi ký ức có công suất lớn 5.3 Những điều cơ bản của bộ nhớ cache 398

hơn trước nhưng ít truy cập 5.4 Đo lường và cải thiện bộ nhớ cache
Hiệu suất 412
nhanh hơn.
5.5 Phân cấp bộ nhớ đáng tin cậy 431
A. W. Burks, H. H. Goldstine và
5.6 Máy ảo 436
J. von Neumann ,
Thảo luận sơ bộ về thiết kế logic của một công 5.7 Bộ nhớ ảo 440
cụ điện toán điện tử , 1946

Tổ chức máy tính và thiết kế Phiên bản RISC-V. DOI: http://dx.doi.org/10.1016/B978-0-12-820331-6.00005-3 ©


2021 Elsevier Inc. Đã đăng ký Bản quyền.
5,8 Một khung chung cho phân cấp bộ nhớ 464
5.9 Sử dụng máy trạng thái hữu hạn để điều khiển bộ đệm đơn giản 470
5.10 Phân cấp song song và bộ nhớ: Sự kết hợp 475

5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa
rẻ tiền 479

5.12 Tài liệu nâng cao: Triển khai bộ điều khiển bộ đệm
480
5.13 Real Stuff: Phân cấp bộ nhớ ARM Cortex-A8 và Intel Core
i7 480
5.14 Real Stuff: Phần còn lại của Hệ thống RISC-V và
Hướng dẫn đặc biệt 486
5.15 Nhanh hơn: Chặn bộ nhớ cache và nhân ma trận 488
5.16 Ngụy biện và Cạm bẫy 489
5.17 Kết luận 494
5,18 Quan điểm lịch sử và đọc thêm 495
5.19 Tự học 495
5.20 Bài tập 499

Năm thành phần cổ điển của một máy tính


388 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

5.1 Giới thiệu

Ngay từ những ngày đầu tiên của máy tính, các lập trình viên đã muốn có bộ nhớ
nhanh không giới hạn. Các chủ đề trong chương này hỗ trợ các lập trình viên
bằng cách tạo ra ảo ảnh đó. Trước khi chúng ta nhìn vào việc tạo ra ảo ảnh, hãy
để xem xét một sự tương tự đơn giản minh họa các nguyên tắc và cơ chế chính
mà chúng ta sử dụng.
Giả sử bạn là một sinh viên viết một bài báo về những phát triển lịch sử quan
trọng trong phần cứng máy tính. Bạn đang ngồi ở bàn làm việc trong thư viện với bộ
sách mà bạn đã lấy từ kệ và đang kiểm tra. Bạn thấy rằng một số máy tính quan trọng
mà bạn cần viết về được mô tả trong những cuốn sách bạn có, nhưng không có gì về
EDSAC. Do đó, bạn quay trở lại kệ và tìm một cuốn sách bổ sung. Bạn tìm thấy một
cuốn sách về các máy tính đầu tiên của Anh bao gồm EDSAC. Một khi bạn có một
lựa chọn tốt các cuốn sách trên bàn trước mặt bạn, có khả năng cao là nhiều chủ đề
bạn cần có thể được tìm thấy trong đó, và bạn có thể dành phần lớn thời gian của
mình chỉ bằng cách sử dụng sách trên bàn mà không quay trở lại kệ. Có một vài cuốn
sách trên bàn trước mặt bạn tiết kiệm thời gian so với việc chỉ có một cuốn sách ở đó
và liên tục phải quay trở lại kệ để trả lại và lấy ra một cuốn khác.
Nguyên tắc tương tự cho phép chúng ta tạo ra ảo ảnh của một bộ nhớ lớn mà
chúng ta có thể truy cập nhanh như một bộ nhớ rất nhỏ. Giống như bạn không
cần truy cập tất cả các sách trong thư viện cùng một lúc với xác suất bằng nhau,
một chương trình không truy cập tất cả mã hoặc dữ liệu của nó cùng một lúc với
xác suất bằng nhau. Nếu không, sẽ không thể làm cho hầu hết các bộ nhớ truy
cập nhanh và vẫn có bộ nhớ lớn trong máy tính, giống như bạn không thể lắp tất
cả các sách thư viện trên bàn của mình và vẫn tìm thấy những gì bạn muốn một
cách nhanh chóng.
Điều này nguyên tắc địa phương làm cơ sở cho cả cách bạn thực hiện công
việc của mình trong thư viện và cách thức hoạt động của các chương trình.
Nguyên tắc của địa phương nói rằng các chương trình truy cập vào một phần
tương đối nhỏ trong không gian địa chỉ của họ bất cứ lúc nào, giống như bạn đã
truy cập một phần rất nhỏ của bộ sưu tập thư viện. Có hai loại địa phương khác
địa phương tạm thời
nhau :
Các nguyên tắc địa
phương nêu rõ rằng nếu ■ Địa phương tạm thời (địa phương trong thời gian): nếu một mục được
một vị trí dữ liệu được
tham chiếu, nó sẽ có xu hướng tham khảo lại sớm. Nếu gần đây bạn đã
tham chiếu thì nó sẽ có
xu hướng được tham mang một cuốn sách đến bàn của bạn để xem xét, có lẽ bạn sẽ cần phải xem
chiếu lại sớm. lại nó sớm.
địa phương không gian ■ Địa phương không gian (địa phương trong không gian): nếu một mục được
Các nguyên tắc địa phương tham chiếu, các mục có địa chỉ gần sẽ có xu hướng được tham chiếu sớm. Ví
nêu rõ rằng nếu một vị trí dụ, khi bạn mang ra cuốn sách về các máy tính tiếng Anh sớm để tìm hiểu về
dữ liệu được tham chiếu, EDSAC, bạn cũng nhận thấy rằng có một cuốn sách khác được gác bên cạnh
các vị trí dữ liệu với các địa nó về các máy tính cơ học ban đầu, vì vậy bạn cũng đã mang lại cuốn sách đó
chỉ gần đó sẽ có xu hướng và, sau này, tìm thấy một cái gì đó hữu ích trong cuốn sách đó. Các thư viện
được tham chiếu sớm.
đặt các cuốn sách về cùng một chủ đề trên cùng một kệ để tăng địa phương
không gian.
Chúng tôi sẽ thấy
cách phân cấp bộ
nhớ sử dụng địa
phương không
gian một lát sau
trong chương này.
5.1 Giới thiệu 389

Hiện tại
Tốc độ Bộ xử lý Kích thước Chi phí ($ / bit) công nghệ

Nhanh Ký ức Nhỏ nhất Cao nhất SRAM


nhất

Ký ức DRAM

Ký ức Lớn nhất Thấp nhất Đĩa từ


Chậm hoặc bộ nhớ Flash
nhất
Một hệ thống phân
HÌNH 5.1 Cấu trúc cơ bản của hệ thống phân cấp bộ nhớ. Bằng cách thực hiện hệ thống bộ nhớ cấp bộ nhớ có thể bao
như một hệ thống phân cấp, người dùng có ảo ảnh về một bộ nhớ lớn bằng cấp bậc lớn nhất của hệ thống
phân cấp, nhưng có thể được truy cập như thể tất cả được xây dựng từ bộ nhớ nhanh nhất. Bộ nhớ flash đã gồm nhiều cấp độ,
thay thế các đĩa trong nhiều thiết bị di động cá nhân và có thể dẫn đến một cấp độ mới trong hệ thống phân nhưng dữ liệu được sao
cấp lưu trữ cho máy tính để bàn và máy chủ; xem Mục 5.2.
chép giữa chỉ hai cấp
độ liền kề tại một thời
Giống như việc truy cập vào sách trên bàn tự nhiên thể hiện địa phương, địa điểm, vì vậy chúng ta
phương trong các chương trình phát sinh từ các cấu trúc chương trình đơn giản
có thể tập trung sự chú
và tự nhiên. Ví dụ: hầu hết các chương trình đều chứa các vòng lặp, vì vậy các
hướng dẫn và dữ liệu có khả năng được truy cập nhiều lần, hiển thị địa phương ý của mình vào chỉ hai
thời gian lớn. Vì các hướng dẫn thường được truy cập tuần tự, các chương trình cấp độ.
cũng cho thấy địa phương không gian cao. Truy cập dữ liệu cũng thể hiện một
địa phương không gian tự nhiên. Ví dụ: truy cập tuần tự vào các phần tử của một
mảng hoặc một bản ghi sẽ tự nhiên có mức độ cao của địa phương không gian.
Chúng tôi tận dụng nguyên tắc địa phương bằng cách triển khai bộ nhớ của
máy tính như một hệ thống phân cấp bộ nhớMột hệ thống phân cấp bộ nhớ bao
gồm nhiều cấp độ bộ nhớ với tốc độ và kích cỡ khác nhau. Những ký ức nhanh
hơn đắt hơn mỗi bit so với những ký ức chậm hơn và do đó nhỏ hơn.
Hình 5.1 hiển thị bộ nhớ nhanh hơn gần với bộ xử lý và chậm hơn , bộ nhớ ít
tốn kém hơn là bên dưới nó. Mục tiêu là cung cấp cho người dùng nhiều bộ nhớ
như có sẵn trong công nghệ rẻ nhất, đồng thời cung cấp quyền truy cập ở tốc độ
được cung cấp bởi bộ nhớ nhanh nhất.
Dữ liệu có thứ bậc tương tự: một mức gần hơn với bộ xử lý thường là một tập
hợp con của bất kỳ cấp độ nào ở xa hơn và tất cả dữ liệu được lưu trữ ở mức thấp
nhất. Tương tự, các cuốn sách trên bàn của bạn tạo thành một tập hợp con của
thư viện bạn đang làm việc, lần lượt là một tập hợp con của tất cả các thư viện
trong khuôn viên trường. Hơn nữa, khi chúng ta rời khỏi bộ xử lý, các cấp độ mất
nhiều thời gian hơn để truy cập, giống như chúng ta có thể gặp trong một hệ
thống phân cấp của các thư viện trong khuôn viên trường.
hệ thống phân cấp bộ nhớ Một cấu trúc sử dụng nhiều cấp độ của bộ nhớ; khi khoảng cách từ bộ
xử lý tăng lên, kích thước của bộ nhớ và thời gian truy cập đều tăng trong khi bit pert chi phí giảm.
390 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Bộ xử lý

Dữ liệu được chuyển

khối (hoặc dòng) HÌNH 5.2 Mỗi cặp cấp độ trong hệ thống phân cấp bộ nhớ có thể được coi là có cấp độ
trên và dưới. Trong mỗi cấp độ, đơn vị thông tin có mặt hay không được gọi là a khối hoặc là a đường
Các đơn vị thông tin
dâyThông thường chúng tôi chuyển toàn bộ một khối khi chúng tôi sao chép một cái gì đó giữa các cấp.
tối thiểu có thể có hoặc
không có trong bộ đệm.
Cấp trên, một cấp độ gần hơn với bộ xử lý, nhỏ hơn và nhanh hơn cấp độ thấp
tỷ lệ trúng Phần của hơn, vì cấp trên sử dụng công nghệ đắt hơn. Hình 5.2 cho thấy đơn vị thông tin
truy cập bộ nhớ được tối thiểu có thể có mặt hoặc không hiện diện trong hệ thống phân cấp hai cấp
tìm thấy trong một cấp được gọi là a khối hoặc a đường dây; trong thư viện tương tự của chúng tôi, một
độ của hệ thống phân khối thông tin là một cuốn sách.
cấp bộ nhớ. Nếu dữ liệu được yêu cầu bởi bộ xử lý xuất hiện trong một số khối ở cấp trên,
thì đây được gọi là a đánh (tương tự như việc bạn tìm thấy thông tin trong một
tỷ lệ bỏ lỡ Các phần trong những cuốn sách trên bàn của bạn). Nếu dữ liệu không được tìm thấy ở cấp
truy cập bộ nhớ không
trên, yêu cầu được gọi là a bỏ lỡ Cấp thấp hơn trong hệ thống phân cấp sau đó
tìm thấy trong một cấp
được truy cập để lấy khối chứa dữ liệu được yêu cầu. (Tiếp tục sự tương tự của
độ của hệ thống phân
cấp bộ nhớ.
chúng tôi, bạn đi từ bàn của bạn đến kệ để tìm cuốn sách mong muốn.) Các. tỷ lệ
trúng, hoặc là tỷ lệ trúng, là một phần của truy cập bộ nhớ được tìm thấy ở cấp
đánh thời gian Thời trên; nó thường được sử dụng như một thước đo hiệu suất của hệ thống phân cấp
gian được yêu cầu để truy bộ nhớ. Các tỷ lệ bỏ lỡ (Tốc độ 1 − hit) là phần truy cập bộ nhớ không tìm thấy ở
cập một cấp độ của hệ cấp trên.
thống phân cấp bộ nhớ, Vì hiệu suất là lý do chính để có hệ thống phân cấp bộ nhớ, thời gian để dịch
bao gồm cả thời gian cần
vụ truy cập và bỏ lỡ là rất quan trọng. Trúng thời gian là thời gian để truy cập
thiết để xác định xem
quyền truy cập là một hit cấp trên của hệ thống phân cấp bộ nhớ, bao gồm thời gian cần thiết để xác định
hay bỏ lỡ. xem quyền truy cập là một cú đánh hay bỏ lỡ (nghĩa là thời gian cần thiết để xem
qua các cuốn sách trên bàn). Các bỏ lỡ hình phạt là thời gian để thay thế một
bỏ lỡ hình phạt Thời khối ở cấp trên bằng khối tương ứng từ cấp thấp hơn, cộng với thời gian để đưa
gian được yêu cầu tìm khối này đến bộ xử lý (hoặc thời gian để lấy một cuốn sách khác từ kệ và đặt nó
nạp một khối vào một cấp trên bàn). Do mức trên nhỏ hơn và được xây dựng bằng các phần bộ nhớ nhanh
độ của hệ thống phân cấp
hơn, thời gian nhấn sẽ nhỏ hơn nhiều so với thời gian để truy cập cấp độ tiếp theo
bộ nhớ từ cấp thấp hơn,
bao gồm cả thời gian để trong hệ thống phân cấp, là thành phần chính của hình phạt bỏ lỡ. (Thời gian để
truy cập khối, truyền nó kiểm tra những cuốn sách trên bàn nhỏ hơn nhiều so với thời gian để có được
từ cấp này sang cấp khác, một cuốn sách mới từ các kệ.)
chèn nó vào cấp độ bị bỏ
lỡ, và sau đó chuyển khối
đến người yêu cầu.
5.1 Giới thiệu 391

Như chúng ta sẽ thấy trong chương này, các khái niệm được sử dụng để xây
dựng hệ thống bộ nhớ ảnh hưởng đến nhiều khía cạnh khác của máy tính, bao
gồm cách hệ điều hành quản lý bộ nhớ và I / O, cách trình biên dịch tạo mã và
thậm chí cả cách các ứng dụng sử dụng máy tính. Tất nhiên, vì tất cả các chương
trình dành phần lớn thời gian để truy cập bộ nhớ, hệ thống bộ nhớ nhất thiết phải
là yếu tố chính trong việc xác định hiệu suất. Sự phụ thuộc vào hệ thống phân
cấp bộ nhớ để đạt được hiệu suất có nghĩa là các lập trình viên, những người
được đào tạo để nghĩ về bộ nhớ như một thiết bị lưu trữ truy cập ngẫu nhiên,
phẳng, cần hiểu rằng bộ nhớ là một hệ thống phân cấp để có hiệu suất tốt. Chúng
tôi cho thấy sự hiểu biết này quan trọng như thế nào trong các ví dụ sau, chẳng
hạn như Hình 5.18 trên trang 422, và Mục 5.14, trong đó chỉ ra cách nhân đôi
hiệu suất ma trận nhân.
Vì các hệ thống bộ nhớ rất quan trọng đối với hiệu suất, các nhà thiết kế máy
tính dành rất nhiều sự quan tâm cho các hệ thống này và phát triển các cơ chế
tinh vi để cải thiện hiệu suất của hệ thống bộ nhớ. Trong chương này, chúng tôi
thảo luận về các ý tưởng khái niệm chính, mặc dù chúng tôi sử dụng nhiều đơn
giản hóa và trừu tượng để giữ cho vật liệu có thể quản lý được về chiều dài và độ
phức tạp.

Các
Các chương trình thể hiện cả địa phương tạm thời, xu hướng sử dụng lại LỚN
các mục dữ liệu được truy cập gần đây và địa phương không gian, xu
hướng tham chiếu các mục dữ liệu gần với các mục được truy cập gần Hình ảnh
đây. Hệ thống phân cấp bộ nhớ tận dụng tính cục bộ tạm thời bằng cách
giữ các mục dữ liệu được truy cập gần đây gần hơn với bộ xử lý. Hệ
thống phân cấp bộ nhớ tận dụng địa phương không gian bằng cách di
chuyển các khối bao gồm nhiều từ liền kề trong bộ nhớ đến các cấp trên
của hệ thống phân cấp.
Hình 5.3 cho thấy một hệ thống phân cấp bộ nhớ sử dụng nhỏ hơn và
nhanh hơn công nghệ bộ nhớ gần với bộ xử lý. Do đó, các truy cập đạt
mức cao nhất của hệ thống phân cấp có thể được xử lý nhanh chóng.
Truy cập bỏ lỡ đi đến cấp thấp hơn của hệ thống phân cấp, lớn hơn
nhưng chậm hơn. Nếu tốc độ truy cập đủ cao, hệ thống phân cấp bộ nhớ
có thời gian truy cập hiệu quả gần với mức cao nhất (và nhanh nhất) và
kích thước bằng với mức thấp nhất (và lớn nhất).
Trong hầu hết các hệ thống, bộ nhớ là một hệ thống phân cấp thực sự,
có nghĩa là dữ liệu không thể có mặt ở cấp độ Tôi trừ khi họ cũng có mặt
ở cấp độ Tôi + 1.

Những tuyên bố nào sau đây thường đúng? Kiểm tra


Bản thân bạn
1. Hệ thống phân cấp bộ nhớ tận dụng địa phương tạm thời.
2. Khi đọc, giá trị được trả về phụ thuộc vào khối nào trong bộ đệm.
3. Hầu hết chi phí của hệ thống phân cấp bộ nhớ là ở mức cao nhất.
4. Hầu hết công suất của hệ thống phân cấp bộ nhớ ở mức thấp nhất.
392 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

CPU

Tăng khoảng cách


Cấp 1
từ CPU trong
thời gian truy cập
Cấp độ trong Cấp 2
hệ thống phân cấp
bộ nhớ

Cấp độ n

Kích thước của bộ nhớ ở mỗi cấp độ

HÌNH 5.3 Sơ đồ này cho thấy cấu trúc của hệ thống phân cấp bộ nhớ: khi khoảng cách từ
bộ xử lý tăng, kích thước cũng vậy. Cấu trúc này, với hoạt động thích hợp các cơ chế, cho phép bộ
xử lý có thời gian truy cập được xác định chủ yếu theo cấp độ 1 của hệ thống phân cấp và có bộ nhớ lớn
như cấp độ nDuy trì ảo ảnh này là chủ đề của chương này. Mặc dù lưu trữ cục bộ thường là đáy của hệ
thống phân cấp, một số hệ thống sử dụng băng hoặc máy chủ tệp qua mạng cục bộ làm cấp độ tiếp theo của
hệ thống phân cấp.

5.2 Công nghệ bộ nhớ

Có bốn công nghệ chính được sử dụng ngày nay trong hệ thống phân cấp bộ nhớ.
Bộ nhớ chính được triển khai từ DRAM (bộ nhớ truy cập ngẫu nhiên động),
trong khi các mức gần hơn với bộ xử lý (bộ nhớ cache) sử dụng SRAM (bộ nhớ
truy cập ngẫu nhiên tĩnh). DRAM ít tốn kém hơn mỗi bit so với SRAM, mặc dù
nó chậm hơn đáng kể. Sự khác biệt về giá phát sinh do DRAM sử dụng diện tích
trên mỗi bit bộ nhớ ít hơn đáng kể và DRAM do đó có công suất lớn hơn cho
cùng một lượng silicon; sự khác biệt tốc độ phát sinh từ một số yếu tố được mô tả
trong Mục A.9 của Phụ lục ACông nghệ thứ ba là bộ nhớ flash. Bộ nhớ không
bay hơi này là bộ nhớ thứ cấp trong Thiết bị di động cá nhân. Công nghệ thứ tư,
được sử dụng để thực hiện mức độ lớn nhất và chậm nhất trong hệ thống phân
cấp trong các máy chủ, là đĩa từ. Thời gian truy cập và giá mỗi bit rất khác nhau
giữa các công nghệ này, như bảng dưới đây cho thấy, sử dụng các giá trị điển
hình cho năm 2020.

Công nghệ bộ nhớ Thời gian truy cập $ mỗi GiB vào năm
điển hình 2020
Bộ nhớ bán dẫn SRAM 0,5 con2,5 ns $ 500 $ 1000
Bộ nhớ bán dẫn DRAM 50 con70 ns $3$6
Bộ nhớ bán dẫn flash 5.000 bóng50.000 ns $ 0,06 $ 0,12
Đĩa từ 5.000.000 bóng20.000.000 ns $ 0,01 $ 0,02
Chúng tôi mô tả từng công nghệ bộ nhớ trong phần còn lại của phần này.
5.2 Công nghệ bộ nhớ 393

Công nghệ SRAM


SRAM chỉ đơn giản là các mạch tích hợp là mảng bộ nhớ với (thường) một cổng
truy cập duy nhất có thể cung cấp đọc hoặc ghi. SRAM có thời gian truy cập cố
định vào bất kỳ mốc thời gian nào, mặc dù thời gian truy cập đọc và ghi có thể
khác nhau.

SRAM don lồng cần làm mới và vì vậy thời gian truy cập rất gần với thời gian
chu kỳ là thời gian giữa các lần truy cập bộ nhớ. SRAM thường sử dụng sáu đến
tám bóng bán dẫn mỗi bit để ngăn thông tin bị xáo trộn khi đọc. SRAM chỉ cần
công suất tối thiểu để giữ điện tích ở chế độ chờ.
Trước đây, hầu hết các PC và hệ thống máy chủ đã sử dụng các chip SRAM
riêng cho bộ nhớ cache chính, phụ hoặc thậm chí cấp ba của chúng. Ngày nay,
nhờ Luật Moore Moore, tất cả các cấp bộ nhớ cache được tích hợp vào chip xử lý,
do đó thị trường chip SRAM độc lập đã gần như bốc hơi.

Công nghệ DRAM


Trong SRAM, miễn là áp dụng nguồn điện, giá trị có thể được giữ vô thời hạn.
Trong một RAM động (DRAM), giá trị được giữ trong một ô được lưu trữ dưới
dạng điện tích trong tụ điện. Sau đó, một bóng bán dẫn được sử dụng để truy cập
vào khoản phí được lưu trữ này, để đọc giá trị hoặc ghi đè lên khoản phí được
lưu trữ ở đó. Vì DRAM chỉ sử dụng một bóng bán dẫn cho mỗi bit lưu trữ, chúng
dày hơn và rẻ hơn mỗi bit so với SRAM. Vì DRAM lưu trữ điện tích trên tụ điện,
nó không thể được giữ vô thời hạn và phải được làm mới định kỳ. Sự không nhất
quán là lý do tại sao cấu trúc bộ nhớ này được gọi là động, trái ngược với bộ lưu
trữ tĩnh trong một ô SRAM.
Để làm mới tế bào, chúng tôi chỉ đọc nội dung của nó và viết lại. Phí có thể
được giữ trong vài mili giây. Nếu mọi bit phải được đọc ra khỏi DRAM và sau
đó được viết lại riêng lẻ, chúng tôi sẽ liên tục làm mới DRAM, không để lại thời
gian truy cập nó. May mắn thay, DRAM sử dụng cấu trúc giải mã hai cấp độ và
điều này cho phép chúng tôi làm mới toàn bộ hàng (chia sẻ một dòng từ) với một
chu kỳ đọc theo sau ngay lập tức bởi một chu kỳ ghi.
Hình 5.4 cho thấy tổ chức nội bộ của DRAM, và Hình 5.5 chương trình mật
độ, chi phí và thời gian truy cập của DRAM đã thay đổi như thế nào qua nhiều
năm.
Các tổ chức hàng giúp làm mới cũng giúp hiệu suất. Để cải thiện hiệu suất, các
hàng đệm DRAM để truy cập nhiều lần. Bộ đệm hoạt động như một SRAM; bằng
cách thay đổi địa chỉ, các bit ngẫu nhiên có thể được truy cập trong bộ đệm cho
đến khi truy cập hàng tiếp theo. Khả năng này cải thiện đáng kể thời gian truy cập,
vì thời gian truy cập vào các bit trong hàng nhanh hơn nhiều. Làm cho chip rộng
hơn cũng cải thiện băng thông bộ nhớ của chip. Khi hàng nằm trong bộ đệm, nó
có thể được chuyển bởi các địa chỉ liên tiếp ở bất kỳ chiều rộng nào của DRAM
(thường là 4, 8 hoặc 16 bit) hoặc bằng cách chỉ định chuyển khối và địa chỉ bắt
đầu trong bộ đệm.
Để cải thiện giao diện cho bộ xử lý hơn nữa, DRAM đã thêm đồng hồ và được gọi
đúng là DRAM hoặc SDRAM đồng bộ. Ưu điểm của SDRAM là việc sử dụng đồng
hồ giúp loại bỏ thời gian để bộ nhớ và bộ xử lý đồng bộ hóa. Lợi thế tốc độ của
DRAM đồng bộ đến từ khả năng
394 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Ngân hàng
Cột
Rd / Wr

Đạo luật

Trước

Hàng

HÌNH 5.4 Tổ chức nội bộ của DRAM . DRAM hiện đại được tổ chức trong các ngân hàng, thông
thường bốn cho DDR4. Mỗi ngân hàng bao gồm một loạt các hàng. Gửi lệnh PRE (sạc lại) mở hoặc đóng
ngân hàng. Một địa chỉ hàng được gửi với một Đạo luật (kích hoạt), khiến hàng được chuyển đến một bộ
đệm. Khi hàng nằm trong bộ đệm, nó có thể được chuyển bằng các địa chỉ cột liên tiếp ở bất kỳ chiều rộng
nào của DRAM (thường là 4, 8 hoặc 16 bit trong DDR4 hoặc bằng cách chỉ định chuyển khối và địa chỉ
bắt đầu. Mỗi lệnh, cũng như chuyển khối, được đồng bộ hóa với đồng hồ.

Tổng thời Thời gian truy


Năm
Kích $ mỗi gian truy cập cập cột trung
giới thiệu thước GiB vào một hàng bình đến hàng
chip
/ cột mới hiện có
1980 64 Kibibit $ 6.480.000 250 ns 150 ns
1983 256 Kibibit $ 1.980.000 185 ns 100 ns
1985 1 Mebibit $ 720.000 135 ns 40 ns
1989 4 Mebibit $ 128.000 110 ns 40 ns
1992 16 Mebibit 30.000 đô la 90 ns 30 ns
1996 64 Mebibit 9.000 đô la 60 ns 12 ns
1998 128 Mebibit $ 900 60 ns 10 ns
2000 256 Mebibit $ 840 55 ns 7 ns
2004 512 Mebibit $ 150 50 ns 5 ns
2007 1 Gibibit $ 40 45 ns 1,25 ns
2010 2 Gibibit $ 13 40 ns 1 ns
2012 4 Gibibit $5 35 ns 0,8 ns
2015 8 Gibibit 7 đô la 30 ns 0,6 ns
2018 16 Gibibit $6 25 ns 0,4 ns

HÌNH 5,5 Kích thước DRAM tăng lên gấp bội bốn lần khoảng 3 năm một lần cho đến năm
1996, và sau đó chậm hơn đáng kể. Những cải thiện về thời gian truy cập đã chậm hơn nhưng liên
tục và chi phí gần như theo dõi các cải tiến mật độ, mặc dù chi phí thường bị ảnh hưởng bởi các vấn đề
khác, chẳng hạn như tính khả dụng và nhu cầu. Chi phí cho mỗi gibibyte không được điều chỉnh theo lạm
phát. Nguồn giá là https:// jcmit.net/memoryprice.htm.

để truyền các bit trong vụ nổ mà không phải chỉ định các bit địa chỉ bổ sung. Thay
vào đó, đồng hồ chuyển các bit liên tiếp trong một vụ nổ. Nó được gọi là Dữ liệu kép
Tỷ lệ (DDR) SDRAM. Tên có nghĩa là truyền dữ liệu trên cả hai tăng và rơi xuống
cạnh của đồng hồ, do đó nhận được băng thông gấp đôi so với bạn mong đợi dựa trên
tốc độ đồng hồ và chiều rộng dữ liệu. Phiên bản mới nhất của công nghệ này
5.2 Công nghệ bộ nhớ 395

được gọi là DDR4. DRAM DDR4-3200 có thể thực hiện chuyển 3.200 triệu mỗi
giây, điều đó có nghĩa là nó có đồng hồ 1600 MHz.
Duy trì nhiều băng thông đòi hỏi phải có tổ chức thông minh Phía trong
DRAM. Thay vì chỉ một bộ đệm hàng nhanh hơn, DRAM có thể được tổ chức nội
bộ để đọc hoặc ghi từ nhiều ngân hàng, với mỗi bộ đệm hàng riêng của nó. Gửi
một địa chỉ đến một số ngân hàng cho phép tất cả họ đọc hoặc viết đồng thời. Ví
dụ: với bốn ngân hàng, chỉ có một thời gian truy cập và sau đó truy cập xoay giữa
bốn ngân hàng để cung cấp bốn lần băng thông. Sơ đồ truy cập xoay này được gọi
địa chỉ xen kẽ.
Mặc dù các thiết bị di động cá nhân như iPad (xem Chương 1) sử dụng
DRAM riêng lẻ, bộ nhớ cho máy chủ thường được bán trên các bảng nhỏ được
gọi kép mô-đun bộ nhớ nội tuyến (DIMM). DIMM thường chứa 4 DR16 DRAM
và chúng thường được tổ chức rộng 8 byte cho các hệ thống máy chủ. Một
DIMM sử dụng DDR4-3200 SDRAM có thể chuyển với tốc độ 8 × 3200 =
25.600 megabyte mỗi giây. Các DIMM như vậy được đặt tên theo băng thông
của chúng: PC25600. Vì DIMM có thể có rất nhiều chip DRAM mà chỉ một
phần trong số chúng được sử dụng cho một lần chuyển cụ thể, chúng tôi cần một
thuật ngữ để chỉ tập hợp con chip trong DIMM có chung các dòng địa chỉ chung.
Để tránh nhầm lẫn với tên DRAM nội bộ của hàng và ngân hàng, chúng tôi sử
dụng thuật ngữ này thứ hạng bộ nhớ cho một tập hợp con chip như vậy trong
DIMM .

Xây dựng: Một cách để đo hiệu suất của hệ thống bộ nhớ phía sau bộ nhớ cache
là điểm chuẩn Stream [McCalpin, 1995]. Nó đo lường hiệu suất của các hoạt động
vector dài. Họ không có địa phương tạm thời và họ truy cập các mảng lớn hơn bộ
đệm của máy tính đang được thử nghiệm.

Bộ nhớ flash
Bộ nhớ flash là một loại bộ nhớ chỉ đọc có thể xóa bằng điện (EEPROM).
Không giống như các đĩa và DRAM, nhưng giống như các công nghệ
EEPROM khác, ghi có thể làm hao mòn các bit bộ nhớ flash. Để đối phó với các
giới hạn như vậy, hầu hết các sản phẩm flash bao gồm bộ điều khiển để trải đều
các chữ viết bằng cách ánh xạ lại các khối đã được viết nhiều lần thành các khối
ít bị giẫm đạp. Kỹ thuật này được gọi mặc san lấp mặt bằngVới mức độ hao mòn,
các thiết bị di động cá nhân rất khó có thể vượt quá giới hạn ghi trong đèn flash.
Việc cân bằng độ mòn như vậy làm giảm hiệu suất tiềm năng của flash, nhưng nó
là cần thiết trừ khi phần mềm cấp cao hơn theo dõi khối mòn. Bộ điều khiển
flash thực hiện san lấp mặt bằng cũng có thể cải thiện năng suất bằng cách ánh
xạ ra các tế bào bộ nhớ được sản xuất không chính xác.

Bộ nhớ đĩa
Như Hình 5.6 cho thấy, một đĩa cứng từ tính bao gồm một bộ đĩa, xoay trên một trục
chính ở mức 5400 đến 15.000 vòng quay mỗi phút. Các đĩa kim loại được phủ bằng
vật liệu ghi từ ở cả hai bên, tương tự như vật liệu
396 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

HÌNH 5.6 Một đĩa hiển thị 10 đĩa đĩa và đầu đọc / ghi. Đường kính của ngày nay các đĩa của Nhật
Bản là 2,5 hoặc 3,5 inch và thường có một hoặc hai đĩa trên mỗi ổ đĩa ngày nay.

tìm thấy trên một băng cassette hoặc băng video. Để đọc và ghi thông tin trên đĩa
cứng, có thể di chuyển được cánh tay chứa một cuộn dây điện từ nhỏ gọi là a đọc
viết đầu nằm ngay phía trên mỗi bề mặt. Toàn bộ ổ đĩa được niêm phong vĩnh
viễn để kiểm soát môi trường bên trong ổ đĩa, do đó, cho phép các đầu đĩa gần
hơn với bề mặt ổ đĩa.
Mỗi bề mặt đĩa được chia thành các vòng tròn đồng tâm, được gọi bài hát
theo dõi Một trong hàng
ngàn của các vòng tròn
Thông thường có hàng chục ngàn bản nhạc trên mỗi bề mặt. Mỗi bài hát lần lượt
đồng tâm tạo nên bề mặt
được chia thành. các ngành có chứa thông tin; mỗi bài hát có thể có hàng ngàn
của một đĩa từ. lĩnh vực. Các ngành thường có kích thước từ 512 đến 4096 byte. Trình tự được
ghi trên phương tiện từ tính là một số ngành, một khoảng cách, thông tin cho lĩnh
ngành Một trong vực đó bao gồm mã sửa lỗi (xem Mục 5.5), một khoảng cách, số ngành của khu
những các phân đoạn tạo vực tiếp theo, v.v.
thành một bản nhạc trên
Các đầu đĩa cho mỗi bề mặt được kết nối với nhau và di chuyển kết hợp, để mọi
đĩa từ tính; một khu vực
là lượng thông tin nhỏ đầu đều nằm trên cùng một rãnh của mọi bề mặt. Thuật ngữ hình trụ được sử dụng để
nhất được đọc hoặc ghi chỉ tất cả các rãnh dưới đầu tại một điểm nhất định trên tất cả các bề mặt.
trên đĩa.
5.2 Công nghệ bộ nhớ 397

Để truy cập dữ liệu, hệ điều hành phải điều khiển đĩa thông qua quy trình ba tìm kiếm Quá trình
giai đoạn. Bước đầu tiên là đặt đầu trên đường đua thích hợp. Hoạt động này được của định vị đầu đọc /
gọi là a tìm kiếmvà thời gian để di chuyển đầu đến bản nhạc mong muốn được ghi trên rãnh thích hợp
gọi là tìm kiếm thời gian. trên đĩa.
Các nhà sản xuất đĩa báo cáo thời gian tìm kiếm tối thiểu, thời gian tìm kiếm
tối đa và thời gian tìm kiếm trung bình trong hướng dẫn sử dụng của họ. Hai cái
đầu tiên rất dễ đo, nhưng trung bình là mở để giải thích rộng vì nó phụ thuộc vào
khoảng cách tìm kiếm. Ngành công nghiệp tính toán thời gian tìm kiếm trung
bình là tổng thời gian cho tất cả các tìm kiếm có thể chia cho số lượng tìm kiếm
có thể. Thời gian tìm kiếm trung bình thường được quảng cáo là 3 ms đến 13 ms,
nhưng, tùy thuộc vào ứng dụng và lập lịch yêu cầu đĩa, thời gian tìm kiếm trung
bình thực tế có thể chỉ bằng 25% đến 33% số lượng được quảng cáo vì địa
phương của các tài liệu tham khảo đĩa. Địa phương này phát sinh cả vì truy cập
liên tiếp vào cùng một tệp và vì hệ điều hành cố gắng sắp xếp các truy cập đó
cùng nhau.
Khi đầu đã đạt đến đúng hướng, chúng ta phải đợi khu vực mong muốn xoay độ trễ quay Cũng thế
dưới đầu đọc / ghi. Lần này được gọi là độ trễ quay hoặc là độ trễ quayĐộ trễ gọi độ trễ quayThời
trung bình cho thông tin mong muốn là nửa chừng. đĩa. Đĩa quay ở 5400 RPM gian cần thiết cho khu
vực mong muốn của đĩa
đến 15.000 RPM. Độ trễ quay trung bình ở 5400 RPM là
để xoay dưới đầu đọc /
ghi; thường được coi là
Xoay 0,5 Xoay 0,5 một nửa thời gian quay.
5400 vòng
Độ trễ quay trung bình = / phút = giây
5400 vòng / phút
phút
= 0,0056 giây = 5,6 ms

Thành phần cuối cùng của truy cập đĩa , thời gian chuyển nhượng, là thời gian
để chuyển một khối bit. Thời gian truyền là một chức năng của kích thước ngành,
tốc độ quay và mật độ ghi của bản nhạc. Tốc độ chuyển nhượng vào năm 2020 là
từ 150 đến 250 MB / giây.
Một điều phức tạp là hầu hết các bộ điều khiển đĩa đều có bộ đệm tích hợp lưu
trữ các khu vực khi chúng được chuyển qua; tốc độ truyền từ bộ đệm thường cao
hơn và lên tới 1500 MB / giây (12 Gbit / giây) vào năm 2020.
Than ôi, nơi các khối được đặt không còn trực quan. Các giả định của mô hình
xi lanh theo dõi khu vực ở trên là các khối gần đó nằm trên cùng một rãnh, các
khối trong cùng một xi lanh mất ít thời gian hơn để truy cập vì không có thời
gian tìm kiếm và một số bản nhạc gần hơn các bản nhạc khác. Lý do cho sự thay
đổi là việc tăng mức độ của các giao diện đĩa. Để tăng tốc chuyển tuần tự, các
giao diện cấp cao hơn này tổ chức các đĩa giống như băng hơn là các thiết bị truy
cập ngẫu nhiên. Các khối logic được sắp xếp theo kiểu serpentine trên một bề
mặt duy nhất, cố gắng nắm bắt tất cả các lĩnh vực được ghi ở cùng mật độ bit để
cố gắng đạt được hiệu suất tốt nhất. Do đó, các khối có địa chỉ tuần tự có thể nằm
trên các bản nhạc khác nhau.
398 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Tóm lại, hai điểm khác biệt chính giữa đĩa từ và công nghệ bộ nhớ bán dẫn là
đĩa có thời gian truy cập chậm hơn vì chúng là thiết bị cơ khí—độ trễ flash nhanh
gấp 1000 lần và DRAM nhanh gấp 100.000 lần—Tuy nhiên, chúng rẻ hơn mỗi
bit vì chúng có dung lượng lưu trữ rất cao với chi phí khiêm tốn—đĩa rẻ hơn 6
đến 300 lần. Đĩa từ không bay hơi như flash, nhưng không giống như flash thì
không có vấn đề về hao mòn ghi. Tuy nhiên, flash chắc chắn hơn nhiều và do đó
phù hợp hơn với sự chen lấn vốn có trong các thiết bị di động cá nhân.

Bộ nhớ cache: một


nơi an toàn để ẩn 5.3 Những điều cơ bản của bộ nhớ cache
hoặc lưu trữ mọi
thứ. Trong ví dụ thư viện của chúng tôi, bàn làm việc như một bộ đệm, một nơi an
Webster từ điển thế toàn để lưu trữ những thứ (sách) mà chúng tôi cần kiểm tra. Bộ nhớ cache là tên
giới mới của ngôn ngữ được chọn để thể hiện mức độ phân cấp bộ nhớ giữa bộ xử lý và bộ nhớ chính
Mỹ, phiên bản đại học trong máy tính thương mại đầu tiên có mức bổ sung này. Những ký ức trong
thứ ba, 1988 datapath trong Chương 4 được thay thế đơn giản bằng bộ nhớ cache. Ngày nay,
mặc dù điều này vẫn chiếm ưu thế sử dụng từ này bộ nhớ cache, thuật ngữ này
cũng được sử dụng để chỉ bất kỳ bộ lưu trữ nào được quản lý để tận dụng lợi thế
của địa phương truy cập. Bộ nhớ cache xuất hiện lần đầu tiên trong các máy tính
nghiên cứu vào đầu những năm 1960 và trong các máy tính sản xuất sau đó trong
cùng thập kỷ đó; mọi máy tính đa năng được xây dựng từ máy chủ đến bộ xử lý
nhúng công suất thấp, bao gồm bộ nhớ cache.
Trong phần này, chúng tôi bắt đầu bằng cách xem một bộ đệm rất đơn giản
trong đó các yêu cầu của bộ xử lý là mỗi từ và các khối cũng bao gồm một từ
duy nhất. (Độc giả đã quen thuộc với các kiến thức cơ bản về bộ nhớ cache có
thể muốn bỏ qua Mục 5.4). Hình 5.7 hiển thị bộ đệm đơn giản như vậy, trước và
sau khi yêu cầu một mục dữ liệu không có trong bộ đệm. Trước khi yêu cầu, bộ
đệm chứa một tập hợp các tài liệu tham khảo gần đây X1, X2, ..., Xn-1và bộ xử lý
yêu cầu một từ Xn đó không phải là trong bộ nhớ cache. Yêu cầu này dẫn đến bỏ
lỡ và từ Xn được đưa từ bộ nhớ vào bộ nhớ cache.
Khi nhìn vào kịch bản trong Hình 5.7, có hai câu hỏi để trả lời: Làm thế nào
để chúng tôi biết nếu một mục dữ liệu có trong bộ đệm? Hơn nữa, nếu có, làm
thế nào để chúng ta tìm thấy nó? Các câu trả lời có liên quan. Nếu mỗi từ có thể
đi vào chính xác một vị trí trong bộ đệm, thì việc tìm từ nếu nó nằm trong bộ
đệm là điều đơn giản. Cách đơn giản nhất để gán một vị trí trong bộ đệm cho
từng từ trong bộ nhớ là gán vị trí bộ đệm dựa trên Địa chỉ của từ trong bộ nhớ.
bộ nhớ cache được ánh Cấu trúc bộ đệm này được gọi lập bản đồ trực tiếp, vì mỗi vị trí bộ nhớ được
xạ trực tiếp Cấu trúc bộ ánh xạ trực tiếp đến chính xác một vị trí trong bộ đệm. Ánh xạ điển hình giữa địa
đệm trong đó mỗi vị trí
bộ nhớ được ánh xạ tới
chỉ và vị trí bộ đệm cho bộ đệm được ánh xạ trực tiếp thường đơn giản. Ví dụ:
chính xác một vị trí trong hầu hết tất cả các bộ nhớ cache được ánh xạ trực tiếp đều sử dụng ánh xạ này để
bộ đệm. tìm một khối :
5.3 Khái niệm cơ bản về bộ nhớ cache 399

X4 X4

X1 X1

X X
n-2 n-2

X X
n-1 n-1

X2 X2
Xn

X3 X3

a. Trước khi tham chiếu đến b. Sau khi tham chiếu đến
Xn Xn

HÌNH 5.7 Bộ đệm ngay trước và ngay sau khi tham chiếu đến từ Xn đó không phải là ban
đầu trong bộ nhớ cache. Tham chiếu này gây ra lỗi bỏ lỡ buộc bộ đệm phải tìm nạp X n từ bộ nhớ và
chèn nó vào bộ đệm.

(Địa chỉ chặn) modulo (Số khối trong bộ đệm)

Nếu số lượng mục trong bộ đệm là lũy thừa 2, thì modulo có thể được tính đơn giản
bằng cách sử dụng nhật ký bậc thấp2 (kích thước bộ đệm trong các khối) bit của địa chỉ.
Do đó, bộ đệm 8 khối sử dụng ba bit thấp nhất (8 = 2 3) của địa chỉ khối. Ví dụ, Hình 5.8
cho thấy cách các địa chỉ bộ nhớ giữa 1 mười (00001hai) và 29mười (11101hai) ánh xạ đến
các vị trí 1mười (001hai) và 5mười (101hai) trong bộ nhớ cache được ánh xạ trực tiếp gồm
tám từ.
Vì mỗi vị trí bộ đệm có thể chứa nội dung của một số vị trí bộ nhớ khác nhau, làm
thế nào để chúng tôi biết liệu dữ liệu trong bộ đệm có tương ứng với một từ được yêu
thẻ Một trường trong một
cầu hay không? Đó là, làm thế nào để chúng ta biết liệu một từ được yêu cầu có trong
bảng được sử dụng cho một
bộ đệm hay không? Chúng tôi trả lời câu hỏi này bằng cách thêm một bộ thẻ đến bộ hệ thống phân cấp bộ nhớ
nhớ cache. Các thẻ chứa thông tin địa chỉ cần thiết để xác định xem một từ trong bộ có chứa thông tin địa chỉ
đệm có tương ứng với từ được yêu cầu hay không. Thẻ chỉ cần chứa phần trên của cần thiết
địa chỉ, tương ứng với các bit không được sử dụng làm chỉ mục vào bộ đệm. Ví dụ, để xác định xem khối
trong Hình 5.8 chúng ta chỉ cần có hai phần trên của năm bit địa chỉ trong thẻ, vì liên kết trong hệ thống
trường chỉ mục 3 bit thấp hơn của địa chỉ sẽ chọn khối. Các kiến trúc sư bỏ qua các phân cấp có tương ứng
bit chỉ mục vì chúng là dư thừa, vì theo định nghĩa, trường chỉ mục của bất kỳ địa chỉ với một từ được yêu cầu
nào của khối bộ đệm phải là số khối đó. hay không.
Chúng tôi cũng cần một cách để nhận ra rằng một khối bộ đệm không có
thông tin hợp lệ. Chẳng hạn, khi bộ xử lý khởi động, bộ đệm không có dữ liệu tốt
và các trường thẻ sẽ là vô nghĩa. Ngay cả sau khi thực hiện nhiều hướng dẫn, một bit hợp lệ Một lĩnh
số mục bộ đệm vẫn có thể trống, như trong Hình 5.7 Vì vậy, chúng ta cần biết vực trong các bảng của
rằng thẻ nên được bỏ qua cho các mục như vậy. Phương pháp phổ biến nhất là hệ thống phân cấp bộ
thêm a. bit hợp lệ để cho biết liệu một mục có chứa một địa chỉ hợp lệ. Nếu bit nhớ chỉ ra rằng khối liên
không được đặt, không thể có kết quả khớp cho khối này. kết trong hệ thống phân
cấp chứa dữ liệu hợp lệ.
400 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Bộ nhớ
cache

000 00 10 10 01 11 00 10 11 01 11
00001 00101 01001 01101 10001 10101 11001 11101
Ký ức

HÌNH 5.8 Bộ đệm được ánh xạ trực tiếp với tám mục hiển thị địa chỉ của các từ bộ nhớ
trong khoảng từ 0 đến 31 ánh xạ tới cùng các vị trí bộ đệm. Bởi vì có tám từ trong bộ đệm, địa
chỉ X ánh xạ tới bộ đệm được ánh xạ trực tiếp từ X modulo 8. Đó là, nhật ký thứ tự thấp2(8) = 3 bit được
sử dụng làm chỉ mục bộ đệm. Do đó, địa chỉ 00001 hai, 01001hai, 10001haivà 11001hai tất cả bản đồ để nhập
001hai của bộ đệm, trong khi địa chỉ 00101hai, 01101hai, 10101haivà 11101hai tất cả bản đồ để nhập 101hai
của bộ nhớ cache.

Đối với phần còn lại của phần này, chúng tôi sẽ tập trung vào việc giải thích
cách bộ nhớ cache xử lý việc đọc. Nói chung, việc xử lý đọc đơn giản hơn một
chút so với xử lý ghi, vì việc đọc không phải thay đổi nội dung của bộ đệm. Sau
khi xem những điều cơ bản về cách đọc hoạt động và cách xử lý các lỗi bộ nhớ
cache, chúng tôi sẽ kiểm tra các thiết kế bộ đệm cho các máy tính thực và chi tiết
cách các bộ nhớ cache này ghi.

Các
LỚN Bộ nhớ đệm có lẽ là ví dụ quan trọng nhất của ý tưởng lớn dự đoánNó
dựa vào nguyên tắc của địa phương để cố gắng tìm. dữ liệu mong muốn
Hình ảnh ở các cấp cao hơn của hệ thống phân cấp bộ nhớ và cung cấp các cơ chế
để đảm bảo rằng khi dự đoán sai, nó sẽ tìm và sử dụng dữ liệu phù hợp
từ các cấp thấp hơn của hệ thống phân cấp bộ nhớ. Tỷ lệ trúng của dự
đoán bộ đệm trên các máy tính hiện đại thường trên 95% (xem Hình
5.46).
5.3 Khái niệm cơ bản về bộ nhớ cache 401

Truy cập bộ đệm


Dưới đây là một chuỗi gồm chín tham chiếu bộ nhớ đến bộ đệm tám khối trống,
bao gồm cả hành động cho mỗi tham chiếu. Hình 5.9 cho thấy nội dung của bộ
đệm thay đổi như thế nào trên mỗi lần bỏ lỡ. Vì có tám khối trong bộ đệm, 3 bit
thứ tự thấp của một địa chỉ cung cấp số khối :

Địa chỉ thập phân Địa chỉ nhị phân Đánh hay bỏ Khối bộ đệm được gán
của tài liệu tham của tài liệu tham lỡ (nơi tìm thấy hoặc đặt)
khảo khảo trong bộ
nhớ cache
22 10110hai bỏ lỡ (5,9b) (10110hai mod 8) = 110hai
26 11010hai bỏ lỡ (5,9c) (11010hai mod 8) = 010hai
22 10110hai đánh (10110hai mod 8) = 110hai
26 11010hai đánh (11010hai mod 8) = 010hai
16 10000hai bỏ lỡ (5,9d) (10000hai mod 8) = 000hai
3 00011hai bỏ lỡ (5,9e) (00011hai mod 8) = 011hai
16 10000hai đánh (10000hai mod 8) = 000hai
18 10010hai bỏ lỡ (5,9f) (10010hai mod 8) = 010hai
16 10000hai đánh (10000hai mod 8) = 000hai

Vì bộ đệm trống, một số tài liệu tham khảo đầu tiên bị bỏ lỡ; chú thích của
Hình 5.9 mô tả các hành động cho mỗi tham chiếu bộ nhớ. Trên tài liệu tham
khảo thứ tám chúng tôi có nhu cầu xung đột cho một khối. Từ tại địa chỉ 18
(10010hai) nên được đưa vào bộ nhớ cache khối 2 (010hai). Do đó, nó phải thay
thế từ tại địa chỉ 26 (11010hai), đã có trong bộ đệm khối 2 (010hai). Hành vi này
cho phép bộ đệm tận dụng tính cục bộ tạm thời: các từ được tham chiếu gần đây
thay thế các từ được tham chiếu gần đây.
Tình huống này tương tự trực tiếp với việc cần một cuốn sách từ các kệ và
không còn chỗ trống trên bàn của bạn. Một số cuốn sách đã có trên bàn của bạn
phải được đưa trở lại kệ. Trong bộ đệm được ánh xạ trực tiếp, chỉ có một nơi để
đặt mục mới được yêu cầu và do đó chỉ có một lựa chọn về những gì cần thay thế.
Chúng tôi biết nơi để tìm trong bộ đệm cho từng địa chỉ có thể: các bit thứ tự
thấp của địa chỉ có thể được sử dụng để tìm mục nhập bộ đệm duy nhất mà địa
chỉ có thể ánh xạ. Hình 5.10 cho thấy một địa chỉ tham chiếu được chia thành
như thế nào
■ A trường thẻ, được sử dụng để so sánh với giá trị của trường thẻ của bộ
đệm
■ A chỉ mục bộ nhớ cache, được sử dụng để chọn khối
Chỉ mục của khối bộ đệm, cùng với nội dung thẻ của khối đó, chỉ định duy nhất địa
chỉ bộ nhớ của từ có trong khối bộ đệm. Bởi vì trường chỉ mục được sử dụng làm địa
chỉ để tham chiếu bộ đệm và vì an ntrường -bit có 2n các giá trị, tổng số mục trong bộ
đệm được ánh xạ trực tiếp phải là lũy thừa 2. Vì các từ được căn chỉnh theo bội số
của bốn byte, hai bit ít quan trọng nhất của mỗi địa chỉ chỉ định một byte trong một từ.
Do đó, nếu các từ được căn chỉnh trong bộ nhớ, hai bit có ý nghĩa ít nhất có thể bị bỏ
qua khi chọn a
402 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Dữ Dữ
Chỉ số V Thẻ liệu Chỉ số V Thẻ liệu
0 N 0 N
1 N 1 N
10 N 10 N
11 N 11 N
100 N 100 N
101 N 101 N
110 N 10
110 Y hai Ký ức (10110hai)
111 N 111N

a. Trạng thái ban đầu của bộ đệm sau khi bật nguồn b. Sau khi xử lý bỏ lỡ địa chỉ (10110hai)

Dữ Chỉ số V Thẻ Dữ liệu


Chỉ số V Thẻ liệu 10hai
000 Y Ký ức (10000hai)
0 N 001 N
1 N 11
010 Y hai Ký ức (11010hai)
11 Ký ức (11010hai)
010 Y hai 11 N
11 N 100 N
100 N 101 N
101 N 10
110 Y hai Ký ức (10110hai)
10 111N
110 Y hai Ký ức (10110hai)
111N
d. Sau khi xử lý bỏ lỡ địa chỉ (10000hai)
c. Sau khi xử lý bỏ lỡ địa chỉ (11010hai)

Chỉ số V Thẻ Dữ liệu Chỉ số V Thẻ Dữ liệu


000 Y
10hai Ký ức (10000hai) 000 Y
10hai Ký ức (10000hai)
001 N 001 N
010 Y
11hai Ký ức (11010hai)
10hai
010 Y Ký ức (10010hai)
00 00
011 Y hai Ký ức (00011hai) 011 Y hai Ký ức (00011hai)
100 N 100 N
101 N 101 N
10 10
110 Y hai Ký ức (10110hai) 110 Y hai Ký ức (10110hai)
111N 111 N

e. Sau khi xử lý bỏ lỡ địa chỉ (00011hai) f. Sau khi xử lý bỏ lỡ địa chỉ (10010hai)

HÌNH 5.9 Nội dung bộ đệm được hiển thị sau mỗi yêu cầu tham chiếu bị bỏ lỡ, với các trường chỉ mục và thẻ được
hiển thị trong nhị phân cho chuỗi địa chỉ trên trang 402. Bộ nhớ cache ban đầu trống, với tất cả các bit hợp lệ (mục nhập V trong
bộ đệm)
(bỏ lỡ), (đánh), (đánh), (bỏ
tắt (N). Bộ xử lý yêu cầu các địa chỉ sau: 10110 (bỏ lỡ), 11010 10110
hai hai 11010
hai hai 10000 hai lỡ) ,
00011hai (bỏ lỡ), 10000hai (đánh), 10010hai (bỏ lỡ) và 10000hai (đánh). Các số liệu cho thấy nội dung bộ đệm sau mỗi lần bỏ lỡ trong chuỗi đã được
xử lý. Khi địa chỉ 10010hai (18) được tham chiếu, mục nhập cho địa chỉ 11010hai (26) phải được thay thế và tham chiếu đến 11010hai sẽ gây ra một sự
bỏ lỡ tiếp theo. Trường thẻ sẽ chỉ chứa phần trên của địa chỉ. Địa chỉ đầy đủ của một từ có trong khối bộ đệm Tôi với
trường thẻ j cho bộ đệm này là j× 8+ Tôihoặc tương đương với sự nối của trường thẻ j và chỉ số Tôi Ví dụ: trong bộ nhớ cache. f ở trên, chỉ
số 010hai có thẻ 10hai và tương ứng với địa chỉ 10010hai.
5.3 Khái niệm cơ bản về bộ nhớ cache 403

Địa chỉ (hiển thị vị trí bit)


3130 131211 2 10
Byte
bù đắp
20 10
Đánh Thẻ
Dữ
Chỉ số liệu

Có giá
Chỉ số trị Thẻ Dữ liệu
0
1
2

1021
1022
1023
20 32

HÌNH 5.10 Đối với bộ đệm này, phần dưới của địa chỉ được sử dụng để chọn mục nhập bộ
đệm bao gồm từ dữ liệu và thẻ. Bộ nhớ cache này chứa 1024 từ hoặc 4 KiB. Trừ khi lưu ý mặt khác,
chúng tôi giả sử địa chỉ 32 bit trong chương này. Thẻ từ bộ đệm được so sánh với phần trên của địa chỉ để
xác định xem mục nhập trong bộ đệm có tương ứng với địa chỉ được yêu cầu hay không. Vì bộ nhớ cache
có 210 (hoặc 1024) từ và kích thước khối của một từ, 10 bit được sử dụng để lập chỉ mục bộ đệm, để lại 32 -
10 - 2 = 20 bit được so sánh với thẻ. Nếu thẻ và 52 bit trên của địa chỉ bằng nhau và bit hợp lệ được bật, thì
yêu cầu sẽ chạm vào bộ đệm và từ đó được cung cấp cho bộ xử lý. Nếu không, một sự bỏ lỡ xảy ra.

từ trong khối. Đối với chương này, chúng tôi sẽ giả định rằng dữ liệu được căn
chỉnh trong bộ nhớ và thảo luận về cách xử lý các truy cập bộ đệm không được
sắp xếp trong Xây dựng.
Tổng số bit cần thiết cho bộ đệm là một hàm của kích thước bộ đệm và kích
thước địa chỉ, bởi vì bộ đệm bao gồm cả bộ lưu trữ cho dữ liệu và các thẻ. Kích
thước của khối ở trên là một từ (4 byte), nhưng thông thường nó là một số. Đối
với tình huống sau :
■ Địa chỉ 32 bit
■ Một bộ đệm được ánh xạ trực tiếp
404 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

■ Kích thước bộ đệm là 2n khối, vì vậy n bit được sử dụng cho chỉ mục
■ Kích thước khối là 2m từ (2m+2 byte), vì vậy m bit được sử dụng cho từ trong
khối và hai bit được sử dụng cho phần byte của địa chỉ
Kích thước của trường thẻ là
32 - (n + m + 2).

Tổng số bit trong bộ đệm được ánh xạ trực tiếp là

2n × (kích thước khối + kích thước thẻ + kích


thước).

Vì kích thước khối là 2m từ (2m+5 bit) và chúng ta cần 1 bit cho trường hợp lệ, số
bit trong bộ đệm đó là

2n × (2m × 32 + (32 - n - m - 2) + 1) = 2n × (2m × 32 + 31 - n - m).

Mặc dù đây là kích thước thực tế tính bằng bit, quy ước đặt tên là loại trừ kích
thước của thẻ và trường hợp lệ và chỉ đếm kích thước của dữ liệu. Do đó, bộ đệm
trong Hình 5.10 được gọi là bộ đệm 4 KiB mặc dù nó thực sự chứa 1.375 KiB thẻ
và bit hợp lệ cộng với 4 KiB dữ liệu.

VÍ DỤ Bit trong bộ đệm

Cần bao nhiêu bit cho bộ đệm được ánh xạ trực tiếp với 16 KiB dữ liệu và
khối bốn từ, giả sử địa chỉ 64 bit?

TRẢ LỜI Chúng tôi biết rằng 16 KiB là 4096 (2 12) từ ngữ. Với kích thước khối bốn từ (22),
có 1024 (210) khối. Mỗi khối có 4 × 32 hoặc 128 bit dữ liệu cộng với một thẻ, là
64 - 10 - 2 - 2 bit, cộng với một bit hợp lệ. Do đó, kích thước bộ đệm hoàn chỉnh

210 × (4 × 32 + (64 - 10 - 2 - 2) + 1) = 210 × 179 = 179 Kibibits

hoặc 22,4 KiB cho bộ đệm 16 KiB. Đối với bộ đệm này, tổng số bit trong bộ
đệm gấp khoảng 1,4 lần so với mức cần thiết chỉ để lưu trữ dữ liệu.
5.3 Khái niệm cơ bản về bộ nhớ cache 405

Ánh xạ một địa chỉ tới một khối bộ nhớ cache đa từ

Hãy xem xét bộ đệm với 64 khối và kích thước khối 16 byte. Đến số khối
nào địa chỉ byte 1200 bản đồ? VÍ DỤ

Chúng tôi đã thấy công thức trên trang 399. Các khối được đưa ra bởi TRẢ LỜI
(Địa chỉ chặn) modulo (Số khối trong bộ đệm)

nơi địa chỉ của khối là

Địa chỉ byte


Byte mỗi khối

Lưu ý rằng địa chỉ khối này là khối chứa tất cả các địa chỉ giữa

Địa chỉ byte × Byte mỗi khối

Byte mỗi khối


Địa chỉ byte × Byte mỗi khối + (Byte mỗi bkhóa -1)
Byte mỗi khối

Do đó, với 16 byte mỗi khối, địa chỉ byte 1200 là địa chỉ khối
1200
= 75
16
ánh xạ tới số khối bộ đệm (75 modulo 64) = 11. Trong thực tế, khối này ánh
xạ tất cả các địa chỉ từ 1200 đến 1215.

Các khối lớn hơn khai thác địa phương không gian để giảm tỷ lệ bỏ lỡ. Như Hình
5.11 cho thấy, tăng kích thước khối thường làm giảm tỷ lệ bỏ lỡ. Tốc độ bỏ lỡ
cuối cùng có thể tăng lên nếu kích thước khối trở thành một phần đáng kể của
kích thước bộ đệm, bởi vì số lượng khối có thể được giữ trong bộ đệm sẽ trở nên
nhỏ và sẽ có sự cạnh tranh lớn đối với các khối đó. Do đó, một khối sẽ bị va vào
bộ đệm trước khi nhiều từ của nó được truy cập. Thay thế, địa phương không
gian giữa các từ trong một khối giảm với một khối rất lớn; do đó, lợi ích cho tỷ lệ
bỏ lỡ trở nên nhỏ hơn.
406 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

10%
4K


5%
tỷ lệ

16K

64K
0% 256K
16 32 64 128 256
Kích thước khối

HÌNH 5.11 Tỷ lệ hoa hậu so với kích thước khối. Lưu ý rằng tỷ lệ bỏ lỡ thực sự tăng lên nếu kích
thước khối quá lớn so với kích thước bộ đệm. Mỗi dòng đại diện cho một bộ đệm có kích thước khác nhau.
(Con số này độc lập với sự liên kết, sẽ sớm được thảo luận.)

Một vấn đề nghiêm trọng hơn liên quan đến việc chỉ tăng kích thước khối là
chi phí bỏ lỡ tăng lên. Hình phạt bỏ lỡ được xác định theo thời gian cần thiết để
lấy khối từ cấp thấp hơn tiếp theo của hệ thống phân cấp và tải nó vào bộ đệm.
Thời gian để tìm nạp khối có hai phần: độ trễ của từ đầu tiên và thời gian truyền
cho phần còn lại của khối. Rõ ràng, trừ khi chúng ta thay đổi hệ thống bộ nhớ,
thời gian chuyển nhượng và do đó, hình phạt bỏ lỡ có thể sẽ tăng lên khi kích
thước khối mở rộng. Hơn nữa, sự cải thiện về tỷ lệ bỏ lỡ bắt đầu giảm khi các
khối trở nên lớn hơn. Kết quả là sự gia tăng của hình phạt bỏ lỡ áp đảo việc giảm
tỷ lệ bỏ lỡ cho các khối quá lớn và do đó hiệu suất bộ đệm giảm. Tất nhiên, nếu
chúng ta thiết kế bộ nhớ để chuyển các khối lớn hơn hiệu quả hơn, chúng ta có
thể tăng kích thước khối và có được những cải tiến hơn nữa về hiệu suất bộ đệm.
Chúng tôi thảo luận về chủ đề này trong phần tiếp theo.

Xây dựng: Mặc dù rất khó để làm bất cứ điều gì về thành phần độ trễ dài hơn trong số
các hình phạt bỏ lỡ cho các khối lớn, chúng tôi có thể che giấu một số thời gian chuyển để
hình phạt bỏ lỡ nhỏ hơn một cách hiệu quả. Phương pháp dễ nhất để làm điều này, được
gọi khởi động lại sớm, chỉ đơn giản là tiếp tục thực hiện ngay khi từ được yêu cầu của khối
được trả lại, thay vì chờ đợi toàn bộ khối. Nhiều bộ xử lý sử dụng kỹ thuật này để truy cập
hướng dẫn, nơi nó hoạt động tốt nhất. Truy cập lệnh phần lớn là tuần tự, vì vậy nếu hệ
thống bộ nhớ có thể cung cấp một từ mỗi chu kỳ đồng hồ, bộ xử lý có thể khởi động lại
hoạt động khi từ được yêu cầu được trả về, với hệ thống bộ nhớ cung cấp các từ hướng
dẫn mới đúng lúc. Kỹ thuật này thường kém hiệu quả hơn đối với bộ nhớ cache dữ liệu vì
có khả năng các từ sẽ được yêu cầu từ khối theo cách ít dự đoán hơn và xác suất bộ xử lý
sẽ cần một từ khác từ khối bộ đệm khác trước khi chuyển hoàn thành cao. Nếu bộ xử lý
không thể truy cập bộ đệm dữ liệu vì việc truyền đang diễn ra, thì nó phải bị đình trệ.
5.3 Khái niệm cơ bản về bộ nhớ cache 407

Một sơ đồ thậm chí còn tinh vi hơn là sắp xếp bộ nhớ để từ được yêu cầu được
chuyển từ bộ nhớ sang bộ đệm trước. Phần còn lại của khối sau đó được chuyển, bắt
đầu với địa chỉ sau từ được yêu cầu và gói xung quanh đến đầu khối. Kỹ thuật này,
được gọi yêu cầu từ đầu tiên hoặc là từ quan trọng đầu tiên, có thể nhanh hơn một
chút so với khởi động lại sớm, nhưng nó bị giới hạn bởi cùng thuộc tính hạn chế khởi
động lại sớm.

Xử lý các bộ nhớ cache


Trước khi chúng ta nhìn vào bộ nhớ cache của một hệ thống thực, hãy để xem
cách đơn vị điều khiển xử lý bộ nhớ cache bị bỏ lỡ(Chúng tôi mô tả một bộ điều bộ nhớ cache bỏ lỡ
khiển bộ đệm chi tiết trong. Mục 5.9) Sự kiểm soát. đơn vị phải phát hiện bỏ lỡ Một yêu cầu cho dữ liệu
và xử lý bỏ lỡ bằng cách tìm nạp dữ liệu được yêu cầu từ bộ nhớ (hoặc, như từ bộ đệm không thể điền
chúng ta sẽ thấy, bộ đệm cấp thấp hơn). Nếu bộ đệm báo cáo một lần truy cập, được vì dữ liệu không có
trong bộ đệm.
máy tính tiếp tục sử dụng dữ liệu như thể không có gì xảy ra.
Sửa đổi điều khiển của bộ xử lý để xử lý một cú đánh là không đáng kể; bỏ lỡ, tuy
nhiên, đòi hỏi một số công việc thêm. Việc xử lý lỗi bộ đệm được thực hiện với sự
cộng tác của bộ điều khiển bộ xử lý và với bộ điều khiển riêng biệt khởi tạo truy cập
bộ nhớ và nạp lại bộ đệm. Việc xử lý bỏ lỡ bộ nhớ cache tạo ra một gian hàng đường
ống (Chương 4) trái ngược với một ngoại lệ hoặc gián đoạn, đòi hỏi phải lưu trạng
thái của tất cả các thanh ghi. Đối với lỗi bộ đệm, chúng ta có thể trì hoãn toàn bộ bộ
xử lý, về cơ bản là đóng băng nội dung của các thanh ghi tạm thời và hiển thị của lập
trình viên, trong khi chúng ta chờ bộ nhớ. Bộ xử lý ngoài thứ tự tinh vi hơn có thể
cho phép thực hiện các hướng dẫn trong khi chờ bỏ lỡ bộ đệm, nhưng chúng tôi sẽ
giả định bộ xử lý theo thứ tự bị đình trệ trong bộ nhớ cache trong phần này.
Hãy để nhìn kỹ hơn một chút về cách xử lý các lỗi hướng dẫn; cách tiếp cận
tương tự có thể dễ dàng mở rộng để xử lý các lỗi dữ liệu. Nếu một truy cập lệnh
dẫn đến bỏ lỡ, thì nội dung của thanh ghi Hướng dẫn không hợp lệ. Để có được
hướng dẫn phù hợp vào bộ đệm, chúng ta phải có khả năng báo mức thấp hơn
trong hệ thống phân cấp bộ nhớ để thực hiện đọc. Vì bộ đếm chương trình được
tăng lên trong chu kỳ thực hiện đồng hồ đầu tiên, địa chỉ của lệnh tạo ra lỗi bộ
đệm lệnh bằng với giá trị của bộ đếm chương trình trừ 4. Khi chúng tôi có địa chỉ,
chúng tôi cần hướng dẫn bộ nhớ chính để thực hiện đọc. Chúng tôi chờ bộ nhớ
phản hồi (vì việc truy cập sẽ mất nhiều chu kỳ đồng hồ) và sau đó viết các từ có
chứa hướng dẫn mong muốn vào bộ đệm.

Bây giờ chúng ta có thể xác định các bước cần thực hiện khi bỏ lỡ bộ nhớ
cache lệnh :
1. Gửi giá trị PC ban đầu vào bộ nhớ.
2. Hướng dẫn bộ nhớ chính để thực hiện đọc và chờ bộ nhớ hoàn thành
quyền truy cập của nó.
3. Viết mục nhập bộ đệm, đặt dữ liệu từ bộ nhớ vào phần dữ liệu của mục
nhập, ghi các bit trên của địa chỉ (từ ALU) vào trường thẻ và bật bit hợp lệ
nếu nó chưa bật.
4. Khởi động lại thực thi lệnh ở bước đầu tiên, sẽ lấy lại lệnh, lần này tìm
thấy nó trong bộ đệm.
408 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Việc kiểm soát bộ đệm trên truy cập dữ liệu về cơ bản là giống hệt nhau: khi bỏ
lỡ, chúng tôi chỉ đơn giản dừng bộ xử lý cho đến khi bộ nhớ phản hồi với dữ liệu.

Xử lý văn bản
Viết làm việc hơi khác nhau. Giả sử trên một hướng dẫn lưu trữ, chúng tôi chỉ
viết dữ liệu vào bộ đệm dữ liệu (mà không thay đổi bộ nhớ chính); sau đó, sau
khi ghi vào bộ đệm, bộ nhớ sẽ có một giá trị khác với bộ đệm. Trong trường hợp
như vậy, bộ nhớ cache và bộ nhớ được cho là không nhất quánCách đơn giản
nhất để giữ cho bộ nhớ chính và bộ đệm nhất quán là luôn ghi dữ liệu vào cả bộ
viết qua nhớ và bộ đệm. Đề án này được gọi.viết qua.
Một sơ đồ trong đó ghi Khía cạnh quan trọng khác của việc viết là những gì xảy ra trên một văn bản
luôn cập nhật cả bộ đệm bỏ lỡ. Đầu tiên chúng ta lấy các từ của khối từ bộ nhớ. Sau khi khối được tìm nạp
và cấp thấp hơn tiếp theo và đặt vào bộ đệm, chúng ta có thể ghi đè từ gây ra lỗi vào khối bộ đệm. Chúng
của hệ thống phân cấp bộ
tôi cũng viết từ vào bộ nhớ chính bằng địa chỉ đầy đủ.
nhớ, đảm bảo dữ liệu luôn
nhất quán giữa hai bộ đệm.
Mặc dù thiết kế này xử lý viết rất đơn giản, nhưng nó sẽ không cung cấp hiệu
suất tốt. Với sơ đồ ghi qua, mỗi lần ghi làm cho dữ liệu được ghi vào bộ nhớ
chính. Những bài viết này sẽ mất nhiều thời gian, có thể ít nhất 100 chu kỳ đồng
hồ của bộ xử lý và có thể làm chậm bộ xử lý đáng kể. Ví dụ: giả sử 10% hướng
dẫn là cửa hàng. Nếu CPI không bỏ lỡ bộ nhớ cache là 1.0, việc chi thêm 100
chu kỳ cho mỗi lần viết sẽ dẫn đến CPI là 1,0 + 100 × 10% = 11, làm giảm hiệu
viết đệm Một hàng đợi suất hơn 10 lần.
giữ dữ liệu trong khi dữ Một giải pháp cho vấn đề này là sử dụng a viết đệmMột bộ đệm ghi lưu trữ
liệu đang chờ để được dữ liệu trong khi chúng đang chờ để được ghi vào bộ nhớ. Sau khi ghi dữ liệu
ghi vào bộ nhớ. vào bộ đệm và vào bộ đệm ghi, bộ xử lý có thể tiếp tục thực thi. Khi ghi vào bộ
nhớ chính hoàn thành, mục nhập trong bộ đệm ghi sẽ được giải phóng. Nếu bộ
đệm ghi đầy khi bộ xử lý đạt đến mức ghi, bộ xử lý phải dừng cho đến khi có
một vị trí trống trong bộ đệm ghi. Tất nhiên, nếu tốc độ mà bộ nhớ có thể hoàn
thành ghi nhỏ hơn tốc độ mà bộ xử lý tạo ghi, thì không có bộ đệm nào có thể
giúp được, vì ghi được tạo nhanh hơn hệ thống bộ nhớ có thể chấp nhận chúng.
Tỷ lệ ghi được tạo ra cũng có thể ít hơn hơn tốc độ mà bộ nhớ có thể chấp
nhận chúng, và các quầy hàng vẫn có thể xảy ra. Điều này có thể xảy ra khi các
bài viết xảy ra trong vụ nổ. Để giảm sự xuất hiện của các quầy hàng như vậy, bộ
xử lý thường tăng độ sâu của bộ đệm ghi ngoài một mục duy nhất.
viết lại Một kế hoạch xử Thay thế cho sơ đồ ghi qua là một sơ đồ được gọi viết lạiTrong sơ đồ ghi lại,
lý ghi bằng cách chỉ cập khi ghi xảy ra, giá trị mới chỉ được ghi vào khối trong bộ đệm. Khối sửa đổi được
nhật các giá trị cho khối viết ở cấp thấp hơn của hệ thống phân cấp khi nó được thay thế. Các sơ đồ ghi lại
trong bộ đệm, sau đó viết có thể cải thiện hiệu suất, đặc biệt là khi các bộ xử lý có thể tạo ghi nhanh hoặc
khối đã sửa đổi xuống nhanh hơn ghi có thể được xử lý bằng bộ nhớ chính; tuy nhiên, một sơ đồ ghi lại
cấp thấp hơn của hệ
thống phân cấp khi khối
phức tạp hơn để thực hiện hơn là viết qua.
được thay thế. Trong phần còn lại của phần này, chúng tôi mô tả bộ nhớ cache từ bộ xử lý
thực và chúng tôi kiểm tra cách chúng xử lý cả đọc và ghi. Trong Mục 5.8, chúng
tôi sẽ mô tả việc xử lý viết chi tiết hơn.
5.3 Khái niệm cơ bản về bộ nhớ cache 409

Xây dựng: Writes giới thiệu một số biến chứng vào bộ nhớ cache không có mặt
để đọc. Ở đây chúng tôi thảo luận về hai trong số đó: chính sách bỏ lỡ viết và thực
hiện hiệu quả ghi trong bộ nhớ ghi lại.
Hãy xem xét một lỗi trong bộ nhớ cache ghi qua. Chiến lược phổ biến nhất là phân
bổ một khối trong bộ đệm, được gọi viết phân bổ Khối được lấy từ bộ nhớ và sau đó
phần thích hợp của khối được ghi đè. Một chiến lược thay thế là cập nhật phần của
khối trong bộ nhớ nhưng không đặt nó vào bộ đệm, được gọi. không phân bổ
viếtĐộng lực là đôi khi các chương trình ghi toàn bộ khối dữ liệu, chẳng hạn như khi
hệ điều hành số không một trang bộ nhớ. Trong những trường hợp như vậy, việc tìm
nạp liên quan đến việc bỏ lỡ viết ban đầu có thể là không cần thiết. Một số máy tính
cho phép thay đổi chính sách phân bổ ghi trên cơ sở mỗi trang.
Trên thực tế, việc triển khai các cửa hàng một cách hiệu quả trong bộ đệm sử dụng
chiến lược ghi lại phức tạp hơn trong bộ đệm ghi qua. Bộ nhớ cache ghi có thể ghi dữ liệu
vào bộ đệm và đọc thẻ; nếu thẻ không phù hợp, thì xảy ra lỗi. Vì bộ đệm được ghi qua, nên
việc ghi đè của khối trong bộ đệm không phải là thảm họa, vì bộ nhớ có giá trị chính xác.
Trong bộ đệm ghi lại, trước tiên chúng ta phải ghi lại khối vào bộ nhớ nếu dữ liệu trong bộ
đệm được sửa đổi và chúng ta bị bỏ lỡ bộ đệm. Nếu chúng ta chỉ đơn giản là ghi đè lên
khối theo hướng dẫn của cửa hàng trước khi chúng ta biết liệu cửa hàng có đánh vào bộ
đệm hay không (như chúng ta có thể cho một bộ đệm ghi qua) chúng tôi sẽ phá hủy nội
dung của khối, không được sao lưu ở cấp thấp hơn tiếp theo của hệ thống phân cấp bộ
nhớ.
Trong bộ nhớ cache ghi lại, bởi vì chúng ta không thể ghi đè lên khối, các cửa
hàng yêu cầu hai chu kỳ (một chu kỳ để kiểm tra một hit theo sau là một chu kỳ để
thực sự ghi) hoặc yêu cầu bộ đệm ghi để giữ dữ liệu đó—có hiệu quả cho phép cửa
hàng chỉ mất một chu kỳ bằng cách đường ống nó. Khi sử dụng bộ đệm lưu trữ, bộ
xử lý sẽ tra cứu bộ đệm và đặt dữ liệu vào bộ đệm lưu trữ trong chu kỳ truy cập bộ
đệm thông thường. Giả sử một bộ đệm nhấn, dữ liệu mới được ghi từ bộ đệm lưu trữ
vào bộ đệm trong chu kỳ truy cập bộ đệm không sử dụng tiếp theo.
Để so sánh, trong bộ đệm ghi qua, việc ghi luôn có thể được thực hiện trong một
chu kỳ. Chúng tôi đọc thẻ và viết phần dữ liệu của khối đã chọn. Nếu thẻ khớp với địa
chỉ của khối được ghi, bộ xử lý có thể tiếp tục bình thường, vì khối chính xác đã được
cập nhật. Nếu thẻ không khớp, bộ xử lý sẽ tạo một lỗi ghi để lấy phần còn lại của khối
tương ứng với địa chỉ đó.
Nhiều bộ nhớ ghi lại cũng bao gồm bộ đệm ghi được sử dụng để giảm hình phạt
bỏ lỡ khi bỏ lỡ thay thế một khối được sửa đổi. Trong trường hợp như vậy, khối sửa
đổi được chuyển đến bộ đệm ghi lại được liên kết với bộ đệm trong khi khối được yêu
cầu được đọc từ bộ nhớ. Bộ đệm ghi lại sau đó được ghi lại vào bộ nhớ. Giả sử một
lần bỏ lỡ khác không xảy ra ngay lập tức, kỹ thuật này giảm một nửa hình phạt bỏ lỡ
khi phải thay thế một khối bẩn.

Bộ nhớ cache ví dụ: Bộ xử lý FastMATH nội tại


Intrinsity FastMATH là một bộ vi xử lý nhúng sử dụng kiến trúc MIPS và triển khai
bộ đệm đơn giản. Gần cuối chương, chúng tôi sẽ kiểm tra các thiết kế bộ đệm phức
tạp hơn của bộ vi xử lý ARM và Intel, nhưng chúng tôi bắt đầu với ví dụ đơn giản
nhưng thực tế này vì lý do sư phạm. Hình 5.12 hiển thị tổ chức bộ đệm dữ liệu
FastMATH Intrinsity.
410 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Địa chỉ (hiển thị vị trí bit)


31 14 13 65 210

18 số 8 Dữ
Đánh Thẻ 4 Byte liệu
Chỉ số bù đắp
Khối bù
18 bit 512 bit

Thẻ V Dữ liệu

256
mục

18 32 32 32

=
Mux
32

HÌNH 5.12 Bộ nhớ cache 16 KiB trong FastMATH Intrinsity mỗi bộ chứa 256 khối với 16 từ mỗi khối. Lưu ý rằng kích
thước địa chỉ cho máy tính này chỉ là 32 bit. Trường thẻ rộng 18 bit và trường chỉ mục rộng 8 bit, trong khi trường 4 bit (bit 5, 2) được sử
dụng để lập chỉ mục khối và chọn từ từ khối bằng bộ ghép kênh 16 đến 1. Trong thực tế, để loại bỏ bộ ghép kênh, bộ nhớ cache sử dụng
RAM lớn riêng cho dữ liệu và RAM nhỏ hơn cho các thẻ, với phần bù khối cung cấp các bit địa chỉ bổ sung cho RAM dữ liệu lớn. Trong
trường hợp này, RAM lớn rộng 32 bit và phải có số từ gấp 16 lần so với các khối trong bộ đệm.

Bộ xử lý này có một đường ống 12 giai đoạn. Khi hoạt động ở tốc độ cực đại,
bộ xử lý có thể yêu cầu cả từ hướng dẫn và từ dữ liệu trên mỗi đồng hồ. Để đáp
ứng nhu cầu của đường ống mà không bị đình trệ, các bộ nhớ hướng dẫn và dữ
liệu riêng biệt được sử dụng. Mỗi bộ đệm là 16 KiB, hoặc 4096 từ, với các khối
16 từ.
Đọc yêu cầu cho bộ đệm là đơn giản. Vì có bộ nhớ dữ liệu và bộ nhớ cache
lệnh riêng biệt, chúng tôi cần các tín hiệu điều khiển riêng để đọc và ghi từng bộ
đệm. (Hãy nhớ rằng chúng ta cần cập nhật bộ đệm lệnh khi xảy ra lỗi.) Do đó,
các bước cho yêu cầu đọc đến bộ đệm như sau :
1. Gửi địa chỉ đến bộ đệm thích hợp. Địa chỉ đến từ PC (cho một hướng dẫn)
hoặc từ ALU (cho dữ liệu).
2. Nếu tín hiệu bộ đệm nhấn, từ được yêu cầu có sẵn trên các dòng dữ liệu.
Vì có 16 từ trong khối mong muốn, chúng ta cần chọn đúng từ. Trường chỉ
mục khối được sử dụng để điều khiển bộ ghép kênh (hiển thị ở cuối hình),
chọn từ được yêu cầu từ 16 từ trong khối được lập chỉ mục.
5.3 Khái niệm cơ bản về bộ nhớ cache 411

Hướng dẫn bỏ lỡ tỷ lệ Dữ liệu bỏ lỡ tỷ lệ Tỷ lệ bỏ lỡ kết hợp hiệu quả


0,4% 11,4% 3,2%

HÌNH 5.13 Tốc độ bỏ lỡ dữ liệu và hướng dẫn gần đúng cho bộ xử lý FastMATH Intrinsity
cho điểm chuẩn CPU2000 của Spec. Tỷ lệ bỏ lỡ kết hợp là tỷ lệ bỏ lỡ hiệu quả nhìn thấy cho sự kết
hợp của bộ đệm lệnh 16 KiB và bộ đệm dữ liệu 16 KiB. Nó có được bằng cách cân các tỷ lệ bỏ lỡ hướng
dẫn và dữ liệu theo tần suất của hướng dẫn và tham chiếu dữ liệu.

3. Nếu tín hiệu bộ đệm bị bỏ lỡ, chúng tôi sẽ gửi địa chỉ đến bộ nhớ chính.
Khi bộ nhớ trở lại với dữ liệu, chúng tôi ghi nó vào bộ đệm và sau đó đọc
nó để thực hiện yêu cầu.
Đối với ghi, Intrinsity FastMATH cung cấp cả ghi và ghi lại, để hệ điều hành
quyết định sử dụng chiến lược nào cho ứng dụng. Nó có một bộ đệm ghi một
mục.
Tỷ lệ bỏ lỡ bộ đệm nào đạt được với cấu trúc bộ đệm như được sử dụng bởi
FastMATH Intrinsity? Hình 5.13 hiển thị tỷ lệ bỏ lỡ cho các bộ nhớ hướng dẫn
và dữ liệu. Tỷ lệ bỏ lỡ kết hợp là tỷ lệ bỏ lỡ hiệu quả trên mỗi tham chiếu cho
mỗi chương trình sau khi tính tần suất truy cập dữ liệu và hướng dẫn khác nhau.
Mặc dù tỷ lệ bỏ lỡ là một đặc điểm quan trọng của thiết kế bộ đệm, nhưng
biện pháp cuối cùng sẽ là hiệu ứng của hệ thống bộ nhớ đối với thời gian thực
hiện chương trình; chúng tôi sẽ thấy tốc độ bỏ lỡ và thời gian thực hiện có liên
quan trong thời gian ngắn.

Xây dựng: Một bộ đệm kết hợp với tổng kích thước bằng tổng của hai bộ đệm chia tay chia bộ nhớ cache
bộ nhớ cache thường sẽ có tỷ lệ trúng tốt hơn. Tỷ lệ cao hơn này xảy ra vì kết hợp bộ đệm Một kế hoạch trong đó
không phân chia chặt chẽ số lượng mục có thể được sử dụng theo hướng dẫn từ những một cấp độ của hệ
mục có thể được sử dụng bởi dữ liệu. Tuy nhiên, hầu hết tất cả các bộ xử lý ngày nay đều thống phân cấp bộ nhớ
sử dụng bộ nhớ chia hướng dẫn và bộ nhớ dữ liệu để tăng bộ nhớ cache băng thông để bao gồm hai bộ nhớ
phù hợp với những gì đường ống hiện đại mong đợi. (Cũng có thể có ít bỏ lỡ xung đột hơn; cache độc lập hoạt động
xem Mục 5.8). song song với nhau, với
Dưới đây là tỷ lệ bỏ lỡ cho bộ nhớ cache kích thước của bộ xử lý FastMATH Intrinsity một hướng dẫn xử lý và
và cho bộ đệm kết hợp có kích thước bằng tổng của hai bộ đệm : một dữ liệu xử lý.

■ Tổng kích thước bộ đệm: 32 KiB


■ Chia bộ nhớ cache tỷ lệ bỏ lỡ hiệu quả: 3,24%
■ Tỷ lệ bỏ lỡ bộ đệm kết hợp: 3,18%

Tỷ lệ bỏ lỡ của bộ đệm chia chỉ tệ hơn một chút.


Ưu điểm của việc nhân đôi băng thông bộ đệm, bằng cách hỗ trợ đồng thời cả
hướng dẫn và truy cập dữ liệu, dễ dàng khắc phục nhược điểm của tốc độ bỏ lỡ tăng
nhẹ. Quan sát này cảnh báo chúng tôi rằng chúng tôi không thể sử dụng tỷ lệ bỏ lỡ
làm thước đo duy nhất về hiệu suất bộ đệm, như Mục 5.4 chương trình.

Tóm tắt
Chúng tôi đã bắt đầu phần trước bằng cách kiểm tra bộ nhớ cache đơn giản nhất: bộ
đệm được ánh xạ trực tiếp với khối một từ. Trong bộ đệm như vậy, cả hai lần truy
cập và bỏ lỡ đều đơn giản, vì một từ có thể đi vào chính xác một vị trí và có một thẻ
riêng cho mỗi từ. Đến
412 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

giữ cho bộ nhớ cache và bộ nhớ nhất quán, có thể sử dụng sơ đồ ghi qua, để mỗi
lần ghi vào bộ nhớ cache cũng khiến bộ nhớ được cập nhật. Thay thế cho ghi qua
là một sơ đồ ghi lại sao chép một khối trở lại bộ nhớ khi nó được thay thế; chúng
tôi sẽ thảo luận thêm về sơ đồ này trong các phần sắp tới.
Để tận dụng địa phương không gian, bộ đệm phải có kích thước khối lớn hơn một
từ. Việc sử dụng một khối lớn hơn làm giảm tốc độ bỏ lỡ và cải thiện hiệu quả của
phần cứng bộ đệm bằng cách giảm lượng lưu trữ thẻ so với lượng lưu trữ dữ liệu
trong bộ đệm. Mặc dù kích thước khối lớn hơn làm giảm tỷ lệ bỏ lỡ, nhưng nó cũng
có thể làm tăng hình phạt bỏ lỡ. Nếu hình phạt bỏ lỡ tăng tuyến tính với kích thước
khối, các khối lớn hơn có thể dễ dàng dẫn đến hiệu suất thấp hơn.
Để tránh mất hiệu suất, băng thông của bộ nhớ chính được tăng lên để truyền
các khối bộ nhớ cache hiệu quả hơn. Các phương pháp phổ biến để tăng băng
thông bên ngoài cho DRAM đang làm cho bộ nhớ rộng hơn và xen kẽ. Các nhà
thiết kế DRAM đã dần cải thiện giao diện giữa bộ xử lý và bộ nhớ để tăng băng
thông của chuyển chế độ chụp để giảm chi phí cho các kích thước khối bộ đệm
lớn hơn.

Kiểm tra bản Tốc độ của hệ thống bộ nhớ ảnh hưởng đến quyết định của nhà thiết kế về
thân kích thước của khối bộ đệm. Những hướng dẫn thiết kế bộ đệm sau đây thường
hợp lệ?
1. Độ trễ bộ nhớ càng ngắn, khối bộ nhớ cache càng nhỏ.
2. Độ trễ bộ nhớ càng ngắn, khối bộ nhớ cache càng lớn.
3. Băng thông bộ nhớ càng cao, khối bộ nhớ cache càng nhỏ.
4. Băng thông bộ nhớ càng cao, khối bộ nhớ cache càng lớn.

Đo lường và cải thiện bộ nhớ


5.4
cache Hiệu suất

Trong phần này, chúng tôi bắt đầu bằng cách kiểm tra các cách để đo lường và
phân tích hiệu suất bộ đệm. Sau đó chúng tôi khám phá hai kỹ thuật khác nhau để
cải thiện hiệu suất bộ đệm. Người ta tập trung vào việc giảm tỷ lệ bỏ lỡ bằng
cách giảm xác suất hai khối bộ nhớ riêng biệt sẽ tranh chấp cho cùng một vị trí
bộ đệm. Kỹ thuật thứ hai làm giảm hình phạt bỏ lỡ bằng cách thêm một cấp độ bổ
sung vào hệ thống phân cấp. Kỹ thuật này, được gọi bộ nhớ đệm đa cấp, lần đầu
tiên xuất hiện trong các máy tính cao cấp được bán với giá hơn 100.000 đô la vào
năm 1990; kể từ đó, nó đã trở nên phổ biến trên các thiết bị di động cá nhân được
bán với giá vài trăm đô la!
Thời gian CPU có thể được chia thành các chu kỳ đồng hồ mà CPU dành để
thực hiện chương trình và các chu kỳ đồng hồ mà CPU dành để chờ hệ thống bộ
nhớ. Thông thường, chúng tôi giả định rằng chi phí truy cập bộ đệm là các lần
truy cập là một phần của chu kỳ thực thi CPU thông thường. Như thế,
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 413

Thời gian CPU = (Chu kỳ đồng hồ thực hiện CPU + Chu kỳ đồng hồ cài đặt bộ nhớ)
× Thời gian chu kỳ đồng hồ

Các chu kỳ đồng hồ cài đặt bộ nhớ chủ yếu đến từ các bộ nhớ cache và chúng tôi
đưa ra giả định đó ở đây. Chúng tôi cũng hạn chế thảo luận về một mô hình đơn
giản của hệ thống bộ nhớ. Trong bộ xử lý thực, các quầy hàng được tạo ra bởi
đọc và ghi có thể khá phức tạp và dự đoán hiệu suất chính xác thường yêu cầu
mô phỏng rất chi tiết về bộ xử lý và hệ thống bộ nhớ.
Các chu kỳ đồng hồ cài đặt bộ nhớ có thể được định nghĩa là tổng của các chu
kỳ gian hàng đến từ các lần đọc cộng với các chu kỳ đến từ ghi :
Chu kỳ đồng hồ cài đặt bộ nhớ = (Chu kỳ đọc-cài + Chu kỳ ghi cài đặt)

Các chu trình đọc cài đặt có thể được xác định theo số lượng truy cập đọc trên
mỗi chương trình, hình phạt bỏ lỡ trong các chu kỳ đồng hồ để đọc và tỷ lệ bỏ lỡ
đọc :

Đọc
Chu kỳ đọc-cài = Chương trình × Đọc tỷ lệ bỏ lỡ × Đọc bỏ lỡ hình phạt

Viết phức tạp hơn. Đối với sơ đồ ghi qua, chúng tôi có hai nguồn của các quầy hàng:
ghi bỏ lỡ, thường yêu cầu chúng tôi lấy khối trước khi tiếp tục ghi (xem Xây dựng
trên trang 413 để biết thêm chi tiết về cách xử lý ghi) và ghi các bộ đệm, xảy ra khi
bộ đệm ghi đầy khi ghi xảy ra. Do đó, các chu kỳ bị đình trệ để viết bằng tổng của
hai :
Viết
Chu kỳ viết-cài = × Viết tỷ lệ bỏ lỡ × Viết bỏ lỡ hình phạt
Chương
trình quầy hàng
+ Viết
Bởi vì các bộ đệm ghi phụ thuộc vào độ gần của ghi và không chỉ tần số,
không thể đưa ra một phương trình đơn giản để tính toán các gian hàng đó. May
mắn thay, trong các hệ thống có độ sâu bộ đệm ghi hợp lý (ví dụ:., bốn hoặc
nhiều từ) và bộ nhớ có khả năng chấp nhận ghi ở tốc độ vượt quá tần số ghi trung
bình trong các chương trình (ví dụ:., theo hệ số 2), các quầy đệm ghi sẽ nhỏ và
chúng ta có thể bỏ qua chúng một cách an toàn. Nếu một hệ thống không đáp ứng
các tiêu chí này, nó sẽ không được thiết kế tốt; thay vào đó, nhà thiết kế nên sử
dụng bộ đệm ghi sâu hơn hoặc tổ chức ghi lại.
Các lược đồ ghi lại cũng có các ngăn bổ sung tiềm năng phát sinh từ nhu cầu
ghi lại khối bộ nhớ cache vào bộ nhớ khi khối được thay thế. Chúng tôi sẽ thảo
luận thêm về điều này Mục 5.8.
Trong hầu hết các tổ chức bộ nhớ cache ghi qua, các hình phạt ghi và ghi bỏ lỡ là
như nhau (thời gian để lấy khối từ bộ nhớ). Nếu chúng ta cho rằng viết
414 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

các quầy hàng đệm không đáng kể, chúng tôi có thể kết hợp đọc và ghi bằng
cách sử dụng một tỷ lệ bỏ lỡ duy nhất và hình phạt bỏ lỡ :
Chu kỳ đồng hồ cài đặt bộ Bộ nhớ truy cập × Tỷ lệ hoa hậu × Hoa hậu
nhớ = phạt
Chương
trình

Chúng tôi cũng có thể yếu tố này là


Chu kỳ đồng hồ cài đặt bộ Hướng dẫn Cô
nhớ = Chương × × Hoa hậu phạt
trình Hướng dẫn

Hãy xem xét một ví dụ đơn giản để giúp chúng tôi hiểu tác động của hiệu suất bộ
đệm đối với hiệu suất của bộ xử lý.

Tính toán hiệu suất bộ đệm

Giả sử tỷ lệ bỏ lỡ của bộ đệm lệnh là 2% và tỷ lệ bỏ lỡ của bộ đệm dữ liệu là


VÍ DỤ 4%. Nếu bộ xử lý có CPI là 2 mà không có bất kỳ bộ nhớ nào và hình phạt
bỏ lỡ là 100 chu kỳ cho tất cả các lần bỏ lỡ, hãy xác định bộ xử lý sẽ chạy
nhanh hơn bao nhiêu với bộ đệm hoàn hảo không bao giờ bỏ lỡ. Giả sử tần
suất của tất cả các tải và cửa hàng là 36%.

Số chu kỳ bỏ lỡ bộ nhớ cho các hướng dẫn về số lượng Hướng dẫn (I) là
TRẢ LỜI Hướng dẫn bỏ lỡ chu kỳ = TÔI × 2% × 100 = 2.00 × TÔI

Vì tần số của tất cả các tải và lưu trữ là 36%, chúng ta có thể tìm thấy số chu
kỳ bỏ lỡ bộ nhớ để tham khảo dữ liệu :
Dữ liệu bỏ lỡ chu kỳ = TÔI × 36% × 4% × 100 = 1.44 × TÔI

Tổng số chu kỳ cài đặt bộ nhớ là 2,00 I + 1,44 I = 3,44 I. Đây là hơn ba chu
kỳ của bộ nhớ mỗi lệnh. Theo đó, tổng CPI bao gồm các quầy bộ nhớ là 2 +
3,44 = 5,44. Vì không có thay đổi về số lượng lệnh hoặc tốc độ xung nhịp,
nên tỷ lệ thời gian thực hiện CPU là
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 415

Thời gian CPU với các quầy TÔI × CPIgian hàng ×


hàng Chu kỳ đồng hồ

Thời gian CPU với bộ đệm TÔI × CPIhoàn hảo × Chu


hoàn hảo = kỳ đồng hồ
CPI
gian

= hàng = 5.44
CPI
hoàn

hảo 2
5. 44
Hiệu suất với bộ nhớ cache hoàn hảo là tốt hơn bởi 2 = 2,72.

Điều gì xảy ra nếu bộ xử lý được thực hiện nhanh hơn, nhưng hệ thống bộ nhớ
thì không? Lượng thời gian dành cho các quầy bộ nhớ sẽ chiếm một phần ngày
càng tăng của thời gian thực hiện; Luật Amdahl, mà chúng tôi đã xem xét
Chương 1, nhắc nhở chúng ta về thực tế này. Một vài ví dụ đơn giản cho thấy
vấn đề này có thể nghiêm trọng đến mức nào. Giả sử chúng ta tăng tốc máy tính
trong ví dụ trước bằng cách giảm CPI của nó từ 2 xuống 1 mà không thay đổi tốc
độ đồng hồ, điều này có thể được thực hiện với một đường ống được cải thiện.
Hệ thống có bộ nhớ cache sau đó sẽ có CPI là 1 + 3,44 = 4,44 và hệ thống có bộ
đệm hoàn hảo sẽ có
4. 44
1 = Nhanh gấp 4,44 lần.
Lượng thời gian thực hiện dành cho các quầy bộ nhớ sẽ tăng lên từ đó
3 . 44
5 . 44 = 63%

đến 3,44
= 77%
4.44
Tương tự, tăng tốc độ đồng hồ mà không thay đổi hệ thống bộ nhớ cũng làm tăng
hiệu suất bị mất do bỏ lỡ bộ nhớ cache.
Các ví dụ và phương trình trước cho rằng thời gian nhấn không phải là yếu tố quyết
định hiệu suất bộ đệm. Rõ ràng, nếu thời gian nhấn tăng lên, tổng thời gian để truy cập
một từ từ hệ thống bộ nhớ sẽ tăng lên, có thể gây ra sự gia tăng thời gian chu kỳ bộ xử lý.
Mặc dù chúng ta sẽ thấy các ví dụ bổ sung về những gì có thể tăng thời gian nhấn trong
thời gian ngắn, một ví dụ là tăng kích thước bộ đệm. Một bộ đệm lớn hơn rõ ràng có thể
có thời gian truy cập lớn hơn, giống như, nếu bàn của bạn trong thư viện rất lớn (giả sử, 3
mét vuông), sẽ mất nhiều thời gian hơn để đặt một cuốn sách trên bàn. Sự gia tăng thời
gian nhấn có thể thêm một giai đoạn khác vào đường ống, vì nó có thể mất nhiều chu kỳ
cho một lần nhấn bộ đệm. Mặc dù việc tính toán tác động hiệu suất của đường ống sâu
hơn là phức tạp hơn, nhưng đến một lúc nào đó, việc tăng thời gian nhấn cho bộ đệm lớn
hơn có thể chi phối sự cải thiện tốc độ nhấn, dẫn đến giảm hiệu suất của bộ xử lý.
Để nắm bắt thực tế rằng thời gian truy cập dữ liệu cho cả lượt truy cập và lần
bỏ lỡ ảnh hưởng đến hiệu suất, đôi khi các nhà thiết kế sử dụng thời gian truy
cập bộ nhớ trung bình (AMAT) như một cách để kiểm tra các thiết kế bộ nhớ
cache thay thế. Thời gian truy cập bộ nhớ trung bình là
416 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

thời gian trung bình để truy cập bộ nhớ xem xét cả lượt truy cập và bỏ lỡ và tần
suất truy cập khác nhau; nó bằng với những điều sau đây :
TUYỆT VỜI = Thời gian cho một hit + Tỷ lệ hoa hậu × Hoa hậu
phạt

Tính thời gian truy cập bộ nhớ trung bình

Tìm AMAT cho bộ xử lý có thời gian chu kỳ xung nhịp 1 ns, hình phạt bỏ lỡ
VÍ DỤ là 20 chu kỳ đồng hồ, tốc độ bỏ lỡ 0,05 lần bỏ lỡ cho mỗi hướng dẫn và thời
gian truy cập bộ đệm (bao gồm cả phát hiện hit) của 1 chu kỳ đồng hồ. Giả
sử rằng các hình phạt đọc và viết bỏ lỡ là như nhau và bỏ qua các quầy hàng
viết khác.
TRẢ LỜI
Thời gian truy cập bộ nhớ trung bình cho mỗi hướng dẫn là

TUYỆT VỜI = Thời gian cho một hit + Tỷ lệ hoa hậu × Hoa hậu
phạt
= 1 0,05 × 20
= 2 chu kỳ đồng hồ

hoặc 2 ns.
Tiểu mục tiếp theo thảo luận về các tổ chức bộ nhớ cache thay thế làm giảm tỷ
lệ bỏ lỡ nhưng đôi khi có thể tăng thời gian truy cập; ví dụ bổ sung xuất hiện
trong Mục 5.16.
trong đó mỗi khối có thể được đặt.

bộ nhớ cache liên kết


đầy đủ Một cấu trúc bộ
đệm trong đó một khối
có thể được đặt ở bất kỳ
vị trí nào trong bộ đệm.

bộ đệm tập hợp Một


bộ đệm có số lượng vị
trí cố định (ít nhất hai)
Giảm bất kỳ mục nào trong bộ đệm. Để tìm một khối nhất định trong bộ đệm kết hợp
các lần đầy đủ, tất cả các mục trong bộ đệm phải được tìm kiếm vì một khối có thể được
đặt trong bất kỳ một khối nào. Để làm cho tìm kiếm thực tế, nó được thực hiện
bỏ lỡ song song với một bộ so sánh được liên kết với mỗi mục nhập bộ đệm. Các bộ so
bộ nhớ sánh này làm tăng đáng kể chi phí phần cứng, làm cho vị trí kết hợp hoàn toàn
cache thực tế chỉ dành cho bộ nhớ cache với số lượng nhỏ các khối.
bằng Phạm vi giữa của các thiết kế giữa ánh xạ trực tiếp và liên kết đầy đủ được gọi
cách đặt liên kếtTrong bộ đệm liên kết tập hợp, có một số cố định.
đặt các
khối
linh
hoạt
hơn
Cho đến nay, khi
chúng ta đặt một
khối trong bộ đệm,
chúng ta đã sử dụng
một sơ đồ vị trí đơn
giản: Một khối có
thể đi chính xác một
vị trí trong bộ đệm.
Như đã đề cập trước
đó, nó được gọi lập
bản đồ trực tiếp bởi
vì có một ánh xạ
trực tiếp từ bất kỳ
địa chỉ khối nào
trong bộ nhớ đến
một vị trí duy nhất ở
cấp trên của hệ
thống phân cấp. Tuy
nhiên, thực sự có
một loạt các sơ đồ
để đặt các khối. Ánh
xạ trực tiếp, trong đó
một khối có thể
được đặt ở chính xác
một vị trí, ở một cực
điểm.
Ở cực điểm khác
là một sơ đồ nơi một
khối có thể được đặt
vào bất kỳ vị trí
trong bộ đệm. Một
kế hoạch như vậy
được gọi hoàn toàn
liên kết, bởi vì một
khối trong bộ nhớ có
thể được liên kết với
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 417

vị trí nơi mỗi khối có thể được đặt. Một bộ đệm tập hợp với n vị trí cho một khối
được gọi là an nbộ đệm tập hợp. An nbộ đệm liên kết tập hợp bao gồm một số bộ,
mỗi bộ bao gồm n khối. Mỗi khối trong bản đồ bộ nhớ thành một duy nhất bộ
trong bộ đệm được cung cấp bởi trường chỉ mục và một khối có thể được đặt vào
bất kỳ phần tử của tập hợp đó. Do đó, vị trí liên kết tập hợp kết hợp vị trí được
ánh xạ trực tiếp và vị trí kết hợp đầy đủ: một khối được ánh xạ trực tiếp vào một
tập hợp, và sau đó tất cả các khối trong tập hợp được tìm kiếm cho một trận đấu.
Ví dụ, Hình 5.14 cho thấy khối 12 có thể được đặt trong bộ đệm với tổng số tám
khối, theo chính sách vị trí ba khối.
Hãy nhớ rằng trong bộ đệm được ánh xạ trực tiếp, vị trí của khối bộ nhớ được
đưa ra
(Số khối) modulo (Số lượng khối trong bộ nhớ cache)

Trong bộ đệm liên kết tập hợp, tập hợp chứa khối bộ nhớ được cung cấp bởi

(Số khối) modulo (Số lượng bộ trong bộ nhớ cache)

Vì khối có thể được đặt trong bất kỳ phần tử nào của tập hợp , tất cả các thẻ của
tất cả các yếu tố của bộ phải được tìm kiếm. Trong bộ đệm kết hợp đầy đủ, khối
có thể đi bất cứ đâu , và tất cả các thẻ của tất cả các khối trong bộ đệm phải
được tìm kiếm.
Chúng ta cũng có thể nghĩ về tất cả các chiến lược vị trí khối như là một biến thể
của tính liên kết tập hợp. Hình 5.15 hiển thị các cấu trúc liên kết có thể cho bộ đệm
tám khối. Bộ nhớ cache được ánh xạ trực tiếp chỉ là bộ đệm liên kết tập hợp một
chiều: mỗi mục bộ đệm chứa một khối và mỗi bộ có một phần tử. Một bộ đệm liên
kết đầy đủ

Lập bản đồ Đặt liên kết Hoàn toàn liên kết


trực tiếp
Đặt # 0 1
Khối # 01234567 2 3

Dữ liệu
Dữ liệu Dữ liệu

1 1
Thẻ
1 Thẻ 2
Thẻ
2 2
Tìm kiếm
Tìm kiếm Tìm kiếm

HÌNH 5.14 Vị trí của khối bộ nhớ có địa chỉ là 12 trong bộ đệm với tám khối thay đổi cho vị
trí được ánh xạ trực tiếp, liên kết tập hợp và kết hợp đầy đủ. Trong vị trí được ánh xạ trực tiếp,
chỉ có một khối bộ đệm nơi có thể tìm thấy khối bộ nhớ 12 và khối đó được đưa ra bởi (12 modulo 8) = 4.
Trong bộ đệm liên kết tập hợp hai chiều, sẽ có bốn bộ và khối bộ nhớ 12 phải được đặt (12 mod 4) = 0;
khối bộ nhớ có thể ở một trong hai phần tử của tập hợp. Trong một vị trí kết hợp đầy đủ, khối bộ nhớ cho
địa chỉ khối 12 có thể xuất hiện trong bất kỳ tám khối bộ đệm nào.
418 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Một chiều đặt liên kết


(lập bản đồ trực tiếp)
Bộ Thẻ Dữ liệu
0
Bộ hai chiều liên kết
1
2 Bộ Dữ liệu thẻ dữ liệu thẻ
0
3
1
4
2
5
3
6
7

Bốn chiều thiết lập liên kết

Bộ Thẻ Dữ liệu thẻ dữ liệu Dữ liệu thẻ dữ liệu thẻ


0
1

Tám chiều thiết lập liên kết (hoàn toàn liên kết)

Thẻ Thẻ dữ liệu Dữ liệu Thẻ Thẻ dữ liệu Dữ liệu Thẻ Thẻ dữ
liệu Dữ liệu Thẻ Thẻ dữ liệu Dữ liệu

HÌNH 5.15 Một bộ đệm tám khối được cấu hình dưới dạng liên kết trực tiếp, hai chiều, liên
kết bốn chiều và liên kết đầy đủ. Tổng kích thước của bộ đệm trong các khối bằng nhau số lượng bộ
nhân với sự liên kết. Do đó, đối với kích thước bộ đệm cố định, việc tăng tính liên kết sẽ làm giảm số
lượng bộ trong khi tăng số lượng phần tử trên mỗi bộ. Với tám khối, bộ đệm tập hợp tám chiều giống như
bộ đệm liên kết đầy đủ.

với m mục đơn giản là một mbộ đệm tập hợp -way; nó có một bộ với m các khối
và một mục có thể nằm trong bất kỳ khối nào trong tập hợp đó.
Ưu điểm của việc tăng mức độ liên kết là nó thường làm giảm tỷ lệ bỏ lỡ, như
ví dụ tiếp theo cho thấy. Nhược điểm chính, mà chúng tôi thảo luận chi tiết hơn
trong thời gian ngắn, là sự gia tăng tiềm năng trong thời gian tới.

Hoa hậu và sự liên kết trong bộ nhớ cache

VÍ DỤ Giả sử có ba bộ nhớ cache nhỏ, mỗi bộ bao gồm bốn khối một từ. Một bộ đệm
được liên kết đầy đủ, một bộ thứ hai là liên kết hai chiều và bộ thứ ba được ánh
xạ trực tiếp. Tìm số lần bỏ lỡ cho mỗi tổ chức bộ đệm được cung cấp theo trình
tự địa chỉ khối sau: 0, 8, 0, 6 và 8.
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 419

6
Các trường hợp ánh xạ trực tiếp là dễ nhất. Trước tiên, hãy để xác định bộ số 8

đệm nào chặn từng bản đồ địa chỉ khối :

Địa chỉ khối Khối bộ nhớ cache


0 (0 modulo 4) = 0
6 (6 modulo 4) = 2
số 8 (8 modulo 4) = 0

Bây giờ chúng ta có thể điền vào nội dung bộ đệm sau mỗi tham chiếu, sử
dụng một mục trống để có nghĩa là khối đó không hợp lệ, văn bản được tô
màu để hiển thị một mục mới được thêm vào bộ đệm cho tham chiếu được
liên kết và văn bản thuần để hiển thị một mục cũ trong bộ nhớ cache:

Nội dung của các khối bộ nhớ cache sau khi


Địa chỉ bộ nhớ Đánh tham khảo
hoặc bỏ
truy cập khối lỡ 0 1 2 3
0 bỏ lỡ Bộ nhớ [0]
số 8 bỏ lỡ Ký ức [8]
0 bỏ lỡ Bộ nhớ [0]
6 bỏ lỡ Bộ nhớ [0] Ký ức [6]
số 8 bỏ lỡ Ký ức [8] Ký ức [6]

Bộ nhớ cache được ánh xạ trực tiếp tạo ra năm lần bỏ lỡ cho năm truy cập.
Bộ đệm liên kết tập hợp có hai bộ (với các chỉ số 0 và 1) với hai phần tử
trên mỗi bộ. Trước tiên, hãy xác định cách đặt từng bản đồ địa chỉ khối :

Địa chỉ khối Bộ đệm


0 (0 modulo 2) = 0
6 (6 modulo 2) = 0
số 8 (8 modulo 2) = 0

Bởi vì chúng tôi có một lựa chọn về mục nhập nào trong một tập hợp để thay
thế trên một lỗi, chúng tôi cần một quy tắc thay thế. Bộ nhớ cache tập trung
thường thay thế ít nhất là gần đây đã sử dụng khối trong một tập hợp; đó là,
khối được sử dụng xa nhất trong quá khứ được thay thế. (Chúng tôi sẽ thảo
luận về các quy tắc thay thế khác chi tiết hơn trong thời gian ngắn.) Sử dụng
quy tắc thay thế này, nội dung của bộ đệm liên kết tập hợp sau mỗi tham
chiếu trông như thế này :

Nội dung của các khối bộ nhớ cache sau khi


Địa chỉ bộ nhớ Đánh tham khảo
hoặc bỏ
truy cập khối lỡ Đặt 0 Đặt 0 Đặt 1 Đặt 1
0 bỏ lỡ Bộ nhớ [0]
số 8 bỏ lỡ Bộ nhớ [0] Ký ức [8]
0 đánh Bộ nhớ [0] Ký ức [8]
TRẢ LỜI
420 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Lưu ý rằng khi khối 6 được tham chiếu, nó sẽ thay thế khối 8, vì khối 8 gần
đây ít được tham chiếu hơn khối 0. Bộ đệm liên kết tập hợp hai chiều có bốn
lỗi, ít hơn một bộ đệm được ánh xạ trực tiếp.
Bộ đệm kết hợp đầy đủ có bốn khối bộ đệm (trong một bộ); bất kỳ khối
bộ nhớ có thể được lưu trữ trong bất kỳ khối bộ đệm. Bộ đệm kết hợp đầy đủ
có hiệu suất tốt nhất, chỉ có ba lần bỏ lỡ :

Địa chỉ bộ nhớ Đánh Nội dung của các khối bộ nhớ cache sau khi
tham khảo
truy cập khối hoặc
bỏ lỡ Khối 0 Khối 1 Khối 2 Khối 3
0 bỏ lỡ Bộ nhớ [0]
số 8 bỏ lỡ Bộ nhớ [0] Ký ức [8]
0 đánh Bộ nhớ [0] Ký ức [8]
6 bỏ lỡ Bộ nhớ [0] Ký ức [8] Ký ức [6]
số 8 đánh Bộ nhớ [0] Ký ức [8] Ký ức [6]

Đối với loạt tài liệu tham khảo này, ba lần bỏ lỡ là điều tốt nhất chúng ta có
thể làm, bởi vì ba địa chỉ khối duy nhất được truy cập. Lưu ý rằng nếu chúng tôi
có tám khối trong bộ đệm, sẽ không có sự thay thế nào trong bộ đệm liên kết tập
hợp hai chiều (tự kiểm tra phần này) và nó sẽ có cùng số lần bỏ lỡ như bộ đệm
liên kết đầy đủ. Tương tự, nếu chúng ta có 16 khối, cả ba bộ nhớ sẽ có số lần bỏ
lỡ giống hệt nhau. Ngay cả ví dụ tầm thường này cho thấy kích thước bộ đệm và
tính liên kết không độc lập trong việc xác định hiệu suất bộ đệm.

Bao nhiêu giảm tỷ lệ bỏ lỡ đạt được bằng cách liên kết? Hình 5.16 cho thấy sự
cải thiện cho bộ đệm dữ liệu 64 KiB với khối 16 từ và tính liên kết khác nhau, từ
ánh xạ trực tiếp đến tám chiều. Đi từ liên kết một chiều đến hai chiều làm giảm
tỷ lệ bỏ lỡ khoảng 15%, nhưng có rất ít cải thiện hơn nữa trong việc đi đến khả
năng liên kết cao hơn.

Xác định vị trí một khối trong bộ đệm


Bây giờ, hãy để xem xét nhiệm vụ tìm một khối trong bộ đệm được đặt liên kết.
Giống như trong bộ đệm được ánh xạ trực tiếp, mỗi khối trong bộ đệm liên kết
tập hợp bao gồm thẻ địa chỉ cung cấp địa chỉ khối. Thẻ của mọi khối bộ đệm
trong tập hợp thích hợp được kiểm tra để xem nó có khớp với địa chỉ khối từ
không

Liên kết Dữ liệu bỏ lỡ tỷ lệ


1 10,3%
2 8,6%
4 8,3%
số 8 8,1%

HÌNH 5.16 Tỷ lệ bỏ lỡ bộ đệm dữ liệu cho một tổ chức như bộ xử lý FastMATH Intrinsity
cho các điểm chuẩn của CPU2000 với tính liên kết thay đổi từ một chiều đến tám chiều.
Những kết quả này cho 10 chương trình CPU2000 của Spec là từ Hennessy và Patterson (2003).
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 421

Thẻ Chỉ Khối bù


số
HÌNH 5.17 Ba phần của một địa chỉ trong bộ đệm được đặt liên kết hoặc ánh xạ trực tiếp.
Chỉ mục được sử dụng để chọn tập hợp, sau đó thẻ được sử dụng để chọn khối bằng cách so sánh với các
khối trong tập đã chọn. Phần bù khối là địa chỉ của dữ liệu mong muốn trong khối.

bộ xử lý. Hình 5.17 phân hủy địa chỉ. Giá trị chỉ mục được sử dụng để chọn tập
hợp chứa địa chỉ quan tâm và các thẻ của tất cả các khối trong tập hợp phải được
tìm kiếm. Vì tốc độ là điều cốt yếu, tất cả các thẻ trong tập đã chọn được tìm
kiếm song song. Như trong bộ đệm kết hợp đầy đủ, tìm kiếm tuần tự sẽ làm cho
thời gian nhấn của bộ đệm liên kết tập hợp quá chậm.
Nếu tổng kích thước bộ đệm được giữ nguyên, tăng tính liên kết làm tăng số lượng
khối trên mỗi bộ, đó là số lượng so sánh đồng thời cần thiết để thực hiện tìm kiếm
song song: mỗi lần tăng theo hệ số 2 trong tính liên kết nhân đôi số khối trên mỗi bộ
và giảm một nửa số bộ. Theo đó, mỗi yếu tố tăng 2 trong khả năng kết hợp làm giảm
kích thước của chỉ mục xuống 1 bit và mở rộng kích thước của thẻ thêm 1 bit. Trong
bộ đệm kết hợp đầy đủ, thực tế chỉ có một bộ và tất cả các khối phải được kiểm tra
song song. Do đó, không có chỉ mục và toàn bộ địa chỉ, ngoại trừ phần bù khối, được
so sánh với thẻ của mỗi khối. Nói cách khác, chúng tôi tìm kiếm bộ đệm đầy đủ mà
không cần lập chỉ mục.
Trong bộ đệm được ánh xạ trực tiếp, chỉ cần một bộ so sánh duy nhất, bởi vì mục nhập
chỉ có thể ở một khối và chúng tôi truy cập bộ đệm chỉ bằng cách lập chỉ mục. Hình 5.18
cho thấy rằng trong bộ đệm liên kết tập hợp bốn chiều, cần có bốn bộ so sánh, cùng với
bộ ghép kênh 4 trên 1 để chọn trong số bốn thành viên tiềm năng của tập hợp đã chọn.
Truy cập bộ đệm bao gồm lập chỉ mục bộ thích hợp và sau đó tìm kiếm các thẻ của bộ.
Các chi phí của bộ đệm kết hợp là các bộ so sánh bổ sung và bất kỳ độ trễ nào được áp
dụng bằng cách phải thực hiện so sánh và chọn trong số các yếu tố của bộ.
Sự lựa chọn giữa ánh xạ trực tiếp, liên kết tập hợp hoặc ánh xạ liên kết đầy đủ
trong bất kỳ hệ thống phân cấp bộ nhớ nào sẽ phụ thuộc vào chi phí bỏ lỡ so với
chi phí thực hiện liên kết, cả về thời gian và phần cứng bổ sung.

Xây dựng: A Bộ nhớ địa chỉ nội dung (CAM) là một mạch kết hợp so sánh và lưu
trữ trong một thiết bị duy nhất. Thay vì cung cấp địa chỉ và đọc một từ như RAM, bạn
gửi dữ liệu và CAM tìm xem nó có bản sao và trả về chỉ mục của hàng khớp không.
CAM có nghĩa là các nhà thiết kế bộ đệm có thể đủ khả năng để thực hiện tính liên
kết tập hợp cao hơn nhiều so với khi họ cần xây dựng phần cứng từ SRAM và bộ so
sánh. Vào năm 2020, kích thước và sức mạnh lớn hơn của CAM thường dẫn đến
tính liên kết hai chiều và bốn chiều được xây dựng từ các SRAM và bộ so sánh tiêu
chuẩn, với tám chiều trở lên được xây dựng bằng CAM.

Chọn khối nào để thay thế


Khi bỏ lỡ xảy ra trong bộ đệm được ánh xạ trực tiếp, khối được yêu cầu có thể đi
vào chính xác một vị trí và khối chiếm vị trí đó phải được thay thế. Trong bộ
đệm kết hợp, chúng tôi có lựa chọn nơi đặt khối được yêu cầu và
422 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Địa chỉ
31 30 12111098 3210

22 số 8
Thẻ
Chỉ
số
Dữ
Chỉ số dữ liệu thẻ V Dữ liệu thẻ V Dữ liệu thẻ V Thẻ V liệu
0
1
2

253
254
255
22 32

= = = =

Bộ ghép kênh 4 trên 1

Đánh Dữ liệu

HÌNH 5.18 Việc triển khai bộ đệm tập hợp bốn chiều đòi hỏi bốn bộ so sánh và bộ ghép
kênh 4 trên 1. Các bộ so sánh xác định phần tử nào của tập hợp đã chọn (nếu có) khớp với thẻ. Đầu ra
của các bộ so sánh được sử dụng để chọn dữ liệu từ một trong bốn khối của tập được lập chỉ mục, sử dụng
bộ ghép kênh với tín hiệu chọn được giải mã. Trong một số triển khai, Đầu ra cho phép tín hiệu trên các
phần dữ liệu của RAM bộ đệm có thể được sử dụng để chọn mục nhập trong tập hợp điều khiển đầu ra.
Tín hiệu cho phép đầu ra đến từ các bộ so sánh, khiến phần tử khớp với ổ đĩa đầu ra dữ liệu. Tổ chức này
loại bỏ sự cần thiết của bộ ghép kênh.

do đó một sự lựa chọn của khối để thay thế. Trong bộ đệm kết hợp đầy đủ, tất cả
các khối là ứng cử viên để thay thế. Trong bộ đệm liên kết tập hợp, chúng ta phải
chọn trong số các khối trong tập đã chọn.
ít được sử dụng gần Đề án được sử dụng phổ biến nhất là ít được sử dụng gần đây (LRU), mà
đây (LRU) Một sự thay chúng tôi đã sử dụng trong ví dụ trước. Trong sơ đồ LRU, khối được thay thế là
thế sơ đồ trong đó khối khối đã không được sử dụng trong thời gian dài nhất. Ví dụ liên kết tập hợp trên
được thay thế là khối đã trang 419 sử dụng LRU, đó là lý do tại sao chúng tôi thay thế Bộ nhớ (0) thay vì
được sử dụng trong thời
Bộ nhớ (6).
gian dài nhất.
Thay thế LRU được thực hiện bằng cách theo dõi khi nào mỗi phần tử trong một
tập hợp được sử dụng so với các phần tử khác trong tập hợp. Đối với bộ đệm liên kết
tập hợp hai chiều, theo dõi khi hai phần tử được sử dụng có thể được thực hiện bằng
cách giữ một bit trong mỗi tập hợp và đặt bit để chỉ ra một phần tử bất cứ khi nào
phần tử đó được tham chiếu. Khi sự liên kết tăng lên, việc thực hiện LRU trở nên khó
khăn hơn; trong Mục 5.8, chúng ta sẽ thấy một kế hoạch thay thế để thay thế.
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 423

Kích thước của Thẻ so với Đặt liên kết

Tăng tính liên kết đòi hỏi nhiều so sánh hơn và nhiều bit thẻ hơn cho mỗi
khối bộ đệm. Giả sử bộ đệm gồm 4096 khối, kích thước khối bốn từ và địa VÍ DỤ
chỉ 32 bit, tìm tổng số bộ và tổng số bit thẻ cho bộ đệm được ánh xạ trực tiếp,
hai chiều và bốn chiều đặt liên kết, và liên kết đầy đủ.

Vì có 16 (= 24) byte trên mỗi khối, địa chỉ 32 bit mang lại 32 - 4 = 28 bit
được sử dụng cho chỉ mục và thẻ. Bộ đệm được ánh xạ trực tiếp có cùng số
bộ với các khối và do đó có 12 bit chỉ mục, kể từ khi đăng nhập2(4096) = 12; TRẢ LỜI
do đó, tổng số là (28 - 12) × 4096 = 16 × 4096 = 66 K bit thẻ.
Mỗi mức độ kết hợp làm giảm số lượng bộ theo hệ số 2 và do đó làm
giảm số bit được sử dụng để lập chỉ mục bộ đệm xuống 1 và tăng số bit trong
thẻ lên 1. Do đó, đối với bộ đệm liên kết tập hợp hai chiều, có 2048 bộ và
tổng số bit thẻ là (28 - 11) × 2 × 2048 = 34 × 2048 = 70 Kbit. Đối với bộ
đệm liên kết tập hợp bốn chiều, tổng số bộ là 1024 và tổng số là (28 - 10) × 4
× 1024 = 72 × 1024 = 74 K bit thẻ.
Đối với bộ đệm kết hợp đầy đủ, chỉ có một bộ với 4096 khối và thẻ là 28
bit, dẫn đến các bit thẻ 28 × 4096 × 1 = 115 K.

Giảm hình phạt Hoa hậu bằng cách sử dụng bộ nhớ cache đa cấp
Tất cả các máy tính hiện đại sử dụng bộ nhớ cache. Để thu hẹp khoảng cách hơn
nữa giữa tốc độ đồng hồ nhanh của bộ xử lý hiện đại và thời gian ngày càng dài
cần thiết để truy cập DRAM, hầu hết các bộ vi xử lý đều hỗ trợ thêm một cấp độ
bộ nhớ đệm. Bộ đệm cấp hai này thường nằm trên cùng một chip và được truy
cập bất cứ khi nào xảy ra lỗi trong bộ đệm chính. Nếu bộ đệm cấp hai chứa dữ
liệu mong muốn, hình phạt bỏ lỡ cho bộ đệm cấp một về cơ bản sẽ là thời gian
truy cập của bộ đệm cấp hai, sẽ ít hơn nhiều so với thời gian truy cập của bộ nhớ
chính. Nếu cả bộ đệm chính và bộ đệm phụ không chứa dữ liệu, thì cần phải có
quyền truy cập bộ nhớ chính và hình phạt bỏ lỡ lớn hơn.
Làm thế nào quan trọng là cải thiện hiệu suất từ việc sử dụng bộ đệm thứ cấp?
Ví dụ tiếp theo cho chúng ta thấy.

Hiệu suất của bộ nhớ cache đa cấp

Giả sử chúng ta có bộ xử lý có CPI cơ bản là 1.0, giả sử tất cả các tham


chiếu đều nhấn trong bộ đệm chính và tốc độ xung nhịp là 4 GHz. Giả sử VÍ DỤ
thời gian truy cập bộ nhớ chính là 100 ns, bao gồm tất cả các xử lý bỏ lỡ. Giả
sử tỷ lệ bỏ lỡ
424 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

mỗi hướng dẫn tại bộ đệm chính là 2%. Bộ xử lý sẽ nhanh hơn bao nhiêu nếu
chúng ta thêm bộ đệm thứ cấp có thời gian truy cập 5-ns cho một lần nhấn hoặc
bỏ lỡ và đủ lớn để giảm tỷ lệ bỏ lỡ xuống bộ nhớ chính xuống 0,5%?

Các hình phạt bỏ lỡ để nhớ chính là


TRẢ LỜI
100 ns = 400 chu kỳ đồng
ns hồ
chu kỳ
0,25 đồng hồ
CPI hiệu quả với một cấp độ bộ nhớ đệm được đưa ra bởi
Tổng CPI = CPI cơ sở + Chu kỳ cài đặt bộ nhớ cho mỗi hướng dẫn

Đối với bộ xử lý với một cấp độ bộ nhớ đệm ,


Tổng CPI = 1.0 + Chu kỳ cài đặt bộ nhớ cho mỗi hướng dẫn = 1.0 + 2% 400 =
9

Với hai cấp độ bộ nhớ đệm, một lỗi trong bộ đệm chính (hoặc cấp một) có
thể được thỏa mãn bằng bộ đệm phụ hoặc bằng bộ nhớ chính. Hình phạt bỏ
lỡ cho một quyền truy cập vào bộ đệm cấp hai là

5 ns = 20 chu kỳ đồng
ns hồ
chu kỳ
0,25 đồng hồ

Nếu bỏ lỡ được thỏa mãn trong bộ đệm thứ cấp, thì đây là toàn bộ hình phạt bỏ
lỡ. Nếu bỏ lỡ cần phải đi đến bộ nhớ chính, thì tổng số hình phạt bỏ lỡ là tổng
thời gian truy cập bộ đệm thứ cấp và thời gian truy cập bộ nhớ chính.
Do đó, đối với bộ đệm hai cấp, tổng CPI là tổng của các chu kỳ gian hàng
từ cả hai cấp bộ đệm và CPI cơ sở :
Tổng CPI = 1 + Gian hàng chính cho mỗi hướng dẫn + Gian hàng phụ cho mỗi
hướng dẫn
= 1 + 2%×20+ 0,5%× 400= 1+ 0,4+ 2,0 =3.4

Do đó, bộ xử lý với bộ đệm thứ cấp nhanh hơn

9. 0
3 . 4 = 2.6

Ngoài ra, chúng tôi có thể tính toán các chu kỳ gian hàng bằng cách tính
tổng các chu kỳ gian hàng của các tham chiếu đó trong bộ đệm thứ cấp ((2%
- 0,5%) × 20 = 0,3). Các tham chiếu đi đến bộ nhớ chính, phải bao gồm chi
phí để truy cập bộ đệm phụ cũng như thời gian truy cập bộ nhớ chính, là (0,5%
× (20 + 400) = 2.1). Tổng, 1.0 + 0.3 + 2.1, lại là 3.4.
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 425

Các cân nhắc thiết kế cho bộ đệm chính và bộ đệm phụ khác nhau đáng kể,
bởi vì sự hiện diện của bộ đệm khác thay đổi sự lựa chọn tốt nhất so với bộ đệm
một cấp. Đặc biệt, cấu trúc bộ đệm hai cấp cho phép bộ đệm chính tập trung vào
việc giảm thiểu thời gian nhấn để mang lại chu kỳ xung nhịp ngắn hơn hoặc ít
giai đoạn đường ống hơn, đồng thời cho phép bộ đệm thứ cấp tập trung vào tốc
độ bỏ lỡ để giảm thời gian truy cập bộ nhớ dài .
Hiệu quả của những thay đổi này đối với hai bộ nhớ cache có thể được nhìn thấy
bằng cách so sánh từng bộ đệm với thiết kế tối ưu cho một cấp độ bộ đệm. So với bộ
đệm một cấp, bộ đệm chính của a bộ nhớ cache đa cấp thường nhỏ hơn. Hơn nữa, bộ nhớ cache đa cấp
bộ đệm chính có thể sử dụng kích thước khối nhỏ hơn, để đi với kích thước bộ đệm Một hệ thống phân cấp
nhỏ hơn và cũng để giảm hình phạt bỏ lỡ. So sánh, bộ đệm thứ cấp sẽ lớn hơn nhiều bộ nhớ với nhiều cấp độ
so với bộ đệm một cấp, vì thời gian truy cập của bộ đệm thứ cấp ít quan trọng hơn. bộ nhớ, thay vì chỉ là bộ
nhớ cache và bộ nhớ
Với tổng kích thước lớn hơn, bộ đệm thứ cấp có thể sử dụng kích thước khối lớn hơn
chính.
mức phù hợp với bộ đệm một cấp. Nó thường sử dụng tính liên kết cao hơn bộ đệm
chính với trọng tâm là giảm tỷ lệ bỏ lỡ.

Sắp xếp đã được phân tích đầy đủ để tìm các thuật toán tốt hơn: Bubble Sort, Hiểu hiệu suất
Quicksort, Radix Sort, v.v. Hình 5.19 (a) hiển thị các hướng dẫn được thực hiện
theo mục được tìm kiếm cho Radix Sort so với Quicksort. Đúng như dự đoán,
chương trình
đối với các mảng lớn, Radix Sort có lợi thế về thuật toán so với Quicksort về số
lượng hoạt động. Hình 5.19 (b) hiển thị thời gian trên mỗi khóa thay vì các
hướng dẫn được thực hiện. Chúng tôi thấy rằng các dòng bắt đầu trên cùng một
quỹ đạo như trong Hình 5.19 (a), nhưng sau đó dòng Sắp xếp Radix phân kỳ khi
dữ liệu sắp xếp tăng. Chuyện gì đang xảy ra vậy? Hình 5.19 (c) câu trả lời bằng
cách xem các bộ nhớ cache cho mỗi mục được sắp xếp: Quicksort luôn có ít lần
bỏ lỡ cho mỗi mục được sắp xếp.
Than ôi, phân tích thuật toán tiêu chuẩn thường bỏ qua tác động của hệ thống
phân cấp bộ nhớ. Vì tốc độ đồng hồ nhanh hơn và Định luật Moore Moore cho
phép các kiến trúc sư loại bỏ tất cả hiệu suất ra khỏi luồng hướng dẫn, sử dụng
hệ thống phân cấp bộ nhớ tốt là rất quan trọng đối với hiệu suất cao. Như chúng
tôi đã nói trong phần giới thiệu, việc hiểu hành vi của hệ thống phân cấp bộ nhớ
là rất quan trọng để hiểu hiệu suất của các chương trình trên các máy tính ngày
nay.

Tối ưu hóa phần mềm thông qua Chặn


Do tầm quan trọng của hệ thống phân cấp bộ nhớ đối với hiệu suất của chương
trình, không có gì đáng ngạc nhiên khi nhiều tối ưu hóa phần mềm được phát
minh có thể cải thiện đáng kể hiệu suất bằng cách sử dụng lại dữ liệu trong bộ
đệm và do đó tỷ lệ bỏ lỡ thấp hơn do địa phương tạm thời được cải thiện.
Khi xử lý các mảng, chúng ta có thể nhận được hiệu suất tốt từ hệ thống bộ nhớ
nếu chúng ta lưu mảng trong bộ nhớ để các truy cập vào mảng được tuần tự trong bộ
nhớ. Tuy nhiên, giả sử rằng chúng ta đang xử lý nhiều mảng, với một số mảng được
truy cập bởi các hàng và một số theo cột. Lưu trữ các mảng theo từng hàng
m
H
ư

n
g

d

n


c
/
426 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

1200
Sắp xếp
Radix
1000

800

600

400
Quicksort
200

0
4 số 8 16 32 64 128 256 512 1024 2048 4096
Kích thước (K mục để
a. sắp xếp)

2000
Sắp xếp Radix
1600
chu kỳ /
mục

1200
Đồng hồ

800

400 Quicksort

0
4 số 8 16 32 64 128 256 512 1024 2048 4096
b. Kích thước (K mục để
sắp xếp)
5

Sắp xếp Radix


4
Bộ nhớ cache /

2
mục

1
Quicksort
0
4 số 8 16 32 64 128 256 512 1024 2048 4096
c. Kích thước (K mục để
sắp xếp)

HÌNH 5.19 So sánh Quicksort và Radix Sắp xếp theo (a) hướng dẫn được thực hiện cho
mỗi mục được sắp xếp, (b) thời gian cho mỗi mục được sắp xếp và (c) bộ nhớ cache bỏ
lỡ cho mỗi mục được sắp xếp. Những dữ liệu này là từ một bài báo của LaMarca và Ladner [1996].
Do kết quả như vậy, các phiên bản mới của Radix Sort đã được phát minh có tính đến hệ thống phân cấp
bộ nhớ, để lấy lại các lợi thế thuật toán của nó (xem Mục 5.15). Ý tưởng cơ bản của tối ưu hóa bộ đệm là
sử dụng tất cả dữ liệu trong một khối nhiều lần trước khi chúng được thay thế khi bỏ lỡ.
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 427

(được gọi là hàng thứ tự chính) hoặc từng cột (cột thứ tự chính) không giải quyết
được vấn đề vì cả hàng và cột được sử dụng trong mỗi lần lặp vòng lặp.
Thay vì hoạt động trên toàn bộ hàng hoặc cột của một mảng , bị chặn thuật
toán hoạt động trên các mô hình con hoặc khốiMục tiêu là tối đa hóa quyền truy
cập vào dữ liệu được tải vào bộ đệm trước khi dữ liệu được thay thế; nghĩa là, cải
thiện địa phương tạm thời để giảm bỏ lỡ bộ nhớ cache.
Ví dụ: các vòng lặp bên trong của DGEMM (dòng 4 đến 9 của Hình 3.22
trong Chương 3) là
cho (int j = 0; j <n; ++ j)
{
đôi cij = C [i + j * n]; / * cij = C [i] [j] * / for (int k = 0; k <n;
k ++)
cij + = A [i + k * n] * B [k + j * n]; / * cij + = A [i] [k] [j] */ C [i + j * n] = cij; /
* C [i] [j] = cij * /}

Nó đọc tất cả N-by-N các yếu tố của B, đọc giống nhau N các phần tử trong
những gì tương ứng với một hàng A nhiều lần, và viết những gì tương ứng với
một hàng N các yếu tố của C(Các ý kiến làm cho các hàng và cột của ma trận dễ
xác định hơn.). Hình 5.20 cung cấp một ảnh chụp nhanh của các truy cập vào ba
mảng. Một bóng tối cho biết quyền truy cập gần đây, bóng râm cho biết quyền
truy cập cũ hơn và phương tiện màu trắng chưa được truy cập.
Số lượng bỏ lỡ công suất rõ ràng phụ thuộc vào N và kích thước của bộ đệm.
Nếu nó có thể giữ cả ba N-by-N ma trận, sau đó tất cả đều tốt, miễn là không có
xung đột bộ nhớ cache. Chúng tôi cố tình chọn kích thước ma trận của DGEMM
choChương 3 và 4 vì vậy đây sẽ là trường hợp.

j k j
C A B
0 1 2 0 1 2 3 4 5 0 1 2 3 4 5
3 4
0 0
5
0 1 1
2
1 2
T k
2
ô 3
T i
ô 4
i
4 5

4 5

5
HÌNH 5.20 Ảnh chụp nhanh của ba mảng C, A, và B khi nào N = 6 và Tôi = 1. Tuổi tác truy
cập vào các phần tử mảng được biểu thị bằng bóng râm: màu trắng có nghĩa là chưa chạm, ánh sáng có
nghĩa là truy cập cũ hơn và màu tối có nghĩa là truy cập mới hơn. So với Hình 5.22, các yếu tố của A và B
được đọc nhiều lần để tính các yếu tố mới C Các biến. Tôi, j, và k được hiển thị dọc theo các hàng hoặc
cột được sử dụng để truy cập vào các mảng.
428 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Nếu bộ đệm có thể giữ một N-by-N ma trận và một hàng của N, sau đó ít nhất
là Tôihàng của A và mảng B có thể ở trong bộ nhớ cache. Ít hơn thế và bỏ lỡ có
thể xảy ra cho cả hai B và C Trong trường hợp xấu nhất, sẽ có 2. N3 + N2 từ bộ
nhớ truy cập cho N3 hoạt động.
Để đảm bảo rằng các phần tử được truy cập có thể phù hợp với bộ đệm, mã
gốc được thay đổi để tính toán trên một mô hình con. Do đó, về cơ bản chúng tôi
gọi phiên bản DGEMM từ Hình 4.78 trong Chương 4 lặp đi lặp lại trên ma trận
kích thước BLOCKSIZE bởi BLOCKSIZE.BLOCKSIZE được gọi là yếu tố chặn.
Hình 5.21 hiển thị phiên bản bị chặn của DGEMM. Chức năng do_block là
DGEMM từ Hình 3.22 với ba tham số mới si, sj, và trượt để chỉ định vị trí bắt đầu
của mỗi subatrix A, B, và C Hai vòng trong của. do_block bây giờ tính toán theo
các bước kích thước BLOCKSIZE thay vì chiều dài đầy đủ của B và CTrình tối ưu
hóa gcc sẽ loại bỏ mọi chức năng gọi trên đầu bằng cách đặt nội bộ vào. chức
năng; nghĩa là, nó chèn mã trực tiếp để tránh các hướng dẫn ghi sổ địa chỉ thông
thường và trả lại.
Hình 5.22 minh họa các truy cập vào ba mảng bằng cách sử dụng chặn. Chỉ
nhìn vào khả năng bỏ lỡ, tổng số từ bộ nhớ truy cập là 2 N3/BLOCKSIZE + N2
Tổng số này là một sự cải thiện bởi khoảng một yếu tố. BLOCKSIZEDo đó, chặn
khai thác sự kết hợp giữa không gian và thời gian. địa phương, kể từ đó A lợi ích
từ địa phương không gian và B lợi ích từ địa phương tạm thời. Tùy thuộc vào máy
tính và kích thước của ma trận, việc chặn có thể cải thiện hiệu suất khoảng 2 đến
hơn hệ số 10.

1 định nghĩa BLOCKSIZE 32


2 void do_block (int n, int si, int sj, int sk, double * A, double
3 * B, gấp đôi * C)
4 {
5 cho (int i = si; i <si + BLOCKSIZE; ++i)
6 cho (int j = sj; j <sj + BLOCKSIZE; ++ j)
7 {
số 8 đôi cij = C [i + j * n]; / * cij = C [i] [j] */
9 cho (int k = sk; k <sk + BLOCKSIZE; k ++ )
10 cij + = A [i + k * n] * B [k + j * n]; / * cij + = A [i] [k] * B [k] [j] * /
11 C [i + j * n] = cij; / * C [i] [j] = cij * /
12 }
13 }
14 void dgemm (int n, double * A, double * B, double * C)
15 {
16 cho (int sj = 0; sj <n; sj + = BLOCKSIZE)
17 cho (int si = 0; si <n; si + = BLOCKSIZE)
18 cho (int sk = 0; sk <n; sk + = BLOCKSIZE)
19 do_block (n, si, sj, sk, A, B, C);
20 }

HÌNH 5.21 Bộ nhớ cache đã chặn phiên bản DGEMM Hình 3.22.Giả sử C được khởi tạo về không. Các do_block
chức năng về cơ bản là DGEMM từ Chương 3 với các tham số mới để chỉ định vị trí bắt đầu của các tiểu thư
BLOCKSIZETrình tối ưu hóa gcc có thể loại bỏ các hướng dẫn trên cao của chức năng bằng cách đặt nội bộ. do_block
chức năng.
5.4 Đo lường và cải thiện hiệu suất bộ nhớ cache 429

j k j
C A B
0 1 2 0 1 2 3 4 5 0 1 2 3 4 5
3 4
0 0
5
0 1 1

1 T k2
3
T ôi
2 4
ôi 3
2 5
3 4

4 5

5
HÌNH 5.22 Tuổi truy cập vào mảng C, A, và B khi nào BLOCKSIZE = 3. Lưu ý rằng, trái ngược
với Hình 5.20, ít yếu tố được truy cập.

Mặc dù chúng tôi đã nhắm đến việc giảm các lỗi bộ nhớ cache, việc chặn cũng
có thể được sử dụng để giúp đăng ký phân bổ. Bằng cách lấy một kích thước
chặn nhỏ, sao cho khối có thể được giữ trong các thanh ghi, chúng ta có thể giảm
thiểu số lượng tải và cửa hàng trong chương trình, một lần nữa cải thiện hiệu suất.
cho lỗi bỏ lỡ bộ nhớ
cache L1 xuất hiện
Xây dựng: Bộ nhớ cache đa cấp tạo ra nhiều biến chứng. Đầu tiên, có bây giờ một
trong bộ đệm L2,
số loại bỏ lỡ khác nhau và tỷ lệ bỏ lỡ tương ứng. Trong ví dụ trên các trang 423
nhưng nó hiếm khi ẩn
Vang424, chúng tôi đã thấy tỷ lệ bỏ lỡ bộ nhớ cache chính và tỷ lệ bỏ lỡ toàn
bỏ lỡ bộ đệm L2.
cầuPhần nhỏ của các tài liệu tham khảo bị bỏ lỡ trong tất cả các cấp bộ đệm. Ngoài ra
còn có tỷ lệ bỏ lỡ cho bộ đệm thứ cấp, là tỷ lệ của tất cả các lỗi trong bộ đệm thứ cấp
Xây dựng: Thách
chia cho số lượng truy cập vào bộ đệm. Tỷ lệ bỏ lỡ này được gọi là tỷ lệ bỏ lỡ địa
thức hiệu suất cho các
phương của bộ đệm thứ cấp. Bởi vì các bộ lọc bộ đệm chính truy cập, đặc biệt là
thuật toán là hệ thống
những bộ lọc có địa phương không gian và thời gian tốt, tỷ lệ bỏ lỡ cục bộ của bộ đệm
phân cấp bộ nhớ khác
thứ cấp cao hơn nhiều so với tỷ lệ bỏ lỡ toàn cầu. Ví dụ: trên các trang 423, 424, nhau giữa các triển khai
chúng ta có thể tính tỷ lệ bỏ lỡ cục bộ của bộ đệm thứ cấp là 0,5% / 2% = 25%! May khác nhau của cùng một
mắn thay, tỷ lệ bỏ lỡ toàn cầu cho biết tần suất chúng ta phải truy cập vào bộ nhớ kiến trúc trong kích
chính. thước bộ đệm ,

Xây dựng: Với bộ xử lý ngoài đơn đặt hàng (xem Chương 4), hiệu suất là nhiều hơn
phức tạp, vì họ thực hiện các hướng dẫn trong hình phạt bỏ lỡ. Thay vì tỷ lệ bỏ lỡ hướng
dẫn và tỷ lệ bỏ lỡ dữ liệu, chúng tôi sử dụng bỏ lỡ cho mỗi hướng dẫn và công thức này :
_
Ký ức chu kỳ gian
_
hàng = Cô × (Tổng số miSđộ trễ s Chồng chéo bỏ lỡ độ trễ)
Hướng dẫn Hướng dẫn

Không có cách chung để tính toán độ trễ bỏ lỡ chồng chéo, do đó, việc đánh giá
hệ thống phân cấp bộ nhớ cho bộ xử lý ngoài thứ tự chắc chắn yêu cầu mô phỏng bộ
xử lý và hệ thống phân cấp bộ nhớ. Chỉ bằng cách xem việc thực thi bộ xử lý trong
mỗi lần bỏ lỡ, chúng ta mới có thể xem liệu bộ xử lý có chờ dữ liệu hay chỉ đơn giản
là tìm công việc khác để làm. Một hướng dẫn là bộ xử lý thường ẩn hình phạt bỏ lỡ
tỷ lệ bỏ lỡ toàn cầu Các một phần của các tài liệu tham khảo bỏ lỡ trong tất cả các cấp của
bộ đệm đa cấp.
tỷ lệ bỏ lỡ địa phương Các một phần của các tham chiếu đến một cấp độ của bộ đệm bị
bỏ lỡ; được sử dụng trong phân cấp đa cấp.
430 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

tính liên kết, kích thước khối và số lượng bộ nhớ cache. Để đối phó với sự thay đổi
như vậy, một số thư viện số gần đây tham số hóa các thuật toán của họ và sau đó
tìm kiếm không gian tham số trong thời gian chạy để tìm sự kết hợp tốt nhất cho một
máy tính cụ thể. Cách tiếp cận này được gọi tự động.

Kiểm tra bản thân Điều nào sau đây thường đúng về một thiết kế có nhiều cấp độ bộ nhớ
cache?
1. Bộ nhớ cache cấp một quan tâm nhiều hơn về thời gian truy cập và bộ nhớ
cache cấp hai quan tâm nhiều hơn đến tỷ lệ bỏ lỡ.
2. Bộ nhớ cache cấp một quan tâm nhiều hơn về tỷ lệ bỏ lỡ và bộ nhớ cache
cấp hai quan tâm nhiều hơn về thời gian truy cập.

Tóm tắt
Trong phần này, chúng tôi tập trung vào bốn chủ đề: hiệu suất bộ đệm, sử dụng
tính liên kết để giảm tỷ lệ bỏ lỡ, sử dụng hệ thống phân cấp bộ đệm đa cấp để
giảm hình phạt bỏ lỡ và tối ưu hóa phần mềm để cải thiện hiệu quả của bộ nhớ
cache.
Hệ thống bộ nhớ có ảnh hưởng đáng kể đến thời gian thực hiện chương trình. Số
chu kỳ cài đặt bộ nhớ phụ thuộc vào cả tỷ lệ bỏ lỡ và hình phạt bỏ lỡ. Thách thức,
như chúng ta sẽ thấy trong Mục 5.8, là để giảm một trong những yếu tố này mà
không ảnh hưởng đáng kể đến các yếu tố quan trọng khác trong hệ thống phân cấp bộ
nhớ.
Để giảm tỷ lệ bỏ lỡ, chúng tôi đã kiểm tra việc sử dụng các sơ đồ vị trí kết hợp. Các
lược đồ như vậy có thể làm giảm tốc độ bỏ lỡ của bộ đệm bằng cách cho phép đặt các
khối linh hoạt hơn trong bộ đệm. Các sơ đồ liên kết đầy đủ cho phép các khối được đặt ở
bất cứ đâu, nhưng cũng yêu cầu mọi khối trong bộ đệm phải được tìm kiếm để đáp ứng
yêu cầu. Các chi phí cao hơn làm cho bộ nhớ cache kết hợp đầy đủ lớn không thực tế. Bộ
nhớ cache liên kết tập hợp là một lựa chọn thực tế, vì chúng ta chỉ cần tìm kiếm trong số
các yếu tố của một tập hợp duy nhất được chọn bằng cách lập chỉ mục. Bộ nhớ cache liên
kết có tỷ lệ bỏ lỡ cao hơn nhưng truy cập nhanh hơn. Số lượng liên kết mang lại hiệu suất
tốt nhất phụ thuộc vào cả công nghệ và chi tiết thực hiện.
Chúng tôi đã xem các bộ nhớ đa cấp như một kỹ thuật để giảm hình phạt bỏ lỡ
bằng cách cho phép bộ đệm thứ cấp lớn hơn xử lý các lỗi bỏ lỡ cho bộ đệm chính.
Bộ nhớ cache cấp hai đã trở nên phổ biến khi các nhà thiết kế nhận thấy rằng
silicon hạn chế và các mục tiêu của tốc độ đồng hồ cao ngăn bộ nhớ cache chính
trở nên lớn. Bộ đệm thứ cấp, thường lớn hơn 10 lần hoặc nhiều hơn bộ đệm chính,
xử lý nhiều truy cập bị bỏ lỡ trong bộ đệm chính. Trong các trường hợp như vậy,
hình phạt bỏ lỡ là thời gian truy cập vào bộ đệm thứ cấp (thường là <10 chu kỳ
xử lý) so với thời gian truy cập vào bộ nhớ (thường> 100 chu kỳ xử lý). Cũng
như tính liên kết, sự đánh đổi thiết kế giữa kích thước của bộ đệm thứ cấp và thời
gian truy cập của nó phụ thuộc vào một số khía cạnh của việc thực hiện.
Cuối cùng, do tầm quan trọng của hệ thống phân cấp bộ nhớ trong hiệu suất,
chúng tôi đã xem xét cách thay đổi thuật toán để cải thiện hành vi bộ đệm, với
việc chặn là một kỹ thuật quan trọng khi xử lý các mảng lớn.
5.5 Phân cấp bộ nhớ đáng tin cậy 431

5.5 Phân cấp bộ nhớ đáng tin cậy

Ẩn ý trong tất cả các cuộc thảo luận trước đó là hệ thống phân cấp bộ nhớ không
quên. Nhanh nhưng không thể tha thứ không hấp dẫn lắm. Như chúng ta đã học
Chương 1, một ý tưởng tuyệt vời cho độ tin cậy là dư thừa. Trong phần này,
trước tiên chúng tôi sẽ đi qua các thuật ngữ để xác định các thuật ngữ và biện
pháp liên quan đến thất bại, và sau đó cho thấy sự dư thừa có thể tạo ra những ký
ức gần như khó quên.

Xác định thất bại


Chúng tôi bắt đầu với một giả định rằng bạn có một đặc điểm kỹ thuật của dịch
vụ phù hợp. Người dùng sau đó có thể thấy một hệ thống xen kẽ giữa hai trạng
thái của dịch vụ được cung cấp liên quan đến đặc điểm kỹ thuật dịch vụ :
1. Hoàn thành dịch vụ, nơi dịch vụ được cung cấp theo quy định
2. Dịch vụ gián đoạn, nơi dịch vụ được giao khác với dịch vụ được chỉ định
Chuyển từ tiểu bang 1 sang tiểu bang 2 là do thất bạivà chuyển đổi từ trạng thái 2
sang trạng thái 1 được gọi phục hồiThất bại có thể là vĩnh viễn hoặc không liên tục.
Cái sau là trường hợp khó hơn; khó chẩn đoán vấn đề hơn khi một hệ thống dao động
giữa hai trạng thái. Thất bại vĩnh viễn dễ chẩn đoán hơn nhiều.
Định nghĩa này dẫn đến hai thuật ngữ liên quan: độ tin cậy và tính sẵn sàng.
Độ tin cậy là thước đo của thành tựu dịch vụ liên tục, hay tương đương , về thời gian
để thất bại từ một điểm tham chiếu. Do đó, có nghĩa là thời gian để thất bại (MTTF) là
một biện pháp đáng tin cậy. Một thuật ngữ liên quan là tỷ lệ thất bại hàng năm (AFR), chỉ
là tỷ lệ phần trăm của các thiết bị dự kiến sẽ thất bại trong một năm đối với một MTTF
nhất định. Khi MTTF trở nên lớn, nó có thể gây hiểu nhầm, trong khi AFR dẫn đến trực
giác tốt hơn.

MTTF so với. AFR của đĩa

Một số đĩa ngày nay được trích dẫn để có MTTF 1.000.000 giờ. Vì 1.000.000 VÍ DỤ
giờ là 1.000.000 / (365 × 24) = 114 năm, có vẻ như họ thực tế không bao giờ thất
bại. Máy tính quy mô kho (xem Mục 6.7) chạy các dịch vụ Internet như Tìm
kiếm có thể có 50.000 máy chủ. Giả sử mỗi máy chủ có hai đĩa. Sử dụng AFR để
tính toán có bao nhiêu đĩa chúng ta sẽ thất bại mỗi năm.

Một năm là 365 × 24 = 8760 giờ. MTTF 1.000.000 giờ có nghĩa là AFR là TRẢ LỜI
8760 / 1.000.000 = 0,876%. Với 100.000 đĩa, chúng tôi hy vọng 876 đĩa sẽ
thất bại mỗi năm hoặc trung bình hơn hai lần hỏng đĩa mỗi ngày!
432 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Sự gián đoạn dịch vụ được đo bằng có nghĩa là thời gian để sửa chữa (MTTR). Thời
gian trung bình giữa những thất bại (MTBF) chỉ đơn giản là tổng của MTTF +
MTTR. Mặc dù MTBF được sử dụng rộng rãi, MTTF thường là thuật ngữ thích hợp
hơn. Sẵn có sau đó là thước đo thành tựu dịch vụ liên quan đến sự xen kẽ giữa hai
trạng thái hoàn thành và gián đoạn. Tính khả dụng được định lượng thống kê là

MTTF
Sẵn có = (MTTF + MTTR)

Lưu ý rằng độ tin cậy và tính sẵn có thực sự là các biện pháp có thể định lượng,
thay vì chỉ là từ đồng nghĩa với độ tin cậy. Thu hẹp MTTR có thể giúp sẵn có
nhiều như tăng MTTF. Ví dụ, các công cụ để phát hiện, chẩn đoán và sửa chữa
lỗi có thể giúp giảm thời gian sửa chữa lỗi và do đó cải thiện tính khả dụng.
Chúng tôi muốn có sẵn rất cao. Một cách viết tắt là trích dẫn số lượng số
lượng có sẵn trên mạng mỗi năm. Ví dụ, một dịch vụ Internet rất tốt hiện nay
cung cấp 4 hoặc 5 số tiền khả dụng. Cho 365 ngày mỗi năm, là 365 × 24 × 60 =
526.000 phút, sau đó tốc ký được giải mã như sau :
Một chín : 90% => 36,5 ngày sửa chữa / năm
Hai dây leo : 99% => 3,65 ngày sửa chữa / năm
Ba dây leo : 99,9% => 526 phút sửa chữa / năm
Bốn dây leo : 99,99% => 52,6 phút sửa chữa / năm
Năm dây
leo : 99,999% => 5,26 phút sửa chữa / năm
và như thế. (Năm chín có nghĩa là năm phút sửa chữa mỗi năm, đó là hỗ trợ bộ nhớ.)
Để tăng MTTF, bạn có thể cải thiện chất lượng của các thành phần hoặc hệ thống
thiết kế để tiếp tục hoạt động với sự có mặt của các thành phần đã thất bại. Do đó, lỗi
cần được xác định liên quan đến bối cảnh, vì sự thất bại của một thành phần có thể
không dẫn đến sự thất bại của hệ thống. Để làm cho sự phân biệt này rõ ràng, thuật
ngữ lỗi
được sử dụng để có nghĩa là thất bại của một thành phần. Dưới đây là ba cách để
cải thiện MTTF :
1. Tránh lỗi : Ngăn chặn sự cố xảy ra bằng cách xây dựng.
2. Lỗi dung sai : Sử dụng dự phòng để cho phép dịch vụ tuân thủ đặc điểm
kỹ thuật dịch vụ mặc dù lỗi xảy ra.
3. Dự báo lỗi : Dự đoán sự hiện diện và tạo ra lỗi, cho phép thành phần được
thay thế trước nó thất bại.

Sửa lỗi đơn Hamming, Mã phát hiện lỗi kép (SEC /


DED)
Richard Hamming đã phát minh ra một kế hoạch dự phòng phổ biến cho bộ nhớ, mà
ông đã nhận được giải thưởng Turing vào năm 1968. Để phát minh ra các mã dự
phòng, thật hữu ích khi nói về cách các mẫu bit chính xác của Close có thể. Những gì
chúng ta gọi là Hamming khoảng cách chỉ là số bit tối thiểu khác nhau giữa hai bit
đúng mẫu bit. Ví dụ: khoảng cách giữa 011011 và 001111 là hai. Điều gì xảy ra nếu
khoảng cách tối thiểu giữa các thành viên của mã là hai và chúng tôi
5.5 Phân cấp bộ nhớ đáng tin cậy 433

nhận lỗi một bit? Nó sẽ biến một mẫu hợp lệ trong một mã thành một mẫu không
hợp lệ. Do đó, nếu chúng tôi có thể phát hiện liệu các thành viên của mã có chính
xác hay không, chúng tôi có thể phát hiện các lỗi bit đơn và có thể nói rằng mã phát hiện lỗi Một
chúng tôi có một bit duy nhất mã phát hiện lỗi. mã mà cho phép phát
Hamming đã sử dụng a mã chẵn lẻ để phát hiện lỗi. Trong mã chẵn lẻ, số 1 giây hiện lỗi trong dữ liệu,
nhưng không phải là vị
trong một từ được tính; từ này có tính chẵn lẻ nếu số 1 giây là số lẻ và thậm chí khác.
trí chính xác và do đó,
Khi một từ được viết vào bộ nhớ, bit chẵn lẻ cũng được viết (1 cho lẻ, 0 cho chẵn). sửa lỗi.
Đó là, tính chẵn lẻ của từ N + 1 bit phải luôn luôn đồng đều. Sau đó, khi từ được đọc
ra, bit chẵn lẻ được đọc và kiểm tra. Nếu tính chẵn lẻ của từ bộ nhớ và bit chẵn lẻ
được lưu trữ không khớp, đã xảy ra lỗi.

Tính chẵn lẻ của một byte với giá trị 31mười và hiển thị mẫu được lưu vào bộ VÍ DỤ
nhớ. Giả sử bit chẵn lẻ ở bên phải. Giả sử bit quan trọng nhất đã được đảo
ngược trong bộ nhớ, và sau đó bạn đọc lại. Bạn đã phát hiện ra lỗi? Điều gì
xảy ra nếu hai bit quan trọng nhất được đảo ngược?

31mười là 00011111hai, trong đó có năm 1s. Để tạo tính chẵn lẻ, chúng ta cần viết TRẢ LỜI
1 vào bit chẵn lẻ hoặc 00011111hai Nếu bit quan trọng nhất được đảo ngược khi
chúng ta đọc lại, chúng ta sẽ thấy. 100111111hai trong đó có bảy 1s. Vì chúng tôi
mong đợi thậm chí ngang bằng và tính chẵn lẻ, chúng tôi sẽ báo hiệu một lỗi.
Nếu hai hầu hết các bit quan trọng được đảo ngược, chúng ta sẽ thấy
110111111hai trong đó có tám 1s hoặc thậm chí ngang giá, và chúng tôi sẽ không
phải báo hiệu một lỗi.

Nếu có 2 bit lỗi, thì lược đồ chẵn lẻ 1 bit sẽ không phát hiện bất kỳ lỗi nào, vì
tính chẵn lẻ sẽ khớp dữ liệu với hai lỗi. (Trên thực tế, sơ đồ chẵn lẻ 1 bit có thể
phát hiện bất kỳ số lỗi lẻ nào; tuy nhiên, xác suất có ba lỗi thấp hơn nhiều so với
xác suất có hai, vì vậy, trên thực tế, mã chẵn lẻ 1 bit bị giới hạn trong việc phát
hiện một chút lỗi.)
Tất nhiên, một mã chẵn lẻ không thể sửa lỗi, điều mà Hamming muốn làm
cũng như phát hiện ra chúng. Nếu chúng tôi sử dụng mã có khoảng cách tối thiểu
là 3, thì mọi lỗi bit đơn lẻ sẽ gần với mẫu chính xác hơn bất kỳ mẫu hợp lệ nào
khác. Ông đã đưa ra một bản đồ dữ liệu dễ hiểu thành mã khoảng cách 3 mà
chúng ta gọi Mã sửa lỗi Hamming (ECC) để vinh danh ông. Chúng tôi sử dụng
các bit chẵn lẻ để cho phép xác định vị trí của một lỗi duy nhất. Dưới đây là các
bước để tính toán Hamming ECC
1. Bắt đầu đánh số bit từ 1 ở bên trái, trái với cách đánh số truyền thống của
bit ngoài cùng bên phải là 0.
2. Đánh dấu tất cả các vị trí bit có quyền hạn là 2 bit chẵn lẻ (vị trí 1, 2, 4, 8,
16, ...).
434 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Vị trí bit 1 2 3 4 5 6 7 số 8 9 10 11 12

Bit dữ liệu được


mã hóa p1 p2 d1 p4 d2 d3 d4 p8 d5 d6 d7 d8
p1 X X X X X X
Chẵn lẻ p2 X X X X X X
bit
bảo hiểm p4 X X X X X
p8 X X X X X

HÌNH 5.23 Các bit chẵn lẻ, bit dữ liệu và vùng phủ sóng trường trong mã Hamming ECC
cho tám bit dữ liệu.

3. Tất cả các vị trí bit khác được sử dụng cho các bit dữ liệu (vị trí 3, 5, 6, 7,
9, 10, 11, 12, 13, 14, 15, ...).
4. Vị trí của bit chẵn lẻ xác định chuỗi các bit dữ liệu mà nó kiểm tra (Hình
5.24 hiển thị phạm vi bảo hiểm này bằng đồ họa) là :
■ Bit 1 (0001hai) kiểm tra bit (1,3,5,7,9,11 ,...), là các bit trong đó bit ngoài cùng
bên phải của địa chỉ là 1 (0001hai, 0011hai, 0101hai, 0111hai, 1001hai, 1011hai,...).
■ Bit 2 (0010hai) kiểm tra các bit (2,3,6,7,10,11,14,15, ...), là các bit trong
đó bit thứ hai ở bên phải trong địa chỉ là 1.
■ Bit 4 (0100hai) kiểm tra các bit (4 bóng7, 12 bóng15, 20 bóng23, ...), là
các bit có bit thứ ba ở bên phải trong địa chỉ là 1.
■ Bit 8 (1000hai) kiểm tra bit (8 bóng15, 24 bóng31, 40 bóng47 ,...), đó là
các bit trong đó bit thứ tư ở bên phải trong địa chỉ là 1.
Lưu ý rằng mỗi bit dữ liệu được bao phủ bởi hai hoặc nhiều bit chẵn lẻ.
5. Đặt các bit chẵn lẻ để tạo chẵn lẻ cho mỗi nhóm.
Trong những gì có vẻ giống như một trò ảo thuật, bạn có thể xác định liệu các
bit có sai hay không bằng cách nhìn vào các bit chẵn lẻ. Sử dụng mã 12 bit trong
Hình 5.23, nếu giá trị của bốn phép tính chẵn lẻ (p8, p4, p2, p1) là 0000, thì
không có lỗi. Tuy nhiên, nếu mẫu là, giả sử, 1010, là 10mười, sau đó Hamming
ECC cho chúng ta biết rằng bit 10 (d6) là một lỗi. Vì số là nhị phân, chúng ta có
thể sửa lỗi chỉ bằng cách đảo ngược giá trị của bit 10.

Giả sử một giá trị dữ liệu byte là 10011010haiĐầu tiên hiển thị mã Hamming
VÍ DỤ ECC cho byte đó, sau đó đảo ngược bit 10 và hiển thị rằng mã ECC tìm và
sửa lỗi bit đơn.
Để lại khoảng trắng cho các bit chẵn lẻ, mẫu 12 bit là __ 1_ 0 0 1_ 1 0 1 0.
5.5 Phân cấp bộ nhớ đáng tin cậy 435

Vị trí 1 kiểm tra các bit 1,3,5,7,9 và 11, chúng tôi nhấn mạnh: __ 1_ 0 0 1_ 1 0 1
0. Để làm cho nhóm chẵn lẻ, chúng ta nên đặt bit 1 thành 0. TRẢ LỜI Vị trí 2 kiểm tra bit
2,3,6,7,10,11, là 0_ 1_ 0 0 1_ 1 0 1 0 hoặc chẵn lẻ ,
vì vậy chúng tôi đặt vị trí 2 thành 1.
Vị trí 4 kiểm tra bit 4,5,6,7,12, tức là 0 1 1_ 0 0 1_ 1 0 1, vì vậy chúng tôi đặt
nó thành 1. Vị trí 8 kiểm tra các bit 8,9,10,11,12, tức là 0 1 1 0 0 1_ 1 0 1 0,
vì vậy chúng tôi đặt nó thành 0.
Từ mã cuối cùng là 011100101010. Đảo ngược bit 10 thay đổi thành
011100101110.
chẵn lẻ bit 1 là 0 (011100101110 là bốn 1s, vì vậy thậm chí ngang giá; nhóm
này là OK). Parity bit 2 là 1 (011100101110 là năm 1s, tương đương lẻ; có
lỗi ở đâu đó).
Parity bit 4 là 1 (011100101110 là hai 1, vì vậy thậm chí ngang giá; nhóm
này là OK). Số chẵn lẻ 8 là 1 (011100101110 là ba 1s, tương đương kỳ lạ; có
lỗi ở đâu đó).
Các bit chẵn lẻ 2 và 8 không chính xác. Như 2 + 8 = 10, bit 10 phải sai. Do
đó, chúng ta có thể sửa lỗi bằng cách đảo ngược bit 10: 011100101010.
Voila!

Hamming không dừng lại ở mã sửa lỗi bit đơn. Với chi phí thêm một bit, chúng
ta có thể làm cho khoảng cách Hamming tối thiểu trong một mã là 4. Điều này có
nghĩa là chúng ta có thể sửa lỗi bit đơn và phát hiện lỗi bit képÝ tưởng là thêm
một bit chẵn lẻ được tính trên toàn bộ từ. Hãy để sử dụng một từ dữ liệu 4 bit làm
ví dụ, chỉ cần 7 bit để phát hiện lỗi một bit. Các bit chẵn lẻ Hamming H (p1 p2 p3)
được tính toán (thậm chí ngang bằng như bình thường) cộng với tính chẵn lẻ trên
toàn bộ từ, p4 :.
1 2 3 4 5 6 7 số 8
tr1 tr2 d1 tr3 d2 d3 d4 tr4
Sau đó, thuật toán để sửa một lỗi và phát hiện hai lỗi chỉ là tính chẵn lẻ trên các
nhóm ECC (H) như trước đây cộng thêm một lỗi trên toàn bộ nhóm (p4). Có bốn
trường hợp :
1. H là chẵn và p4 là thậm chí, vì vậy không có lỗi xảy ra.
2. H là lẻ và p4 là số lẻ, do đó, một lỗi đơn có thể sửa được xảy ra. (p4 nên
tính chẵn lẻ nếu xảy ra một lỗi.)
3. H là chẵn và p4 là lẻ, một lỗi duy nhất xảy ra trong p4 bit, không phải trong
phần còn lại của từ, vì vậy sửa p4 bit.
4. H là lẻ và p4 là thậm chí, một lỗi kép xảy ra. (p4 nên tính chẵn lẻ nếu xảy
ra hai lỗi.)
Sửa lỗi đơn / Phát hiện lỗi kép (SEC / DED) là phổ biến trong bộ nhớ cho các
máy chủ ngày nay. Thuận tiện, các khối dữ liệu 8 byte có thể nhận được SEC /
DED chỉ với một byte nữa, đó là lý do tại sao nhiều DIMM rộng 72 bit.
436 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Xây dựng: Để tính toán có bao nhiêu bit cần thiết cho SEC, hãy để tr là tổng số của bit
chẵn lẻ và d số bit dữ liệu trong tr + d bit từ. Nếu tr bit sửa lỗi là để trỏ đến bit lỗi (tr + d
trường hợp) cộng với một trường hợp để chỉ ra rằng không có lỗi tồn tại, chúng ta cần :

 tr + d + 1 bit, và do đó tr  đăng nhập (tr + d + 1).


tr
2

Ví dụ, đối với dữ liệu 8 bit có nghĩa là d = 8 và 2tr ≥ tr + số 8 + 1, vì vậy tr = 4. Tương


tự, tr = 5 cho 16 bit dữ liệu, 6 cho 32 bit, 7 cho 64 bit, v.v.

Xây dựng: Trong các hệ thống rất lớn, khả năng có nhiều lỗi cũng như thất bại
hoàn toàn của một chip bộ nhớ rộng trở nên quan trọng. IBM giới thiệu chipkill để giải
quyết vấn đề này và nhiều hệ thống lớn sử dụng công nghệ này. (Cuộc gọi của Intel
SDDC phiên bản của chúng.) Tương tự như cách tiếp cận RAID được sử dụng cho
các đĩa (xem Mục 5.11), Chipkill phân phối dữ liệu và thông tin ECC, để hoàn
thành lỗi của một chip bộ nhớ duy nhất có thể được xử lý bằng cách hỗ trợ tái tạo dữ
liệu bị thiếu từ các chip bộ nhớ còn lại. Giả sử cụm 10.000 bộ xử lý với 4 GiB mỗi bộ
xử lý, IBM đã tính các tỷ lệ sau đây không thể phục hồi lỗi bộ nhớ trong 3 năm hoạt
động :
■ Chỉ chẵn lẻ khoảng 90.000, hoặc một thất bại không thể phục hồi (hoặc không
bị phát hiện) cứ sau 17 phút.
■ SEC / DED chỉ có khoảng 3500, hoặc khoảng một thất bại không thể phát hiện
hoặc không thể phục hồi cứ sau 7,5 giờ.
■ Chipkill, 6, hoặc khoảng một thất bại không thể phát hiện hoặc không thể phục
hồi cứ sau 2 tháng.
Do đó, Chipkill là một yêu cầu cho máy tính quy mô kho. (Xem Mục 6.7).

Xây dựng: Trong khi lỗi bit đơn hoặc kép là điển hình cho các hệ thống bộ nhớ, mạng
có thể có lỗi bit. Một giải pháp được gọi là Kiểm tra dự phòng chu kỳ Đối với một khối. k bit,
một máy phát tạo ra một n-k trình tự kiểm tra khung bit. Nó truyền n bit chia hết cho một số
số. Người nhận chia khung cho số đó. Nếu không có phần còn lại, nó giả định không có lỗi.
Nếu có, người nhận từ chối tin nhắn và yêu cầu máy phát gửi lại. Như bạn có thể đoán từ
Chương 3, thật dễ dàng để tính toán phân chia cho một số số nhị phân với thanh ghi thay
đổi, điều này làm cho mã CRC trở nên phổ biến ngay cả khi phần cứng là quý giá hơn. Đi
xa hơn nữa, mã Reed-Solomon sử dụng các trường Galois chính xác lỗi truyền đa giá trị,
nhưng bây giờ dữ liệu được coi là hệ số của đa thức và không gian mã là giá trị của đa
thức. Tính toán Reed-Solomon phức tạp hơn đáng kể so với phân chia nhị phân!

5.6 Máy ảo

Máy ảo (VM) được phát triển lần đầu tiên vào giữa những năm 1960 và chúng có
vẫn là một phần quan trọng của điện toán máy tính lớn trong những năm qua.
Mặc dù phần lớn bị bỏ qua trong kỷ nguyên PC một người dùng trong những
năm 1980 và 1990, nhưng gần đây họ đã trở nên phổ biến
5.6 Máy ảo 437

■ Tầm quan trọng ngày càng tăng của sự cô lập và an ninh trong các hệ thống hiện đại
■ Những thất bại trong bảo mật và độ tin cậy của các hệ điều hành tiêu chuẩn
■ Việc chia sẻ một máy tính duy nhất giữa nhiều người dùng không liên quan,
đặc biệt là điện toán đám mây
■ Sự gia tăng mạnh mẽ về tốc độ thô của các bộ xử lý trong nhiều thập kỷ,
khiến cho chi phí của máy ảo trở nên dễ chấp nhận hơn
Định nghĩa rộng nhất về máy ảo bao gồm về cơ bản tất cả các phương thức mô
phỏng cung cấp giao diện phần mềm tiêu chuẩn, chẳng hạn như Java VM. Trong
phần này, chúng tôi quan tâm đến các máy ảo cung cấp một môi trường cấp hệ
thống hoàn chỉnh tại nhị phân hướng dẫn đặt kiến trúc (ISA) cấp độ. Mặc dù một
số máy ảo chạy các ISA khác nhau VM từ phần cứng gốc, chúng tôi cho rằng
chúng luôn khớp với phần cứng. Các VM như vậy được gọi là (Hoạt động) Hệ
thống máy ảoIBM VM / 370, VirtualBox, VMware ESX Server và Xen là những
ví dụ.
Các máy ảo hệ thống thể hiện ảo tưởng rằng người dùng có toàn bộ máy tính,
bao gồm cả bản sao của hệ điều hành. Một máy tính chạy nhiều máy ảo và có thể
hỗ trợ một số máy khác nhau hệ điều hành (HĐH). Trên một nền tảng thông
thường, một hệ điều hành duy nhất sở hữu tất cả tài nguyên phần cứng, nhưng
với VM, nhiều HĐH đều chia sẻ tài nguyên phần cứng.

Phần mềm hỗ trợ VM được gọi là a màn hình máy ảo (VMM) hoặc giám sát
viên; VMM là trái tim của công nghệ máy ảo. Cơ sở nền tảng phần cứng được
gọi là chủ nhàvà tài nguyên của nó được chia sẻ giữa các khách VM. VMM xác
định cách ánh xạ tài nguyên ảo vào tài nguyên vật lý: tài nguyên vật lý có thể
được chia sẻ theo thời gian, phân vùng hoặc thậm chí được mô phỏng trong phần
mềm. VMM nhỏ hơn nhiều so với HĐH truyền thống; phần cách ly của VMM có
lẽ chỉ có 10.000 dòng mã.
Mặc dù mối quan tâm của chúng tôi ở đây là về máy ảo để cải thiện khả năng
bảo vệ, máy ảo cung cấp hai lợi ích khác có ý nghĩa thương mại :
1. Quản lý phần mềmVM cung cấp một sự trừu tượng có thể chạy hoàn chỉnh.
ngăn xếp phần mềm, thậm chí bao gồm các hệ điều hành cũ như DOS.
Một triển khai điển hình có thể là một số máy ảo chạy các hệ điều hành cũ,
nhiều máy chạy bản phát hành HĐH ổn định hiện tại và một vài thử
nghiệm bản phát hành HĐH tiếp theo.
2. Quản lý phần cứngMột lý do cho nhiều máy chủ là để có mỗi máy chủ.
ứng dụng chạy với phiên bản tương thích của hệ điều hành trên các máy
tính riêng biệt, vì sự phân tách này có thể cải thiện độ tin cậy. VM cho
phép các ngăn xếp phần mềm riêng biệt này chạy độc lập nhưng chia sẻ
phần cứng, từ đó hợp nhất số lượng máy chủ. Một ví dụ khác là một số
VMM hỗ trợ di chuyển VM đang chạy sang một máy tính khác, để cân
bằng tải hoặc sơ tán khỏi phần cứng bị lỗi.
438 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Giao diện Dịch vụ web Amazon (AWS) sử dụng các máy ảo trong điện toán đám mây của
phần nó cung cấp EC2 vì năm lý do :
1. Nó cho phép AWS bảo vệ người dùng khỏi nhau trong khi chia sẻ cùng một
cứng / máy chủ.
phần
2. Nó đơn giản hóa việc phân phối phần mềm trong một máy tính quy mô kho.
mềm Một khách hàng cài đặt hình ảnh máy ảo được cấu hình với phần mềm phù
hợp và AWS phân phối nó cho tất cả các trường hợp mà khách hàng muốn sử
dụng.
3. Khách hàng (và AWS) có thể đáng tin cậy giết chết một VM để kiểm soát
việc sử dụng tài nguyên khi khách hàng hoàn thành công việc của họ.
4. Máy ảo ẩn danh tính của phần cứng mà khách hàng đang chạy, điều đó có
nghĩa là AWS có thể tiếp tục sử dụng các máy chủ cũ và giới thiệu máy
chủ mới, hiệu quả hơn. Khách hàng mong đợi hiệu suất cho các trường hợp
khớp với xếp hạng của họ trong Đơn vị tính toán EC2, mà AWS định
nghĩa: để cung cấp công suất CPU tương đương của bộ xử lý AMD
Opteron 1.01.2 GHz 2007 hoặc bộ xử lý Intel Xeon 2007.Các máy chủ mới
hơn thường cung cấp nhiều Đơn vị tính toán EC2 hơn các máy chủ cũ,
nhưng AWS có thể tiếp tục thuê các máy chủ cũ miễn là chúng tiết kiệm.
5. Màn hình máy ảo có thể kiểm soát tốc độ mà VM sử dụng bộ xử lý, mạng và
không gian đĩa, cho phép AWS cung cấp nhiều điểm giá của các loại khác
nhau chạy trên cùng một máy chủ cơ bản. Ví dụ: vào năm 2020 AWS đã cung
cấp hơn 200 loại ví dụ, từ dưới nửa xu mỗi giờ (t3a nano ở mức 0,0047 đô la)
đến hơn 25 đô la (tối ưu hóa bộ nhớ x1e 32xlarge ở mức 26,99 đô la).

Nói chung, chi phí ảo hóa bộ xử lý phụ thuộc vào khối lượng công việc. Các chương
trình giới hạn bộ xử lý cấp người dùng không có chi phí ảo hóa, vì HĐH hiếm khi
được gọi, vì vậy mọi thứ đều chạy ở tốc độ gốc. Khối lượng công việc chuyên sâu I /
O thường sử dụng nhiều hệ điều hành, thực hiện nhiều cuộc gọi hệ thống và hướng
dẫn đặc quyền có thể dẫn đến chi phí ảo hóa cao. Mặt khác, nếu khối lượng công việc
I / O chuyên sâu cũng vậy I / O-ràng buộc, chi phí ảo hóa bộ xử lý có thể được ẩn
hoàn toàn, vì bộ xử lý thường không hoạt động chờ I / O .
Chi phí được xác định bởi cả số lượng hướng dẫn phải được mô phỏng bởi
VMM và mỗi lần mất bao nhiêu thời gian để mô phỏng. Do đó, khi các máy ảo
khách chạy cùng một ISA với máy chủ lưu trữ, như chúng tôi giả định ở đây,
mục tiêu của kiến trúc và VMM là chạy hầu hết tất cả các hướng dẫn trực tiếp
trên phần cứng gốc.

Yêu cầu của một máy theo dõi ảo


Một màn hình VM phải làm gì? Nó trình bày một giao diện phần mềm cho phần
mềm khách, nó phải cách ly trạng thái của khách với nhau và nó phải tự bảo vệ
mình khỏi phần mềm khách (bao gồm cả HĐH khách). Các yêu cầu định tính là :
5.6 Máy ảo 439

■ Phần mềm khách nên hành xử trên VM chính xác như thể nó đang chạy
trên phần cứng gốc, ngoại trừ hành vi liên quan đến hiệu suất hoặc giới hạn
của tài nguyên cố định được chia sẻ bởi nhiều VM.
■ Phần mềm khách không thể thay đổi trực tiếp việc phân bổ tài nguyên hệ
thống thực.
Để ảo hóa bộ xử lý, VMM phải kiểm soát mọi thứ mà Truy cập vào trạng thái
đặc quyền, I / O, ngoại lệ và ngắt, mặc dù VM và HĐH khách hiện đang chạy
tạm thời sử dụng chúng.
Ví dụ: trong trường hợp ngắt hẹn giờ, VMM sẽ tạm dừng VM khách hiện đang chạy,
lưu trạng thái của nó, xử lý ngắt, xác định VM khách nào sẽ chạy tiếp theo và sau đó tải
trạng thái của nó. Các máy ảo khách dựa trên ngắt hẹn giờ được cung cấp bộ hẹn giờ ảo
và ngắt bộ hẹn giờ mô phỏng bởi VMM .
Để chịu trách nhiệm, VMM phải ở mức đặc quyền cao hơn VM khách, thường
chạy ở chế độ người dùng; điều này cũng đảm bảo rằng việc thực hiện bất kỳ
hướng dẫn đặc quyền nào sẽ được VMM xử lý. Các yêu cầu hệ thống cơ bản để
hỗ trợ VMM là :
■ Ít nhất hai chế độ xử lý Hệ thống và người dùng.
■ Một tập hợp con các hướng dẫn đặc quyền chỉ có sẵn trong chế độ hệ thống,
dẫn đến bẫy nếu được thực thi trong chế độ người dùng; tất cả các tài
nguyên hệ thống phải được kiểm soát chỉ thông qua các hướng dẫn này.

(Thiếu) Hướng dẫn Đặt hỗ trợ kiến trúc cho


máy ảo
Nếu các máy ảo được lên kế hoạch trong quá trình thiết kế ISA, thì nó rất dễ
dàng để giảm cả số lượng hướng dẫn phải được thực hiện bởi VMM và cải thiện
tốc độ mô phỏng của chúng. Một kiến trúc cho phép VM thực thi trực tiếp trên
phần cứng kiếm được tiêu đề ảo hóavà các kiến trúc IBM 370 và RISC-V tự hào
mang nhãn hiệu đó.
Than ôi, vì máy ảo đã được xem xét cho các ứng dụng PC và máy chủ chỉ gần đây,
hầu hết các bộ hướng dẫn đã được tạo mà không cần ảo hóa trong tâm trí. Những thủ
phạm này bao gồm x86 và hầu hết các kiến trúc RISC, bao gồm ARMv7 và MIPS .
Vì VMM phải đảm bảo rằng hệ thống khách chỉ tương tác với các tài nguyên
ảo, một hệ điều hành khách thông thường chạy như một chương trình chế độ
người dùng trên đầu VMM. Sau đó, nếu một hệ điều hành khách cố gắng truy
cập hoặc sửa đổi thông tin liên quan đến tài nguyên phần cứng thông qua một
hướng dẫn đặc quyền—ví dụ, đọc hoặc viết một bit trạng thái cho phép ngắt—nó
sẽ bẫy vào VMM. VMM sau đó có thể ảnh hưởng đến những thay đổi thích hợp
đối với các tài nguyên thực tương ứng.
Do đó, nếu bất kỳ lệnh nào cố đọc hoặc ghi các bẫy thông tin nhạy cảm như
vậy khi được thực thi ở chế độ người dùng, VMM có thể chặn nó và hỗ trợ phiên
bản ảo của thông tin nhạy cảm, như HĐH khách mong đợi.
Trong trường hợp không có sự hỗ trợ như vậy, các biện pháp khác phải được
thực hiện. VMM phải có biện pháp phòng ngừa đặc biệt để xác định tất cả các
hướng dẫn có vấn đề và đảm bảo rằng chúng hoạt động chính xác khi được thực
hiện bởi HĐH khách, do đó làm tăng độ phức tạp của VMM và giảm hiệu suất
chạy VM .
440 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Bảo vệ và Hướng dẫn Đặt Kiến trúc


Bảo vệ là một nỗ lực chung của kiến trúc và hệ điều hành, nhưng các kiến trúc sư
đã phải sửa đổi một số chi tiết khó xử của các kiến trúc tập lệnh hiện có khi bộ
nhớ ảo trở nên phổ biến.
Ví dụ: POPF hướng dẫn x86 tải các thanh ghi cờ từ đầu ngăn xếp trong bộ
nhớ. Một trong những lá cờ là Kích hoạt gián đoạn (IE) cờ. Nếu bạn chạy hướng
dẫn POPF trong chế độ người dùng, thay vì bẫy nó, nó chỉ đơn giản là thay đổi
tất cả các cờ ngoại trừ IE. Trong chế độ hệ thống, nó không thay đổi IE. Vì một
hệ điều hành khách chạy ở chế độ người dùng bên trong VM, đây là một vấn đề,
như nó mong đợi để thấy một IE thay đổi .
Trong lịch sử, phần cứng máy tính lớn của IBM và VMM đã thực hiện ba
bước để cải thiện hiệu suất của máy ảo :
1. Giảm chi phí ảo hóa bộ xử lý.
2. Giảm chi phí gián đoạn do ảo hóa.
3. Giảm chi phí ngắt bằng cách ngắt lái đến VM thích hợp mà không cần gọi
VMM .
AMD và Intel đã cố gắng giải quyết điểm đầu tiên vào năm 2006 bằng cách giảm
chi phí ảo hóa bộ xử lý. Sẽ rất thú vị khi xem có bao nhiêu thế hệ kiến trúc và sửa
đổi VMM sẽ phải giải quyết cả ba điểm và bao lâu trước khi các máy ảo của thế
kỷ 21 cho x86 sẽ hiệu quả như các máy tính lớn của IBM và VMM của những
năm 1970.

Xây dựng: RISC-V bẫy tất cả các hướng dẫn đặc quyền khi chạy ở chế độ người
dùng, vì vậy nó hỗ trợ ảo hóa cổ điển, trong đó HĐH khách chạy ở chế độ người
dùng và VMM chạy ở chế độ giám sát.

Xây dựng: Phần cuối cùng của kiến trúc để ảo hóa là I / O. Đây là cho đến nay
phần khó nhất của ảo hóa hệ thống do số lượng thiết bị I / O ngày càng tăng được
gắn vào máy tính và sự đa dạng ngày càng tăng của các loại thiết bị I / O. Một khó
khăn khác là việc chia sẻ một thiết bị thực sự giữa nhiều máy ảo và một thiết bị khác
đến từ việc hỗ trợ vô số trình điều khiển thiết bị được yêu cầu, đặc biệt là nếu các
HĐH khách khác nhau được hỗ trợ trên cùng một hệ thống VM. Ảo ảnh VM có thể
… một hệ thống đã được duy trì bằng cách cung cấp cho mỗi phiên bản chung VM của từng loại trình
được nghĩ ra để làm điều khiển thiết bị I / O, sau đó để lại cho VMM để xử lý I / O thực .
cho tổ hợp trống lõi
xuất hiện với lập
trình viên dưới
dạng một cửa hàng
cấp độ duy nhất,
việc chuyển giao
5.7 Bộ nhớ ảo
cần thiết diễn ra tự
động. Trong các phần trước, chúng tôi đã thấy cách các bộ nhớ cache cung cấp quyền truy
Kilburn và cộng sự., Hệ cập nhanh vào các phần được sử dụng gần đây của mã và dữ liệu chương trình.
thống lưu trữ một cấp, Tương tự, bộ nhớ chính có thể hoạt động như một bộ đệm bộ nhớ cache cho bộ lưu
1962 trữ thứ cấp, theo truyền thống được thực hiện với các đĩa từ. Kỹ thuật này
5.7 Bộ nhớ ảo 441

được gọi là bộ nhớ ảoTrong lịch sử, có hai động lực chính cho bộ nhớ ảo: cho phép bộ nhớ ảo
chia sẻ bộ nhớ hiệu quả và an toàn giữa một số chương trình, chẳng hạn như bộ nhớ Một kỹ thuật sử dụng bộ
cần thiết cho nhiều máy ảo cho điện toán đám mây và loại bỏ gánh nặng lập trình của nhớ chính làm bộ nhớ
một lượng nhỏ, hạn chế bộ nhớ chính. Năm thập kỷ sau khi phát minh ra nó, nó là lý cache của bộ nhớ cache cho
do trước đây trị vì ngày nay. bộ nhớ thứ cấp.
Tất nhiên, để cho phép nhiều máy ảo chia sẻ cùng một bộ nhớ, chúng ta phải có
khả năng bảo vệ các máy ảo khỏi nhau, đảm bảo rằng một chương trình chỉ có thể
đọc và viết các phần của bộ nhớ chính đã được gán cho nó. Bộ nhớ chính chỉ chứa địa chỉ vật lý An địa chỉ
các phần hoạt động của nhiều máy ảo, giống như bộ đệm chỉ chứa phần hoạt động trong bộ nhớ chính.
của một chương trình. Do đó, nguyên tắc của địa phương cho phép bộ nhớ ảo cũng
như bộ nhớ cache và bộ nhớ ảo cho phép chúng tôi chia sẻ bộ xử lý một cách hiệu
quả cũng như bộ nhớ chính.
Chúng ta không thể biết máy ảo nào sẽ chia sẻ bộ nhớ với các máy ảo khác
khi chúng ta biên dịch chúng. Trên thực tế, các máy ảo chia sẻ bộ nhớ thay đổi
sự bảo vệ Một bộ về các
linh hoạt trong khi chúng đang chạy. Vì sự tương tác động này, chúng tôi muốn cơ chế để đảm bảo rằng
biên dịch từng chương trình thành chính nó không gian địa chỉPhạm vi riêng biệt nhiều quy trình chia sẻ bộ
của các vị trí bộ nhớ chỉ có thể truy cập vào chương trình này. Bộ nhớ ảo thực xử lý, bộ nhớ hoặc thiết bị I
hiện việc dịch không gian địa chỉ chương trình sang thể chất địa chỉQuá trình / O không thể can thiệp, cố
dịch thuật này thực thi. sự bảo vệ của một địa chỉ chương trình không gian từ các ý hoặc vô ý, với nhau bằng
máy ảo khác. cách đọc hoặc viết dữ liệu
Động lực thứ hai cho bộ nhớ ảo là cho phép một chương trình một người dùng của nhau. Các cơ chế này
cũng cách ly hệ điều hành
vượt quá kích thước của bộ nhớ chính. Trước đây, nếu một chương trình trở nên
khỏi quy trình người dùng.
quá lớn đối với bộ nhớ, thì tùy thuộc vào lập trình viên để làm cho nó phù hợp.
Các lập trình viên chia các chương trình thành từng mảnh và sau đó xác định các
phần loại trừ lẫn nhau. Những cái này lớp phủ đã được tải hoặc dỡ dưới sự kiểm lỗi trang Một sự kiện
soát của chương trình người dùng trong khi thực hiện, với lập trình viên đảm bảo mà xảy ra khi một trang
rằng chương trình không có thời gian cố gắng truy cập vào lớp phủ không được truy cập không có trong
tải và lớp phủ được tải không bao giờ vượt quá tổng kích thước của bộ nhớ. Các bộ nhớ chính.
lớp phủ được tổ chức theo truyền thống dưới dạng các mô-đun, mỗi mô-đun chứa
cả mã và dữ liệu. Các cuộc gọi giữa các thủ tục trong các mô-đun khác nhau sẽ địa chỉ ảo
dẫn đến việc chồng chéo mô-đun này với mô-đun khác. Một địa chỉ tương ứng với
Như bạn có thể tưởng tượng, trách nhiệm này là một gánh nặng đáng kể cho một vị trí trong không gian
các lập trình viên. Bộ nhớ ảo, được phát minh để giảm bớt các lập trình viên về ảo và được dịch bằng cách
khó khăn này, tự động quản lý hai cấp độ của hệ thống phân cấp bộ nhớ được ánh xạ địa chỉ đến một địa
biểu thị bằng bộ nhớ chính (đôi khi được gọi trí nhớ vật lý để phân biệt với bộ chỉ vật lý khi bộ nhớ được
truy cập.
nhớ ảo) và lưu trữ thứ cấp.
Mặc dù các khái niệm tại nơi làm việc trong bộ nhớ ảo và trong bộ nhớ cache là
dịch địa chỉ Cũng
như nhau, nhưng nguồn gốc lịch sử khác nhau của chúng đã dẫn đến việc sử dụng
được gọi Địa chỉ
các thuật ngữ khác nhau. Một khối bộ nhớ ảo được gọi là a trangvà bỏ lỡ bộ nhớ ảo lập bản đồQuá trình bằng.
được gọi là a lỗi trang Với bộ nhớ ảo, bộ xử lý tạo ra một. địa chỉ ảo, được dịch bởi mà một địa chỉ ảo được
sự kết hợp giữa phần cứng và phần mềm với a địa chỉ vật lý, lần lượt có thể được sử ánh xạ tới một địa chỉ
dụng để truy cập bộ nhớ chính. Hình 5.24 hiển thị bộ nhớ hầu như được xử lý với các được sử dụng để truy cập
trang được ánh xạ tới bộ nhớ chính. Quá trình này được gọi ánh xạ địa chỉ hoặc là bộ nhớ.
dịch địa chỉNgày nay, hai cấp độ phân cấp bộ nhớ được điều khiển bởi ảo. bộ nhớ
thường là DRAM và bộ nhớ flash trong các thiết bị di động cá nhân và
442 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Địa chỉ ảo Địa chỉ vật lý


Dịch địa chỉ

Địa chỉ đĩa

HÌNH 5.24 Trong bộ nhớ ảo, các khối bộ nhớ (được gọi là trang) được ánh xạ từ một bộ địa chỉ
(được gọi là địa chỉ ảo) đến một tập hợp khác (được gọi là địa chỉ vật lý). Các bộ xử lý tạo địa chỉ ảo
trong khi bộ nhớ được truy cập bằng địa chỉ vật lý. Cả bộ nhớ ảo và bộ nhớ vật lý đều được chia thành các trang,
để một trang ảo được ánh xạ tới một trang vật lý. Tất nhiên, cũng có thể một trang ảo không có bộ nhớ chính và
không được ánh xạ tới một địa chỉ vật lý; trong trường hợp đó, trang nằm trên đĩa. Các trang vật lý có thể được
chia sẻ bằng cách có hai địa chỉ ảo trỏ đến cùng một địa chỉ vật lý. Khả năng này được sử dụng để cho phép hai
chương trình khác nhau chia sẻ dữ liệu hoặc mã.

DRAM và đĩa từ trong máy chủ (xem Mục 5.2). Nếu chúng tôi trở về sự tương tự
thư viện của mình, chúng tôi có thể nghĩ về một địa chỉ ảo là tiêu đề của một
cuốn sách và một địa chỉ vật lý là vị trí của cuốn sách đó trong thư viện, chẳng
hạn như có thể được đưa ra bởi số cuộc gọi của Thư viện Quốc hội.
Bộ nhớ ảo cũng đơn giản hóa việc tải chương trình để thực hiện bằng cách
cung cấp tái định cưDi dời ánh xạ các địa chỉ ảo được sử dụng bởi một chương
trình khác nhau. địa chỉ vật lý trước khi địa chỉ được sử dụng để truy cập bộ nhớ.
Việc di dời này cho phép chúng tôi tải chương trình ở bất cứ đâu trong bộ nhớ
chính. Hơn nữa, tất cả các hệ thống bộ nhớ ảo đang sử dụng ngày nay đã di
chuyển chương trình thành một tập hợp các khối (trang) có kích thước cố định, do
đó loại bỏ sự cần thiết phải tìm một khối bộ nhớ liền kề để phân bổ cho một
chương trình; thay vào đó, hệ điều hành chỉ cần tìm đủ các trang trong bộ nhớ
chính.
Trong bộ nhớ ảo, địa chỉ được chia thành a số trang ảo và a trang bù đắp. Hình
5.25 hiển thị bản dịch số trang ảo sang a số trang vật lýPhiên bản RISC-V trong cuốn
sách này sử dụng địa chỉ 32 bit. Con số này. giả sử bộ nhớ vật lý là 1 GiB, cần địa chỉ
30 bit. (Ngoài ra còn có một phiên bản RISC-V với địa chỉ 64 bit cung cấp các bộ nhớ
ảo và vật lý lớn hơn nhiều.) Số trang vật lý cấu thành phần trên của địa chỉ vật lý,
trong khi phần bù trang, không thay đổi, tạo thành phần dưới. Số lượng bit trong
trường bù trang xác định kích thước trang. Số lượng trang có thể định địa chỉ với địa
chỉ ảo có thể khác với số trang có thể định địa chỉ với địa chỉ vật lý. Có số lượng trang
ảo lớn hơn các trang vật lý là cơ sở cho ảo ảnh về lượng bộ nhớ ảo lớn hơn.
5.7 Bộ nhớ ảo 443

Địa chỉ ảo

31 30 29 15141312111098 3210

Số trang ảo Trang bù

Dịch

29 28 27 15 141312111098 3210

Số trang vật lý Trang bù

Địa chỉ vật lý

HÌNH 5.25 Ánh xạ từ địa chỉ ảo sang địa chỉ vật lý. Kích thước trang là 2 12 = 4 KiB. Các số trang
vật lý được phép trong bộ nhớ là 218, vì số trang vật lý có 18 bit trong đó. Do đó, bộ nhớ chính có thể có tối
đa 1 GiB, trong khi không gian địa chỉ ảo là 4 GiB .

Nhiều lựa chọn thiết kế trong các hệ thống bộ nhớ ảo được thúc đẩy bởi chi phí
cao của lỗi trang. Một lỗi trang vào đĩa sẽ mất hàng triệu chu kỳ đồng hồ để xử lý.
(Bảng trên trang 394 cho thấy độ trễ bộ nhớ chính nhanh hơn khoảng 100.000 lần
so với đĩa.) Hình phạt bỏ lỡ khổng lồ này, bị chi phối bởi thời gian để có được từ
đầu tiên cho các kích thước trang điển hình, dẫn đến một số quyết định quan trọng
trong việc thiết kế hệ thống bộ nhớ ảo :
■ Các trang phải đủ lớn để cố gắng khấu hao thời gian truy cập cao. Kích
thước từ 4 KiB đến 64 KiB là điển hình ngày nay. Các hệ thống máy tính
để bàn và máy chủ mới đang được phát triển để hỗ trợ 32 trang KiB và 64
trang KiB, nhưng các hệ thống nhúng mới đang đi theo hướng khác, đến 1
trang KiB.
■ Các tổ chức giảm tỷ lệ lỗi trang là hấp dẫn. Kỹ thuật chính được sử dụng ở
đây là cho phép đặt các trang trong bộ nhớ.
■ Lỗi trang có thể được xử lý trong phần mềm vì chi phí sẽ nhỏ so với thời
gian truy cập đĩa. Ngoài ra, phần mềm có thể đủ khả năng sử dụng các
thuật toán thông minh để chọn cách đặt trang vì thậm chí việc giảm ít tỷ lệ
bỏ lỡ sẽ phải trả chi phí cho các thuật toán đó.
■ Viết qua sẽ không hoạt động cho bộ nhớ ảo, vì việc viết mất quá nhiều thời
gian. Thay vào đó, hệ thống bộ nhớ ảo sử dụng ghi lại.
444 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Một vài phần phụ tiếp theo giải quyết các yếu tố này trong thiết kế bộ nhớ ảo.

Xây dựng: Chúng tôi trình bày động lực cho bộ nhớ ảo như nhiều máy ảo chia sẻ
cùng một bộ nhớ, nhưng bộ nhớ ảo ban đầu được phát minh để nhiều chương trình
có thể chia sẻ máy tính như một phần của hệ thống chia sẻ thời gian. Vì nhiều độc
giả ngày nay không có kinh nghiệm với các hệ thống chia sẻ thời gian, chúng tôi sử
dụng các máy ảo để thúc đẩy phần này.

Xây dựng: Đối với máy chủ, PC và thậm chí cả điện thoại thông minh, bộ xử lý địa
chỉ 32 bit có vấn đề. Mặc dù chúng ta thường nghĩ về các địa chỉ ảo lớn hơn nhiều so
với các địa chỉ vật lý, điều ngược lại có thể xảy ra khi kích thước địa chỉ bộ xử lý nhỏ
so với trạng thái của công nghệ bộ nhớ. Không một chương trình hoặc máy ảo nào có
thể có lợi, nhưng một bộ chương trình hoặc máy ảo chạy cùng một lúc có thể được
hưởng lợi từ việc không phải đổi khỏi bộ nhớ chính hoặc bằng cách chạy trên bộ xử lý
song song.

Xây dựng: Các cuộc thảo luận về bộ nhớ ảo trong cuốn sách này tập trung vào
phân trang , sử dụng các khối kích thước cố định. Ngoài ra còn có một sơ đồ khối
phân khúc A sơ đồ ánh kích thước thay đổi được gọi phân khúcTrong phân khúc, một địa chỉ bao gồm hai
xạ địa chỉ kích thước thay phần: một số phân khúc. và một phần bù. Số phân đoạn được ánh xạ tới một địa chỉ
đổi trong đó một địa chỉ vật lý và phần bù là thêm vào để tìm địa chỉ thực tế. Vì phân khúc có thể khác nhau
bao gồm hai phần: một số về kích thước, nên cũng cần kiểm tra giới hạn để đảm bảo rằng phần bù nằm trong
phân đoạn, được ánh xạ phân khúc. Việc sử dụng chính của phân khúc là hỗ trợ các phương pháp bảo vệ và
tới một địa chỉ vật lý và chia sẻ mạnh mẽ hơn trong một không gian địa chỉ. Hầu hết các sách giáo khoa hệ
phần bù phân đoạn. điều hành chứa các cuộc thảo luận rộng rãi về phân khúc so với phân trang và sử
dụng phân đoạn để chia sẻ không gian địa chỉ một cách hợp lý. Nhược điểm chính
của phân đoạn là nó chia không gian địa chỉ thành các phần riêng biệt logic phải được
thao tác dưới dạng địa chỉ hai phần: số phân đoạn và phần bù. Ngược lại, phân trang
làm cho ranh giới giữa số trang và bù vô hình cho các lập trình viên và trình biên dịch.
Các phân đoạn cũng đã được sử dụng như một phương pháp để mở rộng không
gian địa chỉ mà không thay đổi kích thước từ của máy tính. Những nỗ lực như vậy đã
không thành công vì sự lúng túng và hình phạt hiệu suất vốn có trong một địa chỉ hai
phần, trong đó các lập trình viên và người biên dịch phải được biết.
Nhiều kiến trúc chia không gian địa chỉ thành các khối kích thước cố định lớn giúp
đơn giản hóa việc bảo vệ giữa hệ điều hành và các chương trình người dùng và tăng
hiệu quả thực hiện phân trang. Mặc dù các bộ phận này thường được gọi là các phân
đoạn, nhưng cơ chế này đơn giản hơn nhiều so với phân đoạn kích thước khối thay
đổi và không hiển thị cho các chương trình người dùng; chúng tôi thảo luận chi tiết
hơn trong thời gian ngắn.

Đặt một trang và tìm lại nó


Do mức phạt cực kỳ cao đối với lỗi trang, các nhà thiết kế giảm tần suất lỗi trang
bằng cách tối ưu hóa vị trí trang. Nếu chúng tôi cho phép một trang ảo được ánh xạ
5.7 Bộ nhớ ảo 445

đến bất kỳ trang vật lý nào, hệ điều hành sau đó có thể chọn thay thế bất kỳ trang
nào nó muốn khi xảy ra lỗi trang. Ví dụ: hệ điều hành có thể sử dụng thuật toán
tinh vi và cấu trúc dữ liệu phức tạp theo dõi việc sử dụng trang để cố gắng chọn
một trang không cần thiết trong một thời gian dài. Khả năng sử dụng sơ đồ thay
thế thông minh và linh hoạt giúp giảm tỷ lệ lỗi trang và đơn giản hóa việc sử
dụng vị trí kết hợp đầy đủ của các trang.
Như đã đề cập trong Mục 5.4, khó khăn trong việc sử dụng vị trí kết hợp đầy
đủ là trong việc định vị một mục, vì nó có thể ở bất kỳ đâu ở cấp trên của hệ
thống phân cấp. Một tìm kiếm đầy đủ là không thực tế. Trong các hệ thống bộ
nhớ ảo, chúng tôi định vị các trang bằng cách sử dụng bảng lập chỉ mục bộ nhớ bảng trang Cái bàn chứa
chính; cấu trúc này được gọi là a bảng trangvà nó nằm trong bộ nhớ chính. Một các bản dịch địa chỉ ảo
bảng trang được lập chỉ mục theo số trang từ địa chỉ ảo để khám phá số trang vật sang vật lý trong một hệ
thống bộ nhớ ảo. Bảng,
lý tương ứng. Mỗi chương trình có bảng trang riêng, ánh xạ không gian địa chỉ được lưu trong bộ nhớ,
ảo của chương trình đó vào bộ nhớ chính. Trong thư viện tương tự của chúng tôi, thường được lập chỉ mục
bảng trang tương ứng với ánh xạ giữa tiêu đề sách và vị trí thư viện. Giống như theo số trang ảo; mỗi mục
danh mục thẻ có thể chứa các mục nhập cho sách trong thư viện khác trong trong bảng chứa số trang
khuôn viên trường chứ không phải thư viện chi nhánh địa phương, chúng ta sẽ vật lý cho trang ảo đó nếu
thấy rằng bảng trang có thể chứa các mục nhập cho các trang không có trong bộ trang hiện đang ở trong bộ
nhớ. Để chỉ ra vị trí của bảng trang trong bộ nhớ, phần cứng bao gồm một thanh nhớ.
ghi trỏ đến điểm bắt đầu của bảng trang; chúng tôi gọi đây là đăng ký bảng
trangGiả sử bây giờ bảng trang nằm trong một vùng bộ nhớ cố định và liền kề.

Bảng trang, cùng với bộ đếm chương trình và các thanh ghi, chỉ định tiểu bang Giao diện
của một máy ảo. Nếu chúng ta muốn cho phép một máy ảo khác sử dụng bộ xử lý,
chúng ta phải lưu trạng thái này. Sau đó, sau khi khôi phục trạng thái này, máy ảo phần
có thể tiếp tục thực thi. Chúng ta thường gọi trạng thái này là a quá trình Quá cứng /
trình được xem xét. hoạt động khi nó thuộc sở hữu của bộ xử lý; mặt khác, nó phần
được xem xét không hoạt độngHệ điều hành có thể làm cho một quy trình hoạt
động bằng cách tải trạng thái quy trình, bao gồm bộ đếm chương trình, sẽ bắt đầu mềm
thực thi theo giá trị của bộ đếm chương trình đã lưu.
Không gian địa chỉ của quá trình, và do đó tất cả dữ liệu mà nó có thể truy cập
vào bộ nhớ, được xác định bởi bảng trang của nó, nằm trong bộ nhớ. Thay vì lưu
toàn bộ bảng trang, hệ điều hành chỉ cần tải thanh ghi bảng trang để trỏ đến bảng
trang của quy trình mà nó muốn thực hiện. Mỗi quy trình có bảng trang riêng, vì
các quy trình khác nhau sử dụng cùng một địa chỉ ảo. Hệ điều hành chịu trách
nhiệm phân bổ bộ nhớ vật lý và cập nhật các bảng trang, để không gian địa chỉ ảo
của các quy trình riêng biệt không va chạm. Như chúng ta sẽ thấy trong thời gian
ngắn, việc sử dụng các bảng trang riêng biệt cũng cung cấp sự bảo vệ của quy
trình này với quy trình khác.
446 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Hình 5.26 sử dụng thanh ghi bảng trang, địa chỉ ảo và trang được chỉ định bảng
để hiển thị cách phần cứng có thể tạo thành một địa chỉ vật lý. Một bit hợp lệ
được sử dụng trong mỗi mục nhập bảng trang, giống như chúng ta đã làm trong
bộ đệm. Nếu bit bị tắt, trang không có trong bộ nhớ chính và xảy ra lỗi trang.
Nếu bit được bật, trang nằm trong bộ nhớ và mục nhập chứa số trang vật lý.

Địa chỉ ảo

47 46 45 44 43 15141312111098 3210

Số trang ảo Trang bù

Dịch

39 38 37 15 141312111098 3210

Số trang vật lý Trang bù

Địa chỉ vật lý

HÌNH 5.26 Bảng trang được lập chỉ mục với số trang ảo để có được phần tương ứng của
địa chỉ vật lý. Chúng tôi giả định một địa chỉ 32 bit. Con trỏ bảng trang cung cấp địa chỉ bắt đầu của
bảng trang. Trong hình này, kích thước trang là 212 byte, hoặc 4 KiB. Không gian địa chỉ ảo là 232 byte,
hoặc 4 GiB, và không gian địa chỉ vật lý là 230 byte, cho phép bộ nhớ chính lên tới 1 GiB. Số lượng mục
trong bảng trang là 220, hoặc 1 triệu mục. Bit hợp lệ cho mỗi mục nhập cho biết liệu ánh xạ có hợp pháp
hay không. Nếu nó tắt, thì trang không có trong bộ nhớ. Mặc dù mục nhập bảng trang được hiển thị ở đây
chỉ cần rộng 19 bit, nhưng nó thường được làm tròn lên đến 32 bit để dễ lập chỉ mục. Các bit bổ sung sẽ
được sử dụng để lưu trữ thông tin bổ sung cần được lưu giữ trên cơ sở mỗi trang, chẳng hạn như bảo vệ.
5.7 Bộ nhớ ảo 447

Vì bảng trang chứa ánh xạ cho mọi trang ảo có thể, không yêu cầu thẻ. Trong
thuật ngữ bộ đệm, chỉ mục được sử dụng để truy cập bảng trang bao gồm địa chỉ khối
đầy đủ, trong trường hợp này là số trang ảo.

Lỗi trang
Nếu bit hợp lệ cho một trang ảo bị tắt, xảy ra lỗi trang. Hệ điều hành phải được
kiểm soát. Việc chuyển tiền này được thực hiện với cơ chế ngoại lệ, mà chúng tôi
đã thấy Chương 4 và sẽ thảo luận lại sau trong phần này. Khi hệ điều hành được
kiểm soát, nó phải tìm trang ở cấp độ tiếp theo của hệ thống phân cấp (thường là
bộ nhớ flash hoặc đĩa từ) và quyết định nơi đặt trang được yêu cầu vào bộ nhớ
chính.
Chỉ riêng địa chỉ ảo không cho chúng tôi biết trang nằm ở đâu trong bộ nhớ phụ.
Quay trở lại thư viện tương tự của chúng tôi, chúng tôi không thể tìm thấy vị trí của

Trang ảo
số
Bảng trang
Trang vật lý hoặc Trí nhớ vật lý
Địa chỉ đĩa hợp lệ

1
1
1
1
0
1
1
0
1 Lưu trữ đĩa
1
0
1

HÌNH 5.27 Bảng trang ánh xạ mỗi trang trong bộ nhớ ảo thành một trang trong bộ nhớ chính
hoặc một trang được lưu trữ trên đĩa, là cấp độ tiếp theo trong hệ thống phân cấp. Trang ảo số
được sử dụng để lập chỉ mục bảng trang. Nếu bit hợp lệ được bật, bảng trang sẽ cung cấp số trang vật lý (tức là.,
địa chỉ bắt đầu của trang trong bộ nhớ) tương ứng với trang ảo. Nếu bit hợp lệ tắt, trang hiện chỉ nằm trên đĩa, tại
một địa chỉ đĩa được chỉ định. Trong nhiều hệ thống, bảng địa chỉ trang vật lý và địa chỉ trang đĩa, trong khi logic
một bảng, được lưu trữ trong hai cấu trúc dữ liệu riêng biệt. Các bảng kép được chứng minh một phần vì chúng ta
phải giữ địa chỉ đĩa của tất cả các trang, ngay cả khi chúng hiện đang ở trong bộ nhớ chính. Hãy nhớ rằng các
trang trong bộ nhớ chính và các trang trên đĩa có cùng kích thước.
448 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

một cuốn sách thư viện trên kệ chỉ bằng cách biết tiêu đề của nó. Thay vào đó, chúng
tôi đi đến danh mục và tra cứu cuốn sách, lấy địa chỉ cho vị trí trên kệ, chẳng hạn như
số cuộc gọi của Thư viện Quốc hội. Tương tự, trong một hệ thống bộ nhớ ảo, chúng
ta phải theo dõi vị trí trong bộ nhớ phụ của mỗi trang trong không gian địa chỉ ảo.
Vì chúng ta không biết trước khi nào một trang trong bộ nhớ sẽ được thay thế,
hệ điều hành thường tạo khoảng trắng trên bộ nhớ flash hoặc đĩa cho tất cả các
không gian trao đổi trang của quy trình khi nó tạo ra quy trình. Không gian này được gọi là không
Không gian trên đĩa dành gian trao đổi Vào thời điểm đó, nó cũng tạo ra một cấu trúc dữ liệu để ghi lại nơi
riêng cho không gian bộ mỗi trang ảo được lưu trữ trên đĩa. Cấu trúc dữ liệu này có thể là một phần của
nhớ ảo đầy đủ của một bảng trang hoặc có thể là cấu trúc dữ liệu phụ trợ được lập chỉ mục theo cùng một
quy trình. cách với bảng trang. Hình 5.27 hiển thị tổ chức khi một bảng duy nhất chứa số
trang vật lý hoặc địa chỉ bộ nhớ phụ.
Hệ điều hành cũng tạo ra một cấu trúc dữ liệu theo dõi quá trình nào và địa chỉ
ảo nào sử dụng từng trang vật lý. Khi xảy ra lỗi trang, nếu tất cả các trang trong
bộ nhớ chính được sử dụng, hệ điều hành phải chọn một trang để thay thế. Vì
chúng tôi muốn giảm thiểu số lỗi trang, hầu hết các hệ điều hành đều cố gắng
chọn một trang mà họ đưa ra giả thuyết sẽ không cần thiết sớm. Sử dụng quá khứ
để dự đoán tương lai, các hệ điều hành tuân theo ít được sử dụng gần đây nhất
(LRU) sơ đồ thay thế, mà chúng tôi đã đề cập trong Mục 5.4Hệ điều hành tìm
kiếm trang được sử dụng ít nhất gần đây, giả sử rằng một trang không được sử
dụng trong một thời gian dài ít có khả năng cần thiết hơn một trang được truy cập
gần đây. Các trang thay thế được viết để trao đổi không gian trong bộ nhớ phụ.
Trong trường hợp bạn đang tự hỏi, hệ điều hành chỉ là một quá trình khác và các
bảng điều khiển bộ nhớ này nằm trong bộ nhớ; các chi tiết của mâu thuẫn dường
như này sẽ được giải thích trong thời gian ngắn.

Bảng cấp 1

4 KiB
ký ức
Bảng desc
Bảng cấp 0 trang
VA [21:12]

Bảng desc

VA [31:22]

SPTBR

HÌNH 5.28 RISC-V sử dụng hai cấp độ bảng để dịch địa chỉ ảo 32 bit thành địa chỉ vật lý 32
bit. Thay vì cần 1 triệu mục bảng trang cho bảng trang duy nhất trong Hình 5.27, phương pháp phân cấp
này chỉ cần một phần rất nhỏ. Mỗi bước dịch sử dụng 10 bit địa chỉ ảo để tìm bảng cấp độ tiếp theo, cho
đến khi các bit trên của địa chỉ ảo được ánh xạ tới địa chỉ vật lý của trang 4 KiB mong muốn. Mỗi mục
nhập bảng trang RISC-V là 4 byte, do đó, 1024 mục của bảng sẽ điền vào một trang 4 KiB duy nhất. Các
Trang giám sát Đăng ký cơ sở (SPTBR) cung cấp địa chỉ bắt đầu của bảng trang đầu tiên. Phiên bản 64 bit
của RISC-V cũng có 4 trang KiB, với ba hoặc bốn cấp độ của bảng trang radix-512 (vì các mục trong bảng
trang cho địa chỉ ảo 64 bit dài hơn là 8 byte), cho 39- hoặc Địa chỉ ảo 48 bit. Một terabyte (2 ^ 40) không
gian địa chỉ vật lý được cung cấp bởi các địa chỉ ảo 48 bit là đủ cho năm 2020 (16 bit trên của địa chỉ 64
bit bị bỏ qua).
5.7 Bộ nhớ ảo 449

Việc thực hiện một sơ đồ LRU hoàn toàn chính xác là quá tốn kém, vì nó yêu cầu cập Giao diện
nhật cấu trúc dữ liệu trên mọi tham khảo bộ nhớ. Do đó, hầu hết các hệ điều hành gần
đúng LRU bằng cách theo dõi các trang có và trang nào chưa được sử dụng gần đây.
phần
Để giúp hệ điều hành ước tính các trang LRU, máy tính RISC-V cung cấp a bit tham cứng /
khảo, đôi khi được gọi là a sử dụng bit hoặc là truy cập bit, được đặt bất cứ khi nào phần
một trang được truy cập. Hệ điều hành định kỳ xóa các bit tham chiếu và sau đó ghi
lại chúng để nó có thể xác định trang nào được chạm trong một khoảng thời gian cụ
mềm
thể. Với thông tin sử dụng này, hệ điều hành có thể chọn một trang nằm trong số ít bit tham khảo Cũng
được tham chiếu gần đây nhất (được phát hiện bằng cách tắt bit tham chiếu của nó). được gọi sử dụng bit
Nếu bit này không được cung cấp bởi phần cứng, hệ điều hành phải tìm một cách hoặc là truy cập bitA.
khác để ước tính trang nào đã được truy cập. trường được đặt bất cứ khi
nào một trang được truy
cập và được sử dụng để
thực hiện LRU hoặc các
chương trình thay thế khác.

Bộ nhớ ảo cho các địa chỉ ảo lớn


Với địa chỉ ảo 32 bit, 4 trang KiB và 4 byte cho mỗi mục nhập trang, kích thước
của bảng trang sẽ là 4 MiB. Nghĩa là, chúng ta sẽ cần sử dụng 4 MiB bộ nhớ cho
mỗi chương trình được thực hiện bất cứ lúc nào. Số tiền này không quá tệ cho
một quy trình duy nhất. Điều gì sẽ xảy ra nếu có hàng trăm quy trình đang chạy,
mỗi quy trình có bảng trang riêng? Và chúng ta nên xử lý các địa chỉ 64 bit như
thế nào, sẽ cần terabyte cho mỗi chương trình cho các bảng trang?
Một loạt các kỹ thuật được sử dụng để giảm lượng lưu trữ cần thiết cho bảng
trang. Năm kỹ thuật dưới đây nhằm mục đích giảm tổng dung lượng lưu trữ tối
đa cần thiết cũng như giảm thiểu bộ nhớ chính dành riêng cho bảng trang :
1. Kỹ thuật đơn giản nhất là giữ một thanh ghi giới hạn giới hạn kích thước
của bảng trang cho một quy trình nhất định. Nếu số trang ảo trở nên lớn
hơn nội dung của thanh ghi giới hạn, các mục phải được thêm vào bảng
trang. Kỹ thuật này cho phép bảng trang phát triển khi một quá trình tiêu
tốn nhiều không gian hơn. Do đó, bảng trang sẽ chỉ lớn nếu quy trình sử
dụng nhiều trang không gian địa chỉ ảo. Kỹ thuật này yêu cầu không gian
địa chỉ mở rộng chỉ theo một hướng.
2. Cho phép tăng trưởng chỉ theo một hướng là không đủ, vì hầu hết các ngôn ngữ
yêu cầu hai khu vực có kích thước có thể mở rộng: một khu vực giữ ngăn xếp
và khu vực còn lại giữ đống. Do tính hai mặt này, việc phân chia bảng trang và
để nó phát triển từ địa chỉ cao nhất trở xuống cũng như từ địa chỉ thấp nhất trở
lên là thuận tiện. Điều này có nghĩa là sẽ có hai bảng trang riêng biệt và hai
giới hạn riêng biệt. Việc sử dụng hai bảng trang phá vỡ không gian địa chỉ
thành hai phân đoạn. Bit thứ tự cao của một địa chỉ thường xác định phân đoạn
nào và do đó bảng trang nào sẽ sử dụng cho địa chỉ đó. Vì bit địa chỉ thứ tự cao
chỉ định phân khúc, mỗi phân đoạn có thể
450 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

lớn bằng một nửa không gian địa chỉ. Một thanh ghi giới hạn cho mỗi phân
đoạn chỉ định kích thước hiện tại của phân khúc, phát triển theo đơn vị
trang. Không giống như loại phân đoạn được thảo luận trong phần xây
dựng thứ hai ở trang 423, hình thức phân đoạn này là vô hình đối với
chương trình ứng dụng, mặc dù không phải với hệ điều hành. Nhược điểm
chính của sơ đồ này là nó không hoạt động tốt khi không gian địa chỉ được
sử dụng theo kiểu thưa thớt hơn là một tập hợp các địa chỉ ảo liền kề.
3. Một cách tiếp cận khác để giảm kích thước bảng trang là áp dụng chức
năng băm cho địa chỉ ảo để bảng trang chỉ cần kích thước của số thể chất
các trang trong bộ nhớ chính. Một cấu trúc như vậy được gọi là an bảng
trang đảo ngượcTất nhiên, quá trình tra cứu phức tạp hơn một chút với
bảng trang đảo ngược, bởi vì chúng ta không còn có thể chỉ mục bảng
trang.
4. Để giảm bộ nhớ chính thực tế được gắn trong các bảng trang, hầu hết các
hệ thống hiện đại cũng cho phép các bảng trang được phân trang. Mặc dù
điều này nghe có vẻ khó khăn, nhưng nó hoạt động bằng cách sử dụng
cùng các ý tưởng cơ bản của bộ nhớ ảo và chỉ đơn giản là cho phép các
bảng trang nằm trong không gian địa chỉ ảo. Ngoài ra, có một số vấn đề
nhỏ nhưng nghiêm trọng, chẳng hạn như một loạt các lỗi trang không bao
giờ kết thúc, cần phải tránh. Làm thế nào những vấn đề này được khắc
phục là rất chi tiết và thường rất đặc trưng cho bộ xử lý. Tóm lại, những
vấn đề này được tránh bằng cách đặt tất cả các bảng trang vào không gian
địa chỉ của hệ điều hành và đặt ít nhất một số bảng trang cho hệ điều hành
vào một phần bộ nhớ chính được xử lý vật lý và luôn có mặt và do đó
không bao giờ cóbộ nhớ thứ cấp.
5. Nhiều cấp độ của bảng trang cũng có thể được sử dụng để giảm tổng lượng
lưu trữ bảng trang và đây là giải pháp mà RISC-V sử dụng để giảm dấu
chân bộ nhớ của dịch địa chỉ. Hình 5.28 ở trên cho thấy hai cấp độ dịch địa
chỉ để chuyển từ địa chỉ ảo 32 bit sang địa chỉ vật lý 32 bit của trang 4 KiB.
Dịch địa chỉ xảy ra bằng cách nhìn đầu tiên vào bảng cấp 0, sử dụng các bit
bậc cao nhất của địa chỉ. Nếu địa chỉ trong bảng này là hợp lệ, tập hợp các
bit bậc cao tiếp theo được sử dụng để lập chỉ mục bảng trang được chỉ định
bởi mục nhập bảng phân đoạn, v.v. Do đó, bảng cấp 0 ánh xạ địa chỉ ảo
thành 4 MiB (222 byte) vùng. Bảng cấp 1 lần lượt ánh xạ địa chỉ ảo tới 4
KiB (212) trang bộ nhớ. Lược đồ này cho phép không gian địa chỉ được sử
dụng theo kiểu thưa thớt (nhiều phân đoạn không liên tục có thể đặc biệt
hữu ích với không gian địa chỉ rất lớn, đặc biệt là phiên bản 64 bit của
RISC-V, và trong các hệ thống phần mềm yêu cầu phân bổ không liên tục.
Nhược điểm chính của ánh xạ đa cấp này là quá trình phức tạp hơn để dịch
địa chỉ.
5.7 Bộ nhớ ảo 451

Những gì về Writes?
Sự khác biệt giữa thời gian truy cập vào bộ đệm và bộ nhớ chính là hàng chục đến
hàng trăm chu kỳ và các sơ đồ ghi có thể được sử dụng, mặc dù chúng ta cần một bộ
đệm ghi để ẩn độ trễ của ghi từ bộ xử lý. Trong một hệ thống bộ nhớ ảo, ghi vào cấp
độ tiếp theo của hệ thống phân cấp (đĩa) có thể mất hàng triệu chu kỳ đồng hồ của bộ
xử lý; do đó, xây dựng bộ đệm ghi để cho phép hệ thống ghi vào đĩa sẽ hoàn toàn
không thực tế. Thay vào đó, các hệ thống bộ nhớ ảo phải sử dụng ghi lại, thực hiện
từng ghi vào trang trong bộ nhớ và sao chép trang trở lại bộ nhớ phụ khi được thay
thế trong bộ nhớ chính.

Lược đồ ghi lại có một lợi thế lớn khác trong hệ thống bộ nhớ ảo. Vì thời gian Giao diện
truyền đĩa nhỏ so với thời gian truy cập của nó, sao chép lại toàn bộ trang hiệu
quả hơn nhiều so với việc viết các từ riêng lẻ trở lại đĩa. Một hoạt động ghi lại,
phần
mặc dù nhanh hơn so với chuyển các từ riêng biệt, vẫn còn tốn kém. Vì vậy, cứng /
chúng tôi muốn biết liệu một trang nhu cầu được sao chép lại khi chúng ta chọn phần
thay thế nó. Để theo dõi xem một trang đã được viết từ khi nó được đọc vào bộ
nhớ, a bit bẩn được thêm vào bảng trang. Bit bẩn được đặt khi bất kỳ từ nào trong
mềm
một trang được viết. Nếu hệ điều hành chọn thay thế trang, bit bẩn cho biết liệu
trang đó có cần được viết ra hay không trước khi vị trí của nó trong bộ nhớ có thể
được trao cho trang khác. Do đó, một trang sửa đổi thường được gọi là a bẩn
trang.

Làm cho dịch địa chỉ nhanh: TLB


Vì các bảng trang được lưu trữ trong bộ nhớ chính, mọi truy cập bộ nhớ của một
chương trình có thể mất ít nhất hai lần: một quyền truy cập bộ nhớ để có được địa chỉ
vật lý và quyền truy cập thứ hai để lấy dữ liệu. Chìa khóa để cải thiện hiệu suất truy
cập là dựa vào địa phương tham chiếu đến bảng trang. Khi một bản dịch cho số trang
ảo được sử dụng, có lẽ nó sẽ cần lại sớm, bởi vì các tham chiếu đến các từ trên trang
đó có cả địa phương không gian và không gian.
Theo đó, bộ xử lý hiện đại bao gồm một bộ đệm đặc biệt theo dõi các bản dịch
được sử dụng gần đây. Bộ nhớ cache dịch địa chỉ đặc biệt này theo truyền thống
được gọi là a bộ đệm dịch-lookaside (TLB), mặc dù sẽ chính xác hơn khi gọi nó bộ đệm dịch-
là bộ đệm dịch. TLB tương ứng với mảnh giấy nhỏ mà chúng ta thường sử dụng lookaside (TLB) Một
để ghi lại vị trí của một bộ sách chúng ta tra cứu trong danh mục thẻ; thay vì liên bộ đệm theo dõi các ánh
tục tìm kiếm toàn bộ danh mục, chúng tôi ghi lại vị trí của một số cuốn sách và sử xạ địa chỉ được sử dụng
gần đây để cố gắng
dụng mẩu giấy làm bộ đệm của số cuộc gọi của Thư viện Quốc hội.
tránh truy cập vào bảng
Hình 5.29 cho thấy rằng mỗi mục nhập thẻ trong TLB giữ một phần của trang ảo số và trang.
mỗi mục nhập dữ liệu của TLB giữ một số trang vật lý. Vì chúng tôi
452 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

TLB
Trang ảo Trang vật lý
số Ref bẩn hợp lệ Thẻ Địa chỉ

1 0 1
1 1 1 Trí nhớ vật lý
1 1 1
1 0 1
0 0 0
1 0 1

Bảng trang
Trang vật lý
Ref bẩn hợp lệ hoặc địa chỉ đĩa

1 01
1 00 Lưu trữ đĩa
1 00
1 01
0 00
1 01
1 01
0 00
1 11
1 11
0 00
1 11

HÌNH 5.29 TLB hoạt động như một bộ đệm của bảng trang cho các mục chỉ ánh xạ tới các
trang vật lý. TLB chứa một tập hợp con của các ánh xạ trang ảo-vật lý có trong bảng trang. Các ánh xạ
TLB được hiển thị màu. Vì TLB là bộ đệm, nên nó phải có trường thẻ. Nếu không có mục phù hợp trong
TLB cho một trang, bảng trang phải được kiểm tra. Bảng trang cung cấp số trang vật lý cho trang (sau đó
có thể được sử dụng để xây dựng mục nhập TLB) hoặc cho biết rằng trang nằm trên đĩa, trong trường hợp
xảy ra lỗi trang. Vì bảng trang có một mục nhập cho mỗi trang ảo, không cần trường thẻ; nói cách khác,
không giống như TLB, bảng trang là không phải bộ nhớ cache.

truy cập TLB thay vì bảng trang trên mọi tham chiếu, TLB sẽ cần bao gồm các bit trạng
thái khác, chẳng hạn như các bit bẩn và các bit tham chiếu. Mặc dù Hình 5.29 hiển thị
một bảng trang duy nhất, TLB cũng hoạt động tốt với các bảng trang đa cấp. TLB chỉ cần
tải địa chỉ vật lý và thẻ bảo vệ từ bảng trang cấp cuối cùng.
Trên mỗi tài liệu tham khảo, chúng tôi tra cứu số trang ảo trong TLB. Nếu
chúng tôi nhận được một cú đánh, số trang vật lý được sử dụng để tạo địa chỉ và
bit tham chiếu tương ứng được bật. Nếu bộ xử lý đang thực hiện ghi, bit bẩn
cũng được bật. Nếu xảy ra lỗi trong TLB, chúng tôi phải xác định xem đó là lỗi
trang hay chỉ đơn thuần là bỏ lỡ TLB. Nếu trang tồn tại trong bộ nhớ, thì TLB bỏ
lỡ chỉ cho biết rằng bản dịch bị thiếu. Trong các trường hợp như vậy, bộ xử lý có
thể xử lý lỗi TLB bằng cách tải bản dịch từ bảng trang (cấp độ cuối) vào TLB và
sau đó thử lại tham chiếu. Nếu trang không có trong bộ nhớ, thì bỏ lỡ TLB cho
biết lỗi trang thực sự. Trong trường hợp này, bộ xử lý gọi hệ điều hành bằng một
ngoại lệ. Vì TLB có ít mục hơn số lượng trang trong bộ nhớ chính, việc bỏ lỡ
TLB sẽ thường xuyên hơn nhiều so với lỗi trang thực.
5.7 Bộ nhớ ảo 453

TLB bỏ lỡ có thể được xử lý trong phần cứng hoặc phần mềm. Trong thực tế,
với sự cẩn thận có thể có rất ít sự khác biệt về hiệu suất giữa hai phương pháp,
bởi vì các hoạt động cơ bản là giống nhau trong cả hai trường hợp.
Sau khi bỏ lỡ TLB và bản dịch bị thiếu đã được lấy từ bảng trang, chúng tôi sẽ
cần chọn một mục TLB để thay thế. Vì các bit tham chiếu và bẩn được chứa trong
mục TLB, chúng ta cần sao chép các bit này trở lại mục nhập bảng trang khi
chúng ta thay thế một mục nhập. Các bit này là phần duy nhất của mục nhập TLB
có thể được thay đổi. Sử dụng ghi lại, nghĩa là sao chép các mục này trở lại vào
thời điểm bỏ lỡ thay vì khi chúng được viết là rất hiệu quả, vì chúng tôi hy vọng
tỷ lệ bỏ lỡ TLB sẽ nhỏ. Một số hệ thống sử dụng các kỹ thuật khác để ước tính
các bit tham chiếu và bẩn, loại bỏ nhu cầu ghi vào TLB ngoại trừ tải một mục
nhập bảng mới khi bỏ lỡ.
Một số giá trị điển hình cho TLB có thể là
■ Kích thước TLB: 16 mục512
■ Kích thước khối: 1 mục2 trang 2 trang (thường là 4 byte8 mỗi mục)
■ Thời gian nhấn: 0,5 chu kỳ đồng hồ1
■ Hoa hậu phạt: 10 chu kỳ đồng hồ100
■ Tỷ lệ hoa hậu: 0,01% 1%
Các nhà thiết kế đã sử dụng nhiều loại liên kết trong TLB. Một số hệ thống sử dụng các
TLB nhỏ, hoàn toàn liên kết vì ánh xạ kết hợp hoàn toàn có tỷ lệ bỏ lỡ thấp hơn; hơn nữa,
vì TLB nhỏ, chi phí cho ánh xạ kết hợp hoàn toàn không quá cao. Các hệ thống khác sử
dụng TLB lớn, thường có tính liên kết nhỏ. Với ánh xạ kết hợp hoàn toàn, việc chọn mục
nhập để thay thế trở nên khó khăn vì việc triển khai sơ đồ LRU phần cứng quá tốn kém.
Hơn nữa, vì các lỗi TLB thường xuyên hơn nhiều so với lỗi trang và do đó phải được xử
lý rẻ hơn, chúng tôi không thể mua một thuật toán phần mềm đắt tiền, vì chúng tôi có thể
cho các lỗi trang. Do đó, nhiều hệ thống cung cấp một số hỗ trợ để chọn ngẫu nhiên một
mục để thay thế. Chúng tôi sẽ kiểm tra các chương trình thay thế chi tiết hơn một chút
trong Mục 5.8.

FastMATH TLB
Để xem những ý tưởng này trong một bộ xử lý thực sự, hãy để xem xét kỹ hơn về TLB
của FastMATH Intrinsity. Hệ thống bộ nhớ sử dụng 4 trang KiB và chỉ một không gian
địa chỉ 32 bit; do đó, số trang ảo dài 20 bit. Địa chỉ vật lý có cùng kích thước với địa chỉ
ảo. TLB chứa 16 mục, nó hoàn toàn liên kết và nó được chia sẻ giữa hướng dẫn và tham
chiếu dữ liệu. Mỗi mục rộng 64 bit và chứa thẻ 20 bit (là số trang ảo cho mục TLB đó), số
trang vật lý tương ứng (cũng là 20 bit), bit hợp lệ, bit bẩn và các bit sổ sách khác . Giống
như hầu hết các hệ thống MIPS, nó sử dụng phần mềm để xử lý các lỗi TLB.
Hình 5.31 trong khi hiển thị TLB và một trong các bộ nhớ cache Hình 5.31 cho
thấy các bước trong xử lý yêu cầu đọc hoặc viết. Khi xảy ra lỗi TLB, phần cứng sẽ
lưu số trang của tham chiếu trong một thanh ghi đặc biệt và tạo một
454 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Địa chỉ ảo
31 30 29 14 13 12 11 10 9 3 2 10
Số trang ảo Trang bù
20 12

Bẩn hợp lệ Thẻ Số trang vật lý


=
TLB
=
TLB đánh =
=
=
=
20

Số trang vật lý Trang bù


Địa chỉ vật lý
Chỉ số bộ nhớ Khối Byte
Thẻ địa chỉ vật lý cache bù
bù đắp đắp
18 số 8 4 2

số 8
12 Dữ liệu
Có giá trị Thẻ

Bộ nhớ
cache

=
Bộ nhớ cache đánh

32

Dữ liệu

HÌNH 5.30 TLB và bộ đệm thực hiện quá trình chuyển từ địa chỉ ảo sang mục dữ liệu trong FastMATH Intrinsity . Hình này cho
thấy tổ chức của TLB và bộ đệm dữ liệu, giả sử kích thước trang 4 KiB. Lưu ý rằng kích thước địa chỉ cho việc này máy tính chỉ là 32 bit. Sơ đồ này
tập trung vào việc đọc; Hình 5.31 mô tả cách xử lý viết. Lưu ý rằng không giống như Hình 5.12, thẻ và RAM dữ liệu được phân chia. Bằng cách giải
quyết RAM dữ liệu dài nhưng hẹp với chỉ mục bộ đệm được nối với phần bù khối, chúng tôi chọn từ mong muốn trong khối mà không có bộ ghép
kênh 16: 1. Trong khi bộ đệm được ánh xạ trực tiếp, TLB hoàn toàn liên kết. Việc triển khai TLB kết hợp đầy đủ yêu cầu mọi thẻ TLB phải được so
sánh với số trang ảo, vì mục nhập quan tâm có thể ở bất kỳ đâu trong TLB. (Xem nội dung bộ nhớ địa chỉ trong Xây dựng trên trang 421.) Nếu bit hợp
lệ của mục nhập khớp được bật, quyền truy cập là một lần truy cập TLB và các bit từ số trang vật lý cùng với các bit từ phần bù trang tạo thành chỉ
mục được sử dụng để truy cập vào bộ đệm.
5.7 Bộ nhớ ảo 455

Địa chỉ ảo

Truy cập TLB

Kh
ôn
TLB bỏ lỡ g Đúng
TLB đánh?
ngoại lệ
Địa chỉ vật lý

Không Đúng
Viết?

Cố gắng đọc dữ
liệu
từ bộ nhớ cache Kh
ôn
g Viết quyền Đúng
truy cập
bit trên?
Cache bỏ lỡ
gian hàng trong Viết bảo vệ Hãy thử viết dữ
khi đọc khối Kh
ngoại lệ
liệu
ôn Bộ nhớ cache Đún để lưu trữ bộ
g đánh? g nhớ cache

Cung cấp dữ liệu


đến CPU
Cache bỏ lỡ gian Không Đúng
hàng Bộ nhớ cache đánh?
trong khi đọc
khối

Viết dữ liệu vào bộ đệm, cập nhật bit bẩn và đặt dữ liệu và
địa chỉ vào bộ đệm ghi

HÌNH 5.31 Xử lý đọc hoặc ghi vào Bộ nhớ cache và bộ nhớ cache FastMATH Intrinsity. Nếu TLB tạo ra một hit, bộ nhớ cache có thể
được truy cập với địa chỉ vật lý kết quả. Để đọc, bộ đệm tạo ra một cú đánh hoặc bỏ lỡ và cung cấp dữ liệu hoặc gây ra một gian hàng trong khi dữ
liệu được mang từ bộ nhớ. Nếu thao tác là ghi, một phần của mục nhập bộ đệm được ghi đè cho một lần nhấn và dữ liệu được gửi đến bộ đệm ghi nếu
chúng ta giả sử ghi qua. Một lỗi ghi giống như bỏ lỡ đọc ngoại trừ khối được sửa đổi sau khi nó được đọc từ bộ nhớ. Ghi lại yêu cầu ghi để đặt một
bit bẩn cho khối bộ đệm và bộ đệm ghi chỉ được tải với toàn bộ khối khi bỏ lỡ đọc hoặc ghi bỏ lỡ nếu khối được thay thế bị bẩn. Lưu ý rằng một lần
nhấn TLB và một lần nhấn bộ đệm là các sự kiện độc lập, nhưng một lần nhấn bộ đệm chỉ có thể xảy ra sau khi xảy ra một lần nhấn TLB, điều đó có
nghĩa là dữ liệu phải có trong bộ nhớ. Mối quan hệ giữa bỏ lỡ TLB và bỏ lỡ bộ nhớ cache được xem xét thêm trong ví dụ sau và các bài tập ở cuối
chương này. Lưu ý rằng kích thước địa chỉ cho máy tính này chỉ là 32 bit.
456 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

ngoại lệ. Ngoại lệ gọi hệ điều hành, xử lý bỏ lỡ trong phần mềm. Để tìm địa chỉ vật
lý cho trang bị thiếu, TLB bỏ lỡ lập chỉ mục bảng trang bằng cách sử dụng số trang
của địa chỉ ảo và thanh ghi bảng trang, cho biết địa chỉ bắt đầu của bảng trang quy
trình đang hoạt động. Sử dụng một bộ hướng dẫn hệ thống đặc biệt có thể cập nhật
TLB, hệ điều hành đặt địa chỉ vật lý từ bảng trang vào TLB. Một TLB bỏ lỡ mất
khoảng 13 chu kỳ đồng hồ, giả sử mã và mục nhập bảng trang nằm trong bộ đệm
lệnh và bộ đệm dữ liệu, tương ứng. Lỗi trang thực sự xảy ra nếu mục nhập bảng trang
không có địa chỉ vật lý hợp lệ. Phần cứng duy trì một chỉ mục cho biết mục nhập
được đề xuất để thay thế; nó được chọn ngẫu nhiên.
Có một sự phức tạp thêm cho các yêu cầu ghi: cụ thể là bit truy cập ghi trong
TLB phải được kiểm tra. Bit này ngăn chương trình viết thành các trang mà nó
chỉ đọc quyền truy cập. Nếu chương trình thử ghi và bit truy cập ghi bị tắt, một
ngoại lệ được tạo. Bit truy cập ghi là một phần của cơ chế bảo vệ, mà chúng ta sẽ
thảo luận trong thời gian ngắn.

Tích hợp bộ nhớ ảo, TLB và bộ nhớ cache


Các hệ thống bộ nhớ và bộ nhớ cache ảo của chúng tôi hoạt động cùng nhau như
một hệ thống phân cấp, do đó dữ liệu không thể có trong bộ đệm trừ khi nó có
trong bộ nhớ chính. Hệ điều hành giúp duy trì hệ thống phân cấp này bằng cách
xóa nội dung của bất kỳ trang nào khỏi bộ đệm khi nó quyết định di chuyển trang
đó sang bộ nhớ phụ. Đồng thời, HĐH sửa đổi các bảng trang và TLB, do đó nỗ
lực truy cập bất kỳ dữ liệu nào trên trang được di chuyển sẽ tạo ra lỗi trang.
Trong trường hợp tốt nhất, một địa chỉ ảo được TLB dịch và gửi đến bộ đệm
nơi tìm thấy dữ liệu phù hợp, lấy và gửi lại cho bộ xử lý. Trong trường hợp xấu
nhất, một tham chiếu có thể bỏ lỡ trong cả ba thành phần của hệ thống phân cấp
bộ nhớ: TLB, bảng trang và bộ đệm. Ví dụ sau minh họa các tương tác này chi
tiết hơn.

Hoạt động tổng thể của một hệ thống phân cấp bộ nhớ

VÍ DỤ Trong một hệ thống phân cấp bộ nhớ như thế Hình 5.30, bao gồm TLB và bộ
đệm được sắp xếp như được hiển thị, tham chiếu bộ nhớ có thể gặp ba loại
bỏ lỡ khác nhau: bỏ lỡ TLB, lỗi trang và bỏ lỡ bộ nhớ cache. Hãy xem xét tất
cả các kết hợp của ba sự kiện này với một hoặc nhiều xảy ra (bảy khả năng).
Đối với mỗi khả năng, nêu rõ liệu sự kiện này có thực sự xảy ra và trong
hoàn cảnh nào.

Hình 5.32 hiển thị tất cả các kết hợp và liệu mỗi có thể trong thực tế.

TRẢ LỜI
5.7 Bộ nhớ ảo 457

Trang
TLB bàn Bộ nhớ Khả thi? Nếu vậy, trong hoàn cảnh nào?
cache
Đánh Đánh Cô Có thể, mặc dù bảng trang không bao giờ thực sự được kiểm tra nếu TLB truy cập.
TLB bỏ lỡ, nhưng mục nhập được tìm thấy trong bảng trang; sau khi thử lại, dữ liệu
Cô Đánh Đánh được tìm thấy trong bộ đệm.
TLB bỏ lỡ, nhưng mục nhập được tìm thấy trong bảng trang; sau khi thử lại, dữ liệu
Cô Đánh Cô bị bỏ lỡ trong bộ đệm.
Cô Cô Cô TLB bị bỏ lỡ và theo sau là lỗi trang; sau khi thử lại, dữ liệu phải bỏ lỡ trong bộ đệm.
Đánh Cô Cô Không thể: không thể có bản dịch trong TLB nếu trang không có trong bộ nhớ.
Đánh Cô Đánh Không thể: không thể có bản dịch trong TLB nếu trang không có trong bộ nhớ.
Không thể: dữ liệu không thể được cho phép trong bộ đệm nếu trang không có trong
Cô Cô Đánh bộ nhớ.

HÌNH 5.32 Sự kết hợp có thể của các sự kiện trong TLB, hệ thống bộ nhớ ảo và bộ đệm.
Ba trong số các kết hợp này là không thể và một là có thể (TLB hit, hit bảng trang, bộ đệm bỏ lỡ) nhưng
không bao giờ phát hiện.
sử dụng thủ thuật này.
Để kéo nó ra, phải có sự
phối hợp cẩn thận giữa
Xây dựng: Hình 5.32 giả định rằng tất cả các địa chỉ bộ nhớ được dịch sang địa kích thước trang tối thiểu,
chỉ vật lý trước khi bộ đệm được truy cập. Trong tổ chức này, bộ đệm là lập chỉ mục kích thước bộ đệm và
vật lý và gắn thẻ vật lý (cả chỉ mục bộ đệm và thẻ là vật lý , thay vì ảo, địa chỉ). Trong tính liên kết. RISC-V yêu
một hệ thống như vậy, lượng thời gian để truy cập bộ nhớ, giả sử nhấn bộ đệm, phải cầu bộ nhớ cache cư xử
phù hợp với cả quyền truy cập TLB và quyền truy cập bộ đệm; tất nhiên, những truy như
cập này có thể được đường ống.
Ngoài ra, bộ xử lý có thể lập chỉ mục bộ đệm với một địa chỉ hoàn toàn hoặc một phần
ảo. Điều này được gọi là a bộ nhớ cache hầu như được giải quyếtvà nó sử dụng các thẻ là
địa chỉ ảo; do đó, một bộ đệm như vậy là hầu như được lập chỉ mục và hầu như được gắn
thẻTrong các bộ đệm như vậy, phần cứng dịch địa chỉ (TLB) không được sử dụng trong
quá trình truy cập bộ đệm thông thường, vì bộ đệm được truy cập với một địa chỉ ảo chưa
được dịch sang địa chỉ vật lý. Điều này đưa TLB ra khỏi đường dẫn tới hạn, giảm độ trễ bộ
đệm. Tuy nhiên, khi xảy ra lỗi bộ đệm, bộ xử lý cần dịch địa chỉ sang địa chỉ vật lý để có
thể lấy khối bộ đệm từ bộ nhớ chính.
Khi bộ đệm được truy cập với một địa chỉ ảo và các trang được chia sẻ giữa các
quy trình (có thể truy cập chúng với các địa chỉ ảo khác nhau), có khả năng bí
danhSự xa lánh xảy ra khi cùng một đối tượng có hai tên tên, trong trường hợp này,
hai địa chỉ ảo cho cùng một trang. Sự mơ hồ này tạo ra một vấn đề, bởi vì một từ trên
một trang như vậy có thể được lưu trữ ở hai vị trí khác nhau, mỗi vị trí tương ứng với
các địa chỉ ảo riêng biệt. Sự mơ hồ này sẽ cho phép một chương trình ghi dữ liệu mà
không cần chương trình khác biết rằng dữ liệu đã thay đổi. Bộ nhớ cache hầu như
được xử lý hoàn toàn giới thiệu các giới hạn thiết kế trên bộ đệm và TLB để giảm bí
danh hoặc yêu cầu hệ điều hành và có thể người dùng thực hiện các bước để đảm
bảo rằng bí danh không xảy ra.
Một sự thỏa hiệp chung giữa hai điểm thiết kế này là các bộ nhớ cache hầu như được
lập chỉ mục đôi khi chỉ sử dụng phần bù trang của địa chỉ, đây thực sự là một địa chỉ vật lý
vì nó không được dịch nhưng sử dụng các thẻ vật lý. Những thiết kế, đó là hầu như được
lập chỉ mục nhưng được gắn thẻ vật lý, cố gắng đạt được các lợi thế về hiệu suất của các
bộ nhớ cache được lập chỉ mục với các lợi thế đơn giản về mặt kiến trúc của a bộ nhớ
cache giải quyết vật lýVí dụ, không có vấn đề bí danh trong trường hợp này. Hình 5.30 giả
định kích thước trang 4 KiB, nhưng nó thực sự là 16 KiB, vì vậy FastMATH nội tại có thể
bộ nhớ cache hầu như được giải quyết Một bộ đệm đó là truy cập bằng một địa chỉ ảo chứ
không phải là một địa chỉ vật lý.

bí danh Một tình huống trong đó hai địa chỉ truy cập vào cùng một đối tượng; nó có thể xảy ra
trong bộ nhớ ảo khi có hai địa chỉ ảo cho cùng một trang vật lý.

bộ nhớ cache giải quyết vật lý Một bộ đệm đó là được giải quyết bằng một địa chỉ vật
lý.
458 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Tuy nhiên được gắn thẻ vật lý và lập chỉ mục, nhưng nó không bắt buộc thực hiện này.
Cho
ví dụ, hầu như được lập chỉ mục, bộ nhớ cache dữ liệu được gắn thẻ vật lý có thể sử
dụng logic bổ sung
đảm bảo rằng phần mềm không thể nói sự khác biệt.

Thực hiện bảo vệ với bộ nhớ ảo


Có lẽ chức năng quan trọng nhất của bộ nhớ ảo hiện nay là cho phép chia sẻ
một bộ nhớ chính duy nhất bằng nhiều quy trình, trong khi cung cấp bảo vệ bộ
nhớ
trong số các quy trình này và hệ điều hành. Cơ chế bảo vệ phải
đảm bảo rằng mặc dù nhiều quy trình đang chia sẻ cùng một bộ nhớ chính, một
quá trình từ bỏ không thể ghi vào không gian địa chỉ của quy trình người dùng khác
hoặc vào
hệ điều hành cố ý hoặc vô ý. Các bit truy cập ghi trong
TLB có thể bảo vệ một trang khỏi bị viết. Không có mức độ bảo vệ này ,
virus máy tính sẽ còn phổ biến hơn nữa.

Phần cứng / Để cho phép hệ điều hành thực hiện bảo vệ trong bộ nhớ ảo
Phần mềm hệ thống, phần cứng phải cung cấp ít nhất ba khả năng cơ bản được tóm tắt
phía dưới. Lưu ý rằng hai yêu cầu đầu tiên là cùng một yêu cầu khi cần cho ảo
Giao diện máy móc (Mục 5.6).
chế độ giám sát viên Cũng 1. Hỗ trợ ít nhất hai chế độ cho biết liệu quá trình chạy có phải là a hay không
thế
quy trình người dùng hoặc quy trình hệ điều hành, được gọi khác nhau là a
gọi chế độ hạt nhânA. giám sát viên
chế độ chỉ ra rằng a quá trình, a hạt nhân quá trình, hoặc một điều hành quá trình.
quá trình chạy là một 2. Cung cấp một phần trạng thái bộ xử lý mà quy trình người dùng có thể đọc
nhưng
quy trình hệ điều hành.
không viết. Trạng thái này bao gồm bit chế độ người dùng / người giám sát,
ra lệnh
bộ xử lý ở chế độ người dùng hay người giám sát, con trỏ bảng trang ,
và TLB. Để viết các yếu tố này, hệ điều hành sử dụng đặc biệt
hướng dẫn chỉ có sẵn trong chế độ giám sát.
3. Cung cấp các cơ chế theo đó bộ xử lý có thể đi từ chế độ người dùng đến
chế độ giám sát và ngược lại. Hướng đầu tiên thường được thực hiện
gọi hệ thống Một điều đặc bởi a gọi hệ thống ngoại lệ, được thực hiện như một hướng dẫn đặc biệt
biệt (ecall trong
hướng dẫn chuyển tập lệnh RISC-V) chuyển điều khiển đến một vị trí chuyên dụng
kiểm soát từ chế độ người mã giám sát không gian. Như với bất kỳ ngoại lệ khác, bộ đếm chương
dùng trình
từ điểm của cuộc gọi hệ thống được lưu trong chương trình ngoại lệ giám sát
đến một địa điểm dành riêng viên
trong không gian mã giám
sát , quầy (SEPC) và bộ xử lý được đặt ở chế độ giám sát. Để trở về
viện dẫn ngoại lệ
cơ chế trong quá trình.
đến chế độ người dùng từ ngoại lệ, sử dụng giám sát viên ngoại lệ trở lại
(đau khổ)
hướng dẫn, đặt lại về chế độ người dùng và nhảy đến địa chỉ trong SEPC .
Bằng cách sử dụng các cơ chế này và lưu trữ các bảng trang trong hệ điều hành
không gian địa chỉ, hệ điều hành có thể thay đổi các bảng trang trong khi ngăn
chặn a
quá trình người dùng thay đổi chúng, đảm bảo rằng quy trình người dùng chỉ có
thể truy cập
lưu trữ được cung cấp cho nó bởi hệ điều hành.
5.7 Bộ nhớ ảo 459

hầu như được giải


Chúng tôi cũng muốn ngăn chặn một quá trình đọc dữ liệu của một quy trình khác. quyết, và một loạt các
Ví dụ: chúng tôi sẽ muốn một chương trình sinh viên đọc một bài kiểm tra sắp tới giải pháp, chẳng hạn
nếu nó nằm trong bộ nhớ của bộ xử lý. Khi chúng tôi bắt đầu chia sẻ bộ nhớ chính, như định danh quy
chúng tôi phải cung cấp khả năng cho một quy trình để bảo vệ dữ liệu của nó khỏi cả trình, được sử dụng để
đảm bảo rằng một quy
đọc và viết bởi một quy trình khác; nếu không, chia sẻ bộ nhớ chính sẽ là một phước
trình có được dữ liệu
lành hỗn hợp!
của riêng nó.
Hãy nhớ rằng mỗi quy trình có không gian địa chỉ ảo riêng. Do đó, nếu hệ điều
hành giữ các bảng trang được sắp xếp sao cho các trang ảo độc lập ánh xạ để phân
tách các trang vật lý, một quy trình sẽ không thể truy cập vào dữ liệu khác. Tất nhiên,
điều này cũng yêu cầu quy trình người dùng không thể thay đổi ánh xạ bảng trang.
Hệ điều hành có thể đảm bảo an toàn nếu nó ngăn quá trình người dùng sửa đổi các
bảng trang của riêng mình. Tuy nhiên, hệ điều hành phải có khả năng sửa đổi các
bảng trang. Đặt các bảng trang trong không gian địa chỉ được bảo vệ của hệ điều
hành đáp ứng cả hai yêu cầu.
Khi các quy trình muốn chia sẻ thông tin theo cách hạn chế, hệ điều hành phải hỗ
trợ chúng, vì việc truy cập thông tin của quy trình khác yêu cầu thay đổi bảng trang
của quy trình truy cập. Bit truy cập ghi có thể được sử dụng để hạn chế chia sẻ chỉ
đọc chia sẻ và giống như phần còn lại của bảng trang, bit này chỉ có thể được thay
đổi bởi hệ điều hành. Để cho phép một quy trình khác, giả sử, P1, đọc một trang
thuộc sở hữu của quy trình P2, P2 sẽ yêu cầu hệ điều hành tạo một mục nhập bảng
trang cho một trang ảo trong không gian địa chỉ P1, trỏ đến cùng một trang vật lý mà
P2 muốn chia sẻ . Hệ điều hành có thể sử dụng bit bảo vệ ghi để ngăn P1 ghi dữ liệu,
nếu đó là mong muốn của P2. Bất kỳ bit nào xác định quyền truy cập cho một trang
phải được bao gồm trong cả bảng trang và TLB, vì bảng trang chỉ được truy cập khi
bỏ lỡ TLB.

Xây dựng: Khi hệ điều hành quyết định thay đổi từ quá trình chạy P1 để chạy quá trình
P2 (được gọi là a chuyển đổi bối cảnh hoặc là quá trình chuyển đổi), nó phải đảm bảo rằng
P2 không thể truy cập vào các bảng trang của P1 vì điều đó sẽ ảnh hưởng đến sự bảo vệ.
Nếu không có TLB, nó đủ để thay đổi thanh ghi bảng trang để trỏ đến bảng trang P2 (thay
vì P1) với một TLB, chúng ta phải xóa các mục TLB thuộc về P1—cả hai để bảo vệ dữ liệu
của P1 và buộc TLB phải tải các mục nhập cho P2. Nếu tốc độ chuyển đổi quy trình cao,
điều này có thể khá kém hiệu quả. Ví dụ: P2 chỉ có thể tải một vài mục TLB trước khi hệ
điều hành chuyển về P1. Thật không may, P1 sau đó sẽ thấy rằng tất cả các mục TLB của
nó đã biến mất và sẽ phải trả các lần bỏ lỡ TLB để tải lại chúng. Vấn đề này phát sinh do
các địa chỉ ảo được sử dụng bởi P1 và P2 có thể giống nhau và chúng ta phải xóa TLB để
tránh nhầm lẫn các địa chỉ này.
Một lựa chọn phổ biến là mở rộng không gian địa chỉ ảo bằng cách thêm a quá
trình định danh hoặc là định danh nhiệm vụFastMATH Intrinsity có 8 bit. ID không
gian địa chỉ (NÓI) lĩnh vực cho mục đích này. Trường nhỏ này xác định quy trình hiện
đang chạy; nó được giữ trong một thanh ghi được tải bởi hệ điều hành khi nó chuyển
đổi các quy trình. RISC-V cũng cung cấp ASID để giảm xả TLB trên các công tắc ngữ
cảnh. Mã định danh quy trình được nối với phần thẻ của TLB, do đó, lần nhấn TLB
chỉ xảy ra nếu cả hai số trang và quá trình định danh phù hợp. Sự kết hợp này giúp
loại bỏ sự cần thiết phải xóa TLB, ngoại trừ trong những trường hợp hiếm hoi, chẳng
hạn như tái chế ASID .
Các sự cố tương tự có thể xảy ra đối với bộ đệm, vì trên bộ chuyển đổi quy trình,
bộ đệm sẽ chứa dữ liệu từ quy trình đang chạy. Những vấn đề này phát sinh theo
nhiều cách khác nhau đối với các bộ nhớ cache được giải quyết một cách vật lý và
chuyển đổi bối cảnh
Việc thay đổi trạng thái bên trong của bộ xử lý để cho phép một quy trình khác sử dụng bộ xử lý
bao gồm lưu trạng thái cần thiết để trở về quy trình thực thi hiện tại.
460 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Xử lý các lỗi TLB và lỗi trang


Mặc dù việc dịch các địa chỉ ảo sang vật lý với TLB rất đơn giản khi chúng tôi nhận
được một cú đánh TLB, như chúng tôi đã thấy trước đó, việc xử lý các lỗi TLB và lỗi
trang phức tạp hơn. Một lỗi TLB xảy ra khi không có mục nào trong TLB khớp với
một địa chỉ ảo. Hãy nhớ lại rằng bỏ lỡ TLB có thể chỉ ra một trong hai khả năng :
1. Trang này có trong bộ nhớ và chúng tôi chỉ cần tạo mục nhập TLB bị thiếu.
2. Trang này không có trong bộ nhớ và chúng ta cần chuyển điều khiển sang
hệ điều hành để xử lý lỗi trang.
Xử lý lỗi TLB hoặc lỗi trang yêu cầu sử dụng cơ chế ngoại lệ để làm gián
đoạn quá trình hoạt động, chuyển điều khiển sang hệ điều hành và sau đó tiếp tục
thực hiện quy trình bị gián đoạn. Một lỗi trang sẽ được nhận ra đôi khi trong chu
kỳ đồng hồ được sử dụng để truy cập bộ nhớ. Để khởi động lại hướng dẫn sau
khi xử lý lỗi trang, bộ đếm chương trình của hướng dẫn gây ra lỗi trang phải
được lưu. Các giám sát viên chương trình ngoại lệ (SEPC) đăng ký được sử dụng
để giữ giá trị này.
Ngoài ra, ngoại lệ lỗi TLB hoặc lỗi trang phải được xác nhận vào cuối cùng của chu
kỳ đồng hồ xảy ra truy cập bộ nhớ, để chu kỳ đồng hồ tiếp theo sẽ bắt đầu xử lý ngoại lệ
thay vì tiếp tục thực hiện lệnh thông thường. Nếu lỗi trang không được nhận ra trong chu
kỳ đồng hồ này, một lệnh tải có thể ghi đè lên một thanh ghi và điều này có thể là thảm
họa khi chúng tôi cố gắng khởi động lại lệnh. Ví dụ, xem xét các hướng dẫn lb x10, 0 (x10):
máy tính phải có khả năng ngăn giai đoạn đường ống ghi xảy ra; mặt khác, nó không thể
khởi động lại đúng hướng dẫn, vì nội dung của x10 sẽ bị phá hủy. Một biến chứng tương
tự phát sinh trên các cửa hàng. Chúng ta phải ngăn việc ghi vào bộ nhớ thực sự hoàn
thành khi có lỗi trang; điều này thường được thực hiện bằng cách phân tách dòng điều
khiển ghi vào bộ nhớ.

Phần cứng / Giữa thời gian chúng tôi bắt đầu thực hiện trình xử lý ngoại lệ trong hoạt động
Phần mềm hệ thống và thời gian mà hệ điều hành đã lưu tất cả trạng thái của quy trình ,
hệ điều hành đặc biệt dễ bị tổn thương. Ví dụ, nếu một ngoại lệ khác
Giao diện xảy ra khi chúng tôi đang xử lý ngoại lệ đầu tiên trong hệ điều hành, the
đơn vị kiểm soát sẽ ghi đè lên thanh ghi liên kết ngoại lệ, khiến nó không thể
trở về hướng dẫn gây ra lỗi trang! Chúng ta có thể tránh thảm họa này bằng cách
ngoại lệ cho phép Cũng
thế cung cấp khả năng vô hiệu hóa và cho phép ngoại lệKhi một ngoại lệ đầu tiên.
xảy ra, bộ xử lý đặt một chút vô hiệu hóa tất cả các ngoại lệ khác; điều này có thể
gọi là ngắt kích hoạt. xảy ra
Một tín hiệu hoặc hành động
đó đồng thời bộ xử lý đặt bit chế độ giám sát. Hệ điều hành
kiểm soát xem sau đó sẽ lưu trạng thái vừa đủ để cho phép nó phục hồi nếu một ngoại lệ khác xảy
ra
quá trình đáp ứng
ngoại lệ hay không;
cụ thể là giám sát viên ngoại lệ rogram truy cập (SEPC) và ngoại lệ giám sát viên
cần thiết để ngăn chặn nguyên nhân (SCAUSE) đăng ký, như chúng ta đã thấy Chương 4 hồ sơ lý do cho
ngoại lệ. SEPC và SCAUSE trong RISC-V là hai trong số các thanh ghi điều
sự xuất hiện của khiển đặc biệt
ngoại lệ trong thời gian giúp với các ngoại lệ, bỏ lỡ TLB và lỗi trang. Hệ điều hành có thể
sau đó ngoại lệ có thể áp dụng lại. Các bước này đảm bảo rằng các ngoại lệ sẽ
khoảng thời gian trước khi không gây ra
bộ xử lý đã được lưu an toàn bộ xử lý để mất bất kỳ trạng thái nào và do đó không thể khởi động lại thực thi
nhà nước cần thiết để khởi
động lại. hướng dẫn gián đoạn.
5.7 Bộ nhớ ảo 461

Khi hệ điều hành biết địa chỉ ảo gây ra lỗi trang, nó phải hoàn thành ba bước :
1. Tra cứu mục nhập bảng trang bằng địa chỉ ảo và tìm vị trí của trang được
tham chiếu trong bộ nhớ phụ.
2. Chọn một trang vật lý để thay thế; nếu trang được chọn bị bẩn, nó phải
được ghi vào bộ nhớ phụ trước khi chúng ta có thể mang một trang ảo mới
vào trang vật lý này.
3. Bắt đầu đọc để đưa trang được tham chiếu từ bộ nhớ phụ vào trang vật lý
đã chọn.
Tất nhiên, bước cuối cùng này sẽ mất hàng triệu chu kỳ đồng hồ của bộ xử lý cho
các đĩa (vì vậy trang thứ hai sẽ bị bẩn); theo đó, hệ điều hành thường sẽ chọn một
quy trình khác để thực thi trong bộ xử lý cho đến khi truy cập đĩa hoàn thành.
Bởi vì hệ điều hành đã lưu trạng thái của quy trình, nó có thể tự do kiểm soát bộ
xử lý cho quy trình khác.
Khi đọc trang từ bộ nhớ phụ hoàn tất, hệ điều hành có thể khôi phục trạng thái
của quy trình ban đầu gây ra lỗi trang và thực thi lệnh trả về từ ngoại lệ. Hướng
dẫn này sẽ đặt lại bộ xử lý từ kernel sang chế độ người dùng, cũng như khôi phục
bộ đếm chương trình. Sau đó, quá trình người dùng thực hiện lại hướng dẫn bị lỗi,
truy cập trang được yêu cầu thành công và tiếp tục thực hiện.
Các ngoại lệ lỗi trang cho truy cập dữ liệu rất khó thực hiện đúng trong bộ xử
lý vì sự kết hợp của ba đặc điểm :
1. Chúng xảy ra ở giữa các hướng dẫn, không giống như lỗi trang hướng dẫn.
2. Hướng dẫn không thể được hoàn thành trước khi xử lý ngoại lệ.
3. Sau khi xử lý ngoại lệ, hướng dẫn phải được khởi động lại như thể không
có gì xảy ra.
Hướng dẫn có thể khởi động lạiđể ngoại lệ có thể được xử lý và hướng dẫn sau
đó tiếp tục, tương đối dễ dàng trong một kiến trúc như RISC-V. Bởi vì mỗi lệnh
chỉ viết một mục dữ liệu và việc ghi này xảy ra ở cuối chu trình hướng dẫn, có thể khởi động lại
chúng ta chỉ có thể ngăn chặn hướng dẫn hoàn thành (bằng cách không viết) và chỉ dẫn An
khởi động lại hướng dẫn ở đầu. hướng dẫn có thể
tiếp tục thực hiện sau
một ngoại lệ được giải
Xây dựng: Đối với bộ xử lý với các hướng dẫn phức tạp hơn có thể chạm vào nhiều vị trí bộ quyết
nhớ và ghi nhiều mục dữ liệu, làm cho hướng dẫn có thể khởi động lại khó hơn nhiều. Xử lý một không có ngoại lệ
lệnh có thể tạo ra một số lỗi trang ở giữa hướng dẫn. Ví dụ: bộ xử lý x86 có hướng dẫn di ảnh hưởng đến kết quả của
chuyển khối chạm vào hàng ngàn từ dữ liệu. Trong các bộ xử lý như vậy, các hướng dẫn chỉ dẫn.
thường không thể được khởi động lại ngay từ đầu, như chúng tôi làm cho các hướng dẫn RISC-
V. Thay vào đó, hướng dẫn phải được gián đoạn và sau đó tiếp tục giữa dòng trong quá trình
thực hiện. Tiếp tục một lệnh ở giữa thực thi của nó thường yêu cầu lưu một số trạng thái đặc
biệt, xử lý ngoại lệ và khôi phục trạng thái đặc biệt đó. Làm cho công việc này đúng cách đòi hỏi
sự phối hợp cẩn thận và chi tiết giữa mã xử lý ngoại lệ trong hệ điều hành và phần cứng.
462 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Xây dựng: Thay vì trả thêm một mức độ không mong muốn trên mỗi lần truy cập
bộ nhớ, the Bộ nhớ ảo (Mục 5.6) duy trì a bảng trang bóng ánh xạ trực tiếp từ không
gian địa chỉ ảo của khách đến không gian địa chỉ vật lý của phần cứng. Bằng cách
phát hiện tất cả các sửa đổi cho bảng trang khách, VMM có thể đảm bảo các mục
nhập bảng trang bóng được phần cứng sử dụng cho các bản dịch tương ứng với các
mục của môi trường HĐH khách, ngoại trừ các trang vật lý chính xác được thay thế
cho các trang thực trong bảng khách. Do đó, VMM phải bẫy mọi nỗ lực của HĐH
khách để thay đổi bảng trang hoặc truy cập con trỏ bảng trang. Điều này thường
được thực hiện bằng cách viết bảo vệ các bảng trang khách và bẫy bất kỳ quyền truy
cập nào vào con trỏ bảng trang bởi một HĐH khách. Như đã lưu ý ở trên, điều thứ hai
xảy ra một cách tự nhiên nếu truy cập con trỏ bảng trang là một hoạt động đặc quyền.

Xây dựng: Phần cuối cùng của kiến trúc để ảo hóa là I / O. Đây là cho đến nay
phần khó nhất của ảo hóa hệ thống do số lượng thiết bị I / O ngày càng tăng được
gắn vào máy tính và sự đa dạng mở rộng của các loại thiết bị I / O. Một khó khăn
khác là việc chia sẻ một thiết bị thực sự giữa nhiều máy ảo và một thiết bị khác đến
từ việc hỗ trợ vô số trình điều khiển thiết bị được yêu cầu, đặc biệt là nếu các HĐH
khách khác nhau được hỗ trợ trên cùng một hệ thống VM. Ảo ảnh VM có thể được
duy trì bằng cách cung cấp cho mỗi phiên bản chung VM của từng loại trình điều
khiển thiết bị I / O, sau đó để lại cho VMM để xử lý I / O thực .

Xây dựng: Ngoài việc ảo hóa tập lệnh cho một máy ảo, một cái khác thách thức là ảo hóa bộ
nhớ ảo, vì mỗi HĐH khách trong mỗi máy ảo quản lý bộ bảng trang riêng. Để thực hiện công
việc này, VMM tách biệt các khái niệm có thật không và trí nhớ vật lý (thường được xử lý đồng
nghĩa) và tạo ra bộ nhớ thực một cấp độ trung gian riêng biệt giữa bộ nhớ ảo và bộ nhớ vật lý.
(Một số sử dụng các điều khoản bộ nhớ ảo, trí nhớ vật lý, và bộ nhớ máy để đặt tên cho ba cấp
độ giống nhau.) HĐH khách ánh xạ bộ nhớ ảo tới bộ nhớ thực thông qua các bảng trang của nó
và các bảng trang VMM ánh xạ bộ nhớ thực của khách vào bộ nhớ vật lý. Kiến trúc bộ nhớ ảo
thường được chỉ định thông qua các bảng trang, như trong IBM VM / 370, x86 và RISC-V .

Tóm tắt
Bộ nhớ ảo là tên của cấp độ phân cấp bộ nhớ quản lý bộ nhớ đệm giữa bộ nhớ
chính và bộ nhớ phụ. Bộ nhớ ảo cho phép một chương trình duy nhất mở rộng
không gian địa chỉ của nó vượt quá giới hạn của bộ nhớ chính. Quan trọng hơn,
bộ nhớ ảo hỗ trợ chia sẻ bộ nhớ chính giữa nhiều quy trình hoạt động đồng thời,
theo cách được bảo vệ.
Quản lý hệ thống phân cấp bộ nhớ giữa bộ nhớ chính và đĩa là một thách thức
vì chi phí cao của lỗi trang. Một số kỹ thuật được sử dụng để giảm tỷ lệ bỏ lỡ :
1. Các trang được làm lớn để tận dụng địa phương không gian và để giảm tỷ
lệ bỏ lỡ.
2. Ánh xạ giữa địa chỉ ảo và địa chỉ vật lý, được triển khai với bảng trang,
được kết hợp hoàn toàn để một trang ảo có thể được đặt ở bất kỳ đâu trong
bộ nhớ chính.
3. Hệ điều hành sử dụng các kỹ thuật, chẳng hạn như LRU và bit tham chiếu,
để chọn trang nào sẽ thay thế.
5.7 Bộ nhớ ảo 463

Viết vào bộ nhớ phụ rất tốn kém, vì vậy bộ nhớ ảo sử dụng sơ đồ ghi lại và cũng
theo dõi xem một trang có thay đổi hay không (sử dụng một bit bẩn) để tránh viết
các trang sạch.
Cơ chế bộ nhớ ảo cung cấp dịch địa chỉ từ một địa chỉ ảo được chương trình sử
dụng sang không gian địa chỉ vật lý được sử dụng để truy cập bộ nhớ. Dịch địa chỉ
này cho phép chia sẻ bộ nhớ chính được bảo vệ và cung cấp một số lợi ích bổ sung,
chẳng hạn như đơn giản hóa việc phân bổ bộ nhớ. Đảm bảo rằng các quy trình được
bảo vệ lẫn nhau yêu cầu chỉ hệ điều hành mới có thể thay đổi bản dịch địa chỉ, được
thực hiện bằng cách ngăn các chương trình người dùng thay đổi bảng trang. Việc chia
sẻ các trang được kiểm soát giữa các quy trình có thể được thực hiện với sự trợ giúp
của hệ điều hành và các bit truy cập trong bảng trang cho biết liệu chương trình người
dùng có đọc hoặc ghi quyền truy cập vào một trang hay không.
Nếu bộ xử lý phải truy cập một cư dân bảng trang trong bộ nhớ để dịch mọi
truy cập, bộ nhớ ảo sẽ quá đắt, vì bộ nhớ cache sẽ là vô nghĩa! Thay vào đó, TLB
hoạt động như một bộ đệm cho các bản dịch từ bảng trang. Địa chỉ sau đó được
dịch từ ảo sang vật lý bằng cách sử dụng các bản dịch trong TLB .
Bộ nhớ cache, bộ nhớ ảo và TLB đều dựa vào một bộ nguyên tắc và chính
sách chung. Phần tiếp theo thảo luận về khung chung này.

Mặc dù bộ nhớ ảo được phát minh để cho phép một bộ nhớ nhỏ hoạt động như một bộ Hiểu hiệu suất
nhớ lớn, sự khác biệt về hiệu suất giữa bộ nhớ phụ và bộ nhớ chính có nghĩa là nếu một
chương trình thường xuyên truy cập nhiều bộ nhớ ảo hơn bộ nhớ vật lý, nó sẽ chạy rất chương trình
chậm. Một chương trình như vậy sẽ liên tục hoán đổi các trang giữa bộ nhớ chính và bộ
nhớ phụ, được gọi đập mạnhĐập là một thảm họa nếu nó xảy ra, nhưng nó rất hiếm. Nếu
chương trình của bạn bị hỏng, giải pháp dễ nhất là chạy nó trên máy tính có nhiều bộ nhớ
hơn hoặc mua thêm bộ nhớ cho máy tính của bạn. Một lựa chọn phức tạp hơn là kiểm tra
lại thuật toán và cấu trúc dữ liệu của bạn để xem liệu bạn có thể thay đổi địa phương hay
không và do đó giảm số lượng trang mà chương trình của bạn sử dụng đồng thời. Tập hợp
các trang phổ biến này được gọi một cách không chính thức.bộ làm việc.
Một vấn đề hiệu suất phổ biến hơn là bỏ lỡ TLB. Vì TLB chỉ có thể xử lý 32
mục64 trang cùng một lúc, một chương trình có thể dễ dàng thấy tỷ lệ bỏ lỡ TLB
cao, vì bộ xử lý có thể truy cập trực tiếp ít hơn một phần tư mebibyte: 64 × 4 KiB
= 0,25 MiB. Ví dụ, TLB bỏ lỡ thường là một thách thức cho Radix Sort. Để cố
gắng giảm bớt vấn đề này, hầu hết các kiến trúc máy tính hiện cung cấp hỗ trợ
cho kích thước trang lớn hơn. Chẳng hạn, ngoài trang 4 KiB tối thiểu, phần cứng
RISC-V hỗ trợ 2 trang MiB và 1 trang GiB. Do đó, nếu một chương trình sử
dụng kích thước trang lớn, nó có thể truy cập trực tiếp nhiều bộ nhớ hơn mà
không bị bỏ lỡ TLB.
Thách thức thực tế là khiến hệ điều hành cho phép các chương trình chọn các
kích thước trang lớn hơn này. Các nhà thiết kế hệ điều hành lo lắng về sự phân
mảnh của bộ nhớ chính với các trang lớn hơn khi một máy chủ chạy hàng trăm
quy trình. Một lần nữa, giải pháp phức tạp hơn để giảm các lỗi TLB là xem xét
lại thuật toán và cấu trúc dữ liệu để giảm tập hợp các trang làm việc; do tầm quan
trọng của việc truy cập bộ nhớ đối với hiệu suất và tần suất bỏ lỡ TLB, một số
chương trình với bộ làm việc lớn đã được thiết kế lại với mục tiêu đó.
464 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Xây dựng: RISC-V hỗ trợ kích thước trang lớn hơn thông qua bảng trang đa cấp Hình
5,28Ngoài việc chỉ vào bảng trang cấp độ tiếp theo ở cấp độ 1 và 2, nó cho phép a. siêu trang
dịch để ánh xạ địa chỉ ảo đến địa chỉ vật lý 1 GiB (nếu bản dịch khối được in cấp 1) hoặc địa chỉ
vật lý 2 MiB (nếu bản dịch khối ở cấp 2). Linus Torvold hát những đức tính của 4 trang KiB tại
đây : https://yarchive.net/comp/linux/page_sizes.html.

Một khung chung cho bộ nhớ


5,8
Phân cấp

Đến bây giờ, bạn đã nhận ra rằng các loại phân cấp bộ nhớ khác nhau có nhiều điểm
chung. Mặc dù nhiều khía cạnh của hệ thống phân cấp bộ nhớ khác nhau về mặt định
lượng, nhiều chính sách và tính năng xác định cách thức một chức năng phân cấp
tương tự nhau về mặt định tính. Hình 5.33 cho thấy một số đặc điểm định lượng của
hệ thống phân cấp bộ nhớ có thể khác nhau như thế nào. Trong phần còn lại của phần
này, chúng tôi sẽ thảo luận về các lựa chọn thay thế hoạt động chung cho phân cấp
bộ nhớ và cách chúng xác định hành vi của chúng. Chúng tôi sẽ kiểm tra các chính
sách này trong một loạt bốn câu hỏi áp dụng giữa hai cấp độ của hệ thống phân cấp
bộ nhớ, mặc dù để đơn giản, chúng tôi sẽ chủ yếu sử dụng thuật ngữ cho bộ nhớ
cache.

Câu hỏi 1: Trường hợp có thể đặt một khối?


Chúng tôi đã thấy rằng vị trí khối ở cấp trên của hệ thống phân cấp có thể sử dụng một
loạt các sơ đồ, từ ánh xạ trực tiếp đến thiết lập liên kết đến liên kết đầy đủ. Như đã đề cập
ở trên, toàn bộ phạm vi các lược đồ này có thể được coi là các biến thể trên sơ đồ liên kết
tập hợp trong đó số lượng tập hợp và số lượng khối trên mỗi tập hợp khác nhau :

Tên lược đồ Số bộ Khối mỗi bộ


Lập bản đồ trực tiếp Số khối trong bộ nhớ cache 1
Số lượng khối trong bộ đệm
Đặt liên kết Liên kết (thường là 2 trận16)
Liên kết
Hoàn toàn liên kết 1 Số lượng khối trong bộ đệm

Giá trị tiêu biểu Giá trị tiêu biểu Giá trị tiêu biểu cho Giá trị tiêu biểu
Đặc điểm cho bộ nhớ cache L1 cho bộ nhớ cache L2 bộ nhớ phân trang cho một TLB
Tổng kích thước trong các khối 250 con2000 2500 con25.000 16.000 bóng250.000 40 con1024
Tổng kích thước tính bằng
kilobyte 16 con64 125 con2000 1.000.000 bóng1.000.000.000 0,25 bóng16
Kích thước khối tính bằng byte 16 con64 64 con128 4000 bóng64.000 4 con32
Hoa hậu phạt trong đồng hồ 10 trận25 100 con1000 10.000.000 bóng100.000.000 10 con1000
Tỷ giá hoa hậu (toàn cầu cho L2) 2% 5% 0,1% 2% 0,00001% 0,0001% 0,01% 2%

HÌNH 5.33 Các tham số thiết kế định lượng chính đặc trưng cho các yếu tố chính của hệ thống phân cấp bộ nhớ trong
máy tính. Đây là những giá trị điển hình cho các cấp độ này vào năm 2020. Mặc dù phạm vi của các giá trị là rộng, nhưng điều này một
phần là do nhiều giá trị đã thay đổi theo thời gian có liên quan; ví dụ, khi bộ nhớ cache trở nên lớn hơn để vượt qua các hình phạt bỏ lỡ lớn
hơn, kích thước khối cũng tăng lên. Mặc dù không được hiển thị, bộ vi xử lý máy chủ ngày nay cũng có bộ nhớ cache L3, có thể từ 4 đến 50
MiB và chứa nhiều khối hơn bộ nhớ cache L2. Bộ nhớ L3 hạ thấp hình phạt bỏ lỡ L2 xuống 30 đến 40 chu kỳ đồng hồ.
5.8 Một khung chung cho phân cấp bộ nhớ 465

Ưu điểm của việc tăng mức độ liên kết là nó thường làm giảm tỷ lệ bỏ lỡ. Sự cải
thiện tỷ lệ bỏ lỡ đến từ việc giảm các sai sót cạnh tranh cho cùng một vị trí. Chúng tôi
sẽ kiểm tra những điều này chi tiết hơn trong thời gian ngắn. Đầu tiên, hãy để Nhìn
vào mức độ cải thiện đạt được. Hình 5.34 hiển thị tỷ lệ bỏ lỡ cho một số kích thước
bộ đệm vì tính liên kết thay đổi từ ánh xạ trực tiếp đến liên kết tập hợp tám chiều.
Những lợi ích lớn nhất thu được từ việc lập bản đồ trực tiếp đến liên kết hai chiều,
mang lại sự giảm từ 20% đến 30% trong tỷ lệ bỏ lỡ. Khi kích thước bộ đệm tăng lên,
sự cải thiện tương đối từ tính liên kết chỉ tăng nhẹ; do tỷ lệ bỏ lỡ chung của bộ đệm
lớn hơn thấp hơn, cơ hội để cải thiện tỷ lệ bỏ lỡ giảm và sự cải thiện tuyệt đối về tỷ lệ
bỏ lỡ từ tính liên kết thu hẹp đáng kể. Những bất lợi tiềm tàng của tính liên kết, như
chúng tôi đã đề cập trước đó, là chi phí tăng và thời gian truy cập chậm hơn.

Câu hỏi 2: Làm thế nào là một khối được tìm thấy?
Việc lựa chọn cách chúng tôi xác định vị trí một khối phụ thuộc vào sơ đồ vị trí
khối, vì điều đó quyết định số lượng vị trí có thể. Chúng ta có thể tóm tắt các đề
án như sau :

Liên kết Phương pháp So sánh cần thiết


định vị
Lập bản đồ trực tiếp Chỉ số 1
Đặt liên kết Lập chỉ mục tập hợp, tìm kiếm giữa các yếu tố Mức độ liên kết
Tìm kiếm tất cả các mục bộ nhớ cache Kích thước của bộ đệm
Đầy đủ
Bảng tra cứu riêng biệt 0

15%

1 KiB
12%

2 KiB
9%
Tỷ lệ hoa

4 KiB
hậu

6%
8 KiB

3% 16 KiB
32 KiB
64 KiB 128 KiB
0
Một chiều Hai chiều Bốn chiều Tám chiều
Liên kết

HÌNH 5.34 Tốc độ bỏ lỡ bộ đệm dữ liệu cho mỗi tám kích thước bộ đệm được cải thiện khi tính
liên kết tăng lên. Trong khi lợi ích của việc đi từ một chiều (lập bản đồ trực tiếp) đến tập hai chiều liên kết là
rất đáng kể, lợi ích của sự liên kết hơn nữa là nhỏ hơn (ví dụ:., 1 cải tiến 10% đi từ hai chiều đến bốn chiều so với
20 cải thiện 30% đi từ một chiều đến hai chiều). Thậm chí còn có ít cải thiện hơn trong việc chuyển từ liên kết
bốn chiều sang tám chiều, do đó, rất gần với tỷ lệ bỏ lỡ của bộ đệm kết hợp hoàn toàn. Bộ nhớ cache nhỏ hơn có
được lợi ích tuyệt đối lớn hơn đáng kể từ tính liên kết vì tỷ lệ bỏ lỡ cơ sở của bộ đệm nhỏ lớn hơn. Hình 5.16 giải
thích làm thế nào những dữ liệu này được thu thập.
466 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Sự lựa chọn giữa ánh xạ trực tiếp, liên kết tập hợp hoặc ánh xạ liên kết đầy đủ
trong bất kỳ hệ thống phân cấp bộ nhớ nào sẽ phụ thuộc vào chi phí bỏ lỡ so với
chi phí thực hiện liên kết, cả về thời gian và phần cứng bổ sung. Bao gồm bộ
đệm L2 trên chip cho phép khả năng kết hợp cao hơn nhiều, vì thời gian truy cập
không quan trọng và nhà thiết kế không phải dựa vào chip SRAM tiêu chuẩn như
các khối xây dựng. Bộ nhớ cache kết hợp đầy đủ là nghiêm cấm ngoại trừ kích
thước nhỏ, trong đó chi phí của bộ so sánh không quá lớn và nơi cải thiện tỷ lệ
bỏ lỡ tuyệt đối là lớn nhất.
Trong các hệ thống bộ nhớ ảo, một bảng ánh xạ riêng biệt, bảng trang được
giữ để lập chỉ mục bộ nhớ. Ngoài việc lưu trữ cần thiết cho bảng, sử dụng bảng
chỉ mục yêu cầu thêm quyền truy cập bộ nhớ. Sự lựa chọn của sự kết hợp đầy đủ
cho vị trí trang và bảng phụ được thúc đẩy bởi những sự thật này :
1. Sự kết hợp đầy đủ là có lợi, vì bỏ lỡ là rất tốn kém.
2. Tính liên kết đầy đủ cho phép phần mềm sử dụng các sơ đồ thay thế tinh vi
được thiết kế để giảm tỷ lệ bỏ lỡ.
3. Bản đồ đầy đủ có thể dễ dàng được lập chỉ mục mà không cần thêm phần
cứng và không cần tìm kiếm.
Do đó, hệ thống bộ nhớ ảo hầu như luôn sử dụng vị trí kết hợp đầy đủ. Vị trí liên kết tập
hợp thường được sử dụng cho bộ đệm và TLB, trong đó quyền truy cập kết hợp lập chỉ
mục và tìm kiếm một tập hợp nhỏ. Một vài hệ thống đã sử dụng bộ nhớ cache được ánh
xạ trực tiếp vì lợi thế của chúng trong thời gian truy cập và tính đơn giản. Lợi thế về thời
gian truy cập xảy ra vì việc tìm khối được yêu cầu không phụ thuộc vào so sánh. Các lựa
chọn thiết kế như vậy phụ thuộc vào nhiều chi tiết của việc triển khai, chẳng hạn như bộ
đệm có trên chip hay không, công nghệ được sử dụng để triển khai bộ đệm ,
và vai trò quan trọng của thời gian truy cập bộ đệm trong việc xác định thời gian
chu kỳ của bộ xử lý.

Câu hỏi 3: Khối nào sẽ được thay thế trên


Cache Miss?
Khi bỏ lỡ xảy ra trong bộ đệm kết hợp, chúng ta phải quyết định thay thế khối nào.
Trong bộ đệm kết hợp đầy đủ, tất cả các khối là ứng cử viên để thay thế. Nếu bộ đệm
được đặt liên kết, chúng ta phải chọn trong số các khối trong tập hợp. Tất nhiên, thay
thế là dễ dàng trong bộ đệm được ánh xạ trực tiếp vì chỉ có một ứng cử viên.
Có hai chiến lược chính để thay thế trong bộ nhớ cache liên kết tập hợp hoặc
liên kết đầy đủ :
■ Ngẫu nhiên : Các khối ứng cử viên được chọn ngẫu nhiên, có thể sử dụng
một số hỗ trợ phần cứng.
■ Ít nhất được sử dụng gần đây (LRU): Khối được thay thế là khối đã không
được sử dụng trong thời gian dài nhất.
Trong thực tế, LRU quá tốn kém để thực hiện cho các hệ thống phân cấp với hơn một
mức độ liên kết nhỏ (thường là hai đến bốn), vì việc theo dõi thông tin sử dụng là tốn
kém. Ngay cả đối với tính liên kết của tập hợp bốn chiều, LRU thường được tính gần
đúng cho
5.8 Một khung chung cho phân cấp bộ nhớ 467

ví dụ: bằng cách theo dõi cặp khối nào là LRU (yêu cầu 1 bit) và sau đó theo dõi
khối nào trong mỗi cặp là LRU (yêu cầu 1 bit cho mỗi cặp).
Đối với tính liên kết lớn hơn, LRU được tính gần đúng hoặc thay thế ngẫu
nhiên được sử dụng. Trong bộ nhớ cache, thuật toán thay thế nằm trong phần
cứng, có nghĩa là sơ đồ sẽ dễ thực hiện. Thay thế ngẫu nhiên rất đơn giản để xây
dựng phần cứng và đối với bộ đệm liên kết đặt hai chiều, thay thế ngẫu nhiên có
tỷ lệ bỏ lỡ cao hơn khoảng 1,1 lần so với thay thế LRU. Khi bộ nhớ cache trở nên
lớn hơn, tỷ lệ bỏ lỡ cho cả hai chiến lược thay thế giảm và sự khác biệt tuyệt đối
trở nên nhỏ. Trên thực tế, thay thế ngẫu nhiên đôi khi có thể tốt hơn các xấp xỉ
LRU đơn giản dễ dàng thực hiện trong phần cứng.
Trong bộ nhớ ảo, một số dạng LRU luôn được tính gần đúng, vì ngay cả việc
giảm tỷ lệ bỏ lỡ nhỏ cũng có thể quan trọng khi chi phí bỏ lỡ là rất lớn. Các bit
tham chiếu hoặc chức năng tương đương thường được cung cấp để giúp hệ điều
hành dễ dàng theo dõi một tập hợp các trang ít được sử dụng gần đây. Bởi vì bỏ
lỡ rất tốn kém và tương đối không thường xuyên, việc xấp xỉ thông tin này chủ
yếu trong phần mềm là chấp nhận được.

Câu hỏi 4: Điều gì xảy ra trên một bài viết?


Một đặc điểm chính của bất kỳ hệ thống phân cấp bộ nhớ là cách nó liên quan
đến việc viết. Chúng tôi đã thấy hai tùy chọn cơ bản :
■ Viết qua : Thông tin được ghi vào cả khối trong bộ đệm và khối ở cấp thấp
hơn của hệ thống phân cấp bộ nhớ (bộ nhớ chính cho bộ đệm). Các bộ nhớ
cache trong Mục 5.3 đã sử dụng sơ đồ này.
■ Viết lại : Thông tin được viết chỉ vào khối trong bộ đệm. Các khối sửa đổi
được viết ở cấp thấp hơn của hệ thống phân cấp chỉ khi nó được thay thế.
Hệ thống bộ nhớ ảo luôn sử dụng ghi lại, vì những lý do được thảo luận
trong Mục 5.7.
Cả viết lại và viết qua đều có lợi thế của họ. Những lợi thế chính của việc ghi lại
là như sau :
■ Các từ riêng lẻ có thể được viết bởi bộ xử lý ở tốc độ mà bộ đệm, thay vì
bộ nhớ, có thể chấp nhận chúng.
■ Nhiều lần ghi trong một khối chỉ yêu cầu một lần ghi vào cấp thấp hơn
trong hệ thống phân cấp.
■ Khi các khối được ghi lại, hệ thống có thể sử dụng hiệu quả việc truyền
băng thông cao, vì toàn bộ khối được ghi.
Viết qua có những lợi thế này :
■ Các hoa hậu đơn giản và rẻ hơn vì chúng không bao giờ yêu cầu một khối
được viết lại ở cấp thấp hơn.
■ Viết qua dễ thực hiện hơn ghi lại, mặc dù thực tế, bộ đệm ghi qua vẫn sẽ
cần sử dụng bộ đệm ghi.
468 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Bộ nhớ, TLB và bộ nhớ ảo ban đầu có thể trông rất khác nhau, nhưng
chúng dựa trên hai nguyên tắc địa phương giống nhau và chúng có thể
được hiểu bằng câu trả lời của chúng cho bốn câu hỏi :

Câu 1 : Trường hợp một khối có thể được đặt?


Câu trả lời: Một nơi (được ánh xạ trực tiếp), một vài nơi (kết hợp) hoặc bất kỳ nơi
Các nào (hoàn toàn liên kết).
Câu 2 : Làm thế nào là một khối được tìm thấy?
LỚN Câu trả lời: Có bốn phương pháp: lập chỉ mục (như trong bộ đệm được ánh xạ trực
tiếp), tìm kiếm hạn chế (như trong bộ đệm liên kết đã đặt), tìm kiếm đầy
Hình ảnh đủ (như trong bộ đệm liên kết đầy đủ) và bảng tra cứu riêng (như trong
một trang bảng).

Câu 3 : Khối nào được thay thế trên một bỏ lỡ?


Câu trả lời: Thông thường, hoặc ít được sử dụng gần đây nhất hoặc một khối ngẫu nhiên.
Câu 4 : Làm thế nào được viết xử lý?
Câu trả lời: Mỗi cấp độ trong hệ thống phân cấp có thể sử dụng ghi qua hoặc ghi lại.

mô hình ba Cs Một bộ
đệm mô hình trong đó tất
cả các lỗi bộ nhớ cache
được phân loại thành một Trong các hệ thống bộ nhớ ảo, chỉ có chính sách ghi lại là thực tế vì độ trễ dài của
trong ba loại: bỏ lỡ bắt ghi đến mức thấp hơn của hệ thống phân cấp. Tốc độ ghi được tạo bởi bộ xử lý
buộc, bỏ lỡ năng lực và bỏ thường vượt quá tốc độ mà hệ thống bộ nhớ có thể xử lý chúng, thậm chí cho phép
lỡ xung đột. các bộ nhớ và chế độ nổ rộng hơn về mặt vật lý và logic cho DRAM. Do đó, ngày
bắt buộc bỏ lỡ Cũng nay các bộ nhớ cấp thấp nhất thường sử dụng ghi lại.
thế gọi bắt đầu lạnh bỏ
lỡMột bộ nhớ cache bị Three Cs: Một mô hình trực quan để hiểu hành vi của
bỏ lỡ gây ra bởi lần truy các thứ bậc bộ nhớ
cập đầu tiên vào một
khối chưa bao giờ có Trong tiểu mục này, chúng tôi xem xét một mô hình cung cấp cái nhìn sâu sắc về
trong bộ đệm. các nguồn bỏ lỡ trong hệ thống phân cấp bộ nhớ và cách các bỏ lỡ sẽ bị ảnh
hưởng bởi những thay đổi trong hệ thống phân cấp. Chúng tôi sẽ giải thích các ý
năng lực bỏ lỡ Một
bộ đệm bỏ lỡ điều đó
tưởng về bộ nhớ cache, mặc dù các ý tưởng chuyển trực tiếp sang bất kỳ cấp độ
xảy ra vì bộ đệm, ngay nào khác trong hệ thống phân cấp. Trong mô hình này, tất cả các bỏ lỡ được
cả với sự liên kết đầy phân loại thành một trong ba loại ( ba Cs):
đủ, không thể chứa tất ■ Bỏ lỡ bắt buộc: Đây là những lỗi bộ nhớ cache gây ra bởi lần truy cập đầu tiên
cả các khối cần thiết để
đáp ứng yêu cầu. vào a khối chưa bao giờ có trong bộ đệm. Những điều này cũng được gọi bắt
bỏ lỡ xung đột Cũng đầu lạnh bỏ lỡ.
được gọi va chạm bỏ ■ Công suất bỏ lỡ: Đây là những lỗi bộ nhớ cache gây ra khi bộ đệm không
lỡMột bộ đệm. bỏ lỡ xảy thể chứa tất cả các khối cần thiết trong khi thực hiện một chương trình.
ra trong bộ đệm tập hợp
hoặc ánh xạ trực tiếp khi Công suất bỏ lỡ xảy ra khi các khối được thay thế và sau đó được lấy.
nhiều khối cạnh tranh cho ■ Bỏ lỡ xung đột: Đây là các lỗi bộ nhớ cache xảy ra trong tập hợp hoặc bộ
cùng một bộ và được loại nhớ đệm được ánh xạ trực tiếp khi nhiều khối cạnh tranh cho cùng một bộ.
bỏ trong bộ đệm liên kết
đầy đủ có cùng kích
Bỏ lỡ xung đột là những bỏ lỡ trong bộ đệm liên kết trực tiếp hoặc tập hợp
thước.
được loại bỏ
trong bộ đệm
liên kết đầy đủ
có cùng kích
thước. Những
bộ nhớ cache
cũng được gọi
va chạm bỏ lỡ.
5.8 Một khung chung cho phân cấp bộ nhớ 469

Hình 5.35 cho thấy tỷ lệ bỏ lỡ chia thành ba nguồn. Những nguồn này bỏ lỡ có
thể bị tấn công trực tiếp bằng cách thay đổi một số khía cạnh của thiết kế bộ đệm.
Vì các lỗi xung đột phát sinh trực tiếp từ sự tranh chấp cho cùng một khối bộ đệm,
việc tăng tính liên kết làm giảm các lỗi xung đột. Tuy nhiên, sự liên kết có thể
làm chậm thời gian truy cập, dẫn đến hiệu suất tổng thể thấp hơn.
Thiếu công suất có thể dễ dàng được giảm bằng cách mở rộng bộ đệm; thật
vậy, bộ nhớ cấp hai đã phát triển lớn hơn trong nhiều năm. Tất nhiên, khi chúng
tôi làm cho bộ đệm lớn hơn, chúng tôi cũng phải cẩn thận về việc tăng thời gian
truy cập, điều này có thể dẫn đến hiệu suất tổng thể thấp hơn. Do đó, bộ nhớ cấp
một đã phát triển chậm, nếu có.
Vì các lỗi bắt buộc được tạo bởi tham chiếu đầu tiên đến một khối, nên cách
chính để hệ thống bộ đệm giảm số lần bỏ lỡ bắt buộc là tăng kích thước khối.
Điều này sẽ giảm số lượng tài liệu tham khảo cần thiết để chạm vào từng khối của
chương trình một lần, bởi vì chương trình sẽ bao gồm ít khối bộ đệm hơn. Như đã
đề cập ở trên, việc tăng kích thước khối quá nhiều có thể có tác động tiêu cực đến
hiệu suất do sự gia tăng của hình phạt bỏ lỡ.

10%

9%

8% Một chiều
7%
Hai chiều
6%
Tỷ lệ hoa
hậu 5% Bốn chiều
mỗi loại
4%

3%

2%
Sức chứa
1%

0%
4 số 8 16 32 64 128 256 512 1024
Kích thước bộ đệm (KiB)

HÌNH 5.35 Tỷ lệ bỏ lỡ có thể được chia thành ba nguồn bỏ lỡ. Biểu đồ này cho thấy tổng tỷ lệ
bỏ lỡ và các thành phần của nó cho một loạt các kích thước bộ đệm. Các dữ liệu này dành cho các điểm
chuẩn số nguyên và dấu phẩy động của Spec CPU2000 và từ cùng một nguồn với dữ liệu trong Hình 5.34
Thành phần bỏ lỡ bắt buộc là 0,006% và không thể nhìn thấy trong biểu đồ này. Thành phần tiếp theo là
tốc độ bỏ lỡ công suất, phụ thuộc vào kích thước bộ đệm. Phần xung đột, phụ thuộc cả vào tính liên kết và
kích thước bộ đệm, được hiển thị cho một loạt các kết hợp từ một chiều đến tám chiều. Trong mỗi trường
hợp, phần được dán nhãn tương ứng với sự gia tăng tỷ lệ bỏ lỡ xảy ra khi tính liên kết được thay đổi từ
mức độ cao hơn tiếp theo sang mức độ liên kết được dán nhãn. Ví dụ, phần được dán nhãn. hai chiều chỉ ra
các lỗi bổ sung phát sinh khi bộ đệm có tính liên kết của hai chứ không phải bốn. Do đó, sự khác biệt về tỷ
lệ bỏ lỡ phát sinh bởi bộ đệm được ánh xạ trực tiếp so với bộ đệm kết hợp đầy đủ có cùng kích thước được
đưa ra bởi tổng của các phần được đánh dấu bốn chiều, hai chiều, và một chiềuSự khác biệt giữa tám chiều
và bốn chiều nhỏ đến mức khó thấy trên biểu đồ này.
470 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Có thể tiêu cực


Thay đổi thiết kế Ảnh hưởng đến tỷ lệ bỏ lỡ hiệu quả thực hiện
Tăng kích thước bộ đệm Giảm công suất bỏ lỡ Có thể tăng thời gian truy cập
Tăng tính liên kết Giảm tỷ lệ bỏ lỡ do xung đột Có thể tăng thời gian truy cập
bỏ lỡ
Tăng kích thước khối Giảm tỷ lệ bỏ lỡ cho một loạt các Tăng bỏ lỡ hình phạt. Rất lớn
kích thước khối do địa phương không gian khối có thể tăng tỷ lệ bỏ lỡ

HÌNH 5.36 Thử thách thiết kế hệ thống phân cấp bộ nhớ.

Thách thức trong việc thiết kế hệ thống phân cấp bộ nhớ là mọi thay đổi
Các có khả năng cải thiện tỷ lệ bỏ lỡ cũng có thể ảnh hưởng tiêu cực đến hiệu
suất tổng thể, như Hình 5.36 tóm tắt. Sự kết hợp giữa các hiệu ứng tích
LỚN cực và tiêu cực này là những gì làm cho thiết kế của một hệ thống phân
cấp bộ nhớ thú vị.
Hình ảnh

Sự phân hủy của các bỏ lỡ thành ba Cs là một mô hình định tính hữu ích.
Trong các thiết kế bộ đệm thực, nhiều lựa chọn thiết kế tương tác và thay đổi một
đặc tính bộ đệm thường sẽ ảnh hưởng đến một số thành phần của tốc độ bỏ lỡ.
Mặc dù thiếu sót như vậy, mô hình này là một cách hữu ích để hiểu rõ hơn về
hiệu suất của các thiết kế bộ đệm.

Những tuyên bố nào sau đây (nếu có) nói chung là đúng?
Kiểm tra bản 1. Không có cách nào để giảm bỏ lỡ bắt buộc.
thân
2. Bộ nhớ kết hợp đầy đủ không có bỏ lỡ xung đột.
3. Trong việc giảm bỏ lỡ, sự liên kết quan trọng hơn năng lực.

Sử dụng máy trạng thái hữu hạn để điều


khiển a
5.9 Bộ nhớ cache đơn giản

Bây giờ chúng ta có thể xây dựng điều khiển cho bộ đệm, giống như chúng ta đã thực
hiện kiểm soát đối với các datapath một chu kỳ và đường ống trong Chương 4.Phần
này bắt đầu với một định nghĩa của bộ đệm đơn giản và sau đó là một mô tả về máy
trạng thái hữu hạn (FSM). Nó kết thúc với FSM của bộ điều khiển cho bộ đệm đơn
giản này. Mục 5.12 đi sâu hơn , hiển thị bộ đệm và bộ điều khiển trong ngôn
ngữ mô tả phần cứng mới.
5.9 Sử dụng máy trạng thái hữu hạn để điều khiển bộ đệm đơn giản 471

Bộ nhớ cache đơn giản


Chúng tôi sẽ thiết kế một bộ điều khiển cho bộ đệm đơn giản. Dưới đây là các
đặc điểm chính của bộ đệm :
■ Bộ nhớ cache được ánh xạ trực tiếp
■ Viết lại bằng cách phân bổ ghi
■ Kích thước khối là bốn từ (16 byte hoặc 128 bit)
■ Kích thước bộ đệm là 16 KiB, vì vậy nó chứa 1024 khối
■ Địa chỉ 32 bit
■ Bộ nhớ cache bao gồm một bit hợp lệ và bit bẩn trên mỗi khối
Từ Mục 5.3, bây giờ chúng ta có thể tính các trường của một địa chỉ cho bộ đệm :
■ Chỉ số bộ đệm là 10 bit
■ Khối bù là 4 bit
■ Kích thước thẻ là 32− (10+ 4) hoặc 18 bit
Các tín hiệu giữa bộ xử lý đến bộ đệm là
■ Tín hiệu đọc hoặc ghi 1 bit
■ Tín hiệu hợp lệ 1 bit, cho biết có hoạt động bộ đệm hay không
■ Địa chỉ 32 bit
■ Dữ liệu 32 bit từ bộ xử lý đến bộ nhớ cache
■ Dữ liệu 32 bit từ bộ nhớ cache đến bộ xử lý
■ Tín hiệu Sẵn sàng 1 bit, cho biết thao tác bộ đệm đã hoàn tất
Giao diện giữa bộ nhớ và bộ đệm có các trường giống như giữa bộ xử lý và bộ
đệm, ngoại trừ các trường dữ liệu hiện rộng 128 bit. Chiều rộng bộ nhớ bổ sung
thường được tìm thấy trong các bộ vi xử lý ngày nay, xử lý các từ 32 bit hoặc 64
bit trong bộ xử lý trong khi bộ điều khiển DRAM thường là 128 bit. Làm cho
khối bộ đệm khớp với chiều rộng của DRAM đã đơn giản hóa thiết kế. Dưới đây
là các tín hiệu :
■ Tín hiệu đọc hoặc ghi 1 bit
■ Tín hiệu hợp lệ 1 bit, cho biết có hoạt động bộ nhớ hay không
■ Địa chỉ 32 bit
■ Dữ liệu 128 bit từ bộ nhớ cache đến bộ nhớ
■ Dữ liệu 128 bit từ bộ nhớ đến bộ nhớ cache
■ Tín hiệu Sẵn sàng 1 bit, cho biết thao tác bộ nhớ đã hoàn tất
472 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Lưu ý rằng giao diện đến bộ nhớ không phải là một số chu kỳ cố định. Chúng tôi
giả sử bộ điều khiển bộ nhớ sẽ thông báo cho bộ đệm thông qua tín hiệu Sẵn
sàng khi bộ nhớ đọc hoặc ghi kết thúc.
Trước khi mô tả bộ điều khiển bộ đệm, chúng ta cần xem lại các máy trạng thái
hữu hạn, cho phép chúng ta điều khiển một hoạt động có thể mất nhiều chu kỳ đồng
hồ.

Máy móc nhà nước hữu hạn


Để thiết kế đơn vị điều khiển cho datapath một chu kỳ, chúng tôi đã sử dụng các
bảng chân lý chỉ định cài đặt tín hiệu điều khiển dựa trên lớp lệnh. Đối với bộ
đệm, điều khiển phức tạp hơn vì thao tác có thể là một loạt các bước. Điều khiển
cho bộ đệm phải chỉ định cả tín hiệu sẽ được đặt trong bất kỳ bước nào và bước
máy trạng thái hữu tiếp theo trong chuỗi.
hạn Hàm logic tuần tự Phương pháp kiểm soát đa luồng phổ biến nhất dựa trên máy trạng thái hữu
bao gồm một tập hợp các
hạn, thường được biểu thị bằng đồ họa. Một máy trạng thái hữu hạn bao gồm
đầu vào và đầu ra, hàm
trạng thái tiếp theo ánh xạ
một tập hợp các trạng thái và hướng dẫn về cách thay đổi trạng thái. Các hướng
trạng thái hiện tại và các được xác định bởi a chức năng trạng thái tiếp theo, ánh xạ trạng thái hiện tại và
đầu vào sang trạng thái các đầu vào đến trạng thái mới. Khi chúng ta sử dụng máy trạng thái hữu hạn để
mới và hàm đầu ra ánh xạ điều khiển, mỗi trạng thái cũng chỉ định một tập hợp các đầu ra được xác nhận
trạng thái hiện tại và có khi máy ở trạng thái đó. Việc triển khai máy trạng thái hữu hạn thường giả định
thể là đầu vào cho một tập rằng tất cả các đầu ra không được khẳng định rõ ràng đều được xác định lại.
hợp các đầu ra được xác Tương tự, hoạt động chính xác của datapath phụ thuộc vào thực tế là một tín hiệu
nhận .
không được xác nhận rõ ràng được xác định lại, thay vì hoạt động như một sự
chăm sóc don don.
chức năng trạng thái Điều khiển ghép kênh hơi khác nhau, vì chúng chọn một trong các đầu vào,
tiếp theo cho dù chúng là 0 hay 1. Do đó, trong máy trạng thái hữu hạn, chúng tôi luôn chỉ
Một hàm tổ hợp, với các định cài đặt của tất cả các điều khiển ghép kênh mà chúng tôi quan tâm. Khi
đầu vào và trạng thái chúng tôi triển khai máy trạng thái hữu hạn bằng logic, việc đặt điều khiển thành
hiện tại, xác định trạng 0 có thể là mặc định và do đó có thể không yêu cầu bất kỳ cổng nào. Một ví dụ
thái tiếp theo của máy
đơn giản về một máy trạng thái hữu hạn xuất hiện trong Phụ lục Avà nếu bạn
trạng thái hữu hạn.
không quen thuộc với khái niệm về một cỗ máy trạng thái hữu hạn, bạn có thể
muốn kiểm tra Phụ lục A trước khi tiến hành.
Một máy trạng thái hữu hạn có thể được thực hiện với một thanh ghi tạm thời giữ
trạng thái hiện tại và một khối logic tổ hợp xác định cả tín hiệu đường dẫn dữ liệu sẽ
được xác nhận và trạng thái tiếp theo. Hình 5.37 làm thế nào một thực hiện như vậy
có thể nhìn. Phụ lục C mô tả chi tiết cách trạng thái hữu hạn
máy được thực hiện bằng cách sử dụng cấu trúc này. Trong Mục A.3, logic điều
khiển tổ hợp cho máy trạng thái hữu hạn được triển khai cả với ROM (bộ nhớ chỉ
đọc) hoặc PLA (mảng logic lập trình). (Cũng thấy Phụ lục A cho một mô tả của
các yếu tố logic.)
Xây dựng: Lưu ý rằng thiết kế đơn giản này được gọi là a chặn bộ nhớ cache,
trong đó bộ xử lý phải đợi cho đến khi bộ nhớ cache kết thúc yêu cầu. Mục 5.12
mô tả sự thay thế, được gọi là a không chặn bộ nhớ cache.
5.9 Sử dụng máy trạng thái hữu hạn để điều khiển bộ đệm đơn giản 473

Kết hợp
kiểm soát logic Đầu ra điều khiển Datapath

Đầu ra

Đầu vào

Tiểu bang tiếp theo


Đầu vào từ bộ Đăng ký nhà
nhớ cache nước
datapath

HÌNH 5.37 Bộ điều khiển máy trạng thái hữu hạn thường được triển khai bằng cách sử
dụng một khối logic tổ hợp và một thanh ghi để giữ trạng thái hiện tại. Các đầu ra của tổ hợp
logic là số trạng thái tiếp theo và các tín hiệu điều khiển được xác nhận cho trạng thái hiện tại. Các đầu
vào cho logic tổ hợp là trạng thái hiện tại và bất kỳ đầu vào nào được sử dụng để xác định trạng thái tiếp
theo. Lưu ý rằng trong máy trạng thái hữu hạn được sử dụng trong chương này, các đầu ra chỉ phụ thuộc
vào trạng thái hiện tại, không phụ thuộc vào đầu vào. Chúng tôi sử dụng màu sắc để chỉ ra rằng đây là các
dòng điều khiển và logic so với các dòng dữ liệu và logic. Các Xây dựng dưới đây giải thích điều này chi
tiết hơn.

Xây dựng: Phong cách của máy trạng thái hữu hạn trong cuốn sách này được gọi
là máy Moore , sau Edward Moore. Đặc điểm nhận dạng của nó là đầu ra chỉ phụ
thuộc vào trạng thái hiện tại. Đối với máy Moore, hộp có nhãn logic điều khiển tổ hợp
có thể được chia thành hai phần. Một mảnh có đầu ra điều khiển và chỉ đầu vào trạng
thái, trong khi mảnh còn lại chỉ có đầu ra trạng thái tiếp theo.
Một phong cách thay thế của máy là một máy Mealy, được đặt theo tên của George
Mealy. Máy Mealy cho phép cả đầu vào và trạng thái hiện tại được sử dụng để xác định
đầu ra. Máy Moore có lợi thế triển khai tiềm năng về tốc độ và kích thước của bộ điều
khiển. Các lợi thế tốc độ phát sinh do các đầu ra điều khiển, cần thiết sớm trong chu kỳ
đồng hồ, không phụ thuộc vào đầu vào, mà chỉ phụ thuộc vào trạng thái hiện tại. Trong
Phụ lục A, khi việc triển khai máy trạng thái hữu hạn này được đưa xuống cổng logic, lợi
thế kích thước có thể được nhìn thấy rõ. Nhược điểm tiềm năng của máy Moore là nó có
thể yêu cầu các trạng thái bổ sung. Ví dụ: trong các tình huống có sự khác biệt một trạng
thái giữa hai chuỗi trạng thái, máy Mealy có thể thống nhất các trạng thái bằng cách làm
cho các đầu ra phụ thuộc vào đầu vào.
474 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

FSM cho Bộ điều khiển bộ đệm đơn giản


Hình 5.38 hiển thị bốn trạng thái của bộ điều khiển bộ đệm đơn giản của chúng
tôi :
■ Nhàn rỗi: Trạng thái này chờ yêu cầu đọc hoặc ghi hợp lệ từ bộ xử lý , di
chuyển FSM sang trạng thái Thẻ so sánh.
■ So sánh thẻ: Như tên cho thấy, trạng thái này kiểm tra xem có yêu cầu đọc
không hoặc viết là một hit hoặc bỏ lỡ. Phần chỉ mục của địa chỉ chọn thẻ
được so sánh. Nếu dữ liệu trong khối bộ đệm được gọi bởi phần chỉ mục
của địa chỉ là hợp lệ và phần thẻ của địa chỉ khớp với thẻ, thì đó là một lần
truy cập. Dữ liệu được đọc từ từ đã chọn nếu nó là tải hoặc được viết thành
từ đã chọn nếu đó là cửa hàng. Tín hiệu Cache Ready sau đó được đặt. Nếu
nó là một chữ viết, bit bẩn được đặt thành 1. Lưu ý rằng một lần ghi cũng
đặt bit hợp lệ và trường thẻ; trong khi có vẻ không cần thiết, nó được bao
gồm vì thẻ là một bộ nhớ duy nhất, vì vậy để thay đổi bit bẩn, chúng ta
cũng cần thay đổi các trường hợp lệ và thẻ. Nếu đó là một hit và khối hợp
lệ, FSM trở về trạng thái không tải. Đầu tiên, một lần bỏ lỡ cập nhật thẻ bộ
đệm và sau đó chuyển sang trạng thái Ghi lại, nếu khối tại vị trí này có giá
trị bit bẩn là 1 hoặc đến trạng thái Phân bổ nếu là 0.

Bộ nhớ cache
Nhàn rỗi So sánh thẻ
Đánh dấu bộ nhớ cache
đã sẵn sàng Nếu hợp lệ &&
Hit ,
Đặt hợp lệ,
SetTag ,
Yêu cầu CPU hợp lệ nếu Viết Đặt bẩn

Bộ nhớ Bộ nhớ
cache cache
Cô Cô
và và
Khối cũ Khối cũ
là sạch sẽ là bẩn

Bộ nhớ đã sẵn Viết lại


Phân bổ sàng
Viết cũ
Đọc khối mới Chặn đến
từ ký ức Ký ức
Ký ức Ký ức
không
không phải phải
Sẵn sàng Sẵn
sàng

HÌNH 5.38 Bốn trạng thái của bộ điều khiển đơn giản.
5.10 Phân cấp song song và bộ nhớ: Sự kết hợp bộ đệm 475

■ Viết lại : Trạng thái này ghi khối 128 bit vào bộ nhớ bằng địa chỉ bao gồm
từ thẻ và chỉ mục bộ nhớ cache. Chúng tôi vẫn ở trạng thái này để chờ tín
hiệu Sẵn sàng từ bộ nhớ. Khi ghi bộ nhớ hoàn tất, FSM sẽ chuyển sang
trạng thái Phân bổ.
■ Phân bổ : Khối mới được lấy từ bộ nhớ. Chúng tôi vẫn ở trong trạng thái
này chờ tín hiệu Sẵn sàng từ bộ nhớ. Khi đọc bộ nhớ hoàn tất, FSM sẽ
chuyển đến trạng thái Thẻ so sánh. Mặc dù chúng tôi có thể đã đi đến một
trạng thái mới để hoàn thành thao tác thay vì sử dụng lại trạng thái Thẻ so
sánh, có rất nhiều sự trùng lặp, bao gồm cả việc cập nhật từ thích hợp trong
khối nếu truy cập là ghi.
Mô hình đơn giản này có thể dễ dàng được mở rộng với nhiều trạng thái hơn để cố
gắng cải thiện hiệu suất. Ví dụ: trạng thái Thẻ so sánh thực hiện cả so sánh và đọc
hoặc ghi dữ liệu bộ đệm trong một chu kỳ đồng hồ duy nhất. Thông thường việc truy
cập so sánh và bộ nhớ cache được thực hiện ở các trạng thái riêng biệt để cố gắng cải
thiện thời gian chu kỳ đồng hồ. Một tối ưu hóa khác là thêm bộ đệm ghi để chúng ta
có thể lưu khối bẩn và sau đó đọc khối mới trước để bộ xử lý không phải chờ hai lần
truy cập bộ nhớ khi bị lỗi bẩn. Bộ nhớ cache tiếp theo sẽ ghi khối bẩn từ bộ đệm ghi
trong khi bộ xử lý đang hoạt động trên dữ liệu được yêu cầu.
Mục 5.12 đi sâu vào chi tiết hơn về FSM, hiển thị toàn bộ điều khiển trong
ngôn ngữ mô tả phần cứng và sơ đồ khối của bộ đệm đơn giản này.

Song song và phân cấp bộ nhớ :


5.10
Bộ nhớ cache

Cho rằng bộ đa xử lý nhiều lõi có nghĩa là nhiều bộ xử lý trên một chip, các bộ
xử lý này rất có thể chia sẻ một không gian địa chỉ vật lý chung. Dữ liệu chia sẻ
bộ nhớ đệm giới thiệu một vấn đề mới, bởi vì chế độ xem bộ nhớ được giữ bởi
hai bộ xử lý khác nhau là thông qua bộ nhớ cache riêng lẻ của chúng, mà không
có bất kỳ biện pháp phòng ngừa bổ sung nào, cuối cùng có thể thấy hai giá trị
riêng biệt. Hình 5.40 minh họa vấn đề và cho thấy hai bộ xử lý khác nhau có thể
có hai giá trị khác nhau cho cùng một vị trí. Khó khăn này thường được gọi làbộ
nhớ cache kết hợp vấn đề.
Một cách không chính thức, chúng ta có thể nói rằng một hệ thống bộ nhớ
được kết hợp chặt chẽ nếu bất kỳ việc đọc mục dữ liệu nào trả về giá trị được viết
gần đây nhất của mục dữ liệu đó. Định nghĩa này, mặc dù trực giác hấp dẫn, là
mơ hồ và đơn giản; thực tế phức tạp hơn nhiều. Định nghĩa đơn giản này chứa hai
khía cạnh khác nhau của hành vi hệ thống bộ nhớ, cả hai đều rất quan trọng để
viết các chương trình bộ nhớ chia sẻ chính xác. Khía cạnh đầu tiên, được gọi sự
gắn kết, định nghĩa giá trị gì có thể được trả lại bằng cách đọc. Khía cạnh thứ hai,
được gọi tính nhất quán, xác định khi nào một giá trị bằng văn bản sẽ được trả về
bằng cách đọc.
476 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Hãy để nhìn vào sự gắn kết đầu tiên. Một hệ thống bộ nhớ được kết hợp nếu
1. Một bộ xử lý P đọc đến một vị trí X theo sau một chữ viết của P sang X,
không có chữ viết của X bởi một bộ xử lý khác xảy ra giữa chữ viết và chữ
đọc của P, luôn trả về giá trị được viết bởi P. Do đó, trong Hình 5.39 nếu
CPU A đọc X sau bước 3, thì nó sẽ thấy giá trị 1.
2. Việc đọc bởi bộ xử lý để định vị X theo sau một bộ xử lý khác để X trả về
giá trị bằng văn bản nếu việc đọc và ghi được phân tách đủ theo thời gian
và không có cách ghi nào khác vào X xảy ra giữa hai lần truy cập. Như vậy,
trong Hình 5.39, chúng ta cần một cơ chế sao cho giá trị 0 trong bộ đệm
của CPU B được thay thế bằng giá trị 1 sau khi CPU A lưu 1 vào bộ nhớ tại
địa chỉ X trong bước 3.
3. Viết đến cùng một vị trí là nối tiếp; nghĩa là, hai chữ viết đến cùng một vị
trí bởi bất kỳ hai bộ xử lý nào được xem theo cùng một thứ tự bởi tất cả
các bộ xử lý. Ví dụ: nếu CPU B lưu 2 vào bộ nhớ tại địa chỉ X sau bước 3,
bộ xử lý không bao giờ có thể đọc giá trị tại vị trí X là 2 và sau đó đọc nó
là 1.
Ví dụ, tài sản đầu tiên chỉ đơn giản là bảo tồn thứ tự chương trình, chúng tôi chắc
chắn mong đợi tài sản này là đúng trong bộ giải mã. Thuộc tính thứ hai xác định
khái niệm về ý nghĩa của việc có một cái nhìn mạch lạc về bộ nhớ: nếu bộ xử lý
có thể liên tục đọc một giá trị dữ liệu cũ, chúng ta sẽ nói rõ rằng bộ nhớ không
mạch lạc.
Sự cần thiết cho viết nối tiếp tinh tế hơn, nhưng không kém phần quan trọng. Giả
sử chúng tôi không tuần tự hóa ghi và bộ xử lý P1 ghi vị trí X theo sau là vị trí ghi P2
X. Nối tiếp ghi đảm bảo rằng mọi bộ xử lý sẽ thấy ghi được thực hiện bởi P2 tại một
số điểm. Nếu chúng tôi không tuần tự hóa các bài viết, nó có thể là

Ký ức
Nội dung bộ đệm
Thời gian cho Nội dung bộ đệm nội dung cho
bước Sự kiện CPU A cho CPU B vị trí X
0 0
1 CPU A đọc X 0 0
2 CPU B đọc X 0 0 0
3 CPU A lưu 1 vào X 1 0 1

HÌNH 5.39 Vấn đề kết hợp bộ đệm cho một vị trí bộ nhớ đơn (X), được đọc và viết bởi hai bộ xử
lý (A và B). Ban đầu chúng tôi cho rằng không có bộ đệm nào chứa biến và X có giá trị 0. Chúng tôi cũng giả
định một bộ đệm ghi qua; bộ đệm ghi lại thêm một số biến chứng bổ sung nhưng tương tự. Sau khi giá trị của X
được viết bởi A, bộ đệm A và bộ nhớ đều chứa giá trị mới, nhưng bộ đệm Bùi thì không và nếu B đọc giá trị của
X, nó sẽ nhận được 0!
5.10 Phân cấp song song và bộ nhớ: Sự kết hợp bộ đệm 477

trường hợp một số bộ xử lý có thể thấy chữ viết của P2 trước và sau đó xem chữ
viết của P1, duy trì giá trị được viết bởi P1 vô thời hạn. Cách đơn giản nhất để
tránh những khó khăn như vậy là đảm bảo rằng tất cả các chữ viết đến cùng một
vị trí được nhìn theo thứ tự giống hệt nhau, mà chúng ta gọi viết nối tiếp.

Đề án cơ bản để thực thi sự kết hợp


Trong bộ xử lý kết hợp bộ đệm, bộ nhớ cache cung cấp cả hai di cư và nhân rộng
của các mục dữ liệu được chia sẻ :
■ Di cư: Một mục dữ liệu có thể được chuyển đến bộ đệm cục bộ và được sử
dụng ở đó trong a thời trang trong suốt. Di chuyển làm giảm cả độ trễ để
truy cập vào một mục dữ liệu được chia sẻ được phân bổ từ xa và nhu cầu
băng thông trên bộ nhớ dùng chung.
■ Nhân rộng: Khi dữ liệu được chia sẻ đang được đọc đồng thời, bộ nhớ
cache tạo một bản sao của mục dữ liệu trong bộ đệm cục bộ. Sao chép làm
giảm cả độ trễ truy cập và tranh chấp cho một mục dữ liệu được chia sẻ.
Hỗ trợ di chuyển và sao chép là rất quan trọng đối với hiệu suất trong việc truy
cập dữ liệu được chia sẻ, vì vậy nhiều bộ xử lý giới thiệu một giao thức phần
cứng để duy trì bộ nhớ cache mạch lạc. Các giao thức để duy trì sự gắn kết cho
nhiều bộ xử lý được gọi giao thức kết hợp bộ đệmChìa khóa để thực hiện giao
thức kết hợp bộ đệm là theo dõi trạng thái của bất kỳ chia sẻ nào của khối dữ liệu.
Giao thức kết hợp bộ đệm phổ biến nhất là rình mò Mỗi bộ đệm có một bản
sao dữ liệu từ một khối bộ nhớ vật lý cũng có một bản sao trạng thái chia sẻ của
khối, nhưng không có trạng thái tập trung nào được giữ. Tất cả các bộ nhớ cache
đều có thể truy cập thông qua một số phương tiện phát sóng (xe buýt hoặc mạng)
và tất cả các bộ điều khiển bộ đệm đều giám sát hoặc. rình mò trên phương tiện
để xác định xem họ có bản sao của một khối hay không được yêu cầu trên xe
buýt hoặc truy cập chuyển đổi.
Trong phần sau, chúng tôi giải thích sự kết hợp bộ đệm dựa trên rình mò như
được triển khai với một bus được chia sẻ, nhưng bất kỳ phương tiện liên lạc nào
phát bộ nhớ cache đều bỏ lỡ cho tất cả các bộ xử lý đều có thể được sử dụng để
thực hiện sơ đồ kết hợp dựa trên rình mò. Việc phát sóng này đến tất cả các bộ
nhớ cache làm cho các giao thức rình mò trở nên đơn giản để thực hiện nhưng
cũng giới hạn khả năng mở rộng của chúng.

Giao thức rình mò


Một phương pháp thực thi sự gắn kết là đảm bảo rằng bộ xử lý có quyền truy cập độc
quyền vào một mục dữ liệu trước khi nó viết mục đó. Kiểu giao thức này được gọi là
aviết giao thức vô hiệu bởi vì nó vô hiệu hóa các bản sao trong bộ nhớ cache khác
trên một bài viết. Độc quyền truy cập đảm bảo rằng không có bản sao có thể đọc
hoặc ghi khác của một mục tồn tại khi ghi xảy ra: tất cả các bản sao được lưu trong
bộ nhớ cache khác của mục bị vô hiệu.
Hình 5.40 cho thấy một ví dụ về giao thức vô hiệu cho xe buýt rình mò với bộ
nhớ ghi lại trong hành động. Để xem giao thức này đảm bảo sự gắn kết như thế
nào, hãy xem xét một văn bản theo sau bởi một bộ xử lý khác: vì việc ghi yêu
cầu
478 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Nội dung của


Nội dung của Nội dung của ký ức
CPU A bộ nhớ Bộ nhớ cache
Hoạt động xử lý Hoạt động xe buýt cache CPU Bùi vị trí X
0
CPU A đọc X Bộ nhớ cache cho X 0 0
CPU B đọc X Bộ nhớ cache cho X 0 0 0
CPU A viết từ 1 đến X Vô hiệu cho X 1 0
CPU B đọc X Bộ nhớ cache cho X 1 1 1

HÌNH 5.40 Một ví dụ về giao thức vô hiệu hoạt động trên xe buýt rình mò cho một khối bộ
đệm (X) với bộ nhớ cache ghi lại. Chúng tôi giả định rằng ban đầu không có bộ đệm nào giữ X và giá
trị của X trong bộ nhớ là 0. CPU và nội dung bộ nhớ hiển thị giá trị sau khi bộ xử lý và hoạt động xe buýt
đã hoàn thành. Một khoảng trống cho biết không có hoạt động hoặc không có bản sao được lưu trong bộ
nhớ cache. Khi lần bỏ lỡ thứ hai của B xảy ra, CPU A sẽ phản hồi với giá trị hủy phản hồi khỏi bộ nhớ.
Ngoài ra, cả nội dung của bộ đệm Bùi và nội dung bộ nhớ của X đều được cập nhật. Bản cập nhật bộ nhớ
này, xảy ra khi một khối được chia sẻ, đơn giản hóa giao thức, nhưng có thể theo dõi quyền sở hữu và buộc
ghi lại chỉ khi khối được thay thế. Điều này đòi hỏi phải giới thiệu một trạng thái bổ sung có tên là chủ sở
hữu, chỉ ra rằng một khối có thể được chia sẻ, nhưng bộ xử lý sở hữu có trách nhiệm cập nhật bất kỳ bộ xử
lý và bộ nhớ nào khác khi thay đổi khối hoặc thay thế nó.

truy cập độc quyền, bất kỳ bản sao nào được giữ bởi bộ xử lý đọc phải bị vô hiệu
(do đó tên giao thức). Do đó, khi đọc xảy ra, nó bị bỏ lỡ trong bộ đệm và bộ đệm
buộc phải tìm nạp một bản sao mới của dữ liệu. Để ghi, chúng tôi yêu cầu bộ xử
lý ghi có quyền truy cập độc quyền, ngăn không cho bất kỳ bộ xử lý nào khác có
thể ghi đồng thời. Nếu hai bộ xử lý cố gắng viết cùng một dữ liệu cùng một lúc,
một trong số chúng sẽ thắng cuộc đua, khiến bản sao bộ xử lý khác bị vô hiệu.
Để bộ xử lý khác hoàn thành ghi của nó, nó phải có được một bản sao mới của
dữ liệu, hiện phải chứa giá trị cập nhật. Do đó, giao thức này cũng thực thi viết
tuần tự.
đang truy cập các biến khác nhau.

Giao diện
phần
cứng /
phần
mềm
chia sẻ sai Khi hai các
biến chia sẻ không liên
quan được đặt trong cùng
một khối bộ đệm và
khối đầy đủ được trao
đổi giữa các bộ xử lý
mặc dù các bộ xử lý
Một cái nhìn sâu sắc
là kích thước khối
đóng một vai trò quan
trọng trong sự kết
hợp bộ đệm. Ví dụ:
lấy trường hợp rình
mò trên bộ đệm có
kích thước khối là
tám từ, với một từ
duy nhất được viết và
đọc bởi hai bộ xử lý.
Hầu hết các giao thức
trao đổi các khối đầy
đủ giữa các bộ xử lý,
do đó làm tăng nhu
cầu băng thông mạch
lạc.
Các khối lớn cũng
có thể gây ra những gì
được gọi là chia sẻ sai:
khi hai biến chia sẻ
không liên quan được
đặt trong cùng một
khối bộ đệm, toàn bộ
khối được trao đổi
giữa các bộ xử lý mặc
dù các bộ xử lý đang
truy cập các biến khác
nhau. Các lập trình
viên và trình biên dịch
nên bố trí dữ liệu cẩn
thận để tránh chia sẻ
sai.
5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền 479

Xây dựng: Mặc dù ba thuộc tính trên trang 476 là đủ để đảm bảo sự gắn kết, câu
hỏi khi nào một giá trị bằng văn bản được nhìn thấy cũng rất quan trọng. Để xem tại
sao, quan sát rằng chúng ta không thể yêu cầu đọc X Hình 5.39 ngay lập tức thấy giá
trị được viết cho X bởi một số bộ xử lý khác. Nếu, ví dụ, một chữ viết X trên một bộ
xử lý trước khi đọc X trên bộ xử lý khác rất sớm, có thể không thể đảm bảo rằng việc
đọc trả về giá trị của dữ liệu được viết, vì dữ liệu bằng văn bản thậm chí có thể không
rời khỏi bộ xử lý tại thời điểm đó. Vấn đề chính xác khi nào một giá trị bằng văn bản
phải được nhìn thấy bởi một người đọc được xác định bởi a mô hình thống nhất bộ
nhớ.
Chúng tôi đưa ra hai giả định sau đây. Đầu tiên, một văn bản không hoàn thành
(và cho phép lần viết tiếp theo xảy ra) cho đến khi tất cả các bộ xử lý đã thấy hiệu
ứng của văn bản đó. Thứ hai, bộ xử lý không thay đổi thứ tự của bất kỳ ghi nào đối
với bất kỳ truy cập bộ nhớ nào khác. Hai điều kiện này có nghĩa là nếu bộ xử lý ghi vị
trí X theo sau là vị trí Y, bất kỳ bộ xử lý nào nhìn thấy giá trị mới của Y cũng phải xem
giá trị mới của X. Những hạn chế này cho phép bộ xử lý sắp xếp lại các lần đọc,
nhưng buộc bộ xử lý hoàn thành việc ghi theo thứ tự chương trình.

Xây dựng: Vì đầu vào có thể thay đổi bộ nhớ đằng sau bộ nhớ cache và kể từ đầu
ra có thể cần giá trị mới nhất trong bộ đệm ghi lại, cũng có một vấn đề về kết hợp bộ
đệm cho I / O với bộ nhớ cache của một bộ xử lý cũng như giữa các bộ nhớ cache
của nhiều bộ xử lý. Vấn đề kết hợp bộ đệm cho bộ đa xử lý và I / O (xem Chương 6),
mặc dù có nguồn gốc tương tự, có các đặc điểm khác nhau ảnh hưởng đến giải pháp
thích hợp. Không giống như I / O, trong đó nhiều bản sao dữ liệu là một sự kiện hiếm
gặp, nên tránh một sự kiện bất cứ khi nào có thể, một chương trình chạy trên nhiều
bộ xử lý thường sẽ có các bản sao của cùng một dữ liệu trong một số bộ nhớ cache.

Xây dựng: Ngoài giao thức kết hợp bộ đệm rình mò trong đó trạng thái của các khối
chia sẻ được phân phối, a dựa trên thư mục giao thức kết hợp bộ đệm giữ trạng thái chia
sẻ của một khối bộ nhớ vật lý chỉ trong một vị trí, được gọi là thư mụcSự kết hợp dựa trên
thư mục có chi phí triển khai cao hơn một chút so với rình mò, nhưng nó có thể làm giảm
lưu lượng giữa các bộ nhớ cache và do đó mở rộng quy mô đến số lượng bộ xử lý lớn
hơn.

5.11 Song song và phân cấp bộ nhớ :


Mảng dư thừa của đĩa rẻ tiền

Phần trực tuyến này mô tả cách sử dụng nhiều đĩa kết hợp có thể cung cấp thông
lượng cao hơn nhiều, đó là nguồn cảm hứng ban đầu Mảng dư thừa của Đĩa rẻ
tiền (RAID). Tuy nhiên, sự phổ biến thực sự của RAID là do nhiều hơn đến độ tin
cậy lớn hơn đáng kể được cung cấp bằng cách bao gồm một số lượng nhỏ các đĩa
dự phòng. Phần này giải thích sự khác biệt về hiệu suất, chi phí và độ tin cậy
giữa các cấp độ RAID.
5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền 479.e1

00034 Song song và phân cấp bộ nhớ :


5.11 Mảng dư thừa của đĩa rẻ tiền
Luật Amdahl trong Chương 1 nhắc nhở chúng ta rằng bỏ bê I / O trong cuộc cách
mạng song song này là ngu ngốc. Một ví dụ đơn giản chứng minh điều này.

Tác động của I / O đến Hiệu suất Hệ thống

Giả sử chúng ta có một điểm chuẩn thực hiện trong 100 giây thời gian trôi
qua, trong đó 90 giây là thời gian CPU và phần còn lại là thời gian I / O. Giả VÍ DỤ
sử số lượng bộ xử lý tăng gấp đôi cứ sau 2 năm, nhưng bộ xử lý vẫn ở cùng
tốc độ và thời gian I / O không cải thiện. Chương trình của chúng tôi sẽ chạy
nhanh hơn bao nhiêu vào cuối 6 năm?

Chúng tôi biết rằng


TRẢ LỜI
Thời gian trôi đi = Thời gian CPU + Tôi / Thời gian
100 = 90 + Tôi / Thời gian
I / O thời gian = 10 giây

Thời gian CPU mới và thời gian trôi qua kết quả được tính trong bảng sau.

Sự cải thiện hiệu suất CPU sau 6 năm là


90
11 = số 8
479.e2 5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền

Tuy nhiên, sự cải thiện trong thời gian trôi qua chỉ là

100
21 = 4.7 ,

và thời gian I / O đã tăng từ 10% đến 47% thời gian trôi qua.

Do đó, cuộc cách mạng song song cần phải đến với I / O cũng như tính toán,
hoặc nỗ lực song song có thể bị lãng phí bất cứ khi nào các chương trình làm I /
O, điều mà tất cả chúng phải làm.
Tăng tốc hiệu suất I / O là động lực ban đầu của mảng đĩa. Vào cuối những năm
1980, bộ lưu trữ hiệu suất cao được lựa chọn là các đĩa lớn, đắt tiền. Lập luận là
bằng cách thay thế một vài đĩa lớn bằng nhiều đĩa nhỏ, hiệu suất sẽ được cải thiện
vì sẽ có nhiều đầu đọc hơn. Sự thay đổi này cũng phù hợp với nhiều bộ xử lý, vì
nhiều đầu đọc / ghi có nghĩa là hệ thống lưu trữ có thể hỗ trợ nhiều truy cập độc
lập hơn, cũng như các chuyển khoản lớn trải rộng trên nhiều đĩa. Đó là, bạn có thể
nhận được cả I / O cao mỗi giây và tốc độ truyền dữ liệu cao. Ngoài hiệu suất cao
hơn, có thể có những lợi thế về chi phí, sức mạnh và không gian sàn, vì các đĩa
nhỏ hơn thường hiệu quả hơn trên mỗi gigabyte so với các đĩa lớn hơn.
Lỗ hổng trong lập luận là mảng đĩa có thể làm cho độ tin cậy tồi tệ hơn nhiều.
Các ổ đĩa nhỏ hơn, rẻ tiền này có xếp hạng MTTF thấp hơn các ổ đĩa lớn, nhưng
quan trọng hơn, bằng cách thay thế một ổ đĩa bằng 50 ổ đĩa nhỏ, tỷ lệ thất bại sẽ
tăng ít nhất 50 lần.
Giải pháp là thêm dự phòng để hệ thống có thể đối phó với các lỗi đĩa mà
không mất thông tin. Bằng cách có nhiều đĩa nhỏ, chi phí dự phòng thêm để cải
thiện độ tin cậy là nhỏ, liên quan đến các giải pháp cho một vài đĩa lớn. Như thế,
độ tin cậy có giá cả phải chăng hơn nếu bạn xây dựng một loạt các đĩa rẻ tiền.
Quan sát này dẫn đến tên của nó :dư thừa mảng đĩa rẻ tiền, viết tắt RAID.
mảng dự phòng của Nhìn lại, mặc dù phát minh của nó được thúc đẩy bởi hiệu suất, độ tin cậy là
đĩa rẻ tiền (RAID) Một lý do chính cho sự phổ biến rộng rãi của RAID. Phần còn lại của phần này khảo
tổ chức của các đĩa sử sát các tùy chọn cho độ tin cậy và tác động của chúng đối với chi phí và hiệu suất.
dụng một loạt các đĩa nhỏ Bạn cần bao nhiêu dự phòng? Bạn có cần thêm thông tin để tìm lỗi? Có vấn đề
và rẻ tiền để tăng cả hiệu
suất và độ tin cậy.
làm thế nào bạn sắp xếp dữ liệu và thông tin kiểm tra bổ sung trên các đĩa này?
Bài viết đặt ra thuật ngữ đã đưa ra một câu trả lời tiến hóa cho những câu hỏi này,
bắt đầu với giải pháp đơn giản nhất nhưng đắt nhất. Hình e5.11.1 cho thấy sự tiến
hóa và chi phí ví dụ trong số lượng kiểm tra thêm đĩa. Để theo dõi sự tiến hóa,
các tác giả đã đánh số các giai đoạn của RAID và chúng vẫn được sử dụng cho
đến ngày nay.
5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền 479.e3

Đĩa dữ liệu Kiểm tra dư thừa đĩa

RAID 0
(Không dư thừa)
Sử dụng rộng rãi

RAID 1
(Gương)
EMC, HP (Tandem), IBM

RAID 2
(Phát hiện lỗi và
mã chỉnh sửa) Không sử dụng

RAID 3
(T chẵn lẻ xen kẽ)
Khái niệm lưu trữ

RAID 4
(T chẵn lẻ xen kẽ)
Thiết bị mạng

RAID 5
(Khối phân tán-
ngang nhau)
Sử dụng rộng rãi
RAID 6
(Dự phòng P + Q)
Gần đây phổ biến

HÌNH e5.11.1 RAID cho một ví dụ về bốn đĩa dữ liệu hiển thị các đĩa kiểm tra bổ sung cho
mỗi cấp RAID và các công ty sử dụng từng cấp. Số liệu e5.11.2 và e5.11.3 giải thích sự khác biệt
giữa RAID 3, RAID 4 và RAID 5.

Không có dự phòng (RAID 0)


Đơn giản chỉ cần truyền bá dữ liệu qua nhiều đĩa, được gọi lột đồ, tự động buộc lột đồ Phân bổ các khối
truy cập vào một số đĩa. Lột qua một bộ đĩa làm cho bộ sưu tập xuất hiện thành tuần tự logic để tách các
phần mềm dưới dạng một đĩa lớn duy nhất, giúp đơn giản hóa việc quản lý lưu đĩa để cho phép hiệu suất
trữ. Nó cũng cải thiện hiệu suất cho các truy cập lớn, vì nhiều đĩa có thể hoạt cao hơn một đĩa có thể
cung cấp.
động cùng một lúc. Các hệ thống chỉnh sửa video, ví dụ, thường xuyên tước dữ
liệu của họ và có thể không lo lắng về độ tin cậy nhiều như cơ sở dữ liệu.
RAID 0 là một cái gì đó sai lầm, vì không có sự dư thừa. Tuy nhiên, các mức
RAID thường được để lại cho nhà điều hành để đặt khi tạo hệ thống lưu trữ và
RAID 0 thường được liệt kê là một trong các tùy chọn. Do đó, thuật ngữ RAID 0
đã được sử dụng rộng rãi.
479.e4 5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền

Phản chiếu (RAID 1)


phản chiếu Viết dữ Đề án truyền thống này để chịu đựng sự cố đĩa, được gọiphản chiếu, hoặc là
liệu giống hệt nhau đến bóng tối, sử dụng gấp đôi số đĩa so với RAID 0. Bất cứ khi nào dữ liệu được ghi
nhiều đĩa để tăng tính vào một đĩa, dữ liệu đó cũng được ghi vào một đĩa dự phòng, do đó luôn có hai
khả dụng của dữ liệu. bản sao của thông tin. Nếu một đĩa bị lỗi, hệ thống chỉ cần chuyển đến gương
gương và đọc nội dung của nó để có được thông tin mong muốn. Mirroring là
giải pháp RAID đắt nhất, vì nó đòi hỏi nhiều đĩa nhất.

Phát hiện lỗi và sửa mã (RAID 2)


RAID 2 mượn sơ đồ phát hiện và sửa lỗi thường được sử dụng cho các bộ nhớ (xem Mục
5.5). Vì RAID 2 đã không sử dụng được, chúng tôi sẽ không mô tả nó ở đây.

Tính chẵn lẻ xen kẽ bit (RAID 3)


Chi phí sẵn có cao hơn có thể giảm xuống còn 1 /n, Ở đâu n là số lượng đĩa trong
nhóm bảo vệ Các a nhóm bảo vệ Thay vì có một bản sao đầy đủ của dữ liệu gốc cho mỗi đĩa,
nhóm các đĩa dữ liệu chúng ta chỉ cần thêm đủ thông tin dự phòng để khôi phục thông tin bị mất về lỗi.
hoặc các khối chia sẻ Đọc hoặc ghi vào tất cả các đĩa trong nhóm, với một đĩa thêm để giữ thông tin
đĩa hoặc khối kiểm tra kiểm tra trong trường hợp có lỗi. RAID 3 phổ biến trong các ứng dụng có bộ dữ
chung. liệu lớn, (.Mục 5.5) Khi đĩa bị lỗi, sau đó bạn trừ tất cả dữ liệu vào đĩa tốt khỏi
đĩa chẵn lẻ; các thông tin còn lại phải là thông tin còn thiếu.
Không giống như RAID 1, nhiều đĩa phải được đọc để xác định dữ liệu bị
thiếu. Giả định đằng sau kỹ thuật này là mất nhiều thời gian hơn để phục hồi sau
thất bại nhưng chi tiêu ít hơn cho việc lưu trữ dự phòng là một sự đánh đổi tốt.

Chặn ngang khối (RAID 4)


RAID 4 sử dụng cùng tỷ lệ đĩa dữ liệu và đĩa kiểm tra như RAID 3, nhưng chúng
truy cập dữ liệu khác nhau. Tính chẵn lẻ được lưu trữ dưới dạng các khối và
được liên kết với một tập hợp các khối dữ liệu.
Trong RAID 3, mọi quyền truy cập đều đi vào tất cả các đĩa. Tuy nhiên, một
số ứng dụng thích truy cập nhỏ hơn, cho phép truy cập độc lập xảy ra song song.
Đó là mục đích của các cấp độ RAID 4 đến 6. Vì thông tin phát hiện lỗi trong
từng lĩnh vực được kiểm tra trên các lần đọc để xem dữ liệu có chính xác hay
không, nên việc đọc nhỏ như vậy có thể xảy ra độc lập miễn là quyền truy cập tối
thiểu là một lĩnh vực. Trong ngữ cảnh RAID, một quyền truy cập nhỏ chỉ vào
một đĩa trong nhóm bảo vệ trong khi một quyền truy cập lớn vào tất cả các đĩa
trong nhóm bảo vệ.
Viết là một vấn đề khác. Dường như mỗi chữ viết nhỏ sẽ yêu cầu tất cả các đĩa
khác được truy cập để đọc phần còn lại của thông tin cần thiết để tính toán lại
tính chẵn lẻ mới, như ở bên trái Hình e5.11.2Một chữ viết nhỏ của người Viking
sẽ yêu cầu đọc dữ liệu cũ và tính chẵn lẻ cũ, thêm thông tin mới, sau đó viết tính
chẵn lẻ mới vào đĩa chẵn lẻ và dữ liệu mới vào đĩa dữ liệu.
5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền 479.e5

Dữ liệu Dữ liệu mới1. Đọc 2. Đọc


mới 1. Đọc 2. Đọc 3. Đọc
D0 D0 D1 D2 D3 P
D0 D0 D1 D2 D3 P

+ XOR
+ XOR
+ XOR

D0 D1 D2 D3 P
D0 D1 D2 D3 P
3. Viết 4. Viết
4. Viết 5. Viết

HÌNH e5.11.2 Cập nhật ghi nhỏ trên RAID 4. Tối ưu hóa này cho viết nhỏ làm giảm số lượng truy cập đĩa
cũng như số lượng đĩa bị chiếm dụng. Con số này giả định chúng ta có bốn khối dữ liệu và một khối chẵn lẻ. Tính
toán chẵn lẻ RAID 4 ngây thơ ở bên trái của hình đọc các khối D1, D2 và D3 trước khi thêm khối D0? để tính
chẵn lẻ P. mới?. (Trong trường hợp bạn đang tự hỏi, dữ liệu mới D0? đến trực tiếp từ CPU, vì vậy các đĩa không
liên quan đến việc đọc nó.) Phím tắt RAID 4 ở bên phải đọc giá trị cũ D0 và so sánh nó với giá trị mới D0? để xem
bit nào sẽ thay đổi. Tiếp theo bạn đọc chẵn lẻ P cũ và sau đó thay đổi các bit tương ứng thành dạng P? Chức năng
logic độc quyền HOẶC làm chính xác những gì chúng ta muốn. Ví dụ này thay thế ba lần đọc đĩa (D1, D2, D3) và
hai lần ghi đĩa (D0?, P?) liên quan đến tất cả các đĩa cho hai lần đọc đĩa (D0, P) và hai lần ghi đĩa (D0?, P?), chỉ
liên quan đến hai đĩa. Mở rộng kích thước của nhóm chẵn lẻ làm tăng tiết kiệm của phím tắt. RAID 5 sử dụng cùng
một phím tắt.

Cái nhìn sâu sắc quan trọng để giảm chi phí này là tính chẵn lẻ chỉ đơn giản là
một tổng thông tin; bằng cách xem bit nào thay đổi khi chúng ta viết thông tin
mới, chúng ta chỉ cần thay đổi các bit tương ứng trên đĩa chẵn lẻ. Quyền của
Hình e5.11.2 hiển thị các phím tắt. Chúng ta phải đọc dữ liệu cũ từ đĩa được viết ,
so sánh dữ liệu cũ với dữ liệu mới để xem bit nào thay đổi, đọc tính chẵn lẻ cũ,
thay đổi các bit tương ứng và sau đó viết dữ liệu mới và tính chẵn lẻ mới. Do đó,
ghi nhỏ liên quan đến bốn truy cập đĩa vào hai đĩa thay vì truy cập tất cả các đĩa.
Tổ chức này là RAID 4.

Phân chia chẵn lẻ xen kẽ khối (RAID 5)


RAID 4 hỗ trợ hiệu quả hỗn hợp các số đọc lớn, ghi lớn và đọc nhỏ, cộng với nó cho
phép ghi nhỏ. Một nhược điểm của hệ thống là đĩa chẵn lẻ phải được cập nhật trên
mỗi lần ghi, vì vậy đĩa chẵn lẻ là nút cổ chai để ghi ngược lại.
Để khắc phục nút cổ chai ghi chẵn lẻ, thông tin chẵn lẻ có thể được lan truyền
khắp tất cả các đĩa để không có nút cổ chai duy nhất để viết. Tổ chức chẵn lẻ
phân tán là RAID 5.
Hình e5.11.3 cho thấy cách dữ liệu được phân phối trong RAID 4 so với RAID 5.
Như tổ chức bên phải hiển thị, trong RAID 5, tính chẵn lẻ được liên kết với mỗi hàng
khối dữ liệu không còn bị giới hạn trong một đĩa. Tổ chức này cho phép nhiều lần ghi
xảy ra đồng thời miễn là các khối chẵn lẻ không nằm trên cùng một đĩa. Ví dụ: một
chữ viết để chặn 8 ở bên phải cũng phải truy cập vào tính chẵn lẻ của nó
479.e6 5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền

0 1 2 3 P0 0 1 2 3 P0

4 5 6 7 P1 4 5 6 P1 7

s 9 10 11 P2 s 9 P2 10 11
ố ố
8 13 14 15 P3 8 P3 13 14 15

12 17 18 19 P4 12 16 17 18 19

16 21 22 23 P5 P4 21 22 23 P5

20 ... ... ... ... 20 ... ... ... ...

... ...

RAID 4 RAID 5

HÌNH e5.11.3 Tính chẵn lẻ xen kẽ khối (RAID 4) so với tính chẵn lẻ xen kẽ khối phân tán (RAID 5).
Bằng cách phân phối các khối chẵn lẻ cho tất cả các đĩa, một số lần ghi nhỏ có thể được thực hiện song song.

chặn P2, do đó chiếm các đĩa thứ nhất và thứ ba. Một lần ghi thứ hai để chặn 5 ở
bên phải, ngụ ý cập nhật cho khối chẵn lẻ P1 của nó, truy cập vào đĩa thứ hai và
thứ tư và do đó có thể xảy ra đồng thời với ghi vào khối 8. Những người đó viết
cho tổ chức ở bên trái dẫn đến thay đổi các khối P1 và P2, cả trên đĩa thứ năm, là
một nút cổ chai.

P + Q Dự phòng (RAID 6)
Các kế hoạch dựa trên tính chẵn lẻ bảo vệ chống lại một thất bại tự xác định. Khi một
hiệu chỉnh lỗi duy nhất là không đủ, tính chẵn lẻ có thể được khái quát hóa để có phép
tính thứ hai so với dữ liệu và một đĩa kiểm tra thông tin khác. Khối kiểm tra thứ hai
này cho phép phục hồi từ một thất bại thứ hai. Do đó, chi phí lưu trữ gấp đôi so với
RAID 5. Các phím tắt viết nhỏ của Hình e5.11.2 cũng hoạt động, ngoại trừ bây giờ có
sáu truy cập đĩa thay vì bốn để cập nhật cả thông tin P và Q.

Tóm tắt RAID


RAID 1 và RAID 5 được sử dụng rộng rãi trong các máy chủ; một ước tính là 80%
đĩa trong máy chủ được tìm thấy trong một tổ chức RAID.
Một điểm yếu của hệ thống RAID là sửa chữa. Đầu tiên, để tránh làm cho dữ liệu
không khả dụng trong quá trình sửa chữa, mảng phải được thiết kế để cho phép các
đĩa bị lỗi được thay thế mà không phải tắt hệ thống. RAID có đủ dư thừa để cho phép
trao đổi nóng Thay thế hoạt động liên tục, nhưng trao đổi nóng các đĩa đặt nhu cầu về thiết kế vật lý và điện
một thành phần phần của mảng và giao diện đĩa. Thứ hai, một lỗi khác có thể xảy ra trong quá trình sửa
cứng trong khi hệ chữa, do đó thời gian sửa chữa ảnh hưởng đến cơ hội mất dữ liệu: thời gian sửa chữa
thống đang chạy. càng lâu, khả năng xảy ra lỗi khác sẽ càng lớn
5.11 Phân cấp song song và bộ nhớ: Mảng dư thừa của đĩa rẻ tiền 479.e7

mất dữ liệu. Thay vì phải chờ người vận hành mang vào một đĩa tốt, một số hệ thống
bao gồm phụ tùng chờ để dữ liệu có thể được xây dựng lại ngay lập tức khi phát phụ tùng chờ Dự trữ tài
hiện ra sự thất bại. Sau đó, nhà điều hành có thể thay thế các đĩa bị lỗi theo cách nhàn nguyên phần cứng có thể
nhã hơn. Lưu ý rằng một nhà điều hành con người cuối cùng xác định đĩa nào sẽ loại ngay lập tức thay thế một
bỏ. Người vận hành chỉ là con người, vì vậy họ thỉnh thoảng loại bỏ đĩa tốt thay vì thành phần thất bại.
đĩa bị hỏng, dẫn đến lỗi đĩa không thể phục hồi.
Ngoài việc thiết kế hệ thống RAID để sửa chữa, còn có những câu hỏi về cách
thay đổi công nghệ đĩa theo thời gian. Mặc dù các nhà sản xuất đĩa trích dẫn
MTTF rất cao cho các sản phẩm của họ, những con số đó nằm trong điều kiện
danh nghĩa. Nếu một mảng đĩa cụ thể đã bị chu kỳ nhiệt độ do sự cố của hệ thống
điều hòa không khí hoặc bị rung do thiết kế giá đỡ, xây dựng hoặc lắp đặt kém,
tỷ lệ hỏng có thể cao hơn từ ba đến sáu lần (xem ngụy biện trên trang 470). Việc
tính toán độ tin cậy RAID giả định tính độc lập giữa các lỗi đĩa, nhưng lỗi đĩa có
thể tương quan với nhau, vì thiệt hại đó do môi trường có thể sẽ xảy ra với tất cả
các đĩa trong mảng. Một mối quan tâm khác là vì băng thông đĩa đang phát triển
chậm hơn dung lượng đĩa, thời gian để sửa chữa đĩa trong hệ thống RAID đang
tăng lên, từ đó tăng cường khả năng thất bại thứ hai. Ví dụ: đĩa 14 TB có thể mất
khoảng 14 giờ để đọc tuần tự, giả sử không có nhiễu. Cho rằng RAID bị hỏng có
khả năng tiếp tục phục vụ dữ liệu, việc tái cấu trúc có thể được kéo dài đáng kể.
Bên cạnh việc tăng thời gian đó, một mối quan tâm khác là việc đọc nhiều dữ
liệu hơn trong quá trình tái thiết có nghĩa là làm tăng khả năng xảy ra lỗi phương
tiện đọc không thể sửa chữa, dẫn đến mất dữ liệu. Các đối số khác cho mối quan
tâm về nhiều lỗi đồng thời là số lượng đĩa ngày càng tăng trong mảng và việc sử
dụng các đĩa có dung lượng cao hơn.
Do đó, những xu hướng này đã dẫn đến sự quan tâm ngày càng tăng trong
việc bảo vệ chống lại nhiều hơn một thất bại, và vì vậy RAID 6 ngày càng được
cung cấp như một lựa chọn và được sử dụng trong lĩnh vực này.

Điều nào sau đây đúng về các cấp độ RAID 1, 3, 4, 5 và 6? Kiểm tra
1. Các hệ thống RAID dựa vào sự dư thừa để đạt được tính sẵn sàng cao. Bản thân bạn
2. RAID 1 (phản chiếu) có chi phí kiểm tra đĩa cao nhất.
3. Đối với các bài viết nhỏ, RAID 3 (ngang bằng bit) có thông lượng xấu
nhất.
4. Đối với các chữ viết lớn, RAID 3, 4 và 5 có cùng thông lượng.

Xây dựng Một vấn đề là làm thế nào phản chiếu tương tác với dải. Giả sử bạn đã
có, nói, bốn đĩa dữ liệu có giá trị lưu trữ và tám đĩa vật lý để sử dụng. Bạn có thể tạo
bốn cặp đĩa, mỗi đĩa được tổ chức dưới dạng RAID 1, và sau đó tước dữ liệu trên
bốn cặp RAID 1? Ngoài ra, bạn có thể tạo hai bộ bốn đĩa, mỗi đĩa được tổ chức dưới
dạng RAID 0, và sau đó gương ghi vào cả hai bộ RAID 0? Thuật ngữ RAID đã phát
triển để gọi RAID 1 trước đây + 0 hoặc RAID 10 (Gương sọc sọc) và RAID 0 sau + 1
hoặc RAID 01 (sọc nhân đôi sọc).
480 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

5.12 Tài liệu nâng cao: Thực hiện bộ đệm


Bộ điều khiển

Phần trực tuyến này cho thấy cách triển khai điều khiển cho bộ đệm, giống như
chúng tôi đã thực hiện kiểm soát đối với các biểu đồ một chu kỳ và đường ống
trong Chương 4Phần này bắt đầu với một mô tả về các máy trạng thái hữu hạn và
việc triển khai bộ điều khiển bộ đệm cho bộ đệm dữ liệu đơn giản, bao gồm mô tả
về bộ điều khiển bộ đệm trong ngôn ngữ mô tả phần cứng. Sau đó, nó đi vào chi
tiết của một giao thức kết hợp bộ đệm ví dụ và những khó khăn trong việc thực
hiện một giao thức như vậy.

5.13 Real Stuff: ARM Cortex-A8 và Intel


Phân cấp bộ nhớ lõi i7

Trong phần này, chúng ta sẽ xem xét hệ thống phân cấp bộ nhớ của hai bộ vi xử
lý tương tự được mô tả trong chương trước: ARM Cortex-A8 và Intel Core i7.
Phần này dựa trên Mục 2.6 của Kiến trúc máy tính: Cách tiếp cận định lượng, tái
bản lần thứ sáu.
Cortex-A53 là lõi có thể định cấu hình hỗ trợ kiến trúc tập lệnh ARMv8A, bao
gồm cả chế độ 32 bit và 64 bit. Cortex-A53 được phân phối dưới dạng lõi IP (sở
hữu trí tuệ). Lõi IP Cortex-A53 được sử dụng trong nhiều loại máy tính bảng và
điện thoại thông minh; nó được thiết kế để tiết kiệm năng lượng cao, một tiêu chí
quan trọng trong các PMD dựa trên pin. Lõi A53 có khả năng được cấu hình với
nhiều lõi trên mỗi chip để sử dụng trong các PMD cao cấp; thảo luận của chúng
tôi ở đây tập trung vào một lõi duy nhất. Cortex-A53 có thể phát hành hai hướng
dẫn cho mỗi đồng hồ với tốc độ xung nhịp lên tới 1,3 GHz.
I7 hỗ trợ kiến trúc tập lệnh x86-64, phần mở rộng 64 bit của kiến trúc 80 x 86.
I7 là bộ xử lý thực thi không theo thứ tự bao gồm bốn lõi. Chúng tôi tập trung ở
đây vào thiết kế hệ thống bộ nhớ và hiệu suất từ quan điểm của một lõi duy nhất.
Mỗi lõi trong i7 có thể thực hiện tối đa bốn hướng dẫn 80x86 cho mỗi chu kỳ
đồng hồ bằng cách sử dụng một đường ống 16 tầng, được lên lịch động, mà
chúng tôi mô tả chi tiết trong Chương 4. I7 có thể hỗ trợ tối đa ba kênh bộ nhớ,
mỗi kênh bao gồm một bộ DIMM riêng biệt và mỗi kênh có thể chuyển song
song. Sử dụng DDR3-1066, i7 có băng thông bộ nhớ cực đại chỉ hơn 25 GB / s.
Hình 5.41 tóm tắt kích thước địa chỉ và TLB của hai bộ xử lý. Các A53 có ba TLB
với không gian địa chỉ vật lý ảo và 32 bit 32 bit. Core i7 có ba TLB với địa chỉ ảo 48
bit và vật lý 36 bit. Mặc dù các thanh ghi 64 bit của Core i7 có thể chứa một địa chỉ
ảo lớn hơn, nhưng không có
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480.e1

5.12 Tài liệu nâng cao: Thực hiện


Bộ điều khiển bộ đệm

Phần bắt đầu với SystemVerilog của bộ điều khiển bộ đệm từ Mục 5.9 trong tám
con số. Sau đó, nó đi vào chi tiết của một giao thức kết hợp bộ đệm ví dụ và
những khó khăn trong việc thực hiện một giao thức như vậy.

SystemVerilog của Bộ điều khiển bộ đệm đơn giản


Ngôn ngữ mô tả phần cứng chúng tôi đang sử dụng trong phần này là
SystemVerilog. Thay đổi lớn nhất từ các phiên bản trước của Verilog là nó mượn
các cấu trúc từ C để làm cho mã dễ đọc hơn. Số liệu e5.12.1 đến e5.12.8 hiển thị
mô tả SystemVerilog của bộ điều khiển bộ đệm.

gói cache_def;
// cấu trúc dữ liệu cho thẻ và dữ liệu bộ đệm

tham số int TAGMSB = 31; // thẻ msb


tham số int TAGLSB = 14; // thẻ lsb

// cấu trúc dữ liệu cho thẻ bộ đệm


typedef cấu trúc đóng gói {
bit hợp lệ; // bit hợp lệ
bit bẩn; // bit bẩn
bit [TAGMSB: TAGLSB] tag; // bit thẻ
} cache_tag_type;

// cấu trúc dữ liệu cho yêu cầu bộ nhớ cache


typedef struct {
chỉ mục bit [9: 0]; // Chỉ số 10 bit
bit chúng tôi; // ghi kích hoạt
} cache_Vq_type;

// Dữ liệu dòng bộ nhớ cache 128 bit


bit typedef [127: 0] cache_data_type;

HÌNH e5.12.1 Nhập khai báo trong SystemVerilog cho các thẻ và dữ liệu bộ đệm. Thẻ trường
rộng 18 bit và trường chỉ mục rộng 10 bit, trong khi trường 2 bit (bit 3 thì2) được sử dụng để lập chỉ mục
khối và chọn từ từ khối. Phần còn lại của khai báo loại được tìm thấy trong hình sau.
480.e2 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

// cấu trúc dữ liệu cho giao diện bộ điều khiển CPU <-> Bộ đệm

// Yêu cầu CPU (CPU-> bộ điều khiển bộ đệm)


typedef struct {
bit [31: 0] addr; // 32-bit yêu cầu addr
bit [31: 0] dữ liệu; // Dữ liệu yêu cầu 32 bit (được sử dụng khi ghi)
bit rw; // loại yêu cầu: 0 = đọc, 1 = ghi
bit hợp lệ; // yêu cầu là hợp lệ
} cpu_Vq_type;

// Kết quả bộ đệm (bộ điều khiển bộ đệm-> cpu)


typedef struct {

bit [31: 0] dữ liệu; // Dữ liệu 32 bit


sẵn sàng một chút; // kết quả đã sẵn sàng
} cpu_result_type;

//--------------------------------- ---------------------------------- ------


// cấu trúc dữ liệu cho bộ điều khiển bộ nhớ cache <-> giao diện bộ nhớ

// yêu cầu bộ nhớ (bộ điều khiển bộ đệm-> bộ nhớ)


typedef struct {
bit [31: 0] addr; // yêu cầu bổ sung byte
bit [127: 0] dữ liệu; // Dữ liệu yêu cầu 128 bit (được sử dụng khi ghi)
bit rw; // loại yêu cầu: 0 = đọc, 1 = ghi
bit hợp lệ; // yêu cầu là hợp lệ
} mem_Vq_type;

// phản hồi bộ điều khiển bộ nhớ (bộ nhớ -> bộ điều khiển bộ đệm) typedef struct
{

dữ liệu cache_data_type; // 128-bit đọc lại dữ liệu


bit sẵn sàng; // dữ liệu đã sẵn sàng
} mem_data_type;

gói cuối

HÌNH e5.12.2 Loại khai báo trong SystemVerilog cho bộ nhớ CPU và giao diện bộ nhớ cache. Đây là gần giống hệt nhau
ngoại trừ dữ liệu rộng 32 bit giữa CPU và bộ đệm và rộng 128 bit giữa bộ đệm và bộ nhớ.

Số liệu e5.12.1 và e5.12.2 khai báo các cấu trúc được sử dụng trong định
nghĩa của bộ đệm trong các hình sau. Ví dụ: cấu trúc thẻ bộ đệm (bộ nhớ cache_
tag_type) chứa một bit hợp lệ (hợp lệ), một chút bẩn (bẩn) và trường thẻ 18 bit
([Thẻ TAGMSB: TAGLSB]). Hình e5.12.3 hiển thị sơ đồ khối của bộ đệm bằng
cách sử dụng tên từ mô tả Verilog.
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480.e3

cpu_Vq.addr cpu_Vq.data
(hiển thị vị trí bit)
31 14 13 4 3210
mem_data.data

18 10 2 Byte
Thẻ Chỉ số bù đắp Mux Mux Mux Mux

Viết dữ liệu
18 bit
128
VD Thẻ

Dữ
liệu
1024
mục

18 128

Đọc dữ liệu
=

Đá
nh Khối bù Mux
32

Dữ liệu

HÌNH e5.12.3 Sơ đồ khối của bộ đệm đơn giản bằng cách sử dụng tên Verilog. Không được hiển thị là ghi cho phép thẻ bộ
đệm bộ nhớ và bộ nhớ dữ liệu bộ đệm hoặc tín hiệu điều khiển cho bộ ghép kênh cung cấp dữ liệu cho biến Data Write. Thay vì ghi riêng
biệt cho phép trên mỗi từ của khối dữ liệu bộ đệm, Verilog đọc giá trị cũ của khối vào Data Write và sau đó cập nhật từ trong biến đó trên
một ghi. Sau đó nó viết toàn bộ khối 128 bit.

Hình e5.12.4 xác định các mô-đun cho dữ liệu bộ đệm ( dm_cache_data) và bộ
nhớ cache thẻ (dm_cache_tag). Những ký ức này có thể được đọc bất cứ lúc nào,
nhưng chỉ viết xảy ra trên cạnh đồng hồ dương (đặt ra (clk)) và chỉ khi kích hoạt
ghi là 1 (data_Vq.we hoặc là tag_Vq.we).
480.e4 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

Hình e5.12.5 xác định đầu vào, đầu ra và trạng thái của FSM. Các đầu vào là
các yêu cầu từ CPU (cpu_Vq) và phản hồi từ bộ nhớ (mem_data) và các đầu ra là
các phản hồi cho CPU (cpu_res) và yêu cầu bộ nhớ (mem_req). Hình này cũng
tuyên bố các biến nội bộ cần thiết bởi FSM. Ví dụ: trạng thái hiện tại và các
thanh ghi trạng thái tiếp theo của FSM là rstate và vstate, tương ứng.
Hình e5.12.6 liệt kê các giá trị mặc định của các tín hiệu điều khiển, bao gồm
cả từ để được đọc hoặc viết từ một khối, thiết lập ghi bộ đệm cho phép 0, v.v.
Các giá trị này được đặt theo mọi chu kỳ đồng hồ, vì vậy, ghi cho phép một phần
của bộ đệm bộ đệm chẳng hạn , tag_Vq.weCó thể đặt thành 1 cho một chu kỳ
đồng hồ trong các hình bên dưới và sau đó sẽ được đặt lại thành 0 theo Verilog
trong hình này.
Hai số liệu cuối cùng cho thấy FSM là một tuyên bố trường hợp lớn (trường
hợp (rstate)), với bốn trạng thái chia thành hai con số. Hình e5.12.7 bắt đầu với
trạng thái Nhàn rỗi (nhàn rỗi), chỉ đơn giản là chuyển đến trạng thái So sánh thẻ
(so sánh_tag) nếu CPU đưa ra yêu cầu hợp lệ. Sau đó, nó mô tả hầu hết trạng thái
So sánh thẻ. Trạng thái So sánh Thẻ kiểm tra xem các thẻ có khớp và mục nhập
hợp lệ không. Nếu vậy, trước tiên nó đặt tín hiệu Cache Ready (v_cpu_res. đã sẵn
sàng). Nếu yêu cầu là ghi, nó sẽ đặt trường thẻ, bit hợp lệ và bit bẩn. Trạng thái
tiếp theo là Nhàn rỗi. Nếu đó là một lỗi, thì trạng thái chuẩn bị thay đổi mục nhập
thẻ và các bit hợp lệ và bẩn. Nếu khối được thay thế là sạch hoặc không hợp lệ,
trạng thái tiếp theo là Phân bổ.
Hình e5.12.8 tiếp tục trạng thái So sánh thẻ. Nếu khối được thay thế là bẩn, sau
đó trạng thái tiếp theo là Write-Back. Hình cho thấy trạng thái Phân bổ (phân bổ)
tiếp theo, chỉ đơn giản là đọc khối mới. Nó giữ vòng lặp cho đến khi bộ nhớ sẵn
sàng; khi nó là, nó đi đến trạng thái So sánh thẻ. Điều này được theo sau trong
hình bởi trạng thái Write-Back (viết lại). Như hình cho thấy, trạng thái Write-Back
chỉ ghi khối bẩn vào bộ nhớ, một lần nữa lặp lại cho đến khi bộ nhớ sẵn sàng. Khi
bộ nhớ đã sẵn sàng, chỉ ra ghi đã hoàn tất, chúng ta sẽ chuyển đến trạng thái Phân
bổ.
Mã ở cuối đặt trạng thái hiện tại từ trạng thái tiếp theo hoặc đặt lại FSM về
trạng thái Nhàn rỗi ở cạnh đồng hồ tiếp theo, tùy thuộc vào tín hiệu đặt lại (rst).
Tài liệu trực tuyến bao gồm mô-đun Test Case sẽ hữu ích để kiểm tra mã trong
các số liệu này. SystemVerilog này có thể được sử dụng để tạo bộ điều khiển bộ
đệm và bộ đệm trong FPGA .
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480.e5

/ * bộ nhớ cache: bộ nhớ dữ liệu, cổng đơn, 1024 khối * /


mô-đun dm_cache_data (đầu vào bit clk ,
đầu vào cache_Vq_type data_Vq, // yêu cầu / lệnh dữ liệu, ví dụ:. RW, hợp lệ
đầu vào cache_data_type data_write, // write port (dòng 128 bit)
đầu ra cache_data_type data_read); // đọc cổng
timeunit 1ns; timeprecision 1ps;

cache_data_typedata_mem [0: 1023];

bắt đầu ban đầu


cho (int i = 0; i <1024; i ++)
data_mem [i] = ‘0;
kết thúc

gán data_read = data_mem [data_Vq.index];

luôn_ff @ (posedge (clk)) bắt đầu


nếu (data_Vq.we)
data_mem [data_Vq.index] <= data_write;
kết thúc
mô-đun cuối

/ * bộ nhớ cache: bộ nhớ thẻ, cổng đơn, 1024 khối * / mô-đun


dm_cache_tag (clk bit đầu vào, // đồng hồ ghi
đầu vào cache_Vq_type tag_req, // yêu cầu / lệnh thẻ, ví dụ:. RW, cổng cache_tag_type tag_write,
// write nhập hợp lệ
đầu ra cache_tag_type tag_read); // đọc timeunit cổng 1ns;
timeprecision 1ps;

cache_tag_typetag_mem [0: 1023];

bắt đầu ban đầu


cho (int i = 0; i <1024; i ++)
tag_mem [i] = ‘0;
kết thúc

gán tag_read = tag_mem [tag_Vq.index];

luôn_ff @ (posedge (clk)) bắt đầu


nếu (tag_Vq.we)
tag_mem [tag_Vq.index] <= tag_write;
kết thúc

mô-đun cuối

HÌNH e5.12.4 Mô-đun dữ liệu và thẻ bộ đệm trong SystemVerilog. Chúng gần như giống hệt nhau ngoại trừ dữ liệu rộng 32 bit
giữa CPU và bộ đệm và rộng 128 bit giữa bộ đệm và bộ nhớ. Cả hai chỉ ghi trên các cạnh đồng hồ dương nếu kích hoạt ghi được đặt.
480.e6 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

/ * máy trạng thái hữu hạn bộ đệm * /

mô-đun dm_cache_fsm (đầu vào bit clk, đầu vào bit rst ,
đầu vào cpu_Vq_type cpu_Vq , // CPU yêu cầu đầu vào (CPU-> bộ đệm)
đầu vào mem_data_type mem_data , // phản hồi bộ nhớ (bộ nhớ-> bộ nhớ cache)
mem_Vq_type đầu ra mem_req , // yêu cầu bộ nhớ (bộ nhớ cache-> bộ nhớ)
đầu ra cpu_result_type cpu_res // kết quả bộ đệm (bộ nhớ cache-> CPU)
);

timeunit 1ns;
thời gian 1ps;

/ * viết đồng hồ * /
typedef enum {idle, sales_tag, phân bổ, write_back} cache_state_type;

/ * Đăng ký trạng thái FSM * /


cache_state_typevstate, rstate;

/ * tín hiệu giao diện để gắn thẻ bộ nhớ * /


cache_tag_typetag_read; cache_tag_typetag_write; // kết quả đọc thẻ
bộ nhớ cache_Vq_typetag_Vq; // dữ liệu ghi thẻ
// yêu cầu thẻ

/ * tín hiệu giao diện để bộ nhớ dữ liệu bộ nhớ cache * /


cache_data_typedata_read; // dòng bộ nhớ cache đọc dữ liệu
cache_data_typedata_write; // dữ liệu ghi dòng bộ đệm
cache_Vq_typedata_Vq; // dữ liệu req

/ * biến tạm thời cho kết quả bộ điều khiển bộ đệm * /


cpu_result_typev_cpu_res;

/ * biến tạm thời cho yêu cầu bộ điều khiển bộ nhớ * /


mem_Vq_typev_mem_req;

gán mem_Vq = v_mem_Vq; gán // kết nối với các cổng đầu ra
cpu_res = v_cpu_res;

HÌNH e5.12.5 FSM trong SystemVerilog, phần I . Các mô-đun này khởi tạo các bộ nhớ theo các định nghĩa loại trong con số trước.
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480.e7

luôn luôn bắt đầu

/ *------------------------- giá trị mặc định cho tất cả các tín hiệu ------------ * /
/ * không thay đổi trạng thái theo mặc định * /
vstate = rstate;
v_cpu_res = ‘{0, 0}; tag_write = ‘{0, 0, 0};

/ * đọc thẻ theo mặc định * /


tag_Vq.we = ‘0;
/ * chỉ mục bản đồ trực tiếp cho thẻ * /
tag_Vq.index = cpu_req.addr [13: 4];

/ * đọc dòng bộ nhớ cache hiện tại theo mặc định * /


data_Vq.we = ‘0;
/ * chỉ mục bản đồ trực tiếp cho dữ liệu bộ đệm * /
data_Vq.index = cpu_req.addr [13: 4];

/ * sửa đổi từ chính xác (32 bit) dựa trên địa chỉ * /
data_write = data_read;
trường hợp (cpu_Vq.addr [3: 2])
2 Lítb00: data_write [31: 0] = cpu_Vq.data;
2 Khănb01: data_write [63:32] = cpu_Vq.data;
2 Khănb10: data_write [95:64] = cpu_Vq.data;
2 bóng11: data_write [127: 96] = cpu_Vq.data;
kết thúc

/ * đọc từ chính xác (32 bit) từ bộ đệm (đến CPU) * / case (cpu numq.addr [3:
2])
2 Lítb00: v_cpu_res.data = data_read [31: 0]; 2 B01:
v_cpu_res.data = data 111: v_cpread.data

/ * địa chỉ yêu cầu bộ nhớ (được lấy mẫu từ yêu cầu CPU) * /
v_mem_req.addr = cpu numq.addr; / * dữ liệu yêu cầu bộ nhớ (được sử dụng
trong ghi) * /

v_mem_req.data = data_read;
v_mem_req.rw = ‘0;

HÌNH e5.12.6 FSM trong SystemVerilog, phần II . Phần này mô tả giá trị mặc định của tất cả các tín hiệu. Các số liệu sau đây sẽ được
thiết lập các giá trị này cho một chu kỳ đồng hồ và Verilog này sẽ đặt lại nó thành các giá trị này cho chu kỳ đồng hồ sau.
480.e8 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

//------------------------------------ Bộ nhớ cache FSM --------------------------


trường hợp (rstate)
/ * trạng thái nhàn rỗi * /
nhàn rỗi: bắt đầu
/ * Nếu có yêu cầu CPU, sau đó so sánh thẻ bộ đệm * / if (cpu_Vq.valid)

vstate = so_tag;
kết thúc
/ * trạng thái compare_tag * /
so sánh: bắt đầu
/ * hit bộ đệm (kết hợp thẻ và mục nhập bộ đệm là hợp lệ) * /
if (cpu_Vq.addr [TAGMSB: TAGLSB] == tag_read.tag && tag_read.valid) bắt đầu v_cpu_res. yet = 1;

/ * ghi hit * /
nếu (cpu_req.rw) bắt đầu
/ * đọc / sửa đổi dòng bộ nhớ cache * /
tag_Vq.we = 1; data_req.we = ‘1;

/ * không thay đổi trong thẻ * /


tag_write.tag = tag_read.tag;
tag_write.valid = ‘1;
/ * dòng bộ nhớ cache bị bẩn * /
tag_write.denty = ‘1;
kết thúc

/ * xaction đã hoàn thành * /


vstate = nhàn rỗi;
kết thúc
/ * bộ nhớ cache bỏ lỡ * /
khác bắt đầu
/ * tạo thẻ mới * /
tag_Vq.we = ‘1;
tag_write.valid = ‘1;
/ * thẻ mới * /
tag_write.tag = cpu_Vq.addr [TAGMSB: TAGLSB]; / * dòng bộ
đệm bị bẩn nếu ghi */ tag_write.denty = cpu_req.rw;

/ * tạo yêu cầu bộ nhớ khi bỏ lỡ * /


v_mem_req.valid = ‘1;
/ * bắt buộc bỏ lỡ hoặc bỏ lỡ với khối sạch * /
if (tag_read.valid == 1 Khănb0 || tag_read.denty == 1 Khănb0)
/ * đợi cho đến khi một khối mới được phân bổ * /
vstate = phân bổ;

HÌNH e5.12.7 FSM trong SystemVerilog, phần III . FSM thực tế nêu qua tuyên bố trường hợp trong hình này và tiếp theo. Con số này
có Trạng thái nhàn rỗi và hầu hết trạng thái So sánh thẻ.
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480,e9

khác bắt đầu


/ * bỏ lỡ với dòng bẩn * /
/ * ghi lại địa chỉ * /
v_mem_req.addr = {tag_read.tag, cpu_Vq.addr [TAGLSB-1: 0]}; v_mem_Vq.rw = 1;
/ * đợi cho đến khi viết xong * /
vstate = write_back;
kết thúc
kết thúc
kết thúc
/ * chờ phân bổ một dòng bộ đệm mới * /
phân bổ: bắt đầu
/ * bộ điều khiển bộ nhớ đã trả lời * /
nếu (mem_data. yet) bắt đầu
/ * so sánh lại thẻ để ghi nhớ (cần sửa đổi từ chính xác) * / vstate = so_tag;

data_write = mem_data.data;
/ * cập nhật dữ liệu dòng bộ nhớ cache * /
data_Vq.we = ‘1;
kết thúc
kết thúc
/ * chờ viết lại dòng bộ nhớ cache bẩn * / write_back: bắt
đầu

/ * ghi lại được hoàn thành * /


nếu (mem_data. yet) bắt đầu
/ * đưa ra yêu cầu bộ nhớ mới (phân bổ một dòng mới) * /
v_mem_req.valid = ‘1;
v_mem_req.rw = ‘0;

vstate = phân bổ;


kết thúc
kết thúc
kết thúc
kết thúc

luôn_ff @ (posedge (clk)) bắt đầu


nếu (rst)
rstate <= nhàn rỗi; // đặt lại trạng thái nhàn rỗi khác

rstate <= vstate;


kết thúc
/ * kết nối thẻ bộ nhớ cache / bộ nhớ dữ liệu * /
dm_cache_tag ctag (.*);
dm_cache_data cdata (.*);
mô-đun cuối

HÌNH e5.12.8 FSM trong SystemVerilog, phần IV . FSM thực tế nêu thông qua tuyên bố trường hợp trong hình trước và cái này. Con
số này có phần cuối cùng của trạng thái So sánh thẻ, cộng với trạng thái Phân bổ và Ghi lại.
480.e10 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

Kỹ thuật thực hiện bộ đệm mạch lạc cơ bản


Chìa khóa để thực hiện giao thức vô hiệu là việc sử dụng xe buýt hoặc phương
tiện phát sóng khác để thực hiện vô hiệu. Để vô hiệu hóa, bộ xử lý chỉ cần mua
quyền truy cập xe buýt và phát địa chỉ bị vô hiệu trên xe buýt. Tất cả các bộ xử
lý liên tục rình mò trên xe buýt, xem địa chỉ. Bộ xử lý kiểm tra xem địa chỉ trên
xe buýt có trong bộ đệm của họ không. Nếu vậy, dữ liệu tương ứng trong bộ đệm
bị vô hiệu.
Khi một văn bản cho một khối được chia sẻ xảy ra, bộ xử lý văn bản phải có
quyền truy cập bus để phát sóng vô hiệu của nó. Nếu hai bộ xử lý cố gắng viết
các khối được chia sẻ cùng một lúc, các nỗ lực của họ để phát một hoạt động vô
hiệu sẽ được tuần tự hóa khi họ phân xử cho xe buýt. Bộ xử lý đầu tiên có được
quyền truy cập xe buýt sẽ khiến bất kỳ bản sao nào khác của khối mà nó đang
viết bị vô hiệu. Nếu các bộ xử lý đang cố gắng viết cùng một khối, thì việc tuần
tự hóa được thực thi bởi xe buýt cũng tuần tự hóa các bài viết của họ. Một hàm ý
của sơ đồ này là việc ghi vào một mục dữ liệu được chia sẻ thực sự không thể
hoàn thành cho đến khi nó có được quyền truy cập xe buýt. Tất cả các lược đồ kết
hợp yêu cầu một số phương thức tuần tự hóa các truy cập vào cùng một khối bộ
đệm, bằng cách tuần tự hóa truy cập vào phương tiện truyền thông hoặc cấu trúc
chia sẻ khác.
Ngoài việc vô hiệu hóa các bản sao nổi bật của khối bộ đệm đang được ghi vào,
chúng ta cũng cần xác định vị trí của một mục dữ liệu khi xảy ra lỗi bộ đệm.
Trong bộ đệm ghi qua, rất dễ tìm thấy giá trị gần đây của một mục dữ liệu, vì tất
cả dữ liệu được ghi liên tục vào bộ nhớ, từ đó giá trị gần nhất của một mục dữ liệu
luôn có thể được tìm nạp. Trong một thiết kế có băng thông bộ nhớ đầy đủ để hỗ
trợ lưu lượng ghi từ bộ xử lý, sử dụng ghi qua giúp đơn giản hóa việc thực hiện
kết hợp bộ đệm.
Đối với bộ đệm ghi lại, việc tìm giá trị dữ liệu gần đây nhất khó khăn hơn, vì giá
trị gần đây nhất của mục dữ liệu có thể nằm trong bộ đệm thay vì trong bộ nhớ. Hạnh
phúc thay, bộ nhớ ghi lại có thể sử dụng cùng một sơ đồ rình mò cho cả bỏ lỡ bộ nhớ
cache và để ghi: mỗi bộ xử lý rình mò tất cả các địa chỉ được đặt trên xe buýt. Nếu
bộ xử lý nhận thấy rằng nó có một bản sao bẩn của khối bộ đệm được yêu cầu, nó sẽ
cung cấp khối bộ đệm đó để đáp ứng yêu cầu đọc và khiến quyền truy cập bộ nhớ bị
hủy bỏ. Độ phức tạp tăng lên đến từ việc phải truy xuất khối bộ đệm từ bộ đệm của
bộ xử lý, thường có thể mất nhiều thời gian hơn so với việc lấy nó từ bộ nhớ dùng
chung nếu bộ xử lý nằm trong các chip riêng biệt. Vì bộ nhớ ghi lại tạo ra các yêu
cầu thấp hơn cho băng thông bộ nhớ, chúng có thể hỗ trợ số lượng bộ xử lý nhanh
hơn lớn hơn và là cách tiếp cận được chọn trong hầu hết các bộ xử lý, mặc dù có sự
phức tạp bổ sung của việc duy trì sự gắn kết. Do đó, chúng tôi sẽ kiểm tra việc thực
hiện sự gắn kết với bộ nhớ ghi lại.
Các thẻ bộ đệm thông thường có thể được sử dụng để thực hiện quá trình rình mò
và bit hợp lệ cho mỗi khối giúp cho việc vô hiệu dễ thực hiện. Đọc các lỗi, cho dù
được tạo ra bởi một sự vô hiệu hoặc bởi một số sự kiện khác, cũng rất đơn giản, vì
chúng chỉ đơn giản dựa vào khả năng rình mò. Để viết, chúng tôi muốn biết liệu có
bất kỳ bản sao nào khác của khối được lưu trong bộ nhớ cache hay không, bởi vì nếu

5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480.e11

không có bản sao được lưu trong bộ nhớ cache khác, không cần phải ghi trên xe
buýt trong bộ đệm ghi lại. Không gửi ghi làm giảm cả thời gian ghi và băng
thông cần thiết.
Để theo dõi xem có chia sẻ khối bộ đệm hay không, chúng ta có thể thêm một bit
trạng thái bổ sung được liên kết với mỗi khối bộ đệm, giống như chúng ta có một bit
hợp lệ và một bit bẩn. Bằng cách thêm một chút cho biết liệu khối được chia sẻ,
chúng tôi có thể quyết định liệu một chữ viết có tạo ra hiệu lực hay không. Khi ghi
vào một khối ở trạng thái chia sẻ xảy ra, bộ đệm sẽ tạo ra sự vô hiệu trên xe buýt và
đánh dấu khối là độc quyền Không có sự vô hiệu nào nữa sẽ được gửi bởi bộ xử lý
đó cho khối đó. Bộ xử lý với bản sao duy nhất của khối bộ đệm thường được gọi là.
chủ sở hữu của khối bộ đệm.
Khi một sự vô hiệu được gửi, trạng thái của khối bộ đệm chủ sở hữu được
thay đổi từ chia sẻ thành không chia sẻ (hoặc độc quyền). Nếu một bộ xử lý khác
sau đó yêu cầu khối bộ đệm này, trạng thái phải được chia sẻ lại. Vì bộ đệm rình
mò của chúng tôi cũng thấy bất kỳ lỗi nào, nên nó biết khi nào khối bộ đệm độc
quyền được yêu cầu bởi bộ xử lý khác và trạng thái sẽ được chia sẻ.
Mỗi giao dịch xe buýt phải kiểm tra các thẻ địa chỉ bộ đệm, có khả năng can thiệp
vào truy cập bộ đệm của bộ xử lý. Một cách để giảm nhiễu này là sao chép các thẻ.
Sự can thiệp cũng có thể được giảm trong bộ đệm đa cấp bằng cách hướng các yêu
cầu rình mò đến bộ đệm L2, bộ xử lý chỉ sử dụng khi nó bị lỗi trong bộ đệm L1. Để
sơ đồ này hoạt động, mọi mục trong bộ đệm L1 phải có trong bộ đệm L2, một thuộc
tính được gọi là bao gồm tài sảnNếu snoop bị trúng bộ đệm L2, nó phải phân xử bộ
đệm L1 để cập nhật trạng thái và có thể truy xuất dữ liệu, thường yêu cầu một bộ xử
lý. Đôi khi, nó thậm chí có thể hữu ích để sao chép các thẻ của bộ đệm thứ cấp để
giảm thêm sự tranh chấp giữa bộ xử lý và hoạt động rình mò.

Một giao thức kết hợp bộ đệm ví dụ


Một giao thức kết hợp rình mò thường được thực hiện bằng cách kết hợp một bộ
điều khiển trạng thái hữu hạn trong mỗi nút. Bộ điều khiển này đáp ứng các yêu
cầu từ bộ xử lý và từ bus (hoặc phương tiện phát sóng khác), thay đổi trạng thái
của khối bộ đệm đã chọn, cũng như sử dụng bus để truy cập dữ liệu hoặc làm mất
hiệu lực của nó. Về mặt logic, bạn có thể nghĩ về một bộ điều khiển riêng biệt
được liên kết với từng khối; nghĩa là, các thao tác rình mò hoặc yêu cầu bộ đệm
cho các khối khác nhau có thể tiến hành độc lập. Trong các triển khai thực tế, một
bộ điều khiển duy nhất cho phép nhiều thao tác đến các khối riêng biệt được tiến
hành theo kiểu xen kẽ (nghĩa là một thao tác có thể được bắt đầu trước khi một
thao tác khác được hoàn thành, mặc dù chỉ cho phép một truy cập bộ đệm hoặc
một truy cập bus tại một thời điểm). Ngoài ra, hãy nhớ rằng mặc dù chúng tôi đề
cập đến một chiếc xe buýt trong mô tả sau đây, bất kỳ mạng kết nối nào hỗ trợ
phát sóng cho tất cả các bộ điều khiển kết hợp và bộ nhớ cache liên quan của
chúng đều có thể được sử dụng để thực hiện rình mò.
Giao thức đơn giản mà chúng tôi xem xét có ba trạng thái: không hợp lệ, được
chia sẻ và sửa đổi. Trạng thái được chia sẻ chỉ ra rằng khối có khả năng được chia sẻ,
trong khi trạng thái được sửa đổi cho biết rằng khối đã được cập nhật trong bộ đệm;
lưu ý rằng
480.e12 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

sửa đổi trạng thái ngụ ý rằng khối là độc quyền. Hình e5.12.9 hiển thị các yêu cầu
được tạo bởi mô-đun bộ đệm bộ xử lý trong một nút (trong chín hàng đầu tiên của
bảng) cũng như các yêu cầu đến từ xe buýt (trong năm hàng cuối của bảng). Giao
thức này dành cho bộ đệm ghi lại, nhưng nó có thể dễ dàng thay đổi để hoạt động cho
bộ đệm ghi bằng cách diễn giải lại trạng thái đã sửa đổi dưới dạng trạng thái độc
quyền và cập nhật bộ đệm trên ghi theo kiểu thông thường cho bộ đệm ghi qua . Phần
mở rộng phổ biến nhất của giao thức cơ bản này là việc bổ sung một trạng thái độc
quyền, mô tả một khối không được sửa đổi nhưng chỉ được giữ trong một bộ đệm;
chú thích của Hình e5.12.9 mô tả trạng thái này và bổ sung của nó chi tiết hơn.
Khi một sự vô hiệu hoặc bỏ lỡ ghi được đặt trên xe buýt, bất kỳ bộ xử lý nào
có các bản sao của khối bộ đệm sẽ làm mất hiệu lực của nó. Đối với bộ đệm ghi
qua, dữ liệu cho lỗi ghi luôn có thể được truy xuất từ bộ nhớ. Đối với lỗi ghi
trong bộ đệm ghi lại, nếu khối chỉ độc quyền trong một bộ đệm, bộ đệm đó cũng
ghi lại khối; mặt khác, dữ liệu có thể được đọc từ bộ nhớ.
Hình e5.12.10 hiển thị sơ đồ chuyển tiếp trạng thái hữu hạn cho một bộ đệm
chặn bằng giao thức ghi vô hiệu và bộ đệm ghi lại. Để đơn giản, ba trạng thái của
giao thức được nhân đôi để thể hiện các chuyển đổi dựa trên các yêu cầu của bộ
xử lý (ở bên trái, tương ứng với nửa trên của bảng Hình e5.12.9), trái với chuyển
đổi dựa trên yêu cầu xe buýt (bên phải, mà tương ứng với năm hàng cuối cùng
của bảng trong Hình e5.12.9). Kiểu Boldface được sử dụng để phân biệt các hành
động của xe buýt, trái ngược với các điều kiện mà việc chuyển đổi trạng thái phụ
thuộc vào. Trạng thái trong mỗi nút thể hiện trạng thái của khối bộ đệm đã chọn
được chỉ định bởi bộ xử lý hoặc yêu cầu bus.
Tất cả các trạng thái trong giao thức bộ đệm này sẽ cần thiết trong bộ đệm
không xử lý, trong đó chúng sẽ tương ứng với các trạng thái không hợp lệ, hợp lệ
(và sạch) và bẩn. Hầu hết các thay đổi trạng thái được chỉ định bởi các cung ở
nửa bên tráiHình e5.12.10 sẽ cần thiết trong bộ đệm không xử lý ghi lại, ngoại
trừ việc là vô hiệu trên một lần ghi vào một khối được chia sẻ. Các thay đổi trạng
thái được đại diện bởi các cung ở nửa bên phải Hình e5.12.10 chỉ cần thiết cho
sự gắn kết và hoàn toàn không xuất hiện trong bộ điều khiển bộ đệm bộ xử lý.
Như đã đề cập trước đó, chỉ có một máy trạng thái hữu hạn cho mỗi bộ đệm,
với các kích thích đến từ bộ xử lý đính kèm hoặc từ xe buýt. Hình e5.12.11 cho
thấy cách chuyển đổi nhà nước ở nửa bên phải Hình e5.12.10 được kết hợp với
những người ở nửa bên trái của hình để tạo thành một sơ đồ trạng thái duy nhất
cho mỗi khối bộ đệm.
Để hiểu lý do tại sao giao thức này hoạt động, hãy quan sát rằng bất kỳ khối
bộ đệm hợp lệ nào đều ở trạng thái được chia sẻ trong một hoặc nhiều bộ đệm
hoặc ở trạng thái độc quyền trong chính xác một bộ đệm. Bất kỳ quá trình
chuyển đổi nào sang trạng thái độc quyền (bắt buộc để bộ xử lý ghi vào khối)
đều yêu cầu vô hiệu hoặc ghi bỏ lỡ được đặt trên xe buýt, khiến tất cả các bộ nhớ
cache làm cho khối không hợp lệ. Ngoài ra, nếu một số bộ đệm khác có khối ở
trạng thái độc quyền, bộ đệm đó sẽ tạo ra một bản ghi lại, cung cấp cho khối
chứa địa chỉ mong muốn. Cuối cùng, nếu lỗi đọc xảy ra trên xe buýt đến một
khối ở trạng thái độc quyền, bộ đệm với bản sao độc quyền sẽ thay đổi trạng thái
của nó để chia sẻ.
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480.e13

Nhà nước của


giải quyết Loại
hành động bộ
Yêu cầu Nguồn khối bộ nhớ cache nhớ cache Chức năng và giải thích
Đọc hit bộ xử lý chia sẻ hoặc đánh bình thường Đọc dữ liệu trong bộ nhớ cache.
sửa đổi
Đọc nhớ bộ xử lý không hợp lệ bỏ lỡ bình thường Nơi đọc bỏ lỡ trên xe buýt.
Địa chỉ bỏ lỡ xung đột: địa điểm đọc bỏ lỡ trên xe
Đọc nhớ bộ xử lý chia sẻ thay thế buýt.
Đọc nhớ bộ xử lý sửa đổi thay thế Bỏ lỡ xung đột địa chỉ: khối ghi lại, sau đó đặt bỏ lỡ đọc
trên xe buýt.
Viết hit bộ xử lý sửa đổi đánh bình thường Viết dữ liệu trong bộ đệm.
Viết hit bộ xử lý chia sẻ sự gắn kết Đặt vô hiệu trên xe buýt. Các hoạt động này thường được gọi
nâng cấp hoặc quyền sở hữu bỏ lỡ, vì họ không lấy dữ liệu
nhưng chỉ thay đổi nhà nước.
Viết nhớ bộ xử lý không hợp lệ bỏ lỡ bình thường Nơi viết bỏ lỡ trên xe buýt.
Viết nhớ bộ xử lý chia sẻ thay thế Địa chỉ confl ict miss: địa điểm ghi nhớ trên xe buýt.
Viết nhớ bộ xử lý sửa đổi thay thế Địa chỉ confl ict miss: khối ghi lại, sau đó đặt ghi nhớ
trên xe buýt.
Đọc nhớ xe buýt chia sẻ không có hành động Cho phép bộ nhớ để dịch vụ đọc bỏ lỡ.
Cố gắng chia sẻ dữ liệu: đặt khối bộ nhớ cache trên xe buýt và thay
Đọc nhớ xe buýt modifi ed sự gắn kết đổi
nhà nước để chia sẻ.
Vô hiệu xe buýt chia sẻ sự gắn kết Cố gắng viết khối chia sẻ; làm mất hiệu lực khối.
Viết nhớ xe buýt chia sẻ sự gắn kết Cố gắng viết khối được chia sẻ; làm mất hiệu lực bộ nhớ cache
khối.

Viết nhớ xe buýt modifi ed sự gắn kết Cố gắng viết khối độc quyền ở nơi khác: viết lại
khối bộ đệm và làm cho trạng thái của nó không
hợp lệ.

HÌNH e5.12.9 Cơ chế kết hợp bộ đệm nhận các yêu cầu từ cả bộ xử lý và bus và trả lời các yêu cầu này dựa trên loại
yêu cầu, cho dù nó chạm hoặc bỏ lỡ trong bộ đệm và trạng thái của khối bộ đệm được chỉ định trong yêu cầu. Cột thứ
tư mô tả loại hành động bộ đệm là nhấn hoặc bỏ lỡ bình thường (giống như bộ giải mã bộ đệm sẽ thấy), thay thế (bỏ lỡ bộ đệm thay thế bộ
đệm không xử lý) hoặc kết hợp (bắt buộc để duy trì sự gắn kết bộ đệm); một hành động bình thường hoặc thay thế có thể gây ra một hành
động kết hợp tùy thuộc vào trạng thái của khối trong các bộ đệm khác. Đối với các lần đọc sai, ghi bỏ lỡ hoặc vô hiệu hóa được rình mò từ
xe buýt, chỉ cần một hành động nếu địa chỉ đọc hoặc ghi khớp với một khối trong bộ đệm và khối là hợp lệ. Một số giao thức cũng giới thiệu
trạng thái chỉ định khi một khối chỉ có trong một bộ đệm nhưng chưa được viết. Trạng thái này có thể phát sinh nếu một quyền truy cập ghi
được chia thành hai phần: lấy khối độc quyền trong một bộ đệm và sau đó cập nhật nó; trong một giao thức như vậy, trạng thái không được
sửa đổi độc quyền này là thoáng qua, kết thúc ngay khi việc viết được hoàn thành. Các giao thức khác sử dụng và duy trì trạng thái độc
quyền cho một khối không thay đổi. Trong giao thức rình mò, trạng thái này có thể được nhập khi bộ xử lý đọc một khối không cư trú trong
bất kỳ bộ đệm nào khác. Bởi vì tất cả các truy cập tiếp theo được rình mò, có thể duy trì tính chính xác của trạng thái này. Đặc biệt, nếu một
bộ xử lý khác phát hành lỗi đọc, trạng thái được thay đổi từ độc quyền sang chia sẻ. Ưu điểm của việc thêm trạng thái này là việc ghi tiếp
theo vào một khối ở trạng thái độc quyền bởi cùng một bộ xử lý không cần phải có quyền truy cập bus hoặc tạo ra sự vô hiệu, vì khối được
biết là độc quyền trong bộ đệm này; bộ xử lý chỉ thay đổi trạng thái để sửa đổi. Trạng thái này dễ dàng được thêm vào bằng cách sử dụng bit
mã hóa trạng thái kết hợp thành trạng thái độc quyền và sử dụng bit bẩn để chỉ ra rằng một khối được sửa đổi. Giao thức MESI phổ biến,
được đặt tên theo bốn trạng thái mà nó bao gồm (đã sửa đổi, độc quyền, được chia sẻ và không hợp lệ), sử dụng cấu trúc này. Giao thức
MOESI giới thiệu một phần mở rộng khác: trạng thái sở hữu của thành phố.
480.e14 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

CPU đọc hit


Viết bỏ lỡ cho khối này

Không hợp Vô hiệu cho


CPU đọc Chia sẻ
lệ khối này Chia sẻ
(chỉ đọc) Không
Nơi đọc bỏ lỡ trên xe hợp lệ (chỉ đọc)
buýt
k CPU Đọc nhớ
đọc cho khối này
CPU viết k khối viế ite
-bac t bỏ
t
ch lỡ
CPU chú
ún ng Nơi đọc
onbus

g k; abor
tôi

hủy bỏ bộ nhớ
Khối ghi lại;
Nơi viết

Viết tôi bỏ lỡ tr bỏ lỡ trên xe k truy cập


tr ên

b
bu

b
S ên buýt
ngh khối
i -bac
trê thứ
bỏ lỡ

bỏ lỡ bỏ Viết nhớ
lỡ n c
đọc alidate w bỏ lỡ
cho khối này Viết ký ức
đọc Đọc nhớ
CPU tr CPU
o cho khối này Chuyển đổi trạng thái bộ nhớ cache dựa trên
n
g viết

Địa
v

điểm
Địa Địa
điểm điểm
Chuyển đổi trạng thái bộ nhớ cache
Độc quyền Độc quyền theo yêu cầu từ xe buýt
dựa trên các yêu cầu từ CPU
(đọc / viết) (đọc / viết)

CPU viết bỏ lỡ
Khối bộ nhớ cache ghi lại
Nơi viết bỏ lỡ trên xe buýt

CPU ghi hit


CPU đọc hit

HÌNH e5.12.10 Một giao thức ghi-invalidate, bộ đệm-cocherence cho bộ đệm ghi lại, hiển thị các trạng thái và chuyển
đổi trạng thái cho mỗi khối trong bộ đệm. Các trạng thái bộ đệm được hiển thị trong các vòng tròn, với bất kỳ quyền truy cập nào
được bộ xử lý cho phép mà không cần a chuyển đổi trạng thái thể hiện trong ngoặc đơn dưới tên của tiểu bang. Kích thích gây ra thay đổi
trạng thái được hiển thị trên các cung chuyển tiếp theo kiểu thông thường và mọi hành động xe buýt được tạo ra như một phần của quá trình
chuyển đổi trạng thái được hiển thị trên cung chuyển tiếp in đậm. Các hành động kích thích áp dụng cho một khối trong bộ đệm, không áp
dụng cho một địa chỉ cụ thể trong bộ đệm. Do đó, việc bỏ lỡ đọc cho một khối trong trạng thái được chia sẻ là bỏ lỡ cho khối bộ đệm đó
nhưng đối với một địa chỉ khác. Phía bên trái của sơ đồ cho thấy các chuyển đổi trạng thái dựa trên các hành động của bộ xử lý được liên kết
với bộ đệm này; phía bên phải cho thấy các chuyển đổi dựa trên các hoạt động trên xe buýt. Việc bỏ lỡ đọc ở trạng thái độc quyền hoặc được
chia sẻ và bỏ lỡ ghi ở trạng thái độc quyền xảy ra khi địa chỉ mà bộ xử lý yêu cầu không khớp với địa chỉ trong khối bộ đệm. Bỏ lỡ như vậy
là bỏ lỡ thay thế bộ nhớ cache tiêu chuẩn. Một nỗ lực để viết một khối trong trạng thái chia sẻ tạo ra một sự vô hiệu. Bất cứ khi nào giao
dịch xe buýt xảy ra, tất cả các bộ nhớ cache có chứa khối bộ đệm được chỉ định trong giao dịch xe buýt sẽ thực hiện hành động được chỉ
định bởi nửa bên phải của sơ đồ. Giao thức giả định rằng bộ nhớ cung cấp dữ liệu về lỗi đọc cho một khối sạch trong tất cả các bộ nhớ cache.
Trong thực hiện thực tế, hai bộ sơ đồ trạng thái này được kết hợp. Trong thực tế, có nhiều biến thể tinh tế trên các giao thức vô hiệu, bao
gồm cả việc giới thiệu trạng thái chưa được sửa đổi độc quyền, về việc bộ xử lý hoặc bộ nhớ có cung cấp dữ liệu khi bỏ lỡ hay không.

Các hành động trong màu xám trong Hình e5.12.11, xử lý các lỗi đọc và ghi
trên xe buýt, về cơ bản là thành phần rình mò của giao thức. Một thuộc tính khác
được bảo tồn trong giao thức này và trong hầu hết các giao thức khác là mọi khối
bộ nhớ ở trạng thái chia sẻ luôn được cập nhật trong bộ nhớ, giúp đơn giản hóa
việc thực hiện.
Mặc dù giao thức bộ đệm đơn giản của chúng tôi là chính xác, nhưng nó bỏ qua
một số biến chứng khiến việc triển khai trở nên khó khăn hơn nhiều. Điều quan trọng
nhất trong số này là giao thức giả định rằng các hoạt động là nguyên tửĐây là một
hoạt động có thể được thực hiện theo cách mà không có hoạt động can thiệp nào có
thể xảy ra. Ví dụ, giao thức được mô tả giả định rằng các lỗi ghi có thể được phát
hiện, thu được bus và nhận phản hồi dưới dạng một hành động nguyên tử duy nhất.
Trong thực tế, điều này không đúng. Tương tự, nếu chúng ta sử dụng
5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm 480.e15

CPU
đọc
Viết bỏ lỡ cho khối này đánh

Vô hiệu cho khối này

Không Chia sẻ
hợp lệ CPU đọc
(chỉ đọc)
Nơi đọc bỏ lỡ trên xe
buýt

trê
bu k
vi
Đọc nhớ
bỏ lỡ n -bac khối ết cho điều này
CPU viết k
ê bu
tr xe

ite khối
n ýt

nghi
địa đọc W
thứ
c CPU
Nơi đọc
điểm loc S bỏ lỡ trên xe buýt
Khối ghi lại

k
bỏ
lỡ

dữ ch
liệu; o b bu S
ết

trê
vi

đọc bỏ lỡk n bỏ lỡ tr bu
- bac bỏ lỡ ên
ng ite
hi
điểm

thứ viế
Địa

c tro alidate t bỏ lỡ
CPUW Đọc ng CPU viết

Viết nhớ v

cho khối Địa


Địa
điểm
điểm

Độc quyền
(đọc / viết)
CPU viết bỏ lỡ
CPU ghi hit
CPU đọc hit
Dữ liệu ghi lại
Nơi viết bỏ lỡ trên xe buýt

HÌNH e5.12.11 Sơ đồ trạng thái kết hợp bộ đệm với các chuyển đổi trạng thái được gây ra
bởi bộ xử lý cục bộ được hiển thị bằng màu đen và bởi các hoạt động xe buýt được hiển
thị màu xám. Như trong Hình e5.12.10, các hoạt động trên một quá trình chuyển đổi được thể hiện in
đậm.

một công tắc, như tất cả các bộ xử lý gần đây làm, sau đó thậm chí đọc bỏ lỡ
cũng sẽ không phải là nguyên tử.
Các hành động phi nguyên tử giới thiệu khả năng giao thức có thể bế tắc, có
nghĩa là nó đạt đến trạng thái không thể tiếp tục. Trên trang tiếp theo, chúng tôi
sẽ thảo luận về cách các giao thức này được thực hiện mà không cần xe buýt.
Xây dựng bộ đa xử lý quy mô nhỏ (hai đến bốn bộ xử lý) đã trở nên rất dễ dàng.
Ví dụ, bộ xử lý Intel Nehalem và AMD Opteron cũ hơn được thiết kế để sử dụng
trong bộ đa xử lý bộ đệm và có giao diện bên ngoài hỗ trợ rình mò và cho phép hai
đến bốn bộ vi xử lý được kết nối trực tiếp. Họ cũng có bộ nhớ cache trên chip lớn
hơn để giảm việc sử dụng xe buýt. Trong trường hợp bộ xử lý Opteron, hỗ trợ kết nối
nhiều bộ vi xử lý được tích hợp vào chip xử lý, cũng như các giao diện bộ nhớ.
Trong trường hợp thiết kế Intel, một hệ thống hai bộ vi xử lý có thể được xây dựng
chỉ với một vài chip bên ngoài bổ sung để giao tiếp với hệ thống bộ nhớ và I / O.
Mặc dù những thiết kế này không thể dễ dàng mở rộng đến số lượng vi xử lý lớn hơn,
họ cung cấp một giải pháp cực kỳ hiệu quả cho hai đến bốn bộ vi xử lý.
480.e16 5.12 Tài liệu nâng cao: Triển khai Bộ điều khiển bộ đệm

Ma quỷ là Thực hiện Snoopy Cache Coherence


trong các chi Như chúng tôi đã nói trước đó, sự phức tạp chính trong việc thực sự thực hiện
tiết. giao thức kết hợp rình mò mà chúng tôi đã mô tả là ghi và nâng cấp bỏ lỡ không
Tục ngữ cổ điển. phải là nguyên tử trong bất kỳ bộ nhân gần đây nào. Các bước phát hiện ghi hoặc
nâng cấp bỏ lỡ; giao tiếp với các bộ xử lý và bộ nhớ khác; nhận được giá trị gần
đây nhất cho một lần ghi và đảm bảo rằng mọi vô hiệu đều được xử lý; và cập
nhật bộ đệm không thể được thực hiện như thể chúng đã thực hiện một chu kỳ
duy nhất.
Trong một hệ thống xe buýt đơn giản, các bước này có thể được tạo ra nguyên
tử hiệu quả bằng cách phân xử cho xe buýt trước (trước khi thay đổi trạng thái bộ
đệm) và không giải phóng xe buýt cho đến khi mọi hành động hoàn tất. Làm thế
nào bộ xử lý có thể biết khi tất cả các vô hiệu đã hoàn tất? Trong hầu hết các bộ
xử lý dựa trên xe buýt, một dòng duy nhất được sử dụng để báo hiệu khi tất cả
các vô hiệu cần thiết đã được nhận và đang được xử lý. Theo tín hiệu đó, bộ xử lý
tạo ra lỗi có thể giải phóng xe buýt, biết rằng mọi hành động cần thiết sẽ được
hoàn thành trước khi có bất kỳ hoạt động nào liên quan đến lần bỏ lỡ tiếp theo.
Bằng cách giữ xe buýt độc quyền trong các bước này, bộ xử lý có hiệu quả làm
cho các bước riêng lẻ trở thành nguyên tử.
Trong một hệ thống không có xe buýt, chúng ta phải tìm một số phương pháp
khác để thực hiện các bước trong một nguyên tử bỏ lỡ. Cụ thể, chúng tôi phải
đảm bảo rằng hai bộ xử lý cố gắng viết cùng một khối cùng một lúc, một tình
huống được gọi là a cuộc đua, được sắp xếp nghiêm ngặt: một văn bản được xử
lý trước khi bắt đầu tiếp theo. Không quan trọng ai trong hai người viết trong một
cuộc đua chiến thắng cuộc đua, chỉ là chỉ có một người chiến thắng duy nhất có
hành động gắn kết được hoàn thành trước. Trong một hệ thống rình mò, đảm bảo
rằng một cuộc đua chỉ có một người chiến thắng được thực hiện bằng cách sử
dụng phát sóng cho tất cả các lần bỏ lỡ, cũng như một số thuộc tính cơ bản của
mạng kết nối. Các thuộc tính này, cùng với khả năng khởi động lại việc xử lý bỏ
lỡ của người thua cuộc trong một cuộc đua, là chìa khóa để thực hiện kết hợp bộ
đệm rình mò mà không cần xe buýt.
5.13 Real Stuff: Phân cấp bộ nhớ ARM Cortex-A8 và Intel Core i7 480

Đặc trưng ARM Cortex-A53 Intel Core i7


Địa chỉ ảo 48 bit 48 bit
Địa chỉ vật lý 40 bit 36 bit
Kích thước trang Biến: 4, 16, 64 KiB, 1, 2 MiB, 1 GiB Biến: 4 KiB, 2/4 MiB
Tổ chức TLB 1 TLB để được hướng dẫn và 1 TLB 1 TLB để được hướng dẫn và 1 TLB cho
cho dữ liệu trên mỗi lõi dữ liệu trên mỗi lõi

Cả hai TLB micro L1 đều liên kết đầy đủ , Cả hai TLB L1 đều được đặt bốn chiều
với 10 mục, vòng tròn liên kết, thay thế LRU
thay thế

L2 TLB hợp nhất với 512 mục, 4 chiều L1 I-TLB có 128 mục nhỏ
đặt liên kết trang, bảy mỗi chủ đề cho các trang lớn

TLB bỏ lỡ xử lý trong phần cứng L1 D-TLB có 64 mục nhỏ


trang, 32 cho các trang lớn

L2 TLB là liên kết bốn chiều ,


Thay thế LRU

L2 TLB có 512 mục

TLB bỏ lỡ xử lý trong phần cứng

HÌNH 5.41 Dịch địa chỉ và phần cứng TLB cho ARM Cortex-A53 và Intel Core i7 920. Cả hai
bộ xử lý cung cấp hỗ trợ cho các trang lớn, được sử dụng cho những thứ như hoạt động hệ thống hoặc ánh
xạ một bộ đệm khung. Lược đồ trang lớn tránh sử dụng một số lượng lớn các mục để ánh xạ một đối tượng
luôn có mặt.

phần mềm cần một không gian rộng như vậy và các địa chỉ ảo 48 bit thu nhỏ cả
dấu chân bộ nhớ bảng trang và phần cứng TLB.
Hình 5.42 cho thấy bộ nhớ cache của họ. Mỗi bộ có bộ đệm lệnh L1 và dữ liệu
L1 bộ nhớ cache trên mỗi lõi với các khối 64 byte nhưng được đặt 2 chiều liên
kết cho A53 và 8 chiều cho i7. Bộ nhớ dữ liệu i7 L1 là 32 KiB, nhưng chúng có
thể định cấu hình từ 8 Tiết64 KiB cho A53. Cả hai đều có tổ chức giống hệt 32
KiB, kết hợp bộ 4 chiều, bộ nhớ lệnh L1 (trên mỗi lõi) . Cả hai đều sử dụng bộ
đệm L2 thống nhất (mỗi lõi) với các khối 64 byte, mặc dù kích thước A53 thay
đổi từ 128 KiB đến 1 MiB trong khi Core i7 được cố định ở mức 256 KiB. Vì nó
được sử dụng cho các máy chủ, i7 cũng có bộ đệm L3 hợp nhất 16 bộ có kích
thước là 2 MiB trên mỗi lõi và được chia sẻ bởi tất cả các lõi trên chip.
Core i7 có các tối ưu hóa bổ sung cho phép giảm hình phạt bỏ lỡ. Đầu tiên
trong số này là sự trở lại của từ được yêu cầu đầu tiên khi bỏ lỡ. Nó cũng tiếp tục
thực hiện các hướng dẫn truy cập bộ đệm dữ liệu trong khi bỏ lỡ bộ đệm. Các
bộ nhớ cache không
nhà thiết kế đang cố gắng che giấu độ trễ bỏ lỡ bộ nhớ cache thường sử dụng kỹ
chặn Bộ đệm cho phép
thuật này, được gọi là a bộ nhớ cache không chặn, khi xây dựng bộ xử lý ngoài bộ xử lý tạo tham chiếu
trật tự. Họ thực hiện hai hương vị của nonblocking. Đánh dưới bỏ lỡ cho phép đến bộ đệm trong khi bộ
các bộ đệm bổ sung trong khi bỏ lỡ bỏ lỡ dưới bỏ lỡ cho phép nhiều bộ nhớ đệm đang xử lý lỗi bỏ lỡ
cache nổi bật. Mục đích của người đầu tiên trong hai người này là che giấu một trước đó.
số bỏ lỡ
482 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

độ trễ với công việc khác, trong khi mục tiêu của thứ hai là chồng chéo độ trễ của
hai lần bỏ lỡ khác nhau.

Chồng chéo một phần lớn thời gian bỏ lỡ cho nhiều lần bỏ lỡ nổi bật đòi hỏi
một hệ thống bộ nhớ băng thông cao có khả năng xử lý song song nhiều lần bỏ lỡ.
Trong một thiết bị di động cá nhân, bộ nhớ chỉ có thể lấy

Đặc trưng ARM Cortex-A53 Intel Core i7


Chia hướng dẫn và bộ nhớ cache dữ
Tổ chức bộ nhớ cache L1 liệu Chia hướng dẫn và bộ nhớ cache dữ liệu

Kích thước bộ đệm L1 Cấu hình 8 đến 64 KiB mỗi cái 32 KiB mỗi hướng dẫn / dữ liệu cho mỗi
để được hướng dẫn / dữ liệu cốt lõi
Liên kết bộ nhớ cache L1 Bộ hai chiều (I), hai chiều (D) Tám chiều (I), bộ tám chiều (D)
liên kết liên kết
Thay thế L1 Ngẫu nhiên LRU xấp xỉ

Kích thước khối L1 64 byte 64 byte

Chính sách viết L1 Viết lại, phân bổ biến Viết lại, Không phân bổ ghi
chính sách (mặc định là phân bổ ghi)

Thời gian nhấn L1 (sử


dụng tải) Hai chu kỳ đồng hồ Bốn chu kỳ đồng hồ, đường ống

Thống nhất (hướng dẫn và dữ liệu) trên mỗi


Tổ chức bộ nhớ cache L2 Thống nhất (hướng dẫn và dữ liệu) lõi

Kích thước bộ đệm L2 128 KiB đến 2 MiB 256 KiB (0,25 MiB)

Liên kết bộ đệm L2 8 chiều đặt liên kết 4 chiều đặt liên kết

Thay thế L2 LRU xấp xỉ LRU xấp xỉ

Kích thước khối L2 64 byte 64 byte

Chính sách viết L2 Viết lại, phân bổ Viết lại, phân bổ

L2 đạt thời gian 12 chu kỳ đồng hồ 12 chu kỳ đồng hồ

Bộ nhớ cache L3 Thống nhất (hướng dẫn và dữ liệu)


tổ chức -

Kích thước bộ đệm L3 - 2 MiB / lõi được chia sẻ

Bộ nhớ cache L3 16 cách thiết lập liên kết


-
liên kết
Thay thế L3 - LRU xấp xỉ

Kích thước khối L3 - 64 byte

Chính sách viết L3 - Viết lại, phân bổ

L3 đạt thời gian - 44 chu kỳ đồng hồ

HÌNH 5.42 Bộ nhớ cache trong ARM Cortex-A53 và Intel Core i7 6700.
5.7 Real Stuff: Phân cấp bộ nhớ ARM Cortex-A8 và Intel Core i7 483

lợi thế hạn chế của khả năng này, nhưng các máy chủ và bộ đa xử lý lớn thường
có hệ thống bộ nhớ có khả năng xử lý song song nhiều hơn một lần bỏ lỡ.
Core i7 có cơ chế tìm nạp trước để truy cập dữ liệu. Nó xem xét một mẫu dữ liệu bị bỏ
lỡ và sử dụng thông tin này để cố gắng dự đoán địa chỉ tiếp theo để tìm nạp dữ liệu trước
khi xảy ra lỗi. Các kỹ thuật như vậy thường hoạt động tốt nhất khi truy cập các mảng
trong các vòng lặp. Trong hầu hết các trường hợp, dòng được cài sẵn chỉ đơn giản là khối
tiếp theo trong bộ đệm.
Hệ thống phân cấp bộ nhớ tinh vi của các chip này và phần lớn khuôn dành
riêng cho bộ nhớ cache và TLB cho thấy nỗ lực thiết kế quan trọng dành cho việc
cố gắng thu hẹp khoảng cách giữa thời gian chu kỳ bộ xử lý và độ trễ bộ nhớ.

Hiệu suất của các hệ thống phân cấp bộ nhớ


Cortex-A53 và Core i7
Hệ thống phân cấp bộ nhớ của Cortex-A8 được đo bằng 32 bộ nhớ chính KiB và
bộ đệm 1 MiB L2 chạy các điểm chuẩn của SpecInt2006. Tỷ lệ bỏ lỡ bộ nhớ
cache lệnh cho SpecInt2006 rất nhỏ ngay cả đối với L1: gần bằng 0 đối với hầu
hết và dưới 1% đối với tất cả chúng. Tỷ lệ thấp này có thể là kết quả của tính chất
tính toán chuyên sâu của các chương trình SPECCPU và bộ đệm kết hợp hai
chiều giúp loại bỏ hầu hết các lỗi xung đột .
Hình 5.43 hiển thị kết quả bộ đệm dữ liệu, có L1 và L2 đáng kể bỏ lỡ tỷ lệ. Tỷ lệ
L1 thay đổi theo hệ số 75, từ 0,5% đến 37,2% với trung vị

40% .2%

L1 L2 37
35%

30%

25%
tỷ lệ

20%

15% %
.8
0,0% 10 0,0%
10% 9 9
.2%
5
5% 0,0% 0,0% 0,0%
. . . 3 0,0% 3 . 3
1% 1%
.
0,0% 2%
.
2 0,0% . 2%

1
2%. 1
2%. 5% . 3%.
1 1 . 5% . 1 5% 1

0% 0 0 0 0 0 0 0 0 0
r f h k k c r

sjeng bzip2 gc asta mcf


yêu
hmme h264re libquantum perlbenc tinh xalancbm omnetpp

HÌNH 5.43 Tốc độ bỏ lỡ dữ liệu cho ARM với 32 KiB L1 và tốc độ bỏ lỡ dữ liệu toàn cầu cho 1 MiB L2 bằng cách sử dụng
SpecInt2006 điểm chuẩn bị ảnh hưởng đáng kể bởi các ứng dụng. Các ứng dụng có dấu chân bộ nhớ lớn hơn có xu hướng có tỷ lệ
bỏ lỡ cao hơn ở cả L1 và L2. Lưu ý rằng tỷ lệ L2 là tỷ lệ bỏ lỡ toàn cầu, đếm tất cả các tham chiếu bao gồm cả các tham chiếu
trong L1. Điểm chuẩn mcf được gọi là buster bộ đệm.
484 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

tỷ lệ bỏ lỡ 2,4%. Tỷ lệ bỏ lỡ L2 toàn cầu thay đổi theo hệ số 180, từ 0,05% đến


9,0% với trung bình là 0,3%. Điểm chuẩn MCF, được gọi là buster bộ đệm, đặt
giới hạn trên và ảnh hưởng đáng kể đến giá trị trung bình. Hãy nhớ rằng tỷ lệ bỏ
lỡ toàn cầu L2 thấp hơn đáng kể so với tỷ lệ bỏ lỡ cục bộ L2; ví dụ, tỷ lệ bỏ lỡ
độc lập L2 trung bình là 15,1% so với tỷ lệ bỏ lỡ toàn cầu là 0,3%.
Sử dụng những hình phạt bỏ lỡ trong Hình 2.19, Hình 5.44 hiển thị hình phạt
trung bình cho mỗi lần truy cập dữ liệu. Mặc dù tỷ lệ bỏ lỡ L1 cao hơn khoảng
bảy lần so với tỷ lệ bỏ lỡ L2, hình phạt L2 cao gấp 9,5 lần, dẫn đến bỏ lỡ L2 hơi
thống trị cho các điểm chuẩn làm căng thẳng hệ thống bộ nhớ.
Đơn vị tìm nạp lệnh i7, cố gắng tìm nạp 16 byte mỗi chu kỳ, điều này làm
phức tạp việc so sánh tỷ lệ bỏ lỡ bộ đệm lệnh vì nhiều hướng dẫn được tìm nạp
mỗi chu kỳ (trung bình khoảng 4,5). Bộ đệm hướng dẫn kết hợp 32 KiB, tám
chiều dẫn đến tỷ lệ bỏ lỡ hướng dẫn rất thấp cho các chương trình Specint2006;
tỷ lệ bỏ lỡ hướng dẫn thường dưới 1%. Tần suất mà đơn vị tìm nạp lệnh bị đình
trệ chờ đợi các lỗi I-cache tương tự nhỏ.
Hình 5,45 và 5,46 cho thấy tỷ lệ bỏ lỡ của bộ nhớ L1 và L2 cho truy cập nhu
cầu, trong cả hai trường hợp so với số lượng tài liệu tham khảo L1 (đọc và viết).
Bởi vì chi phí cho việc bỏ lỡ bộ nhớ là hơn 100, L3 rõ ràng là rất quan trọng. Tỷ
lệ bỏ lỡ dữ liệu L3 trung bình là 0,5%, vẫn còn đáng kể nhưng chưa đến một
phần ba tỷ lệ bỏ lỡ nhu cầu L2 và một phần mười tỷ lệ bỏ lỡ nhu cầu L1.

.3

12,5 12

L1 L2
10

7.5

5 .7
.9 3
2
2.5 .0 9
5 5 số 8 . .8
0,05 .02 0,05 .02 3 1 0,04 0,02 1 0,05 2 . .3 .2 1. .2 .3 0 0 0
.
. .
.
0 0

0 0 0 0 0 0 0 0 0 0 0 0 00 00
r h k k c r

sjeng bzip2 gc asta mcf


yêu
hmme h264ref libquantum perlbenc tinh xalancbm omnetpp

HÌNH 5.44 Hình phạt truy cập bộ nhớ trung bình trên mỗi tham chiếu bộ nhớ dữ liệu đến từ L1 và L2 được
hiển thị cho bộ xử lý A53 khi chạy SpecInt2006. Mặc dù tỷ lệ bỏ lỡ cho L1 cao hơn đáng kể, nhưng L2 bỏ lỡ hình
phạt, cao hơn năm lần, có nghĩa là bỏ lỡ L2 có thể đóng góp đáng kể.
45%
L1 bỏ lỡ nhu cầu chỉ đọc
40%

35%

30%

25%
tỷ
lệ

22%

20%

15%
11%
10%
7%

5% 3% 2% 4% 3%
1% 1% 1% 1% 1%
0%
r c k r h k
gc mcf
asta bzip2 gobm h264ref hmme sjeng
omnetpp

libquantum perlbenc xalancbm


HÌNH 5.45 Tốc độ bỏ lỡ bộ đệm dữ liệu L1 cho các điểm chuẩn của Specint2006 được
hiển thị theo hai cách liên quan đến nhu cầu L1 đọc để truy cập nhu cầu (không bao gồm
tìm nạp trước). Những dữ liệu này, giống như phần còn lại trong phần này, được thu thập bởi Giáo sư
Lu Peng và nghiên cứu sinh Qun Liu, cả hai trường Đại học bang Louisiana (xem Peng et al., 2008).
(Chuyển thể từ Hennessy JL, Patterson DA. Kiến trúc máy tính: Một cách tiếp cận định lượng, phiên bản
thứ 6. Cambridge, MA: Elsevier Inc., 2019.)

22%
20% Tỷ lệ bỏ lỡ nhu cầu L2
18%
16%
14%
12%
Tỷ lệ bỏ lỡ

12%
10%
L2

8%
6%
4%
4%
2% 2% 1%
1% 0% 0% 0% 0% 0% 0% 1%
0%
r c k r h k
gc mcf
omnetpp
asta bzip2 gobm h264ref hmme sjeng

libquantum perlbenc xalancbm


HÌNH 5.46 Tỷ lệ bỏ lỡ L2 được hiển thị liên quan đến các tham chiếu L1 đến L1 (Chuyển thể
từ Hennessy JL, Patterson DA. Kiến trúc máy tính: Một cách tiếp cận định lượng, phiên bản thứ 6.
Cambridge, MA: Elsevier Inc., 2019.)
486 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Real Stuff: Phần còn lại của RISC-


5.14 V
Hướng dẫn hệ thống và đặc biệt

Hình 5.47 liệt kê 13 hướng dẫn RISC-V còn lại trong mục đích đặc biệt và thể
loại hệ thống.
Các hướng dẫn hàng rào cung cấp các rào cản đồng bộ hóa cho các hướng dẫn
(hàng rào.i), dữ liệu (hàng rào) và dịch địa chỉ (sfence.vma). Đầu tiên, hàng rào.i,
thông báo cho bộ xử lý rằng phần mềm đã sửa đổi bộ nhớ lệnh , để nó có thể đảm
bảo rằng tìm nạp hướng dẫn sẽ phản ánh các hướng dẫn được cập nhật. Thứ hai,
hàng rào, ảnh hưởng đến thứ tự truy cập bộ nhớ dữ liệu để xử lý đa xử lý và I / O.
Thứ ba, sfence.vma, thông báo cho bộ xử lý rằng phần mềm đã sửa đổi các bảng
trang, để nó có thể đảm bảo rằng các bản dịch địa chỉ sẽ phản ánh các bản cập
nhật.

Sáu kiểm soát và đăng ký trạng thái (CSR) hướng dẫn truy cập di chuyển dữ
liệu giữa các thanh ghi đa năng và CSR. Các csrrwi hướng dẫn (CSR đọc / ghi
ngay lập tức) sao chép CSR vào một thanh ghi số nguyên, sau đó ghi đè CSR
ngay lập tức. csrrsi (CSR đọc / đặt ngay lập tức) sao chép CSR vào một thanh ghi
số nguyên và ghi đè CSR với bitwise OR của CSR và ngay lập tức. csrrci (CSR
đọc / xóa) là như thế csrrsi, nhưng xóa bit thay vì đặt chúng. Các csrrw, csrrs, và
csrrc hướng dẫn sử dụng một toán hạng đăng ký thay vì ngay lập tức , nhưng nếu
không thì làm điều tương tự.

Kiểu Mnemonic Tên


FENT.I Hàng rào hướng dẫn
Mem. Đặt hàng FENT Hàng rào
SFENCE.VMA Hàng rào dịch địa chỉ
CSRRWI CSR Đọc / Viết ngay lập tức
CSRRSI CSR Đọc / Đặt ngay
CSRRCI CSR Đọc / Xóa ngay lập tức
Truy cập CSR
CSRRW CSR Đọc / Viết
CSRRS Đọc / Đặt CSR
CSRRC CSR Đọc / Xóa
ECALL Cuộc gọi môi trường
EBREAK Điểm dừng môi trường
Hệ thống
SRET Giám sát viên ngoại lệ trở lại
WFI Đợi gián đoạn

HÌNH 5.47 Danh sách các hướng dẫn ngôn ngữ lắp ráp cho các hệ thống và hoạt động
đặc biệt trong tập lệnh RISC-V đầy đủ.
5.13 Real Stuff: Phần còn lại của Hệ thống RISC-V và Hướng dẫn đặc biệt 487

1 #include <x86intrin.h>
2 #define UNROLL (4)
3 #define BLOCKSIZE 32
4 void do_block (int n , int si, int sj, int sk ,
5 gấp đôi * A, gấp đôi * B, gấp đôi * C)
6 {
7 cho (int i = si; tôi < si + BLOCKSIZE; i + = UNROLL * 8)
8 cho (int j = sj; j < sj + BLOCKSIZE; j ++) {
9 __m512d c [UNROLL];
10 cho (int r = 0; r <UNROLL; r ++)
11 c [r] = _mm512_load_pd (C + i + r * 8 + j * n); // [UNROLL];
12
13 cho (int k = trượt; k < sk + BLOCKSIZE; k ++)
14 {
15 __m512d bb = _mm512_broadcastsd_pd (_mm_load_sd (B + j * n + k));
16 cho (int r = 0; r <UNROLL; r ++)
17 c [r] = _mm512_fmadd_pd (_mm512_load_pd (A + n * k + r * 8 + i), bb, c [r]);
18 }
19
20 cho (int r = 0; r <UNROLL; r ++)
21 _mm512_store_pd (C + i + r * 8 + j * n, c [r]);
22 }
23 }
24
25 void dgemm (int n, double * A, double * B, double * C)
26 {
27 cho (int sj = 0; sj <n; sj + = BLOCKSIZE)
28 cho (int si = 0; si <n; si + = BLOCKSIZE)
29 cho (int sk = 0; sk <n; sk + = BLOCKSIZE)
30 do_block (n, si, sj, sk, A, B, C);
31 }

HÌNH 5.48 Tối ưu hóa phiên bản C của DGEMM từ Hình 4.78 sử dụng chặn bộ nhớ cache. Những thay đổi này là những thay đổi
tương tự được tìm thấy
trong Hình 5.21 Ngôn ngữ lắp ráp được sản xuất bởi trình biên dịch cho. do_block chức năng gần giống với Hình 4.79 Một lần nữa, không
có chi phí để gọi. do_block bởi vì trình biên dịch nội tuyến cuộc gọi hàm.

Hai hướng dẫn chỉ có mục đích là tạo ra ngoại lệ : ecall tạo một ngoại lệ cuộc
gọi môi trường để gọi HĐH và phá vỡ tạo một ngoại lệ điểm dừng để gọi trình gỡ
lỗi. Hướng dẫn trả lại ngoại lệ của người giám sát (đau khổ), đủ tự nhiên, cho
phép chương trình trở về từ một trình xử lý ngoại lệ.

Cuối cùng, hướng dẫn chờ đợi cho gián đoạn , wfi, thông báo cho bộ xử lý
rằng nó có thể vào trạng thái không hoạt động cho đến khi xảy ra ngắt.
488 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Nhanh hơn: Chặn bộ nhớ cache và Ma


5.15 trận
Nhân lên

Bước tiếp theo của chúng tôi trong câu chuyện tiếp tục cải thiện hiệu suất của
DGEMM bằng cách điều chỉnh nó vào phần cứng cơ bản là thêm chặn bộ đệm
vào song song và tối ưu hóa mức độ song song của từ con Chương 3 và 4.Hình
5.48 hiển thị phiên bản bị chặn của DGEMM từ Hình 4.78Những thay đổi. giống
như đã được thực hiện trước đó khi đi từ DGEMM không được tối ưu hóa Hình
3.22 để chặn DGEMM trong Hình 5.21Lần này chúng tôi lấy phiên bản chưa
được kiểm soát. của DGEMM từ Chương 4 và gọi nó nhiều lần trên các tiểu thư A,
B, và C Thật vậy, dòng 28-31 và dòng 7 trận8 trong. Hình 5.48 dòng gương 14
trận20 và dòng 5 trận6 in Hình 5.21, ngoại trừ việc tăng vòng lặp for trong dòng 7
theo số lượng chưa được kiểm soát.
Lợi ích của việc chặn tăng theo kích thước của ma trận. Vì số lượng phép toán
dấu phẩy động trên mỗi phần tử ma trận là cùng một kích thước của ma trận,
chúng ta có thể đo lường hiệu suất một cách công bằng số lượng phép toán dấu
phẩy động được tính mỗi giây. Hình 5,49 so sánh hiệu suất trong GFLOPS / giây
của phiên bản C gốc với

64x 64 320x320 960x960 4096x4096


35 32
30
30 27 28

25 22
22
GFLOPS / giây

20 17

15
10.9
10 7.5
6.7
5 2.0
0,007,007 .007 .007 1.51.50,6 1.4 1.9
0 0 0 0 0
Con + Chưa được
trăn C + AVX kiểm soát + Bị chặn

HÌNH 5,49 Hiệu suất của nhiều phiên bản DGEMM khi thay đổi kích thước ma trận được
đo bằng tỷ thao tác điểm nổi mỗi giây (GFLOPS / giây). Mã được tối ưu hóa hoàn toàn là Nhanh
hơn 14 lần32 so với phiên bản C Chương 2Python chạy ở 0,007 GFLOPS / giây cho tất cả các kích thước
ma trận. Phần cứng Intel i7 suy đoán bằng cách tìm nạp từ bộ nhớ cache L3 đến L1 và L2, đó là lý do tại
sao lợi ích của việc chặn không cao như trên một số bộ vi xử lý.
5.16 Ngụy biện và Cạm bẫy 489

tối ưu hóa cho song song từ con, song song hướng dẫn và bộ nhớ cache. Chặn cải
thiện hiệu suất so với mã AVX chưa được kiểm soát theo các yếu tố từ 1,5 đến
1,7 đối với ma trận cỡ trung gian và hệ số 10 cho ma trận lớn nhất. Ma trận nhỏ
nhất vừa với bộ đệm L1, do đó việc chặn hầu như không có sự khác biệt. Khi
chúng tôi so sánh mã chưa được tối ưu hóa với mã cho cả ba tối ưu hóa, các cải
tiến hiệu suất là các yếu tố từ 14 đến 41, với sự cải thiện lớn nhất cho ma trận lớn
nhất.

5.16 Ngụy biện và Cạm bẫy

Là một trong những khía cạnh định lượng tự nhiên nhất của kiến trúc máy tính,
hệ thống phân cấp bộ nhớ dường như ít bị tổn thương hơn trước những ngụy biện
và cạm bẫy. Không chỉ có nhiều ngụy biện được nhân giống và những cạm bẫy
gặp phải, mà một số đã dẫn đến kết quả tiêu cực lớn. Chúng tôi bắt đầu với một
cạm bẫy thường bẫy học sinh trong các bài tập và bài kiểm tra.
Pitfall: Bỏ qua hành vi hệ thống bộ nhớ khi viết chương trình hoặc khi tạo mã
trong trình biên dịch.
Điều này có thể được viết lại dưới dạng ngụy biện: Các lập trình viên có thể bỏ
qua hệ thống phân cấp bộ nhớ trong mã viết.Đánh giá sắp xếp trong Hình 5.19 và
chặn bộ nhớ cache trong Mục 5.14 chứng minh rằng các lập trình viên có thể dễ
dàng tăng gấp đôi hiệu suất nếu họ tính đến hành vi của hệ thống bộ nhớ vào thiết
kế các thuật toán của họ.
Pitfall: Quên tài khoản cho địa chỉ byte hoặc kích thước khối bộ đệm trong
việc mô phỏng bộ đệm.
Khi mô phỏng bộ đệm (bằng tay hoặc bằng máy tính), chúng ta cần đảm bảo
rằng chúng ta tính đến hiệu ứng của địa chỉ byte và khối đa từ trong việc xác
định bộ đệm nào chặn bản đồ địa chỉ nhất định. Ví dụ: nếu chúng ta có bộ đệm
được ánh xạ trực tiếp 32 byte với kích thước khối là 4 byte, địa chỉ byte 36 ánh
xạ vào khối 1 của bộ đệm, vì địa chỉ byte 36 là địa chỉ khối 9 và (9 modulo 8) =
1 . Mặt khác, nếu địa chỉ 36 là một địa chỉ từ, thì nó sẽ ánh xạ vào khối (36 mod
8) = 4. Hãy chắc chắn rằng vấn đề nêu rõ cơ sở của địa chỉ.
Trong thời trang như, chúng ta phải tính đến kích thước khối. Giả sử chúng ta
có bộ đệm với 256 byte và kích thước khối 32 byte. Vào khối nào làm địa chỉ
byte 300 rơi? Nếu chúng ta chia địa chỉ 300 thành các trường, chúng ta có thể
thấy câu trả lời :
số
31 30 29 ... ... ... 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 ......... 0 0 0 1 0 0 1 0 1 1 0 0
Khối bộ nhớ
cache Khối bù
số
Địa chỉ khối
490 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Byte địa chỉ 300 là địa chỉ khối


300
=9

32
Số lượng khối trong bộ đệm là
256
=số 8
32
Khối số 9 rơi vào khối số bộ đệm (9 modulo 8) = 1.
Lỗi này bắt được nhiều người, bao gồm các tác giả (trong các bản nháp trước
đó) và những người hướng dẫn quên đi liệu họ có định sử dụng địa chỉ trong hai
từ, từ, byte hoặc số khối hay không. Hãy nhớ cạm bẫy này khi bạn giải quyết các
bài tập.
Pitfall: Có ít liên kết thiết lập cho bộ đệm được chia sẻ hơn số lượng lõi hoặc
luồng (Chương 6) chia sẻ bộ đệm đó.
Không cần chăm sóc thêm, a song song chương trình chạy trên 2n bộ xử lý hoặc
luồng có thể dễ dàng phân bổ cấu trúc dữ liệu cho các địa chỉ sẽ ánh xạ tới cùng
một bộ bộ đệm L2 được chia sẻ. Nếu bộ đệm ít nhất là 2n-way liên kết, sau đó
những xung đột tình cờ được ẩn bởi phần cứng từ chương trình. Nếu không, các
lập trình viên có thể phải đối mặt với các lỗi hiệu suất bí ẩn rõ ràng do xung đột
L2 bỏ lỡ khi di chuyển từ thiết kế 16 lõi sang thiết kế 32 lõi nếu cả hai đều sử
dụng bộ nhớ cache L2 kết hợp 16 chiều.
Pitfall: Sử dụng thời gian truy cập bộ nhớ trung bình để đánh giá hệ thống
phân cấp bộ nhớ của bộ xử lý ngoài đơn đặt hàng.
Nếu bộ xử lý bị đình trệ trong khi bỏ lỡ bộ nhớ cache, thì bạn có thể tính riêng
thời gian cài đặt bộ nhớ và thời gian thực thi bộ xử lý, và do đó đánh giá hệ
thống phân cấp bộ nhớ một cách độc lập bằng thời gian truy cập bộ nhớ trung
bình (xem trang 413).
Nếu bộ xử lý tiếp tục thực hiện các hướng dẫn và thậm chí có thể duy trì nhiều
bộ nhớ cache hơn trong khi bỏ lỡ bộ đệm, thì đánh giá chính xác duy nhất về hệ
thống phân cấp bộ nhớ là mô phỏng bộ xử lý ngoài thứ tự cùng với hệ thống
phân cấp bộ nhớ.
Pitfall: Mở rộng không gian địa chỉ bằng cách thêm các phân đoạn trên
không gian địa chỉ không được phân đoạn.
Trong những năm 1970, nhiều chương trình đã phát triển lớn đến mức không
phải tất cả mã và dữ liệu đều có thể được xử lý chỉ bằng một địa chỉ 16 bit. Các
máy tính sau đó đã được sửa đổi để cung cấp địa chỉ 32 bit, thông qua không
gian địa chỉ 32 bit không được phân đoạn (còn được gọi là a không gian địa chỉ
phẳng) hoặc bằng cách thêm 16 bit của phân đoạn vào 16 bit hiện có
5.16 Ngụy biện và Cạm bẫy 491

Địa chỉ. Từ quan điểm tiếp thị, việc thêm các phân đoạn có thể nhìn thấy lập trình
viên và điều đó buộc lập trình viên và trình biên dịch phải phân tách các chương
trình thành các phân đoạn có thể giải quyết vấn đề giải quyết. Thật không may,
bất cứ khi nào một ngôn ngữ lập trình muốn một địa chỉ lớn hơn một phân đoạn,
chẳng hạn như các chỉ số cho các mảng lớn, con trỏ không bị hạn chế hoặc các
tham số tham chiếu. Ngoài ra, việc thêm các phân đoạn có thể biến mọi địa chỉ
thành hai từ, một cho số phân đoạn và một cho phần bù bù phân đoạn gây ra vấn
đề trong việc sử dụng địa chỉ trong sổ đăng ký.
Fallacy: Tỷ lệ lỗi đĩa trong trường phù hợp với thông số kỹ thuật của họ.
Hai nghiên cứu đã đánh giá các bộ sưu tập đĩa lớn để kiểm tra mối quan hệ giữa
các kết quả trong lĩnh vực này so với thông số kỹ thuật. Một nghiên cứu có gần
100.000 đĩa đã trích dẫn MTTF từ 1.000.000 đến 1.500.000 giờ, hoặc AFR từ 0,6%
đến 0,8%. Họ thấy AFR từ 2% đến 4% là phổ biến, thường cao gấp ba đến năm
lần so với tỷ lệ quy định [Schroeder và Gibson, 2007]. Một nghiên cứu thứ hai
với hơn 100.000 đĩa tại Google, trong đó có AFR được trích dẫn khoảng 1,5%, tỷ
lệ thất bại là 1,7% đối với các ổ đĩa trong năm đầu tiên của họ tăng lên 8,6% đối
với các ổ đĩa trong năm thứ ba, hoặc khoảng năm đến sáu lần tỷ lệ khai báo
[Pinheiro, Weber, và Barroso, 2007].
Fallacy: Hệ điều hành là nơi tốt nhất để lên lịch truy cập đĩa.
Như đã đề cập trong Mục 5.2, giao diện đĩa cấp cao hơn cung cấp địa chỉ khối
logic cho hệ điều hành máy chủ. Với sự trừu tượng cấp cao này, hệ điều hành tốt
nhất có thể làm để cố gắng giúp hiệu suất là sắp xếp các địa chỉ khối logic theo
thứ tự tăng dần. Tuy nhiên, vì đĩa biết ánh xạ thực tế của các địa chỉ logic vào
hình dạng vật lý của các cung, rãnh và bề mặt, nên nó có thể làm giảm độ quay
và tìm độ trễ bằng cách sắp xếp lại.
Ví dụ: giả sử khối lượng công việc là bốn lần đọc [Anderson, 2003] :

Hoạt động Bắt đầu LBA Chiều dài


Đọc 724 số 8
Đọc 100 16
Đọc 9987 1
Đọc 26 128

Máy chủ có thể sắp xếp lại bốn lần đọc thành thứ tự khối logic :

Hoạt động Bắt đầu LBA Chiều dài


Đọc 26 128
Đọc 100 16
Đọc 724 số 8
Đọc 9987 1
492 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

100

724
26
Hàng đợi theo thứ tự máy chủ
Hàng đợi theo thứ tự ổ đĩa

9987

HÌNH 5.50 Ví dụ hiển thị HĐH so với truy cập lịch trình đĩa, được gắn nhãn theo thứ tự
máy chủ so với thứ tự ổ đĩa. Cái trước mất ba vòng quay để hoàn thành bốn lần đọc, trong khi cái sau
hoàn thành chúng chỉ trong ba phần tư của một cuộc cách mạng. Từ Anderson [2003].

Tùy thuộc vào vị trí tương đối của dữ liệu trên đĩa, việc sắp xếp lại có thể làm cho
nó tồi tệ hơn, như Hình 5.50 chương trình. Các đầu đọc được lên lịch đĩa hoàn thành
trong ba phần tư của một cuộc cách mạng đĩa, nhưng các đầu đọc theo lịch trình hệ
điều hành mất ba vòng quay.
Pitfall: Triển khai màn hình máy ảo trên kiến trúc tập lệnh được thiết kế để có
thể ảo hóa.
Nhiều kiến trúc sư trong những năm 1970 và 1980 weren cẩn thận để đảm bảo
rằng tất cả các hướng dẫn đọc hoặc viết thông tin liên quan đến thông tin tài
nguyên phần cứng đều được đặc quyền. Thái độ laissez-faire này gây ra vấn đề
cho VMM cho tất cả các kiến trúc này, bao gồm cả x86, mà chúng tôi sử dụng ở
đây làm ví dụ.
Hình 5.51 mô tả 18 hướng dẫn gây ra vấn đề cho ảo hóa [Robin và Irvine,
2000]. Hai lớp rộng là hướng dẫn mà
■ Đọc các thanh ghi điều khiển trong chế độ người dùng cho thấy hệ điều
hành khách đang chạy trong một máy ảo (như POPF, đã đề cập trước đó)
■ Kiểm tra bảo vệ theo yêu cầu của kiến trúc được phân đoạn nhưng giả định
rằng hệ điều hành đang chạy ở mức đặc quyền cao nhất
Để đơn giản hóa việc triển khai VMM trên x86, cả AMD và Intel đều đề xuất
các phần mở rộng cho kiến trúc thông qua chế độ mới. Intel Intel VT-x cung cấp
chế độ thực thi mới để chạy VM, định nghĩa được lưu trữ về trạng thái VM,
hướng dẫn trao đổi VM nhanh chóng và một bộ tham số lớn để chọn trường hợp
phải gọi VMM. Tổng cộng, VT-x thêm 11 hướng dẫn mới cho x86. AMD từ
Pacifica đưa ra các đề xuất tương tự.
5.16 Ngụy biện và Cạm bẫy 493

Vấn đề thể loại Vấn đề hướng dẫn x86

Truy cập các thanh ghi nhạy cảm mà không


có Lưu trữ đăng ký bảng mô tả toàn cầu (SGDT)
bẫy khi chạy trong chế độ người dùng Lưu trữ thanh ghi bảng mô tả cục bộ (SLDT)
Lưu trữ thanh ghi bảng mô tả ngắt (SIDT)
Lưu trữ từ trạng thái máy (SMSW)
Cờ đẩy (PUSHF, PUSHFD)
Cờ nhạc pop (POPF, POPFD)
Khi truy cập bộ nhớ ảo Tải quyền truy cập từ mô tả phân khúc (LAR)
cơ chế trong chế độ người dùng, hướng
dẫn Giới hạn phân đoạn tải từ mô tả phân đoạn (LSL)
thất bại trong việc kiểm tra bảo vệ x86 Xác minh nếu mô tả phân đoạn có thể đọc được (VERR)
Xác minh nếu mô tả phân đoạn có thể ghi (VERW)
Pop to đăng ký phân khúc (POP CS, POP SS , . . .)
Đẩy đăng ký phân đoạn (PUSH CS, PUSH SS , . . .)
Gọi xa đến cấp độ đặc quyền khác nhau (CALL)
Trở về mức đặc quyền khác nhau (RET)
Nhảy xa đến cấp độ đặc quyền khác nhau (JMP)
Phần mềm ngắt (INT)
Lưu trữ thanh ghi bộ chọn phân đoạn (STR)
Di chuyển đến / từ các thanh ghi phân đoạn (MOVE)

HÌNH 5.51 Tóm tắt 18 x86 hướng dẫn gây ra sự cố cho ảo hóa [Robin và Irvine, 2000]. Năm hướng
dẫn đầu tiên trong nhóm trên cùng cho phép một chương trình ở chế độ người dùng đọc một thanh ghi điều khiển,
chẳng hạn như thanh ghi bảng mô tả, mà không gây ra bẫy. Hướng dẫn cờ pop sửa đổi một thanh ghi điều khiển
với thông tin nhạy cảm nhưng không thành công khi ở chế độ người dùng. Việc kiểm tra bảo vệ kiến trúc được
phân đoạn của x86 là sự sụp đổ của nhóm dưới cùng, vì mỗi hướng dẫn này kiểm tra mức đặc quyền ngầm như
một phần của việc thực hiện lệnh khi đọc thanh ghi điều khiển. Việc kiểm tra giả định rằng HĐH phải ở mức đặc
quyền cao nhất, điều này không xảy ra đối với máy ảo của khách. Chỉ thanh ghi Move to phân đoạn mới cố gắng
sửa đổi trạng thái điều khiển và kiểm tra bảo vệ cũng làm cho nó hoạt động.

Một cách khác để sửa đổi phần cứng là tạo ra những thay đổi nhỏ cho hệ điều hành để
tránh sử dụng những mảnh rắc rối của kiến trúc. Kỹ thuật này được gọi
paravirtualizationvà Xen VMM nguồn mở là một ví dụ điển hình. Xen VMM cung cấp
một hệ điều hành khách với tính trừu tượng của máy ảo chỉ sử dụng các phần dễ ảo hóa
của phần cứng x86 vật lý mà VMM chạy.

Pitfall: Tấn công phần cứng có thể ảnh hưởng đến bảo mật.

Mặc dù nhiều lỗi phần mềm trong hệ điều hành là phương tiện tấn công chính của hệ
thống máy tính, năm 2015 Google đã chứng minh một chương trình người dùng có thể lật
đổ bảo vệ bộ nhớ ảo bằng cách khai thác điểm yếu trong chip DRAM DDR3. Do tính chất
hai chiều của các bộ phận DRAM và các tế bào bộ nhớ rất nhỏ của DR3 DRAM, các nhà
nghiên cứu đã quan sát thấy rằng búa búa đập một hàng DRAM DDR3 bằng cách viết nó
liên tục có thể gây ra lỗi nhiễu ở một hàng liền kề, sẽ lật bit hàng nạn nhân. Một kẻ tấn
công thông minh có thể sử dụng kỹ thuật búa búa hàng để thay đổi các bit bảo vệ của các
mục trong bảng trang và do đó cấp cho các vùng bộ nhớ truy cập chương trình mà hệ điều
hành đã cố gắng bảo vệ. Các bộ vi xử lý và DRAM sau này bao gồm các cơ chế để phát
hiện các cuộc tấn công búa hàng để đánh bại chúng.
494 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Vụ tấn công đã làm choáng váng nhiều nhà nghiên cứu bảo mật, những người
cho đến lúc đó đã nghĩ rằng phần cứng không phải là bất khả xâm phạm đối với
các vấn đề bảo mật. Như chúng ta sẽ thấy trong phần Fallacy và Pit thác của
Chương 6, búa hàng chỉ là cú vô lê mở đầu của vectơ tấn công mới này.

5.17 Kết luận

Khó khăn trong việc xây dựng một hệ thống bộ nhớ để theo kịp các bộ xử lý
nhanh hơn được nhấn mạnh bởi thực tế là nguyên liệu thô cho bộ nhớ chính,
DRAM, về cơ bản là giống nhau trong các máy tính nhanh nhất vì nó chậm nhất
và rẻ nhất.
Chính nguyên tắc của địa phương mang đến cho chúng ta cơ hội vượt qua độ
trễ dài của việc truy cập bộ nhớ và sự lành mạnh của chiến lược này được thể
hiện ở tất cả các cấp độ hệ thống phân cấp bộ nhớMặc dù các cấp độ phân cấp
này trông khá khác nhau về mặt định lượng, chúng tuân theo các chiến lược
tương tự trong hoạt động của chúng và khai thác các thuộc tính tương tự của địa
phương.
Bộ nhớ cache đa cấp giúp có thể sử dụng nhiều tối ưu hóa bộ đệm dễ dàng hơn
vì hai lý do. Đầu tiên, các tham số thiết kế của bộ đệm cấp thấp hơn khác với bộ
đệm cấp một. Ví dụ: vì bộ đệm cấp thấp hơn sẽ lớn hơn nhiều, nên có thể sử dụng
kích thước khối lớn hơn. Thứ hai, bộ đệm cấp thấp hơn không liên tục được sử
dụng bởi bộ xử lý, vì bộ đệm cấp một là. Điều này cho phép chúng tôi xem xét
việc bộ đệm cấp thấp hơn làm điều gì đó khi nó không hoạt động có thể hữu ích
trong việc ngăn chặn các lần bỏ lỡ trong tương lai.
Một xu hướng khác là tìm kiếm sự giúp đỡ phần mềm. Quản lý hiệu quả hệ
thống phân cấp bộ nhớ bằng nhiều biến đổi chương trình và phương tiện phần
cứng là trọng tâm chính của các cải tiến trình biên dịch. Hai ý tưởng khác nhau
đang được khám phá. Một ý tưởng là tổ chức lại chương trình để tăng cường địa
phương không gian và thời gian của nó. Cách tiếp cận này tập trung vào các
chương trình định hướng vòng lặp sử dụng các mảng khá lớn làm cấu trúc dữ liệu
tiền chế Một kỹ thuật chính; các vấn đề đại số tuyến tính lớn là một ví dụ điển hình, chẳng hạn như
trong đó các khối dữ liệu DGEMM. Bằng cách tái cấu trúc các vòng lặp truy cập vào các mảng, cải thiện
cần thiết trong tương lai sẽ đáng kể địa phương và do đó, hiệu suất bộ đệm có thể thu được.
được đưa vào bộ đệm sớm Một cách tiếp cận khác là tiền chế Trong prefetching, một khối dữ liệu được đưa
bằng cách sử dụng các
vào bộ đệm trước khi nó thực sự được tham chiếu. Nhiều bộ vi xử lý sử dụng tiền
hướng dẫn đặc biệt chỉ
định địa chỉ của khối.
chuẩn phần cứng để thử. dự đoán truy cập có thể khó để phần mềm chú ý.
Cách tiếp cận thứ ba là các hướng dẫn nhận biết bộ nhớ cache đặc biệt để tối
ưu hóa việc truyền bộ nhớ. Ví dụ, các bộ vi xử lý trong Mục 6.10 trong Chương 6
sử dụng tối ưu hóa không lấy nội dung của một khối từ bộ nhớ khi bỏ lỡ ghi vì
chương trình sẽ ghi toàn bộ khối. Tối ưu hóa này làm giảm đáng kể lưu lượng bộ
nhớ cho một kernel.
Như chúng ta sẽ thấy trong Chương 6, hệ thống bộ nhớ là một vấn đề thiết kế
trung tâm cho các bộ xử lý song song. Tầm quan trọng ngày càng tăng của hệ
thống phân cấp bộ nhớ trong việc xác định hiệu suất hệ thống có nghĩa là khu vực
quan trọng này sẽ
tiếp tục là trọng tâm
cho cả nhà thiết kế
và nhà nghiên cứu
trong một số năm tới.
5.19 Tự học 495

5,18 Quan điểm lịch sử và hơn thế nữa


Đọc hiểu

Phần này, xuất hiện trực tuyến, cung cấp tổng quan về các công nghệ bộ nhớ, từ
các đường trễ thủy ngân đến DRAM, phát minh ra hệ thống phân cấp bộ nhớ, cơ
chế bảo vệ và máy ảo và kết thúc với một lịch sử ngắn gọn về các hệ điều hành,
bao gồm CTSS, MULTICS, UNIX, BSD UNIX, MS-DOS, Windows và Linux.

5.19 Tự học

Càng nhiều càng tốt? Hình 5.9 cho thấy trạng thái của một bộ đệm ánh xạ trực
tiếp nhỏ sau chín địa chỉ, kết thúc bằng 16. Giả sử năm tham chiếu bộ nhớ tiếp
theo là từ một vòng lặp truy cập mọi địa chỉ khác: 18, 20, 22, 24 và 26. Có bao
nhiêu lượt truy cập? Bộ nhớ cache trông như thế nào sau đó?
Là sự kết hợp vui vẻ? Giả sử thay vì ánh xạ trực tiếp, nó được đặt 2 chiều
liên kết. Điều đó sẽ biến các lỗi trong các tham chiếu bộ nhớ 18, 20, 22 và 24
thành các lần truy cập? Tại sao hay tại sao không? Sử dụng mô hình Three Cs để
giải thích câu trả lời của bạn.
Tương tự đông lạnhTừ thư viện đến giặt ủi, chúng tôi dựa vào sự tương tự để
giải thích. khái niệm máy tính trong cuốn sách này. Lần này chúng tôi sẽ cho
phép bạn cố gắng giải thích hệ thống phân cấp bộ nhớ giống như việc lưu trữ thực
phẩm lạnh. Những cấp độ và khái niệm của một hệ thống phân cấp bộ nhớ tương
tự như các cơ chế và sự kiện lưu trữ thực phẩm lạnh này?
1. Tủ lạnh trong bếp
2. Tủ đông tích hợp (thường được đóng gói với tủ lạnh ở trên và tủ đông ở
dưới cùng dưới dạng một đơn vị)
3. Đơn vị tủ đông độc lập trong nhà để xe hoặc tầng hầm
4. Tủ đông thực phẩm đông lạnh tại một cửa hàng tạp hóa
5. Các nhà cung cấp thực phẩm đông lạnh trong cửa hàng tạp hóa
6. Lấy thức ăn từ tủ lạnh để nấu ăn
7. Thời gian để lấy thức ăn từ tủ lạnh
8. Cho thực phẩm nấu chín vào tủ lạnh
9. Di chuyển thực phẩm đông lạnh từ tủ đông tích hợp vào tủ lạnh để tan
băng trước khi nấu
10. Thời gian cần thiết để làm tan băng thực phẩm từ tủ đông tích hợp
5.18 Quan điểm lịch sử và đọc thêm 495.e1

...một đơn sự phát


5,18 triển đặt máy tính trên
00036 Quan điểm lịch sử và hơn thế nữa đôi chân của họ là
Đọc hiểu phát minh ra một dạng
bộ nhớ đáng tin cậy,
cụ thể là bộ nhớ lõi....
Phần lịch sử này cung cấp một cái nhìn tổng quan về các công nghệ bộ nhớ, từ Chi phí của nó là hợp
các đường trễ thủy ngân đến DRAM, phát minh ra hệ thống phân cấp bộ nhớ và lý, nó đáng tin cậy và,
các cơ chế bảo vệ và kết thúc với một lịch sử ngắn gọn về các hệ điều hành, bao vì nó đáng tin cậy, tất
gồm CTSS, MULTICS, UNIX, BSD UNIX, MS- DOS, Windows và Linux. nhiên nó có thể được
Sự phát triển của hầu hết các khái niệm trong chương này đã được thúc đẩy làm lớn.
bởi những tiến bộ mang tính cách mạng trong công nghệ chúng ta sử dụng cho Maurice Wilkes , Hồi ức
bộ nhớ. Trước khi chúng ta thảo luận về cách phân cấp bộ nhớ được phát triển,
của một tiên phong máy
hãy để một chuyến tham quan ngắn về sự phát triển của công nghệ bộ nhớ.
tính, 1985
ENIAC chỉ có một số lượng nhỏ các thanh ghi (khoảng 20) để lưu trữ và thực
hiện chúng với cùng công nghệ ống chân không cơ bản mà nó sử dụng để xây
dựng mạch logic. Tuy nhiên, công nghệ ống chân không quá đắt để được sử dụng
để xây dựng dung lượng bộ nhớ lớn hơn. Eckert đã nảy ra ý tưởng phát triển một
công nghệ mới dựa trên các đường trễ thủy ngân. Trong công nghệ này, các tín
hiệu điện đã được chuyển đổi thành các rung động được gửi xuống một ống thủy
ngân, đến đầu kia, nơi chúng được đọc ra và tuần hoàn. Một dòng trễ thủy ngân
có thể lưu trữ khoảng 0,5 Kbit. Mặc dù các bit này được truy cập một cách tuần
tự, đường trễ thủy ngân có hiệu quả hơn khoảng một trăm lần so với bộ nhớ ống
chân không. Các dòng trì hoãn thủy ngân làm việc đầu tiên được biết đến đã được
phát triển tại Cambridge cho EDSAC . Hình e5.17.1 cho thấy các đường trễ thủy
ngân của EDSAC, có 32 bể và 512 từ 36 bit.
Mặc dù có những tiến bộ to lớn được cung cấp bởi các dòng trì hoãn thủy ngân,
chúng không đáng tin cậy và vẫn còn khá đắt. Bước đột phá đến với việc phát minh
ra bộ nhớ lõi của J. Forrester tại MIT như một phần của dự án Whirlwind vào đầu
những năm 1950 (xem Hình e5.17.2). Bộ nhớ lõi sử dụng lõi ferrite, có thể được từ
hóa và sau khi được từ hóa, nó hoạt động như một cửa hàng (giống như một băng ghi
âm từ tính lưu trữ thông tin). Một bộ dây chạy qua tâm của lõi, có kích thước 0,111.0
mm, cho phép đọc giá trị được lưu trữ trên bất kỳ lõi ferrite nào. Whirlwind cuối
cùng bao gồm một bộ nhớ lõi với các từ 16 bit 2048, hoặc 32 Kbit. Bộ nhớ cốt lõi là
một tiến bộ to lớn: nó rẻ hơn, nhanh hơn, đáng tin cậy hơn và có mật độ cao hơn. Bộ
nhớ lõi tốt hơn nhiều so với các lựa chọn thay thế đến nỗi nó trở thành công nghệ bộ
nhớ thống trị chỉ vài năm sau khi phát minh ra nó và vẫn như vậy trong gần 20 năm.
495.e2 5.18 Quan điểm lịch sử và đọc thêm

HÌNH e5.17.1 Các đường trễ thủy ngân trong EDSAC . Công nghệ này làm cho nó có thể xây
dựng máy tính chương trình lưu trữ đầu tiên. Kỹ sư trẻ trong bức ảnh này không ai khác chính là Maurice
Wilkes, kiến trúc sư chính của EDSAC .
5.18 Quan điểm lịch sử và đọc thêm 495.e3

HÌNH e5.17.2 Một mặt phẳng bộ nhớ lõi từ Whirlwind chứa 256 lõi được sắp xếp trong 16 × 16
mảng. Bộ nhớ lõi được phát minh cho Whirlwind, được sử dụng để phòng không vấn đề, và hiện đang được
trưng bày tại Smithsonian. (Ngẫu nhiên, Ken Olsen, người sáng lập Digital và chủ tịch của nó trong 20 năm, đã
chế tạo máy tính thử nghiệm những ký ức cốt lõi này; đó là máy tính đầu tiên của anh ấy.)

Công nghệ thay thế bộ nhớ lõi là cùng một công nghệ mà bây giờ chúng ta sử
dụng cả cho logic và bộ nhớ: mạch tích hợp. Mặc dù các thanh ghi được xây dựng từ
bộ nhớ được bán dẫn vào những năm 1960 và các máy tính của IBM đã sử dụng bộ
nhớ được bán dẫn cho kho lưu trữ vi mã và bộ nhớ cache vào năm 1970, việc xây
dựng bộ nhớ chính từ các bóng bán dẫn vẫn rất tốn kém cho đến khi phát triển mạch
tích hợp. Với mạch tích hợp, có thể xây dựng DRAM (bộ nhớ truy cập ngẫu nhiên
động, xem Chương 5 và Phụ lục B để biết mô tả). Các DRAM đầu tiên được chế tạo
tại Intel vào năm 1970 và các máy tính sử dụng bộ nhớ DRAM (như một tùy chọn tốc
độ cao đến lõi) đã xuất hiện ngay sau đó; họ đã sử dụng 1 DRAM Kbit. Trên thực tế,
văn hóa dân gian máy tính nói rằng Intel đã phát triển bộ vi xử lý một phần để giúp
đỡ
495.e4 5.18 Quan điểm lịch sử và đọc thêm

HÌNH e5.17.3 Một bảng DRAM sớm. Bảng này sử dụng chip 18 Kbit.

bán thêm DRAM . Hình e5.17.3 cho thấy một bảng DRAM sớm. Đến cuối những
năm 1970, ký ức cốt lõi đã trở thành một sự tò mò lịch sử. Giống như công nghệ bộ
nhớ lõi đã cho phép mở rộng quy mô bộ nhớ, công nghệ DRAM cho phép mở rộng
tương đương. Vào những năm 1990, nhiều máy tính cá nhân có bộ nhớ nhiều như các
máy tính lớn nhất sử dụng bộ nhớ lõi từng có.
Ngày nay, DRAM thường được đóng gói với nhiều chip trên một bảng nhỏ
gọi là DIMM (mô-đun bộ nhớ nội tuyến kép). SIMM (mô-đun bộ nhớ nội tuyến
đơn) được hiển thị trong Hình e5.17.4 chứa tổng cộng 1 MB và được bán với giá
khoảng 5 đô la vào năm 1997. Tính đến năm 2020, DIMM đã có sẵn với tối đa
64 GiB và được bán với giá khoảng 300 đô la. Mặc dù DRAM sẽ vẫn là công
nghệ bộ nhớ thống trị trong một thời gian tới, những đổi mới trong bao bì
DRAM để cung cấp cả băng thông cao hơn và mật độ lớn hơn đang diễn ra.
5.18 Quan điểm lịch sử và đọc thêm 495.e5

HÌNH e5.17.4 Một SIMM 1 MB, được chế tạo vào năm 1986, sử dụng chip 1 Mbit. SIMM này
được bán với giá khoảng 5 đô la / MB năm 1997. Kể từ năm 2020, hầu hết bộ nhớ chính được đóng gói
trong các DIMM tương tự như thế này, mặc dù sử dụng chip bộ nhớ mật độ cao hơn nhiều (16 Gbit).

Sự phát triển của hệ thống phân cấp bộ nhớ


Mặc dù những người tiên phong của điện toán đã thấy trước sự cần thiết của a hệ
thống phân cấp bộ nhớ và đặt ra thuật ngữ, việc quản lý tự động hai cấp độ lần đầu
tiên được đề xuất bởi Kilburn và các đồng nghiệp của ông và được trình diễn tại Đại
học Manchester với máy tính Atlas, nơi thực hiện bộ nhớ ảo. Atlas là năm trước IBM
360 đã được công bố. IBM đã lên kế hoạch bao gồm bộ nhớ ảo với thế hệ tiếp theo
(System / 370), nhưng hệ điều hành OS / 360 đã không vượt qua thách thức vào năm
1970. Bộ nhớ ảo đã được công bố cho gia đình 370 vào năm 1972 và chính máy tính
này là thuật ngữ này dịch đệm lookaside đã được đặt ra.
Các vấn đề của không gian địa chỉ không đầy đủ đã làm khổ các nhà thiết kế nhiều
lần. Các kiến trúc sư của PDP-11 đã xác định một không gian địa chỉ nhỏ là lỗi kiến
trúc duy nhất mà từ đó rất khó phục hồi. Khi PDP-11 được thiết kế, mật độ bộ nhớ lõi
đang tăng với tốc độ rất chậm, và sự cạnh tranh từ 100 công ty máy tính mini khác có
nghĩa là DEC có thể không có sản phẩm cạnh tranh về chi phí nếu mọi địa chỉ phải
trải qua datapath 16 bit hai lần—do đó, quyết định chỉ thêm 4 bit địa chỉ so với tiền
thân của PDP-11, đến 16 từ 12. Các kiến trúc sư của IBM 360 đã nhận thức được tầm
quan trọng của kích thước địa chỉ và lên kế hoạch cho kiến trúc mở rộng đến 32 bit
địa chỉ. Tuy nhiên, chỉ có 24 bit được sử dụng trong IBM 360, bởi vì các mô hình
360 cấp thấp thậm chí còn chậm hơn với các địa chỉ lớn hơn. Thật không may, nỗ lực
mở rộng rất phức tạp bởi các lập trình viên sáng tạo đã lưu trữ thêm thông tin
495.e6 5.18 Quan điểm lịch sử và đọc thêm

8 bit địa chỉ không sử dụng trên. Địa chỉ rộng hơn kéo dài đến năm 2000, khi
IBM mở rộng kiến trúc lên 64 bit trong sê-ri z.
Chạy ra khỏi không gian địa chỉ thường là nguyên nhân gây ra cái chết cho
một kiến trúc, trong khi các kiến trúc khác đã quản lý để thực hiện chuyển đổi
sang một không gian địa chỉ lớn hơn. Ví dụ, PDP-11, máy tính 16 bit, đã được
thay thế bằng VAX 32 bit. 80386 đã mở rộng kiến trúc 80286 từ không gian địa
chỉ 24 bit được phân đoạn thành không gian địa chỉ 32 bit phẳng vào năm 1985.
Vào những năm 1990, một số bộ hướng dẫn RISC đã thực hiện chuyển đổi từ địa
chỉ 32 bit sang địa chỉ 64 bit bằng cách cung cấp một phần mở rộng tương thích
của các bộ hướng dẫn của họ. MIPS là người đầu tiên làm như vậy. Một thập kỷ
sau, Intel và HP đã công bố IA-64 phần lớn để cung cấp một kế thừa địa chỉ 64
bit cho các kiến trúc Intel IA-32 và HP Precision 32 bit. Thay vào đó, AMD64
tiến hóa đã trở thành người kế thừa địa chỉ 64 bit của 80386 32 bit, mà Intel sau
đó buộc phải nắm lấy.
Nhiều ý tưởng ban đầu trong hệ thống phân cấp bộ nhớ có nguồn gốc từ Anh.
Chỉ vài năm sau bài báo Atlas , Wilkes [1965] đã xuất bản bài báo đầu tiên mô tả
khái niệm về bộ đệm, gọi nó là nô lệ của người Hồi giáo :
Việc sử dụng được thảo luận về một bộ nhớ lõi nhanh, nói, 32.000 từ làm nô lệ cho bộ
nhớ lõi chậm hơn, nói, một triệu từ theo cách mà trong các trường hợp thực tế, thời gian
truy cập hiệu quả gần với bộ nhớ nhanh hơn so với bộ nhớ chậm.
Bài viết hai trang này mô tả bộ đệm được ánh xạ trực tiếp. Mặc dù đây là ấn phẩm
đầu tiên về bộ nhớ cache, nhưng lần thực hiện đầu tiên có lẽ là bộ đệm hướng dẫn
được ánh xạ trực tiếp được xây dựng tại Đại học Cambridge bởi Scarrott và được
mô tả tại Đại hội IFIP năm 1965. Nó dựa trên bộ nhớ diode đường hầm, dạng bộ
nhớ nhanh nhất hiện có.
Sau ấn phẩm đó, IBM đã bắt đầu một dự án dẫn đến máy tính thương mại đầu
tiên có bộ đệm, IBM 360/85. Gibson tại IBM nhận ra rằng hành vi truy cập bộ
nhớ sẽ có tác động đáng kể đến hiệu suất. Ông mô tả cách đo hành vi chương
trình và hành vi bộ đệm và chỉ ra rằng tỷ lệ bỏ lỡ khác nhau giữa các chương
trình. Sử dụng một mẫu gồm 20 chương trình (mỗi chương trình có 3 triệu tài
liệu tham khảo là một con số đáng kinh ngạc cho thời điểm đó), Gibson đã phân
tích hiệu quả của bộ nhớ bằng cách sử dụng thời gian truy cập bộ nhớ trung bình
làm số liệu. Conti, Gibson và Pitowsky đã mô tả hiệu suất kết quả của 360/85
trong bài báo đầu tiên sử dụng thuật ngữ này bộ nhớ cache năm 1968.
Kể từ khi làm việc sớm này, rõ ràng bộ nhớ cache là một trong những ý tưởng
quan trọng nhất không chỉ trong kiến trúc máy tính mà cả trong các hệ thống phần
mềm. Ý tưởng về bộ nhớ đệm đã tìm thấy các ứng dụng trong các hệ điều hành,
mạng
5.18 Quan điểm lịch sử và đọc thêm 495.e7

hệ thống, cơ sở dữ liệu và trình biên dịch, để đặt tên cho một số ít. Có hàng ngàn
bài báo về chủ đề bộ nhớ đệm, và nó tiếp tục là một lĩnh vực nghiên cứu phổ biến.
Một trong những bài báo đầu tiên về bộ nhớ cache không chặn là của Kroft vào
năm 1981, người có thể đã đặt ra thuật ngữ này. Sau đó, ông giải thích rằng ông là
người đầu tiên tại Control Data Corporation thiết kế một máy tính có bộ đệm và
khi sử dụng các khái niệm cũ cho các cơ chế mới, ông đã nảy ra ý tưởng cho phép
bộ đệm hai cổng của mình tiếp tục phục vụ các truy cập khác trên bỏ lỡ.
Bộ nhớ đa cấp là độ phân giải không thể tránh khỏi đối với việc thiếu cải thiện độ
trễ bộ nhớ chính và tốc độ đồng hồ của bộ vi xử lý cao hơn. Chỉ những người trong
lĩnh vực này trong một thời gian mới ngạc nhiên bởi kích thước của một số bộ nhớ
cấp hai hoặc cấp ba, vì chúng lớn hơn những ký ức chính của các máy móc trong quá
khứ. Một điều ngạc nhiên khác là số lượng cấp độ liên tục tăng, ngay cả trên bộ vi xử
lý đơn chip.

Lưu trữ đĩa


Năm 1956, IBM đã phát triển hệ thống lưu trữ đĩa đầu tiên với cả đầu di chuyển và
nhiều bề mặt đĩa ở San Jose, giúp gieo mầm cho ngành lưu trữ từ tính ở cuối phía
nam của Thung lũng Silicon. Reynold B. Johnson dẫn đầu sự phát triển của IBM 305
RAMAC (Phương pháp kế toán và kiểm soát truy cập ngẫu nhiên). Nó có thể lưu trữ
5 triệu ký tự (5 MB) dữ liệu trên 50 đĩa, mỗi đĩa có đường kính 24 inch. RAMAC
được hiển thị trong Hình e5.17.5 và e5.17.6Mặc dù những người tiên phong trong đĩa
sẽ ngạc nhiên về kích thước, chi phí và dung lượng của các đĩa hiện đại, thiết kế cơ
bản giống như RAMAC ..
Đĩa đầu di chuyển nhanh chóng trở thành bộ lưu trữ từ tính tốc độ cao chiếm
ưu thế, mặc dù chi phí cao của chúng có nghĩa là băng từ tiếp tục được sử dụng
rộng rãi cho đến những năm 1970. Cột mốc quan trọng tiếp theo cho đĩa cứng là
ổ đĩa cứng có thể tháo rời được IBM phát triển vào năm 1962; điều này giúp chia
sẻ các thiết bị điện tử ổ đĩa đắt tiền và giúp các đĩa vượt qua băng làm phương
tiện lưu trữ ưa thích. Hình e5.17.7 hiển thị ổ đĩa di động và đĩa nhiều đĩa được sử
dụng trong lái xe. IBM cũng đã phát minh ra ổ đĩa mềm vào năm 1970, ban đầu
để giữ microcode cho dòng IBM 370. Đĩa mềm trở nên phổ biến với PC khoảng
10 năm sau.
Đĩa Winchester được niêm phong, được IBM phát triển vào năm 1973, hoàn
toàn thống trị công nghệ đĩa ngày nay. Đĩa Winchester được hưởng lợi từ hai
thuộc tính liên quan. Đầu tiên, việc giảm chi phí cho thiết bị điện tử đĩa khiến
việc chia sẻ thiết bị điện tử trở nên không cần thiết và do đó làm cho các đĩa
không thể tháo rời trở nên kinh tế. Vì đĩa đã được cố định và có thể nằm trong vỏ
kín, cả hai vấn đề môi trường và kiểm soát đều giảm đáng kể, cho phép tăng mật
độ đáng kể. Đĩa đầu tiên mà IBM vận chuyển có hai trục chính, mỗi trục có đĩa
30 MB; biệt danh 30-30 30 cho đĩa dẫn đến tên Winchester(.30-30 là hộp đạn
đầu tiên của Hoa Kỳ cho súng trường hành động cấp độ Winchester Model, được
ra mắt vào năm 1895.) Đĩa Winchester đã phát triển nhanh chóng phổ biến vào
những năm 1980, thay thế hoàn toàn các đĩa có thể tháo rời vào giữa thập kỷ đó.
Vai trò lịch sử của IBM trong ngành công nghiệp đĩa đã kết thúc vào năm 2002,
khi IBM bán bộ phận lưu trữ đĩa của mình cho Hitachi. IBM tiếp tục tạo ra các hệ
thống con lưu trữ ,
495.e8 5.18 Quan điểm lịch sử và đọc thêm

HÌNH e5.17.5 Một trống từ được sản xuất bởi Tập đoàn Phát triển Kỹ thuật số vào những
năm 1960 và được sử dụng trên máy CDC. Các thiết bị điện tử hỗ trợ đầu đọc / ghi có thể được
nhìn thấy ở bên ngoài của trống.

nhưng nó mua ổ đĩa của nó từ những người khác. Vào năm 2020, hầu hết các ổ
đĩa được tạo ra bởi chỉ hai công ty: Seagate và Western Digital.

Một lịch sử rất ngắn gọn về bộ nhớ Flash


Bộ nhớ flash được phát minh bởi Fujio Masuoka tại Toshiba vào những năm
1980. Họ đã phát minh ra cả bộ nhớ Flash dựa trên NOR vào năm 1984 và bộ nhớ
Flash dựa trên NAND dày đặc hơn vào năm 1989. Việc sử dụng đầu tiên là trong
máy ảnh kỹ thuật số, bắt đầu với yếu tố hình thức CompactFlash cho bộ nhớ
NOR Flash và yếu tố hình thức SmartMedia cho bộ nhớ NAND Flash. Ngày nay,
tất cả các máy ảnh kỹ thuật số, điện thoại di động, máy nghe nhạc, máy tính bảng
và máy tính xách tay đều sử dụng bộ nhớ flash thay vì đĩa.
5.18 Quan điểm lịch sử và đọc thêm 495.e9

HÌNH e5.17.6 Ổ đĩa RAMAC của IBM, được sản xuất vào năm 1956, là ổ đĩa đầu tiên có đầu
di chuyển và đầu tiên có nhiều đĩa. Trang web công nghệ lưu trữ IBM có một cuộc thảo luận về
những đóng góp lớn của IBM cho công nghệ lưu trữ.

HÌNH e5.17.7 Đây là ổ đĩa DEC và gói có thể tháo rời. Những đĩa này trở nên phổ biến bắt đầu từ
giữa những năm 1960 và công nghệ đĩa thống trị cho đến khi Winchester lái xe vào cuối những năm 1970.
Ổ đĩa này được sản xuất vào giữa những năm 1970; mỗi gói đĩa trong ổ đĩa này có thể chứa 80 MB .

Một lịch sử ngắn gọn về cơ sở dữ liệu


Mặc dù đã có các kho lưu trữ dữ liệu của thẻ đục lỗ và băng từ sau này, sự xuất
hiện của đĩa từ dẫn đến cơ sở dữ liệu hiện đại.
Năm 1961, Charles Bachman tại General Electric đã tạo ra một hệ thống quản lý
cơ sở dữ liệu tiên phong có tên là Cửa hàng dữ liệu tích hợp (IDS) để tận dụng các
đĩa từ tính mới. Năm 1971, Bachman và những người khác đã công bố các tiêu chuẩn
về cách quản lý cơ sở dữ liệu bằng các chương trình Cobol, được đặt tên theo
phương pháp CODASYL sau đó
495.e10 5.18 Quan điểm lịch sử và đọc thêm

ủy ban tiêu chuẩn mà họ phục vụ. Nhiều công ty cung cấp cơ sở dữ liệu tương
thích CODASYL, nhưng không phải IBM. IBM đã giới thiệu IMS vào năm 1968,
được lấy từ công việc của IBM trên dự án Apollo của NASA. Cả cơ sở dữ liệu
CODASYL và IMS đều được phân loại là cơ sở dữ liệu điều hướng vì các
chương trình phải điều hướng qua dữ liệu.
Ted Codd, một nhà nghiên cứu tại IBM, nghĩ rằng phương pháp điều hướng là
sai lầm. Ông nhớ lại rằng mọi người đã không viết chương trình khi xử lý các cơ
sở dữ liệu thẻ đục lỗ cũ. Thay vào đó, họ thiết lập các luồng dữ liệu thông qua
một loạt các máy thẻ đục lỗ sẽ thực hiện các chức năng đơn giản như sao chép
hoặc sắp xếp. Khi các máy thẻ được thiết lập, bạn chỉ cần đẩy tất cả các thẻ qua
để có kết quả. Theo quan điểm của ông, người dùng chỉ nên khai báo loại dữ liệu
họ đang tìm kiếm và để nó cho máy tính xử lý. Năm 1970, ông đã xuất bản một
cách mới để tổ chức và truy cập dữ liệu được gọi là mô hình quan hệNó dựa
trên lý thuyết tập hợp; dữ liệu độc lập với việc triển khai và người dùng đã mô tả
những gì họ đang tìm kiếm bằng ngôn ngữ khai báo, không phổ biến.
Bài viết này đã dẫn đến tranh cãi đáng kể trong IBM, bởi vì nó đã có một sản phẩm
cơ sở dữ liệu. Codd thậm chí đã sắp xếp một cuộc tranh luận công khai giữa anh và
Bachman, dẫn đến sự chỉ trích nội bộ tại IBM rằng Codd đã phá hoại IMS. Tin vui là
cuộc tranh luận đã khiến các nhà nghiên cứu tại IBM và U.C. Berkeley cố gắng chứng
minh khả năng tồn tại của cơ sở dữ liệu quan hệ bằng cách xây dựng System R và
Ingres.
System R, vào năm 1974, 79, đã chứng minh tính khả thi của nó và, có lẽ quan
trọng hơn, đã tạo ra Ngôn ngữ truy vấn có cấu trúc (SQL) vẫn được sử dụng rộng rãi
cho đến ngày nay. Tuy nhiên, những kết quả này không đủ để thuyết phục IBM và
một số nhà nghiên cứu đã rời IBM để xây dựng cơ sở dữ liệu quan hệ cho các công ty
khác.
Mike Stonebraker và Gene Wong quan tâm đến các hệ thống dữ liệu địa lý và
năm 1973 họ quyết định theo đuổi cơ sở dữ liệu quan hệ. Thay vì xây dựng trên
các máy tính lớn của IBM, dự án Ingres được xây dựng trên các máy tính mini và
Unix của DEC. Ingres rất quan trọng vì nó đã dẫn đến một công ty cố gắng
thương mại hóa các ý tưởng, bởi vì 1000 bản sao mã nguồn của nó được phân
phối công khai và vì nó đã đào tạo một thế hệ các nhà phát triển và nghiên cứu cơ
sở dữ liệu. Mã và người đã dẫn đến nhiều công ty khác, bao gồm Sybase. Larry
Ellison bắt đầu Oracle bằng cách đọc các bài báo từ các nhóm System R và Ingres
và sau đó bằng cách thuê những người làm việc trong các dự án đó. Microsoft sau
đó đã mua một bản sao các nguồn Sybase trở thành nền tảng của sản phẩm SQL
Server.
Cơ sở dữ liệu quan hệ đã trưởng thành vào những năm 1980, với IBM phát
triển cơ sở dữ liệu quan hệ của riêng mình, bao gồm DB2. Những năm 1990
chứng kiến cả sự phát triển của cơ sở dữ liệu hướng đối tượng, để giải quyết sự
không phù hợp trở ngại giữa cơ sở dữ liệu và lập trình và sự phát triển của cơ sở
dữ liệu song song để xử lý phân tích và khai thác dữ liệu.
ACM đã trao giải thưởng cho cộng đồng này. Giải thưởng ACM Turing đã thuộc
về Charles Bachman vào năm 1973 vì những đóng góp của ông thông qua IDS và
nhóm Codasyl. Codd đã giành được nó vào năm 1980 cho mô hình quan hệ. Năm
1988, các nhà phát triển của System R (Donald Chamberlin, Jim Gray, Raymond
Lorie, Gianfranco Putzolu, Patricia Selinger và Irving Traiger) đã chia sẻ Giải thưởng
Phần mềm Hệ thống ACM với các nhà phát triển của Ingres (Gerald Held, Michael
Stonebraker và Eugene Wong) . Jim
5.18 Quan điểm lịch sử và đọc thêm 495.e11

Gray đã giành giải thưởng Turing năm 1998 nhờ những đóng góp của mình cho
việc xử lý giao dịch và cơ sở dữ liệu. Stonebraker đã giành được nó vào năm
2014 để đóng góp cho các khái niệm và thực tiễn làm nền tảng cho các hệ thống
cơ sở dữ liệu hiện đại. Cuối cùng, hai giải thưởng Sáng tạo ACM SIGMOD đầu
tiên đã thuộc về Stonebraker và Gray, và các phiên bản 2002 và 2003 đã thuộc về
Selinger và Chamberlin.

RAID
Các đĩa cứng yếu tố hình thức nhỏ cho PC vào giữa những năm 1980 đã khiến
một nhóm tại Berkeley đề xuất các mảng dư thừa của các đĩa rẻ tiền (RAID).
Nhóm này đã làm việc với nỗ lực giảm tập lệnh máy tính (RISC) và do đó mong
đợi các bộ xử lý nhanh hơn nhiều sẽ có sẵn. Hai câu hỏi của họ là: Những gì có
thể được thực hiện với các đĩa nhỏ đi kèm với PC của họ? Những gì có thể được
thực hiện trong lĩnh vực I / O để theo kịp bộ xử lý nhanh hơn nhiều? Họ lập luận
để thay thế một ổ đĩa máy tính lớn bằng 50 ổ đĩa nhỏ, vì bạn có thể có hiệu suất
lớn hơn nhiều với nhiều cánh tay độc lập đó. Nhiều ổ đĩa nhỏ thậm chí còn cung
cấp tiết kiệm trong tiêu thụ điện năng và không gian sàn.
Nhược điểm của nhiều đĩa là MTTF thấp hơn nhiều. Do đó, tự mình họ đã lý
luận về những lợi thế của đĩa dự phòng và tính chẵn lẻ để giải quyết làm thế nào
để có được hiệu suất cao hơn với nhiều ổ đĩa nhỏ nhưng có độ tin cậy cao như
của một đĩa máy tính lớn.
Vấn đề họ gặp phải khi giải thích ý tưởng của họ là một số nhà nghiên cứu đã
nghe nói về mảng đĩa với một số hình thức dư thừa và họ đã không hiểu đề xuất
của Berkeley. Do đó, giấy RAID đầu tiên [Patterson, Gibson và Katz (1987)]
không chỉ là trường hợp cho các mảng ổ đĩa yếu tố hình thức nhỏ, mà còn là một
hướng dẫn và phân loại công việc hiện có trên các mảng đĩa. Mirroring (RAID 1)
từ lâu đã được sử dụng trong các máy tính chịu lỗi như máy tính được bán bởi
Tandem. Thinking Machines có mảng với 32 đĩa dữ liệu và bảy đĩa kiểm tra sử
dụng ECC để chỉnh sửa (RAID 2) vào năm 1987 và Honeywell Bull đã có sản
phẩm RAID 2 ngay cả trước đó. Ngoài ra, mảng đĩa với một đĩa chẵn lẻ đã được
sử dụng trong các máy tính khoa học trong cùng khung thời gian (RAID 3). Sau
đó, bài viết của họ đã mô tả một đĩa chẵn lẻ duy nhất có hỗ trợ truy cập khu vực
(RAID 4) và tính chẵn lẻ xoay (RAID 5). Chen và cộng sự. [1994] khảo sát các ý
tưởng RAID ban đầu, các sản phẩm thương mại và các phát triển khác.
Không biết đến nhóm Berkeley, các kỹ sư tại IBM làm việc trên máy tính AS / 400
cũng đã đưa ra tính chẵn lẻ xoay để mang lại độ tin cậy cao hơn cho một bộ sưu tập các
đĩa lớn. IBM đã nộp bằng sáng chế về RAID 5 ngay trước khi nhóm Berkeley nộp bài báo
của họ. Bằng sáng chế cho RAID 1, RAID 2 và RAID 3 từ một số công ty có bằng sáng
chế IBM RAID 5, dẫn đến nhiều hành động trong phòng xử án.
EMC đã từng là nhà cung cấp bảng DRAM cho các máy tính IBM, nhưng khoảng
năm 1988, các chính sách mới của IBM đã khiến EMC gần như không thể tiếp tục
bán bảng nhớ IBM. Bài báo Berkeley đã vượt qua bàn của các giám đốc điều hành
EMC, và vì vậy họ quyết định theo đuổi thị trường bị chi phối bởi các sản phẩm lưu
trữ đĩa của IBM. Như bài báo ủng hộ, mô hình của họ là sử dụng nhiều ổ đĩa nhỏ để
cạnh tranh với các ổ đĩa máy tính lớn và EMC đã công bố một sản phẩm RAID vào
năm 1990. Nó dựa vào
495.e12 5.18 Quan điểm lịch sử và đọc thêm

phản chiếu (RAID 1) cho độ tin cậy; Các sản phẩm RAID 5 đã đến muộn hơn
cho EMC. Trong năm tới, Microp cung cấp sản phẩm RAID 3; Compaq cung cấp
một sản phẩm RAID 4; và Data General, IBM và NCR đã cung cấp các sản phẩm
RAID 5.
Các ý tưởng RAID sớm lan sang phần còn lại của ngành công nghiệp máy
trạm và máy chủ. Một bài báo giải thích RAID trong Byte tạp chí đã dẫn đến các
sản phẩm RAID được cung cấp trên máy tính để bàn, điều này gây bất ngờ cho
nhóm Berkeley. Họ đã tập trung vào hiệu suất với tính sẵn sàng tốt, nhưng tính
sẵn sàng cao hơn là hấp dẫn đối với thị trường PC.
Một bất ngờ khác là chi phí của mảng đĩa. Với nguồn cung cấp năng lượng và
quạt dự phòng, khả năng trao đổi nóng của một ổ đĩa, bộ điều khiển phần cứng
RAID, đĩa dự phòng, v.v., các mảng đĩa đầu tiên có giá gấp nhiều lần chi phí của
đĩa. Có lẽ kết quả là, những người không chuyên nghiệp trong RAID đã biến
thành người độc lập.Nhiều bộ phận tiếp thị và nhà văn kỹ thuật ngày nay chỉ biết
về RAID là mảng dư thừa của các đĩa độc lập.Giáo dục
Năm 2004, hơn 80% doanh số bán ổ đĩa nondesktop đã được tìm thấy trong
RAID. Để ghi nhận vai trò của họ, vào năm 1999, Garth Gibson, Randy Katz và
David Patterson đã nhận được Giải thưởng lưu trữ thông tin của IEEE Reynold B.
Johnson cho sự phát triển của Mảng dư thừa của đĩa rẻ tiền (RAID).Giáo dục

Cơ chế bảo vệ
Hỗ trợ kiến trúc để bảo vệ đã thay đổi rất nhiều trong 20 năm qua. Trong các
máy tính ban đầu, trước bộ nhớ ảo, bảo vệ rất đơn giản. Trong những năm 1960,
các cơ chế tinh vi hơn hỗ trợ các mức bảo vệ khác nhau (được gọi là nhẫn) đã
được phát minh. Vào cuối những năm 1970 và đầu những năm 1980, các cơ chế
rất công phu để bảo vệ đã được nghĩ ra và sau đó được xây dựng; các cơ chế này
hỗ trợ nhiều chương trình bảo vệ mạnh mẽ cho phép các trường hợp chia sẻ được
kiểm soát, theo cách mà một quy trình có thể chia sẻ dữ liệu trong khi kiểm soát
chính xác những gì đã được thực hiện với dữ liệu. Phương pháp mạnh nhất, được
gọi khả năng, đã tạo một đối tượng dữ liệu mô tả quyền truy cập vào một phần
của bộ nhớ. Các khả năng này sau đó có thể được chuyển qua các quy trình khác,
do đó cấp quyền truy cập vào đối tượng được mô tả bởi khả năng. Hỗ trợ cơ chế
bảo vệ tinh vi này vừa phức tạp vừa tốn kém, bởi vì việc tạo, sao chép và thao tác
các khả năng đòi hỏi phải có sự kết hợp giữa hệ điều hành và hỗ trợ phần cứng.
Các máy tính gần đây đều hỗ trợ một sơ đồ bảo vệ đơn giản hơn dựa trên bộ nhớ
ảo, tương tự như đã thảo luận Mục 5.7Với những lo ngại hiện tại về bảo mật máy
tính, chúng ta đang chứng kiến sự phục hưng trong nghiên cứu bảo vệ, có khả
năng làm mới sự quan tâm đến các ấn phẩm 40 năm tuổi.
Như đã đề cập trong văn bản, các máy ảo hệ thống đã được tiên phong tại IBM
như một phần của cuộc điều tra về bộ nhớ ảo. Máy tính đầu tiên của IBM có bộ
nhớ ảo là IBM 360/67, được giới thiệu vào năm 1967. Các nhà nghiên cứu của
IBM đã viết chương trình CP-67, tạo ra ảo ảnh của một số máy tính 360 độc lập.
Sau đó, họ đã viết một hệ điều hành một người dùng tương tác có tên CMS chạy
trên các máy ảo này. CP-67 đã dẫn đến sản phẩm VM / 370 và ngày nay IBM bán
z / VM cho các máy tính lớn của mình.
5.18 Quan điểm lịch sử và đọc thêm 495.e13

Lịch sử tóm tắt về các hệ điều hành hiện đại


MIT đã phát triển hệ thống chia sẻ thời gian đầu tiên, CTSS (Hệ thống chia sẻ thời
gian tương thích), vào năm 1961. John McCarthy thường được công nhận cho ý
tưởng chia sẻ thời gian, nhưng Fernando Corbato là người hệ thống đã nhận ra khái
niệm này dưới dạng CTSS. CTSS cho phép ba người chia sẻ một máy, và thời gian
phản hồi của nó là vài phút hoặc vài giây là một cải tiến đáng kể so với hệ thống xử lý
hàng loạt mà nó đã thay thế. Hơn nữa, nó đã chứng minh giá trị của điện toán tương
tác.
Xuất hiện với sự thành công của hệ thống đầu tiên của họ, nhóm này đã đưa vào hệ
thống thứ hai của họ, MULTICS (Dịch vụ điện toán và thông tin đa kênh). Chúng bao
gồm nhiều đổi mới, như bảo vệ mạnh mẽ, chia sẻ có kiểm soát và thư viện động. Tuy
nhiên, nó phải chịu tác động của hệ thống thứ hai.Fred Fred Brooks, Jr. đã mô tả hiệu ứng
hệ thống thứ hai trong cuốn sách kinh điển của mình về những bài học rút ra từ việc phát
triển một hệ điều hành cho máy tính lớn của IBM , Tháng người đàn ông thần thoại:
Khi một người đang thiết kế sự kế thừa cho một hệ thống tương đối
nhỏ, thanh lịch và thành công, có xu hướng trở nên hoành tráng trong
một thành công của một con voi và thiết kế một sự quái dị đầy tính
năng của voi.
ĐA NĂNG đã chia sẻ đến một thái cực hợp lý để khám phá các vấn đề, bao gồm cả
việc nó quá cực đoan. MIT, General Electric, và sau đó là Bell Labs đều cố gắng xây
dựng một hệ thống kinh tế và hữu ích. Mặc dù có rất nhiều thời gian và tiền bạc, họ
đã thất bại.
UC Berkeley đang xây dựng hệ thống chia sẻ thời gian của riêng mình, Cal TSS.
(Cần Cal là một biệt danh của Đại học California.) Những người dẫn đầu dự án đó
bao gồm Peter Deutsch, Butler Lampson, Chuck Thacker và Ken Thompson. Họ đã
thêm phần cứng bộ nhớ ảo phân trang vào SDS 920 và viết một hệ điều hành cho nó.
SDS đã bán máy tính này dưới dạng SDS-930 và đây là hệ thống chia sẻ thời gian
thương mại đầu tiên có phần cứng và phần mềm hoạt động. Thompson tốt nghiệp và
gia nhập Bell Labs. Những người khác thành lập Berkeley Computer Corporation
(BCC), với mục tiêu bán phần cứng và phần mềm chia sẻ thời gian. Chúng tôi sẽ
chọn BCC sau này trong câu chuyện, nhưng bây giờ hãy để theo dõi Thompson.
Tại Bell Labs năm 1971, Thompson đã lãnh đạo sự phát triển của một hệ thống
chia sẻ thời gian đơn giản có một số ý tưởng hay về ĐA NĂNG nhưng bỏ qua
nhiều tính năng phức tạp. Để chứng minh sự tương phản, lần đầu tiên nó được gọi
là UNICS. Khi họ được tham gia bởi những người khác tại Bell Labs, người đã bị
đốt cháy từ kinh nghiệm ĐA NĂNG, nó được đổi tên thành UNIX, với x đến từ
Phoenix, loài chim huyền thoại mọc lên từ đống tro tàn.
Kết quả của họ là hệ điều hành thanh lịch nhất từng được xây dựng và điều mà
một số người coi là chương trình tốt nhất mọi thời đại. Buộc phải sống trong
không gian địa chỉ 16 bit của máy tính mini DEC, nó có một lượng chức năng
đáng kinh ngạc trên mỗi dòng mã. Đóng góp chính là đường ống, hệ thống tệp
thống nhất, mô hình quy trình thống nhất và giao diện người dùng vỏ cho phép
người dùng kết nối các chương trình với nhau bằng đường ống và tệp.
Dennis Ritchie gia nhập nhóm UNIX vào năm 1973 từ MIT, nơi anh có kinh nghiệm
về ĐA NĂNG, được viết bằng ngôn ngữ cấp cao. Giống như các hệ điều hành trước đây,
UNIX đã được viết bằng ngôn ngữ lắp ráp. Ritchie đã thiết kế một ngôn ngữ để triển khai
hệ thống có tên C và nó được sử dụng để làm cho UNIX di động.
495.e14 5.18 Quan điểm lịch sử và đọc thêm

Từ năm 1971 đến 1976, Bell đã phát hành sáu phiên bản của hệ thống chia sẻ
thời gian UNIX. Thompson đã nghỉ phép tại trường cũ của mình và mang UNIX
đi cùng. Berkeley và nhiều trường đại học khác bắt đầu sử dụng UNIX trên máy
tính mini PDP-11 phổ biến.
Khi DEC công bố VAX, một người kế thừa địa chỉ ảo 32 bit cho PDP-11, câu
hỏi đặt ra là hệ điều hành nào sẽ được chạy. UNIX trở thành hệ điều hành đầu
tiên được di chuyển sang một máy tính khác khi nó được chuyển sang VAX .
Các sinh viên tại Berkeley đã có một trong những VAX đầu tiên và họ đã sớm
bổ sung các tính năng vào UNIX cho VAX, chẳng hạn như phân trang và triển
khai giao thức TCP / IP rất hiệu quả. Việc triển khai TCP / IP của Berkeley là
đáng chú ý không chỉ vì nó nhanh. Nó thực chất là chỉ triển khai TCP / IP trong
nhiều năm, do việc triển khai sớm trong hầu hết các hệ điều hành khác bao gồm
sao chép nguyên văn mã Berkeley, với những thay đổi tối thiểu để tích hợp vào hệ
thống cục bộ.
Cơ quan Dự án Nghiên cứu Tiên tiến (ARPA), nơi tài trợ cho nghiên cứu khoa
học máy tính, đã yêu cầu một giáo sư Stanford, Forrest Basket, đề xuất hệ thống
nào mà cộng đồng học thuật nên sử dụng: VMS hệ điều hành DEC, do David
Cutler hoặc phiên bản Berkeley của UNIX dẫn đầu , dẫn đầu bởi một sinh viên
tốt nghiệp tên Bill Joy. Ông đề nghị sau này, và Berkeley UNIX sớm trở thành
người mang tiêu chuẩn học thuật.
Phân phối phần mềm Berkeley (BSD) của UNIX, được phát hành lần đầu tiên
vào năm 1978, về cơ bản là một trong những phong trào nguồn mở đầu tiên. Các
nguồn được vận chuyển với các băng và các nhà phát triển hệ thống trên khắp thế
giới đã học được nghề của họ bằng cách nghiên cứu mã UNIX.
BSD cũng là sự phân chia đầu tiên của UNIX, bởi vì AT & T Bell Labs tiếp
tục tự mình phát triển UNIX. Điều này cuối cùng đã dẫn đến một khu rừng
UNIXes, khi mỗi công ty biên soạn mã nguồn UNIX cho kiến trúc của họ. Bill
Joy tốt nghiệp từ Berkeley và giúp tìm thấy Sun microsystems, Vì vậy, tự nhiên
Sun OS dựa trên BSD UNIX. Trong số nhiều hương vị UNIX có Santa Cruz
Operation UNIX, HP-UX, và IBM AIX. AT & T và Sun đã cố gắng thống nhất
UNIX bằng cách ký kết một thỏa thuận, theo đó AT & T và Sun sẽ kết hợp các
lực lượng và cùng phát triển AT & T UNIX. Điều này dẫn đến một phản ứng bất
lợi từ HP, IBM, và những người khác, bởi vì họ không muốn một đối thủ cạnh
tranh cung cấp mã của họ, vì vậy họ đã tạo ra Quỹ nguồn mở như một tổ chức
cạnh tranh.
Ngoài các biến thể UNIX từ các công ty, các phiên bản miền công cộng cũng
tăng sinh. Nhóm BSD tại Berkeley đã viết lại các phần đáng kể của UNIX để họ
có thể phân phối nó mà không cần giấy phép từ AT & T. Điều này cuối cùng đã
dẫn đến một vụ kiện, mà Berkeley đã thắng. BSD UNIX sớm tách ra thành
FreeBSD, NetBSD và OpenBSD, được cung cấp bởi các trại phát triển cạnh tranh.
Hệ điều hành hiện tại của Apple, OS X, dựa trên BSD miễn phí .
Hãy để trở lại Tập đoàn máy tính Berkeley. Than ôi, nỗ lực này không khả thi về mặt
thương mại. Cũng trong khoảng thời gian BCC gặp rắc rối, Xerox đã thuê Robert Taylor
xây dựng bộ phận khoa học máy tính của Xerox Palo Alto mới
5.18 Quan điểm lịch sử và đọc thêm 495.e15

Trung tâm nghiên cứu (PARC) năm 1970. Anh vừa trở về sau chuyến công tác tại
ARPA, nơi anh đã tài trợ cho nghiên cứu Berkeley. Ông đã tuyển dụng Deutsch,
Lampson và Thacker từ BCC để tạo thành cốt lõi của nhóm PARC, 11 trong số 20
nhân viên ban đầu đến từ BCC và họ quyết định chế tạo máy tính nhỏ cho các cá nhân
thay vì máy tính lớn cho các nhóm. Máy tính cá nhân đầu tiên này, được gọi là Alto,
được chế tạo từ cùng một công nghệ với máy tính mini, nhưng nó có bàn phím, chuột,
màn hình đồ họa và cửa sổ. Nó phổ biến các cửa sổ và dẫn đến nhiều phát minh, bao
gồm điện toán máy khách-máy chủ, Ethernet và máy chủ in. Nó trực tiếp truyền cảm
hứng cho Macintosh, vốn là sự kế thừa cho Apple II nổi tiếng .
IBM từ lâu đã quan tâm đến việc bán cho gia đình, vì vậy thành công của Apple
II đã khiến IBM bắt đầu một dự án cạnh tranh. Trái ngược với truyền thống của nó,
đối với dự án này, IBM đã thiết kế mọi thứ từ các thành phần bên ngoài công ty. Họ
đã chọn bộ vi xử lý 16 bit mới từ Intel, 8086. (Để giảm chi phí, họ bắt đầu với phiên
bản với bus 8 bit, được gọi là 8088.) Họ đã đến thăm Microsoft để xem liệu công ty
nhỏ này có sẵn sàng bán thông dịch viên cơ bản phổ biến của họ hay không và yêu
cầu đề xuất cho một hệ điều hành. Gates tình nguyện rằng Microsoft có thể cung cấp
cả thông dịch viên và hệ điều hành, miễn là họ được trả một khoản phí bản quyền từ
10 đến 50 đô la cho mỗi bản sao thay vì một khoản phí cố định.
IBM đồng ý, miễn là Microsoft có thể đáp ứng thời hạn. Microsoft didn có một hệ điều
hành, cũng không phải thời gian và nguồn lực để xây dựng một hệ điều hành, nhưng
Gates biết rằng một công ty Seattle đã phát triển một hệ điều hành cho Intel 8086.
Microsoft đã mua QDOS (Hệ điều hành nhanh và bẩn) với giá 15.000 đô la, thực hiện
một thay đổi nhỏ và dán nhãn lại là MS-DOS. MS-DOS là một hệ điều hành đơn giản
mà không có bất kỳ tính năng hiện đại nào, không có sự bảo vệ, không có quy trình và
không có bộ nhớ ảo nào vì họ tin rằng nó không cần thiết cho máy tính cá nhân.
Được công bố vào năm 1980, IBM PC đã trở thành một thành công to lớn cho
IBM và các công ty mà nó dựa vào. Microsoft đã bán được 500.000 bản MS-DOS
vào năm 1983 và thu nhập 10 triệu đô la cho phép Microsoft bắt đầu các dự án
phần mềm mới.
Sau khi thấy một phiên bản Macintosh đang được phát triển, Microsoft đã thuê một
số người từ PARC để dẫn dắt câu trả lời của mình. Macintosh được công bố vào năm
1984 và Windows đã có mặt trên PC vào năm sau. Ban đầu nó là một ứng dụng chạy
trên DOS, nhưng sau đó được tích hợp với DOS và đổi tên thành Windows 2.0.
Microsoft đã thuê Cutler từ DEC để lãnh đạo sự phát triển của Windows NT, một hệ
điều hành mới. NT là một hệ điều hành hiện đại với sự bảo vệ, bộ xử lý, và như vậy
và có nhiều điểm tương đồng với DEC VMS. Ngày nay, các hệ điều hành PC PC tinh
vi hơn bất kỳ hệ thống chia sẻ thời gian nào của 20 năm trước, tuy nhiên họ vẫn phải
chịu sự cần thiết phải duy trì khả năng tương thích với các hệ điều hành PC đầu tiên
bị tê liệt như MS-DOS .
Sự phổ biến của PC đã dẫn đến mong muốn về một UNIX chạy trên nó. Nhiều
người đã cố gắng phát triển một, nhưng thành công nhất được viết từ đầu năm 1991
bởi Linus Torvalds. Ngoài việc cung cấp mã nguồn, như BSD, anh ấy cho phép mọi
người thực hiện các thay đổi và gửi chúng để đưa vào bản phát hành tiếp theo của
mình. Linux phổ biến phát triển nguồn mở như chúng ta biết ngày nay, với phần
mềm như vậy khiến hàng trăm tình nguyện viên kiểm tra các bản phát hành và thêm
các tính năng mới.
495.e16 5.18 Quan điểm lịch sử và đọc thêm

Nhiều người trong câu chuyện này đã giành giải thưởng cho vai trò của họ
trong việc phát triển các hệ điều hành hiện đại. McCarthy đã nhận được một giải
thưởng ACM Turing vào năm 1971 một phần vì những đóng góp của ông cho
việc chia sẻ thời gian. Năm 1983, Thompson và Ritchie đã nhận được một chiếc
cho UNIX. Thông báo nói rằng, thiên tài của hệ thống UNIX là khuôn khổ của
nó, cho phép các lập trình viên đứng trên công việc của những người khác.Năm
1990, Corbato đã nhận được giải thưởng Turing cho những đóng góp của mình
cho CTSS và MULTICS. Hai năm sau, Lampson đã giành được nó một phần cho
công việc của mình trên hệ thống máy tính và vận hành cá nhân. Đồng nghiệp
Xerox PARC của anh, Thacker đã giành giải Turing năm 2009 vì sự phát triển
của anh ấy ở Alto.

Đọc thêm
Brooks, F. P. [1975]. Người đàn ông huyền thoại-thángĐọc: Addison-Wesley.
Cuốn sách kinh điển giải thích thách thức của kỹ thuật phần mềm sử dụng phát triển hệ điều hành IBM làm ví dụ.

Cantin, J. F. và M. D. Hill [2001]. Hiệu suất bộ đệm của bộ nhớ cache cho các điểm chuẩn SPEC
CPU2000 được chọn , TÌM KIẾM Tin tức kiến trúc máy tính 29: 4 (Tháng 9), 13 trận18.
Một tài liệu tham khảo về tỷ lệ bỏ lỡ bộ nhớ cache cho nhiều kích thước bộ đệm cho điểm chuẩn
SPEC2000.
Chen, P. M., E. K. Lee, G. A. Gibson, R. H. Katz và D. A. Patterson [1994]. RAID RAID: Lưu trữ thứ cấp
hiệu suất cao, đáng tin cậy , Khảo sát điện toán ACM 26: 2 (tháng 6) 145 Từ88.
Một hướng dẫn bao gồm các mảng đĩa và những lợi thế của một tổ chức như vậy.
Conti, C., D. H. Gibson và S. H. Pitowsky [1968]. Các khía cạnh cấu trúc của hệ thống / 360 Model 85, phần I :
Tổ chức chung , Hệ thống IBM J . 7: 1, 2 trận14.
Một bài báo cổ điển mô tả máy tính thương mại đầu tiên sử dụng bộ đệm và hiệu suất kết quả của nó.

Hennessy, J. và D. Patterson [2019]. Chương 5 trong Kiến trúc máy tính: Cách tiếp cận định lượng,
phiên bản thứ sáu, Morgan Kaufmann, Cambridge, MA .
Để biết thêm về phạm vi chuyên sâu của nhiều chủ đề bao gồm bảo vệ, hiệu suất bộ đệm của
bộ xử lý không theo thứ tự, bộ nhớ cache hầu như được xử lý, bộ nhớ cache đa cấp, tối ưu hóa
trình biên dịch, cơ chế dung sai độ trễ bổ sung và kết hợp bộ đệm.
Kilburn, T., D. B. G. Edwards, M. J. Lanigan và F. H. Sumner [1962]. Hệ thống lưu trữ một cấp độ của Nhật Bản ,
IRE Giao dịch trên máy tính điện tử EC-11 (tháng 4), 223 bóng335. Cũng xuất hiện trong D. P. Siewiorek, C.
G. Bell, và A. Newell [1982] , Cấu trúc máy tính: Nguyên tắc và ví dụ, McGraw-Hill, New York, 135 trận48.
Bài báo cổ điển này là đề xuất đầu tiên cho bộ nhớ ảo.
LaMarca, A. và R. E. Ladner [1996]. Ảnh hưởng của bộ nhớ cache đến hiệu suất của heaps , ACM J. của
Thuật toán thực nghiệm, Tập. 1.
Bài viết này cho thấy sự khác biệt giữa phân tích độ phức tạp của thuật toán, hiệu suất đếm lệnh
và phân cấp bộ nhớ cho bốn thuật toán sắp xếp.
McCalpin, J. D. [1995]. CúcSTREAM: Băng thông bộ nhớ bền vững trong máy tính hiệu suất
caoGiáo dục, https:// www.cs.virginia.edu/stream/.
Một microbenchmark được sử dụng rộng rãi để đo hiệu suất của hệ thống bộ nhớ phía sau bộ nhớ cache.
5.18 Quan điểm lịch sử và đọc thêm 495.e17

Patterson, D., G. Gibson và R. Katz [1988]. CúcMột trường hợp cho các mảng dư thừa của các đĩa
rẻ tiền (RAID)Hội nghị SIGMOD, 109 Từ116.
Một bài báo cổ điển ủng hộ các mảng của các đĩa nhỏ hơn và giới thiệu các cấp độ RAID.
Przybylski, S. A. [1990]. Thiết kế phân cấp bộ nhớ và bộ nhớ: Cách tiếp cận theo hướng hiệu suất,
Nhà xuất bản Morgan Kaufmann, San Francisco.
Một khám phá kỹ lưỡng về hệ thống phân cấp bộ nhớ đa cấp và hiệu suất của chúng.
Ritchie, D. [1984]. Sự phát triển của hệ thống chia sẻ thời gian UNIX Phòng thí nghiệm AT & T Bell Kỹ
thuật Tạp chí 1984, 1577 Từ1593.
Lịch sử của UNIX từ một trong những nhà phát minh của nó.
Ritchie, D. M. và K. Thompson [1978]. Hệ thống chia sẻ thời gian UNIX Tạp chí kỹ thuật hệ thống
chuông (Tháng 8), 1991 19912019.
Một bài báo mô tả hệ điều hành thanh lịch nhất từng được phát minh.
Silberschatz, A., P. Galvin và G. Grange [2003]. Khái niệm hệ điều hành, phiên bản thứ sáu, Addison-
Wesley, Reading, MA .
Một cuốn sách giáo khoa hệ điều hành với một cuộc thảo luận kỹ lưỡng về bộ nhớ ảo, quy trình
và quản lý quy trình và các vấn đề bảo vệ.
Smith, A. J. [1982]. Ký ức bộ nhớ cache, trực tiếp Khảo sát tính toán 14: 3 (Tháng 9), 473 bóng530.
Các bài khảo sát cổ điển về bộ nhớ cache. Bài viết này định nghĩa thuật ngữ cho lĩnh vực này và
đã phục vụ như một tài liệu tham khảo cho nhiều nhà thiết kế máy tính.
Smith, D. K. và R. C. Alexander [1988]. dò dẫm tương lai: Làm thế nào Xerox phát minh ra, sau đó
bỏ qua, đầu tiên Máy tính cá nhân, Morrow, New York.
Một cuốn sách nổi tiếng giải thích vai trò của Xerox PARC trong việc đặt nền tảng cho điện toán
ngày nay, nhưng Xerox không được hưởng lợi đáng kể từ đó.
Tanenbaum, A. [2001]. Hệ điều hành hiện đại, phiên bản thứ hai, Thượng Yên sông, Hội trường Prentice, NJ .
Một cuốn sách giáo khoa hệ điều hành với một cuộc thảo luận tốt về bộ nhớ ảo.
Wilkes, M. [1965]. Bộ nhớ nô lệ và phân bổ lưu trữ động IEEE Trans. Máy tính điện tử EC-14: 2
(Tháng 4), 270 trận71.
Các giấy cổ điển đầu tiên trên bộ nhớ cache.
496 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

11. Di chuyển thực phẩm đông lạnh từ tủ lạnh đến tủ đông tích hợp để bảo
quản để ăn sau
12. Di chuyển thức ăn giữa tủ đông độc lập và tủ đông tích hợp
13. Nhận thực phẩm mới từ cửa hàng tạp hóa để đặt trong tủ đông tích hợp

Khung đông lạnh. Mục 5.8 đưa ra một khung chung cho một bộ nhớ thứ bậc.
Những ý tưởng khung nào làm và không dịch sang thực phẩm lạnh?
Cs đông lạnh. Mục 5.8 cũng giải thích mô hình Three Cs trực quan để hiểu bộ
nhớ cache bị bỏ lỡ. Mà áp dụng ở đây? Đưa ra một sự tương tự cho mỗi cái hoạt
động, và giải thích tại sao không nếu nó không áp dụng.
Thất bại đông lạnhLiệt kê ít nhất ba ví dụ trong đó sự tương tự này không
được gần gũi. đến một hệ thống phân cấp bộ nhớ máy tính.
Máy ảo búaTại sao có thể lỗ hổng phần cứng của. không an toàn (như Row
Hammer trong Mục 5.18) đặc biệt đáng lo ngại đối với các công ty điện toán đám
mây như Amazon Web Services?

Câu trả lời tự học


Càng nhiều càng tốt?
Dưới đây là năm địa chỉ và kết quả tiếp theo :
Địa chỉ thập phân Địa chỉ nhị Đánh hay Khối bộ đệm được gán
của tài liệu tham phân bỏ lỡ (nơi tìm thấy hoặc đặt)
khảo của tài liệu trong bộ
tham khảo nhớ cache
18 10010 đánh (10010two mod 8) = 010two
20 10100 bỏ lỡ (10100two mod 8) = 110two
22 10110 đánh (10110two mod 8) = 110two
24 11000 bỏ lỡ (11000two mod 8) = 000two
26 11010 bỏ lỡ (11010two mod 8) = 010two

Hai hit và ba bỏ lỡ từ năm địa chỉ.


Đây là những gì bộ nhớ cache trông giống như sau địa chỉ 26.

Chỉ số v Thẻ Dữ liệu


000 Y 10 hai Bộ nhớ (11000two)
001 N
010 Y 10 hai Bộ nhớ (11010two)
011 Y 00two Bộ nhớ (00011two)
100 Y 10 hai Bộ nhớ (10100two)
101 N
110 Y 10 hai Bộ nhớ (10110two)
111 N
5.19 Tự học 497

Là sự kết hợp vui vẻ?


Các lỗi cho các khối 20 và 24 là các truy cập đầu tiên, vì vậy chúng là các lỗi bắt
buộc trong mô hình Three Cs và tính liên kết không thể giúp đỡ.
Khối 26 được tìm nạp ban đầu trong tham chiếu bộ nhớ thứ hai trong Mục 5.3
và được đặt trong bộ nhớ cache khối 2. Nó đã được thay thế bằng khối cho địa chỉ
18 ở bước thứ tám do bỏ lỡ xung đột trong bộ đệm được ánh xạ trực tiếp, vì nó
cũng ánh xạ tới khối 2. Bộ đệm liên kết hai chiều có thể tránh được sự bỏ lỡ xung
đột đó, tạo thêm một lần nữa trong năm địa chỉ này.
Để thực sự tìm ra tất cả các lần truy cập và bỏ lỡ, chúng tôi sẽ phải đánh giá
lại tất cả chín địa chỉ gốc và năm địa chỉ bổ sung này với một tổ chức liên kết hai
chiều để xem mỗi địa chỉ sẽ rơi vào đâu để xem toàn bộ tác động, khi thay đổi
ánh xạ địa chỉ với sự liên kết. Chúng tôi sẽ để nó như một bài tập cho người đọc
và đi với sự quan sát đơn giản về cơ hội tránh xung đột bỏ lỡ ở khối 26.

Tương tự đông lạnh


Có hai cách hiểu hợp lý về hệ thống phân cấp tùy thuộc vào việc bạn nghĩ rằng tủ
đông độc lập là bộ đệm cấp ba hay bộ nhớ chính. Chúng tôi sẽ đi với người cũ
trong câu trả lời này.
1. Bộ nhớ cache cấp một: Tủ lạnh trong bếp
2. Bộ nhớ cache cấp hai: Tủ đông tích hợp
3. Bộ đệm cấp ba: Bộ cấp đông độc lập trong nhà để xe hoặc tầng hầm
4. Bộ nhớ chính: Tủ đông thực phẩm đông lạnh tại một cửa hàng tạp hóa
5. Bộ nhớ phụ: Nhà cung cấp thực phẩm đông lạnh trong cửa hàng tạp hóa
6. Bộ nhớ cache cấp một đọc: Lấy thức ăn từ tủ lạnh để nấu
7. Bộ nhớ cache cấp một đọc thời gian nhấn: Thời gian để lấy thức ăn từ tủ lạnh
8. Bộ nhớ cache cấp một viết: Cho thực phẩm nấu chín vào tủ lạnh
9. Bỏ lỡ bộ nhớ cache cấp một sang bộ nhớ cache cấp hai: Di chuyển thực
phẩm đông lạnh từ tủ đông tích hợp vào tủ lạnh để tan băng trước khi
nấu
10. Bộ nhớ cache cấp hai đọc thời gian truy cập: Thời gian cần thiết để làm
tan băng thực phẩm từ tủ đông tích hợp
11. Lưu lượng giữa bộ đệm cấp một và bộ đệm cấp hai, chẳng hạn như bỏ lỡ
bộ đệm cấp một hoặc ghi lại: Di chuyển thực phẩm đông lạnh từ tủ lạnh
đến tủ đông tích hợp để bảo quản để ăn sau
12. Lưu lượng giữa bộ đệm cấp hai và bộ đệm cấp ba, chẳng hạn như bỏ lỡ bộ
đệm cấp một hoặc ghi lại: Di chuyển thức ăn giữa tủ đông độc lập và tủ
đông tích hợp
498 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

13. Đọc bỏ lỡ từ bộ nhớ cache cấp ba đến bộ nhớ chính: Lấy thực phẩm mới
từ cửa hàng tạp hóa để đặt trong tủ đông tích hợp

Khung đông lạnh


■ Trường hợp một khối có thể được đặt? Không có hạn chế về vị trí của thực
phẩm ở bất kỳ cấp độ nào trong sự tương tự đông lạnh của chúng tôi, vì vậy
tương đương gần nhất là vị trí kết hợp đầy đủ ở tất cả các cấp. Một ngoại lệ
là cửa hàng tạp hóa, nhóm các loại thực phẩm đông lạnh theo loại và có
một chỉ số trong cửa hàng tủ đông có loại thực phẩm.
■ Làm thế nào là một khối được tìm thấy? Với vị trí kết hợp đầy đủ, chúng
tôi tìm kiếm toàn bộ đơn vị lưu trữ lạnh (trừ cửa hàng tạp hóa).
■ Khối nào sẽ được thay thế trên một bộ đệm Miss? Hợp lý chúng tôi sẽ sử
dụng một phiên bản không chính thức của ít nhất được mua gần đây, sử
dụng ngày hết hạn trên gói.
■ Những gì xảy ra trên một văn bản? Trong khi hệ thống phân cấp bộ nhớ
thường sao chép dữ liệu thay vì di chuyển dữ liệu, chúng tôi không có tùy
chọn đó với các đối tượng vật lý, vì vậy tùy chọn gần nhất là ghi lại.

Cs đông lạnh.
Ba Cs là :
1. Bỏ lỡ bắt buộc
2. Công suất bỏ lỡ
3. Bỏ lỡ xung đột
Một sai lầm bắt buộc (rất buồn) là bạn muốn một đĩa kem sô cô la nhưng
không có trong tủ lạnh, tủ đông tích hợp hoặc tủ đông độc lập, bạn phải đến cửa
hàng tạp hóa để lấy một ít. Mặc dù kem sô cô la cũng có thể không có sẵn tại cửa
hàng tạp hóa, nhưng cũng bị lỗi trang đông lạnh!Họ có một số người, và bạn có
thể thỏa mãn mong muốn của mình nhưng chậm hơn nhiều so với bạn mong đợi
ban đầu.
Công suất bị bỏ lỡ cũng có ý nghĩa, trong đó vật phẩm mong muốn không
phải là cấp độ bạn muốn bởi vì có đủ chỗ để bao gồm nó, vì vậy bạn cần lấy lại
từ cấp thấp hơn tiếp theo.
Giống như trường hợp với bộ nhớ cache thực, với vị trí kết hợp đầy đủ, không
có bỏ lỡ xung đột.
Thất bại đông lạnh. Dưới đây là những trường hợp tương tự không hoạt động.
1. Kích thước khối cố định. Thực phẩm có đủ loại hình dạng và kích thước,
vì vậy không có tương đương với một khối. Gần nhất sẽ là các bữa ăn
quân sự sẵn sàng để ăn (MRE), điều may mắn không phải là những gì hầu
hết mọi người ăn.
5.20 Bài tập 499

2. Địa phương không gian. Vì chúng tôi không có kích thước khối, thật khó
để tìm ra tương tự như địa phương không gian. Ngoại lệ là cửa hàng tạp
hóa, nơi có nhiều bản sao của mặt hàng mong muốn liền kề về mặt vật lý,
do đó trưng bày địa phương không gian.
3. Bộ nhớ cache cấp ba ghi lại. Nó không chắc là cửa hàng tạp hóa của bạn
sẽ cho phép bạn trả lại thức ăn từ tủ đông độc lập của bạn bằng cách giải
thích về việc tôi đã sử dụng mặt hàng này trong một thời gian dài và tôi
cần giữ một thứ khác trong tủ đông độc lập của mình, vì vậy bạn sẽ lưu trữ
mặt hàng này cho tôi cho đến khi tôi cần?Giáo dục
4. Đầu tiên-bỏ lỡ bộ nhớ cache cấp và tính toàn vẹn dữ liệu. Trong khi sự
tương tự hoạt động khá cũng giữa các tủ đông, hầu hết các loại thực phẩm
không thể được làm tan băng và đông lạnh nhiều lần mà không làm hỏng,
do đó, có một vấn đề tương tự đối với các bộ nhớ cấp một bị bỏ lỡ. Tương
đương với máy tính sẽ là dữ liệu bị hủy sau một số lần bỏ bộ nhớ cache,
điều này sẽ rất thảm khốc nếu đúng là bộ nhớ cache sẽ không bao giờ được
sử dụng.
5. Bao gồm các cấp độ. Chính sách bộ nhớ cache phổ biến nhất của bao gồm có
nghĩa là rằng mọi mục dữ liệu ở một cấp độ của bộ đệm cũng ở cấp độ thấp
nhất tiếp theo, vì nó dễ dàng tạo các bản sao của dữ liệu. (Viết lại và các tình
huống khác có thể dẫn đến các giá trị không nhất quán, nhưng một số phiên
bản dữ liệu ở mức thấp hơn.) Chúng tôi không thể tạo ngay các bản sao của
các đối tượng vật lý cho các cấp thấp hơn, vì vậy chúng tôi đang tuân theo
chính sách độc quyền nơi dữ liệu chỉ tồn tại ở một cấp độ.
Máy ảo búaCác công ty như Amazon Web Services có thể. cung cấp giá đám
mây thấp bằng cách có nhiều máy ảo chia sẻ một máy chủ. Đối số là sự bảo vệ
được cung cấp bởi bộ nhớ ảo và máy ảo giúp các đối thủ cạnh tranh chạy cùng
lúc trên cùng một phần cứng, vì họ không thể truy cập dữ liệu nhạy cảm của
nhau miễn là AWS đảm bảo không có lỗi bảo mật nào trong các phần mềm này
cơ chế. Một cuộc tấn công phần cứng như búa hàng có nghĩa là ngay cả khi phần
mềm hoàn hảo, đối thủ vẫn có thể chiếm lấy máy chủ và tìm hiểu dữ liệu nhạy
cảm từ các đối thủ cạnh tranh.
Do những điểm yếu tiềm ẩn như vậy, AWS cung cấp cho khách hàng tùy chọn
đảm bảo rằng chỉ các tác vụ từ tổ chức của bạn chạy tại các máy chủ bạn đang sử
dụng, mặc dù bảo đảm này có giá cao hơn 5% mỗi giờ vào năm 2020.

5.20 Bài tập

Giả sử bộ nhớ có thể định địa chỉ byte và các từ là 64 bit, trừ khi có quy định
khác.
5.1 Trong bài tập này, chúng tôi xem xét các thuộc tính cục bộ bộ nhớ của tính
toán ma trận. Mã sau được viết bằng C, trong đó các phần tử trong cùng một
hàng được lưu trữ liền kề. Giả sử mỗi từ là một số nguyên 64 bit.
500 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

cho (I = 0; I <8; I ++)


cho (J = 0; J <8000; J ++)
A [I] [J] = B [I] [0] + A [J] [I];

5.1.1 [5] <§5.1> Có bao nhiêu số nguyên 64 bit có thể được lưu trữ trong bộ
đệm 16 byte khối?
5.1.2 [5] <§5.1> Những tài liệu tham khảo biến thể hiện địa phương thời gian?
5.1.3 [5] <§5.1> Những tài liệu tham khảo biến thể hiện địa phương không
gian?
Địa phương bị ảnh hưởng bởi cả thứ tự tham chiếu và bố cục dữ liệu. Tính toán
tương tự cũng có thể được viết dưới đây trong Matlab, khác với C ở chỗ nó lưu
trữ các phần tử ma trận trong cùng một cột tiếp giáp với bộ nhớ.
cho tôi = 1: 8
cho J = 1: 8000
A (I, J) = B (I, 0) + A (J, I);
kết thúc
kết thúc

5.1.4 [5] <§5.1> Những tài liệu tham khảo biến thể hiện địa phương thời gian?
5.1.5 [5] <§5.1> Những tài liệu tham khảo biến thể hiện địa phương không
gian?
5.1.6 [15] <§5.1> Cần bao nhiêu khối bộ nhớ cache 16 byte để lưu trữ tất cả 64
bit các phần tử ma trận được tham chiếu bằng cách sử dụng bộ lưu trữ ma trận
Matlab? Có bao nhiêu sử dụng lưu trữ ma trận C? (Giả sử mỗi hàng chứa nhiều
hơn một phần tử.)

5.2 Bộ nhớ cache rất quan trọng để cung cấp một hệ thống phân cấp bộ nhớ
hiệu suất cao để xử lý. Dưới đây là danh sách các tham chiếu địa chỉ bộ nhớ 64
bit, được cung cấp dưới dạng địa chỉ từ.
0x03, 0xb4, 0x2b, 0x02, 0xbf, 0x58, 0xbe, 0x0e, 0xb5, 0x2c, 0xba, 0xfd

5.2.1 [10] <§5.3> Đối với mỗi tài liệu tham khảo này, xác định từ nhị phân địa
chỉ, thẻ và chỉ mục được cung cấp bộ đệm được ánh xạ trực tiếp với 16 khối một
từ. Cũng liệt kê xem mỗi tham chiếu là một hit hay bỏ lỡ, giả sử bộ đệm ban đầu
trống.
5.2.2 [10] <§5.3> Đối với mỗi tài liệu tham khảo này, xác định địa chỉ từ nhị
phân , thẻ, chỉ mục và phần bù được cung cấp bộ đệm được ánh xạ trực tiếp với
các khối hai từ và tổng kích thước của tám khối. Cũng liệt kê nếu mỗi tham chiếu
là một lần nhấn hoặc bỏ lỡ, giả sử bộ đệm ban đầu trống.
5.20 Bài tập 501

5.2.3 [20] <§ §5.3, 5.4> Bạn được yêu cầu tối ưu hóa một thiết kế bộ nhớ
cache cho đã cho tài liệu tham khảo. Có ba thiết kế bộ nhớ cache được ánh xạ
trực tiếp có thể, tất cả đều có tổng cộng tám từ dữ liệu :
n C1 có khối 1 từ ,

n C2 có các khối 2 từ và
n C3 có khối 4 từ.

5.3 Theo quy ước, bộ đệm được đặt tên theo lượng dữ liệu mà nó chứa (tức là., bộ
nhớ cache 4 KiB có thể chứa 4 KiB dữ liệu); tuy nhiên, bộ nhớ cache cũng yêu cầu
SRAM lưu trữ siêu dữ liệu như thẻ và bit hợp lệ. Đối với bài tập này, bạn sẽ kiểm tra
cách cấu hình bộ đệm bộ nhớ cache ảnh hưởng đến tổng lượng SRAM cần thiết để
thực hiện nó cũng như hiệu suất của bộ đệm. Đối với tất cả các phần, giả sử rằng các
bộ nhớ cache được ánh xạ trực tiếp, có thể định địa chỉ byte và các địa chỉ và các từ
là 32 bit.
5.3.1 [10] <§5.3> Tính tổng số bit cần thiết để thực hiện 32 Bộ nhớ cache KiB
với các khối hai từ.
5.3.2 [10] <§5.3> Tính tổng số bit cần thiết để thực hiện a Bộ nhớ cache 64
KiB với các khối 16 từ. Bộ nhớ cache này lớn hơn bao nhiêu so với bộ đệm 32
KiB được mô tả trong Bài tập 5.3.1? (Lưu ý rằng, bằng cách thay đổi kích thước
khối, chúng tôi đã nhân đôi lượng dữ liệu mà không tăng gấp đôi tổng kích thước
của bộ đệm.)
5.3.3 [5] <§5.3> Giải thích tại sao bộ đệm 64 KiB này, mặc dù kích thước dữ
liệu lớn hơn, có thể cung cấp hiệu suất chậm hơn bộ đệm đầu tiên.
5.3.4 [10] <§ §5.3, 5.4> Tạo một loạt các yêu cầu đọc có bỏ lỡ thấp hơn tốc độ
trên bộ đệm kết hợp hai chiều 32 KiB so với bộ đệm được mô tả trong Bài tập
5.3.1.
5.4 [15] <§5.3> Mục 5.3 cho thấy phương pháp điển hình để lập chỉ mục một ánh xạ
trực tiếp bộ đệm, cụ thể là modulo (Địa chỉ khối) (Số khối trong bộ đệm). Giả sử địa chỉ
32 bit và 1024 khối trong bộ đệm, hãy xem xét một chức năng lập chỉ mục khác, cụ thể
(Địa chỉ khối [63:54] Địa chỉ khối XOR [53:44]). Có thể sử dụng điều này để lập chỉ mục
bộ đệm được ánh xạ trực tiếp? Nếu vậy, hãy giải thích lý do và thảo luận về bất kỳ thay
đổi nào có thể cần phải được thực hiện đối với bộ đệm. Nếu không thể, hãy giải thích tại
sao.

5.5 Đối với thiết kế bộ đệm được ánh xạ trực tiếp với địa chỉ 32 bit, các bit sau
đây địa chỉ được sử dụng để truy cập bộ đệm.
Thẻ Chỉ Bù đắp
số
63 con10
9 trận5 4
con0

5.5.1 [5] <§5.3> Kích thước khối bộ đệm (tính bằng từ) là gì?
502 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

5.5.2 [5] <§5.3> Bộ nhớ cache có bao nhiêu khối?


5.5.3 [5] <§5.3> Tỷ lệ giữa tổng số bit cần thiết cho bộ đệm như vậy là bao
nhiêu thực hiện trên các bit lưu trữ dữ liệu?
Bắt đầu từ nguồn trên, các tham chiếu bộ đệm được giải quyết bằng byte sau
được ghi lại.
Địa chỉ
Hex 00 04 10 84 E8 A0 400 1E 8C C1C B4 884
Thán
g 12 0 4 16 132 232 160 1024 30 140 3100 180 2180

5.5.4 [20] <§5.3> Đối với mỗi tham chiếu, hãy liệt kê (1) thẻ, chỉ mục và phần
bù của nó, (2) cho dù đó là một cú đánh hoặc bỏ lỡ và (3) byte nào được thay thế
(nếu có).
5.5.5 [5] <§5.3> Tỷ lệ trúng là gì?
5.5.6 [5] <§5.3> Liệt kê trạng thái cuối cùng của bộ đệm, với mỗi mục nhập
hợp lệ được biểu thị dưới dạng bản ghi <chỉ mục, thẻ, dữ liệu>. Ví dụ,
<0, 3, Mem [0xC00] -Mem [0xC1F]>

5.6 Hãy nhớ lại rằng chúng tôi có hai chính sách viết và hai chính sách phân bổ
ghi, và sự kết hợp của chúng có thể được thực hiện trong bộ đệm L1 hoặc L2.
Giả sử các lựa chọn sau cho bộ nhớ cache L1 và L2 :
L1 L2
Viết qua, không phân bổ ghi Viết lại, viết phân bổ

5.6.1 [5] <§ §5.3, 5.8> Bộ đệm được sử dụng giữa các cấp độ khác nhau của bộ
nhớ phân cấp để giảm độ trễ truy cập. Đối với cấu hình đã cho này, hãy liệt kê các bộ
đệm có thể cần thiết giữa bộ đệm L1 và L2, cũng như bộ nhớ đệm và bộ nhớ L2.
5.6.2 [20] <§ §5.3, 5.8> Mô tả quy trình xử lý một chữ viết L1 , xem xét các thành
phần liên quan và khả năng thay thế một khối bẩn.
5.6.3 [20] <§ §5.3, 5.8> Đối với cấu hình bộ đệm độc quyền đa cấp (một khối
chỉ có thể cư trú tại một trong các bộ nhớ L1 và L2), mô tả các quy trình xử lý lỗi
ghi L1 và bỏ lỡ đọc L1, xem xét các thành phần liên quan và khả năng thay thế
khối bẩn.

5.7 Hãy xem xét các hành vi chương trình và bộ nhớ cache sau đây.
Bộ nhớ cache Bộ nhớ cache Kích thước
Dữ liệu đọc mỗi Dữ liệu ghi trên mỗi hướng dẫn dữ liệu khối
1000 Hướng dẫn 1000 Hướng dẫn Tỷ lệ hoa hậu Tỷ lệ hoa hậu (byte)
250 100 0,30% 2% 64
5.20 Bài tập 503

5.7.1 [10] <§ §5.3, 5.8> Giả sử CPU có ghi thông qua, phân bổ ghi bộ nhớ
cache đạt được CPI là 2. Băng thông đọc và ghi (được đo bằng byte trên mỗi chu
kỳ) giữa RAM và bộ đệm? (Giả sử mỗi lần bỏ lỡ tạo ra một yêu cầu cho một
khối.)
5.7.2 [10] <§ §5.3, 5.8> Đối với bộ nhớ cache ghi lại, phân bổ ghi, giả sử 30%
của các khối bộ đệm dữ liệu được thay thế là bẩn, băng thông đọc và ghi cần
thiết cho CPI là 2?

5,8 Các ứng dụng truyền thông phát tệp âm thanh hoặc video là một phần của
một loại khối lượng công việc được gọi là khối lượng công việc phát trực tuyến
của người Viking (tức là., họ mang lại một lượng lớn dữ liệu nhưng không sử
dụng lại nhiều dữ liệu). Hãy xem xét khối lượng công việc phát trực tuyến video
truy cập vào bộ làm việc 512 KiB theo tuần tự với luồng địa chỉ từ sau :
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 . . .

5.8.1 [10] <§ §5.4, 5.8> Giả sử bộ đệm được ánh xạ trực tiếp 64 KiB với 32
byte khối. Tỷ lệ bỏ lỡ cho luồng địa chỉ ở trên là gì? Làm thế nào là tỷ lệ bỏ lỡ
này nhạy cảm với kích thước của bộ đệm hoặc bộ làm việc? Làm thế nào bạn sẽ
phân loại các bỏ lỡ khối lượng công việc này đang trải qua, dựa trên mô hình 3C?
5.8.2 [5] <§ §5.1, 5.8> Tính lại tốc độ bỏ lỡ khi kích thước khối bộ đệm là 16 byte,
64 byte và 128 byte. Loại địa phương này là khai thác khối lượng công việc?
5.8.3 [10] <§5.13> Prefetching là một kỹ thuật tận dụng địa chỉ có thể dự đoán
được các mẫu để mang lại các khối bộ đệm bổ sung khi truy cập một khối bộ đệm cụ
thể. Một ví dụ về tiền xử lý là bộ đệm luồng đặt trước các khối bộ đệm liền kề tuần
tự thành một bộ đệm riêng khi một khối bộ đệm cụ thể được đưa vào. Nếu dữ liệu
được tìm thấy trong bộ đệm prefetch, nó được coi là một lần nhấn, được chuyển vào
bộ đệm và khối bộ đệm tiếp theo được tìm nạp trước. Giả sử bộ đệm luồng hai mục
nhập; và, giả sử rằng độ trễ của bộ đệm sao cho khối bộ đệm có thể được tải trước
khi tính toán trên khối bộ đệm trước đó được hoàn thành. Tỷ lệ bỏ lỡ cho luồng địa
chỉ ở trên là gì?

5.9 Kích thước khối bộ đệm (B) có thể ảnh hưởng đến cả tốc độ bỏ lỡ và độ trễ
bỏ lỡ. Giả sử a máy có CPI cơ sở là 1 và trung bình 1,35 tài liệu tham khảo (cả
hướng dẫn và dữ liệu) cho mỗi hướng dẫn, tìm kích thước khối giảm thiểu tổng
độ trễ bỏ lỡ với tốc độ bỏ lỡ sau cho các kích thước khối khác nhau.
8: 4% 16: 3% 32: 2% 64: 1,5% 128: 1%

5.9.1 [10] <§5.3> Kích thước khối tối ưu cho độ trễ bỏ lỡ là 20 là bao nhiêu ×
B chu kỳ?
5.9.2 [10] <§5.3> Kích thước khối tối ưu cho độ trễ bỏ lỡ là 24 là bao nhiêu +
B chu kỳ?
504 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

5.9.3 [10] <§5.3> Đối với độ trễ bỏ lỡ liên tục, kích thước khối tối ưu là gì?

5.10 Trong bài tập này, chúng tôi sẽ xem xét các cách khác nhau mà năng lực
ảnh hưởng đến tổng thể hiệu suất. Nói chung, thời gian truy cập bộ đệm tỷ lệ
thuận với công suất. Giả sử rằng các truy cập bộ nhớ chính mất 70 ns và 36% tất
cả các hướng dẫn truy cập bộ nhớ dữ liệu. Bảng sau đây hiển thị dữ liệu cho bộ
nhớ cache L1 được đính kèm với mỗi hai bộ xử lý, P1 và P2.
Kích
P1 thước
L1 L1 Miss Rate L1 Hit Time
P2
2 KiB 8,0% 0,66 ns
4 KiB 6.0% 0,90 ns

5.10.1 [5] <§5.4> Giả sử rằng thời gian nhấn L1 xác định thời gian chu kỳ cho
P1 và P2, tốc độ đồng hồ tương ứng của chúng là bao nhiêu?
5.10.2 [10] <§5.4> Thời gian truy cập bộ nhớ trung bình cho P1 và P2 là bao
nhiêu (trong chu kỳ)?
5.10.3 [5] <§5.4> Giả sử CPI cơ bản là 1.0 mà không có bất kỳ bộ nhớ nào, đó
là gì tổng CPI cho P1 và P2? Bộ xử lý nào nhanh hơn? (Khi chúng tôi nói CPI cơ
sở của 1.0 1.0, chúng tôi có nghĩa là các hướng dẫn hoàn thành trong một chu kỳ,
trừ khi truy cập lệnh hoặc truy cập dữ liệu gây ra lỗi bộ đệm.)
Đối với ba vấn đề tiếp theo, chúng tôi sẽ xem xét việc bổ sung bộ đệm L2 vào P1
(có lẽ là để bù cho dung lượng bộ đệm L1 giới hạn của nó). Sử dụng dung lượng
bộ đệm L1 và thời gian nhấn từ bảng trước khi giải quyết các vấn đề này. Tỷ lệ
bỏ lỡ L2 được chỉ định là tỷ lệ bỏ lỡ cục bộ của nó.
Kích L2 Miss Rate L2 Hit Time
thước
L2
1 MiB 95% 5,62 ns

5.10.4 [10] <§5.4> AMAT cho P1 là gì với việc bổ sung bộ đệm L2?
AMAT tốt hơn hay xấu hơn với bộ đệm L2?
5.10.5 [5] <§5.4> Giả sử CPI cơ bản là 1.0 mà không có bất kỳ bộ nhớ nào, cái
gì là tổng CPI cho P1 với việc thêm bộ đệm L2?
5.10.6 [10] <§5.4> Tỷ lệ bỏ lỡ L2 sẽ cần gì để có được P1 bộ đệm L2 nhanh
hơn P1 mà không có bộ đệm L2?
5.10.7 [15] <§5.4> Tỷ lệ bỏ lỡ L2 sẽ cần gì để có được P1 bộ đệm L2 nhanh
hơn P2 mà không có bộ đệm L2?

5.11 Bài tập này xem xét hiệu quả của các thiết kế bộ nhớ cache khác nhau, cụ
thể so sánh bộ nhớ cache liên kết với bộ nhớ cache được ánh xạ trực tiếp từ Mục
5.4Đối với các bài tập này, tham khảo chuỗi địa chỉ từ được hiển thị bên dưới.
0x03, 0xb4, 0x2b, 0x02, 0xbe, 0x58, 0xbf, 0x0e, 0x1f, 0xb5, 0xbf, 0xba, 0x2e,
0xce
5.20 Bài tập 505

5.11.1 [10] <§5.4> Phác thảo tổ chức bộ đệm kết hợp ba chiều với các khối hai
từ và tổng kích thước 48 từ. Bản phác thảo của bạn nên có một phong cách tương
tự Hình 5.18, nhưng hiển thị rõ ràng chiều rộng của các trường thẻ và dữ liệu.
5.11.2 [10] <§5.4> Theo dõi hành vi của bộ đệm từ Bài tập 5.11.1. Giả sử một
chính sách thay thế LRU thực sự. Đối với mỗi tài liệu tham khảo, xác định
n địa chỉ từ nhị phân ,

n thẻ,
n chỉ số,
n sự bù đắp
n cho dù tài liệu tham khảo là một hit hay bỏ lỡ, và
n thẻ nào theo từng cách của bộ đệm sau khi tham chiếu đã được xử lý.
5.11.3 [5] <§5.4> Phác thảo tổ chức bộ đệm kết hợp đầy đủ với các khối một
từ và tổng kích thước tám từ. Bản phác thảo của bạn nên có một phong cách
tương tự Hình 5.18, nhưng hiển thị rõ ràng chiều rộng của các trường thẻ và dữ
liệu.
5.11.4 [10] <§5.4> Theo dõi hành vi của bộ đệm từ Bài tập 5.11.3. Giả sử một
chính sách thay thế LRU thực sự. Đối với mỗi tài liệu tham khảo, xác định
n địa chỉ từ nhị phân ,

n thẻ,
n chỉ số,
n bù đắp ,
n cho dù tài liệu tham khảo là một hit hay bỏ lỡ, và
n nội dung của bộ đệm sau mỗi tham chiếu đã được xử lý.
5.11.5 [5] <§5.4> Phác thảo tổ chức của bộ đệm kết hợp đầy đủ với các khối
hai từ và tổng kích thước tám từ. Bản phác thảo của bạn nên có một phong cách
tương tự Hình 5.18, nhưng hiển thị rõ ràng chiều rộng của các trường thẻ và dữ
liệu.
5.11.6 [10] <§5.4> Theo dõi hành vi của bộ đệm từ Bài tập 5.11.5. Giả sử một
chính sách thay thế LRU. Đối với mỗi tài liệu tham khảo, xác định
n địa chỉ từ nhị phân ,

n thẻ,
n chỉ số,
n bù đắp ,
n cho dù tài liệu tham khảo là một hit hay bỏ lỡ, và
n nội dung của bộ đệm sau mỗi tham chiếu đã được xử lý.
506 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

5.11.7 [10] <§5.4> Lặp lại bài tập 5.11.6 bằng MRU (gần đây nhất được sử
dụng)
thay thế.
5.11.8 [15] <§5.4> Lặp lại Bài tập 5.11.6 bằng chính sách thay thế tối ưu (tức
là., một trong đó đưa ra tỷ lệ bỏ lỡ thấp nhất).

5.12 Bộ nhớ đệm đa cấp là một kỹ thuật quan trọng để khắc phục giới hạn
lượng không gian mà bộ đệm cấp một có thể cung cấp trong khi vẫn duy trì tốc
độ của nó. Hãy xem xét một bộ xử lý với các tham số sau :
Các quầy hàng

Liên kết tốc độ


Căn CPI, không có

Đầu Cấp độ Cache

Bộ nhớ cache cấp


Tỷ lệ mỗi chỉ dẫn**

hai tốc độ ánh xạ

Đặt liên kết


Chín Truy cập bộ
Tốc độ bộ xử lý

Thời gian

Cấp

tám
độ,

chi
ều
Tám c hiề u
Ánh xạ
cứ bộ nhớ

Tỷ lệ hoa hậu với thứ


Bộ nhớ cache cấp
trực tiếp ,
nhớ

tiên- Miss

Cấp độ, Tr ực t iế p-
Tỷ lệ hoa hậu với thứ
h

hai ,

hai-
hai-

1.5 2 100 ns 7% 12 chu kỳ 3,5% 28 chu kỳ 1,5%


GHz
Tỷ lệ bỏ lỡ bộ nhớ cache cấp một là theo hướng dẫn. Giả sử tổng số bộ nhớ cache L1 bị
**
bỏ lỡ (hướng dẫn và dữ liệu kết hợp) bằng 7% số lượng hướng dẫn.

5.12.1 [10] <§5.4> Tính CPI cho bộ xử lý trong bảng bằng cách sử dụng: 1) chỉ
có bộ đệm cấp một, 2) bộ đệm được ánh xạ trực tiếp cấp hai và 3) bộ đệm kết hợp
tám cấp độ hai. Làm thế nào để những con số này thay đổi nếu thời gian truy cập
bộ nhớ chính tăng gấp đôi? (Cung cấp cho mỗi thay đổi dưới dạng cả CPI tuyệt
đối và thay đổi phần trăm.) Lưu ý mức độ mà bộ đệm L2 có thể che giấu các hiệu
ứng của bộ nhớ chậm.
5.12.2 [10] <§5.4> Có thể có một hệ thống phân cấp bộ đệm thậm chí còn lớn
hơn hai cấp độ? Với bộ xử lý ở trên với bộ đệm được ánh xạ trực tiếp cấp hai,
một nhà thiết kế muốn thêm bộ đệm cấp ba mất 50 chu kỳ để truy cập và sẽ có tỷ
lệ bỏ lỡ 13%. Điều này sẽ cung cấp hiệu suất tốt hơn? Nói chung, những lợi thế
và bất lợi của việc thêm bộ đệm cấp ba là gì?
5.12.3 [20] <§5.4> Trong các bộ xử lý cũ hơn, chẳng hạn như Intel Pentium
hoặc Alpha 21264, cấp độ bộ đệm thứ hai là bên ngoài (nằm trên một con chip
khác) từ bộ xử lý chính và bộ đệm cấp một. Mặc dù điều này cho phép các bộ
nhớ cấp hai lớn, độ trễ để truy cập bộ đệm cao hơn nhiều và băng thông thường
thấp hơn vì bộ đệm cấp hai chạy ở tần số thấp hơn. Giả sử bộ đệm cấp hai 512
KiB off-chip có tỷ lệ bỏ lỡ là 4%. Nếu mỗi bộ nhớ cache 512 KiB bổ sung giảm
0,7% và bộ đệm có tổng thời gian truy cập là 50 chu kỳ, thì bộ đệm sẽ lớn đến
mức nào để phù hợp với hiệu suất của bộ đệm được ánh xạ trực tiếp cấp hai được
liệt kê ở trên ?
5.20 Bài tập 507

5.13 Thời gian trung bình giữa những thất bại (MTBF) , có nghĩa là thời gian
để thay thế (MTTR) , và có nghĩa là thời gian để thất bại (MTTF) là các số liệu
hữu ích để đánh giá độ tin cậy và tính sẵn có của tài nguyên lưu trữ. Khám phá
các khái niệm này bằng cách trả lời các câu hỏi về một thiết bị có các số liệu sau :
MTTF MTTR
3 năm 1 ngày

5.13.1 [5] <§5,5> Tính MTBF cho một thiết bị như vậy.
5.13.2 [5] <§5,5> Tính toán tính khả dụng cho một thiết bị như vậy.
5.13.3 [5] <§5,5> Điều gì xảy ra với tính khả dụng khi MTTR tiếp cận 0? Là
đây là một tình huống thực tế?
5.13.4 [5] <§5,5> Điều gì xảy ra với tính khả dụng khi MTTR trở nên rất cao, tức
là., một thiết bị rất khó sửa chữa? Điều này có nghĩa là thiết bị có tính sẵn sàng thấp?

5.14 Bài tập này kiểm tra sửa lỗi đơn, phát hiện lỗi kép (SEC / DED) Mã
Hamming.
5.14.1 [5] <§5,5> Số lượng bit chẵn lẻ tối thiểu cần thiết để bảo vệ là bao
nhiêu một từ 128 bit sử dụng mã SEC / DED?
5.14.2 [5] <§5,5> Mục 5.5 nói rằng các mô-đun bộ nhớ máy chủ hiện đại (DIMM)
sử dụng SEC / DED ECC để bảo vệ mỗi 64 bit với 8 bit chẵn lẻ. Tính tỷ lệ chi phí /
hiệu suất của mã này với mã từ Bài tập 5.14.1. Trong trường hợp này, chi phí là số
bit chẵn lẻ tương đối cần thiết trong khi hiệu suất là số lỗi tương đối có thể được sửa.
Cái nào tốt hơn?
5.14.3 [5] <§5,5> Hãy xem xét một mã SEC bảo vệ các từ 8 bit với 4 chẵn lẻ
bit. Nếu chúng ta đọc giá trị 0x375, có lỗi không? Nếu vậy, sửa lỗi.

5.15 Đối với một hệ thống hiệu suất cao như chỉ mục cây B cho cơ sở dữ liệu,
thì kích thước trang được xác định chủ yếu bởi kích thước dữ liệu và hiệu suất
đĩa. Giả sử rằng, trung bình, trang chỉ mục cây B đầy 70% với các mục có kích
thước cố định. Tiện ích của một trang là độ sâu cây B của nó, được tính là nhật
ký2(mục nhập). Bảng sau đây cho thấy đối với các mục nhập 16 byte và đĩa 10
năm tuổi có độ trễ 10 ms và tốc độ truyền 10 MB / giây, kích thước trang tối ưu
là 16 K .
Tiện ích trang hoặc Độ sâu Chỉ mục chi
cây B (Số lượng truy cập phí truy cập
Kích thước đĩa đã lưu) trang (ms) Tiện ích / Chi phí
trang (KiB)
6,49 (hoặc nhật ký2(2048/16 ×
2 0,7)) 10.2 0,64
4 7,49 10.4 0,72
số 8 8,49 10.8 0,79
16 9,49 11.6 0,82
32 10,49 13.2 0,79
508 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

Tiện ích trang hoặc Độ sâu Chỉ mục chi


cây B (Số lượng truy cập phí truy cập
Kích thước đĩa đã lưu) trang (ms) Tiện ích / Chi
trang (KiB) phí
64 11,49 16.4 0,70
128 12,49 22.8 0,55
256 13,49 35.6 0,38

5.15.1 [10] <§5.7> Kích thước trang tốt nhất là gì nếu các mục bây giờ trở thành
128 byte?
5.15.2 [10] <§5.7> Dựa trên Bài tập 5.15.1, kích thước trang tốt nhất là gì nếu
các trang đã đầy một nửa?
5.15.3 [20] <§5.7> Dựa trên Bài tập 5.15.2, kích thước trang tốt nhất là gì nếu
sử dụng một đĩa hiện đại với độ trễ 3 ms và tốc độ truyền 100 MB / s? Giải thích
tại sao các máy chủ trong tương lai có khả năng có các trang lớn hơn.
Giữ các trang thường xuyên được sử dụng (hoặc nóng nóng) trong DRAM có thể
lưu quyền truy cập đĩa, nhưng làm thế nào để chúng tôi xác định ý nghĩa chính
xác của việc sử dụng thường xuyên cho một hệ thống nhất định? Các kỹ sư dữ
liệu sử dụng tỷ lệ chi phí giữa DRAM và truy cập đĩa để định lượng ngưỡng thời
gian sử dụng lại cho các trang nóng. Chi phí truy cập đĩa là $ Đĩa / accesses_per_
giây, trong khi chi phí để giữ một trang trong DRAM là $ DRAM_MiB /
page_size. DRAM và chi phí đĩa điển hình và kích thước trang cơ sở dữ liệu điển
hình tại một số điểm thời gian được liệt kê dưới đây :
Chi phí Kích Chi phí Tỷ lệ truy cập đĩa
Năm DRAM thước đĩa (truy cập / giây)
($ / MiB) trang ($ / đĩa)
(KiB)
1987 5000 1 15.000 15
1997 15 số 8 2000 64
2007 0,05 64 80 83

5.15.4 [20] <§5.7> Những yếu tố khác có thể được thay đổi để tiếp tục sử dụng
như nhau kích thước trang (do đó tránh viết lại phần mềm)? Thảo luận về sự
giống nhau của họ với công nghệ hiện tại và xu hướng chi phí.

5.16 Như được mô tả trong Mục 5.7, bộ nhớ ảo sử dụng bảng trang để theo dõi
ánh xạ các địa chỉ ảo đến các địa chỉ vật lý. Bài tập này cho thấy cách bảng này
phải được cập nhật khi địa chỉ được truy cập. Các dữ liệu sau đây tạo thành một
luồng các địa chỉ byte ảo như được thấy trên một hệ thống. Giả sử 4 trang KiB,
TLB kết hợp đầy đủ bốn mục nhập và thay thế LRU thực sự. Nếu các trang phải
được đưa vào từ đĩa, hãy tăng số trang lớn nhất tiếp theo.
Số thập
phân 4669 2227 13916 34587 48870 12608 49225
hex 0x123d 0x08b3 0x365c 0x871b 0xbee6 0x3140 0xc049
5.20 Bài tập 509

TLB
Trang vật lý Thời gian kể từ
Có giá Thẻ Số cuối cùng
trị Truy cập
1 0xb 12 4
1 0x7 4 1
1 0x3 6 3
0 0x4 9 7

Bảng trang
Chỉ Có Trang vật lý hoặc trong đĩa
số giá
trị
0 1 5
1 0 Đĩa
2 0 Đĩa
3 1 6
4 1 9
5 1 11
6 0 Đĩa
7 1 4
số 8 0 Đĩa
9 0 Đĩa
a 1 3
b 1 12

5.16.1 [10] <§5.7> Đối với mỗi truy cập được hiển thị ở
trên, danh sách n cho dù truy cập là một hit hay bỏ lỡ
trong TLB ,

n cho dù truy cập là một hit hay bỏ lỡ trong bảng


trang , n liệu truy cập có phải là lỗi trang không , n
trạng thái cập nhật của TLB .
5.16.2 [15] <§5.7> Lặp lại bài tập 5.16.1, nhưng lần này sử dụng 16 trang KiB
thay thế trong số 4 trang KiB. Điều gì sẽ là một số lợi thế của việc có kích thước
trang lớn hơn? Một số nhược điểm là gì?
5.16.3 [15] <§5.7> Lặp lại bài tập 5.16.1, nhưng lần này sử dụng 4 trang KiB
và a TLB kết hợp hai chiều .
5.16.4 [15] <§5.7> Lặp lại bài tập 5.16.1, nhưng lần này sử dụng 4 trang KiB
và a TLB được ánh xạ trực tiếp .
5.16.5 [10] <§ §5.4, 5.7> Thảo luận về lý do tại sao CPU phải có TLB cao
hiệu suất. Làm thế nào để truy cập bộ nhớ ảo được xử lý nếu không có TLB?
510 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

5.17 Có một số tham số ảnh hưởng đến kích thước tổng thể của bảng trang.
Dưới đây là các tham số bảng trang chính.
Kích thước địa chỉ ảo Kích Trang Bảng Kích
thước thước mục nhập
trang
32 bit 8 KiB 4 byte

5.17.1 [5] <§5.7> Đưa ra các tham số hiển thị ở trên, tính toán tối đa kích
thước bảng trang có thể cho một hệ thống chạy năm quy trình.

5.17.2 [10] < §5.7> Đưa ra các tham số hiển thị ở trên, tính tổng kích thước
bảng trang cho một hệ thống chạy năm ứng dụng mà mỗi ứng dụng sử dụng một
nửa bộ nhớ ảo có sẵn, được cung cấp một cách tiếp cận bảng trang hai cấp với tối
đa 256 mục ở 1st cấp độ. Giả sử mỗi mục của bảng trang chính là 6 byte. Tính
lượng bộ nhớ tối thiểu và tối đa cần thiết cho bảng trang này.
5.17.3 [10] <§5.7> Một nhà thiết kế bộ nhớ cache muốn tăng kích thước của 4
KiB hầu như bộ nhớ cache được lập chỉ mục, được gắn thẻ vật lý. Với kích thước
trang được hiển thị ở trên, có thể tạo bộ đệm được ánh xạ trực tiếp 16 KiB, giả sử
bốn từ 32 bit cho mỗi khối? Làm thế nào nhà thiết kế sẽ tăng kích thước dữ liệu
của bộ đệm?

5,18 Trong bài tập này, chúng tôi sẽ kiểm tra tối ưu hóa không gian / thời gian
cho các bảng trang.
Danh sách sau đây cung cấp các tham số của một hệ thống bộ nhớ ảo.

DRAM vật lý
Địa chỉ ảo (bit) Cài đặt Kích Kích thước PTE
thước (byte)
trang
43 16 GiB 4 KiB 4

5.18.1 [10] <§5.7> Đối với một bảng trang một cấp, có bao nhiêu mục bảng
trang (PTE) là cần thiết? Cần bao nhiêu bộ nhớ vật lý để lưu trữ bảng trang?
5.18.2 [10] <§5.7> Sử dụng bảng trang đa cấp có thể làm giảm bộ nhớ vật lý
tiêu thụ các bảng trang bằng cách chỉ giữ các PTE hoạt động trong bộ nhớ vật lý.
Sẽ cần bao nhiêu cấp độ của bảng trang nếu các bảng phân đoạn (bảng trang cấp
trên) được phép có kích thước không giới hạn? Cần bao nhiêu tham chiếu bộ nhớ
để dịch địa chỉ nếu thiếu trong TLB?
5.18.3 [10] <§5.7> Giả sử các phân đoạn được giới hạn ở kích thước trang 4
KiB (vì vậy rằng chúng có thể được phân trang). Là 4 byte đủ lớn cho tất cả các
mục trong bảng trang (bao gồm cả các mục trong bảng phân đoạn?
5.18.4 [10] <§5.7> Cần bao nhiêu cấp độ của bảng trang nếu các phân đoạn
giới hạn ở kích thước trang 4 KiB?
5.20 Bài tập 511

5.18.5 [15] <§5.7> Một bảng trang đảo ngược có thể được sử dụng để tối ưu
hóa không gian hơn nữa và thời gian. Cần bao nhiêu PTE để lưu trữ bảng trang?
Giả sử thực hiện bảng băm, trường hợp phổ biến và số trường hợp xấu nhất của
tham chiếu bộ nhớ cần thiết để phục vụ bỏ lỡ TLB?

5.19 Bảng sau đây cho thấy nội dung của TLB bốn mục .
Nhập Có Trang Sửa đổi Trang
cảnh giá VA Sự bảo vệ PA
trị
1 1 140 1 RW 30
2 0 40 0 RX 34
3 1 200 1 RO 32
4 1 280 0 RW 31

5.19.1 [5] <§5.7> Theo kịch bản nào, mục nhập 3 bit hợp lệ được đặt thành không?
5.19.2 [5] <§5.7> Điều gì xảy ra khi một hướng dẫn viết lên VA trang 30?
Khi nào một phần mềm được quản lý TLB sẽ nhanh hơn TLB được quản lý phần cứng?
5.19.3 [5] <§5.7> Điều gì xảy ra khi một hướng dẫn viết lên VA trang 200?

5.20 Trong bài tập này, chúng tôi sẽ kiểm tra xem các chính sách thay thế ảnh
hưởng đến tỷ lệ bỏ lỡ như thế nào. Giả sử bộ đệm kết hợp hai chiều với bốn khối
một từ. Xem xét trình tự địa chỉ từ sau: 0, 1, 2, 3, 4, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
6, 7, 0.
Xem xét trình tự địa chỉ sau: 0, 2, 4, 8, 10, 12, 14, 16, 0
5.20.1 [5] <§ §5.4, 5.8> Giả sử một chính sách thay thế LRU, truy cập là hit?
5.20.2 [5] <§ §5.4, 5.8> Giả sử MRU (gần đây nhất được sử dụng) thay thế
chính sách, truy cập là lượt truy cập?
5.20.3 [5] <§ §5.4, 5.8> Mô phỏng một chính sách thay thế ngẫu nhiên bằng
cách lật a đồng xu. Ví dụ, đầu đầu của người Viking có nghĩa là để đuổi khối đầu
tiên trong một tập hợp và đuôi đuôi có nghĩa là để đuổi khối thứ hai trong một tập
hợp. Có bao nhiêu lượt truy cập trình tự địa chỉ này?
5.20.4 [10] <§ §5.4, 5.8> Mô tả một chính sách thay thế tối ưu cho việc này
trình tự. Truy cập nào là lượt truy cập bằng chính sách này?
5.20.5 [10] <§ §5.4, 5.8> Mô tả lý do tại sao rất khó để thực hiện bộ đệm chính
sách thay thế là tối ưu cho tất cả các chuỗi địa chỉ.
5.20.6 [10] <§ §5.4, 5.8> Giả sử bạn có thể đưa ra quyết định cho từng bộ nhớ
tham khảo xem bạn có muốn địa chỉ được yêu cầu được lưu trữ hay không. Điều
này có thể có ảnh hưởng gì đến tỷ lệ bỏ lỡ?
512 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

5,21 Một trong những trở ngại lớn nhất đối với việc sử dụng rộng rãi các máy
ảo là chi phí hiệu suất phát sinh bằng cách chạy một máy ảo. Dưới đây là các
thông số hiệu suất khác nhau và hành vi ứng dụng.
Đặc quyền
I / O thời gian
Ô/S truy cập
(bao gồm thời
truy cập Trên đầu đến I / O truy cập gian
trên 10.000 bẫy để Trên đầu đến trên 10.000 bẫy khách
Hướng dẫn CPI cơ sở khách O / S bẫy để VMM hướng dẫn O / S)
1.5 120 15 chu kỳ 175 chu kỳ 30 1100 chu kỳ

5.21.1 [10] <§5.6> Tính CPI cho hệ thống được liệt kê ở trên giả định rằng không
có quyền truy cập vào I / O. CPI là gì nếu VMM trên cao tăng gấp đôi? Nếu nó được
cắt làm đôi? Nếu một công ty phần mềm máy ảo muốn hạn chế sự suy giảm hiệu suất
xuống 10%, thì hình phạt dài nhất có thể là gì để bẫy vào VMM?
5.21.2 [15] <§5.6> Truy cập I / O thường có ảnh hưởng lớn đến toàn bộ hệ
thống hiệu suất. Tính CPI của máy bằng các đặc tính hiệu suất ở trên, giả sử hệ
thống không ảo hóa. Tính toán CPI một lần nữa, lần này bằng cách sử dụng một
hệ thống ảo hóa. Làm thế nào để các CPI này thay đổi nếu hệ thống có một nửa
số truy cập I / O?

5.22 [15] <§ §5.6, 5.7> So sánh và đối chiếu các ý tưởng của bộ nhớ ảo và máy
ảo. Làm thế nào để các mục tiêu của mỗi so sánh? Những ưu và nhược điểm của
mỗi? Liệt kê một vài trường hợp mong muốn bộ nhớ ảo và một vài trường hợp
máy ảo mong muốn.

5,23 [10] <§5.6> Mục 5.6 thảo luận về ảo hóa theo giả định rằng hệ thống ảo hóa
đang chạy cùng một ISA với phần cứng cơ bản. Tuy nhiên, một cách sử dụng ảo hóa
có thể là mô phỏng các ISA không bản địa. Một ví dụ về điều này là QEMU, mô
phỏng nhiều loại ISA như MIPS, SPARC và PowerPC. Một số khó khăn liên quan
đến loại ảo hóa này là gì? Có thể cho một hệ thống mô phỏng chạy nhanh hơn trên
ISA gốc của nó?

5.24 Trong bài tập này, chúng tôi sẽ khám phá bộ điều khiển cho bộ điều khiển bộ
đệm cho a bộ xử lý với bộ đệm ghi. Sử dụng máy trạng thái hữu hạn được tìm thấy
trong Hình 5.39 như một điểm khởi đầu để thiết kế máy trạng thái hữu hạn của riêng
bạn. Giả sử rằng bộ điều khiển bộ đệm dành cho bộ đệm được ánh xạ trực tiếp đơn
giản được mô tả trên trang 474 (Hình 5,39 trong Mục 5.9), nhưng bạn sẽ thêm bộ
đệm ghi có dung lượng một khối.
Hãy nhớ lại rằng mục đích của bộ đệm ghi là để lưu trữ tạm thời để bộ xử lý
không phải chờ hai lần truy cập bộ nhớ trên một lỗi bẩn. Thay vì viết lại khối bẩn
trước khi đọc khối mới, nó đệm khối bẩn và ngay lập tức bắt đầu đọc khối mới.
Khối bẩn sau đó có thể được ghi vào bộ nhớ chính trong khi bộ xử lý đang hoạt
động.
5.20 Bài tập 513

5.24.1 [10] <§ §5.8, 5.9> Điều gì sẽ xảy ra nếu bộ xử lý đưa ra yêu cầu cái đó
lượt truy cập trong bộ đệm trong khi một khối đang được ghi lại vào bộ nhớ
chính từ bộ đệm ghi?
5.24.2 [10] <§ §5.8, 5.9> Điều gì sẽ xảy ra nếu bộ xử lý đưa ra yêu cầu cái đó
bỏ lỡ trong bộ đệm trong khi một khối đang được ghi lại vào bộ nhớ chính từ bộ
đệm ghi?
5.24.3 [30] <§ §5.8, 5.9> Thiết kế một máy trạng thái hữu hạn để cho phép sử
dụng một văn bản đệm.

5,25 Sự kết hợp bộ đệm liên quan đến quan điểm của nhiều bộ xử lý trên một
bộ đệm nhất định khối. Dữ liệu sau đây cho thấy hai bộ xử lý và các thao tác đọc
/ ghi của chúng trên hai từ khác nhau của khối bộ đệm X (ban đầu là X [0] = X [1]
= 0).
P1 P2
X [0] ++; X [1] = 3; X [0] = 5; X [1] + = 2;

5.25.1 [15] <§5.10> Liệt kê các giá trị có thể có của khối bộ đệm đã cho cho
chính xác thực hiện giao thức kết hợp bộ đệm. Liệt kê ít nhất một giá trị có thể
có của khối nếu giao thức không đảm bảo sự gắn kết bộ đệm.
5.25.2 [15] <§5.10> Đối với giao thức rình mò, hãy liệt kê một chuỗi hoạt
động hợp lệ trên mỗi bộ xử lý / bộ đệm để hoàn thành các thao tác đọc / ghi ở
trên.
5.25.3 [10] <§5.10> Số lượng bộ nhớ cache trong trường hợp tốt nhất và
trường hợp xấu nhất là gì bỏ lỡ cần thiết để thực hiện các hướng dẫn đọc / ghi
được liệt kê?
Tính nhất quán bộ nhớ liên quan đến quan điểm của nhiều mục dữ liệu. Dữ liệu
sau đây cho thấy hai bộ xử lý và các thao tác đọc / ghi của chúng trên các khối bộ
đệm khác nhau (A và B ban đầu là 0).
P1 P2
A = 1; B = 2; A + = 2; B ++; C = B; D = A;

5.25.4 [15] <§5.10> Liệt kê các giá trị có thể có của C và D cho tất cả các triển
khai đảm bảo cả hai giả định thống nhất trên trang 476.
5.25.5 [15] <§5.10> Liệt kê ít nhất một cặp giá trị có thể có cho C và D nếu
những giả định như vậy không được duy trì.
5.25.6 [15] <§ §5.3, 5.10> Đối với các kết hợp khác nhau của chính sách viết
và viết chính sách phân bổ, kết hợp làm cho việc thực hiện giao thức đơn giản
hơn?
5.26 Bộ nhân chip (CMP) có nhiều lõi và bộ nhớ cache của chúng trên a chip đơn.
Thiết kế bộ nhớ cache L2 trên chip CMP có sự đánh đổi thú vị. Sau đây
514 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

bảng hiển thị tỷ lệ bỏ lỡ và đạt độ trễ cho hai điểm chuẩn với riêng so với. chia sẻ
thiết kế bộ nhớ cache L2. Giả sử bộ đệm L1 có tỷ lệ bỏ lỡ 3% và thời gian truy
cập 1 chu kỳ.
Riêng Chia sẻ

Điểm chuẩn Một tỷ lệ bỏ lỡ 10% 4%
Điểm chuẩn B bỏ lỡ tỷ lệ 2% 1%

Giả sử các độ trễ hit sau :


Bộ nhớ cache Bộ nhớ cache Ký ức
riêng chung
5 20 180

5.26.1 [15] <§5.13> Thiết kế bộ đệm nào tốt hơn cho từng điểm chuẩn này?
Sử dụng dữ liệu để hỗ trợ kết luận của bạn.
5.26.2 [15] <§5.13> Băng thông ngoài chip trở thành nút cổ chai làm số lõi
CMP tăng. Làm thế nào để nút cổ chai này ảnh hưởng đến các hệ thống bộ nhớ
cache riêng và chia sẻ khác nhau? Chọn thiết kế tốt nhất nếu độ trễ của liên kết
off-chip đầu tiên tăng gấp đôi.
5.26.3 [10] <§5.13> Thảo luận về những ưu và nhược điểm của chia sẻ so với.
bộ nhớ đệm L2 riêng cho cả khối lượng công việc đơn luồng, đa luồng và đa
chương trình, và xem xét lại chúng nếu có bộ nhớ đệm L3 trên chip.
5.26.4 [10] <§5.13> Bộ đệm L2 không chặn sẽ tạo ra nhiều cải tiến hơn trên
CMP có bộ đệm L2 được chia sẻ hoặc bộ đệm L2 riêng? Tại sao?
5.26.5 [10] <§5.13> Giả sử các thế hệ bộ xử lý mới tăng gấp đôi số lượng lõi
cứ sau 18 tháng. Để duy trì cùng mức hiệu suất trên mỗi lõi, cần bao nhiêu băng
thông bộ nhớ ngoài chip cho bộ xử lý được phát hành trong ba năm?
5.26.6 [15] <§5.13> Hãy xem xét toàn bộ hệ thống phân cấp bộ nhớ. Những
loại tối ưu hóa có thể cải thiện số lần bỏ lỡ đồng thời?

5.27 Trong bài tập này, chúng tôi hiển thị định nghĩa của nhật ký máy chủ web
và kiểm tra mã tối ưu hóa để cải thiện tốc độ xử lý nhật ký. Cấu trúc dữ liệu cho
nhật ký được xác định như sau :
mục nhập cấu trúc {
 int srcIP; // địa chỉ IP từ xa
 URL char [128]; // yêu cầu URL (ví dụ:., Chỉ số GET.html trực tiếp)
 thời gian dài; // thời gian tham khảo
 trạng thái int; // trạng thái kết nối
 trình duyệt char [64]; // tên trình duyệt khách hàng} nhật
ký [NUM_ENTRIES];
5.20 Bài tập 515

Giả sử chức năng xử lý sau cho nhật ký :

topK_sourceIP (trong giờ);

Hàm này xác định các IP nguồn được quan sát thường xuyên nhất trong giờ nhất
định.

5.27.1 [5] <§5.15> Những trường nào trong một mục nhật ký sẽ được truy cập
cho đã cho chức năng xử lý nhật ký? Giả sử các khối bộ đệm 64 byte và không
có tiền tố, trung bình có bao nhiêu bộ nhớ cache cho mỗi mục nhập mà hàm đã
cho phải chịu?
5.27.2 [5] <§5.15> Làm thế nào bạn có thể sắp xếp lại cấu trúc dữ liệu để cải
thiện bộ nhớ cache sử dụng và truy cập địa phương?
5.27.3 [10] <§5.15> Đưa ra một ví dụ về chức năng xử lý nhật ký khác sẽ thích
một bố cục cấu trúc dữ liệu khác nhau. Nếu cả hai chức năng đều quan trọng, bạn
sẽ viết lại chương trình như thế nào để cải thiện hiệu suất tổng thể? Bổ sung các
cuộc thảo luận với đoạn mã và dữ liệu.

5,28 Đối với các vấn đề dưới đây, hãy sử dụng dữ liệu từ Hiệu suất bộ đệm của bộ
nhớ cache cho Spec Điểm chuẩn CPU2000
(http://www.cs.wisc.edu/multifacet/misc/spec2000cache-data/) cho các cặp điểm
chuẩn được hiển thị trong bảng sau.
a. Mesa / gcc
b. mcf / bơi

5.28.1 [10] <§5.15> Đối với 64 bộ nhớ dữ liệu KiB với các liên kết tập hợp
khác nhau, những gì là tỷ lệ bỏ lỡ được chia nhỏ theo các loại bỏ lỡ (lạnh, công
suất và bỏ lỡ xung đột) cho mỗi điểm chuẩn?
5.28.2 [10] <§5.15> Chọn liên kết tập hợp sẽ được sử dụng bởi dữ liệu 64 KiB
L1 bộ nhớ cache được chia sẻ bởi cả hai điểm chuẩn. Nếu bộ đệm L1 phải được
ánh xạ trực tiếp, hãy chọn tính liên kết đã đặt cho bộ đệm 1 MiB L2.
5.28.3 [20] <§5.15> Cho một ví dụ trong bảng tỷ lệ bỏ lỡ nơi tập cao hơn liên
kết thực sự làm tăng tỷ lệ bỏ lỡ. Xây dựng cấu hình bộ đệm và luồng tham chiếu
để chứng minh điều này.

5,29 Để hỗ trợ nhiều máy ảo, hai cấp độ ảo hóa bộ nhớ là cần thiết. Mỗi máy ảo
vẫn kiểm soát ánh xạ của địa chỉ ảo (VA) đến địa chỉ vật lý (PA), trong khi trình ảo
hóa ánh xạ địa chỉ vật lý (PA) của mỗi máy ảo đến thực tế địa chỉ máy (MA). Để
tăng tốc ánh xạ như vậy, một cách tiếp cận phần mềm có tên là Shadow Shadow
phân tích các bản sao của máy ảo trong các bảng trang ảo và chặn các thay đổi ánh xạ
VA sang PA để giữ cho cả hai bản sao đều nhất quán. Để loại bỏ sự phức tạp của các
bảng trang bóng, a
516 Chương 5 Lớn và nhanh: Khai thác phân cấp bộ nhớ

phương pháp phần cứng được gọi bảng trang lồng nhau (NPT) hỗ trợ rõ ràng hai lớp
bảng trang (VA⇒PA và PA⇒MA) và có thể đi bộ các bảng như vậy hoàn toàn trong
phần cứng.
Xem xét chuỗi hoạt động sau: (1) Tạo quy trình; (2) TLB bỏ lỡ; (3) lỗi trang; (4)
chuyển đổi bối cảnh;
5.29.1 [10] <§ §5.6, 5.7> Điều gì sẽ xảy ra cho chuỗi hoạt động đã cho cho
bảng trang bóng và bảng trang lồng nhau, tương ứng?
5.29.2 [10] <§ §5.6, 5.7> Giả sử một bảng trang bốn cấp dựa trên x86 trong cả
hai bảng trang khách và lồng nhau, cần bao nhiêu tham chiếu bộ nhớ để phục vụ
bỏ lỡ TLB cho bản gốc so với. bảng trang lồng nhau?
5.29.3 [15] <§ §5.6, 5.7> Trong số các tỷ lệ bỏ lỡ TLB, độ trễ bỏ lỡ TLB, tỷ lệ
lỗi trang , và độ trễ xử lý lỗi trang, số liệu nào quan trọng hơn đối với bảng trang
bóng? Đó là quan trọng cho bảng trang lồng nhau?
Giả sử các tham số sau cho một hệ thống phân trang bóng.
TLB mất trên 1000 Hoa hậu TLB NPT Lỗi trang trên 1000 Trang bóng tối
Hướng dẫn Độ trễ Hướng dẫn Lỗi trên đầu
0,2 200 chu kỳ 0,001 30.000 chu kỳ

5.29.4 [10] <§5.6> Đối với điểm chuẩn với CPI thực hiện gốc là 1, là gì số CPI
nếu sử dụng bảng trang bóng so với. NPT (giả sử chỉ ảo hóa bảng trang trên đầu)?
5.29.5 [10] <§5.6> Những kỹ thuật có thể được sử dụng để giảm bóng bảng
trang gây ra chi phí?
5.29.6 [10] <§5.6> Những kỹ thuật có thể được sử dụng để giảm NPT gây ra
trên đầu?

Câu trả lời để §5.1, trang 391: 1 và 4. (3 là sai vì chi phí phân cấp bộ nhớ thay đổi trên mỗi máy
kiểm tra chính tính, nhưng năm 2016, chi phí cao nhất thường là DRAM.)
§5.3, trang 412: 1 và 4: Hình phạt bỏ lỡ thấp hơn có thể cho phép các khối nhỏ
mình hơn, vì bạn không có độ trễ lớn để khấu hao, nhưng băng thông bộ nhớ cao hơn
thường dẫn đến các khối lớn hơn, vì hình phạt bỏ lỡ chỉ lớn hơn một chút . §5.4,
trang 430: 1.
§5.8, trang 470: 2. (Cả kích thước khối lớn và tiền xử lý có thể làm giảm các lần
bỏ lỡ bắt buộc, vì vậy 1 là sai.)
6
Bộ xử lý song song
từ máy khách đến
Tôi đã vung lớn,
đám mây
với tất cả mọi thứ 6.1 Giới thiệu 520
tôi đã có. 6.2 Khó khăn của việc tạo song song
Tôi đánh lớn hoặc Chương trình chế biến 522
6.3 SISD, MIMD, SIMD, SPMD và Vector 527
tôi nhớ lớn. Tôi
6.4 Đa phần cứng 534
thích sống lớn nhất 6.5 Bộ đa bộ nhớ chia sẻ và đa bộ nhớ
có thể.Giáo dục khác 537
Em yêu Ruth 6.6 Giới thiệu về các đơn vị xử lý đồ
Cầu thủ bóng chày người Mỹ
họa 542
6.7 Kiến trúc đặc trưng tên miền 549
Tổ chức máy tính và thiết kế Phiên bản RISC-V. DOI: http://dx.doi.org/10.1016/B978-0-12-820331-6.00006-5 ©
2021 Elsevier Inc. Đã đăng ký Bản quyền.
6,8 Các cụm, Máy tính quy mô kho và Bộ đa xử lý
thông báo khác 552
6,9 Giới thiệu về cấu trúc liên kết mạng đa bộ xử lý 557

6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm 561
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 561
6.12 Real Stuff: Điểm chuẩn siêu máy tính Google TPUv3 và Cụm
GPU NVIDIA Volta 572
6.13 Nhanh hơn: Nhiều bộ xử lý và ma trận nhân 580
6.14 Ngụy biện và Cạm bẫy 583
6.15 Kết luận 585
6.16 Quan điểm lịch sử và đọc thêm 587
6.17 Tự học 588
6.18 Bài tập 590

Bộ đa xử lý hoặc Tổ chức cụm

Máy vi tính Máy vi tính

Mạng

Máy vi tính Máy vi tính


520 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Trên dãy núi Mặt trăng,


Xuống Thung lũng
bóng tối, Đi xe, mạnh 6.1 Giới thiệu
dạn cưỡi bóng trả lời
Nếu bạn tìm kiếm El Các kiến trúc sư máy tính từ lâu đã tìm kiếm Thành phố Vàng (El Dorado) của
Dorado! thiết kế máy tính: để tạo ra các máy tính mạnh mẽ chỉ bằng cách kết nối nhiều máy
Edgar Allan Poe, tính nhỏ hơn hiện có. Tầm nhìn vàng này là đài phun nước của bộ nhân Lý tưởng
Hồi El Dorado, nhất, khách hàng đặt hàng càng nhiều bộ xử lý càng tốt và nhận được một lượng
khổ stanza 4, hiệu suất tương xứng. Do đó, phần mềm đa bộ xử lý phải được thiết kế để hoạt
1849 động với một số lượng bộ xử lý khác nhau. Như đã đề cập trong. Chương 1, năng
lượng đã trở thành vấn đề quan trọng nhất đối với cả bộ vi xử lý và trung tâm dữ
liệu. Thay thế bộ xử lý lớn không hiệu quả bằng nhiều bộ xử lý nhỏ hơn, hiệu quả
hơn có thể mang lại hiệu suất tốt hơn cho mỗi Joule cả lớn và nhỏ, nếu phần mềm
có thể sử dụng chúng một cách hiệu quả. Do đó, hiệu quả năng lượng được cải
thiện tham gia hiệu suất có thể mở rộng trong trường hợp cho bộ đa xử lý.
Vì phần mềm đa bộ xử lý nên mở rộng quy mô, một số thiết kế hỗ trợ hoạt
bộ vi xử lý động với sự có mặt của phần cứng bị hỏng; nghĩa là, nếu một bộ xử lý đơn bị lỗi
Một hệ thống máy tính có ít
trong bộ đa xử lý với n bộ xử lý, các hệ thống này sẽ tiếp tục cung cấp dịch vụ n
nhất hai bộ xử lý. Máy tính
- 1 bộ xử lý. Do đó, bộ đa xử lý cũng có thể cải thiện tính khả dụng (xem
này trái ngược với bộ giải
mã, có một, và ngày càng
Chương 5).
khó tìm thấy ngày nay. Hiệu suất cao có thể có nghĩa là thông lượng lớn hơn cho các nhiệm vụ độc lập,
được gọi song song cấp nhiệm vụ hoặc là song song cấp quá trìnhNhững
nhiệm vụ này là độc lập. các ứng dụng đơn luồng và chúng là một ứng dụng quan
trọng và phổ biến của nhiều bộ xử lý. Cách tiếp cận này tương phản với việc chạy
một công việc duy nhất trên nhiều bộ xử lý. Chúng tôi sử dụng thuật ngữ này
chương trình xử lý song song để chỉ một chương trình duy nhất chạy trên nhiều
bộ xử lý cùng một lúc.
Từ lâu đã có những vấn đề khoa học cần máy tính nhanh hơn nhiều, và loại
vấn đề này đã được sử dụng để biện minh cho nhiều máy tính song song mới
song song cấp nhiệm vụ trong nhiều thập kỷ. Một số vấn đề này có thể được xử lý đơn giản ngay hôm nay,
hoặc là cấp quy trình bằng cách sử dụng a cụm bao gồm các bộ vi xử lý được đặt trong nhiều máy chủ
song song Sử dụng độc lập (xem Mục 6.7). Ngoài ra, các cụm có thể phục vụ các ứng dụng đòi hỏi
nhiều bộ xử lý bằng cách không kém bên ngoài các ngành khoa học, chẳng hạn như công cụ tìm kiếm, máy
chạy các chương trình độc chủ Web, máy chủ email và cơ sở dữ liệu.
lập cùng một lúc.
đã
chương trình xử lý Như được mô tả trong Chương 1, bộ vi xử lý có được xô vào
song song Một đơn các chú ý vì vấn đề năng lượng có nghĩa là tương lai tăng
chương trình chạy tro địa
trên nhiều bộ xử lý ng hiệu suất phải đến từ một số điểm khác hơn cao hơn nhiều
cùng một lúc.
tốc độ đồng hồ hoặc CPI được cải thiện rất
cụm Một bộ các máy nhiều. Như chúng tôi nói trong Chương 1, họ được gọi
tính được kết nối qua
mạng cục bộ có chức
năng như một bộ xử lý
lớn duy nhất.
6.1 Giới thiệu 521

vi xử lý đa lõi thay vì vi xử lý đa xử lý , có lẽ để tránh sự dư thừa trong việc đặt vi xử lý đa lõi


tên. Do đó, bộ xử lý thường được gọi lõi trong một con chip nhiều lõi. Số lượng A bộ vi xử lý chứa nhiều
lõi dự kiến sẽ tăng theo cải tiến công nghệ phần cứng. Những đa số này hầu như bộ xử lý (môi lõi) trong
một mạch tích hợp duy
luôn luôn Chia sẻ Bộ xử lý bộ nhớ (SMP), vì họ thường chia sẻ một không gian
nhất. Hầu như tất cả các
địa chỉ vật lý duy nhất. Chúng tôi sẽ thấy SMPs nhiều hơn trong Mục 6.5. bộ vi xử lý ngày nay
Tình trạng công nghệ ngày nay có nghĩa là các lập trình viên quan tâm đến trong máy tính để bàn và
hiệu suất phải trở thành lập trình viên song song (Xem Mục 6.13). máy chủ đều là đa lõi.
Thách thức cao đối với ngành là tạo ra phần cứng và phần mềm giúp dễ dàng
viết các chương trình xử lý song song chính xác sẽ thực thi hiệu quả về hiệu suất bộ đa xử lý bộ nhớ
và năng lượng như số lượng lõi trên mỗi thang chip. dùng chung (SMP)
Sự thay đổi đột ngột trong thiết kế vi xử lý này khiến nhiều người mất cảnh giác, do Một song song bộ xử lý
đó có rất nhiều nhầm lẫn về thuật ngữ và ý nghĩa của nó. Hình 6.1 cố gắng làm rõ các với một không gian địa
điều khoản serial, song song, tuần tự, và đồng thờiCác cột của hình này đại diện cho chỉ vật lý duy nhất.
phần mềm, vốn là tuần tự hoặc đồng thời. Các hàng của hình đại diện cho phần cứng,
là nối tiếp hoặc song song. Ví dụ: các lập trình viên của trình biên dịch nghĩ về chúng
như các chương trình tuần tự: các bước bao gồm phân tích cú pháp, tạo mã, tối ưu hóa,
v.v. Ngược lại, các lập trình viên của hệ điều hành thường nghĩ chúng là các chương
trình đồng thời: hợp tác xử lý các sự kiện I / O do các công việc độc lập chạy trên máy
tính.
Điểm của hai trục này Hình 6.1 là phần mềm đồng thời có thể chạy trên phần
cứng nối tiếp, chẳng hạn như hệ điều hành cho bộ giải mã Intel Pentium 4 hoặc
trên phần cứng song song, chẳng hạn như HĐH trên Intel Core i7 gần đây hơn.
Điều tương tự cũng đúng với phần mềm tuần tự. Ví dụ, lập trình viên MATLAB
viết một ma trận nhân lên suy nghĩ về nó một cách tuần tự, nhưng nó có thể chạy
nối tiếp trên Pentium 4 hoặc song song trên Intel Core i7.
Bạn có thể đoán rằng thách thức duy nhất của cuộc cách mạng song song là tìm ra
cách làm cho phần mềm tuần tự tự nhiên có hiệu suất cao trên phần cứng song song,
nhưng cũng phải làm cho các chương trình đồng thời có hiệu suất cao trên bộ xử lý khi số
lượng bộ xử lý tăng lên. Với sự khác biệt này, trong phần còn lại của chương này, chúng
tôi sẽ sử dụng chương trình xử lý song song hoặc là phần mềm song song có nghĩa là
phần mềm tuần tự hoặc đồng thời chạy trên phần cứng song song. Phần tiếp theo của
chương này mô tả lý do tại sao khó tạo ra các chương trình xử lý song song hiệu quả.

Ma trận được viết nhiều bằng MatLab Hệ điều hành Windows Vista
Nối tiếp
chạy trên Intel Pentium 4 chạy trên Intel Pentium 4
Phần
cứng Ma trận được viết nhiều bằng MATLAB Hệ điều hành Windows Vista
Song song chạy trên Intel Core i7 chạy trên Intel Core i7

HÌNH 6.1 Phân loại phần cứng / phần mềm và các ví dụ về quan điểm ứng dụng về tính
đồng thời so với quan điểm phần cứng về tính song song.
522 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Trước khi tiếp tục đi xuống con đường dẫn đến song song, don không quên
những cuộc xâm nhập ban đầu của chúng tôi từ các chương trước :
n Chương 2, Mục 2.11: Song song và hướng dẫn: Đồng bộ hóa
n Chương 3, Mục 3.6: Song song và số học máy tính: Subword Song song
n Chương 4, Mục 4.11: Song song thông qua Hướng dẫn
n Chương 5, Mục 5.10: Phân cấp song song và bộ nhớ: Bộ nhớ cache Sự kết
hợp

Kiểm tra Đúng hay sai: Để hưởng lợi từ bộ đa xử lý, một ứng dụng phải đồng thời.
Bản
thân bạn

Khó khăn của việc tạo song song


6.2
Chương trình chế biến

Thách thức với song song không phải là phần cứng; đó là quá ít chương trình ứng
dụng quan trọng đã được viết lại để hoàn thành các tác vụ sớm hơn trên bộ xử lý.
Thật khó để viết phần mềm sử dụng nhiều bộ xử lý để hoàn thành một tác vụ
nhanh hơn và vấn đề trở nên tồi tệ hơn khi số lượng bộ xử lý tăng lên.
Tại sao điều này là như vậy? Tại sao các chương trình xử lý song song khó
phát triển hơn nhiều so với các chương trình tuần tự?
Lý do đầu tiên là bạn phải có được hiệu suất tốt hơn hoặc hiệu quả năng lượng tốt
hơn từ một chương trình xử lý song song trên bộ đa xử lý; nếu không, bạn sẽ chỉ sử
dụng một chương trình tuần tự trên bộ đơn xử lý, vì lập trình tuần tự đơn giản hơn.
Trong thực tế, các kỹ thuật thiết kế bộ xử lý, chẳng hạn như siêu âm và thực thi ngoài
trật tự, tận dụng tính song song cấp độ hướng dẫn (xem Chương 4), thông thường mà
không có sự tham gia của lập trình viên. Những đổi mới như vậy làm giảm nhu cầu
viết lại các chương trình cho bộ xử lý đa, vì các lập trình viên không thể làm gì và các
chương trình tuần tự của họ sẽ chạy nhanh hơn trên các máy tính mới.
Tại sao khó viết các chương trình xử lý song song nhanh, đặc biệt là khi số lượng
bộ xử lý tăng? Trong Chương 1, chúng tôi đã sử dụng sự tương tự của tám phóng
viên đang cố gắng viết một câu chuyện duy nhất với hy vọng thực hiện công việc
nhanh hơn tám lần. Để thành công, nhiệm vụ phải được chia thành tám phần có kích
thước bằng nhau, bởi vì nếu không, một số phóng viên sẽ không hoạt động trong khi
chờ đợi những người có phần lớn hơn hoàn thành. Một trở ngại tăng tốc khác có thể
là các phóng viên sẽ dành quá nhiều thời gian để giao tiếp với nhau thay vì viết
những đoạn truyện của họ. Đối với cả lập trình tương tự và lập trình song song này,
các thách thức bao gồm lập lịch, phân vùng công việc thành các phần song song, cân
bằng tải trọng giữa các công nhân, thời gian để đồng bộ hóa và chi phí liên lạc giữa
các công nhân
6.2 Khó khăn trong việc tạo ra các chương trình xử lý song song 523

các bên. Thách thức là cứng hơn với nhiều phóng viên hơn cho một câu chuyện
báo chí và với nhiều bộ xử lý hơn cho lập trình song song.
Thảo luận của chúng tôi trong Chương 1 cho thấy một trở ngại khác, đó là
Luật Amdahl. Nó nhắc nhở chúng ta rằng ngay cả những phần nhỏ của chương
trình cũng phải được song song nếu chương trình sử dụng tốt nhiều lõi.

Thử thách tăng tốc

Giả sử bạn muốn đạt được tốc độ nhanh hơn 90 lần với 100 bộ xử lý. Bao VÍ DỤ
nhiêu phần trăm của tính toán ban đầu có thể là tuần tự?

Luật Amdahl từ (Chương 1) nói

TRẢ LỜI
Thời gian thực hiện sau khi cải thiện =
Thời gian thực hiện bị ảnh hưởng bởi cải tiến + Thời gian thực hiện
không bị ảnh hưởng Số lượng cải tiến

Chúng ta có thể cải tổ Luật Amdahl về mặt tăng tốc so với thời gian thực
hiện ban đầu :
Thời gian thực hiện
trước đó
Tăng tốc =
Thời gian thực hiện bị ảnh
(Thời gian thực hiện trước khi thời gian thực hiện bị hưởng
ảnh hưởng) +
Số lượng cải tiến

Công thức này thường được viết lại giả định rằng thời gian thực hiện trước
đó là 1 cho một số đơn vị thời gian và thời gian thực hiện bị ảnh hưởng bởi
cải tiến được coi là một phần của thời gian thực hiện ban đầu :

1
Tăng tốc = Thời gian phân số bị ảnh
(1 2 Thời gian phân số bị ảnh hưởng
hưởng) +
Số lượng cải tiến

Thay thế 90 cho tăng tốc và 100 cho số lượng cải tiến vào công thức trên :

1
90 =
2 Thời gian phân số bị ảnh Thời gian phân số bị
(1 hưởng) + ảnh hưởng
100
524 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Sau đó đơn giản hóa công thức và giải quyết cho thời gian phân số bị ảnh
hưởng :

90 × (1 0,99 × Thời gian phân số a ected) = 1


90 (90 × 0,99 × Phân số tiime a ected) = 1
90 1 = 90 × 0,99 × Thời gian phân số một
ected
Thời gian phân số a ected = 89 / 89.1 = 0.999

Do đó, để đạt được tốc độ tăng 90 từ 100 bộ xử lý, tỷ lệ phần trăm tuần tự
chỉ có thể là 0,1%.

Tuy nhiên, có những ứng dụng có nhiều tính song song, như chúng ta sẽ thấy tiếp
theo.

VÍ DỤ

Thử thách tăng tốc: Vấn đề lớn hơn

Giả sử bạn muốn thực hiện hai tổng: một là tổng của 10 biến vô hướng và một là
tổng ma trận của một cặp mảng hai chiều, với kích thước 10 x 10. Hiện tại, hãy để
cho rằng chỉ có tổng ma trận là song song; chúng tôi sẽ sớm thấy cách song song các
tổng vô hướng. Bạn tăng tốc với 10 so với 40 bộ xử lý? Tiếp theo, tính toán tốc độ
tăng giả định ma trận tăng lên 20 bằng 20.
TRẢ LỜI
Nếu chúng ta giả sử hiệu suất là một chức năng của thời gian cho một bổ
sung , t, sau đó có 10 bổ sung không được hưởng lợi từ bộ xử lý song song
và 100 bổ sung. Nếu thời gian cho một bộ xử lý là 110 t, thời gian thực hiện
cho 10 bộ xử lý là

Thời gian thực hiện sau khi cải thiện


thời gian
Thi hành án một sự cải thiện bằng cách cải thiện
Thời gian thực hiện ected
Số lượng cải tiến

100 t
Thực hiện cải tiến thời gian sau khi cải thiện = 10 + 10t = 20t,

vì vậy tốc độ tăng với 10 bộ xử lý là 110t/ 20t = 5,5. Thời gian thực hiện cho
40 bộ xử lý là

100 t
Thực hiện cải tiến thời gian sau khi cải thiện = 40 + 10t =
12,5t ,
vì vậy tốc độ
tăng với 40 bộ
xử lý là 110t/
12,5t = 8,8. Do
đó, đối với kích
thước vấn đề
này, chúng tôi
nhận được
khoảng 55% tốc
độ tiềm năng
với 10 bộ xử lý,
nhưng chỉ 22%
với 40.
6.2 Khó khăn trong việc tạo ra các chương trình xử lý song song 525

Hãy nhìn những gì xảy ra khi chúng ta tăng ma trận. Chương trình tuần tự
bây giờ mất 10t + 400t = 410tThời gian thực hiện cho 10 bộ xử lý là.

400 t
Thực hiện cải tiến thời gian sau khi cải thiện = 10 + 10t = 50t,

vì vậy tốc độ tăng với 10 bộ xử lý là 410t/ 50t = 8.2. Thời gian thực hiện cho
40 bộ xử lý là

400 t
Thực hiện cải tiến thời gian sau khi cải thiện = 40 + 10t =
20t ,

vì vậy tốc độ tăng với 40 bộ xử lý là 410 t/ 20t = 20,5. Do đó, đối với kích
thước vấn đề lớn hơn này, chúng tôi nhận được 82% tốc độ tiềm năng với 10
bộ xử lý và 51% với 40.

Những ví dụ này cho thấy việc tăng tốc tốt trên bộ đa xử lý trong khi vẫn giữ
kích thước sự cố cố cố định khó hơn so với việc tăng tốc độ tốt bằng cách tăng
kích thước của sự cố. Cái nhìn sâu sắc này cho phép chúng tôi giới thiệu hai thuật
ngữ mô tả các cách để mở rộng quy mô. quy mô mạnh mẽ
Mở rộng quy mô mạnh mẽ có nghĩa là đo tốc độ trong khi giữ kích thước vấn đề cố Tăng tốc đạt được trên
định. Quy mô yếu có nghĩa là kích thước vấn đề tăng tỷ lệ thuận với sự gia tăng trong số bộ đa xử lý mà không
lượng bộ xử lý. Hãy giả sử rằng kích thước của vấn đề, M, là tập hợp làm việc trong bộ làm tăng kích thước của
vấn đề.
nhớ chính và chúng ta có bộ xử lý P. Sau đó, bộ nhớ trên mỗi bộ xử lý để chia tỷ lệ mạnh
là khoảng M / P và đối với tỷ lệ yếu, đó là về M . tỷ lệ yếu Tăng tốc đạt
Lưu ý rằng hệ thống phân cấp bộ nhớ có thể can thiệp vào sự khôn ngoan được trên bộ đa xử lý
trong khi tăng kích thước
thông thường về việc nhân rộng yếu dễ dàng hơn quy mô mạnh. Ví dụ: nếu tập
của vấn đề theo tỷ lệ với
dữ liệu được chia tỷ lệ yếu không còn phù hợp với bộ đệm cấp cuối cùng của bộ sự gia tăng số lượng bộ
vi xử lý đa lõi, hiệu suất kết quả có thể tồi tệ hơn nhiều so với sử dụng tỷ lệ mạnh. xử lý.
Tùy thuộc vào ứng dụng, bạn có thể tranh luận cho phương pháp mở rộng quy
mô. Ví dụ: điểm chuẩn cơ sở dữ liệu tín dụng ghi nợ TPC-C yêu cầu bạn tăng
quy mô số lượng tài khoản khách hàng theo tỷ lệ với các giao dịch cao hơn mỗi
phút. Lập luận là nó vô lý khi nghĩ rằng một cơ sở khách hàng nhất định sẽ đột
nhiên bắt đầu sử dụng ATM 100 lần một ngày chỉ vì ngân hàng có được một máy
tính nhanh hơn. Thay vào đó, nếu bạn sẽ trình diễn một hệ thống có thể thực hiện
gấp 100 lần số lượng giao dịch mỗi phút, bạn nên chạy thử nghiệm với số lượng
khách hàng gấp 100 lần. Các vấn đề lớn hơn thường cần nhiều dữ liệu hơn, đó là
một đối số cho tỷ lệ yếu.
Ví dụ cuối cùng này cho thấy tầm quan trọng của việc cân bằng tải.

Thử thách tăng tốc: Cân bằng tải


Để đạt được tốc độ tăng 20,5 về vấn đề lớn hơn trước đó với 40 VÍ DỤ
bộ xử lý, chúng tôi giả định tải được cân bằng hoàn hảo. Đó là, mỗi trong số 40
526 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

bộ xử lý có 2,5% công việc phải làm. Thay vào đó, hãy hiển thị tác động lên
tốc độ nếu tải của bộ xử lý cao hơn tất cả các bộ còn lại. Tính hai lần tải (5%)
và năm lần tải (12,5%) cho bộ xử lý làm việc khó nhất đó. Làm thế nào sử
dụng tốt là phần còn lại của bộ xử lý?

Nếu một bộ xử lý có 5% tải song song, thì nó phải thực hiện 5% × 400 hoặc 20 bổ
TRẢ LỜI sung và 39 bộ còn lại sẽ chia sẻ 380 còn lại. Vì chúng đang hoạt động đồng thời,
chúng tôi chỉ có thể tính thời gian thực hiện là tối đa
380t 20t
Thực hiện cải tiến timea er = Tối đa , + 10t = 30t.

39 1
Tốc độ tăng giảm từ 20,5 xuống 410t/ 30t = 14. 39 bộ xử lý còn lại được sử
dụng ít hơn một nửa thời gian: trong khi chờ 20t để bộ xử lý làm việc chăm
chỉ nhất hoàn thành, họ chỉ tính cho 380t/ 39 = 9,7t.
Nếu một bộ xử lý có 12,5% tải, nó phải thực hiện 50 bổ sung. Công thức

350t 50t
Thời gian thực hiện sau khi cải thiện = Tối đa , + 10t = 60t .

39 1
Tốc độ tăng giảm hơn nữa xuống còn 410t/ 60t = 7. Phần còn lại của bộ xử lý
được sử dụng ít hơn 20% thời gian (9t/ 50t). Ví dụ này cho thấy tầm quan
trọng của việc cân bằng tải, chỉ với một bộ xử lý duy nhất có tải gấp đôi số
khác, giảm tốc độ lên một phần ba và năm lần tải trên chỉ một bộ xử lý giảm
tốc độ gần như ba lần.

Bây giờ chúng tôi hiểu rõ hơn về các mục tiêu và thách thức của xử lý song song,
chúng tôi đưa ra một cái nhìn tổng quan về phần còn lại của chương. Mục 6.3 mô tả một
sơ đồ phân loại cũ hơn nhiều so với trong Hình 6.1 Ngoài ra, nó mô tả hai kiểu kiến trúc
tập lệnh hỗ trợ chạy các ứng dụng tuần tự trên phần cứng song song, cụ thể là. ĐƠN
GIẢN và vectơ.Mục 6.4 sau đó mô tả đa luồng, một thuật ngữ thường bị nhầm lẫn với đa
xử lý, một phần vì nó dựa trên sự đồng thời tương tự trong các chương trình. Mục 6.5 mô
tả hai lựa chọn thay thế đầu tiên của một đặc tính phần cứng song song cơ bản, đó là liệu
tất cả các bộ xử lý trong các hệ thống có dựa trên một không gian địa chỉ vật lý duy nhất
hay không. Như đã đề cập ở trên, hai phiên bản phổ biến của các lựa chọn thay thế này
được gọi bộ nhân chia sẻ bộ nhớ (SMP) và cụm, và phần này bao gồm các cựu. Mục 6.6
mô tả một phong cách máy tính tương đối mới từ cộng đồng phần cứng đồ họa, được gọi
là a xử lý đồ họa đơn vị (GPU) cũng giả định một địa chỉ vật lý duy nhất. Mục 6.7 giới
thiệu Tên miền Kiến trúc cụ thể, nơi các bộ xử lý được tùy chỉnh để hoạt động tốt trong
một miền nhưng không cần chạy tốt tất cả các chương trình. ( Phụ lục B mô tả GPU
theo chẵn chi tiết hơn.) Phần 6.8 mô tả các cụm, một ví dụ phổ biến về máy tính có
nhiều không gian địa chỉ vật lý. Mục 6.9 cho thấy các cấu trúc liên kết điển hình
được sử dụng để kết nối nhiều bộ xử lý với nhau, hoặc các nút máy chủ trong cụm
hoặc lõi trong bộ vi xử lý.
6.3 SISD, MIMD, SIMD, SPMD và Vector 527

Mục 6.10 mô tả phần cứng và phần mềm để giao tiếp giữa các nút trong một cụm
sử dụng Ethernet. Nó cho thấy cách tối ưu hóa hiệu suất của nó bằng phần mềm và
phần cứng tùy chỉnh. Tiếp theo chúng tôi thảo luận về những khó khăn trong việc tìm
kiếm các điểm chuẩn song song Mục 6.12 Phần này cũng bao gồm một mô hình hiệu
suất đơn giản nhưng sâu sắc giúp thiết kế các ứng dụng cũng như kiến trúc. Chúng tôi
sử dụng mô hình này cũng như các điểm chuẩn song song trong. Mục 6.12 để so sánh
Kiến trúc cụ thể miền với GPU . Mục 6.13 tiết lộ bước cuối cùng và lớn nhất trong
hành trình tăng tốc ma trận nhân lên của chúng tôi. Xử lý song song sử dụng 48 lõi để
cải thiện hiệu suất theo hệ số 12 đến 17 nếu chúng ta tăng kích thước ma trận (tỷ lệ
yếu). Chúng tôi gần gũi với ngụy biện và cạm bẫy và kết luận của chúng tôi cho song
song.
Trong phần tiếp theo, chúng tôi giới thiệu các từ viết tắt mà bạn có thể đã thấy Kiểm tra
để xác định các loại máy tính song song khác nhau. Bản thân bạn

Đúng hay sai: Quy mô mạnh không bị ràng buộc bởi Luật Amdahl.

6.3 SISD, MIMD, SIMD, SPMD và Vector

Một phân loại phần cứng song song được đề xuất trong những năm 1960 vẫn SISD hoặc Độc
được sử dụng cho đến ngày nay. Nó dựa trên số lượng luồng hướng dẫn và số thân Luồng hướng
lượng luồng dữ liệu. Hình 6.2 cho thấy các thể loại. Do đó, một bộ xử lý đơn dẫn, luồng dữ liệu
thông thường có một luồng hướng dẫn và luồng dữ liệu đơn và bộ đa xử lý thông đơn. Một bộ giải mã.
thường có nhiều luồng lệnh và nhiều luồng dữ liệu. Hai loại này được viết tắt MIMD hoặc Nhiều
SISD và MIMD, tương ứng. Luồng hướng dẫn,
Mặc dù có thể viết các chương trình riêng biệt chạy trên các bộ xử lý khác nhau Nhiều luồng dữ liệu.
trên máy tính MIMD và vẫn hoạt động cùng nhau cho một mục tiêu lớn hơn, phối Một bộ xử lý.
hợp, các lập trình viên thường viết một chương trình duy nhất chạy trên tất cả các bộ
xử lý của a MIMD máy tính, dựa vào các tuyên bố có điều kiện khi các bộ xử lý
khác nhau nên thực thi các phần riêng biệt của mã. Phong cách này được gọi SPMD Chương trình đơn,
Chương trình đơn Nhiều dữ liệu (SPMD), nhưng đó chỉ là cách thông thường để Nhiều luồng dữ liệu. Mô
lập trình máy tính MIMD. hình lập trình MIMD
Gần nhất chúng ta có thể đến nhiều luồng hướng dẫn và luồng dữ liệu đơn (MISD) thông thường, trong đó
một chương trình duy nhất
bộ xử lý có thể là một bộ xử lý luồng của Cameron, sẽ thực hiện một loạt tính toán
chạy trên tất cả các bộ xử
trên một luồng dữ liệu theo kiểu đường ống: phân tích đầu vào từ mạng, giải mã dữ lý.
liệu, giải nén nó, tìm kiếm kết quả khớp, v.v. Nghịch đảo của MISD phổ biến hơn
nhiều. ĐƠN GIẢN máy tính hoạt động trên vectơ của ĐƠN GIẢN hoặc
Độc thân Luồng
hướng dẫn, Nhiều
luồng dữ liệu. Hướng
dẫn tương tự được áp
dụng cho nhiều luồng
dữ liệu, như trong bộ
Độc thân SISD: Intel Pentium 4 SIMD: Hướng dẫn SSE của x86
Hướng dẫn xử lý vector.
Luồng Nhiều MISD: Không có ví dụ ngày hôm nay MIMD: Intel Core i7
HÌNH 6.2 Phân loại phần cứng và ví dụ dựa trên số luồng lệnh và luồng dữ liệu: SISD,
SIMD, MISD và MIMD.
528 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

dữ liệu. Ví dụ: một lệnh SIMD duy nhất có thể thêm 64 số bằng cách gửi 64 luồng dữ
liệu tới 64 ALU để tạo thành 64 tổng trong một chu kỳ xung nhịp. Các hướng dẫn
song song của từ con mà chúng ta đã thấy trong Phần 3.6 và 3.7 là một ví dụ khác về
SIMD; thật vậy, chữ cái giữa của từ viết tắt Intel Intel SSE là viết tắt của SIMD .
Ưu điểm của SIMD là tất cả các đơn vị thực thi song song đều được đồng bộ hóa
và tất cả chúng đều đáp ứng với một lệnh duy nhất phát ra từ một đơn quầy chương
trình (PC). Từ góc độ lập trình viên, điều này gần với SISD đã quen thuộc. Mặc dù
mỗi đơn vị sẽ thực hiện cùng một hướng dẫn, mỗi đơn vị thực thi có các thanh ghi
địa chỉ riêng và do đó mỗi đơn vị có thể có các địa chỉ dữ liệu khác nhau. Như vậy,
về mặt Hình 6.1, một ứng dụng tuần tự có thể được biên dịch để chạy trên phần cứng
nối tiếp được tổ chức dưới dạng SISD hoặc trong phần cứng song song được tổ chức
dưới dạng SIMD .
Động lực ban đầu đằng sau SIMD là khấu hao chi phí của đơn vị kiểm soát đối
với hàng chục đơn vị thực hiện. Một ưu điểm khác là băng thông lệnh giảm và không
gian, SIMD chỉ cần một bản sao của mã đang được thực thi đồng thời, trong khi
MIMD truyền tin nhắn có thể cần một bản sao trong mỗi bộ xử lý và bộ nhớ chia sẻ
MIMD sẽ cần nhiều bộ nhớ đệm lệnh.
SIMD hoạt động tốt nhất khi xử lý các mảng cho vòng lặp. Do đó, để song song
mức dữ liệu hoạt động trong SIMD, phải có rất nhiều dữ liệu có cấu trúc giống hệt nhau, được gọi
song song Song song là song song cấp dữ liệu SIMD là yếu nhất trong. trường hợp hoặc là công tắc các câu
đạt được bằng cách thực lệnh, trong đó mỗi đơn vị thực hiện phải thực hiện một thao tác khác nhau trên dữ
hiện cùng một hoạt động liệu của nó, tùy thuộc vào dữ liệu mà nó có. Các đơn vị thực hiện với dữ liệu sai phải
trên dữ liệu độc lập. được tắt để các đơn vị có dữ liệu phù hợp có thể tiếp tục. Nếu có n trường hợp, trong
những tình huống này, bộ xử lý SIMD về cơ bản chạy ở mức 1 /nhiệu suất cao nhất.
Cái gọi là bộ xử lý mảng đã truyền cảm hứng cho thể loại SIMD bị mất phổ
biến cho đến gần đây (xem phần 6.7 và Mục 6.16 trực tuyến), nhưng hai hiện
tại giải thích về SIMD đã hoạt động trong nhiều thập kỷ.

SIMD trong x86: Tiện ích mở rộng đa phương tiện


Như được mô tả trong Chương 3, song song subword cho dữ liệu số nguyên hẹp
là nguồn cảm hứng ban đầu của Mở rộng đa phương tiện (MMX) hướng dẫn của
x86 vào năm 1996. Khi Moore Moore Law tiếp tục, nhiều hướng dẫn đã được
thêm vào, dẫn đầu tiên đến Truyền phát phần mở rộng SIMD (SSE) và bây giờ
Phần mở rộng Vector nâng cao (AVX). AVX hỗ trợ thực hiện đồng thời tám số
dấu phẩy động 64 bit. Độ rộng của thao tác và các thanh ghi được mã hóa trong
opcode của các hướng dẫn đa phương tiện này. Khi độ rộng dữ liệu của các thanh
ghi và hoạt động tăng lên, số lượng opcodes cho các hướng dẫn đa phương tiện
đã bùng nổ và hiện có hàng trăm hướng dẫn SSE và AVX (xem Chương 3).

Vector
Một cách giải thích cũ hơn và, như chúng ta sẽ thấy, cách giải thích thanh lịch hơn về
SIMD được gọi là a vectơ kiến trúc, đã được xác định chặt chẽ với các máy tính được
thiết kế bởi Seymour Cray bắt đầu từ những năm 1970. Nó cũng là một kết hợp tuyệt
vời cho các vấn đề với nhiều song song cấp dữ liệu. Thay vì có 64 ALU thực hiện
đồng thời 64 bổ sung, như các bộ xử lý mảng cũ, các kiến trúc vector đã điều khiển
ALU để có hiệu suất
tốt với chi phí thấp
hơn. Triết lý cơ bản
của kiến trúc vector là
thu thập
6.3 SISD, MIMD, SIMD, SPMD và Vector 529

các thành phần dữ liệu từ bộ nhớ, đặt chúng theo thứ tự vào một bộ thanh ghi lớn,
hoạt động trên chúng tuần tự trong các thanh ghi bằng cách sử dụng đơn vị thực
hiện đường ống, và sau đó viết kết quả trở lại bộ nhớ. Do đó, một tính năng
chính của kiến trúc vector là một tập hợp các thanh ghi vector. Do đó, một kiến
trúc vectơ có thể có 32 thanh ghi vector, mỗi thanh có 64 phần tử 64 bit.

So sánh Vector với mã thông thường

RISC-V cung cấp phần mở rộng vector V với các hướng dẫn vector và thanh
ghi vector. Các hoạt động của Vector sử dụng cùng tên với các hoạt động VÍ DỤ
của RISC-V nhưng với tiền tố V V được thêm vào. Ví dụ, vfadd.vv thêm hai
vectơ dấu phẩy động. Độ dài của toán hạng phần tử vectơ được đặt theo một
lệnh riêng. Nếu chúng ta thực hiện lần đầu tiên vsetvli x0, x0, e64, sau đó các
phần tử vectơ dài 64 bit, vì vậy vfadd.vv sẽ thêm hai vectơ dấu phẩy động
chính xác kép. Các hậu tố xác định xem đó có phải là một hoạt động vectơ
vector vector (.vv) hoặc một hoạt động vô hướng vector vector (.vv), vì vậy
vfmul.vf là một điểm số vector scalar nhân. Những cái tên vle.v và vse.v biểu
thị tải vectơ và lưu trữ vectơ, và chúng tải hoặc lưu trữ toàn bộ vectơ dữ liệu
chính xác kép nếu vsetvli được đặt thành chiều rộng phần tử là 64 bit. Một
toán hạng là vectơ đăng ký để được tải hoặc lưu trữ; toán hạng khác, là thanh
ghi đa năng RISC-V, là địa chỉ bắt đầu của vectơ trong bộ nhớ.
Với mô tả ngắn này, hiển thị mã RISC-V thông thường so với mã RISC-V
vector cho
Y=a×X+Y

Ở đâu X và Y là các vectơ gồm 64 số dấu phẩy động chính xác kép, ban đầu cư
trú trong bộ nhớ và a là một biến chính xác kép vô hướng. (Ví dụ này là cái gọi
là HÀNG NGÀY vòng lặp tạo thành vòng lặp bên trong của điểm chuẩn Linpack;
DAXPY là viết tắt của dđộ chính xác dễ hòa tan a × X plus Y) Giả sử rằng các
địa chỉ bắt đầu của. X và Y đang ở x19 và x20, tương ứng.

Dưới đây là mã RISC-V thông thường cho DAXPY :


TRẢ LỜI
fld f0, a (x3) // tải vô hướng a
addi x5, x19, 512 // kết thúc mảng X
vòng lặp: fld f1, 0 (x19) // tải x [i]
fmul.d f1, f1, f0 // a * x [i]
fld f2, 0 (x20) // tải y [i]
fadd.d f2, f2, f1 // a * x [i] + y [i]
fsd f2, 0 (x20) // lưu trữ y [i]
addi x19, x19, 8 // chỉ số tăng lên x
addi x20, x20, 8 // chỉ số tăng lên y
// lặp lại nếu không được thực
bltu x19, x5, vòng lặp hiện
530 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Giả sử số phần tử trên mỗi vectơ là 64, đây là mã vectơ RISC-V cho
DAXPY :
fld f0, a (x3) # tải vô hướng a
vsetvli x0, x0, e64 # Các yếu tố rộng 64 bit
vle.v v0, 0 (x19) # tải vector x
vfmul.vf v0, v0, f0 # vector-scalar nhân
vle.v v1, 0 (x20) # tải vector y
vfadd.vv v1, v1, v0 # vector-vector thêm
vse.v v1, 0 (x20) # lưu trữ vector y
Có một số so sánh thú vị giữa hai phân đoạn mã trong ví dụ này. Điều ấn tượng
nhất là bộ xử lý vector làm giảm đáng kể băng thông lệnh động, chỉ thực hiện bảy
hướng dẫn so với hơn 500 cho kiến trúc RISC-V cơ sở. Việc giảm này xảy ra cả vì
các hoạt động của vectơ hoạt động trên 64 phần tử cùng một lúc và vì các hướng dẫn
trên cao tạo thành gần một nửa vòng lặp trên RISC-V không có trong mã vectơ. Như
bạn có thể mong đợi, việc giảm các hướng dẫn này được tìm nạp và thực hiện sẽ tiết
kiệm năng lượng.
Một sự khác biệt quan trọng khác là tần số của đường ống mối nguy hiểm
(Chương 4). Trong mã RISC-V đơn giản, mọi fadd.d phải chờ đợi fmul.d, mọi fsd
phải chờ đợi fadd.dvà mọi fadd.d và fmul.d phải chờ đợi fld. Trên bộ xử lý vector,
mỗi lệnh vector sẽ chỉ dừng lại cho phần tử đầu tiên trong mỗi vectơ, và sau đó
các phần tử tiếp theo sẽ chảy trơn tru xuống đường ống. Do đó, các quầy hàng
đường ống chỉ được yêu cầu một lần trên mỗi vectơ hoạt động, thay vì một lần
trên mỗi vectơ thành phần Trong ví dụ này, tần số gian hàng đường ống trên
RISC-V sẽ cao hơn khoảng 64 lần so với phiên bản vectơ của RISC-V. Các quầy
hàng đường ống có thể được loại bỏ trên RISC-V bằng cách bỏ vòng lặp (xem.
Chương 4). Tuy nhiên, sự khác biệt lớn về băng thông hướng dẫn không thể giảm.
Vì các phần tử vectơ là độc lập, chúng có thể được vận hành song song, giống
như song song với từ con cho các hướng dẫn Intel x86 AVX. Tất cả các máy tính
vector hiện đại đều có các đơn vị chức năng vector với nhiều đường ống song
song (được gọi là làn đường vector; xem Hình 6.2 và 6.3) có thể tạo ra hai hoặc
nhiều kết quả cho mỗi chu kỳ đồng hồ.
Xây dựng: Vòng lặp trong ví dụ trên khớp chính xác với độ dài vectơ. Khi nào các vòng
lặp ngắn hơn, kiến trúc vector sử dụng một thanh ghi làm giảm độ dài của các hoạt động
vector. Khi các vòng lặp lớn hơn, chúng tôi thêm mã sổ sách kế toán để lặp lại các thao
tác vector có độ dài đầy đủ và để xử lý thức ăn thừa. Quá trình sau này được gọi khai thác
dải.

Vector so với Scalar


Hướng dẫn vectơ có một số thuộc tính quan trọng so với kiến trúc tập lệnh thông
thường, được gọi kiến trúc vô hướng trong bối cảnh này :
n Một lệnh vector duy nhất chỉ định rất nhiều công việc, nó tương đương với
việc thực hiện toàn bộ một vòng lặp. Băng thông tìm nạp và giải mã cần
thiết giảm đáng kể.
n Bằng cách sử dụng một lệnh vector, trình biên dịch hoặc lập trình viên chỉ ra
rằng tính toán của từng kết quả trong vectơ không phụ thuộc vào tính toán của
6.3 SISD, MIMD, SIMD, SPMD và Vector 531

các kết quả khác trong cùng một vectơ, vì vậy phần cứng không phải kiểm
tra các mối nguy dữ liệu trong một lệnh vector.
n Kiến trúc và trình biên dịch Vector có tiếng là làm cho nó dễ dàng hơn
nhiều so với khi sử dụng bộ đa xử lý MIMD để viết các ứng dụng hiệu quả
khi chúng chứa song song cấp dữ liệu.
n Phần cứng chỉ cần kiểm tra các mối nguy dữ liệu giữa hai hướng dẫn vector
một lần trên mỗi toán hạng vector, không chỉ một lần cho mọi phần tử
trong các vectơ. Kiểm tra giảm có thể tiết kiệm năng lượng cũng như thời
gian.
n Hướng dẫn vector mà bộ nhớ truy cập có một mẫu truy cập đã biết. Nếu tất
cả các phần tử vector vector đều liền kề, thì việc lấy vector từ một tập hợp
các ngân hàng bộ nhớ xen kẽ rất hoạt động rất tốt. Do đó, chi phí độ trễ cho
bộ nhớ chính chỉ được nhìn thấy một lần cho toàn bộ vectơ, thay vì một lần
cho mỗi từ của vectơ.
n Bởi vì một vòng lặp hoàn chỉnh được thay thế bằng một lệnh vector có
hành vi được xác định trước, các mối nguy kiểm soát thường phát sinh từ
nhánh vòng lặp là không có.
n Việc tiết kiệm băng thông hướng dẫn và kiểm tra nguy hiểm cộng với việc
sử dụng hiệu quả băng thông bộ nhớ mang lại lợi thế cho kiến trúc vector về
năng lượng và năng lượng so với kiến trúc vô hướng.
Vì những lý do này, các thao tác vector có thể được thực hiện nhanh hơn một
chuỗi các thao tác vô hướng trên cùng một số mục dữ liệu và các nhà thiết kế có
động lực để bao gồm các đơn vị vector nếu miền ứng dụng thường có thể sử
dụng chúng.
Vector so với phần mở rộng đa phương tiện
Giống như các tiện ích mở rộng đa phương tiện được tìm thấy trong các hướng dẫn
AVX x86, một lệnh vector chỉ định nhiều thao tác. Tuy nhiên, các tiện ích mở rộng
đa phương tiện thường biểu thị một vài thao tác trong khi vector chỉ định hàng chục
thao tác. Không giống như các tiện ích mở rộng đa phương tiện, số lượng phần tử
trong một hoạt động vector không nằm trong opcode mà trong một thanh ghi riêng.
Sự khác biệt này có nghĩa là các phiên bản khác nhau của kiến trúc vector có thể được
thực hiện với một số yếu tố khác nhau chỉ bằng cách thay đổi nội dung của thanh ghi
đó và do đó giữ được tính tương thích nhị phân. Ngược lại, một bộ opcodes lớn mới
được thêm vào mỗi khi độ dài vector của Thay đổi trong kiến trúc mở rộng đa
phương tiện của x86: MMX, SSE, SSE2, AVX, AVX2, ....
Ngoài ra, không giống như các tiện ích mở rộng đa phương tiện, việc truyền dữ
liệu không cần phải tiếp giáp. Các vectơ hỗ trợ cả hai truy cập có sải chân, trong đó
phần cứng tải mọi nPhần tử dữ liệu trong bộ nhớ và các truy cập được lập chỉ mục,
trong đó phần cứng tìm thấy địa chỉ của các mục sẽ được tải vào một thanh ghi
vector. Truy cập được lập chỉ mục cũng được gọi tụ tập, trong tải được lập chỉ mục
đó tập hợp các yếu tố từ bộ nhớ chính vào liền kề các phần tử vector và các cửa hàng
được lập chỉ mục phân tán các phần tử vector trên bộ nhớ chính.
Giống như các phần mở rộng đa phương tiện, kiến trúc vector dễ dàng nắm bắt
tính linh hoạt về độ rộng dữ liệu, do đó, dễ dàng thực hiện thao tác vector trên 32
phần tử dữ liệu 64 bit hoặc 64 phần tử dữ liệu 32 bit hoặc 128 phần tử dữ liệu 16
bit hoặc 256 8- bit các yếu tố dữ liệu. Ngữ nghĩa song song của một lệnh vector
cho phép thực hiện các thao tác này bằng cách sử dụng một cách sâu sắc đường
ống đơn vị chức năng, một mảng các đơn vị chức năng song song, hoặc kết hợp
chức năng song song và đường ống
532 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

A [9] B [9]
A [8] B [8]
A [7] B [7]
A [6] B [6]
A [5] B [5]
A [4] B [4]
A [3] B [3]
A [2] B [2] A B A B
[8] [8] [9] [9]
A [1] B [1]
A B A B A B A B
[4] [4] [5] [5] [6] [6] [7] [7]

+
+ + + +
C [0]
C C C C
[0] [1] [2] [3]
(a)
Nhóm yếu tố
(b)

HÌNH 6.3 Sử dụng nhiều đơn vị chức năng để cải thiện hiệu suất của một hướng dẫn thêm
vector duy nhất, C = A + B . Bộ xử lý vector (a) ở bên trái có một đường ống thêm duy nhất và có thể hoàn
thành một bổ sung cho mỗi chu kỳ. Bộ xử lý vector (b) ở bên phải có bốn đường ống hoặc làn đường và có thể
hoàn thành bốn bổ sung cho mỗi chu kỳ. Các phần tử trong một hướng dẫn thêm vector duy nhất được xen kẽ trên
bốn làn.

đơn vị. Hình 6.3 minh họa cách cải thiện hiệu suất vector bằng cách sử dụng các
làn vector Một hoặc đường ống song song để thực hiện lệnh thêm vector.
nhiều đơn vị chức năng Các hướng dẫn số học vectơ thường chỉ cho phép phần tử N của một thanh ghi vectơ
vector và một phần của tham gia vào các hoạt động với phần tử N từ các thanh ghi vectơ khác. Điều này đơn giản
tệp đăng ký vector. Lấy hóa đáng kể việc xây dựng một đơn vị vectơ song song cao, có thể được cấu trúc thành
cảm hứng từ các làn
nhiều song song làn đường vector Như với đường cao tốc giao thông, chúng ta có thể
đường trên đường cao
tốc làm tăng tốc độ giao tăng thông lượng cực đại của một đơn vị vectơ bằng cách thêm nhiều làn đường. Hình 6.4
thông, nhiều làn đường cho thấy cấu trúc của một đơn vị vectơ bốn làn. Do đó, đi đến bốn làn đường từ một làn
thực hiện các hoạt động đường làm giảm số lượng đồng hồ trên mỗi hướng dẫn vector khoảng bốn lần. Để nhiều
vectơ cùng một lúc. làn đường có lợi thế, cả ứng dụng và kiến trúc phải hỗ trợ các vectơ dài. Nếu không,
chúng sẽ thực thi nhanh đến mức bạn sẽ hết hướng dẫn, yêu cầu mức hướng dẫn song
song kỹ thuật như những người trong Chương 4 đến cung cấp đủ hướng dẫn vector.
Nói chung, kiến trúc vector là một cách rất hiệu quả để thực hiện các chương
trình xử lý song song dữ liệu; chúng phù hợp hơn với công nghệ biên dịch hơn
các phần mở rộng đa phương tiện; và chúng dễ phát triển theo thời gian hơn các
phần mở rộng đa phương tiện cho kiến trúc x86.
Với các danh
mục cổ điển này,
tiếp theo chúng ta
sẽ thấy cách khai
thác các luồng
hướng dẫn song
song để cải thiện
hiệu suất của a
độc thân bộ xử lý,
mà chúng tôi sẽ sử
dụng lại với nhiều
bộ xử lý.
6.3 SISD, MIMD, SIMD, SPMD và Vector 533

Ngõ 0 Ngõ 1 Ngõ 2 Ngõ 3

Thêm FP Thêm FP Thêm FP Thêm FP


ống 0 ống 1 ống 2 ống 3

Vector Vector Vector Vector


đăng ký: đăng ký: đăng ký: đăng ký:
các yếu các yếu tố các yếu các yếu tố
tố 1,5,9 ,... tố 3,7,11 ,...
0,4,8 ,... 2,6,10 ,...

Mẹ FP Mẹ FP
Mẹ FP ống 1 Mẹ FP ống 3
ống 0 ống 2

Đơn vị lưu trữ tải Vector

HÌNH 6.4 Cấu trúc của một đơn vị vectơ chứa bốn làn. Các lưu trữ đăng ký vector là chia cho
các làn đường, với mỗi làn giữ mọi yếu tố thứ tư của mỗi thanh ghi vectơ. Hình này cho thấy ba đơn vị
chức năng vector: một bổ sung FP, nhân FP và đơn vị lưu trữ tải. Mỗi đơn vị số học vectơ chứa bốn đường
ống thực hiện, mỗi làn, hoạt động trong buổi hòa nhạc để hoàn thành một hướng dẫn vectơ duy nhất. Lưu
ý cách mỗi phần của tệp đăng ký vector chỉ cần cung cấp đủ các cổng đọc và ghi (xem Chương 4) cho các
đơn vị chức năng địa phương đến làn đường của nó.

Đúng hay sai: Như được minh họa trong x86, các phần mở rộng đa phương tiện Kiểm tra
có thể được coi là một kiến trúc vector với các vectơ ngắn chỉ hỗ trợ truyền dữ Bản thân bạn
liệu vector liền kề.

Xây dựng: Với những lợi thế của vector, tại sao aren chúng phổ biến hơn bên
ngoài điện toán hiệu năng cao? Đã có những lo ngại về trạng thái lớn hơn đối với các
thanh ghi vector làm tăng thời gian chuyển đổi ngữ cảnh và khó xử lý các lỗi trang
trong tải và lưu trữ vector và hướng dẫn SIMD đạt được một số lợi ích của hướng
dẫn vector. Ngoài ra, miễn là những tiến bộ trong song song cấp độ hướng dẫn có
thể mang lại lời hứa về hiệu suất của Định luật Moore, có rất ít lý do để có cơ hội thay
đổi phong cách kiến trúc.

Xây dựng: Một lợi thế khác của vector và phần mở rộng đa phương tiện là nó là
tương đối dễ dàng để mở rộng kiến trúc tập lệnh vô hướng với các hướng dẫn này
để cải thiện hiệu suất của các hoạt động song song dữ liệu.

Xây dựng: Bộ xử lý x86 thế hệ Haswell từ Intel hỗ trợ AVX2 , trong đó có một hoạt
động thu thập nhưng không phải là một hoạt động phân tán. Skylake và bộ xử lý thế
hệ sau hỗ trợ AVX512, bổ sung thêm một hoạt động phân tán.
534 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

phần cứng
đa luồng
Tăng cường sử dụng a
bộ xử lý bằng cách
6.4 Đa phần cứng
chuyển sang
một chủ đề khác khi một Một khái niệm liên quan đến MIMD, đặc biệt là từ quan điểm của lập trình viên,
chủ đề bị đình trệ. là đa luồng phần cứngTrong khi MIMD dựa vào nhiều. các quá trình hoặc là
chỉ Một chủ đề bao gồm chủ đề để cố gắng giữ cho nhiều bộ xử lý bận rộn, đa luồng phần cứng cho phép
bộ đếm chương trình, trạng nhiều luồng chia sẻ các đơn vị chức năng của a độc thân bộ xử lý theo kiểu chồng
thái đăng ký và ngăn xếp. chéo để cố gắng sử dụng các tài nguyên phần cứng một cách hiệu quả. Để cho
Đó là một quá trình nhẹ; phép chia sẻ này, bộ xử lý phải sao chép trạng thái độc lập của từng luồng. Ví dụ:
trong khi các chủ đề mỗi luồng sẽ có một bản sao riêng của tệp đăng ký và bộ đếm chương trình. Bản
thường chia sẻ một không thân bộ nhớ có thể được chia sẻ thông qua các cơ chế bộ nhớ ảo, vốn đã hỗ trợ lập
gian địa chỉ duy nhất, các trình đa chương trình. Ngoài ra, phần cứng phải hỗ trợ khả năng thay đổi sang
quy trình don don.
một luồng khác tương đối nhanh chóng. Cụ thể, một công tắc luồng phải hiệu quả
hơn nhiều so với công tắc xử lý, thường yêu cầu hàng trăm đến hàng ngàn chu kỳ
quá trình Một quá trình xử lý trong khi công tắc luồng có thể là tức thời.
bao gồm một hoặc nhiều
Có hai cách tiếp cận chính để đa luồng phần cứng. Hạt mịn đa luồng chuyển
luồng, không gian địa chỉ
và trạng thái hệ điều hành.
đổi giữa các luồng trên mỗi lệnh, dẫn đến thực hiện xen kẽ nhiều luồng. Sự xen
Do đó, một công tắc xử lý kẽ này thường được thực hiện theo kiểu vòng tròn, bỏ qua mọi sợi chỉ bị đình trệ
thường gọi hệ điều hành, ở chu kỳ đồng hồ đó. Để làm cho đa luồng hạt mịn thực tế, bộ xử lý phải có khả
nhưng không phải là một năng chuyển đổi các luồng trên mỗi chu kỳ đồng hồ. Một ưu điểm của đa luồng
công tắc luồng. hạt mịn là nó có thể che giấu các tổn thất thông lượng phát sinh từ cả các quầy
đa luồng hạt hàng ngắn và dài, vì các hướng dẫn từ các luồng khác có thể được thực hiện khi
mịn một luồng bị đình trệ. Nhược điểm chính của đa luồng hạt mịn là nó làm chậm
Một phiên bản đa luồng quá trình thực hiện các luồng riêng lẻ, vì một luồng sẵn sàng thực thi mà không
phần cứng ngụ ý chuyển có các ngăn sẽ bị trì hoãn bởi các hướng dẫn từ các luồng khác.
đổi giữa các luồng sau Đa luồng hạt thô được phát minh như là một thay thế cho hạt mịn đa luồng.
mỗi lệnh.
Các công tắc đa luồng hạt thô chỉ trên các quầy hàng đắt tiền, chẳng hạn như bỏ
đa luồng hạt thô lỡ bộ nhớ cache cấp cuối. Thay đổi này làm giảm nhu cầu chuyển đổi luồng cực
Một phiên bản đa luồng nhanh và ít có khả năng làm chậm quá trình thực hiện một luồng riêng lẻ, vì các
phần cứng ngụ ý chuyển
đổi giữa các luồng chỉ sau
hướng dẫn từ các luồng khác sẽ chỉ được ban hành khi một luồng gặp phải một
các sự kiện quan trọng, gian hàng tốn kém. Tuy nhiên, đa luồng hạt thô bị ảnh hưởng bởi một nhược
chẳng hạn như bỏ lỡ bộ điểm lớn: nó bị hạn chế về khả năng khắc phục tổn thất thông lượng, đặc biệt là
đệm cấp cuối. từ các quầy hàng ngắn hơn. Giới hạn này phát sinh từ đường ống chi phí khởi
nghiệp của đa luồng hạt thô. Bởi vì một bộ xử lý với đa luồng hạt thô phát hành
các hướng dẫn từ một luồng duy nhất, khi một gian hàng xảy ra, đường ống phải
được làm trống hoặc đông lạnh. Chủ đề mới bắt đầu thực hiện sau gian hàng phải
điền vào đường ống trước khi hướng dẫn có thể hoàn thành. Do chi phí khởi
nghiệp này, đa luồng hạt thô hữu ích hơn nhiều trong việc giảm hình phạt của các
quầy hàng giá rẻ, trong đó việc nạp lại đường ống không đáng kể so với thời gian
ngừng hoạt động.
6.4 Đa luồng phần cứng 535

Đa luồng đồng thời (SMT) là một biến thể của đa luồng phần cứng sử dụng tài
nguyên của nhiều vấn đề, được lên lịch động đường ống bộ xử lý để khai thác song
song cấp độ luồng đồng thời khai thác song song cấp độ lệnh (xem Chương 4). Cái
nhìn sâu sắc chính thúc đẩy SMT là bộ xử lý nhiều vấn đề thường có sẵn song song
đơn vị chức năng hơn hầu hết các luồng đơn lẻ có thể sử dụng hiệu quả. Hơn nữa, với
việc đổi tên đăng ký và lập lịch động (xem Chương 4), nhiều hướng dẫn từ các luồng
độc lập có thể được ban hành mà không liên quan đến sự phụ thuộc giữa chúng; độ
phân giải của các phụ thuộc có thể được xử lý bằng khả năng lập lịch động.
Vì SMT dựa vào các cơ chế động hiện có, nên nó không chuyển đổi tài đa luồng đồng thời
nguyên theo mọi chu kỳ. Thay vào đó, SMT là luôn luôn thực hiện các hướng (SMT) Một phiên bản đa
dẫn từ nhiều luồng, để nó đến phần cứng để liên kết các khe lệnh và đổi tên các luồng làm giảm chi phí đa
thanh ghi với các luồng thích hợp của chúng. luồng bằng cách sử dụng
Hình 6.5 về mặt khái niệm minh họa sự khác biệt trong khả năng khai thác của bộ xử các tài nguyên cần thiết
cho nhiều vấn đề, kiến
lý tài nguyên siêu thanh cho các cấu hình bộ xử lý sau. Phần trên cùng cho thấy trúc vi mô theo lịch trình
động.
Phát hành khe
Chủ đề A Chủ đề B Chủ đề C Chủ đề D

Thời gian

Phát hành khe


MT thô MT tốt SMT
Thời gian

HÌNH 6.5 Làm thế nào bốn luồng sử dụng các khe vấn đề của bộ xử lý siêu âm trong các
cách tiếp cận khác nhau. Bốn luồng ở trên cùng cho thấy mỗi luồng sẽ thực hiện chạy một mình theo
tiêu chuẩn bộ xử lý superscalar mà không cần hỗ trợ đa luồng. Ba ví dụ ở phía dưới cho thấy cách họ sẽ
thực thi chạy cùng nhau trong ba tùy chọn đa luồng. Kích thước ngang thể hiện khả năng phát hành lệnh
trong mỗi chu kỳ đồng hồ. Kích thước dọc đại diện cho một chuỗi các chu kỳ đồng hồ. Một hộp trống
(trắng) chỉ ra rằng khe vấn đề tương ứng không được sử dụng trong chu kỳ đồng hồ đó. Các sắc thái của
màu xám và màu tương ứng với bốn sợi khác nhau trong bộ xử lý đa luồng. Các hiệu ứng khởi động
đường ống bổ sung cho đa luồng thô, không được minh họa trong hình này, sẽ dẫn đến mất thêm thông
lượng cho đa luồng thô.
536 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

làm thế nào bốn luồng sẽ thực thi độc lập trên một siêu sao không có hỗ trợ đa luồng.
Phần dưới cùng cho thấy bốn luồng có thể được kết hợp để thực thi trên bộ xử lý hiệu quả
hơn bằng ba tùy chọn đa luồng :
n Một siêu âm với đa luồng hạt thô
n Một siêu sao với đa luồng hạt mịn
n Một siêu âm với đa luồng đồng thời
Trong superscalar không có hỗ trợ đa luồng phần cứng, việc sử dụng các khe
vấn đề bị hạn chế do thiếu song song cấp độ hướng dẫnNgoài ra, một gian hàng
lớn, chẳng hạn như bỏ lỡ bộ nhớ cache lệnh, có thể khiến toàn bộ bộ xử lý không
hoạt động.
Trong siêu sao đa luồng hạt thô, các quầy hàng dài được ẩn một phần bằng
cách chuyển sang một luồng khác sử dụng tài nguyên của bộ xử lý. Mặc dù điều
này làm giảm số chu kỳ đồng hồ hoàn toàn không hoạt động, nhưng chi phí khởi
động đường ống vẫn dẫn đến chu kỳ không tải và các hạn chế đối với ILP có
nghĩa là tất cả các khe vấn đề sẽ không được sử dụng. Trong trường hợp hạt mịn,
sự xen kẽ của các sợi chủ yếu giúp loại bỏ các chu kỳ đồng hồ nhàn rỗi. Tuy
nhiên, chỉ có một luồng duy nhất đưa ra các hướng dẫn trong một chu kỳ xung
nhịp nhất định, tuy nhiên, những hạn chế trong song song cấp độ lệnh vẫn dẫn
đến các khe không tải trong một số chu kỳ đồng hồ.

2,00

Tăng tốc Hiệu quả năng lượng


i7 SMT hiệu suất và tỷ lệ hiệu quả năng lượng

1,75

1,50

1.25

1,00

0,75
Truyền phát trực tuy ến
Vips ×

m 264
BlackscholesBodytrack FluidanimateRaytrace Swaptions

CannealFacesi Ferret
HÌNH 6.6 Việc tăng tốc từ việc sử dụng đa luồng trên một lõi trên bộ xử lý i7 trung bình 1,31 cho
các điểm chuẩn PARSEC (xem Mục 6.10) và cải thiện hiệu quả năng lượng là 1,07. Những dữ
liệu này được thu thập và phân tích bởi Esmaeilzadeh et al. [2011].
6.5 Bộ đa xử lý bộ nhớ chia sẻ và nhiều bộ nhớ khác 537

Trong trường hợp SMT, song song cấp độ luồng và song song cấp độ lệnh đều
được khai thác, với nhiều luồng sử dụng các khe vấn đề trong một chu kỳ đồng
hồ. Lý tưởng nhất là việc sử dụng khe vấn đề bị giới hạn bởi sự mất cân đối trong
nhu cầu tài nguyên và tính sẵn có của tài nguyên trên nhiều luồng. Trong thực tế,
các yếu tố khác có thể hạn chế số lượng khe được sử dụng. Mặc dù Hình 6.5 đơn
giản hóa rất nhiều hoạt động thực sự của các bộ xử lý này, nó minh họa các lợi
thế hiệu suất tiềm năng của đa luồng nói chung và SMT nói riêng.
Hình 6.6 vẽ các hiệu suất và lợi ích năng lượng của đa luồng trên một bộ xử lý
duy nhất của Intel Core i7 960, có hỗ trợ phần cứng cho hai luồng, cũng như i7
6700 gần đây hơn. Những thay đổi giữa i7 920 và 6700 là tương đối nhỏ và
không có khả năng thay đổi đáng kể kết quả trong con số này. Tốc độ tăng tốc
trung bình là 1,31, không tệ khi có thêm nguồn lực khiêm tốn cho đa luồng phần
cứng. Sự cải thiện trung bình về hiệu quả năng lượng là 1,07, rất tuyệt vời. Nói
chung, bạn sẽ hài lòng với tốc độ tăng tốc là trung tính năng lượng.
Bây giờ chúng ta đã thấy nhiều luồng có thể sử dụng tài nguyên của một bộ xử lý hiệu
quả hơn như thế nào, tiếp theo chúng ta sẽ chỉ ra cách sử dụng chúng để khai thác nhiều
bộ xử lý.

1. Đúng hay sai: Cả đa luồng và đa lõi đều dựa vào tính song song để có Kiểm tra
được hiệu quả cao hơn từ chip. Bản thân bạn
2. Đúng hay sai : Đồng thời đa luồng (SMT) sử dụng các luồng để cải thiện
việc sử dụng tài nguyên của bộ xử lý ngoài thứ tự được lên lịch động.

Nhiều bộ nhớ và bộ nhớ chia sẻ


khác
6.5
Bộ đa xử lý

Trong khi đa luồng phần cứng cải thiện hiệu quả của bộ xử lý với chi phí khiêm
tốn, một thách thức lớn của thập kỷ trước là mang lại hiệu suất truyền thống của
Định luật Moore bằng cách lập trình hiệu quả số lượng bộ xử lý trên mỗi chip
ngày càng tăng.
Do khó khăn trong việc viết lại các chương trình cũ để chạy tốt trên phần cứng
song song, một câu hỏi tự nhiên là: các nhà thiết kế máy tính có thể làm gì để đơn
giản hóa nhiệm vụ? Một câu trả lời là cung cấp một không gian địa chỉ vật lý duy
nhất mà tất cả các bộ xử lý có thể chia sẻ, do đó các chương trình không cần quan
tâm đến dữ liệu của họ, chỉ đơn thuần là các chương trình có thể được thực thi
song song. Theo cách tiếp cận này, tất cả các biến của chương trình có thể được
cung cấp bất cứ lúc nào cho bất kỳ bộ xử lý nào. Thay thế là có một không gian
địa chỉ riêng cho mỗi bộ xử lý yêu cầu chia sẻ phải rõ ràng; chúng tôi sẽ mô tả
tùy chọn này trong Mục 6.8 Khi không gian địa chỉ vật lý là phổ biến thì phần
cứng thường cung cấp sự gắn kết bộ đệm để đưa ra một cái nhìn nhất quán về bộ
nhớ dùng chung (xem. Mục 5.8).
Như đã đề cập ở trên, a bộ nhân chia sẻ bộ nhớ (SMP) là một trong đó cung cấp
cho lập trình viên a không gian địa chỉ vật lý duy nhất trên tất cả các bộ xử lý
538 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

truy cập bộ nhớ thống gần như luôn luôn là trường hợp cho chip đa lõi mặc dù một thuật ngữ chính xác
nhất (UMA) Một bộ xử hơn sẽ được chia sẻ-Địa chỉ bộ vi xử lý. Bộ xử lý giao tiếp thông qua các biến
lý trong đó độ trễ của bất
được chia sẻ trong bộ nhớ, với tất cả các bộ xử lý có khả năng truy cập bất kỳ vị
kỳ từ nào trong bộ nhớ
chính là như nhau cho dù
trí bộ nhớ nào thông qua tải và lưu trữ. Hình 6.7 cho thấy tổ chức cổ điển của
bộ xử lý nào yêu cầu quyền một SMP. Lưu ý rằng các hệ thống như vậy vẫn có thể chạy các công việc độc
truy cập. lập trong không gian địa chỉ ảo của riêng họ, ngay cả khi tất cả chúng đều chia sẻ
một không gian địa chỉ vật lý.
truy cập bộ nhớ
Bộ nhân không gian địa chỉ đơn có hai kiểu. Trong kiểu đầu tiên, độ trễ của
không đồng nhất
(NUMA) Một loại của một từ trong bộ nhớ không phụ thuộc vào bộ xử lý nào yêu cầu nó. Máy như vậy
bộ nhân không gian địa được gọi truy cập bộ nhớ thống nhất (UMA) bộ nhân. Trong kiểu thứ hai, một
chỉ đơn trong đó một số số truy cập bộ nhớ nhanh hơn nhiều so với các bộ xử lý khác, tùy thuộc vào bộ
truy cập bộ nhớ nhanh xử lý nào yêu cầu từ nào, điển hình là vì bộ nhớ chính được chia và gắn vào các
hơn nhiều so với các bộ bộ xử lý khác nhau hoặc cho các bộ điều khiển bộ nhớ khác nhau trên cùng một
xử lý khác tùy thuộc vào chip. Máy như vậy được gọi truy cập bộ nhớ không đồng nhất (NUMA) bộ
bộ xử lý nào yêu cầu từ nhân. Như bạn có thể mong đợi, các thử thách lập trình khó hơn đối với bộ đa xử
nào.
lý NUMA so với bộ đa xử lý UMA, nhưng máy NUMA có thể mở rộng đến kích
đồng bộ hóa Các quá thước lớn hơn và NUMA có thể có độ trễ thấp hơn so với bộ nhớ gần đó.
trình phối hợp hành vi Vì các bộ xử lý hoạt động song song thường sẽ chia sẻ dữ liệu, chúng cũng cần
của hai hoặc nhiều quy phối hợp khi vận hành trên dữ liệu được chia sẻ; mặt khác, một bộ xử lý có thể
trình, có thể đang chạy
bắt đầu làm việc trên dữ liệu trước khi một bộ xử lý khác kết thúc với nó. Sự phối
trên các bộ xử lý khác
nhau.
hợp này được gọi đồng bộ hóa, mà chúng tôi đã thấy trong Chương 2. Khi chia
sẻ được hỗ trợ với a không gian địa chỉ đơn, phải có một cơ chế riêng để đồng bộ
khóa Một sự đồng bộ hóa. Một cách tiếp cận sử dụng a khóa cho một biến chia sẻ. Chỉ có một bộ xử lý
hóa thiết bị cho phép
tại một thời điểm có thể có được khóa và các bộ xử lý khác quan tâm đến dữ liệu
truy cập dữ liệu chỉ một
bộ xử lý tại một thời
được chia sẻ phải đợi cho đến khi bộ xử lý ban đầu mở khóa biến. Mục 2.11 của
điểm. Chương 2 mô tả các hướng dẫn để khóa trong tập lệnh RISC-V.

Bộ xử lý Bộ xử lý ... Bộ xử lý

Bộ nhớ Bộ nhớ ... Bộ nhớ cache


cache cache

Mạng kết nối

Ký ức Tô
i/
O

HÌNH 6.7 Tổ chức cổ điển của bộ đa xử lý bộ nhớ dùng chung.


6.5 Bộ đa xử lý bộ nhớ chia sẻ và nhiều bộ nhớ khác 539

Chương trình xử lý song song đơn giản cho không gian địa chỉ chung
VÍ DỤ
Giả sử chúng ta muốn tổng hợp 64.000 số trên máy tính đa bộ nhớ dùng
chung với thời gian truy cập bộ nhớ thống nhất. Hãy giả sử chúng ta có 64
bộ xử lý.

Bước đầu tiên là đảm bảo tải cân bằng cho mỗi bộ xử lý, vì vậy chúng tôi
chia tập hợp các số thành các tập con có cùng kích thước. Chúng tôi không TRẢ LỜI
phân bổ các tập con cho một không gian bộ nhớ khác nhau, vì có một không
gian bộ nhớ duy nhất cho máy này; chúng tôi chỉ cung cấp các địa chỉ bắt
đầu khác nhau cho mỗi bộ xử lý. Pn là số xác định bộ xử lý, trong khoảng từ
0 đến 63. Tất cả các bộ xử lý bắt đầu chương trình bằng cách chạy một vòng
tổng hợp tập hợp con số của họ :
tổng [Pn] = 0;
cho (i = 1000 * Pn; i <1000 * (Pn + 1); i + = 1)
tổng [Pn] + = A [i]; / * tổng các khu vực được chỉ định * /

(Lưu ý mã C i + = 1 chỉ là một cách ngắn hơn để nói i = i + 1.)


giảm Một chức năng
Bước tiếp theo là thêm 64 khoản tiền một phần này. Bước này được gọi là a xử lý cấu trúc dữ liệu
giảm, nơi chúng ta chia rẽ để chinh phục. Một nửa số bộ xử lý thêm các cặp và trả về một giá trị
tổng một phần, và sau đó thêm một phần tư các cặp tổng mới, v.v. cho đến duy nhất.
khi chúng ta có tổng cuối cùng, duy nhất. Hình 6.8 minh họa bản chất phân
cấp của việc giảm này.
Trong ví dụ này, hai bộ xử lý phải đồng bộ hóa trước khi bộ xử lý của người
tiêu dùng trên mạng cố gắng đọc kết quả từ vị trí bộ nhớ được viết bởi bộ xử lý
của nhà sản xuất trên máy tính; nếu không, người tiêu dùng có thể đọc giá trị cũ
của

0
(một nửa
= 1) 0 1
(một nửa
= 2) 0 1 2 3
(một nửa
= 4) 0 1 2 3 4567

HÌNH 6.8 Bốn mức giảm cuối cùng tổng kết quả từ mỗi bộ xử lý, từ dưới lên trên. Đối
với tất cả các bộ xử lý có số i nhỏ hơn một nửa, hãy thêm tổng được tạo bởi số bộ xử lý (i + một nửa)
đến tổng của nó.
540 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

dữ liệu. Chúng tôi muốn mỗi bộ xử lý có phiên bản riêng của biến bộ đếm
vòng lặp Tôi, vì vậy chúng tôi phải chỉ ra rằng đó là một biến riêng tư của
người Viking. Đây là mã (một nửa cũng là riêng tư) :
một nửa = 64; / * 64 bộ xử lý trong bộ xử lý đa xử lý * / làm

đồng bộ hóa (); / * chờ hoàn thành một phần tổng * /


nếu (một nửa% 2 != 0 && Pn == 0)
tổng [0] + = tổng [nửa trận1];
/ * Tổng có điều kiện cần thiết khi một nửa là
lẻ; Bộ xử lý0 bị thiếu phần tử * /
nửa = nửa / 2; / * chia dòng trên ai tổng * /
if (Pn <nửa) sum [Pn] + = sum [Pn + nửa];
trong khi (một nửa> 1); / * thoát với tổng cuối cùng trong Sum [0] * /

Giao diện Với mối quan tâm lâu dài trong lập trình song song, đã có hàng trăm nỗ lực để
xây dựng các hệ thống lập trình song song. Một ví dụ hạn chế nhưng phổ biến là
phần OpenMP Nó chỉ là một. Giao diện lập trình viên ứng dụng (API) cùng với một
cứng / tập hợp các chỉ thị trình biên dịch, biến môi trường và thói quen thư viện thời
phần gian chạy có thể mở rộng các ngôn ngữ lập trình tiêu chuẩn. Nó cung cấp một
mô hình lập trình đơn giản, có thể mở rộng và đơn giản cho bộ đa xử lý bộ nhớ
mềm dùng chung. Mục tiêu chính của nó là song song các vòng lặp và thực hiện giảm.
Hầu hết các trình biên dịch C đã có hỗ trợ cho OpenMP. Lệnh sử dụng API
OpenMP Một API
để nhân bộ nhớ chia OpenMP với trình biên dịch UNIX C là chính xác
sẻ trong C , ccTHERfopenmp foo.c
C ++ hoặc Fortran chạy
trên nền tảng UNIX và OpenMP mở rộng C bằng cách sử dụng thực dụng, đó chỉ là các lệnh cho bộ
Microsoft. Nó bao gồm tiền xử lý macro C như thế nào # xác định và #includeĐể đặt số lượng bộ xử lý mà
các chỉ thị biên dịch, thư chúng tôi muốn sử dụng là 64, như chúng tôi muốn trong ví dụ trên, chúng tôi chỉ
viện và chỉ thị thời gian
sử dụng lệnh.
chạy.
#define P 64 / * xác định một hằng số mà chúng tôi sẽ sử dụng một vài lần * /
#pragma ump song song num_threads (P)

Đó là, các thư viện thời gian chạy nên sử dụng 64 luồng song song.
Để biến tuần tự cho vòng lặp thành song song cho vòng lặp phân chia công
việc bằng nhau giữa tất cả các luồng mà chúng tôi đã bảo nó sử dụng, chúng tôi
chỉ cần viết (giả sử Tổng được khởi tạo thành 0)
#pragma ump song song cho
cho (Pn = 0; Pn <P; Pn + = 1)
cho (i = 0; 1000 * Pn; i <1000 * (Pn + 1); i + = 1)
tổng [Pn] + = A [i]; / * tổng các khu vực được chỉ định * /
6.5 Bộ đa xử lý bộ nhớ chia sẻ và nhiều bộ nhớ khác 541

Để thực hiện giảm, chúng ta có thể sử dụng một lệnh khác cho OpenMP biết
toán tử giảm là gì và biến nào bạn cần sử dụng để đặt kết quả giảm.
#pragma ump song song để giảm (+: FinalSum)
cho (i = 0; i <P; i + = 1)
FinalSum + = tổng [i]; / * Giảm xuống một số duy nhất * /
Lưu ý rằng giờ đây tùy thuộc vào thư viện OpenMP để tìm mã hiệu quả để tổng
hợp 64 số một cách hiệu quả bằng cách sử dụng 64 bộ xử lý.
Mặc dù OpenMP giúp dễ dàng viết mã song song đơn giản, nhưng nó không
hữu ích lắm khi gỡ lỗi, vì vậy nhiều lập trình viên sử dụng các hệ thống lập trình
song song tinh vi hơn OpenMP, giống như nhiều lập trình viên ngày nay sử dụng
ngôn ngữ hiệu quả hơn C .

Với chuyến tham quan phần cứng và phần mềm MIMD cổ điển này, bước tiếp
theo của chúng tôi là chuyến tham quan kỳ lạ hơn về một loại kiến trúc MIMD
với một di sản khác và do đó là một quan điểm rất khác về thử thách lập trình
song song.

Đúng hay sai: Bộ nhân bộ nhớ dùng chung không thể tận dụng tính song song Kiểm tra
cấp độ tác vụ. Bản thân bạn

Xây dựng: Một số nhà văn đã sử dụng lại từ viết tắt SMP có nghĩa là đối xứng bộ
vi xử lý, để chỉ ra rằng độ trễ từ bộ xử lý đến bộ nhớ là về tương tự cho tất cả các bộ
xử lý. Sự thay đổi này được thực hiện để đối chiếu chúng với các bộ xử lý đa năng
NUMA quy mô lớn, vì cả hai lớp đều sử dụng một không gian địa chỉ duy nhất. Vì các
cụm đã trở nên phổ biến hơn nhiều so với bộ đa xử lý NUMA quy mô lớn, trong cuốn
sách này, chúng tôi khôi phục SMP theo ý nghĩa ban đầu của nó và sử dụng nó để
tương phản với các cụm sử dụng nhiều không gian địa chỉ, chẳng hạn như các cụm.

Xây dựng: Một cách khác để chia sẻ không gian địa chỉ vật lý sẽ có tách không
gian địa chỉ vật lý nhưng chia sẻ một không gian địa chỉ ảo chung, để nó lên hệ điều
hành để xử lý giao tiếp. Cách tiếp cận này đã được thử, nhưng nó có chi phí quá cao
để cung cấp một sự trừu tượng bộ nhớ chia sẻ thực tế cho lập trình viên định hướng
hiệu suất.
542 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

6.6 Giới thiệu về các đơn vị xử lý đồ họa

Lý do ban đầu để thêm hướng dẫn SIMD vào các kiến trúc hiện có là nhiều bộ vi
xử lý được kết nối với màn hình đồ họa trong PC và máy trạm, do đó, một phần
thời gian xử lý ngày càng tăng được sử dụng cho đồ họa. Khi Moore Moore Law
tăng số lượng bóng bán dẫn có sẵn cho các bộ vi xử lý, do đó, nó có ý nghĩa để
cải thiện xử lý đồ họa.
Một động lực chính để cải thiện xử lý đồ họa là ngành công nghiệp trò chơi
máy tính, cả trên PC và trong các máy chơi game chuyên dụng như Sony
PlayStation. Thị trường trò chơi đang phát triển nhanh chóng khuyến khích nhiều
công ty đầu tư ngày càng tăng để phát triển phần cứng đồ họa nhanh hơn và vòng
phản hồi tích cực này đã giúp xử lý đồ họa cải thiện với tốc độ nhanh hơn so với
xử lý mục đích chung trong các bộ vi xử lý chính thống.
Cho rằng cộng đồng đồ họa và trò chơi có các mục tiêu khác với cộng đồng phát
triển vi xử lý, nó đã phát triển phong cách xử lý và thuật ngữ riêng. Khi các bộ xử lý
đồ họa tăng sức mạnh, họ đã kiếm được tên Đơn vị xử lý đồ họa, hoặc là GPU, để
phân biệt với CPU.
Với vài trăm đô la, bất kỳ ai cũng có thể mua GPU ngày hôm nay với hàng
trăm đơn vị dấu phẩy động song song, giúp điện toán hiệu năng cao dễ tiếp cận
hơn. Sự quan tâm đến điện toán GPU nảy sinh khi tiềm năng này được kết hợp
với ngôn ngữ lập trình giúp GPU dễ lập trình hơn. Do đó, nhiều lập trình viên của
các ứng dụng khoa học và đa phương tiện ngày nay đang cân nhắc xem có nên sử
dụng GPU hay CPU hay không.
(Phần này tập trung vào việc sử dụng GPU cho điện toán. Để xem cách tính
toán GPU kết hợp với vai trò truyền thống của gia tốc đồ họa, xem
Phụ lục B).
Dưới đây là một số đặc điểm chính về cách GPU thay đổi so với CPU :
n GPU là các bộ tăng tốc bổ sung CPU, vì vậy chúng không cần phải thực
hiện tất cả các tác vụ của CPU. Vai trò này cho phép họ dành tất cả tài
nguyên của họ cho đồ họa. Nó rất tốt cho các GPU để thực hiện một số
nhiệm vụ kém hoặc hoàn toàn không, vì trong một hệ thống có cả CPU và
GPU, CPU có thể thực hiện chúng nếu cần.
n Các kích thước sự cố GPU thường là hàng trăm megabyte đến gigabyte,
nhưng không phải hàng trăm gigabyte đến terabyte.
Những khác biệt này dẫn đến các phong cách kiến trúc khác nhau :
n Có lẽ sự khác biệt lớn nhất là GPU không dựa vào bộ nhớ đa cấp để vượt qua
độ trễ dài đến bộ nhớ, cũng như CPU. Thay vào đó, GPU dựa vào đa luồng
phần cứng (Mục 6.4) để ẩn độ trễ đến bộ nhớ. Đó là, giữa thời gian yêu cầu bộ
nhớ và thời điểm dữ liệu đến, GPU thực thi hàng trăm hoặc hàng ngàn luồng
độc lập với yêu cầu đó.
6.6 Giới thiệu về các đơn vị xử lý đồ họa 543

n Do đó, bộ nhớ GPU được định hướng theo băng thông thay vì độ trễ. Thậm
chí còn có các chip DRAM đồ họa đặc biệt cho GPU rộng hơn và có băng
thông cao hơn chip DRAM cho CPU. Ngoài ra, bộ nhớ GPU có truyền
thống có những bộ nhớ chính nhỏ hơn bộ vi xử lý thông thường. Vào năm
2020, GPU thường có 4 đến 16 GiB hoặc ít hơn, trong khi CPU có từ 64
đến 512 GiB trở lên. Cuối cùng, hãy nhớ rằng để tính toán cho mục đích
chung, bạn phải bao gồm thời gian để truyền dữ liệu giữa bộ nhớ CPU và
bộ nhớ GPU, vì GPU là bộ đồng xử lý.
n Do sự phụ thuộc vào nhiều luồng để cung cấp băng thông bộ nhớ tốt, GPU
có thể chứa nhiều bộ xử lý song song (MIMD) cũng như nhiều luồng. Do
đó, mỗi bộ xử lý GPU có nhiều luồng hơn so với CPU thông thường, cộng
với chúng có nhiều bộ xử lý hơn.

Mặc dù GPU được thiết kế cho một bộ ứng dụng hẹp hơn, một số lập trình viên Giao diện
tự hỏi liệu họ có thể chỉ định ứng dụng của họ ở dạng cho phép họ khai thác hiệu
suất tiềm năng cao của GPU hay không. Sau khi mệt mỏi khi cố gắng chỉ định
phần
các vấn đề của họ bằng cách sử dụng API đồ họa và ngôn ngữ, họ đã phát triển cứng /
các ngôn ngữ lập trình lấy cảm hứng từ C để cho phép họ viết chương trình trực phần
tiếp cho GPU. Một ví dụ là NVIDIA CUDA (Tính toán kiến trúc thiết bị hợp
nhất), cho phép lập trình viên viết các chương trình C để thực thi trên GPU, mặc mềm
dù có một số hạn chế. Phụ lục B đưa ra ví dụ về mã CUDA. (OpenCL là một
sáng kiến của nhiều công ty để phát triển một ngôn ngữ lập trình di động
cung cấp nhiều lợi ích của CUDA.)
NVIDIA quyết định rằng chủ đề thống nhất của tất cả các hình thức song song
này là Chủ đề CUDASử dụng mức độ song song thấp nhất này làm nguyên thủy
lập trình, trình biên dịch và phần cứng có thể ghép hàng ngàn luồng CUDA lại
với nhau để sử dụng các kiểu song song khác nhau trong GPU: đa luồng, MIMD,
SIMD và song song cấp độ hướng dẫn. Các luồng này được chặn lại với nhau và
được thực hiện theo nhóm 32 tại một thời điểm. Một bộ xử lý đa luồng bên trong
GPU thực thi các khối luồng này và GPU bao gồm 8 đến 128 bộ xử lý đa luồng
này.

Giới thiệu về Kiến trúc GPU NVIDIA


Chúng tôi sử dụng các hệ thống NVIDIA làm ví dụ vì chúng là đại diện của kiến
trúc GPU. Cụ thể, chúng tôi tuân theo thuật ngữ của ngôn ngữ lập trình song song
CUDA và sử dụng kiến trúc Fermi làm ví dụ.
Giống như kiến trúc vector, GPU chỉ hoạt động tốt với các vấn đề song song ở cấp
độ dữ liệu. Cả hai kiểu đều có truyền dữ liệu phân tán và bộ xử lý GPU thậm chí còn
nhiều hơn thế
544 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

đăng ký hơn làm bộ xử lý vector. Không giống như hầu hết các kiến trúc vector,
GPU cũng dựa vào đa luồng phần cứng trong một bộ xử lý SIMD đa luồng duy
nhất để ẩn độ trễ bộ nhớ (xem Mục 6.4).
Bộ xử lý SIMD đa luồng tương tự như bộ xử lý vector, nhưng trước đây có
nhiều đơn vị chức năng song song thay vì chỉ một số ít được đặt sâu, cũng như
sau này.
Như đã đề cập ở trên, GPU chứa một bộ xử lý SIMD đa luồng; nghĩa là, GPU
là một MIMD bao gồm các bộ xử lý SIMD đa luồng. Ví dụ, NVIDIA có bốn
triển khai Tesla ở các mức giá khác nhau với bộ xử lý SIMD đa luồng 15, 24, 56
hoặc 80. Để cung cấp khả năng mở rộng trong suốt trên các mô hình GPU với số
lượng bộ xử lý SIMD đa luồng khác nhau, phần cứng Trình lập lịch khối luồng
chỉ định các khối luồng cho bộ xử lý SIMD đa luồng. Hình 6.9 hiển thị sơ đồ
khối đơn giản của bộ xử lý SIMD đa luồng.
Giảm xuống một cấp độ chi tiết hơn, đối tượng máy mà phần cứng tạo, quản lý, lên
lịch và thực thi là a chủ đề của hướng dẫn SIMD, mà chúng tôi cũng sẽ gọi là a Chủ
đề SIMD Nó là một chủ đề truyền thống, nhưng nó chứa các hướng dẫn SIMD độc
quyền. Các luồng SIMD này có bộ đếm chương trình riêng và chúng chạy trên bộ xử
lý SIMD đa luồng. Các. Bộ lập lịch chủ đề SIMD bao gồm một bộ điều khiển cho
phép nó biết các luồng hướng dẫn SIMD nào đã sẵn sàng để chạy và sau đó nó sẽ gửi
chúng đến một đơn vị điều phối để chạy trên đa luồng

Đăng ký hướng dẫn

Làn đường SIMD


(Chủ đề
Bộ xử lý)
Regi- Reg Reg Reg Reg Reg Reg Reg Reg Reg Reg Reg Reg Reg Reg Reg
sters
1K × 32 1K ×
32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32 1K × 32

Tải Tải Tải Tải Tải Tải Tải Tải Tải Tải Tải Tải Tải Tải Tải Tải
cửa cửa cửa cửa cửa cửa cửa cửa cửa cửa cửa cửa cửa cửa cửa cửa
hàng hàng hàng hàng hàng hàng hàng hàng hàng hàng hàng hàng hàng hàng hàng hàng
đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị đơn vị

Địa chỉ đơn vị liên kết Mạng kết nối

Toàn cầu
Ký ức địa phương Ký ức
64 KiB

HÌNH 6.9 Đơn giản hóa sơ đồ khối của datapath của Bộ xử lý SIMD đa luồng.
Nó có 16 làn SIMD. Bộ lập lịch chủ đề SIMD có nhiều luồng SIMD độc lập mà nó chọn để chạy trên bộ
xử lý này.
6.6 Giới thiệu về các đơn vị xử lý đồ họa 545

Bộ xử lý SIMD. Nó giống hệt với bộ lập lịch luồng phần cứng trong bộ xử lý đa
luồng truyền thống (xem Mục 6.4), ngoại trừ việc nó đang lên lịch các luồng
hướng dẫn SIMD. Do đó, phần cứng GPU có hai cấp độ lập lịch phần cứng :
1. Các Chủ đề khối lịch trình gán các khối luồng cho bộ xử lý SIMD đa
luồng và
2. Bộ lập lịch chủ đề SIMD trong bộ xử lý SIMD, lên lịch khi các luồng
SIMD sẽ chạy.
Các hướng dẫn SIMD của các luồng này rộng 32, do đó, mỗi luồng của hướng
dẫn SIMD sẽ tính toán 32 yếu tố của tính toán. Vì luồng bao gồm các hướng dẫn
SIMD, bộ xử lý SIMD phải có các đơn vị chức năng song song để thực hiện thao
tác. Chúng tôi gọi cho họ Làn đường SIMDvà chúng khá giống với Vector Lanes
Mục 6.3.

Xây dựng: Mỗi luồng hướng dẫn SIMD rộng 32 được ánh xạ tới 16 làn SIMD , vì
vậy mỗi lệnh SIMD trong một luồng hướng dẫn SIMD phải mất hai chu kỳ đồng hồ để
hoàn thành. Mỗi luồng hướng dẫn SIMD được thực hiện theo bước khóa. Giữ
nguyên sự tương đồng của bộ xử lý SIMD như một bộ xử lý vector, bạn có thể nói
rằng nó có 16 làn và chiều dài vector sẽ là 32. Bản chất rộng nhưng nông này là lý do
tại sao chúng tôi sử dụng thuật ngữ bộ xử lý SIMD thay vì bộ xử lý vector, vì nó trực
quan hơn.
Do theo định nghĩa, các luồng của hướng dẫn SIMD là độc lập, Bộ lập lịch chủ đề
SIMD có thể chọn bất kỳ luồng nào của hướng dẫn SIMD đã sẵn sàng và không cần
phải tuân theo hướng dẫn SIMD tiếp theo trong chuỗi trong một luồng. Do đó, sử
dụng thuật ngữ của Mục 6.4, nó sử dụng đa luồng hạt mịn.
Để chứa các thành phần bộ nhớ này, bộ xử lý SIMD có các thanh ghi 32 bit ấn
tượng 32.768. Giống như bộ xử lý vector, các thanh ghi này được chia một cách hợp
lý trên các làn vector hoặc, trong trường hợp này là các làn SIMD. Mỗi luồng SIMD
được giới hạn không quá 64 thanh ghi, do đó bạn có thể nghĩ về một luồng SIMD có
tới 64 thanh ghi vector, với mỗi thanh ghi vector có 32 phần tử và mỗi phần tử rộng
32 bit.
Vì nó có 16 làn SIMD, mỗi làn chứa 2048 thanh ghi. Mỗi luồng CUDA có một phần
tử của mỗi thanh ghi vector. Lưu ý rằng luồng CUDA chỉ là một đường cắt dọc của
một luồng hướng dẫn SIMD, tương ứng với một phần tử được thực hiện bởi một làn
đường SIMD. Coi chừng các luồng CUDA rất khác với các luồng POSIX; bạn có thể
thực hiện các cuộc gọi hệ thống tùy ý hoặc đồng bộ hóa tùy ý trong một luồng CUDA.

Cấu trúc bộ nhớ GPU NVIDIA


Hình 6.10 hiển thị cấu trúc bộ nhớ của GPU NVIDIA. Chúng tôi gọi bộ nhớ trên
chip là cục bộ cho mỗi bộ xử lý SIMD đa luồng Ký ức địa phương Nó được chia
sẻ bởi các làn SIMD trong bộ xử lý SIMD đa luồng, nhưng bộ nhớ này không
được chia sẻ giữa các bộ xử lý SIMD đa luồng. Chúng tôi gọi DRAM tắt chip
được chia sẻ bởi toàn bộ GPU và tất cả các khối luồng. Bộ nhớ GPU.
Thay vì dựa vào các bộ nhớ cache lớn để chứa toàn bộ bộ công việc của ứng dụng,
GPU thường sử dụng các bộ đệm phát trực tuyến nhỏ hơn và dựa vào việc đa luồng
rộng rãi các luồng của hướng dẫn SIMD để ẩn độ trễ dài cho DRAM ,
546 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Chủ đề CUDA

Bộ nhớ riêng tư theo chủ đề CUDA

Chủ đề khối

Mỗi khối
Ký ức địa phương

Lưới 0 Trình tự

...

Đồng bộ hóa giữa các lưới Bộ nhớ GPU


Lưới 1

...

Cấu trúc bộ nhớ GPU HÌNH 6.10. Bộ nhớ GPU được chia sẻ bởi các vòng lặp vector hóa. Tất cả các
chủ đề hướng dẫn SIMD trong một khối luồng chia sẻ Bộ nhớ cục bộ.

vì bộ làm việc của họ có thể là hàng trăm megabyte. Do đó, chúng sẽ không vừa
với bộ đệm cấp cuối của bộ vi xử lý đa lõi. Do sử dụng đa luồng phần cứng để
che giấu độ trễ DRAM, khu vực chip được sử dụng cho bộ đệm trong bộ xử lý hệ
thống được dành cho tài nguyên điện toán và số lượng lớn các thanh ghi để giữ
trạng thái của nhiều luồng hướng dẫn SIMD.

Xây dựng: Trong khi ẩn độ trễ bộ nhớ là triết lý cơ bản, lưu ý rằng GPU và bộ xử lý
vector mới nhất đã thêm bộ nhớ cache. Chúng được coi là bộ lọc băng thông để giảm nhu
cầu về Bộ nhớ GPU hoặc là bộ tăng tốc cho một số biến có độ trễ không thể bị ẩn bằng
cách đa luồng. Bộ nhớ cục bộ cho khung ngăn xếp, các lệnh gọi hàm và đăng ký tràn là
một kết hợp tốt với bộ nhớ cache, vì độ trễ có vấn đề khi gọi một hàm. Bộ nhớ cache cũng
có thể tiết kiệm năng lượng, vì các truy cập bộ đệm trên chip mất ít năng lượng hơn nhiều
so với truy cập vào nhiều chip DRAM bên ngoài.
6.6 Giới thiệu về các đơn vị xử lý đồ họa 547

Đưa GPU vào phối cảnh


Ở cấp độ cao, các máy tính đa lõi có phần mở rộng hướng dẫn SIMD có chung
điểm tương đồng với GPU. Hình 6.11 tóm tắt những điểm tương đồng và khác
biệt. Cả hai đều là MIMD có bộ xử lý sử dụng nhiều làn SIMD, mặc dù GPU có
nhiều bộ xử lý hơn và nhiều làn đường khác. Cả hai đều sử dụng đa luồng phần
cứng để cải thiện việc sử dụng bộ xử lý, mặc dù GPU có hỗ trợ phần cứng cho
nhiều luồng khác. Cả hai đều sử dụng bộ nhớ cache, mặc dù GPU sử dụng bộ
đệm phát trực tuyến nhỏ hơn và máy tính đa lõi sử dụng bộ nhớ cache đa cấp lớn
cố gắng chứa hoàn toàn bộ bộ làm việc. Bộ nhớ chính vật lý nhỏ hơn nhiều trong
GPU. Mặc dù GPU hỗ trợ bảo vệ bộ nhớ ở cấp trang, nhưng chúng chưa hỗ trợ
phân trang theo yêu cầu.
Bộ xử lý SIMD cũng tương tự như bộ xử lý vector. Nhiều bộ xử lý SIMD
trong GPU hoạt động như các lõi MIMD độc lập, giống như nhiều máy tính
vector có nhiều bộ xử lý vector. Quan điểm này sẽ coi Volta V100 là một máy 80
lõi với hỗ trợ phần cứng cho đa luồng, trong đó mỗi lõi có 16 làn. Sự khác biệt
lớn nhất là đa luồng, là nền tảng cho GPU và bị thiếu trong hầu hết các bộ xử lý
vector.
GPU và CPU không quay trở lại trong gia phả kiến trúc máy tính với tổ tiên chung;
không có Liên kết thiếu giải thích cả hai. Do di sản không phổ biến này, GPU đã
không sử dụng các thuật ngữ phổ biến trong cộng đồng kiến trúc máy tính, điều này
dẫn đến sự nhầm lẫn về GPU là gì và cách chúng hoạt động. Để giúp giải quyết sự
nhầm lẫn , Hình 6.12 (từ trái sang phải) liệt kê thuật ngữ mô tả nhiều hơn được sử
dụng trong phần này, thuật ngữ gần nhất từ điện toán chính thống, thuật ngữ GPU
NVIDIA chính thức trong trường hợp bạn quan tâm và sau đó là mô tả ngắn về thuật
ngữ này. GPU Rosetta Stone này có thể giúp liên kết phần này và ý tưởng với các mô
tả GPU thông thường hơn, chẳng hạn như những mô tả được tìm thấy trong Phụ
lục B.
Trong khi các GPU đang hướng tới điện toán chính thống, họ có thể từ bỏ trách
nhiệm của mình để tiếp tục xuất sắc về đồ họa. Do đó, thiết kế của GPU có thể có ý
nghĩa hơn khi các kiến trúc sư hỏi, với phần cứng được đầu tư để làm đồ họa

Bộ xử lý SIMD 8 đến 32 15 đến 128


Làn đường / bộ xử lý SIMD 2 đến 4 8 đến 16
Hỗ trợ phần cứng đa luồng cho các luồng SIMD 2 đến 4 16 đến 32
Kích thước bộ nhớ cache lớn nhất 48 MiB 6 MiB
Kích thước của địa chỉ bộ nhớ 64 bit 64 bit
Kích thước của bộ nhớ chính 64 GiB đến 1024 GiB 4 GiB đến 16 GiB
Bảo vệ bộ nhớ ở cấp độ trang Đúng Đúng
Nhu cầu phân trang Đúng Không
Bộ nhớ cache mạch lạc Đúng Không

HÌNH 6.11 Sự tương đồng và khác biệt giữa đa lõi với các tiện ích mở rộng SIMD đa
phương tiện và GPU gần đây.
548 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Vòng lặp Một vòng lặp vector hóa, được thực hiện trên GPU, được
Vectorizable Vectorizable Lưới thực hiện
Vòng lặp lên một hoặc nhiều Khối chủ đề (cơ quan của
vòng lặp vector hóa) có thể thực hiện song song.
Cơ thể của Cơ thể của a Khối chủ đề Một vòng lặp vector hóa được thực hiện trên đa luồng
Vòng lặp bị biến
dạng (Dải khai thác) Bộ xử lý SIMD, được tạo thành từ một hoặc nhiều luồng
Vòng lặp bị biến
dạng hướng dẫn SIMD. Họ có thể giao tiếp qua
Ký ức địa phương.
Trình tự của Một lần lặp Chủ đề CUDA Một đường cắt dọc của một luồng hướng dẫn SIMD
Ngõ SIMD một vòng lặp Scalar tương ứng với một phần tử được thực hiện bởi một
Hoạt động Ngõ SIMD. Kết quả được lưu trữ tùy thuộc vào mặt nạ
và đăng ký vị ngữ.
Một chủ đề của Chủ đề của Vector Warp Một chủ đề truyền thống, nhưng nó chỉ chứa SIMD
Bộ nhớ xử lý phần cứng Phần cứng chương trình đối tượng máy trừu tượng

ĐƠN GIẢN Hướng dẫn hướng dẫn được thực hiện trên đa luồng
Hướng dẫn Bộ xử lý SIMD. Kết quả được lưu trữ tùy thuộc vào a
mặt nạ trên mỗi yếu tố.
ĐƠN GIẢN Hướng dẫn Vector Hướng dẫn PTX Một lệnh SIMD duy nhất được thực hiện trên SIMD
Hướng dẫn Làn đường.
Đa luồng (Đa đọc) Truyền phát Bộ xử lý SIMD đa luồng thực thi
ĐƠN GIẢN Bộ xử lý vectơ Bộ đa xử lý chủ đề của hướng dẫn SIMD, độc lập
Bộ xử lý Bộ xử lý SIMD khác.
Khối chủ đề Bộ xử lý vô hướng Chủ đề Giga Gán nhiều khối chủ đề (cơ quan của
Bộ lập lịch Động cơ vòng lặp vector hóa) đến SIMD đa luồng
Bộ xử lý.
Chủ đề SIMD Lịch trình chủ đề Bộ lập lịch Warp Đơn vị phần cứng mà lịch trình và phát hành chủ đề
Bộ lập lịch trong một đa luồng hướng dẫn SIMD khi họ sẵn sàng
CPU thực hiện; bao gồm bảng điểm để theo dõi SIMD
Chủ đề thực hiện.
Ngõ SIMD Đường vectơ Bộ xử lý chủ đề Một SIMD Lane thực hiện các thao tác trong một luồng
hướng dẫn SIMD trên một yếu tố duy nhất. Các kết quả
lưu trữ tùy thuộc vào mặt nạ.
Bộ nhớ GPU Ký ức chính Ký ức toàn cầu Bộ nhớ DRAM có thể truy cập bởi tất cả đa luồng
Bộ xử lý SIMD trong GPU .

Ký ức địa phương Ký ức địa phương Bộ nhớ dùng chung SRAM cục bộ nhanh cho một SIMD đa luồng
Bộ xử lý, không có sẵn cho Bộ xử lý SIMD khác.

Đăng ký trong một SIMD Lane duy nhất được phân bổ


Ngõ SIMD Ngõ Vector Bộ xử lý chủ đề trên
Đăng ký Đăng ký Đăng ký một khối luồng đầy đủ (cơ thể của vòng lặp vector hóa).

HÌNH 6.12 Hướng dẫn nhanh về các điều khoản GPU. Chúng tôi sử dụng cột đầu tiên cho các
điều khoản phần cứng. Bốn nhóm cụm 12 thuật ngữ này. Từ trên xuống dưới: Trừu tượng chương trình,
Đối tượng máy, Phần cứng xử lý và Phần cứng bộ nhớ.

tốt, làm thế nào chúng ta có thể bổ sung nó để cải thiện hiệu suất của một loạt các
ứng dụng?
GPU là ví dụ đầu tiên về các bộ tăng tốc được chứng minh bằng cách cải thiện
hiệu suất của một tên miền, trong trường hợp này là đồ họa máy tính. Phần tiếp
theo đưa ra nhiều ví dụ hơn, với lĩnh vực học máy được chú ý nhiều nhất.
6.7 Kiến trúc đặc trưng miền 549

Đúng hay sai: GPU dựa vào chip DRAM đồ họa để giảm độ trễ bộ nhớ và Kiểm tra
do đó tăng hiệu suất trên các ứng dụng đồ họa. Bản thân bạn

6.7 Kiến trúc đặc trưng tên miền

Sự kết hợp giữa sự chậm lại của Định luật Moore, kết thúc quy mô Dennard và
giới hạn thực tế đối với hiệu suất đa lõi do Luật Amdahl đã thúc đẩy sự khôn
ngoan phổ biến rằng con đường duy nhất còn lại để cải thiện hiệu suất và hiệu quả
năng lượng là kiến trúc đặc trưng cho miền (DSA). Giống như GPU, DSA chỉ
thực hiện một loạt các nhiệm vụ hẹp, nhưng chúng thực hiện chúng rất tốt. Do đó,
giống như lĩnh vực chuyển từ bộ giải mã sang bộ đa xử lý trong thập kỷ qua vì sự
cần thiết, tuyệt vọng là lý do các kiến trúc sư hiện đang làm việc trên DSA.
Điều bình thường mới là một máy tính sẽ bao gồm các bộ xử lý tiêu chuẩn để
chạy các chương trình lớn thông thường như hệ điều hành cùng với các bộ xử lý
dành riêng cho miền. Chúng tôi hy vọng rằng máy tính sẽ không đồng nhất hơn
nhiều so với chip đa lõi đồng nhất trong quá khứ. Phần này, mới cho cuốn sách
này, dựa trên một chương 80 trang mới về DSAs Kiến trúc máy tính: Một định
lượng Cách tiếp cận, phiên bản thứ sáu, nếu bạn quan tâm đến việc điều tra chủ
đề này lớn hơn độ sâu.
DSA tuân theo năm nguyên tắc :
1. Sử dụng bộ nhớ chuyên dụng để giảm thiểu khoảng cách mà dữ liệu được di
chuyển. Nhiều cấp độ bộ nhớ cache trong bộ vi xử lý đa năng sử dụng rất
nhiều diện tích và năng lượng để cố gắng di chuyển dữ liệu tối ưu cho một
chương trình. Ví dụ: bộ đệm liên kết tập hợp hai chiều sử dụng năng lượng
gấp 2,5 lần so với bộ nhớ bàn di chuột được điều khiển bằng phần mềm tương
đương. Theo định nghĩa, các nhà văn biên dịch và lập trình viên của DSA hiểu
tên miền của họ, do đó không cần phần cứng để cố gắng di chuyển dữ liệu cho
họ. Thay vào đó, chuyển động dữ liệu được giảm với các bộ nhớ được kiểm
soát bằng phần mềm dành riêng và phù hợp với các chức năng cụ thể trong
miền.
2. Đầu tư các tài nguyên được lưu từ việc thả các tối ưu hóa kiến trúc vi mô
tiên tiến vào các đơn vị số học nhiều hơn hoặc các bộ nhớ lớn hơn. Kiến
trúc sư quay lại tiền thưởng từ Định luật Moore Moore vào các tối ưu hóa
sử dụng nhiều tài nguyên cho CPU và GPU: thực thi ngoài trật tự, đầu cơ,
đa luồng, đa xử lý, đúc sẵn, bộ nhớ cache đa cấp, v.v. Với sự hiểu biết
vượt trội về việc thực hiện chương trình trong các miền hẹp hơn này, các
tài nguyên này được chi tốt hơn nhiều cho các đơn vị xử lý nhiều hơn hoặc
bộ nhớ trên chip lớn hơn.
3. Sử dụng hình thức song song dễ nhất phù hợp với miền. Mục tiêu tên miền đối
với DSA hầu như luôn có sự song song vốn có. Một quyết định quan trọng đối
với DSA là làm thế nào để tận dụng sự song song đó và làm thế nào để đưa nó
vào phần mềm. Mục tiêu là thiết kế DSA xung quanh độ chi tiết tự nhiên của
550 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

sự song song của miền và phơi bày sự song song đó đơn giản trong mô
hình lập trình. Ví dụ, liên quan đến song song cấp dữ liệu, nếu SIMD hoạt
động trong miền, chắc chắn người lập trình và người viết trình biên dịch sẽ
dễ dàng hơn MIMD. Tương tự, nếu VLIW có thể thể hiện tính song song
cấp độ hướng dẫn cho tên miền, thiết kế có thể nhỏ hơn và tiết kiệm năng
lượng hơn so với thực thi ngoài đơn hàng.
4. Giảm kích thước dữ liệu và nhập vào đơn giản nhất cần thiết cho tên miền.
Các ứng dụng trong nhiều miền bị ràng buộc về bộ nhớ, do đó bạn có thể
tăng băng thông bộ nhớ hiệu quả và sử dụng bộ nhớ trên chip bằng cách sử
dụng các loại dữ liệu hẹp hơn. Dữ liệu hẹp hơn và đơn giản hơn cũng cho
phép bạn đóng gói nhiều đơn vị số học vào cùng một khu vực chip hoặc có
cùng ngân sách năng lượng.
5. Sử dụng ngôn ngữ lập trình dành riêng cho tên miền để chuyển mã sang
DSA . A thách thức kinh điển cho các kiến trúc chuyên dùng là ứng dụng
để chạy trên kiến trúc mới lạ của bạn. May mắn thay, các ngôn ngữ lập
trình dành riêng cho miền đã trở nên phổ biến ngay cả trước khi các kiến
trúc sư buộc phải chuyển sự chú ý của họ sang DSA, chẳng hạn như Halide
để xử lý tầm nhìn và TensorFlow học máy (ML). Tăng mức độ trừu tượng
lập trình làm cho chuyển các ứng dụng sang DSA khả thi hơn nhiều.
Ví dụ về các tên miền đã được tăng tốc ngoài đồ họa bao gồm tin sinh học, xử
lý hình ảnh và mô phỏng, nhưng phổ biến nhất cho đến nay là trí tuệ nhân tạo
(AI). Thay vì xây dựng AI như một bộ quy tắc logic lớn, trong thập kỷ qua, trọng
tâm đã chuyển sang ML từ dữ liệu ví dụ như con đường hứa hẹn nhất với AI.
Lượng dữ liệu và tính toán phải học lớn hơn nhiều so với suy nghĩ. Các máy tính
quy mô kho (WSC) của thế kỷ này, thu hoạch và lưu trữ petabyte thông tin được
tìm thấy trên Internet từ hàng tỷ người dùng và điện thoại thông minh của họ,
cung cấp dữ liệu phong phú. Chúng tôi cũng đánh giá thấp số lượng tính toán cần
thiết để học hỏi từ dữ liệu lớn như vậy, nhưng GPU có hiệu suất chi phí thả nổi
chính xác một lần tuyệt vời được nhúng trong hàng ngàn máy chủ WSC cung cấp
đủ tính toán.
Một phần của ML, được gọi mạng lưới thần kinh sâu (DNN), đã trở thành
ngôi sao của nó kể từ năm 2012. Một bước đột phá mới được kích hoạt bởi DNN
dường như được công khai gần như mỗi tháng, chẳng hạn như nhận dạng đối
tượng, dịch ngôn ngữ và lần đầu tiên cho phép một chương trình máy tính đánh
bại một nhà vô địch của con người tại Go.
Một ví dụ nổi bật về DNN DSA là đơn vị xử lý tenor Google (TPU), TPUv1. Bắt
đầu từ năm 2006, các kỹ sư của Google đã thảo luận về việc triển khai GPU, FPGA
hoặc chip tùy chỉnh trong các trung tâm dữ liệu của họ. Họ kết luận rằng một vài ứng
dụng có thể chạy trên phần cứng đặc biệt có thể làm như vậy hầu như miễn phí bằng
cách sử dụng công suất vượt mức của các trung tâm dữ liệu lớn và thật khó để cải
thiện miễn phí. Cuộc trò chuyện đã thay đổi vào năm 2013 khi dự kiến rằng nếu mọi
người sử dụng tìm kiếm bằng giọng nói trong ba phút mỗi ngày bằng cách sử dụng
DNN nhận dạng giọng nói, thì sẽ cần phải tăng gấp đôi trung tâm dữ liệu Google
Google để đáp ứng nhu cầu tính toán. Đáp ứng nhu cầu như vậy sẽ khá tốn kém và
tốn thời gian với các CPU thông thường.
6.7 Kiến trúc đặc trưng miền 551

Google bắt đầu một dự án ưu tiên cao để nhanh chóng sản xuất một con chip tùy
chỉnh cho DNN. Mục tiêu là cải thiện hiệu suất chi phí gấp mười lần so với CPU
hoặc GPU. Với nhiệm vụ khẩn cấp này, TPU đã được thiết kế, xác minh, xây
dựng và triển khai tại các trung tâm dữ liệu chỉ trong 15 tháng. Nếu bạn sử dụng
các ứng dụng Google, bạn đã sử dụng TPUv1, vì chúng đã được triển khai từ
năm 2015.
Hình 6.13 hiển thị sơ đồ khối của TPUv1. Các khối bên trong là thường được kết
nối bởi các đường dẫn rộng 256 byte. Bắt đầu ở góc trên bên phải, đơn vị nhân ma
trận (MXU) là trái tim của TPU. Nó tuân theo hướng dẫn của DSA về việc đầu tư các
tài nguyên được lưu từ việc thả các tính năng CPU vào các đơn vị số học hơn, vì nó
chứa một mảng gồm 256 x 256 ALU. Con số này gấp 250 lần so với CPU máy chủ
hiện đại và gấp 25 lần so với GPU đương đại. Sử dụng song song SIMD cho 65.536
ALU tuân theo hướng dẫn sử dụng hình thức song song đơn giản nhất để phù hợp với
tên miền. Ngoài ra, TPUv1 giảm kích thước dữ liệu và nhập thành số nguyên 8 bit và
16 bit từ loại dấu phẩy động 32 bit được sử dụng trong GPU hiện đại, đủ cho miền
DNN này. Theo hướng dẫn sử dụng bộ nhớ chuyên dụng, các sản phẩm đơn vị ma
trận được thu thập trong

Chip DRAM DDR3


30 GiB /
14 GiB / s 30 GiB /
s s Trọng lượng FIFO
DDR3-2133
(nắm lấy cân nặng)
giao diện
Điều Điều
khiển khiển 30 GiB / s
PCIeGen3x

Thống
giao
diện

Ma trận nhân lên


giao
diện

10 nhất 167
16

đơn vị

14 14 GiB / s đệm GiB tâm thu / s (64K mỗi chu kỳ)


GiB / (địa
s GiB / s phương dữ liệu
kích hoạt thiết lập
Máy
chủ
lưu
trữ

lưu trữ)
Tích lũy
Điều
khiển
Kích hoạt

Bình thường hóa / Bể bơi


Instr

167 GiB / s

I / O ngoài chip
Bộ đệm dữ liệu Điều
Tính toán Điều khiển khiển
Điều khiển
HÌNH 6.13 Sơ đồ khối TPUv1. Phần tính toán chính là Đơn vị nhân ma trận (MXU) ở góc trên bên phải. Đầu vào của nó là Trọng lượng
FIFO và Bộ đệm hợp nhất và đầu ra của nó là Bộ tích lũy. Bộ đệm hợp nhất 24 MiB gần một phần ba số chết TPUv1 và MXU với 65.536
ALU tích lũy nhiều lần là một phần tư, do đó, datapath là gần hai phần ba số chết TPUv1. Đối với CPU, bộ nhớ đa cấp thường bằng hai
phần ba số chết. (Chuyển thể từ Hennessy JL, Patterson DA . Kiến trúc máy tính: Cách tiếp cận định lượng, Phiên bản thứ 6, Cambridge,
MA: Elsevier Inc., 2019.)
552 Chương 6 Bộ xử lý song song từ máy khách đến đám mây
chấp nhận một tin nhắn từ bộ xử lý khác.

Kiểm
tra
Bản
thân bạn
tin nhắn qua Giao tiếp
giữa nhiều bộ xử lý bằng
cách gửi và nhận thông
tin rõ ràng.

gửi tin nhắn thường


xuyên Một thói quen
được sử dụng bởi bộ xử
lý trong các máy có bộ
nhớ riêng để chuyển
thông điệp đến bộ xử lý
khác.

nhận tin nhắn thường


xuyên Một thói quen
được sử dụng bởi một bộ
xử lý trong các máy có bộ
nhớ riêng
mát và không gian. Thật vậy, mục tiêu ban đầu của TPUv1 là 10 lần hiệu suất
trên mỗi đô la TCO của CPU hoặc GPU. Than ôi, số TCO là bí mật được bảo vệ
4 MiB của ắc quy, và chặt chẽ và do đó không có sẵn để so sánh. Tin tốt là TCO có tương quan với sức
kết quả trung gian mạnh, có sẵn. TPUv1 có hiệu suất gấp 29 lần trên mỗi watt của GPU đương đại
được tổ chức trong bộ và hiệu suất gấp 83 lần trên mỗi watt của CPU đương đại, do đó vượt quá mục
đệm thống nhất 24 tiêu ban đầu của nó.
MiB, có thể đóng vai Chúng tôi trở lại với các kiến trúc truyền thống hơn trong phần tiếp theo, giới
trò là đầu vào cho thiệu các bộ xử lý song song nơi mỗi bộ xử lý có không gian địa chỉ riêng, giúp
MXU. TPUv1 có bộ xây dựng các hệ thống lớn hơn nhiều dễ dàng hơn nhiều. Các dịch vụ Internet mà
nhớ trên chip gần gấp bạn sử dụng hàng ngày phụ thuộc vào các hệ thống quy mô lớn này và Google
bốn lần so với GPU thực sự sử dụng các hệ thống quy mô lớn này để triển khai TPUv1 của mình.
tương đương. Cuối
cùng, nó được lập Đúng hay sai? DSA hiệu quả hơn CPU hoặc GPU trong các miền của chúng chủ
trình bằng TensorFlow, yếu vì bạn có thể biện minh bằng cách sử dụng một khuôn lớn hơn nhiều cho
giúp đơn giản hóa việc một tên miền.
chuyển các ứng dụng
DNN sang DSA này .
Tốc độ xung nhịp Cụm, Máy tính quy mô kho ,
TPUv1 là 700 MHz,
mặc dù khiêm tốn 6,8 và Truyền tin nhắn khác
mang lại cho 65.536 Bộ đa xử lý
ALU để mang lại hiệu
suất cao nhất là 90
hoạt động tera mỗi Cách tiếp cận khác để chia sẻ một không gian địa chỉ là cho các bộ xử lý để mỗi
giây. Vùng chết nhỏ người có không gian địa chỉ riêng. Hình 6.14 cho thấy tổ chức cổ điển của bộ đa
hơn một nửa kích xử lý với nhiều không gian địa chỉ riêng. Bộ nhân thay thế này phải giao tiếp
thước của CPU và thông qua rõ ràng tin nhắn qua, mà theo truyền thống là tên của phong cách máy
GPU đương đại, và ở tính như vậy. Cung cấp hệ thống có thói quen gửi và nhận tin nhắn, phối hợp
mức 75 watt, nó có ít được xây dựng với thông báo truyền đi, vì một bộ xử lý biết khi nào một tin nhắn
hơn một nửa công suất được gửi và bộ xử lý nhận biết khi nào có tin nhắn đến. Nếu người gửi cần xác
của chúng. nhận rằng tin nhắn đã đến, bộ xử lý nhận có thể gửi tin nhắn xác nhận lại cho
Sử dụng trung bình người gửi.
sáu ứng dụng DNN
sản xuất, TPUv1
nhanh gấp 29,2 lần so
với CPU hiện đại và
nhanh gấp 15,3 lần so
với GPU đương đại.
Trong một trung tâm
dữ liệu, chúng tôi
quan tâm đến hiệu
suất chi phí cũng như
hiệu suất. Thước đo
tốt nhất của chi phí
trung tâm dữ liệu là
tổng chi phí sở hữu
(TCO): chi phí mua
hàng cộng với chi phí
vận hành trong vài
năm đối với điện, làm
6.7 Cụm, Máy tính quy mô kho và Bộ đa xử lý thông báo khác 553

Bộ xử lý Bộ xử lý ... Bộ xử lý

Bộ nhớ Bộ nhớ ... Bộ nhớ cache


cache cache

... Ký ức
Ký ức Ký ức

Mạng kết nối

HÌNH 6.14 Tổ chức cổ điển của bộ đa xử lý với nhiều không gian địa chỉ riêng, theo truyền
thống được gọi là bộ đa xử lý thông báo. Lưu ý rằng không giống như SMP trong Hình 6.7, mạng
kết nối không nằm giữa bộ nhớ và bộ nhớ mà thay vào đó là giữa các nút bộ nhớ bộ xử lý.

Đã có một số nỗ lực để xây dựng các máy tính quy mô lớn dựa trên các mạng
truyền tin nhắn hiệu suất cao và chúng cung cấp hiệu suất giao tiếp tuyệt đối tốt
hơn so với các cụm được xây dựng bằng mạng cục bộ. Thật vậy, nhiều siêu máy
tính ngày nay sử dụng mạng tùy chỉnh. Vấn đề là chúng thường đắt hơn nhiều so
với các mạng cục bộ như Ethernet. Rất ít ứng dụng ngày nay ngoài điện toán
hiệu năng cao có thể biện minh cho hiệu suất giao tiếp cao hơn, với chi phí cao
hơn nhiều.

Các máy tính dựa vào việc truyền thông điệp để liên lạc thay vì bộ nhớ chia sẻ bộ nhớ Giao diện
cache kết hợp bộ nhớ cache dễ dàng hơn nhiều cho các nhà thiết kế phần cứng để xây
dựng (xem Mục 5.8). Có một lợi thế cho các lập trình viên là tốt, trong giao tiếp đó rõ
phần
ràng, có nghĩa là có ít bất ngờ về hiệu suất hơn so với giao tiếp ngầm trong các máy cứng /
tính bộ nhớ chia sẻ bộ nhớ cache. Nhược điểm của các lập trình viên là nó khó phần
chuyển một chương trình tuần tự sang một máy tính truyền tin nhắn, vì mọi giao tiếp
phải được xác định trước hoặc chương trình không hoạt động. Bộ nhớ chia sẻ bộ nhớ
mềm
cache cho phép phần cứng tìm ra dữ liệu nào cần được truyền đạt, giúp việc chuyển
đổi dễ dàng hơn. Có những khác biệt về quan điểm là con đường ngắn nhất để đạt
hiệu suất cao, do những ưu và nhược điểm của truyền thông ngầm, nhưng không có
sự nhầm lẫn trên thị trường hiện nay. Bộ vi xử lý đa lõi sử dụng bộ nhớ vật lý dùng
chung và các nút của cụm giao tiếp với nhau bằng cách truyền thông điệp.

Một số ứng dụng đồng thời chạy tốt trên phần cứng song song, độc lập với việc nó
cung cấp địa chỉ được chia sẻ hoặc chuyển thông điệp. Cụ thể, các ứng dụng và song song
cấp độ tác vụ với ít giao tiếp như tìm kiếm Web, máy chủ thư và máy chủ tệp, không yêu
cầu địa chỉ chia sẻ để chạy tốt. Kết quả là, cụm
554 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

cụm Bộ sưu tập của các đã trở thành ví dụ phổ biến nhất hiện nay của máy tính song song truyền tin nhắn.
máy tính được kết nối Với các bộ nhớ riêng biệt, mỗi nút của cụm chạy một bản sao riêng biệt của hệ điều
qua I / O qua các công hành. Ngược lại, các lõi bên trong bộ vi xử lý được kết nối bằng mạng tốc độ cao bên
tắc mạng tiêu chuẩn để trong chip bằng một hệ điều hành duy nhất và hệ thống bộ nhớ chia sẻ đa kênh sử
tạo thành bộ đa xử lý dụng kết nối bộ nhớ để liên lạc. Kết nối bộ nhớ có băng thông cao hơn và độ trễ thấp
thông báo.
hơn, cho phép hiệu suất giao tiếp tốt hơn nhiều cho bộ đa xử lý bộ nhớ dùng chung.
Điểm yếu của bộ nhớ riêng cho bộ nhớ người dùng từ góc độ lập trình song song
biến thành một thế mạnh về độ tin cậy của hệ thống (xem Mục 5.5). Vì một cụm bao
gồm các máy tính độc lập được kết nối thông qua mạng cục bộ, nên việc thay thế
máy tính sẽ dễ dàng hơn nhiều nếu không đưa hệ thống xuống trong một cụm so với
bộ đa xử lý bộ nhớ dùng chung. Về cơ bản, địa chỉ được chia sẻ có nghĩa là rất khó
để cách ly bộ xử lý và thay thế nó mà không có công việc anh hùng của hệ điều hành
và trong thiết kế vật lý của máy chủ. Nó cũng dễ dàng cho các cụm để thu nhỏ một
cách duyên dáng khi một máy chủ bị lỗi, do đó cải thiện độ tin cậyVì phần mềm cụm
là một lớp chạy trên các hệ điều hành cục bộ chạy trên mỗi máy tính, nên việc ngắt
kết nối và thay thế một máy tính bị hỏng sẽ dễ dàng hơn nhiều.
Do các cụm được xây dựng từ toàn bộ máy tính và các mạng độc lập, có thể
mở rộng, sự cô lập này cũng giúp mở rộng hệ thống dễ dàng hơn mà không làm
giảm ứng dụng chạy trên cụm.
Chi phí thấp hơn, tính sẵn sàng cao hơn và khả năng mở rộng nhanh chóng, gia
tăng khiến các cụm trở nên hấp dẫn đối với các nhà cung cấp dịch vụ Internet, mặc dù
hiệu suất giao tiếp kém hơn khi so sánh với các bộ xử lý bộ nhớ chia sẻ quy mô lớn.
Các công cụ tìm kiếm mà hàng trăm triệu người trong chúng ta sử dụng mỗi ngày phụ
thuộc vào công nghệ này. Amazon, Facebook, Google, Microsoft và những người
khác đều có nhiều trung tâm dữ liệu, mỗi trung tâm có hàng chục ngàn máy chủ. Rõ
ràng, việc sử dụng nhiều bộ xử lý trong các công ty dịch vụ Internet đã rất thành công.

Máy tính quy mô kho


Bất cứ ai cũng có thể Các dịch vụ Internet, như những dịch vụ được mô tả ở trên, đòi hỏi phải xây
xây dựng một CPU dựng các tòa nhà mới để chứa, cung cấp năng lượng và 50.000 máy chủ mát mẻ.
nhanh chóng. Bí quyết Mặc dù chúng có thể được phân loại là các cụm lớn, kiến trúc và hoạt động của
là xây dựng một hệ chúng tinh vi hơn. Chúng hoạt động như một máy tính khổng lồ và có giá 150
thống nhanh. triệu đô la cho tòa nhà, cơ sở hạ tầng điện và làm mát, máy chủ và thiết bị mạng
Seymour Cray, được kết nối và chứa 50.000 máy chủ. Chúng tôi coi họ là một lớp máy tính mới, được
coi là cha đẻ của siêu gọi Máy tính quy mô kho (WSC).
máy tính.

Giao diện Khung phổ biến nhất để xử lý hàng loạt trong WSC là MapReduce [Dean, 2008] và
Hadoop song sinh nguồn mở của nó. Lấy cảm hứng từ các hàm Lisp cùng tên, Bản đồ
phần trước tiên áp dụng chức năng do lập trình viên cung cấp cho mỗi bản ghi đầu vào
cứng / logic. Bản đồ chạy trên hàng ngàn máy chủ để tạo ra kết quả trung gian của các cặp
phần khóa-giá trị. Giảm thu thập đầu ra của các tác vụ phân tán đó và sụp đổ chúng
mềm
6.8 Cụm, Máy tính quy mô kho và Bộ đa xử lý thông báo khác 555

sử dụng một chức năng do lập trình viên xác định khác. Với sự hỗ trợ phần mềm
phù hợp, cả hai đều rất song song nhưng dễ hiểu và dễ sử dụng. Trong vòng 30
phút, một lập trình viên mới làm quen có thể chạy tác vụ MapReduce trên hàng
ngàn máy chủ.
Ví dụ: một chương trình MapReduce tính toán số lần xuất hiện của mỗi từ
tiếng Anh trong một bộ tài liệu lớn. Dưới đây là phiên bản đơn giản của chương
trình đó, chỉ hiển thị vòng lặp bên trong và giả định chỉ một lần xuất hiện của tất
cả các từ tiếng Anh được tìm thấy trong tài liệu :

map (Khóa chuỗi, Giá trị chuỗi) :


// khóa: tên tài liệu
// giá trị: nội dung tài liệu
cho mỗi từ w trong giá trị :
EmitInter liền (w, 1 1); // Sản xuất danh sách tất cả các từ giảm (Khóa chuỗi, giá trị
Iterator) :
// khóa: một từ
// giá trị: một danh sách các số đếm
int kết quả = 0;
cho mỗi v trong các giá trị :
kết quả + = ParseInt (v); // lấy số nguyên từ cặp khóa-giá trị
Emit (AsString (kết quả));

Chức năng EmitInter liền được sử dụng trong hàm Bản đồ phát ra từng từ trong
tài liệu và giá trị một. Sau đó, hàm Giảm tổng hợp tất cả các giá trị trên mỗi từ
cho mỗi tài liệu sử dụng ParseInt () để có được số lần xuất hiện trên mỗi từ trong
tất cả các tài liệu. Môi trường thời gian chạy MapReduce lên lịch các tác vụ bản
đồ và giảm các tác vụ đến các máy chủ của WSC .

Ở quy mô cực đoan này, đòi hỏi sự đổi mới trong phân phối điện, làm mát, giám
sát và vận hành, WSC là hậu duệ hiện đại của siêu máy tính thập niên 1970, biến
Seymour Cray trở thành cha đỡ đầu của các kiến trúc sư WSC ngày nay. Các máy
tính cực đoan của ông đã xử lý các tính toán có thể được thực hiện ở nơi khác, nhưng
đắt đến mức chỉ một vài công ty có thể mua được chúng. Lần này mục tiêu là cung
cấp công nghệ thông tin cho thế giới thay vì điện toán hiệu năng cao cho các nhà
khoa học và kỹ sư. Do đó, WSC chắc chắn đóng một vai trò xã hội quan trọng hơn
ngày nay so với các siêu máy tính Cray, đã làm trong quá khứ.
Mặc dù họ chia sẻ một số mục tiêu chung với máy chủ, WSC có ba điểm khác
biệt chính :
1. Nhiều, song song dễ dàng : Một mối quan tâm cho một kiến trúc sư máy chủ là
liệu các ứng dụng trong thị trường mục tiêu có đủ tính song song để biện minh
cho số lượng phần cứng song song và liệu chi phí có quá cao cho phần cứng
truyền thông đủ để khai thác tính song song này hay không. Một kiến trúc sư
WSC không có mối quan tâm như vậy. Đầu tiên, các ứng dụng hàng loạt như
MapReduce được hưởng lợi từ
556 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

phần mềm như một dịch số lượng lớn các bộ dữ liệu độc lập cần xử lý độc lập, chẳng hạn như hàng tỷ
vụ (SaaS) Thay vì bán trang Web từ một lần thu thập dữ liệu Web. Thứ hai, các ứng dụng dịch vụ
phần mềm được cài đặt và Internet tương tác, còn được gọi là Phần mềm dưới dạng dịch vụ (SaaS), có
chạy trên máy tính của
thể hưởng lợi từ hàng triệu người dùng độc lập các dịch vụ Internet tương tác.
khách hàng, phần mềm
được chạy tại một trang Đọc và viết hiếm khi phụ thuộc vào SaaS, vì vậy SaaS hiếm khi cần đồng bộ
web từ xa và được cung hóa. Ví dụ: tìm kiếm sử dụng chỉ mục chỉ đọc và email thường đọc và viết
cấp qua Internet thông qua thông tin độc lập. Chúng tôi gọi loại song song dễ dàng này Song song cấp yêu
giao diện Web cho khách cầu, như nhiều nỗ lực độc lập có thể tiến hành song song tự nhiên với ít nhu
hàng. Khách hàng của SaaS cầu giao tiếp hoặc đồng bộ hóa.
được tính phí dựa trên việc
sử dụng so với quyền sở 2. Số chi phí hoạt động : Theo truyền thống, kiến trúc sư máy chủ thiết kế hệ
hữu. thống của họ đối với hiệu suất cao nhất trong ngân sách chi phí và chỉ lo lắng
về năng lượng để đảm bảo rằng họ không vượt quá khả năng làm mát của vỏ
bọc. Họ thường bỏ qua chi phí hoạt động của một máy chủ, cho rằng họ nhạt
so với chi phí mua hàng. Các WSC có tuổi thọ dài hơn, cơ sở hạ tầng xây
dựng và điện và làm mát thường được khấu hao trong vòng 10 hoặc 20 năm,
do đó chi phí vận hành cộng lại: năng lượng, phân phối điện và làm mát chiếm
hơn 30% chi phí của WSC trong hơn 10 năm .
3. Quy mô và các cơ hội / vấn đề liên quan đến quy mô: Để xây dựng a WSC đơn,
bạn phải mua 50.000 máy chủ cùng với cơ sở hạ tầng hỗ trợ, có nghĩa là giảm
giá khối lượng. Do đó, WSC rất lớn trong nội bộ đến nỗi bạn có được quy mô
kinh tế ngay cả khi có ít WSC. Những nền kinh tế có quy mô dẫn đến điện
toán đám mây, vì chi phí trên mỗi đơn vị của WSC thấp hơn có nghĩa là các
công ty đám mây có thể thuê máy chủ với mức lãi suất cao và vẫn thấp hơn chi
phí mà người ngoài phải tự làm. Mặt trái của cơ hội kinh tế của quy mô là cần
phải đối phó với tần suất thất bại của quy mô. Ngay cả khi một máy chủ có
thời gian trung bình để thất bại trong 25 năm tuyệt vời (200.000 giờ), kiến trúc
sư WSC sẽ cần thiết kế cho năm lỗi máy chủ mỗi ngày. Mục 5.15 tỷ lệ lỗi đĩa
hàng năm được đề cập (AFR) được đo tại Google ở mức 2% đến 4%. Nếu có
bốn đĩa trên mỗi máy chủ và tỷ lệ thất bại hàng năm của chúng là 4%, kiến trúc
sư WSC sẽ mong đợi thấy một đĩa bị lỗi mỗi đĩa giờDo đó, khả năng chịu lỗi
thậm chí còn quan trọng hơn đối với kiến trúc sư WSC so với kiến trúc sư máy
chủ.
Các nền kinh tế có quy mô được phát hiện bởi WSC đã nhận ra giấc mơ dài về
mục tiêu của điện toán là một tiện ích. Điện toán đám mây có nghĩa là bất cứ ai ở
bất kỳ nơi nào có ý tưởng tốt, mô hình kinh doanh và thẻ tín dụng đều có thể khai
thác hàng ngàn máy chủ để cung cấp tầm nhìn của họ gần như ngay lập tức trên
toàn thế giới.
Để đưa tốc độ tăng trưởng của điện toán đám mây vào viễn cảnh, năm 2012
Amazon Web Services (AWS) đã thông báo rằng họ bổ sung đủ dung lượng máy
chủ mới mỗi ngày để hỗ trợ tất cả các cơ sở hạ tầng toàn cầu của Amazon, kể từ
năm 2003, khi Amazon là doanh nghiệp doanh thu hàng năm $ 5,2 tỷ với 6.000
nhân viên. Vào năm 2020, phần lớn lợi nhuận của Amazon đến từ điện toán đám
mây mặc dù nó chỉ chiếm 10% doanh thu của Amazon. AWS đang tăng trưởng
40% mỗi năm.
6.9 Giới thiệu về cấu trúc liên kết mạng đa bộ xử lý 557

Bây giờ chúng tôi hiểu tầm quan trọng của bộ xử lý truyền thông điệp, đặc
biệt là đối với điện toán đám mây, chúng tôi tiếp tục bao gồm các cách để kết nối
các nút của WSC với nhau. Nhờ Luật Moore Moore và số lượng lõi trên mỗi chip
ngày càng tăng, giờ đây chúng ta cũng cần các mạng bên trong một con chip, vì
vậy những cấu trúc liên kết này rất quan trọng trong nhỏ cũng như lớn.

Xây dựng: Khung MapReduce xáo trộn và sắp xếp các cặp khóa-giá trị tại kết thúc
giai đoạn Bản đồ để tạo ra các nhóm mà tất cả đều có chung một khóa. Các nhóm
này tiếp theo được chuyển sang giai đoạn Giảm.

Xây dựng: Một hình thức khác của điện toán quy mô lớn là điện toán lưới, nơi máy tính
được trải rộng trên các khu vực rộng lớn và sau đó các chương trình chạy qua chúng phải
liên lạc qua các mạng đường dài. Hình thức điện toán lưới phổ biến và độc đáo nhất được
tiên phong bởi dự án SETI @ home. Vì hàng triệu PC không hoạt động bất cứ lúc nào
không có gì hữu ích, chúng có thể được thu hoạch và sử dụng tốt nếu ai đó phát triển
phần mềm có thể chạy trên các máy tính đó và sau đó cho mỗi PC một vấn đề độc lập để
giải quyết. Ví dụ đầu tiên là Tìm kiếm Trí thông minh ngoài trái đất (SETI), được ra mắt tại
UC Berkeley vào năm 1999. Hơn 5 hàng triệu người dùng máy tính tại hơn 200 quốc gia
đã đăng ký SETI @ home, với hơn 50% bên ngoài Hoa Kỳ. Vào tháng 6 năm 2013, hiệu
suất trung bình của lưới điện gia đình SETI @ là 668 PetaFLOPS, nhanh hơn 50 lần so
với siêu máy tính tốt nhất năm 2013.

1. Đúng hay sai: Giống như SMP, máy tính truyền tin nhắn dựa vào khóa để Kiểm tra
đồng bộ hóa. Bản thân bạn
2. Đúng hay sai: Các cụm có các bộ nhớ riêng biệt và do đó cần nhiều bản
sao của hệ điều hành.

Giới thiệu về Mạng đa bộ xử lý


6,9
Cấu trúc liên kết

Các chip đa lõi yêu cầu các mạng trên chip kết nối các lõi với nhau và các cụm
yêu cầu các mạng cục bộ kết nối các máy chủ với nhau. Phần này xem xét các ưu
và nhược điểm của các cấu trúc liên kết mạng khác nhau.
Chi phí mạng bao gồm số lượng thiết bị chuyển mạch, số lượng liên kết trên công
tắc để kết nối với mạng, chiều rộng (số bit) trên mỗi liên kết và độ dài của các liên
kết khi mạng được ánh xạ vào silicon. Ví dụ: một số lõi hoặc máy chủ có thể liền kề
và các lõi khác có thể ở phía bên kia của chip hoặc phía bên kia của trung tâm dữ liệu.
Hiệu suất mạng là nhiều mặt là tốt. Nó bao gồm độ trễ trên mạng không tải để gửi và
nhận tin nhắn, thông lượng về số lượng tin nhắn tối đa có thể được truyền trong một
khoảng thời gian nhất định, sự chậm trễ do tranh chấp cho một phần của mạng và
hiệu suất thay đổi
558 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

tùy thuộc vào mô hình giao tiếp. Một nghĩa vụ khác của mạng có thể là khả năng
chịu lỗi, vì các hệ thống có thể được yêu cầu hoạt động với sự có mặt của các
thành phần bị hỏng. Cuối cùng, trong thời đại của các hệ thống hạn chế năng
lượng, hiệu quả năng lượng của các tổ chức khác nhau có thể vượt qua các mối
quan tâm khác.
Các mạng thường được vẽ dưới dạng biểu đồ, với mỗi cạnh của biểu đồ biểu thị một
liên kết của mạng truyền thông. Trong các hình trong phần này, nút bộ nhớ bộ xử lý được
hiển thị dưới dạng hình vuông màu đen và công tắc được hiển thị dưới dạng hình tròn
màu. Chúng tôi giả định ở đây rằng tất cả các liên kết là hai chiều; đó là, thông tin có thể
chảy theo một trong hai hướng. Tất cả các mạng bao gồm công tắc có liên kết đến các nút
bộ nhớ bộ xử lý và các công tắc khác. Mạng đầu tiên kết nối một chuỗi các nút với nhau :

Cấu trúc liên kết này được gọi là a nhẫnVì một số nút không được kết nối trực
tiếp, một số thông báo sẽ phải nhảy dọc theo các nút trung gian cho đến khi
chúng đến đích cuối cùng.
Không giống như một chiếc xe buýt, một bộ dây được chia sẻ cho phép phát
sóng tới tất cả các thiết bị được kết nối, một chiếc nhẫn có khả năng chuyển đồng
mạng thời.
băng thông Không chính Bởi vì có rất nhiều cấu trúc liên kết để lựa chọn, các số liệu hiệu suất là cần thiết
thức, tốc độ truyền tối đa để phân biệt các thiết kế này. Hai là phổ biến. Đầu tiên là tổng cộng mạng băng
của một mạng; có thể tham thông, đó là băng thông của mỗi liên kết nhân với số lượng liên kết. Điều này đại
khảo tốc độ của một liên diện cho băng thông cao điểm. Đối với mạng vòng ở trên, vớiP bộ xử lý, tổng băng
kết đơn hoặc tốc độ truyền
thông mạng sẽ là P lần băng thông của một liên kết; tổng băng thông mạng của xe
tập thể của tất cả các liên
kết trong mạng.
buýt chỉ là băng thông của xe buýt đó.
Để cân bằng trường hợp băng thông tốt nhất này, chúng tôi bao gồm một số
băng thông liệu khác gần với trường hợp xấu nhất: băng thông bisection Số liệu này được
bisection Các
băng thông giữa
tính bằng cách chia máy thành hai nửa. Sau đó, bạn tổng băng thông của các liên
hai phần bằng nhau kết băng qua đường phân chia tưởng tượng đó. Băng thông bisection của một
của vòng là hai lần băng thông liên kết. Nó là một lần băng thông liên kết cho xe buýt.
a bộ vi xử lý. Biện Nếu một liên kết duy nhất nhanh như xe buýt, thì chiếc nhẫn chỉ nhanh gấp đôi so
pháp này là cho sự với xe buýt trong trường hợp xấu nhất, nhưng nó là như vậy. P thời gian nhanh
phân chia trường hợp hơn trong trường hợp tốt nhất.
xấu nhất của bộ đa Vì một số cấu trúc liên kết mạng không đối xứng, câu hỏi đặt ra là nơi để vẽ
xử lý. đường tưởng tượng khi chia đôi máy. Băng thông lưỡng cực là một số liệu trong
mạng kết nối đầy đủ trường hợp xấu nhất, vì vậy câu trả lời là chọn bộ phận mang lại hiệu suất mạng bi
Một mạng lưới kết nối quan nhất. Thay thế, hãy tính toán tất cả các băng thông có thể có và chọn nhỏ nhất.
các nút bộ nhớ bộ xử lý Chúng tôi có quan điểm bi quan này vì các chương trình song song thường bị giới
bằng cách cung cấp một hạn bởi liên kết yếu nhất trong chuỗi truyền thông.
liên kết giao tiếp Ở cực đoan khác từ một chiếc nhẫn là a mạng kết nối đầy đủ, trong đó mọi bộ xử lý
chuyên dụng giữa mọi có một liên kết hai chiều với mọi bộ xử lý khác. Đối với các mạng được kết nối đầy đủ,
nút. tổng băng thông mạng là P × (P−1) / 2 và băng thông lưỡng phân là (P/ 2)2.
Sự cải thiện to lớn
về hiệu suất của các
mạng được kết nối đầy
đủ được bù đắp bằng
sự gia tăng lớn về chi
phí. Hậu quả này
truyền cảm hứng cho
các kỹ sư phát minh ra
các cấu trúc liên kết
mới nằm giữa chi phí
của nhẫn và hiệu suất
của đầy đủ
6.9 Giới thiệu về cấu trúc liên kết mạng đa bộ xử lý 559

a. Lưới 2D hoặc hình xuyến của 16 nút b. n-cube cây gồm 8 nút (8 = 23 vì thế n = 3)

HÌNH 6.15 Cấu trúc liên kết mạng đã xuất hiện trong bộ xử lý song song thương mại. Các
vòng tròn màu đại diện cho các công tắc và các hình vuông màu đen đại diện cho các nút bộ nhớ bộ xử lý.
Mặc dù một công tắc có nhiều liên kết, nhưng nhìn chung chỉ có một liên kết đến bộ xử lý. Boolean ncấu
trúc liên kết -cube là một nkết nối -dimensional với 2n các nút, yêu cầu n liên kết trên mỗi công tắc (cộng
với một cho bộ xử lý) và do đó n nút hàng xóm gần nhất. Thông thường, các cấu trúc liên kết cơ bản này
đã được bổ sung thêm các cung để cải thiện hiệu suất và độ tin cậy.

mạng kết nối. Việc đánh giá thành công phụ thuộc phần lớn vào bản chất của giao
tiếp trong khối lượng công việc của các chương trình song song chạy trên máy tính.
Số lượng các cấu trúc liên kết khác nhau đã được thảo luận trong các ấn phẩm
sẽ khó đếm, nhưng chỉ một số ít được sử dụng trong các bộ xử lý song song
thương mại. Hình 6.15 minh họa hai trong số các cấu trúc liên kết phổ biến.
Một cách khác để đặt bộ xử lý ở mọi nút trong mạng là chỉ để lại công tắc tại một
số nút này. Các công tắc nhỏ hơn các nút chuyển đổi bộ nhớ bộ xử lý và do đó có thể
được đóng gói dày đặc hơn, do đó làm giảm khoảng cách và tăng hiệu suất. Các
mạng như vậy thường được gọi mạng lưới đa tầng để phản ánh nhiều bước mà một mạng lưới đa tầng
thông điệp có thể đi. Các loại mạng đa tầng có số lượng lớn như các mạng một tầng; Một mạng cung cấp một
Hình 6.16 minh họa hai trong số các tổ chức đa tầng phổ biến. A kết nối đầy đủ hoặc công tắc nhỏ ở mỗi nút.
là mạng lưới thanh ngang cho phép bất kỳ nút nào giao tiếp với bất kỳ nút nào khác mạng lưới thanh
trong một lần đi qua mạng. An Mạng Omega sử dụng ít phần cứng hơn mạng thanh ngang Một mạng cho
ngang (2n đăng nhập2 n so với n2 chuyển đổi), nhưng sự tranh chấp có thể xảy ra giữa phép bất kỳ nút nào giao
các tin nhắn, tùy thuộc vào mô hình giao tiếp. Ví dụ, mạng Omega trong Hình 6.16 tiếp với bất kỳ nút nào
không thể gửi tin nhắn từ P0 đến P6 đồng thời nó gửi tin nhắn từ P1 đến P4. khác trong một lần đi qua
mạng.
Thực hiện các cấu trúc liên kết mạng
Phân tích đơn giản này của tất cả các mạng trong phần này bỏ qua những cân nhắc
thực tế quan trọng trong việc xây dựng mạng. Khoảng cách của mỗi liên kết ảnh
hưởng đến chi phí giao tiếp ở tốc độ đồng hồ cao nói chung, khoảng cách càng dài,
càng tốn kém khi chạy ở tốc độ đồng hồ cao. Khoảng cách ngắn hơn cũng giúp việc
gán nhiều dây hơn cho liên kết dễ dàng hơn, vì sức mạnh để lái nhiều dây sẽ ít hơn
nếu dây ngắn. Dây ngắn hơn cũng rẻ hơn dây dài hơn. Một thực tế khác
560 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

P0
P1
P2
P0
P3
P1
P4
P2
P5
P3
P6
P4
P7
P5

P6

P7

a. Thanh ngang b. Mạng Omega

A C
B D

c. Hộp chuyển đổi mạng Omega

HÌNH 6.16 Cấu trúc liên kết mạng đa tầng phổ biến cho tám nút. Các công tắc trong những bản
vẽ đơn giản hơn trong các bản vẽ trước đó vì các liên kết là đơn hướng; dữ liệu đi vào bên trái và thoát ra
khỏi liên kết bên phải. Hộp chuyển đổi trong c có thể chuyển A đến C và B sang D hoặc B sang C và A đến
D. Thanh ngang sử dụng n2 công tắc, ở đâu n là số lượng bộ xử lý, trong khi mạng Omega sử dụng 2 n
đăng nhập2n của công tắc lớn các hộp, mỗi hộp được cấu tạo một cách hợp lý gồm bốn trong số các công
tắc nhỏ hơn. Trong trường hợp này, thanh ngang sử dụng 64 công tắc so với 12 hộp công tắc hoặc 48 công
tắc, trong mạng Omega. Tuy nhiên, thanh ngang có thể hỗ trợ bất kỳ sự kết hợp tin nhắn nào giữa các bộ
xử lý, trong khi mạng Omega không thể.
Bản thân bạn

Kiểm
tra
hạn chế là các bản vẽ
ba chiều phải được
ánh xạ lên các chip
về cơ bản là phương
tiện hai chiều. Mối
quan tâm cuối cùng
là năng lượng. Các
mối quan tâm về
năng lượng có thể
buộc các chip đa lõi
dựa vào các cấu trúc
liên kết lưới đơn
giản, ví dụ. Điểm
mấu chốt là các cấu
trúc liên kết có vẻ
thanh lịch khi phác
thảo trên giấy có thể
không thực tế khi
được xây dựng bằng
silicon hoặc trong
trung tâm dữ liệu.
Bây giờ chúng tôi
hiểu tầm quan trọng
của các cụm và đã
thấy các cấu trúc liên
kết mà chúng tôi có
thể theo dõi để kết
nối chúng lại với
nhau, tiếp theo
chúng tôi sẽ xem
phần cứng và phần
mềm của giao diện
mạng với bộ xử lý.
Đúng hay sai: Đối
với một chiếc nhẫn
với P các nút, tỷ lệ
của tổng băng thông
mạng với băng
thông lưỡng phân là
P/ 2.
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 561

6.10 Giao tiếp với thế giới bên ngoài :


Mạng cụm

Phần trực tuyến này mô tả phần cứng và phần mềm mạng được sử dụng để kết nối các nút
của cụm với nhau. Ví dụ là Ethernet 10 gigabit / giây được kết nối với máy tính bằng cách
sử dụng Kết nối ngoại vi thành phần (PCIe). Nó cho thấy cả tối ưu hóa phần mềm và phần
cứng cách cải thiện hiệu suất mạng , bao gồm nhắn tin sao chép bằng không, giao tiếp
không gian người dùng, sử dụng bỏ phiếu thay vì I / O ngắt, và tính toán phần cứng của
tổng kiểm tra. Trong khi ví dụ là kết nối mạng, các kỹ thuật trong phần này cũng áp dụng
cho bộ điều khiển lưu trữ và các thiết bị I / O khác.
Sau khi bao quát hiệu suất của mạng ở mức độ chi tiết thấp trong phần trực
tuyến này, phần tiếp theo cho thấy cách điểm chuẩn đa bộ xử lý của tất cả các
loại với các chương trình cấp cao hơn nhiều.

Điểm chuẩn đa bộ xử lý và mô
6.11
hình hiệu suất

Như chúng ta đã thấy Chương 1, hệ thống điểm chuẩn luôn là một chủ đề nhạy cảm,
bởi vì đó là một cách dễ thấy để cố gắng xác định hệ thống nào tốt hơn. Kết quả
không chỉ ảnh hưởng đến doanh số của các hệ thống thương mại, mà còn ảnh hưởng
đến danh tiếng của các nhà thiết kế của các hệ thống đó. Do đó, tất cả những người
tham gia muốn giành chiến thắng trong cuộc thi, nhưng họ cũng muốn chắc chắn rằng
nếu ai đó chiến thắng, họ xứng đáng với điều đó bởi vì họ có một hệ thống thực sự tốt
hơn. Mong muốn này dẫn đến các quy tắc để đảm bảo rằng kết quả điểm chuẩn không
chỉ đơn giản là các thủ thuật kỹ thuật cho điểm chuẩn đó, mà thay vào đó là những
tiến bộ cải thiện hiệu suất của các ứng dụng thực.
Để tránh các thủ thuật có thể xảy ra, một quy tắc điển hình là bạn có thể thay
đổi điểm chuẩn. Mã nguồn và bộ dữ liệu được cố định và có một câu trả lời thích
hợp duy nhất. Bất kỳ sai lệch so với các quy tắc làm cho kết quả không hợp lệ.
Nhiều điểm chuẩn đa bộ xử lý theo các truyền thống này. Một ngoại lệ phổ biến là
có thể tăng kích thước của vấn đề để bạn có thể chạy điểm chuẩn trên các hệ thống
có số lượng bộ xử lý khác nhau. Đó là, nhiều điểm chuẩn cho phép mở rộng quy mô
yếu thay vì yêu cầu mở rộng quy mô mạnh mẽ, mặc dù bạn phải cẩn thận khi so sánh
kết quả cho các chương trình chạy các kích cỡ vấn đề khác nhau.
Hình 6.17 đưa ra một bản tóm tắt của một số điểm chuẩn song song, cũng được mô tả dưới đây :
n Linpack là một tập hợp các thói quen đại số tuyến tính, và các thói quen
cho thực hiện loại bỏ Gaussian tạo thành cái được gọi là chuẩn Linpack.
Thói quen DGEMM trong ví dụ ở trang 226 đại diện cho một phần nhỏ mã
nguồn của điểm chuẩn Linpack, nhưng nó chiếm phần lớn thời gian thực
hiện cho điểm chuẩn. Nó cho phép mở rộng quy mô yếu ,
6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm 561.e1

Giao tiếp với thế giới bên ngoài :


6.10
Mạng cụm

Phần trực tuyến này mô tả phần cứng và phần mềm mạng được sử dụng để kết nối
các nút của cụm với nhau. Vì có toàn bộ sách và khóa học chỉ trên mạng, phần
này chỉ giới thiệu các thuật ngữ và khái niệm chính. Mặc dù ví dụ của chúng tôi là
kết nối mạng, các kỹ thuật chúng tôi mô tả cũng áp dụng cho bộ điều khiển lưu
trữ và các thiết bị I / O khác.
Ethernet đã thống trị các mạng cục bộ trong nhiều thập kỷ, vì vậy không có gì
đáng ngạc nhiên khi các cụm chủ yếu dựa vào Ethernet khi kết nối cụm. Nó trở
nên phổ biến về mặt thương mại ở tốc độ 10 Megabits mỗi giây trong những năm
1980; nhưng ngày nay, 10 Gigabits / Ethernet thứ hai là tiêu chuẩn và 100
Gigabits / giây đang được triển khai trong các trung tâm dữ liệu. Hình e6.10.1
hiển thị thẻ giao diện mạng (NIC) cho 10 Gigabits / Ethernet thứ hai.
Máy tính cung cấp các liên kết tốc độ cao để cắm các thiết bị I / O nhanh như NIC
này. Mặc dù đã từng có các chip riêng biệt để kết nối bộ vi xử lý với bộ nhớ và các
thiết bị I / O tốc độ cao, nhờ Luật Moore Moore, các chức năng này đã được hấp thụ
vào chip chính trong các dịch vụ gần đây như Intel Sky Skyelake. Một tốc độ cao
phổ biến
liên kết ngày hôm nay là PCIe, viết tắt của Kết nối ngoại vi thành phần.
Nó được gọi là a liên kết trong đó khối xây dựng cơ bản, được gọi là a làn đường nối
tiếp, chỉ bao gồm bốn dây: hai để nhận dữ liệu và hai để truyền dữ liệu. Số nhỏ này
tương phản với phiên bản PCI trước đó bao gồm 64 dây, được gọi

HÌNH e6.10.1 Thẻ Ethernet NetFPGA 10-Gigabit (xem http://netfpga.org/), kết nối tối đa bốn
liên kết Ethernet 10 Gigabit / giây. Đây là một nền tảng mở dựa trên FPGA để nghiên cứu
mạng và thử nghiệm trong lớp học. Động cơ DMA và bốn chip MAC MAC trong Hình e6.9.2 chỉ là
một phần của Xilinx Virtex FPGA ở giữa bảng. Bốn chip PHY trong Hình e6.9.2 là bốn hình vuông màu
đen ở bên phải của bốn hình chữ nhật màu trắng ở cạnh trái của bảng, đó là nơi cáp Ethernet được cắm vào.
561.e2 6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm

a xe buýt song songPCIe cho phép bất cứ nơi nào từ 1 đến 32 làn được sử dụng để
kết nối với các thiết bị I / O, tùy thuộc vào nhu cầu của nó. NIC này sử dụng PCI
1.1, vì vậy mỗi làn đường chuyển với tốc độ 2 Gigabits / giây.
Các NIC trong Hình e6.10.1 kết nối với máy tính chủ qua liên kết PCIe tám
làn, cung cấp 16 Gigabits / giây theo cả hai hướng. Để liên lạc, một NIC phải gửi
hoặc truyền tin nhắn và nhận chúng, thường được viết tắt là TX và RX, tương
ứng. Đối với NIC này, mỗi liên kết 10 G sử dụng các hàng đợi truyền và nhận
riêng biệt, mỗi hàng có thể lưu trữ hai gói Ethernet có độ dài đầy đủ, được sử
dụng giữa các liên kết Ethernet và NIC . Hình e6.10.2 là sơ đồ khối của NIC hiển
thị hàng đợi TX và RX. NIC cũng có hai hàng đợi 32 mục để truyền và nhận
giữa máy tính chủ và NIC .
Để đưa ra lệnh cho NIC, bộ xử lý phải có khả năng giải quyết thiết bị và cung
I / O được ánh xạ bộ cấp một hoặc nhiều từ lệnh. Trong I / O được ánh xạ bộ nhớ, các phần của
nhớ Một sơ đồ I / O không gian địa chỉ được gán cho các thiết bị I / O. Trong quá trình khởi tạo (lúc
trong phần nào của không khởi động), các thiết bị PCIe có thể yêu cầu được chỉ định một vùng địa chỉ có độ
gian địa chỉ được gán cho dài xác định. Tất cả các bộ xử lý tiếp theo đọc và ghi vào vùng địa chỉ đó được
các thiết bị I / O và đọc
chuyển tiếp qua PCIe đến thiết bị đó. Đọc và ghi vào các địa chỉ đó được hiểu là
và ghi vào các địa chỉ đó
được hiểu là các lệnh cho
các lệnh cho thiết bị I / O.
thiết bị I / O. Ví dụ: một thao tác ghi có thể được sử dụng để gửi dữ liệu đến giao diện
mạng nơi dữ liệu sẽ được hiểu là một lệnh. Khi bộ xử lý phát hành địa chỉ và dữ
liệu, hệ thống bộ nhớ sẽ bỏ qua thao tác vì địa chỉ chỉ cho biết một phần dung
lượng bộ nhớ được sử dụng cho I / O. Tuy nhiên, NIC nhìn thấy hoạt động và ghi
lại dữ liệu. Các chương trình người dùng bị ngăn không cho phát hành trực tiếp
các hoạt động I / O, vì HĐH không cung cấp quyền truy cập vào không gian địa
chỉ được gán cho các thiết bị I / O và do đó địa chỉ được bảo vệ bởi bản dịch địa
chỉ. I / O được ánh xạ bộ nhớ cũng có thể được sử dụng để truyền dữ liệu bằng
cách viết hoặc đọc đến các địa chỉ được chọn. Thiết bị sử dụng địa chỉ để xác
định loại lệnh và dữ liệu có thể được cung cấp bằng cách ghi hoặc thu được bằng
cách đọc. Trong mọi trường hợp, địa chỉ mã hóa cả nhận dạng thiết bị và loại
truyền giữa bộ xử lý và thiết bị.

Điều
khiển
Dữ liệu
PCIe

TX MAC PHY Cổng 0


MAC PHY Cổng 1
DMA MAC PHY
Cảng 2
RX
MAC PHY Cảng 3

HÌNH e6.10.2 Sơ đồ khối của thẻ NetFPGA Ethernet Hình e6.10.1 hiển thị các đường dẫn điều
khiển và các đường dẫn dữ liệu. Đường dẫn điều khiển cho phép công cụ DMA đọc trạng thái hàng đợi,
chẳng hạn như trống so với. on-trống, và nội dung của mục hàng đợi có sẵn tiếp theo. Động cơ DMA cũng kiểm
soát ghép kênh cổng. Đường dẫn dữ liệu chỉ đơn giản là đi qua khối DMA đến hàng đợi TX / RX hoặc đến bộ
nhớ chính. Các chip MAC MAC được mô tả dưới đây. Các chip PHY, đề cập đến lớp vật lý, kết nối các chip
MAC MAC với phương tiện mạng vật lý, chẳng hạn như dây đồng hoặc sợi quang.
6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm 561.e3

Mặc dù bộ xử lý có thể tự chuyển dữ liệu từ không gian người dùng vào không
gian I / O, nhưng chi phí để truyền dữ liệu từ hoặc sang mạng tốc độ cao có thể
không thể chịu đựng được, vì nó có thể tiêu thụ một phần lớn bộ xử lý. Do đó, các
nhà thiết kế máy tính từ lâu đã phát minh ra một cơ chế giảm tải bộ xử lý và có bộ
điều khiển thiết bị truyền dữ liệu trực tiếp đến hoặc từ bộ nhớ mà không liên quan truy cập bộ nhớ trực
đến bộ xử lý. Cơ chế này được gọi truy cập bộ nhớ trực tiếp (DMA). tiếp (DMA) Một cơ
DMA được triển khai với bộ điều khiển chuyên dụng truyền dữ liệu giữa giao chế cung cấp bộ điều
khiển thiết bị có khả
diện mạng và bộ nhớ độc lập với bộ xử lý và trong trường hợp này, công cụ
năng truyền dữ liệu trực
DMA nằm trong NIC . tiếp đến hoặc từ bộ nhớ
Để thông báo cho hệ điều hành (và cuối cùng là ứng dụng sẽ nhận được gói) mà không liên quan đến
rằng việc chuyển tiền đã hoàn tất, DMA sẽ gửi một I / O ngắt. bộ xử lý.
Một ngắt I / O giống như các ngoại lệ chúng ta đã thấy Chương 4 và 5, với hai điều khiển ngắt
điểm khác biệt quan trọng : Tôi / O Một sơ đồ I / O
mà sử dụng các ngắt để
1. Một ngắt I / O không đồng bộ đối với việc thực hiện lệnh. Nghĩa là, ngắt chỉ ra cho bộ xử lý rằng
không được liên kết với bất kỳ lệnh nào và không ngăn hoàn thành lệnh, do đó, thiết bị I / O cần được
nó rất khác với các ngoại lệ lỗi trang hoặc ngoại lệ, chẳng hạn như tràn số học. chú ý.
Đơn vị kiểm soát của chúng tôi chỉ cần kiểm tra ngắt I / O đang chờ xử lý tại
thời điểm nó bắt đầu một hướng dẫn mới.
2. Ngoài thực tế là đã xảy ra ngắt I / O, chúng tôi muốn truyền đạt thêm
thông tin, chẳng hạn như danh tính của thiết bị tạo ra ngắt. Hơn nữa, các
ngắt đại diện cho các thiết bị có thể có các ưu tiên khác nhau và các yêu
cầu ngắt có các mức độ khẩn cấp khác nhau liên quan đến chúng.
Để truyền đạt thông tin đến bộ xử lý, chẳng hạn như danh tính của thiết bị tăng
ngắt, một hệ thống có thể sử dụng các ngắt được kiểm tra hoặc một thanh ghi
nhận dạng ngoại lệ, được gọi là giám sát viên ngoại lệ nguyên nhân (SCAUSE)
đăng ký trong RISC-V (xem Mục 4.9). Khi bộ xử lý nhận ra ngắt, thiết bị có thể
gửi địa chỉ vectơ hoặc trường trạng thái để đặt trong thanh ghi Nguyên nhân. Do
đó, khi HĐH có quyền kiểm soát, nó sẽ biết danh tính của thiết bị gây ra sự gián
đoạn và có thể thẩm vấn ngay lập tức thiết bị. Một cơ chế ngắt giúp loại bỏ sự
cần thiết của bộ xử lý để tiếp tục kiểm tra thiết bị và thay vào đó cho phép bộ xử
lý tập trung vào việc thực hiện các chương trình.

Vai trò của hệ điều hành trong mạng


Hệ điều hành hoạt động như giao diện giữa phần cứng và chương trình yêu cầu I
/ O. Trách nhiệm mạng của hệ điều hành phát sinh từ ba đặc điểm của mạng :
1. Nhiều chương trình sử dụng bộ xử lý chia sẻ mạng.
2. Mạng thường sử dụng các ngắt để truyền đạt thông tin về các hoạt động.
Vì các ngắt gây ra chuyển sang chế độ kernel hoặc giám sát, chúng phải
được xử lý bởi hệ điều hành (HĐH).
561.e4 6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm

3. Việc kiểm soát cấp thấp của mạng rất phức tạp, bởi vì nó yêu cầu quản lý
một tập hợp các sự kiện đồng thời và vì các yêu cầu để điều khiển thiết bị
chính xác thường rất chi tiết.

Phần cứng
/ Ba đặc điểm của mạng cụ thể và hệ thống I / O nói chung
Phần mềm đến một số chức năng khác nhau, HĐH phải cung cấp :
■ HĐH đảm bảo rằng chương trình người dùng chỉ truy cập vào các phần của I / O
Giao diện thiết bị mà người dùng có quyền. Ví dụ, HĐH không được phép a
chương trình đọc hoặc ghi một tập tin trên đĩa nếu chủ sở hữu của tập tin chưa
được cấp
truy cập vào chương trình này. Trong một hệ thống có các thiết bị I / O được chia
sẻ, bảo vệ có thể
không được cung cấp nếu các chương trình người dùng có thể thực hiện I /
O trực tiếp.
■ HĐH cung cấp các điểm trừu tượng để truy cập các thiết bị bằng cách cung cấp
các thói quen đó
xử lý các hoạt động thiết bị cấp thấp.
■ HĐH xử lý các ngắt được tạo bởi các thiết bị I / O, giống như nó xử lý
ngoại lệ được tạo bởi một chương trình.
■ HĐH cũng cố gắng cung cấp quyền truy cập công bằng vào các tài nguyên I / O
được chia sẻ
như lịch trình truy cập để tăng cường thông lượng hệ thống.
Phần mềm bên trong hệ điều hành giao tiếp với một thiết bị I / O cụ thể
trình điều khiển thiết bị như thế này NIC được gọi là a trình điều khiển thiết bịTrình điều khiển cho
Một chương trình NIC này theo năm bước.
điều khiển thiết bị I / O khi truyền hoặc nhận tin nhắn. Hình e6.9.3 cho thấy mối quan hệ của
được gắn vào các bước này dưới dạng gói Ethernet được gửi từ một nút của cụm và nhận được
máy vi tính. bởi một nút khác trong cụm.

Đầu tiên, các bước truyền :


1. Đầu tiên trình điều khiển chuẩn bị bộ đệm gói trong bộ nhớ máy chủ. Nó
sao chép một gói từ không gian địa chỉ người dùng vào bộ đệm mà nó
phân bổ trong không gian địa chỉ hệ điều hành.
2. Tiếp theo, nó nói chuyện với người khác. Người lái xe viết một Mô tả I / O
đến thanh ghi NIC thích hợp cung cấp địa chỉ của bộ đệm và độ dài của nó.
3. DMA trong NIC tiếp theo sao chép gói Ethernet đi từ bộ đệm máy chủ qua
PCIe.
4. Khi quá trình truyền hoàn tất, DMA làm gián đoạn bộ xử lý để thông báo
cho bộ xử lý rằng gói đã được truyền thành công.
5. Cuối cùng, trình điều khiển khử phân bổ bộ đệm truyền.
6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm 561.e5

Nguồn

Bước 1 RAM Bước 5


CPU
Bước 2 PCIe
Bước 4
NIC

Bước
3

Ethernet

Bước
Bước 3
2 NIC
PCIe Bước 4
Bước 1 CPU
RAM Bước 5
Điểm đến

HÌNH e6.10.3 Mối quan hệ của năm bước của trình điều khiển khi truyền gói Ethernet từ
một nút và nhận gói đó trên một nút khác.

Tiếp theo, các bước nhận :


1. Đầu tiên, trình điều khiển chuẩn bị bộ đệm gói trong bộ nhớ máy chủ,
phân bổ bộ đệm mới để đặt gói nhận được.
2. Tiếp theo, nó nói chuyện với người dùng đến NIC. Trình điều khiển viết
một mô tả I / O cho thanh ghi NIC thích hợp cung cấp địa chỉ của bộ đệm
và độ dài của nó.
3. DMA trong NIC tiếp theo sao chép gói Ethernet đến qua PCIe vào bộ đệm
máy chủ được phân bổ.
4. Khi quá trình truyền hoàn tất, DMA sẽ ngắt bộ xử lý để thông báo cho
máy chủ về gói mới nhận được và kích thước của nó.
5. Cuối cùng, trình điều khiển sao chép gói nhận được vào không gian địa chỉ người dùng.
Như bạn có thể thấy trong Hình e6.10.3, ba bước đầu tiên rất quan trọng về thời
gian khi truyền một gói (vì hai bước cuối cùng xảy ra sau khi gói được gửi) và ba
bước cuối cùng rất quan trọng khi nhận được gói (vì hai bước đầu tiên xảy ra
trước khi gói đến) . Tuy nhiên, các bước không quan trọng này phải được hoàn
thành trước khi các nút riêng lẻ hết tài nguyên, chẳng hạn như không gian bộ nhớ.
Không làm như vậy ảnh hưởng tiêu cực đến hiệu suất mạng.
561.e6 6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm

Cải thiện hiệu suất mạng


Tầm quan trọng của mạng trong các cụm có nghĩa là nó chắc chắn đáng để cố
gắng cải thiện hiệu suất. Chúng tôi hiển thị cả phần mềm và kỹ thuật phần cứng.
Bắt đầu với tối ưu hóa phần mềm, một mục tiêu hiệu suất là giảm số lần gói
được sao chép, điều mà bạn có thể nhận thấy xảy ra lặp đi lặp lại trong năm bước
của trình điều khiển ở trên. Các không sao chép tối ưu hóa cho phép công cụ
DMA nhận thông điệp trực tiếp từ không gian dữ liệu chương trình người dùng
trong quá trình truyền và được đặt ở nơi người dùng muốn khi nhận được tin
nhắn, thay vì đi qua bộ đệm trung gian trong hệ điều hành trên đường đi.
Tối ưu hóa phần mềm thứ hai là cắt bỏ hoàn toàn hệ điều hành bằng cách di
chuyển giao tiếp vào không gian địa chỉ người dùng. Bằng cách không gọi hệ
điều hành và không gây ra chuyển đổi ngữ cảnh, chúng tôi có thể giảm đáng kể
chi phí phần mềm.
Trong kịch bản triệt để hơn này, bước thứ ba sẽ là giảm các ngắt. Một lý do là các
bộ xử lý hiện đại thường chuyển sang chế độ năng lượng thấp hơn trong khi chờ ngắt
và phải mất thời gian để thoát ra khỏi nguồn điện thấp để phục vụ ngắt cũng như sự
gián đoạn của đường ống, làm tăng độ trễ. Giải pháp thay thế cho các ngắt là bộ xử lý
kiểm tra định kỳ các bit trạng thái để xem liệu thao tác I / O đã hoàn tất hay chưa,
được gọi bỏ phiếuDo đó, chúng tôi có thể yêu cầu chương trình người dùng thăm dò
bỏ phiếu Quá trình của ý kiến của NIC liên tục để xem khi nào đơn vị DMA đã gửi tin nhắn và do tác dụng
định kỳ kiểm tra trạng phụ, bộ xử lý không chuyển sang chế độ năng lượng thấp.
thái của thiết bị I / O để Nhìn vào tối ưu hóa phần cứng, một mục tiêu tiềm năng để cải thiện là tính
xác định nhu cầu phục vụ toán các giá trị của các trường của gói Ethernet. Địa chỉ Ethernet 48 bit, được gọi
thiết bị.
là Địa chỉ kiểm soát truy cập phương tiện hoặc là Địa chỉ MAC, là một số duy
nhất được gán cho mỗi Ethernet NIC. Để cải thiện hiệu suất, chip MAC MAC trực
tiếp chỉ là một phần của FPGA trên NIC này tính giá trị cho các trường mở đầu và
trường CRC (xem Mục 5.5). Trình điều khiển còn lại với việc đặt địa chỉ đích
MAC, địa chỉ nguồn MAC, loại tin nhắn, tải trọng dữ liệu và đệm nếu cần.
(Ethernet yêu cầu gói tối thiểu, bao gồm các trường tiêu đề và CRC nhưng không
phải là phần mở đầu, là 64 byte.) Lưu ý rằng ngay cả các NIC Ethernet ít tốn kém
nhất cũng tính toán CRC trong phần cứng hiện nay.
Tối ưu hóa phần cứng thứ hai, có sẵn trên các bộ xử lý Intel gần đây nhất như Ivy
Bridge, cải thiện hiệu suất của NIC đối với hệ thống phân cấp bộ nhớ. Dữ liệu trực
tiếp IO (DDIO) cho phép tối đa 10% bộ đệm cấp cuối được sử dụng làm bàn phím
nhanh cho động cơ DMA. Dữ liệu được sao chép trực tiếp vào bộ đệm cấp cuối thay
vì DRAM bởi DMA và chỉ được ghi vào DRAM khi bị trục xuất khỏi bộ đệm. Tối ưu
hóa này giúp với độ trễ, nhưng cũng với băng thông; một số vùng bộ nhớ được sử
dụng để kiểm soát có thể được viết bởi NIC nhiều lần, và những bài viết này không
còn cần phải đi đến DRAM. Vì thế, DDIO cung cấp các lợi ích tương tự như bộ nhớ
cache ghi lại so với ghi qua bộ đệm (Chương 5).
Hãy cùng xem một cửa hàng đối tượng theo kiến trúc máy khách-máy chủ và sử
dụng hầu hết các tối ưu hóa ở trên: nhắn tin sao chép bằng không, giao tiếp không
gian người dùng, bỏ phiếu thay vì ngắt và tính toán phần cứng của lời nói đầu và
CRC. Người lái xe
6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm 561.e7

14

12

10
Độ trễ (micro giây)

số 8
Trình điều khiển RX
RX NIC
6 Thời gian bay
TX TX
Trình điều khiển TX
4

0
1408
1344
1280
1216
1152
1088
1024

64 0
960
896
832
768
704
640
576
512
448
384
320
256
192
128
Kích thước đối tượng (B)

HÌNH e6.10.4 Thời gian để gửi một đối tượng bị hỏng vào trình điều khiển truyền và thời
gian phần cứng của NIC so với. nhận tài xế và thời gian phần cứng của NIC. Thời gian
truyền của NIC lớn hơn nhiều so với nhận của NIC thời gian vì truyền tải đòi hỏi nhiều chuyến đi khứ hồi
PCIe. NIC không đọc PCIe để đọc mô tả và dữ liệu, nhưng khi nhận được NIC, PCIe ghi dữ liệu, độ dài dữ
liệu và ngắt. PCIe đọc phải chịu độ trễ chuyến đi khứ hồi vì NIC chờ trả lời, nhưng viết PCIe không yêu
cầu phản hồi vì PCIe đáng tin cậy, vì vậy viết PCIe có thể được gửi trở lại.

hoạt động trong không gian địa chỉ người dùng như một thư viện mà ứng dụng gọi. Nó
cấp cho ứng dụng này quyền truy cập độc quyền và trực tiếp vào NIC. Tất cả không gian
đăng ký I / O trên NIC được ánh xạ vào ứng dụng và tất cả trạng thái trình điều khiển
được giữ trong ứng dụng. Hạt nhân hệ điều hành thậm chí không nhìn thấy NIC như vậy,
điều này tránh được các chi phí chuyển đổi ngữ cảnh, ngăn xếp phần mềm mạng hạt nhân
tiêu chuẩn và ngắt.
Hình e6.10.4 hiển thị thời gian để gửi một đối tượng từ nút này sang nút khác.
Nó thay đổi từ khoảng 9,5 đến 12,5 micro giây, tùy thuộc vào kích thước của đối
tượng. Dưới đây là thời gian cho mỗi bước tính bằng micro giây :
0,7 cho khách hàng Trình điều khiển trực tuyến (thư viện) để thực hiện yêu cầu (Trình điều khiển TX trong Hình e6.10.4).

6.4 đến 8.7, phần cứng của NIC để truyền yêu cầu của máy khách qua bus
PCIe đến Ethernet, tùy thuộc vào kích thước của đối tượng (NIC TX).
0,02 để gửi đối tượng qua Ethernet 10 G (Thời gian bay). Thời gian bay bị
giới hạn bởi tốc độ ánh sáng đến 5 ns mỗi mét. Cáp ba mét được sử dụng
trong phép đo này có nghĩa là thời gian bay là 15 ns, quá nhỏ để có thể nhìn
thấy rõ trong hình.
561.e8 6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm

1.8 đến 2.5, phần cứng cho phần cứng NIC nhận đối tượng, tùy thuộc vào kích
thước của nó (NIC RX).
0,6, đối với máy chủ Trình điều khiển trực tuyến, để truyền thông điệp với đối
tượng được yêu cầu đến ứng dụng (Trình điều khiển RX).
Bây giờ chúng ta đã thấy cách đo hiệu suất của mạng ở mức độ chi tiết thấp,
hãy để nâng cao quan điểm để xem cách điểm chuẩn đa bộ xử lý của tất cả các
loại với các chương trình cấp cao hơn nhiều.

Xây dựng Có nhiều phiên bản PCIe. NIC này sử dụng PCIe 1.1, chuyển giao ở
mức 2 gigabit mỗi giây trên mỗi làn, do đó, NIC này chuyển với tốc độ lên tới 16
gigabit mỗi giây theo mỗi hướng. PCIe 2.0, được tìm thấy trên hầu hết các bo mạch
chủ PC hiện nay, tăng gấp đôi băng thông làn đường lên 4 gigabit mỗi giây. PCIe 3.0
tăng gấp đôi một lần nữa lên 8 gigabit mỗi giây và nó bắt đầu được tìm thấy trên một
số bo mạch chủ. Chúng tôi hoan nghênh ủy ban tiêu chuẩn về tốc độ cải thiện băng
thông, đã khoảng 2số phiên bản gigabits / giây. Những hạn chế của Virtex 5 FPGA đã ngăn
NIC sử dụng các phiên bản PCIe nhanh hơn.

Xây dựng Trong khi Ethernet là nền tảng của giao tiếp cụm, các cụm thường sử dụng
các giao thức cấp cao hơn để giao tiếp đáng tin cậy. Giao thức điều khiển truyền và giao
thức Internet (TCP / IP), mặc dù được phát minh cho giao tiếp trên toàn hành tinh, thường
được sử dụng bên trong một máy tính quy mô kho, một phần do độ tin cậy của nó. Mặc dù
IP không đảm bảo giao hàng trong giao thức, TCP vẫn vậy. Người gửi giữ gói được gửi
cho đến khi nhận được thông báo xác nhận rằng nó đã được nhận chính xác từ người
nhận. Người nhận biết rằng tin nhắn không bị hỏng trên đường đi, bằng cách kiểm tra kỹ
nội dung với trường TCP CRC. Để đảm bảo IP cung cấp đến đúng điểm đến, tiêu đề IP
bao gồm tổng kiểm tra để đảm bảo số đích không thay đổi. Thành công của Internet phần
lớn nhờ vào sự thanh lịch và phổ biến của TCP / IP, cho phép các mạng cục bộ độc lập
giao tiếp đáng tin cậy. Do tầm quan trọng của nó trong Internet và trong các cụm, nhiều
người đã tăng tốc TCP / IP, sử dụng các kỹ thuật như được liệt kê trong phần này
[Regnier, 2004].

Xây dựng Thêm DMA là một đường dẫn khác đến hệ thống bộ nhớ đi qua cơ chế dịch
địa chỉ hoặc hệ thống phân cấp bộ đệm. Sự khác biệt này tạo ra một số vấn đề cả trong bộ
nhớ ảo và trong bộ nhớ cache. Những vấn đề này thường được giải quyết với sự kết hợp
của các kỹ thuật phần cứng và hỗ trợ phần mềm. Những khó khăn trong việc có DMA
trong hệ thống bộ nhớ ảo phát sinh vì các trang có cả địa chỉ vật lý và ảo. DMA cũng tạo ra
các vấn đề cho các hệ thống có bộ nhớ cache, bởi vì có thể có hai bản sao của một mục
dữ liệu: một trong bộ đệm và một trong bộ nhớ. Do DMA cấp các yêu cầu bộ nhớ trực tiếp
đến bộ nhớ thay vì thông qua bộ đệm của bộ xử lý, giá trị của vị trí bộ nhớ mà đơn vị DMA
nhìn thấy và bộ xử lý có thể khác nhau. Hãy xem xét một bài đọc từ một NIC mà đơn vị
DMA đặt trực tiếp vào bộ nhớ. Nếu một số vị trí mà DMA ghi trong bộ đệm, bộ xử lý sẽ
nhận được giá trị cũ khi đọc. Tương tự, nếu bộ đệm là ghi lại, DMA có thể đọc một giá trị
trực tiếp từ bộ nhớ khi có giá trị mới hơn
6.10 Giao tiếp với thế giới bên ngoài: Mạng cụm 561.e9

bộ nhớ cache và giá trị chưa được ghi lại. Điều này được gọi là vấn đề dữ liệu cũ hoặc
vấn đề kết hợp (xem Chương 5). Các giải pháp tương tự cho sự gắn kết được sử dụng
với DMA .

Xây dựng Hỗ trợ máy ảo rõ ràng có thể tác động tiêu cực đến mạng hiệu suất. Do
đó, các nhà thiết kế vi xử lý đã bổ sung phần cứng để giảm chi phí hiệu suất của các
máy ảo cho mạng nói riêng và I / O nói chung. Intel cung cấp Công nghệ ảo hóa cho I
/ O được định hướng (VT-d) để giúp ảo hóa I / O. Đây là một đơn vị quản lý bộ nhớ I /
O cho phép các máy ảo của khách sử dụng trực tiếp các thiết bị I / O, chẳng hạn như
Ethernet. Nó hỗ trợ DMA tóm tắt lại, cho phép DMA đọc hoặc ghi dữ liệu trực tiếp vào
bộ đệm I / O của máy ảo khách, thay vì vào bộ đệm I / O của máy chủ và sau đó sao
chép chúng vào bộ đệm I / O của khách. Nó cũng hỗ trợ làm gián đoạn việc sửa chữa
lại, cho phép máy ảo giám sát tuyến đường ngắt yêu cầu trực tiếp đến máy ảo thích
hợp.

Kiểm tra
Hai tùy chọn cho mạng đang sử dụng ngắt hoặc bỏ phiếu và sử dụng DMA hoặc Bản thân bạn
sử dụng bộ xử lý thông qua các hướng dẫn tải và lưu trữ.
1. Nếu chúng ta muốn độ trễ thấp nhất cho các gói nhỏ, sự kết hợp nào có thể
là tốt nhất?
2. Nếu chúng ta muốn độ trễ thấp nhất cho các gói lớn, sự kết hợp nào có thể
là tốt nhất?
562 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Linpack Yếu Đúng Đại số tuyến tính ma trận dày đặc [Dongarra, 1979]
ĐẶC BIỆT Yếu Không Song song công việc độc lập [Henning, 2007]
FFT 1D phức tạp
Phân hủy LU bị chặn
Yếu tố tắc nghẽn thưa thớt
Số nguyên sắp xếp Radix
Song song Stanford Mạnh mẽ Barnes-Hut
Ứng dụng cho (mặc dù Đa cực nhanh thích ứng
Bộ nhớ dùng chung cung cấp Không
Mô phỏng đại dương
SPLASH 2 [Woo hai vấn đề
et al., 1995] kích cỡ) Cấp tiến phân cấp
Ray Tracer
Renderer tập
Mô phỏng nước với cấu trúc dữ liệu không gian
Mô phỏng nước mà không có cấu trúc dữ liệu không gian
EP: lúng túng song song
Song song NAS Đúng MG: đa dạng đơn giản
Điểm chuẩn
Yếu (C hoặc CG: lưới không cấu trúc cho phương pháp gradient liên hợp
[Bailey et al.,
Chỉ Fortran) FT: Giải pháp phương trình vi phân từng phần 3 chiều sử dụng FFT
1991]
IS: sắp xếp số nguyên lớn
Blackscholes Giá tùy chọn với PDE Black-Scholes
Bodytrack theo dõi cơ thể của một người
Canneal có nghĩa là bộ nhớ cache được kích thích để tối ưu hóa định tuyến
Khấu trừ thế hệ tiếp theo nén với sao chép dữ liệu
Facesim Hướng dẫn chuyển động của khuôn mặt người
PARSEC
Phòng chuẩn Máy chủ tìm kiếm tương tự Ferret xông Content
Yếu Không
[Bienia et al., Fluidanimate, Động lực học chất lỏng cho hoạt hình với phương pháp SPH
2008] Freqmine khai thác mỏ thường xuyên
Streamcluster trên mạng phân cụm của một luồng đầu vào
Swaptions Giá của một danh mục các hoán đổi
Vips xử lý hình ảnh
mã hóa video x264 H.264
Máy trạng thái hữu hạn
Logic kết hợp
Đồ thị Traversal
Lưới cấu trúc
Ma trận dày đặc
Berkeley
Ma trận thưa thớt
Thiết kế
Mạnh hay
Các mô hình Đúng Phương pháp quang phổ (FFT)
Yếu
[Asanovic et al., Lập trình động
2006] N-Body
MapReduce
Backtrack / Branch và Bound
Suy luận mô hình đồ họa
Lưới không cấu trúc

HÌNH 6.17 Ví dụ về điểm chuẩn song song.

để người dùng chọn bất kỳ vấn đề kích thước nào; ví dụ, siêu máy tính có thể
giải quyết ma trận dày đặc có kích thước 10M mỗi bên. Hơn nữa, nó cho phép
người dùng viết lại Linpack dưới hầu hết mọi hình thức và bằng bất kỳ ngôn
ngữ nào, miễn là nó tính kết quả phù hợp và thực hiện cùng một số thao tác dấu
phẩy động cho một kích thước vấn đề nhất định. Hai lần một năm, 500 máy tính
có hiệu suất Linpack nhanh nhất được xuất bản tại www.top500.orgĐầu tiên
trong danh sách này được báo chí coi là máy tính nhanh nhất thế giới. Do tầm
quan trọng của hiệu quả năng lượng ngày nay, cùng một tổ chức cũng công bố
danh sách Green500 nơi họ sắp xếp danh sách Top500 dựa trên hiệu suất trên
mỗi watt chạy Linpack để chào mừng siêu máy tính hiệu quả nhất.
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 563

n ĐẶC BIỆT là một số liệu thông lượng dựa trên các điểm chuẩn CPU của
Spec , chẳng hạn như CPU 2017 (xem Chương 1). Thay vì báo cáo hiệu
suất của các chương trình riêng lẻ, Specrate chạy đồng thời nhiều bản sao
của chương trình. Do đó, nó đo lường sự song song cấp độ nhiệm vụ, vì
không có sự giao tiếp giữa các nhiệm vụ. Bạn có thể chạy bao nhiêu bản
sao của các chương trình như bạn muốn, vì vậy đây lại là một hình thức mở
rộng yếu.
n SPLASH và SPLASH 2 (Ứng dụng song song Stanford cho bộ nhớ dùng
chung) là những nỗ lực của các nhà nghiên cứu tại Đại học Stanford vào
những năm 1990 để kết hợp một bộ điểm chuẩn song song tương tự như các
mục tiêu cho bộ điểm chuẩn CPU của Spec. Nó bao gồm cả hạt nhân và ứng
dụng, bao gồm nhiều từ cộng đồng điện toán hiệu năng cao. Điểm chuẩn
này đòi hỏi tỷ lệ mạnh, mặc dù nó đi kèm với hai bộ dữ liệu.
n Các Điểm chuẩn song song NAS (NASA Advanced Supercomputing) là một
nỗ lực khác từ những năm 1990 đến bộ đa xử lý chuẩn. Lấy từ động lực
học chất lỏng tính toán, chúng bao gồm năm hạt nhân. Chúng cho phép
chia tỷ lệ yếu bằng cách xác định một vài bộ dữ liệu. Giống như Linpack,
các điểm chuẩn này có thể được viết lại, nhưng các quy tắc yêu cầu ngôn
ngữ lập trình chỉ có thể là C hoặc Fortran.
n Các PARSEC (Kho lưu trữ ứng dụng Princeton cho bộ nhớ dùng chung
Máy tính) bộ điểm chuẩn bao gồm các chương trình đa luồng sử dụng Chủ Chủ đề MỘT UNIX
đề (Chủ đề POSIX) và OpenMP (Mở đa xử lý; xem Mục 6.5). Họ tập trung API để tạo và thao tác các
vào các lĩnh vực tính toán mới nổi và bao gồm chín ứng dụng và ba hạt luồng. Nó được cấu trúc
nhân. Tám dựa vào song song dữ liệu, ba dựa vào song song đường ống và như một thư viện.
một dựa trên song song không có cấu trúc.
n Trên mặt trận đám mây, mục tiêu của Yahoo! Điểm chuẩn phục vụ đám
mây (YCSB) là để so sánh hiệu suất của các dịch vụ dữ liệu đám mây. Nó
cung cấp một khung giúp khách hàng dễ dàng đánh giá các dịch vụ dữ liệu
mới, sử dụng Cassandra và HBase làm ví dụ đại diện [Cooper, 2010].
Nhược điểm của các hạn chế truyền thống đối với điểm chuẩn là sự đổi mới
chủ yếu giới hạn ở kiến trúc và trình biên dịch. Cấu trúc dữ liệu tốt hơn, thuật
toán, ngôn ngữ lập trình, v.v. thường không thể được sử dụng, vì điều đó sẽ cho
kết quả sai lệch. Hệ thống có thể giành chiến thắng vì, giả sử, thuật toán, và
không phải vì phần cứng hoặc trình biên dịch.
Mặc dù những hướng dẫn này có thể hiểu được khi nền tảng của điện toán
tương đối ổn định như những năm 1990 và nửa đầu thập kỷ này, chúng không
mong muốn trong một cuộc cách mạng lập trình. Để cuộc cách mạng này thành
công, chúng ta cần khuyến khích sự đổi mới ở tất cả các cấp.
Các nhà nghiên cứu tại Đại học California tại Berkeley đã ủng hộ một cách tiếp
cận. Họ xác định 13 mẫu thiết kế mà họ tuyên bố sẽ là một phần của các ứng dụng
trong tương lai. Khung hoặc hạt nhân thực hiện các mẫu thiết kế này. Ví dụ như ma
trận thưa thớt, lưới có cấu trúc, máy trạng thái hữu hạn, giảm bản đồ và di chuyển đồ
thị. Bằng cách giữ các định nghĩa ở mức cao, họ hy vọng sẽ khuyến khích các sáng
kiến ở bất kỳ cấp độ nào của hệ thống. Do đó, hệ thống với
564 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

bộ giải ma trận thưa thớt nhanh nhất được hoan nghênh sử dụng bất kỳ cấu trúc
dữ liệu, thuật toán và ngôn ngữ lập trình nào, ngoài các kiến trúc và trình biên
dịch mới.
Mặc dù không phải chủ yếu là một chuẩn mực tính toán song song, MLPerf là
một chuẩn mực gần đây cho ML thường chạy trên các máy tính song song. Nó
bao gồm các chương trình, bộ dữ liệu và quy tắc cơ bản. Các phiên bản mới của
điểm chuẩn MLPerf xuất hiện ba tháng một lần để theo kịp những tiến bộ nhanh
chóng trong ML. Để bình thường hóa cho các máy tính có kích thước khác nhau,
MLPerf bao gồm sức mạnh để chạy các điểm chuẩn. Một tính năng điểm chuẩn
mới là cung cấp cả các bộ phận đóng và mở của điểm chuẩn. Bộ phận khép kín
có các quy tắc được kiểm soát chặt chẽ để đệ trình để cố gắng đảm bảo so sánh
công bằng giữa các hệ thống. Bộ phận mở khuyến khích sự đổi mới, bao gồm các
cấu trúc dữ liệu, thuật toán, hệ thống lập trình tốt hơn, v.v. Mở đệ trình phân chia
chỉ cần thực hiện cùng một nhiệm vụ bằng cách sử dụng cùng một bộ dữ liệu.
Chúng tôi sử dụng MLPerf để đánh giá DSA trong phần tiếp theo.

Mô hình hiệu suất


Một chủ đề liên quan đến điểm chuẩn là mô hình hiệu suất. Như chúng ta đã thấy với
sự đa dạng kiến trúc ngày càng tăng trong chương này, đa luồng, SIMD, GPU, sẽ rất
hữu ích nếu chúng ta có một mô hình đơn giản cung cấp cái nhìn sâu sắc về hiệu suất
của các kiến trúc khác nhau. Nó không cần phải hoàn hảo, chỉ cần sâu sắc.
Các 3C cho hiệu suất bộ đệm từ Chương 5 là một mô hình hiệu suất ví dụ. Nó
không phải là một mô hình hiệu suất hoàn hảo, vì nó bỏ qua các yếu tố quan trọng
tiềm tàng như kích thước khối, chính sách phân bổ khối và chính sách thay thế
khối. Hơn nữa, nó có những điều kỳ quặc. Ví dụ: bỏ lỡ có thể được quy định do
dung lượng trong một thiết kế và do bỏ lỡ xung đột trong bộ đệm khác có cùng
kích thước. Tuy nhiên, mô hình 3C đã phổ biến trong 25 năm, bởi vì nó cung cấp
cái nhìn sâu sắc về hành vi của các chương trình, giúp cả kiến trúc sư và lập trình
viên cải thiện sáng tạo của họ dựa trên những hiểu biết sâu sắc từ mô hình đó.
Để tìm một mô hình như vậy cho các máy tính song song, hãy bắt đầu với các
hạt nhân nhỏ, giống như các mô hình từ 13 mẫu thiết kế Berkeley Hình 6.16Mặc
dù có các phiên bản với các loại dữ liệu khác nhau cho các hạt nhân này, điểm
nổi là phổ biến trong một số triển khai. Do đó, hiệu suất điểm nổi cao nhất là giới
hạn về tốc độ của các hạt nhân đó trên một máy tính nhất định. Đối với chip đa
lõi, hiệu suất điểm nổi cao nhất là hiệu suất cực đại tập thể của tất cả các lõi trên
chip. Nếu có nhiều bộ vi xử lý trong hệ thống, bạn sẽ nhân đỉnh trên mỗi chip với
tổng số chip.
Các yêu cầu trên hệ thống bộ nhớ có thể được ước tính bằng cách chia hiệu
suất điểm nổi cực đại này cho số lượng hoạt động điểm nổi trung bình trên mỗi
cường độ số học Tỷ byte được truy cập :
lệ các phép toán dấu
phẩy động trong một Nổi-ĐiểmOperations / Sec =
chương trình với số Byte / giây
byte dữ liệu được truy Nổi-ĐiểmOperations / Byte
cập bởi một chương
trình từ bộ nhớ chính.
Tỷ lệ các phép toán dấu phẩy động trên mỗi byte bộ nhớ được truy cập được gọi
là cường độ số họcNó có thể được tính bằng cách lấy tổng số dấu phẩy động-.
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 565

O (1) O (log (N)) O (N)

ArithmeticIntensity
Nhạy
Quang phổ
Thô cảm
Phương pháp N-body
Ma trận (FFT) Ma trận (Chân
(SpMV) (BLAS3) Phương pháp)
Cấu trúc Cấu trúc
Lưới Lưới
(Bút chì , (Lattice
PDEs) Phương pháp)

HÌNH 6.18 Cường độ số học, được chỉ định là số lượng phép toán dấu phẩy động để chạy
chương trình chia cho số byte được truy cập trong bộ nhớ chính [Williams, Waterman và
Patterson, 2009]. Một số hạt nhân có cường độ số học có quy mô có vấn đề kích thước, chẳng hạn như
Ma trận dày đặc, nhưng có nhiều hạt nhân có cường độ số học không phụ thuộc vào kích thước vấn đề.
Đối với hạt nhân trong trường hợp trước đây, tỷ lệ yếu có thể dẫn đến kết quả khác nhau, vì nó đặt nhu cầu
ít hơn nhiều cho hệ thống bộ nhớ.

các phép toán điểm cho một chương trình chia cho tổng số byte dữ liệu được
truyền vào bộ nhớ chính trong khi thực hiện chương trình. Hình 6.18 cho thấy
cường độ số học của một số mẫu thiết kế Berkeley từ đó Hình 6.17.

Mái nhà Mô hình


Mô hình đơn giản này liên kết hiệu suất điểm nổi, cường độ số học và hiệu suất bộ
nhớ với nhau trong biểu đồ hai chiều [Williams, Waterman và Patterson, 2009]. Hiệu
suất điểm nổi cao nhất có thể được tìm thấy bằng cách sử dụng các thông số kỹ thuật
phần cứng được đề cập ở trên. Các bộ làm việc của các hạt nhân mà chúng tôi xem
xét ở đây không phù hợp với bộ nhớ trên chip, vì vậy hiệu suất bộ nhớ cực đại có thể
được xác định bởi hệ thống bộ nhớ phía sau bộ nhớ cache. Một cách để tìm hiệu suất
bộ nhớ cao nhất là điểm chuẩn Stream. (Xem Xây dựng trên trang 395 in Chương 5.)
Hình 6.19 hiển thị mô hình, được thực hiện một lần cho máy tính, không phải
cho mỗi mô hình hạt nhân. Theo chiều dọc Y-axis là hiệu suất dấu phẩy động có
thể đạt được từ 0,5 đến 64,0 GFLOP / giây. Các ngang X-axis là cường độ số học,
thay đổi từ 1/8 byte FLOP / DRAM được truy cập đến 16 byte FLOP / DRAM
được truy cập. Lưu ý rằng biểu đồ là thang đo log-log.
Đối với một kernel nhất định, chúng ta có thể tìm thấy một điểm trên X-axis
dựa trên cường độ số học của nó. Nếu chúng ta vẽ một đường thẳng đứng qua
điểm đó, hiệu suất của kernel trên máy tính đó phải nằm ở đâu đó dọc theo
đường đó. Chúng ta có thể vẽ một đường ngang cho thấy hiệu suất điểm nổi cao
nhất của máy tính. Rõ ràng, hiệu suất điểm nổi thực tế có thể không cao hơn
đường ngang, vì đó là giới hạn phần cứng.
Làm thế nào chúng ta có thể vẽ hiệu suất bộ nhớ cực đại, được đo bằng byte / giây?
Vì trục X là FLOP / byte và FLOP trục Y / giây, byte / giây chỉ là một đường chéo
trong hình này. Do đó, chúng ta có thể vẽ một dòng thứ ba mang lại hiệu suất dấu
phẩy động tối đa mà hệ thống bộ nhớ của máy tính đó
566 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

64.0

32.0

hiệu suất điểm nổi cao nhất


16.0

GFLOP / giây
8,0

4.0
Có thể đạt
được Hạt nhân Hạt nhân
2.0 1 2
(Ký ức (Tính toán
Băng
1.0 thông hạn chế)
hạn chế)
0,5
1 /số
1/4 1/2
8 1 2 4 số 8 16
Cường độ số học: Tỷ lệ FLOP / Byte

Mô hình mái nhà hình ảnh 6.19 [Williams, Waterman và Patterson, 2009]. Ví dụ này có hiệu
suất điểm nổi cao nhất là 16 GFLOPS / giây và băng thông bộ nhớ cực đại 16 GB / giây từ điểm chuẩn
Stream. (Vì Stream thực sự là bốn phép đo, nên dòng này là trung bình của bốn phép đo.) Đường thẳng
đứng chấm màu ở bên trái đại diện cho Hạt nhân 1, có cường độ số học là 0,5 FLOP / byte. Nó bị giới hạn
bởi băng thông bộ nhớ không quá 8 GFLOPS / giây trên Opteron X2 này. Đường thẳng đứng chấm bên
phải đại diện cho Hạt nhân 2, có cường độ số học là 4 FLOP / byte. Nó chỉ giới hạn tính toán đến 16
GFLOPS / s. Những dữ liệu này dựa trên AMD Opteron X2 (Revision F) sử dụng lõi kép chạy ở tốc độ 2
GHz trong hệ thống ổ cắm kép.

có thể hỗ trợ cho một cường độ số học nhất định. Chúng ta có thể biểu thị các
giới hạn dưới dạng công thức để vẽ đường trong biểu đồ Hình 6.19:

GFLOP có thể đạt được / giây = Tối thiểu (Bộ nhớ cực đại BW × Cường độ số
học, Đỉnh
Hiệu suất điểm nổi)
Các đường ngang và đường chéo cho mô hình đơn giản này tên của nó và cho
biết giá trị của nó. Đường dây trên đường sắt đặt giới hạn trên về hiệu suất của
hạt nhân tùy thuộc vào cường độ số học của nó. Với một mái nhà của một máy
tính, bạn có thể áp dụng nó nhiều lần, vì nó không thay đổi theo hạt nhân.
Nếu chúng ta nghĩ về cường độ số học như một cây sào chạm vào mái nhà, thì
nó chạm vào phần nghiêng của mái nhà, điều đó có nghĩa là hiệu suất cuối cùng
bị giới hạn bởi băng thông bộ nhớ, hoặc nó chạm vào phần phẳng của mái nhà,
có nghĩa là hiệu suất bị hạn chế tính toán . Trong Hình 6.19, kernel 1 là một ví dụ
về cái trước và kernel 2 là một ví dụ về cái sau.
Lưu ý rằng điểm cầu nối, nơi mà các mái chéo và ngang gặp nhau, cung cấp một
cái nhìn sâu sắc thú vị về máy tính. Nếu nó ở bên phải, thì chỉ những hạt nhân có
cường độ số học rất cao mới có thể đạt được hiệu suất tối đa
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 567

cái máy tính đó. Nếu nó ở xa bên trái, thì hầu như bất kỳ kernel nào cũng có khả
năng đạt hiệu suất tối đa.

So sánh hai thế hệ của Opterons


AMD Opteron X4 (Barcelona) với bốn lõi là sự kế thừa của Opteron X2 với hai lõi.
Để đơn giản hóa thiết kế bảng, họ sử dụng cùng một ổ cắm. Do đó, chúng có cùng
các kênh DRAM và do đó có cùng băng thông bộ nhớ cực đại. Ngoài việc nhân đôi
số lượng lõi, Opteron X4 còn có hiệu suất điểm nổi cao gấp đôi trên mỗi lõi: Lõi
Opteron X4 có thể phát hành hai hướng dẫn SSE2 dấu phẩy động trên mỗi chu kỳ
đồng hồ, trong khi lõi Opteron X2 phát hành nhiều nhất. Khi hai hệ thống mà chúng
tôi so sánh có tốc độ xung nhịp tương tự nhau 2,2 GHz cho Opteron X2 so với 2,3
GHz cho Opteron X4, Opteron X4 có hiệu suất điểm nổi cao nhất gấp bốn lần
Opteron X2 với cùng băng thông DRAM. Opteron X4 cũng có bộ đệm 2MiB L3,
không tìm thấy trong Opteron X2.
Trong Hình 6.20 các mô hình mái cho cả hai hệ thống được so sánh. Như
chúng ta mong đợi, điểm sườn núi di chuyển sang phải, từ 1 trong Opteron X2
đến 5 trong Opteron X4. Do đó, để thấy mức tăng hiệu suất trong thế hệ tiếp theo,
hạt nhân cần cường độ số học cao hơn 1 hoặc bộ làm việc của chúng phải phù
hợp với bộ đệm của Opteron X4.
Các mô hình mái nhà cho một giới hạn trên cho hiệu suất. Giả sử chương trình
của bạn thấp hơn nhiều so với ràng buộc đó. Những tối ưu hóa nào bạn nên thực
hiện, và theo thứ tự nào?
Để giảm các nút thắt tính toán, hai tối ưu hóa sau đây có thể giúp hầu hết mọi
kernel :

128.0 Opteron X4 (Barcelona)

64.0

32.0
GFLOP có thể đạt

16.0

8,0
được / s

4.0 Opteron X2
2.0

1.0
0,5
1/số 1/41/2 1 2 4 số 8 16
8
Tỷ lệ FLOPbyte thực tế

HÌNH 6.20 Mô hình mái của hai thế hệ Opteron. Mái nhà Opteron X2, mà giống như trong Hình
6.19, có màu đen và đường viền mái Opteron X4 có màu. Điểm sườn núi lớn hơn của Opteron X4 có nghĩa
là các hạt nhân bị ràng buộc tính toán trên Opteron X2 có thể là hiệu suất bộ nhớ bị ràng buộc trên Opteron
X4.
568 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

1. Hoạt động điểm nổi trộnHiệu suất điểm nổi cao nhất cho máy tính. thường yêu
cầu một số lượng bằng nhau của các phép cộng và phép nhân gần như đồng
thời. Sự cân bằng đó là cần thiết vì máy tính hỗ trợ hướng dẫn nhân cộng hợp
nhất (xem Xây dựng trên trang 231 in Chương 3) hoặc do đơn vị điểm nổi có
số lượng người thêm điểm nổi và số nhân dấu phẩy động bằng nhau. Hiệu suất
tốt nhất cũng yêu cầu một phần đáng kể của hỗn hợp hướng dẫn là nổi-
điểm hoạt động và không hướng dẫn số nguyên.
2. Cải thiện song song cấp độ hướng dẫn và áp dụng SIMD Đối với các kiến
trúc sư hiện đại, hiệu suất cao nhất đến khi tìm nạp, thực hiện và thực hiện ba
đến bốn hướng dẫn cho mỗi chu kỳ đồng hồ (xem. Mục 4.11). Mục tiêu của
bước này là cải thiện mã từ trình biên dịch để tăng ILP. Một cách là bằng cách
bỏ các vòng lặp, như chúng ta đã thấy Mục 4.14Đối với các kiến trúc x86, một
lệnh AVX duy nhất có thể hoạt động trên tám toán hạng chính xác kép, vì vậy
chúng nên được sử dụng bất cứ khi nào có thể (xem Phần 3.7 và 3.8).
Để giảm tắc nghẽn bộ nhớ, hai tối ưu hóa sau có thể giúp :
1. Phần mềm đúc sẵnThông thường hiệu suất cao nhất đòi hỏi phải giữ nhiều.
hoạt động bộ nhớ trong chuyến bay, dễ thực hiện hơn bằng cách thực hiệndự
đoán truy cập thông qua các hướng dẫn tìm nạp phần mềm thay vì chờ cho
đến khi dữ liệu
được yêu cầu bởi tính toán.
2. Mối quan hệ trí nhớBộ vi xử lý ngày nay bao gồm một bộ điều khiển bộ
nhớ trên. cùng một chip với bộ vi xử lý, giúp cải thiện hiệu suất của hệ
thống phân cấp bộ nhớNếu hệ thống có nhiều chip, điều này có nghĩa là
một số. các địa chỉ đi đến DRAM cục bộ với một chip và phần còn lại yêu
cầu quyền truy cập qua kết nối chip để truy cập DRAM cục bộ
một con chip khác. Sự phân chia này dẫn đến việc truy cập bộ nhớ không
đồng nhất, mà chúng tôi đã mô tả trong Mục 6.5Truy cập bộ nhớ thông qua
một chip khác làm giảm hiệu suất. Tối ưu hóa thứ hai này cố gắng phân bổ
dữ liệu và các luồng được giao nhiệm vụ vận hành trên dữ liệu đó cho cùng
một cặp bộ xử lý bộ nhớ, do đó bộ xử lý hiếm khi phải truy cập vào bộ nhớ
của các chip khác.
Mô hình mái nhà có thể giúp quyết định loại nào trong hai tối ưu hóa này sẽ
thực hiện và thứ tự thực hiện chúng. Chúng ta có thể nghĩ về mỗi tối ưu hóa này
như một trần trần trần bên dưới đường mái phù hợp, có nghĩa là bạn không thể
vượt qua trần nhà mà không thực hiện tối ưu hóa liên quan.
Đường viền mái tính toán có thể được tìm thấy từ các hướng dẫn và đường
viền bộ nhớ có thể được tìm thấy từ việc chạy chuẩn Stream. Trần tính toán,
chẳng hạn như cân bằng điểm nổi, cũng có thể đến từ hướng dẫn sử dụng cho
máy tính đó. Một trần bộ nhớ, chẳng hạn như ái lực bộ nhớ, yêu cầu chạy thử
nghiệm trên mỗi máy tính để xác định khoảng cách giữa chúng. Tin tốt là quá
trình này chỉ cần được thực hiện một lần trên mỗi máy tính, vì một khi ai đó mô
tả trần nhà máy tính, mọi người đều có thể sử dụng kết quả để ưu tiên tối ưu hóa
cho máy tính đó.
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 569

Hình 6.21 thêm trần vào mô hình mái nhà trong Hình 6.19, hiển thị trần tính
toán trong biểu đồ trên cùng và trần băng thông bộ nhớ trên biểu đồ dưới cùng.
Mặc dù trần nhà cao hơn không được dán nhãn với cả hai tối ưu hóa, chúng được
ngụ ý trong hình này; để vượt qua trần cao nhất, bạn cần phải vượt qua tất cả
những cái dưới đây.
Chiều rộng của khoảng cách giữa trần nhà và giới hạn cao hơn tiếp theo là
phần thưởng cho việc thử tối ưu hóa đó. Như thế, Hình 6.21 gợi ý rằng tối ưu hóa
2, cải thiện ILP, có lợi ích lớn trong việc cải thiện tính toán trên máy tính đó và
tối ưu hóa 4, giúp cải thiện ái lực bộ nhớ, có lợi ích lớn trong việc cải thiện băng
thông bộ nhớ trên máy tính đó.
Hình 6.22 kết hợp trần nhà của Hình 6.21 thành một biểu đồ duy nhất. Các
cường độ số học của hạt nhân xác định vùng tối ưu hóa, từ đó gợi ý nên thử tối
ưu hóa nào. Lưu ý rằng các tối ưu hóa tính toán và tối ưu hóa băng thông bộ nhớ
chồng chéo cho phần lớn cường độ số học. Ba vùng được tô bóng khác nhau
trong Hình 6.22 để chỉ ra các chiến lược tối ưu hóa khác nhau. Ví dụ, kernel 2 rơi
vào hình thang màu xanh ở bên phải, điều này cho thấy chỉ hoạt động trên các tối
ưu hóa tính toán. Hạt nhân 1 rơi vào hình bình hành màu xanh xám ở giữa, điều
này cho thấy thử cả hai loại tối ưu hóa. Hơn nữa, nó gợi ý bắt đầu với tối ưu hóa
2 và 4. Lưu ý rằng các đường thẳng đứng của kernel 1 nằm dưới mức tối ưu hóa
mất cân bằng dấu phẩy động, do đó tối ưu hóa 1 có thể không cần thiết. Nếu một
hạt nhân rơi vào hình tam giác màu xám ở phía dưới bên trái, nó sẽ đề nghị chỉ
thử tối ưu hóa bộ nhớ.
Cho đến nay, chúng tôi đã giả định rằng cường độ số học là cố định, nhưng đó
không thực sự là trường hợp. Đầu tiên, có các hạt nhân nơi cường độ số học tăng theo
kích thước vấn đề, chẳng hạn như đối với các vấn đề về Ma trận dày đặc và N-body
(xem Hình 6.18). Thật vậy, đây có thể là một lý do mà các lập trình viên có nhiều
thành công hơn với yếu mở rộng hơn với quy mô mạnh mẽ. Thứ hai, hiệu quả của hệ
thống phân cấp bộ nhớ ảnh hưởng đến số lượng truy cập vào bộ nhớ, do đó tối ưu
hóa cải thiện hiệu suất bộ đệm cũng cải thiện cường độ số học. Một ví dụ là cải thiện
địa phương tạm thời bằng cách hủy các vòng lặp và sau đó nhóm các câu lệnh với các
địa chỉ tương tự. Nhiều máy tính có hướng dẫn bộ nhớ cache đặc biệt phân bổ dữ liệu
trong bộ đệm nhưng trước tiên không điền dữ liệu từ bộ nhớ tại địa chỉ đó, vì nó sẽ
sớm được ghi lại. Cả hai tối ưu hóa này đều làm giảm lưu lượng bộ nhớ, do đó di
chuyển cực cường độ số học sang phải theo hệ số, giả sử, 1.5. Quyền thay đổi này có
thể đặt kernel trong một khu vực tối ưu hóa khác.
Mặc dù các ví dụ trên cho thấy cách giúp các lập trình viên cải thiện hiệu suất, các
kiến trúc sư cũng có thể sử dụng mô hình để quyết định nơi họ nên tối ưu hóa phần
cứng để cải thiện hiệu suất của các hạt nhân mà họ nghĩ sẽ quan trọng.
Phần tiếp theo bao gồm mô hình mái nhà để so sánh sự khác biệt về hiệu suất
giữa DSA và GPU và để xem liệu những khác biệt này có phản ánh hiệu suất của
các chương trình thực hay không.

Xây dựng: Các trần nhà được đặt hàng để trần nhà thấp hơn dễ dàng tối ưu hóa hơn.
Rõ ràng, một lập trình viên có thể tối ưu hóa theo bất kỳ thứ tự nào, nhưng theo trình tự này làm giảm
570 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

AMD Opteron

64.0

32.0

hiệu suất điểm nổi cao nhất

GFLOP / giây
16.0
(dòng)
1. Fl. Pt. mất cân bằng
8,0 BW

Có thể đạt 4.0 ký ức


được 2. Không có ILP hoặc
đỉnh
SIMD
2.0

1.0

0,5
1/ 1/ 1/ 1 2 4 số 8 16
số 8 4 2
Cường độ số học: Tỷ lệ FLOP / Byte

AMD Opteron

64.0

32.0

hiệu suất điểm nổi cao nhất


GFLOP / giây

16.0
g
(dòng)

8,0 BW

prefetchin Mối
Có thể đạt

4.0 ký ứcSW quan hệ


được

đỉnh w / ra
.

2.0 3 Ký ức

w / ra
.

4
1.0

1
0,5 /số
1/ 1
8 4 /2 1 2 4 số 8 16
Cường độ số học: Tỷ lệ FLOP / Byte

Mô hình mái 6.21 với trần nhà. Biểu đồ trên cùng cho thấy trần trần tính toán của trần nhà 8 GFLOP /
giây nếu hỗn hợp hoạt động điểm nổi bị mất cân bằng và 2 GFLOP / giây nếu các tối ưu hóa để tăng ILP
và SIMD cũng bị thiếu. Biểu đồ dưới cùng hiển thị trần băng thông bộ nhớ 11 GB / giây mà không cần cài
đặt trước phần mềm và 4,8 GB / giây nếu tối ưu hóa ái lực bộ nhớ cũng bị thiếu.
6.11 Điểm chuẩn đa bộ xử lý và mô hình hiệu suất 571

64.0

32.0
hiệu suất điểm nổi cao nhất
16.0
GFLOP / giây

(dòng)
1. Fl. Pt. mất cân
bằng
8,0 BW
tiền chế
Mối
4.0 ký ứcSW quan hệ
Có thể đạt

đỉnh w / ra 2. Không có ILP hoặc


SIMD
.

Ký ức
được

2.0 3

w / ra
.

4
Hạt nhân
1.0 Hạt nhân 1 2

0,5 1/số
1/ 1/
8 4 2 1 2 4 số 8 16
Cường độ số học: Tỷ lệ FLOP / Byte

Mô hình mái 6.22 hình với trần nhà, các khu vực chồng chéo được tô bóng và hai hạt
nhân từ đó Hình 6.19.Hạt nhân có cường độ số học hạ cánh trong hình thang màu xanh bên phải nên tập
trung về tối ưu hóa tính toán và các hạt nhân có cường độ số học nằm trong tam giác xám ở phía dưới bên
trái nên tập trung vào tối ưu hóa băng thông bộ nhớ. Những người hạ cánh trong hình bình hành màu xanh
xám ở giữa cần phải lo lắng về cả hai. Khi Kernel 1 rơi vào hình bình hành ở giữa, hãy thử tối ưu hóa ILP
và SIMD, ái lực bộ nhớ và tìm nạp phần mềm. Hạt nhân 2 rơi vào hình thang bên phải, vì vậy hãy thử tối
ưu hóa ILP và SIMD và cân bằng các hoạt động của điểm nổi.

cơ hội lãng phí nỗ lực vào một tối ưu hóa không có lợi ích do các ràng buộc khác.
Giống như mô hình 3Cs, miễn là mô hình mái nhà cung cấp những hiểu biết sâu sắc,
một mô hình có thể có những giả định có thể chứng minh sự lạc quan. Ví dụ, đường
viền mái giả định tải được cân bằng giữa tất cả các bộ xử lý.

Xây dựng: Một thay thế cho tiêu chuẩn Stream là sử dụng DRAM thô băng thông
như mái nhà. Mặc dù băng thông thô chắc chắn là giới hạn trên cứng, nhưng hiệu
suất bộ nhớ thực tế thường cách xa ranh giới đó đến nỗi nó không hữu ích. Đó là,
không có chương trình có thể đi gần đến ràng buộc đó. Nhược điểm của việc sử dụng
Stream là lập trình rất cẩn thận có thể vượt quá kết quả Stream, do đó, đường viền bộ
nhớ có thể không giới hạn cứng như đường viền mái tính toán. Chúng tôi gắn bó với
Stream vì rất ít lập trình viên có thể cung cấp nhiều băng thông bộ nhớ hơn so với
phát hiện của Stream.

Xây dựng: Mặc dù mô hình mái nhà được hiển thị là dành cho bộ xử lý đa lõi,
nhưng rõ ràng cũng sẽ làm việc cho một bộ xử lý.

Đúng hay sai: Hạn chế chính với các cách tiếp cận thông thường đối với điểm chuẩn Kiểm tra
đối với máy tính song song là các quy tắc đảm bảo sự công bằng cũng làm chậm phần mềm Bản thân
bạn
sự đổi mới.
572 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Real Stuff: Điểm chuẩn của Google


6.12 Siêu máy tính TPUv3 và NVIDIA
Cụm GPU Volta

DNN, giới thiệu trong Mục 6.7, có hai giai đoạn : đào tạo, mà xây dựng chính xác mô
hình, và suy luận, phục vụ những mô hình đó. Đào tạo có thể mất vài ngày hoặc vài tuần
để tính toán, trong khi suy luận thường chạy trong một phần nghìn giây. TPUv1 được thiết
kế để suy luận. Phần này khám phá cách Google xây dựng DSA sản xuất cho vấn đề đào
tạo khó hơn nhiều. Nó dựa trên bài báo Một siêu máy tính đặc trưng cho miền để đào tạo
Mạng thần kinh sâu, trực tiếp Truyền thông của ACM, 2020 bởi N. P. Jouppi, D. Yoon, G.
Kurian, S. Li, N. Patil, J. Laudon, C. Young và D. A. Patterson.

Đào tạo mạng lưới thần kinh sâu so với suy luận
Hãy để chúng tôi nhanh chóng xem xét DNN. Đào tạo bắt đầu với một bộ dữ liệu
đào tạo lớn được biết đến là chính xác (đầu vào, kết quả) cặp. Cặp có thể là một
hình ảnh và những gì nó mô tả. Nó cũng bắt đầu với một mạng lưới thần kinh mô
hình, trong đó chuyển đổi đầu vào thành kết quả thông qua một tính toán chuyên
sâu trọng lượng; các trọng số là ngẫu nhiên ban đầu. Các mô hình thường được
định nghĩa là một biểu đồ của các lớp, trong đó một lớp chứa một phần đại số
tuyến tính (thường là phép nhân ma trận hoặc tích chập bằng các trọng số) theo
sau là một phi tuyến chức năng kích hoạt (thường là hàm vô hướng, được áp
dụng theo nguyên tố; chúng tôi gọi kết quả kích hoạt). Đào tạo giáo dục học tập
trọng lượng nâng cao khả năng ánh xạ chính xác từ đầu vào đến kết quả.
Làm thế nào để chúng ta có được từ trọng lượng ban đầu ngẫu nhiên đến trọng
lượng được đào tạo? Thực hành tốt nhất hiện nay sử dụng các biến thể của dốc độ
dốc stochastic (SGD). SGD bao gồm nhiều lần lặp gồm ba bước: truyền tiến, truyền
ngược và cập nhật trọng lượng.
1. Tiến lên lấy một ví dụ đào tạo được chọn ngẫu nhiên, áp dụng nó đầu vào cho mô
hình và chạy phép tính qua các lớp để tạo ra kết quả (với trọng lượng ban đầu ngẫu
nhiên, là rác lần đầu tiên). Truyền tiếp về phía trước có chức năng tương tự như
suy luận DNN và nếu chúng ta đang xây dựng một máy gia tốc suy luận, chúng ta
có thể dừng lại ở đó. Đối với đào tạo, đây là ít hơn một phần ba câu chuyện. SGD
tiếp theo đo lường sự khác biệt hoặc lỗi giữa kết quả mô hình và kết quả tốt đã biết
từ tập huấn sử dụng a mất chức năng.
2. Sau đó ủng hộ chạy mô hình theo chiều ngược lại, từng lớp, để tạo ra một
tập hợp các giá trị lỗi / mất cho mỗi đầu ra lớp. Những tổn thất này đo độ
lệch so với đầu ra mong muốn.
3. Cuối cùng, cập nhật trọng lượng kết hợp đầu vào của mỗi lớp với giá trị
tổn thất để tính toán một tập hợp các thay đổi deltas với trọng số mà khi
thêm vào các trọng số sẽ dẫn đến tổn thất gần như bằng không. Cập nhật
có thể có cường độ nhỏ.
Mỗi bước SGD thực hiện một điều chỉnh nhỏ cho các trọng số cải thiện mô
hình đối với một trọng số (đầu vào, kết quả) cặp. SGD dần biến đổi
6.12 Công cụ thực: Đánh dấu siêu máy tính Google TPUv3 và Cụm GPU NVIDIA Volta 573

trọng lượng ban đầu ngẫu nhiên vào một mô hình được đào tạo, đôi khi có khả
năng chính xác siêu phàm, dẫn đến các bài báo trên báo.

Mạng siêu máy tính kiến trúc đặc trưng miền


Sự thèm ăn tính toán đào tạo DNN về cơ bản là không giới hạn; do đó, Google đã
chọn xây dựng một siêu máy tính DSA thay vì phân cụm các máy chủ CPU với chip
DSA như đã được thực hiện cho TPUv1. Lý do đầu tiên cho điều này là thời gian đào
tạo là rất lớn. Một chip TPUv3 sẽ mất tháng để đào tạo một ứng dụng sản xuất
Google duy nhất, vì vậy một ứng dụng điển hình có thể muốn sử dụng hàng trăm chip.
Thứ hai, trí tuệ DNN là các bộ dữ liệu lớn hơn cộng với các máy lớn hơn dẫn đến
những đột phá lớn hơn.
Đặc điểm kiến trúc quan trọng của một siêu máy tính hiện đại là cách các chip của
nó giao tiếp: tốc độ của một liên kết là gì; cấu trúc liên kết kết nối là gì; nó có tập
trung so với các công tắc phân tán; và như thế. Sự lựa chọn này dễ dàng hơn nhiều đối
với siêu máy tính DSA, vì các mẫu giao tiếp bị hạn chế và được biết đến. Đối với đào
tạo, hầu hết lưu lượng truy cập là một bản cập nhật giảm cân từ tất cả các nút của máy.
Hóa ra tất cả các phần giảm có thể được ánh xạ hiệu quả lên cấu trúc liên kết hình
xuyến 2D (xem Hình 6.14a). Một công tắc trên chip định tuyến tin nhắn. Để bật hình
xuyến 2D, chip TPUv3 có bốn tùy chỉnh Kết nối liên lõi (ICI) liên kết, mỗi liên kết
chạy ở 656 Gbit / s theo mỗi hướng. ICI cho phép kết nối trực tiếp giữa các chip để
tạo thành siêu máy tính chỉ bằng một phần nhỏ của mỗi chip.
Siêu máy tính TPUv3 sử dụng hình xuyến 32 x 32 (1024 chip), là 64 liên kết x
656 Gbit / s = 42.3 terabit / s băng thông lưỡng phân. Để so sánh, một công tắc
InfiniBand riêng biệt (được sử dụng trong các cụm CPU) đã kết nối 64 máy chủ
(mỗi máy có 16 chip DSA) có 64 cổng sử dụng các liên kết chỉ có 100 Gbit / s và
băng thông lưỡng phân nhiều nhất là 6,4 Terabit / s. Siêu máy tính TPUv3 cung
cấp băng thông lưỡng phân 6,6 lần so với các công tắc cụm thông thường trong
khi bỏ qua các chi phí của thẻ mạng InfiniBand và công tắc InfiniBand, cũng như
sự chậm trễ trong giao tiếp của các cụm CPU.

Kiến trúc đặc trưng miền Siêu máy tính Node


Nút của siêu máy tính TPUv3 tuân theo các ý tưởng chính của TPUv1: một MXU
hai chiều lớn cộng với các bộ nhớ trên chip lớn, được điều khiển bằng phần mềm
thay vì bộ nhớ cache. Không giống như TPUv1, TPUv3 sử dụng hai lõi trên mỗi
chip. Dây toàn cầu trên chip không mở rộng quy mô với kích thước tính năng thu
hẹp, do đó độ trễ tương đối của chúng tăng lên. Cho rằng đào tạo có thể sử dụng
nhiều bộ xử lý, hai nhỏ hơn Kiểm duyệt mỗi chip ngăn chặn độ trễ quá mức của
một lõi chip lớn duy nhất. Google dừng lại ở hai vì việc tạo ra các chương trình
cho hai lõi trên một con chip dễ dàng hơn so với nhiều lõi của Wimpy.
Hình 6.23 hiển thị sáu khối chính của TensorCore :
1. ICI, được giải thích ở trên.
2. Bộ nhớ băng thông cao (HBM). TPUv1 bị ràng buộc bộ nhớ trong hầu hết các
ứng dụng [Jouppi, 2018]. Google đã giải quyết nút thắt bộ nhớ của TPUv1
bằng cách sử dụng HBM DRAM. Nó cung cấp băng thông gấp 25 lần DRU
TPUv1 bằng cách sử dụng chất nền xen kẽ kết nối chip TPUv3 qua sáu mươi
bốn
574 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Kiểm duyệt
Trình tự lõi

Ma trận nhân
Máy (MXU)
HBM Kết nối
chủ lưu Vector
Ký ức Bộ định tuyến
trữ Đơn vị Ma trận nhân
(8/16 GiB) (ICI)
Hàng (VPU) (MXU)
đợi
Chuyển vị
(hơn
Đơn vị cấp phép
PCle)

HÌNH 6.23 Sơ đồ khối của TensorCore TPUv3.

Xe buýt 64 bit đến bốn ngăn xếp ngắn của chip DRAM. Các máy chủ CPU
thông thường hỗ trợ nhiều chip DRAM hơn nhưng ở băng thông thấp hơn
nhiều so với tối đa tám xe buýt 64 bit.
3. Các trình tự lõi thực hiện VLIW hướng dẫn từ lõi trên chip, bộ nhớ lệnh
được quản lý phần mềm (Imem), thực hiện các thao tác vô hướng bằng bộ
nhớ dữ liệu vô hướng 4K 32 bit (Smem) và 32 thanh ghi vô hướng 32 bit
(Sregs) và chuyển tiếp hướng dẫn vector đến đơn vị xử lý vector (VPU).
Hướng dẫn VLIW 322 bit có thể khởi chạy tám thao tác: hai ALU vô
hướng, hai ALU vector, tải và lưu trữ vector và một cặp khe cắm dữ liệu
đến và từ các đơn vị nhân và hoán vị ma trận.
4. VPU thực hiện các thao tác vectơ bằng bộ nhớ vectơ trên chip lớn (Vmem) với
các phần tử 32K 128 x 32 bit (16 MiB) và 32 thanh ghi vector 2D (Vregs) mà
mỗi thanh chứa các phần tử 32 x 8 (4 KiB). VPU thu thập và phân phối dữ liệu
cho Vmem thông qua cấp độ dữ liệu (đơn vị chức năng ma trận 2D và vectơ)
và song song cấp độ lệnh (8 thao tác trên mỗi lệnh).
5. MXU sản xuất các sản phẩm FP 32 bit từ các đầu vào FP 16 bit tích lũy
trong 32 bit. Tất cả các tính toán khác đều nằm trong FP 32 bit ngoại trừ
kết quả sẽ trực tiếp đến đầu vào MXU, được chuyển đổi thành FP 16 bit.
TPUv3 có hai MXU trên mỗi TensorCore.
6. Đơn vị hoán vị giảm chuyển vị thực hiện chuyển đổi ma trận 128x128,
giảm và hoán vị của các làn VPU.
Hình 6.24 hiển thị siêu máy tính TPUv3 và bảng nút TPUv3 và Hình 6.25 liệt
kê các đặc điểm kỹ thuật của GPU TPUv1, TPUv3 và NVIDIA Volta chúng tôi
sẽ sử dụng để so sánh. Hình 6.26 cho thấy các mái nhà, khá giống nhau. Băng
thông bộ nhớ là như nhau (900 Gbyte / giây), đường viền nổi 16 bit gần như
không thể phân biệt được với TPUv3 và Volta (123 so với 125 TeraFLOPS / giây)
và có một sự khác biệt nhỏ về điểm nổi 32 bit ( 14 so với 16 TeraFLOPS / giây).
Lưu ý sự khác biệt hiệu suất lớn giữa số học dấu phẩy động 16 bit và 32 bit cho
cả hai chip.
6.12 Công cụ thực: Đánh dấu siêu máy tính Google TPUv3 và Cụm GPU NVIDIA Volta 575

HÌNH 6.24 Một siêu máy tính TPUv3 bao gồm tối đa 1024 chip (trái). Nó cao khoảng 6 feet và dài 40 feet. Một hội đồng TPUv3 (phải)
có bốn chip và sử dụng làm mát bằng chất lỏng.

Đặc điểm TPUv1 TPUv3 Volta


Đỉnh TeraFLOPS / Chip 92 (8b int) 123 (16b), 14 (32b) 125 (16b), 16 (32b)
Liên kết mạng x Gbits / s / Chip -- 4 x 656 6 x 200
Chip tối đa / siêu máy tính -- 1024 Khác nhau
Tốc độ đồng hồ ( MHz) 700 940 1530
TDP (Watts) / Chip 75 450 450
Kích thước chết (mm2) <331 <648 815
Công nghệ chip 28nm > 12nm 12nm
Kích thước bộ nhớ (trên / ngoài
chip) 28 MiB / 8 GiB 37 MiB / 32 GiB 36 MiB / 32 GiB
Bộ nhớ GB / s / Chip 34 900 900
MXU / Core, Kích thước MXU 1 256 x 256 2 128 x 128 84x4
Lõi / Chip 1 2 80
Chip / Máy chủ CPU 4 số 8 8 hoặc 16

HÌNH 6.25 Các tính năng xử lý chính của GPU TPUv1, TPUv3 và NVIDIA Volta .

Số học kiến trúc cụ thể miền


Hiệu suất cực đại cao hơn 8 lần khi sử dụng điểm nổi 16 bit thay vì điểm nổi 32
bit để nhân ma trận (xem Hình 6.23), vì vậy điều quan trọng là sử dụng 16 bit để
có được hiệu suất cao nhất. Mặc dù Google có thể đã xây dựng một MXU bằng
cách sử dụng các định dạng dấu phẩy động tiêu chuẩn một nửa (fp16) và đơn
(fp32) (xem Hình 3.27 in Chương 3), trước tiên họ đã kiểm tra độ chính xác của
các thao tác dấu phẩy động 16 bit cho DNN, với một số phát hiện cụ thể :
■ Đầu ra nhân ma trận và tổng nội bộ phải duy trì trong fp32.
■ Số mũ 5 bit của đầu vào nhân ma trận fp16 dẫn đến sự thất bại của các
phép tính ngoài phạm vi hẹp của nó, mà số mũ 8 bit của fp32 tránh được.
■ Việc giảm kích thước mantissa đầu vào nhân ma trận từ fp32 23 bit xuống
còn 7 bit không làm tổn hại đến độ chính xác.
576 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

100

TeraFLOOPS / giây
10

GPU Volta 16b


TPUv3 16b
GPU Volta 32b
TPUv3 32b
1
1 10 100 1.000
Cường độ số học

HÌNH 6.26 Mái nhà của TPUv3 và Volta.

Kết quả Định dạng não nổi (bf16) giữ số mũ 8 bit giống với fp32 nhưng cắt
mantissa thành 7 bit. Với cùng kích thước số mũ, không có nguy cơ mất các giá
trị cập nhật nhỏ do dòng chảy dấu phẩy động của số mũ nhỏ hơn, vì vậy tất cả
các chương trình trong phần này đã sử dụng bf16 trên TPUv3 mà không gặp
nhiều khó khăn. Tuy nhiên, fp16 yêu cầu điều chỉnh phần mềm đào tạo để mang
lại sự hội tụ và hiệu quả. Micikevicius et al. đã sử dụng mất tỷ lệ trên GPU, bảo
tồn hiệu ứng từ độ dốc nhỏ bằng cách giảm tổn thất để phù hợp với số mũ nhỏ
hơn của fp16 [Micikevicius, 2017; Kalamkar, 2019].
Là kích thước của một thang số nhân FP với bình phương của thần chú chiều
rộng, hệ số nhân bf16 bằng một nửa kích thước và năng lượng của hệ số nhân
fp16. Bf16 mang đến một sự kết hợp hiếm có: giảm phần cứng và năng lượng
trong khi đơn giản hóa phần mềm bằng cách làm cho việc mở rộng tổn thất là
không cần thiết.

Kiến trúc đặc trưng tên miền TPUv3 so với GPU Volta
Chúng ta hãy so sánh kiến trúc GPU TPUv3 và Volta trước khi chúng ta so sánh hiệu
suất. Song song đa kênh được tích hợp vào TPUv3 thông qua ICI và được hỗ trợ
thông qua các hoạt động giảm tất cả được hỗ trợ bởi trình biên dịch TPUv3. Các hệ
thống GPU đa kênh có kích thước tương tự sử dụng cách tiếp cận mạng theo cấp bậc
với NVIDIA NVLink bên trong khung gầm và các mạng InfiniBand do máy chủ điều
khiển và chuyển sang buộc nhiều
khung gầm với nhau.
TPUv3 cung cấp số học dấu phẩy động não 16 bit được thiết kế cho các DNN bên
trong các mảng 128x128 giúp giảm một nửa số nhân phần cứng và năng lượng so với
số nhân của IEEE fp16. Các GPU Volta cũng đã bao trùm các mảng, với độ chi tiết
tốt hơn 4x4 hoặc 16x16 tùy thuộc vào mô tả phần cứng hoặc phần mềm, trong khi sử
dụng fp16 thay vì bf16, vì vậy chúng có thể yêu cầu phần mềm thực hiện tỷ lệ tổn
thất cộng với diện tích chết và năng lượng.
6.12 Công cụ thực: Đánh dấu siêu máy tính Google TPUv3 và Cụm GPU NVIDIA Volta 577

Kích thước Điều chỉnh kích


chết thước chết TDP (kw) Giá mây
Volta 815 815 12.0 $ 3,24
TPUv3 <685 <438 9.3 $ 2,00

HÌNH 6.27 So sánh điều chỉnh GPU và TPUv3. Kích thước chết được điều chỉnh bởi hình vuông
của công nghệ, vì công nghệ bán dẫn cho TPU tương tự nhưng lớn hơn và cũ hơn so với GPU. Google đã
chọn 15nm cho TPU dựa trên thông tin trong Hình 6.25Công suất thiết kế nhiệt (TDP) dành cho các hệ
thống 16 chip.

TPUv3 là một máy lõi kép, theo thứ tự, trong đó trình biên dịch chồng chéo
các hoạt động tính toán, bộ nhớ và mạng. GPU Volta là các máy 80 lõi chịu độ
trễ, trong đó mỗi lõi có nhiều luồng và do đó các tệp đăng ký rất lớn (20 MiB).
Phần cứng luồng cộng với các quy ước mã hóa CUDA hỗ trợ các hoạt động
chồng chéo.
TPUv3 sử dụng bộ nhớ cào 32 MiB được điều khiển bằng phần mềm mà trình
biên dịch lên lịch, trong khi phần cứng Volta quản lý bộ đệm 6 MiB và phần
mềm quản lý bộ nhớ cào 7.5 MiB. Trình biên dịch TPUv3 chỉ đạo truy cập
DRAM tuần tự điển hình của DNN thông qua bộ điều khiển truy cập bộ nhớ trực
tiếp trên TPUv3, trong khi GPU sử dụng đa luồng cộng với phần cứng kết hợp
cho chúng.
Ngoài các lựa chọn kiến trúc tương phản, chip TPU và GPU sử dụng các công
nghệ khác nhau, khu vực chết, tốc độ đồng hồ và sức mạnh. Hình 6.27 đưa ra ba
biện pháp chi phí liên quan cho các hệ thống này: kích thước khuôn gần đúng
được điều chỉnh cho công nghệ; sức mạnh cho một hệ thống 16 chip; và giá đám
mây trên mỗi chip. Kích thước khuôn được điều chỉnh bởi GPU gần gấp đôi so
với TPU, điều này cho thấy chi phí vốn của chip là gấp đôi, vì sẽ có số lượng
TPU chết gấp đôi trên mỗi wafer. Công suất GPU cao hơn 1,3 lần, điều này cho
thấy chi phí hoạt động cao hơn, vì TCO có tương quan với công suất. Cuối cùng,
giá cho thuê hàng giờ trên Google Cloud Engine cao hơn 1,6 lần đối với GPU.
Ba biện pháp khác nhau này luôn cho thấy TPUv3 đắt khoảng một nửa đến ba
phần tư so với GPU Volta .

Hiệu suất
Trước khi hiển thị hiệu suất của siêu máy tính TPUv3, chúng ta hãy thiết lập những ưu
điểm của một con chip duy nhất, để tăng tốc 1024 lần từ 1.024 chip wimpy là không thú
vị. Hình 6.28 cho thấy hiệu suất của TPUv3 so với chip GPU Volta cho hai bộ của các
chương trình. Tập đầu tiên là năm chương trình mà Google và NVIDIA đều đã gửi tới
MLPerf 0.6 và cả hai đều sử dụng số học 16 bit với phần mềm NVIDIA thực hiện mở
rộng tổn thất. Giá trị trung bình hình học TPUv3 của các chương trình này so với Volta là
0,95, vì vậy chúng có cùng tốc độ. Goggle cũng muốn đo lường hiệu suất của khối lượng
công việc sản xuất của nó, tương tự như những gì họ đã sử dụng cho TPUv1 Mục 6.7Tốc
độ trung bình hình học TPUv3 của các ứng dụng sản xuất trên Volta là 4,8 cho TPUv3,
chủ yếu vì chúng sử dụng fp32 chậm hơn 8 lần trên GPU thay vì fp16 (.Hình 6.26). Đây
là những ứng dụng sản xuất lớn liên tục được cải tiến và không phải là điểm chuẩn đơn
giản, vì vậy rất nhiều công việc để khiến chúng chạy, và nhiều hơn nữa để chạy tốt. Các
lập trình viên ứng dụng tập trung vào TPUv3 vì chúng được sử dụng hàng ngày, do đó, có
rất ít sự nhiệt tình bao gồm tỷ lệ tổn thất cần thiết cho fp16.
578 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

9
số 7.9
8
7 6.3
TPUv3 / Volta

6
4.8
5
4 3.6
2.9
3

2 1.31
0,90 0,89 0,77 0,96 0,95
1
0
r r

SSD .6GM CNN1 GM

Resnet50 Mặt nạRCNN Chuyển đổi GNMT 0 RNMT + Biến đổi AlphaZero

MLPerf Sản xuất


HÌNH 6.28 Hiệu suất trên mỗi chip của TPUv3 so với Volta cho năm điểm chuẩn MLPerf 0.6 và bốn ứng dụng sản xuất.

Than ôi, chỉ ResNet-50 từ MLPerf 0.6 có thể mở rộng hơn 1000 TPU và GPU.
Hình 6.29 hiển thị kết quả ResNet-50 cho MLPerf 0.6. NVIDIA chạy ResNet-50 trên
a cụm 96 DGX-2H mỗi cụm có 16 Voltas được kết nối thông qua các công tắc
InfiniBand với 41% tỷ lệ tuyến tính cho 1536 chip. Điểm chuẩn MLPerf 0.6 nhỏ hơn
nhiều so với các ứng dụng sản xuất; thời gian để đào tạo chúng là các đơn đặt hàng
có cường độ thấp hơn so với các khóa đào tạo sản xuất. Do đó, Google bao gồm các
ứng dụng sản xuất phần lớn để hiển thị các chương trình đáng kể có thể mở rộng quy
mô siêu máy tính. Một chạy ở mức 96% và ba chạy ở mức 99% của thang đo tuyến
tính hoàn hảo cho 1024 chip!
Hình 6.30 cho thấy petaFLOPs / giây và FLOP / watt của AlphaZero trên
TPUv3 sẽ xếp hạng trong danh sách Top500 và Green500. Sự so sánh này là các
siêu máy tính thông thường không hoàn hảo, dữ liệu 32 và 64 bit thay vì dữ liệu
16 và 32 bit của TPU. Tuy nhiên, TPU đang chạy một ứng dụng thực sự trên dữ
liệu thực so với điểm chuẩn LINPACK được thu nhỏ yếu trên dữ liệu tổng hợp.
Đáng chú ý, siêu máy tính TPUv3 chạy một ứng dụng sản xuất sử dụng dữ liệu
trong thế giới thực với 70% hiệu suất cao nhất, cao hơn siêu máy tính đa năng
chạy chuẩn LINPACK. Ngoài ra, siêu máy tính TPUv3 có chip chạy ứng dụng
sản xuất có hiệu suất / watt gấp 10 lần so với siêu máy tính truyền thống số 1
trong danh sách Green500 chạy LINPACK và 44x của siêu máy tính số 4 trong
danh sách Top500.
Lý do thành công của TPUv3, bao gồm mạng ICI tích hợp, mảng số nhân lớn
và số học bf16. TPUv3 có một khuôn nhỏ hơn trong quy trình bán dẫn cũ hơn và
giá đám mây thấp hơn mặc dù ít trưởng thành hơn ở nhiều cấp độ của hệ thống
phần cứng / phần mềm so với CPU và GPU. Những kết quả tốt này mặc dù có
những bất lợi về công nghệ cho thấy phương pháp TPU DSA có hiệu quả về chi
phí và có thể mang lại hiệu quả kiến trúc cao trong tương lai.
6.12 Công cụ thực: Đánh dấu siêu máy tính Google TPUv3 và Cụm GPU NVIDIA Volta 579

1.000
RNMT +, Máy biến áp, CNN1 trên TPUv3
900 AlphaZero trên TPUv3
ResNet50 (MLPerf 0.6) trên TPUv3
800 ResNet50 (MLPerf 0.6) trên Volta

700

600
Tăng tốc

500

400

300

200

100

0
0 200 400 600 800 1.000
Khoai tây chiên

HÌNH 6.29 Tỷ lệ siêu máy tính: TPUv3 và Volta.

Màu xanh lá
Tên Lõi Điểm chuẩn PetaFlop / s % Đỉnh Megawatt GFlops / watt Top500 cây
Thiên Hà 4865k Linpack 61.4 61% 18,48 3.3 4 57
Sao Thổ 22k Linpack 1.1 59% 0,97 15.1 469 1
TPUv3 2k AlphaZero 86,9 70% 0,59 146.3 4 1

HÌNH 6.30 Xếp hạng Top500 và Green500 truyền thống so với TPUv3 (tháng 6 năm 2019) cho LINPACK và AlphaZero.

Bây giờ chúng tôi đã thấy một loạt các kết quả từ việc đánh giá các kiến trúc
khác nhau, chúng tôi quay lại ví dụ DGEMM của mình để xem chi tiết chúng tôi
phải thay đổi mã C bao nhiêu để khai thác nhiều bộ xử lý.

Xây dựng: Giấy TPUv3 ban đầu bao gồm hai ứng dụng sản xuất nữa , MLP0 và
MLP1. Họ dựa vào việc nhúng. Một nhúng khi bắt đầu mô hình DNN biến đổi từ các
biểu diễn thưa thớt thành một biểu diễn dày đặc phù hợp với đại số tuyến tính; nhúng
cũng chứa trọng lượng. Các đám cưới có thể sử dụng các vectơ trong đó các tính
năng có thể được thể hiện bằng các khái niệm về khoảng cách giữa các vectơ. Các
bản nhúng liên quan đến tra cứu bảng, các trường dữ liệu liên kết và độ dài thay đổi,
do đó chúng không đều và tốn nhiều bộ nhớ. Hạt nhân TensorFlow cho các bản
nhúng đã không được phát triển cho GPU, vì vậy Google đã loại trừ MLP. Trên
TPUv3, tốc độ tăng tốc của họ cho 1024 chip là 14% và 40%, bị giới hạn bởi các bản
nhúng.
580 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

6.13 Đi nhanh hơn: Nhiều bộ xử lý và


Ma trận nhân

Phần này là bước cuối cùng và lớn nhất trong hành trình hiệu suất gia tăng của
chúng tôi về việc điều chỉnh DGEMM với phần cứng cơ bản của Intel Core i7
(Skylake). Mỗi Core i7 có tám lõi và máy tính chúng tôi đang sử dụng có hai
Core i7. Do đó, chúng tôi có 16 lõi để chạy DGEMM .
Hình 6.31 hiển thị phiên bản OpenMP của DGEMM sử dụng các lõi đó. Lưu ý
rằng dòng 27 là độc thân dòng thêm vào Hình 5.47 để làm cho mã này chạy trên
nhiều bộ xử lý: một thực dụng OpenMP cho phép trình biên dịch sử dụng nhiều
luồng trong vòng lặp ngoài cùng. Nó bảo máy tính trải rộng công việc của vòng
lặp ngoài cùng trên tất cả các luồng.
Hình 6.32 vẽ đồ thị tăng tốc đa bộ xử lý cổ điển, hiển thị cải thiện hiệu suất so
với một luồng duy nhất khi số lượng luồng tăng. Biểu đồ này giúp dễ dàng nhìn
thấy những thách thức của quy mô mạnh so với tỷ lệ yếu. Khi mọi thứ phù hợp
với bộ đệm dữ liệu cấp một, như trường hợp của ma trận 64 × 64, việc thêm các
luồng thực sự làm tổn hại đến hiệu suất. Phiên bản 48 luồng của DGEMM nhanh
gần bằng một nửa so với phiên bản một luồng trong trường hợp này. Ngược lại,
hai ma trận lớn nhất có tốc độ tăng tốc 17 × từ 48 luồng, và do đó, hai dòng cổ
điển lên và sang các dòng bên phải Hình 6.32.
Hình 6.33 cho thấy sự gia tăng hiệu suất tuyệt đối khi chúng ta tăng số lượng
chủ đề từ một đến 48. DGEMM hiện hoạt động ở mức 308 GLOPS cho ma trận
960 × 960. Là phiên bản C ban đầu của DGEMM Hình 3.20 chạy mã này chỉ với
2 GFLOPS, tối ưu hóa trong Chương 3 đến 6 việc điều chỉnh mã cho phần cứng
cơ bản dẫn đến tăng tốc 150! Nếu chúng ta bắt đầu với phiên bản Python, tốc độ
tăng gần 50.000 cho phiên bản C của DGEMM được tối ưu hóa cho song song
mức dữ liệu, phân cấp bộ nhớ và song song mức độ luồng.
Tiếp theo là những cảnh báo của chúng tôi về những ngụy biện và cạm bẫy
của việc nhân rộng. Nghĩa địa kiến trúc máy tính chứa đầy các dự án xử lý song
song đã bỏ qua chúng.

Xây dựng: Mặc dù Skyelake hỗ trợ hai luồng phần cứng trên mỗi lõi, chúng tôi
nhận được nhiều hiệu suất hơn từ 96 luồng chỉ cho ma trận 4096 x 4096: đỉnh là 364
GFLOPS tại 64 luồng, giảm xuống còn 344 tại 96 luồng. Lý do là một phần cứng AVX
duy nhất được chia sẻ giữa hai luồng được ghép vào một lõi, do đó việc gán hai
luồng trên mỗi lõi có thể làm tổn hại đến hiệu suất do tính toán ghép kênh nếu không
có đủ dữ liệu để giữ cho tất cả các luồng bận rộn.
6.13 Nhanh hơn: Nhiều bộ xử lý và ma trận nhân 581

1 #include <x86intrin.h>
2 #define UNROLL (4)
3 #define BLOCKSIZE 32
4 void do_block (int n, int si, int sj, int sk ,
5 gấp đôi * A, gấp đôi * B, gấp đôi * C)
6 {
7 cho (int i = si; i <si + BLOCKSIZE; i + = UNROLL * 8)
8 cho (int j = sj; j <sj + BLOCKSIZE; j ++) {
9 __m512d c [UNROLL];
10 cho (int r = 0; r <UNROLL; r ++)
11 c [r] = _mm512_load_pd (C + i + r * 8 + j * n); // [UNROLL];
12
13 for (int k = sk; k <sk + BLOCKSIZE; k ++)
14 {
15 __m512d bb = _mm512_broadcastsd_pd (_mm_load_sd (B + j * n +
k));
16 cho (int r = 0; r <UNROLL; r ++)
17 c [r] = _mm512_fmadd_pd (_mm512_load_pd (A + n * k + r * 8 + i),
bb, c [r]);
18 }
19
20 cho (int r = 0; r <UNROLL; r ++)
21 _mm512_store_pd (C + i + r * 8 + j * n, c [r]);
22 }
23 }
24
25 void dgemm (int n, double * A, double * B, double * C)
26 {
27 #pragma ump song song cho
28 cho (int sj = 0; sj <n; sj + = BLOCKSIZE)
29 cho (int si = 0; si <n; si + = BLOCKSIZE)
30 cho (int sk = 0; sk <n; sk + = BLOCKSIZE)
31 do_block (n, si, sj, sk, A, B, C);
32 }

HÌNH 6.31 Phiên bản OpenMP của DGEMM từ Hình 5.48. Dòng 27 là mã OpenMP duy nhất, làm cho vòng lặp ngoài cùng hoạt
động song song. Dòng này là sự khác biệt duy nhất từHình 5.48.
18
4096 × 4096
16 960 × 960
320 × 320
14 64 × 64

12

Tăng tốc so với 1 lõi


10

số 8

-
0 số 8 16 24 32 40 48
Chủ đề

HÌNH 6.32 Cải thiện hiệu suất so với một luồng khi số lượng luồng tăng. Cách trung thực nhất
để trình bày các biểu đồ như vậy là làm cho hiệu suất so với tốt nhất phiên bản của một chương trình xử lý
duy nhất, mà chúng tôi đã làm. Biểu đồ này liên quan đến hiệu suất của mã trong Hình 5.47 không có bao
gồm cả thực dụng OpenMP.

64 × 64 320 × 320 960 × 960 4096 × 4096

350 329
306 298
300
267
245
250
GFLOPS / giây

200 179
163 157
150 129

100 78 79

50 28 30 32 33
22 25 21 18 14
-
1 4 16 32 64
Chủ đề

HÌNH 6.33 Hiệu suất DGEMM so với số lượng luồng cho bốn kích thước ma trận. Sự cải
thiện hiệu suất so với mã C ban đầu Hình 3.20 đối với ma trận 960 × 960 với 32 luồng nhanh hơn đáng
kinh ngạc 152 lần!
6.14 Ngụy biện và Cạm bẫy 583

Điều tôi thực sự thất


vọng là thực tế, với
6.14 Ngụy biện và Cạm bẫy Iliac IV, việc lập trình
máy rất khó khăn và
kiến trúc có lẽ không
Nhiều cuộc tấn công vào xử lý song song đã phát hiện ra nhiều ngụy biện và cạm
phù hợp lắm với một
bẫy. Chúng tôi bao gồm bốn ở đây. số ứng dụng chúng tôi
Fallacy: Amdahl từ Law không áp dụng cho các máy tính song song. đang cố chạy.
Năm 1987, người đứng đầu một tổ chức nghiên cứu tuyên bố rằng một máy đa David Kuck, kiến trúc
xử lý đã phá vỡ Luật Amdahl. Để cố gắng hiểu cơ sở của các báo cáo truyền sư phần mềm duy
thông, hãy để Lọ xem trích dẫn đã cho chúng tôi Luật Amdahl [1967, tr. 483] : nhất của máy tính
Một kết luận khá rõ ràng có thể được rút ra vào thời điểm này là nỗ lực dành cho việc đạt SIMD Illiac IV, vào
khoảng năm 1975.
được tỷ lệ xử lý song song cao bị lãng phí trừ khi nó đi kèm với những thành tựu về tỷ lệ xử
lý tuần tự có cường độ rất gần như nhau.
Tuyên bố này vẫn phải đúng; phần bị bỏ quên của chương trình phải giới hạn hiệu
suất. Một cách giải thích của luật dẫn đến bổ đề sau: các phần của mọi chương trình
phải là tuần tự, do đó phải có một giới hạn kinh tế giới hạn về số lượng bộ xử lý mà
nói, 100. Bằng cách hiển thị tốc độ tuyến tính với 1000 bộ xử lý, bổ đề này bị từ chối;
do đó, tuyên bố rằng Luật Amdahl đã bị phá vỡ.
Cách tiếp cận của các nhà nghiên cứu chỉ là sử dụng tỷ lệ yếu: thay vì đi
nhanh hơn 1000 lần trên cùng một bộ dữ liệu, họ đã tính toán công việc gấp 1000
lần trong thời gian tương đương. Đối với thuật toán của họ, phần tuần tự của
chương trình là không đổi, không phụ thuộc vào kích thước của đầu vào và phần
còn lại hoàn toàn song song với nhau, do đó, tăng tốc tuyến tính với 1000 bộ xử
lý.
Luật Amdahl rõ ràng áp dụng cho các bộ xử lý song song. Những gì nghiên cứu này
chỉ ra là một trong những cách sử dụng chính của máy tính nhanh hơn là chạy các vấn đề
lớn hơn. Chỉ cần chắc chắn rằng người dùng thực sự quan tâm đến những vấn đề đó so
với việc biện minh cho việc mua một máy tính đắt tiền bằng cách tìm ra một vấn đề đơn
giản là khiến nhiều bộ xử lý bận rộn.
Fallacy: Theo dõi hiệu suất cao nhất quan sát hiệu suất.
Ngành công nghiệp siêu máy tính đã từng sử dụng số liệu này trong tiếp thị và sai lầm
trở nên trầm trọng hơn với các máy song song. Không chỉ các nhà tiếp thị sử dụng hiệu
suất cực đại gần như không thể đạt được của một nút không xử lý, mà sau đó họ còn nhân
nó với tổng số bộ xử lý, giả sử tăng tốc hoàn hảo! Đáng buồn thay, chúng tôi đã thấy một
số tuyên bố tương tự gần đây của các nhà phát triển DSA cho các mạng thần kinh. Luật
Amdahl từ cho thấy mức độ khó khăn để đạt đến đỉnh điểm; nhân hai với nhau nhân lên
tội lỗi. Mô hình mái nhà giúp đặt hiệu suất cao nhất trong quan điểm.
Pitfall: Không phát triển phần mềm để tận dụng hoặc tối ưu hóa cho một kiến
trúc mới lạ.
Có một lịch sử lâu dài của phần mềm song song tụt hậu so với phần cứng song
song, có thể vì các vấn đề phần mềm khó hơn nhiều. Có nhiều ví dụ chúng ta có
thể chọn!
Một vấn đề thường gặp xảy ra khi phần mềm được thiết kế cho bộ giải mã được
điều chỉnh phù hợp với môi trường đa bộ xử lý. Ví dụ: hệ điều hành Đồ họa Silicon
ban đầu bảo vệ bảng trang bằng một khóa duy nhất ,
584 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

giả sử rằng phân bổ trang là không thường xuyên. Trong một bộ giải mã, điều
này không đại diện cho một vấn đề hiệu suất. Trong một bộ xử lý đa xử lý, nó có
thể trở thành một nút cổ chai hiệu suất chính cho một số chương trình. Hãy xem
xét một chương trình sử dụng một số lượng lớn các trang được khởi tạo khi khởi
động, mà UNIX làm cho các trang được phân bổ tĩnh. Giả sử chương trình được
song song để nhiều quy trình phân bổ các trang. Bởi vì phân bổ trang yêu cầu sử
dụng bảng trang, được khóa bất cứ khi nào nó được sử dụng, ngay cả một nhân
OS cho phép nhiều luồng trong HĐH sẽ được tuần tự hóa nếu tất cả các quy trình
cố gắng phân bổ các trang của chúng cùng một lúc (đó chính xác là những gì
chúng ta có thể mong đợi tại thời điểm khởi tạo!).
Việc tuần tự hóa bảng trang này giúp loại bỏ tính song song trong việc khởi tạo
và có tác động đáng kể đến hiệu suất song song tổng thể. Nút thắt hiệu suất này
vẫn tồn tại ngay cả đối với song song cấp độ nhiệm vụ. Ví dụ: giả sử chúng tôi
chia chương trình xử lý song song thành các công việc riêng biệt và chạy chúng,
một công việc cho mỗi bộ xử lý, để không có sự chia sẻ giữa các công việc. (Đây
chính xác là những gì một người dùng đã làm, vì anh ta tin tưởng một cách hợp lý
rằng vấn đề hiệu suất là do chia sẻ hoặc can thiệp ngoài ý muốn vào ứng dụng của
anh ta.) Thật không may, khóa vẫn tuần tự hóa tất cả các công việc, vì vậy ngay
cả hiệu suất công việc độc lập cũng kém.
cạm bẫy này cho thấy loại lỗi hiệu suất tinh tế nhưng có ý nghĩa có thể phát
sinh khi phần mềm chạy trên bộ đa xử lý. Giống như nhiều thành phần phần mềm
quan trọng khác, các thuật toán hệ điều hành và cấu trúc dữ liệu phải được xem
xét lại trong bối cảnh đa bộ xử lý. Đặt khóa trên các phần nhỏ hơn của bảng trang
đã loại bỏ vấn đề một cách hiệu quả.
Một ví dụ gần đây hơn về cạm bẫy đến từ DSA cho DNN. Hơn 100 công ty đang
phát triển chúng vào năm 2020 và điểm chuẩn MLPerf đang xác định thành công
tương đối của họ. Một chế độ thất bại phổ biến là phát triển phần cứng mới mà không
có ngăn xếp phần mềm cho thấy phần cứng ở mức tốt nhất, điều này đã dẫn đến việc
các công ty khởi nghiệp sẽ ngừng hoạt động vài năm sau khi họ được thành lập.
Fallacy: Bạn có thể có được hiệu suất vector tốt mà không cần cung cấp băng thông bộ
nhớ.
Như chúng ta đã thấy trong mô hình Roofline, băng thông bộ nhớ khá quan trọng đối
với tất cả các kiến trúc. DAXPY yêu cầu 1,5 tham chiếu bộ nhớ cho mỗi hoạt động
dấu phẩy động và tỷ lệ này là điển hình của nhiều mã khoa học. Ngay cả khi các thao
tác dấu phẩy động không mất thời gian, Cray-1 không thể tăng hiệu suất DAXPY của
chuỗi vector được sử dụng, vì nó bị giới hạn bộ nhớ. Hiệu suất Cray-1 trên Linpack
đã tăng vọt khi trình biên dịch sử dụng chặn để thay đổi tính toán để các giá trị có thể
được giữ trong các thanh ghi vector. Cách tiếp cận này đã hạ thấp số lượng tham
chiếu bộ nhớ trên mỗi FLOP và cải thiện hiệu suất gần như là hai yếu tố! Do đó, băng
thông bộ nhớ trên Cray-1 đã trở nên đủ cho một vòng lặp trước đây cần nhiều băng
thông hơn, đó là những gì mô hình Roofline dự đoán.
Pitfall: Giả sử kiến trúc tập lệnh (ISA) che giấu hoàn toàn tất cả các thuộc
tính thực hiện vật lý.
Các kênh thời gian đã được biết đến như một lỗ hổng kể từ ít nhất là những
năm 1980, nhưng hầu hết các kiến trúc sư đã coi chúng không chính xác thực tế
là không quan trọng.1
1 Hố này có nguồn gốc từ Quan điểm của Mark Hill Truyền thông của ACM, 2020 , Tại sao máy
tính chính xác có thể rò rỉ thông tin của bạn và được viết với sự giúp đỡ của anh ấy.
6.15 Nhận xét kết luận 585

Tuy nhiên, các thuộc tính thực hiện, chẳng hạn như thời gian, có thể ảnh hưởng
đến chức năng. Hố này đã được thể hiện nổi bật bởi sự tiếp xúc năm 2018 của
Spectre, sử dụng đầu cơ vi kiến trúc để rò rỉ thông tin cá nhân cho mã kẻ tấn công
cấp người dùng từ hộp cát cấp người dùng, hạt nhân hoặc trình ảo hóa. Spectre
khai thác ba kỹ thuật vi kiến trúc :
1. Hướng dẫn đầu cơ : Một lõi bộ xử lý tìm cách thực hiện hàng chục hướng dẫn
đồng thời bằng cách suy đoán các nhánh trong quá khứ, cam kết thay đổi ISA nếu
đầu cơ là chính xác và đẩy chúng trở lại khi đầu cơ sai. Ngược lại, Spectre thực
hiện một cách suy đoán các hướng dẫn mà ISA thay đổi mà nó biết sẽ được khôi
phục. Mục tiêu tinh tế của nó là để lại những chiếc bánh mì vi kiến trúc của người
Hồi giáo về những gì lập trình viên nghĩ là những bí mật ẩn giấu.
2. Bộ nhớ đệm : Bộ nhớ cache là vô hình đối với ISA. Đặc biệt, theo thông
thường trí tuệ kiến trúc máy tính, khối nào ít được sử dụng gần đây nhất trong
bộ đệm liên kết tập hợp không quan trọng để thực hiện đúng, vì vậy trạng thái
của nó không cần phải được khôi phục khi viết sai. Spectre khai thác lỗ hổng
đáng ngạc nhiên này để đặt, và sau đó tìm thấy, Breadcrumbs, tiết lộ một bí
mật. Do đó, nó sử dụng nội dung của bộ đệm làm kênh bên phía bên để truyền
giá trị dữ liệu (bí mật).
3. Đa luồng phần cứng : Nó dễ dàng hơn nhiều để nhận thấy thời gian tinh tế như
vậy thay đổi nếu chương trình tấn công có thể chạy gần với chương trình mục tiêu.
Đa luồng phần cứng, trong đó các hướng dẫn từ một chương trình có thể kết hợp
với các chương trình khác, đơn giản hóa nhiệm vụ này. Các cuộc tấn công phần
cứng đủ đáng lo ngại khi các nhà cung cấp đám mây hiện cung cấp tùy chọn để
ngăn chia sẻ máy chủ của bạn với các chương trình của các khách hàng khác. Ví
dụ: AWS cung cấp các trường hợp chuyên dụng của Cameron, có giá cao hơn
khoảng 5% so với các trường hợp được chia sẻ truyền thống.

Chúng tôi đang dành


tất cả sự phát triển sản
6.15 Kết luận phẩm trong tương lai
của chúng tôi cho các
Ước mơ xây dựng máy tính bằng cách đơn giản là bộ xử lý tổng hợp đã xuất hiện từ thiết kế đa lõi. Chúng
những ngày đầu tiên của máy tính. Tiến bộ trong việc xây dựng và sử dụng bộ xử lý tôi tin rằng đây là một
song song hiệu quả và hiệu quả, tuy nhiên, đã chậm. Tốc độ tiến bộ này đã bị giới hạn điểm uốn chính cho
bởi các vấn đề phần mềm khó khăn cũng như bởi một quá trình dài để phát triển kiến ngành công
trúc của bộ đa xử lý để tăng cường khả năng sử dụng và nâng cao hiệu quả. Chúng tôi nghiệp. ...Đây không
đã thảo luận về nhiều thách thức phần mềm trong chương này, bao gồm cả những khó phải là một cuộc đua.
khăn trong việc viết các chương trình đạt được tốc độ tốt do Luật Amdahl. Sự đa dạng Đây là một sự thay đổi
của các phương pháp kiến trúc khác nhau và thành công hạn chế và tuổi thọ ngắn của biển trong điện toán...
nhiều kiến trúc song song trong quá khứ đã làm tăng thêm những khó khăn của phần Paul Otellini, Chủ tịch
mềm. Chúng tôi thảo luận về lịch sử phát triển của các bộ xử lý này trên mạng Mục Intel, Diễn đàn các nhà
6.16Để đi sâu hơn nữa về các chủ đề trong chương này, xem. Chương 4 của Kiến trúc phát triển Intel, 2004
máy tính: Cách tiếp cận định lượng, Phiên bản thứ sáu cho thêm về GPU và so
sánh giữa GPU và CPU và Chương 6 để biết thêm về WSC và Chương 7 để biết
thêm về DSA.
586 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Như chúng tôi đã nói Chương 1, mặc dù quá khứ dài và ca rô này, ngành công
nghệ thông tin hiện đã gắn kết tương lai của nó với điện toán song song. Dưới
đây là một số lý do khiến nó khác biệt so với trước đây :
n Thông suốt, phần mềm như một dịch vụ (SaaS) đang ngày càng trở nên
quan trọng và các cụm đã được chứng minh là một cách rất thành công để
cung cấp các dịch vụ như vậy. Bằng cách cung cấp dự phòng ở cấp độ cao
hơn, bao gồm các trung tâm dữ liệu phân tán theo địa lý, các dịch vụ này đã
cung cấp 24 × 7 × 365 cho khách hàng trên toàn thế giới.
n Máy tính quy mô kho đang thay đổi các mục tiêu và nguyên tắc thiết kế
máy chủ, giống như nhu cầu của khách hàng di động đang thay đổi các mục
tiêu và nguyên tắc của thiết kế vi xử lý. Cả hai đều đang cách mạng hóa
ngành công nghiệp phần mềm. Hiệu suất trên mỗi đô la và hiệu suất trên
mỗi Joule điều khiển cả phần cứng máy khách di động và phần cứng WSC
và song song là chìa khóa để cung cấp cho các bộ mục tiêu đó.
n Sự phổ biến nhanh chóng của học máy đang thay đổi bản chất của các ứng
dụng và các mô hình mạng thần kinh điều khiển máy học song song tự
nhiên. Ngoài ra, các nền tảng phần mềm cụ thể của miền như PyTorch và
TensorFlow hoạt động trên các mảng, giúp thể hiện và khai thác song song
mức dữ liệu dễ dàng hơn nhiều so với các chương trình được viết bằng C
++.
n Các hoạt động của SIMD và vector phù hợp với các ứng dụng đa phương
tiện, đang đóng một vai trò lớn hơn trong thời kỳ hậu PC. Họ chia sẻ lợi thế
là lập trình viên dễ dàng hơn so với lập trình MIMD song song cổ điển và
tiết kiệm năng lượng hơn MIMD .
n Tất cả các nhà sản xuất vi xử lý máy tính để bàn và máy chủ đang xây dựng
bộ đa xử lý để đạt được hiệu suất cao hơn, vì vậy, không giống như trước
đây, không có con đường dễ dàng để có hiệu suất cao hơn cho các ứng
dụng tuần tự.
n Trong quá khứ, bộ vi xử lý và bộ đa xử lý phải tuân theo các định nghĩa
khác nhau về thành công. Khi mở rộng hiệu suất của bộ xử lý, các kiến trúc
sư vi xử lý rất vui nếu hiệu suất của một sợi đơn tăng lên bởi căn bậc hai
của khu vực silicon tăng. Do đó, họ hài lòng với hiệu suất tuyến dưới về tài
nguyên. Thành công đa bộ xử lý được sử dụng để được định nghĩa là tuyến
tính tăng tốc như là một chức năng của số lượng bộ xử lý, giả sử rằng chi
phí mua hoặc chi phí quản lý n bộ xử lý là n gấp nhiều lần một bộ xử lý.
Bây giờ sự song song đang diễn ra trên chip thông qua nhiều lớp, chúng ta
có thể sử dụng số liệu vi xử lý truyền thống để thành công với cải tiến hiệu
suất tuyến dưới.

n Không giống như trong quá khứ, phong trào nguồn mở đã trở thành một
phần quan trọng của ngành công nghiệp phần mềm. Phong trào này là một
chế độ nhân tài, nơi các giải pháp kỹ thuật tốt hơn có thể giành được phần
lớn tâm trí của các nhà phát triển về các mối quan tâm cũ. Nó cũng bao
trùm sự đổi mới, mời thay đổi phần mềm cũ và
6.16 Quan điểm lịch sử và đọc thêm 587

chào đón các ngôn ngữ và sản phẩm phần mềm mới. Một nền văn hóa mở
như vậy có thể cực kỳ hữu ích trong thời gian thay đổi này.
Để thúc đẩy độc giả nắm lấy cuộc cách mạng này, chúng tôi đã chứng minh
tiềm năng của song song một cách cụ thể cho ma trận nhân lên trên Intel Core i7
(Skyelake) trong các phần của Fast Faster Chương 3 đến 6 :
n Song song cấp dữ liệu trong Chương 3 cải thiện hiệu suất theo hệ số 7,8 bằng
cách thực hiện song song tám thao tác dấu phẩy động 64 bit bằng cách sử dụng
toán hạng 512 bit của hướng dẫn AVX, thể hiện giá trị của SIMD .
n Hướng dẫn song song cấp độ trong Chương 4 đẩy hiệu suất lên bởi một yếu
tố khác là 1,8 bằng cách hủy các vòng lặp bốn lần để cung cấp cho phần
cứng thực thi ngoài đơn hàng nhiều hướng dẫn hơn để lên lịch.
n Tối ưu hóa bộ nhớ cache trong Chương 5 cải thiện hiệu suất của các ma
trận không phù hợp với bộ đệm dữ liệu L1 theo một yếu tố khác là 1,5 bằng
cách sử dụng chặn bộ đệm để giảm các lỗi bộ đệm.
n Song song cấp độ chủ đề trong chương này đã cải thiện hiệu suất của ma
trận không phù hợp với bộ đệm dữ liệu L1 duy nhất theo hệ số khác từ 12
đến 17 bằng cách sử dụng tất cả 48 lõi của chip đa lõi của chúng tôi, chứng
minh giá trị của MIMD. Chúng tôi đã làm điều này bằng cách thêm một
dòng duy nhất bằng cách sử dụng thực dụng OpenMP.
Sử dụng các ý tưởng trong cuốn sách này và điều chỉnh phần mềm cho máy
tính này đã thêm 21 dòng mã vào DGEMM. Tốc độ hiệu suất tổng thể từ những
ý tưởng này được thực hiện trong hai chục dòng mã này vượt quá 150 lần!
Trong thời đại không có quy mô Dennard, Luật Moore Moore giảm và Luật
Amdahl có hiệu lực đầy đủ, những cải tiến trong hiệu suất của lõi đa năng sẽ chỉ
là vài phần trăm mỗi năm. Giống như ngành công nghiệp đã dành một thập kỷ
bắt đầu từ khoảng năm 2005 để cố gắng khai thác cơ hội xử lý song song, chúng
tôi dự đoán thách thức của thập kỷ tới sẽ là phát triển và lập trình DSA.
Sự thay đổi trên biển này sẽ cung cấp nhiều triển vọng nghiên cứu và kinh
doanh mới trong và ngoài lĩnh vực CNTT và các công ty thống trị thời đại DSA
có thể không giống với những công ty thống trị ngày nay. Sau khi hiểu về xu
hướng phần cứng cơ bản và cách điều chỉnh phần mềm cho chúng mà bạn đã đạt
được từ cuốn sách này, có lẽ bạn sẽ là một trong những người đổi mới nắm bắt
những cơ hội nhất định xuất hiện trong thời điểm không chắc chắn phía trước.
Chúng tôi mong muốn được hưởng lợi từ các phát minh của bạn!

Quan điểm lịch sử và hơn thế nữa


6.16
Đọc hiểu

Phần trực tuyến này mang đến lịch sử phong phú và thường là thảm họa của bộ vi
xử lý trong 50 năm qua.
6.16 Quan điểm lịch sử và đọc thêm 587.e1

Quan điểm lịch sử và hơn thế nữa


6.16
Đọc hiểu
Có một lượng lớn lịch sử trong bộ xử lý đa xử lý; trong phần này, chúng tôi chia
thảo luận của chúng tôi theo cả khoảng thời gian và kiến trúc. Chúng tôi bắt đầu
với phương pháp SIMD và Illiac IV. Sau đó chúng tôi chuyển sang một cuộc
thảo luận ngắn về một số bộ xử lý thử nghiệm ban đầu khác và tiến tới thảo luận
về một số cuộc tranh luận lớn trong xử lý song song. Tiếp theo chúng tôi mô tả
nguồn gốc lịch sử của hiện tại bộ nhân và kết luận bằng cách thảo luận về những
tiến bộ gần đây.

Máy tính SIMD: Ý tưởng hấp dẫn, nhiều nỗ lực,


không thành công lâu dài
Tuy nhiên, chi phí của bộ đa xử lý nói chung là rất cao và các tùy chọn thiết kế tiếp
theo đã được xem xét sẽ làm giảm chi phí mà không làm giảm nghiêm trọng sức mạnh
hoặc hiệu quả của hệ thống. Các tùy chọn bao gồm gần đây hóa một trong ba thành
phần chính.... Tập trung [đơn vị kiểm soát] làm phát sinh tổ chức cơ bản của [an] ... bộ
xử lý mảng như Illiac IV .
Bouknight et al. [1972]

Mô hình SIMD là một trong những mô hình đầu tiên của điện toán song song, có
niên đại từ bộ đa xử lý quy mô lớn đầu tiên, Illiac IV. Ý tưởng quan trọng trong
bộ đa xử lý đó, như trong bộ đa xử lý SIMD gần đây, là có một hướng dẫn duy
nhất hoạt động trên nhiều mục dữ liệu cùng một lúc, sử dụng nhiều đơn vị chức
năng (xem Hình e6.16.1).
Mặc dù thành công trong việc thúc đẩy một số công nghệ tỏ ra hữu ích trong
các dự án sau này, nhưng nó đã thất bại như một máy tính. Chi phí leo thang từ
ước tính 8 triệu đô la năm 1966 lên 31 triệu đô la vào năm 1972, mặc dù chỉ xây
dựng một phần tư bộ nhân được lên kế hoạch. Hiệu suất thực tế ở mức tốt nhất
15 MFLOPS, so với dự đoán ban đầu là 1000 MFLOPS cho toàn bộ hệ thống
[Hord, 1982]Được giao cho NASA Ames Research vào năm 1972, máy tính cần
thêm ba năm kỹ thuật trước khi có thể sử dụng được.
Những sự kiện này đã làm chậm quá trình điều tra SIMD, với Daniel Hillis
[1989] đã hồi sinh phong cách này trong Máy kết nối, có 65.636 bộ xử lý 1 bit.
Máy tính SIMD thực sự cần có hỗn hợp các hướng dẫn SISD và SIMD. Có một
máy tính chủ SISD để thực hiện các hoạt động như các nhánh và tính toán địa chỉ
không cần vận hành song song. Các hướng dẫn SIMD được phát tới tất cả các đơn vị
thực thi, mỗi đơn vị có bộ thanh ghi riêng. Để linh hoạt, các đơn vị thực thi riêng lẻ
có thể bị vô hiệu hóa trong hướng dẫn SIMD. Ngoài ra, bộ đa xử lý SIMD song song
ồ ạt dựa vào mạng kết nối hoặc mạng truyền thông để trao đổi dữ liệu giữa các yếu tố
xử lý.
587.e2 6.16 Quan điểm lịch sử và đọc thêm

HÌNH e6.16.1 Đơn vị điều khiển Illiac IV theo sau là 64 yếu tố xử lý. Nó đã được có lẽ là khét
tiếng nhất của siêu máy tính. Dự án bắt đầu vào năm 1965 và chạy ứng dụng thực sự đầu tiên vào năm
1976. Bộ xử lý 64 sử dụng đồng hồ 13 MHz và kích thước bộ nhớ chính kết hợp của chúng là 1 MB: 64 ×
16 KB. Illiac IV là máy đầu tiên dạy chúng tôi rằng phần mềm cho các máy song song chi phối các vấn đề
phần cứng. Hình ảnh lịch sự của Trung tâm nghiên cứu NASA Ames.

Sự đánh đổi cơ bản trong bộ đa xử lý SIMD là hiệu suất của bộ xử lý so với số


lượng bộ xử lý. Các SIMD gần đây nhấn mạnh một mức độ song song lớn so với
hiệu suất của các bộ xử lý riêng lẻ. Ví dụ, Bộ xử lý kết nối 2 đã cung cấp 65.536
bộ xử lý đơn bit, trong khi Illiac IV có sáu mươi bốn bộ xử lý 64 bit.
Sau khi được hồi sinh vào những năm 1980, ban đầu bởi Thinking Machines và
sau đó là MasPar, mô hình SIMD một lần nữa được đưa lên giường như một kiến trúc
đa xử lý đa năng, vì hai lý do chính. Đầu tiên, nó quá không linh hoạt. Một số vấn đề
quan trọng không thể sử dụng kiểu đa xử lý như vậy và kiến trúc không giảm quy mô
theo kiểu cạnh tranh; nghĩa là, bộ đa xử lý SIMD quy mô nhỏ thường có hiệu suất chi
phí kém hơn so với các lựa chọn thay thế. Thứ hai, SIMD đã không tận dụng hiệu
suất và chi phí rất lớn
6.16 Quan điểm lịch sử và đọc thêm 587.e3

lợi thế của công nghệ vi xử lý. Thay vì tận dụng công nghệ chi phí thấp này đang
được cải thiện nhanh chóng trong chiều cao của Moore, Law và Dennard Scaling,
các nhà thiết kế bộ đa xử lý SIMD đã chế tạo bộ xử lý tùy chỉnh cho bộ đa xử lý
của họ.
Mặc dù các máy tính SIMD đã rời khỏi hiện trường như là lựa chọn thay thế cho
mục đích chung, phong cách kiến trúc này đóng một vai trò quan trọng trong các
thiết kế đặc biệt. Nhiều tác vụ đặc biệt có tính dữ liệu song song cao và yêu cầu một
bộ đơn vị chức năng hạn chế. Do đó, các nhà thiết kế có thể xây dựng để hỗ trợ cho
các hoạt động nhất định, cũng như các đường dẫn kết nối cứng giữa các đơn vị chức
năng. Các tổ chức như vậy thường được gọi là bộ xử lý mảng và chúng hữu ích cho
các tác vụ như xử lý hình ảnh, xử lý tín hiệu và học máy, như chúng ta thấy với TPU.

Tiện ích mở rộng đa phương tiện dưới dạng


tiện ích mở rộng SIMD cho bộ hướng dẫn
Nhiều kiến trúc gần đây đã tuyên bố là người đầu tiên cung cấp các tiện ích mở rộng
đa phương tiện, trong đó một bộ hướng dẫn mới tận dụng một ALU rộng duy nhất có
thể được phân vùng để nó sẽ hoạt động như một số ALU hẹp hơn hoạt động song
song. Tuy nhiên, không có gì xuất hiện trước năm 1957, khi máy tính Lincoln
LabTHER TX-2 cung cấp các hướng dẫn hoạt động trên ALU dưới dạng một thao tác
36 bit, hai thao tác 18 bit hoặc bốn thao tác 9 bit. Ivan Sutherland, được coi là Cha đẻ
của Đồ họa Máy tính, đã xây dựng hệ thống Phác thảo lịch sử của mình trên TX-2.
Trên thực tế, Sketchpad đã tận dụng các hướng dẫn SIMD này, mặc dù TX-2 xuất
hiện trước khi phát minh ra thuật ngữ SIMD vào năm 1972.

Các thí nghiệm sớm khác


Thật khó để phân biệt bộ nhân MIMD đầu tiên. Đáng ngạc nhiên, máy tính đầu
tiên của Tập đoàn Eckert-Mauchly, chẳng hạn, có các đơn vị trùng lặp
để cải thiện sẵn có.
Hai trong số các dự án đa xử lý được ghi nhận tốt nhất đã được thực hiện vào
những năm 1970 tại Đại học Carnegie Mellon. Đầu tiên trong số này là C.mmp, bao
gồm 16 PDP-11 được kết nối bằng một công tắc xà ngang thành 16 đơn vị bộ nhớ.
Nó là một trong những bộ xử lý đa xử lý đầu tiên có nhiều hơn một vài bộ xử lý và
nó có một mô hình lập trình bộ nhớ dùng chung. Phần lớn trọng tâm của nghiên cứu
trong dự án C.mmp là về phần mềm, đặc biệt là trong lĩnh vực HĐH. Một bộ xử lý
sau này, Cm *, là một bộ xử lý dựa trên cụm với bộ nhớ phân tán và thời gian truy
cập không đồng nhất. Sự vắng mặt của bộ nhớ cache và độ trễ truy cập từ xa dài
khiến cho việc đặt dữ liệu trở nên quan trọng. Nhiều ý tưởng trong các bộ xử lý này
sẽ được sử dụng lại vào những năm 1980, khi bộ vi xử lý làm cho nó rẻ hơn nhiều để
xây dựng bộ xử lý.
587.e4 6.16 Quan điểm lịch sử và đọc thêm

Cuộc tranh luận lớn trong xử lý song song


Việc quay lưng với tổ chức thông thường xuất hiện vào giữa những năm 1960,
khi luật lợi nhuận giảm dần bắt đầu có hiệu lực trong nỗ lực tăng tốc độ hoạt
động của máy tính.... Các mạch điện tử cuối cùng bị giới hạn về tốc độ hoạt
động của chúng bởi tốc độ ánh sáng ... và nhiều mạch đã hoạt động trong
phạm vi nano giây.
W. Jack Bouknight et al.
Hệ thống Illiac IV [1972]

… các máy tính tuần tự đang tiến gần đến một giới hạn vật lý cơ bản về sức
mạnh tính toán tiềm năng của chúng. Giới hạn như vậy là tốc độ ánh sáng ...
Thiên thần L. DeCegama
Công nghệ xử lý song song, Tập I [1989]

… ngày nay bộ xử lý đa năng ... đang gần bế tắc khi các công nghệ tiếp cận
tốc độ ánh sáng. Ngay cả khi các thành phần của bộ xử lý tuần tự có thể được
tạo ra để hoạt động nhanh như vậy, thì điều tốt nhất có thể được mong đợi là
không quá vài triệu hướng dẫn mỗi giây.
David Mitchell
Transputer: Thời gian là bây giờ [1989]

Các trích dẫn ở trên đưa ra các lập luận cổ điển để từ bỏ hình thức điện toán hiện
tại và Amdahl [1967] đã trả lời cổ điển để hỗ trợ tiếp tục tập trung vào kiến trúc
IBM 360. Các lập luận cho các lợi thế của việc thực hiện song song có thể được
truy nguyên từ thế kỷ 19 [Menabrea, 1842]Ngoài những cuộc tranh luận về
những lợi thế và hạn chế của song song, một số cuộc tranh luận nóng bỏng đã tập
trung vào cách xây dựng bộ xử lý đa xử lý!
Từ quan điểm ngày hôm nay, rõ ràng tốc độ ánh sáng không phải là bức tường gạch; thay
vào đó, bức tường gạch là mức tiêu thụ năng lượng của CMOS khi tốc độ đồng hồ tăng.
Nó khó có thể dự đoán tương lai, nhưng vào năm 1989 Gordon Bell đã đưa ra hai dự đoán
cho
1995. Chúng tôi bao gồm những dự đoán này trong phiên bản đầu tiên của Kiến trúc
máy tính : Một cách tiếp cận định lượng, khi kết quả hoàn toàn không rõ ràng. Chúng
tôi thảo luận chúng trong phần này, cùng với một đánh giá về tính chính xác của dự
đoán.
Đầu tiên là một máy tính có khả năng duy trì một tera FLOPS, một triệu MFLOPS,
sẽ được chế tạo vào năm 1995, sử dụng một máy tính đa năng với các nút 4K đến
32K hoặc Bộ xử lý kết nối với vài triệu thành phần xử lý. Để đưa dự đoán này vào
viễn cảnh, mỗi năm Giải thưởng Gordon Bell thừa nhận những tiến bộ trong song
song, bao gồm cả chương trình thực nhanh nhất (MFLOPS cao nhất). Năm 1989,
người chiến thắng đã sử dụng Cray Y-MP tám bộ xử lý để chạy ở 1680 MFLOPS.
Trên cơ sở những con số này, bộ đa xử lý và chương trình sẽ phải được cải thiện với
hệ số 3,6 mỗi năm để chương trình nhanh nhất đạt được 1 TFLOPS vào năm 1995.
Năm 1999, người chiến thắng giải thưởng Gordon Bell đầu tiên đã vượt qua thanh 1
TFLOPS.
6.16 Quan điểm lịch sử và đọc thêm 587.e5

Sử dụng hệ thống IBM RS / 6000 SST 5832 được thiết kế đặc biệt cho Phòng thí
nghiệm Livermore, họ đã đạt được 1,18 TFLOPS trên mô phỏng sóng xung kích. Tỷ
lệ này thể hiện sự cải thiện hàng năm là 1,93, vẫn còn khá ấn tượng.
Điều được công nhận từ những năm 1990 là mặc dù chúng ta có thể có công
nghệ để chế tạo bộ đa xử lý TFLOPS, nhưng không rõ máy này có hiệu quả về
chi phí, ngoại trừ một vài ứng dụng rất chuyên biệt và cực kỳ quan trọng liên
quan đến an ninh quốc gia. Chúng tôi ước tính vào năm 1990 rằng việc đạt được
1 TFLOPS sẽ cần một máy có khoảng 5000 bộ xử lý và sẽ có giá khoảng 100
triệu đô la. Hệ thống IBM 5832-bộ xử lý tại Livermore có giá 110 triệu đô la.
Như có thể dự kiến, những cải tiến về hiệu suất của từng bộ vi xử lý cả về chi phí
và hiệu suất ảnh hưởng trực tiếp đến chi phí và hiệu suất của bộ đa xử lý quy mô
lớn, nhưng hệ thống 5000 bộ xử lý sẽ có giá gấp hơn 5000 lần hệ thống máy tính
để bàn sử dụng cùng một bộ xử lý. Kể từ thời điểm đó, bộ đa xử lý nhanh hơn
nhiều đã được chế tạo, nhưng những cải tiến lớn đã ngày càng đến từ các bộ xử
lý gần đây, thay vì những đột phá cơ bản trong kiến trúc song song.
Dự đoán thứ hai của Bell liên quan đến số lượng luồng dữ liệu trong các siêu
máy tính được vận chuyển vào năm 1995. Danny Hillis tin rằng mặc dù các siêu
máy tính có số lượng luồng dữ liệu nhỏ có thể là người bán tốt nhất, nhưng bộ đa
xử lý lớn nhất sẽ là bộ đa xử lý với nhiều luồng dữ liệu và chúng sẽ thực hiện
phần lớn các tính toán. Bell đặt cược Hillis rằng trong quý cuối năm dương lịch
1995, MFLOPS bền vững hơn sẽ được vận chuyển trong bộ đa xử lý bằng cách
sử dụng một vài luồng dữ liệu (<100) thay vì nhiều luồng dữ liệu (> 1000). Đặt
cược này chỉ liên quan đến siêu máy tính, được định nghĩa là bộ đa xử lý có giá
hơn 1 triệu đô la và được sử dụng cho các ứng dụng khoa học. MFLOPS được
duy trì đã được xác định cho đặt cược này là số lượng hoạt động thả nổi mỗi
tháng, do đó tính khả dụng của bộ xử lý ảnh hưởng đến xếp hạng của họ.
Năm 1989, khi đặt cược này được thực hiện, hoàn toàn không rõ ai sẽ thắng. Năm
1995, một cuộc khảo sát về các siêu máy tính được biết đến công khai hiện tại chỉ
cho thấy sáu bộ xử lý tồn tại trên thế giới với hơn 1000 luồng dữ liệu, vì vậy dự đoán
của Bell là một người chiến thắng rõ ràng. Trên thực tế, vào năm 1995, các bộ vi xử
lý dựa trên bộ vi xử lý nhỏ hơn nhiều (bộ xử lý <20) đã trở nên chiếm ưu thế.
Năm 1995, cuộc khảo sát Top 500 trong số 500 bộ nhân hiệu suất cao nhất
cho thấy số lượng bộ nhân lớn nhất là bộ nhân bộ nhớ chia sẻ dựa trên xe buýt!
Đến năm 2005, các cụm hoặc máy tính đa năng khác nhau đóng một vai trò lớn.
Ví dụ: trong 25 hệ thống hàng đầu, 11 là các cụm tùy chỉnh, chẳng hạn như hệ
thống IBM Blue Gene hoặc Cray XT3, 10 là các cụm bộ nhân bộ nhớ dùng
chung (cả sử dụng bộ nhớ phân tán và tập trung) và bốn cụm còn lại được xây
dựng sử dụng PC có kết nối ngoài kệ.
587.e6 6.16 Quan điểm lịch sử và đọc thêm

Những tiến bộ và phát triển gần đây


Ngoại trừ chính bộ đa xử lý vector song song và gần đây là thiết kế IBM Blue
Gene, tất cả các máy tính MIMD hiện đại khác đã được chế tạo từ bộ vi xử lý
ngoài luồng bằng cách sử dụng bus và bộ nhớ trung tâm logic hoặc mạng kết nối
và bộ nhớ phân tán . Một số bộ xử lý đa xử lý thử nghiệm được xây dựng vào
những năm 1980 đã tiếp tục cải tiến và nâng cao các khái niệm tạo thành nền tảng
cho nhiều bộ xử lý đa xử lý ngày nay.

Sự phát triển của bộ đa xử lý mạch lạc dựa trên xe buýt


Mặc dù các máy tính lớn rất lớn được chế tạo với nhiều bộ xử lý trong những
năm 1960 và 1970, bộ xử lý đa xử lý đã không thành công cao cho đến những
năm 1980. Chuông [1985] gợi ý chìa khóa là kích thước nhỏ hơn của bộ vi xử lý
được phép bus bộ nhớ để thay thế phần cứng mạng kết nối và các hệ điều hành di
động có nghĩa là các dự án đa bộ xử lý không còn yêu cầu phát minh ra một hệ
điều hành mới. Trong bài viết này, Bell đã định nghĩa các thuật ngữ đa bộ xử lý
và đa máy tính và tạo tiền đề cho hai cách tiếp cận khác nhau để xây dựng bộ đa
xử lý quy mô lớn hơn. Bộ nhân xử lý dựa trên xe buýt đầu tiên với bộ đệm rình
mò là Synapse N + 1 vào năm 1984.
Đầu những năm 1990 chứng kiến sự khởi đầu của việc mở rộng các hệ thống
như vậy với việc sử dụng rất rộng, xe buýt tốc độ cao (hệ thống SGI Challenge
đã sử dụng 256 bit, bus định hướng gói hỗ trợ tối đa tám bảng xử lý và 32 bộ xử
lý) và sau đó là việc sử dụng nhiều xe buýt và kết nối xà ngang, ví dụ, trong các
hệ thống Sun SPARCCenter và Enterprise. Năm 2001, các máy chủ Sun
Enterprise đại diện cho ví dụ chính về bộ xử lý quy mô lớn (> 16), bộ đa xử lý
đối xứng trong sử dụng tích cực.

Hướng tới bộ đa xử lý quy mô lớn


Trong nỗ lực xây dựng bộ đa xử lý quy mô lớn, hai hướng khác nhau đã được
khám phá: đa máy tính truyền thông điệp và bộ đa xử lý bộ nhớ chia sẻ có thể mở
rộng. Mặc dù đã có nhiều nỗ lực để xây dựng bộ đa xử lý kết nối lưới và
hypercube, một trong những bộ đa xử lý đầu tiên kết hợp thành công tất cả các
mảnh là Khối vũ trụ được xây dựng tại Caltech [Seitz , 1985]Nó giới thiệu những
tiến bộ quan trọng trong công nghệ định tuyến và kết nối. và giảm đáng kể chi phí
của kết nối, giúp làm cho máy tính đa năng có thể tồn tại. Intel iPSC 860, bộ sưu
tập i860 được kết nối hypercube, dựa trên những ý tưởng này. Nhiều bộ xử lý gần
đây, chẳng hạn như Intel Paragon, đã sử dụng các mạng có kích thước thấp hơn
và các liên kết riêng lẻ cao hơn. Paragon cũng sử dụng một i860 riêng biệt làm bộ
điều khiển truyền thông trong mỗi nút, mặc dù một số người dùng đã thấy tốt hơn
khi sử dụng cả bộ xử lý i860 để tính toán cũng như giao tiếp. Thinking Machines
CM-5 đã sử dụng bộ vi xử lý sẵn có. Nó cung cấp quyền truy cập cấp người dùng
vào kênh truyền thông, cải thiện đáng kể độ trễ giao tiếp. Năm 1995, hai bộ xử lý
này đại diện cho tình trạng của nghệ thuật trong các máy tính đa năng truyền
thông điệp.
6.16 Quan điểm lịch sử và đọc thêm 587.e7

Các cụm
Các cụm có lẽ đã được phát minh ra vào những năm 1960 bởi những khách hàng
không thể phù hợp với tất cả công việc của họ trên một máy tính hoặc những người
cần một máy dự phòng trong trường hợp máy chính bị hỏng [Pfister, 1998]Tandem
đã giới thiệu cụm 16 nút vào năm 1975. Kỹ thuật số theo sau với các cụm VAX,
được giới thiệu vào năm 1984. Chúng ban đầu là các máy tính độc lập chia sẻ các
thiết bị I / O, yêu cầu một hệ điều hành phân tán để phối hợp hoạt động. Chẳng mấy
chốc, họ đã có các liên kết giao tiếp giữa các máy tính, một phần để các máy tính có
thể được phân phối theo địa lý để tăng tính khả dụng trong trường hợp xảy ra thảm
họa tại một trang web. Người dùng đã đăng nhập vào cụm và không biết họ đang sử
dụng máy nào. DEC (nay là HP) đã bán được hơn 25.000 cụm vào năm 1993. Các
công ty ban đầu khác là Tandem (nay là HP) và IBM (vẫn là IBM). Công ty hầu như
có sản phẩm cụm. Hầu hết các sản phẩm này đều nhằm mục đích sẵn có, với hiệu
suất mở rộng như một lợi ích thứ yếu.
Điện toán khoa học trên các cụm nổi lên như một đối thủ cạnh tranh với MPPs.
Năm 1993, dự án Beowulf bắt đầu với mục tiêu hoàn thành mong muốn của
NASA về một máy tính 1 GFLOPS với giá dưới 50.000 đô la. Năm 1994, một
cụm 16 nút được xây dựng từ các PC ngoài luồng sử dụng 80486 đã đạt được
mục tiêu đó. Sự nhấn mạnh này đã dẫn đến một loạt các giao diện phần mềm để
giúp dễ dàng gửi, phối hợp và gỡ lỗi các chương trình lớn hoặc một số lượng lớn
các chương trình độc lập.
Những nỗ lực đã được thực hiện để giảm độ trễ của giao tiếp trong các cụm
cũng như để tăng băng thông và một số dự án nghiên cứu đã giải quyết vấn đề đó.
(Một kết quả thương mại của nghiên cứu độ trễ thấp là tiêu chuẩn giao diện VI,
được Infiniband chấp nhận, được thảo luận dưới đây.) Độ trễ thấp sau đó tỏ ra
hữu ích trong các ứng dụng khác. Ví dụ, vào năm 1997, một cụm gồm 100 máy
tính để bàn UltraSPARC tại U.C. Berkeley, được kết nối bởi 160 MB / giây trên
mỗi liên kết Công tắc Myrinet, đã được sử dụng để thiết lập các kỷ lục thế giới
trong sắp xếp cơ sở dữ liệu (sắp xếp 8,6 GB dữ liệu ban đầu trên đĩa trong 1 phút)
và trong việc bẻ khóa một tin nhắn được mã hóa (chỉ mất 3,5 giờ để giải mã khóa
DES 40 bit).
Dự án nghiên cứu này, được gọi là Network of Workstations, cũng đã phát
triển công cụ tìm kiếm Inktomi, dẫn đến một công ty khởi nghiệp có cùng tên.
Google đã làm theo ví dụ của Inktomi để xây dựng các công cụ tìm kiếm từ các
cụm máy tính để bàn, thay vì SMP quy mô lớn, là chiến lược của công cụ tìm
kiếm hàng đầu, Alta Vista, mà Google đã tiếp quản. Năm 2020, tất cả các dịch vụ
Internet đều dựa vào các cụm để phục vụ hàng triệu khách hàng của họ.
Các cụm cũng phổ biến với các nhà khoa học. Một lý do là chi phí thấp của họ,
cho phép các nhà khoa học cá nhân hoặc các nhóm nhỏ sở hữu một cụm dành
riêng cho các chương trình của họ. Các cụm như vậy có thể nhận được kết quả
nhanh hơn so với chờ đợi trong hàng dài công việc của các MPP được chia sẻ tại
các trung tâm siêu máy tính, có thể kéo dài đến vài tuần.
Đối với những người quan tâm đến việc học thêm , Pfister [1998] đã viết một
cuốn sách giải trí trên các cụm.

Xu hướng gần đây trong bộ đa xử lý quy mô lớn


Vào giữa những năm 1990, rõ ràng là sự tăng trưởng hy vọng trên thị trường điện
toán song song siêu lớn không có khả năng xảy ra. Không có sự tăng trưởng thị
trường này, ngày càng rõ ràng rằng điện toán song song cao cấp
587.e8 6.16 Quan điểm lịch sử và đọc thêm

thị trường quá nhỏ để hỗ trợ chi phí cho phần cứng và phần mềm tùy chỉnh cao được
thiết kế cho một thị trường nhỏ. Có lẽ xu hướng quan trọng nhất để đưa ra quan sát
này là phân cụm sẽ được sử dụng để đạt mức hiệu suất cao nhất. Hiện có ba lớp đa
xử lý quy mô lớn :
1. Các cụm tích hợp bo mạch chủ máy tính để bàn tiêu chuẩn bằng công nghệ
kết nối, chẳng hạn như Ethernet hoặc Infiniband
2. Máy tính đa năng được chế tạo từ các bộ vi xử lý tiêu chuẩn được cấu hình
thành các phần tử xử lý và được kết nối với một kết nối tùy chỉnh, chẳng
hạn như IBM Blue Gene
3. Các cụm máy tính bộ nhớ dùng chung quy mô nhỏ, có thể có hỗ trợ vector,
bao gồm cả Trình mô phỏng Trái đất
Blue Gene được xây dựng bằng cách sử dụng một chip tùy chỉnh bao gồm bộ vi xử
lý PowerPC nhúng cung cấp một nửa hiệu suất của PowerPC cao cấp, nhưng ở một
phần nhỏ hơn nhiều của khu vực và công suất. Điều này cho phép nhiều chức năng hệ
thống hơn, bao gồm cả kết nối toàn cầu, được tích hợp vào cùng một khuôn.

Nhìn xa hơn
Có một lượng thông tin gần như không giới hạn về bộ xử lý đa xử lý và máy tính đa
năng: hội nghị, tạp chí và thậm chí cả sách dường như xuất hiện nhanh hơn bất kỳ
người nào có thể tiếp thu ý tưởng. Không còn nghi ngờ gì nữa, nhiều bài báo trong số
này sẽ không được chú ý, không giống như quá khứ. Hầu hết các hội nghị kiến trúc
lớn đều chứa các bài báo về bộ vi xử lý. Một hội nghị thường niên, SC XY (trong đó
X và Y là hai chữ số cuối cùng của năm), quy tụ người dùng, kiến trúc sư, nhà phát
triển phần mềm và nhà cung cấp và xuất bản các thủ tục tố tụng trong sách, CD-
ROM và trực tuyến (xem www.scXY.org) hình thức. Hai tạp chí lớn , Tạp chí song
song và phân phối Máy tính và Giao dịch IEEE trên các hệ thống song song và phân
tán, chứa đựng giấy tờ về tất cả các khía cạnh của xử lý song song. Một số cuốn sách
tập trung vào xử lý song song được bao gồm trong các tài liệu tham khảo sau đây.
Asanovic và cộng sự. [2006] khảo sát những thách thức trên phạm vi rộng cho
ngành công nghiệp thử thách đa lõi này. Báo cáo đó có thể hữu ích trong việc
hiểu chiều sâu của những thách thức khác nhau.
Ngoài việc ghi lại việc khám phá các khái niệm hiện được sử dụng trong thực
tế, các tài liệu tham khảo này cũng cung cấp các mô tả về nhiều ý tưởng đã được
khám phá và tìm thấy mong muốn, cũng như các ý tưởng mà thời gian chưa đến.
Với động thái hướng tới đa lõi và đa bộ xử lý là tương lai của kiến trúc máy tính
hiệu suất cao, chúng tôi hy vọng rằng nhiều cách tiếp cận mới sẽ được khám phá
trong những năm tới. Một vài trong số họ sẽ quản lý để giải quyết các vấn đề
phần cứng và phần mềm là chìa khóa để sử dụng đa xử lý trong 40 năm qua!
6.16 Quan điểm lịch sử và đọc thêm 587.e9

Lịch sử của kiến trúc tên miền cụ thể


Một ví dụ về DSA cho mô phỏng có từ năm 1990 [Agrawal, 1990]. Các chip giả
lập này đã mô hình hóa các chip VLSI ở cấp cổng và cải thiện hiệu suất khoảng
50 lần so với máy tính lớn chạy trình giả lập phần mềm chất lượng sản xuất trong
khi vẫn giữ được độ chính xác như nhau.
Hai bài báo khảo sát cho thấy DSA cho DNN cũng cũ như vậy [Ienne, 1996;
Asanović, 2002]. Ví dụ, vào năm 1990, chip CNAPS chứa một mảng 64 SIMD Hệ số
nhân 16 bit và 8 bit và một số chip CNAPS có thể được kết nối cùng với bộ giải mã
[Hammerstrom, 1990]. Hai mươi lăm máy trạm SPERT-II, được tăng tốc bởi ASIC
tùy chỉnh T0, đã được triển khai bắt đầu từ năm 1995 để làm cả hai
NN đào tạo và suy luận để nhận dạng giọng nói [Asanović, 1998]. 40-Mhz T0 đã
thêm các hướng dẫn vector vào MIPS ISA. Đơn vị vectơ tám làn có thể tạo ra kết
quả số học 32 bit cho mỗi chu kỳ xung nhịp dựa trên các đầu vào 8 bit và 16 bit,
giúp nó suy luận nhanh hơn 25 lần và đào tạo nhanh hơn 20 lần so với máy trạm
SPARC-20. Gần đây, gia đình DianNao gồm bốn kiến trúc DNN giảm thiểu truy
cập bộ nhớ cả trên chip và DRAM bên ngoài bằng cách hỗ trợ kiến trúc hiệu quả
cho các mẫu truy cập bộ nhớ trong các ứng dụng DNN [Chen, 2016].
DSA dường như là một trường hợp sử dụng tốt cho các FPGA như một nền tảng
điện toán trong các trung tâm dữ liệu. Một ví dụ được triển khai là Catapult [Putnam,
2016]. Catapult đã triển khai Stratix V FPGA vào các trung tâm dữ liệu của Microsoft
đồng thời với TPUv1 vào năm 2015. Có lẽ sự khác biệt đáng kể nhất giữa Catapult và
TPU là để đạt được hiệu suất tốt nhất, người dùng phải viết các chương trình bằng
ngôn ngữ thiết kế phần cứng cấp thấp Verilog so với các chương trình chuyển bằng
khung TensorFlow cấp cao; đó là, Khả năng lập trình lại của cải tiến, xuất phát từ
phần mềm chuyển nhượng cho TPUv1 thay vì viết phần sụn từ đầu cho FPGA nhanh
nhất .
Không còn nghi ngờ gì nữa, ngày mà ngành công nghiệp đánh thức tầm quan
trọng thương mại của DSA đối với DNN là ngày 18 tháng 5 năm 2016, khi Giám đốc
điều hành Google Google công bố [Jouppi, 2018]:
Chúng tôi đã chạy TPU trong các trung tâm dữ liệu của chúng tôi trong hơn
một năm và đã tìm thấy chúng để cung cấp một mức hiệu suất được tối ưu hóa
tốt hơn trên mỗi watt cho việc học máy.
Trong năm tới, hàng chục công ty khởi nghiệp đã được thành lập để xây dựng
DSA cho DNN và Intel đã mua lại một vài công ty DSA DNN. Chúng tôi đang
bắt đầu thấy thành quả của hàng tỷ đô la đầu tư vào DSA cho DNN vào năm
2020.
587.e10 6.16 Quan điểm lịch sử và đọc thêm

Đọc thêm
Agrawal P. và W. J. Dally [1990]. Một hệ thống mô phỏng logic phần cứng , Giao dịch của IEEE trên máy
tính hỗ trợ thiết kế các mạch và hệ thống tích hợp 9 (1): 19 trận29.
Almasi, G. S. và A. Gottlieb [1989]. Tính toán song song cao, Benjamin / Cummings, Thành phố Redwood, CA .

Một cuốn sách giáo khoa bao gồm các máy tính song song.
Amdahl, G. M. [1967]. Hiệu lực của phương pháp xử lý đơn để đạt được khả năng tính toán quy mô lớn,
trực tiếp Proc. Máy tính chung mùa xuân AFIPS Conf., Thành phố Atlantic, NJ (Tháng Tư), 483 Từ85.
Được viết để đáp lại những tuyên bố của Illiac IV, bài viết dài ba trang này mô tả luật Amdahl và đưa ra
câu trả lời cổ điển cho các lập luận về việc từ bỏ hình thức điện toán hiện tại.
Andrew, G. R. [1991]. Lập trình đồng thời: Nguyên tắc và thực hành, Benjamin / Cummings, Thành phố
Redwood, CA .
Một văn bản đưa ra các nguyên tắc lập trình song song.

Archibald, J. và J. -L. Baer [1986]. Các giao thức kết hợp bộ đệm của bộ đệm: Đánh giá bằng mô hình mô
phỏng đa bộ xử lý, , ACM Trans. trên hệ thống máy tính 4 (tháng 11), 273 bóng98.
Tài liệu khảo sát cổ điển về các giao thức kết hợp bộ đệm bus chia sẻ.
Arpaci-Dusseau, A., R. Arpaci-Dusseau, D. Culler, J. Hellerstein và D. Patterson [1997]. Sắp xếp hiệu suất
cao trên mạng của máy trạm, Proc Proc. Hội nghị ACM SIG MOD / PODS về Quản lý dữ liệu, Tucson,
AZ (tháng 5), 12 trận15.
Cách sắp xếp kỷ lục thế giới được thực hiện trên một cụm, bao gồm phê bình kiến trúc của máy trạm và giao diện mạng.
Đến ngày 1 tháng 4 năm 1997, họ đã đẩy kỷ lục lên 8,6 GB trong 1 phút và 2,2 giây để sắp xếp 100 MB .

Asanovic ́, K. [2002]. Lập trình thần kinh. Trong: Arbib M. A., biên tập viên : Cẩm nang lý thuyết não và
Mạng thần kinh, Phiên bản thứ hai, Cambridge, MA, (tháng 11), MIT Press. (edu /∼krste / giấy tờ / máy
tính thần kinh.pdf. https://people.eecs.ber siêu).
Asanović, K., Beck, Johnson J, J. Wawrzynek, B. Kingsbury, N. Morgan. [1998]. Đào tạo Mạng lưới thần
kinh với Spert-II. Chương 11. Trong:Nghịch lý và triển khai N. Sundararajan và P. Saratchandran, biên tập
viên :. Kiến trúc song song cho mạng nhân tạo, Nhà xuất bản Xã hội Máy tính IEEE, (Tháng 11). (ISBN
0-8186-8399-6). https://people.eecs.ber siêu.edu/∼krste / giấy tờ / năm.pdf.
Asanovic, K., R. Bodik, B. C. Catanzaro, J. J. Gebis, P. Chồng, K. Keutzer, D. A. Patterson, W. L. Plishker, J. Shalf, S. W.
Williams và K. A. Yelick. [2006]. Cảnh quan của nghiên cứu điện toán song song: Một góc nhìn từ Berkeley.Công nghệ
cao. Đại diện. UCB / EECS-2006-183, Khoa EECS, Đại học California, Berkeley (ngày 18 tháng 12).

Biệt danh là Chế độ xem Berkeley Berkeley, báo cáo này đưa ra bối cảnh của thử thách đa lõi.

Bailey, D. H., E. Barszcz, J. T. Barton, D. S. Browning, R. L. Carter, L. Dagum, R. A. Fatoohi, P. O.


Frederickson, T. A. Lasinski, R. S. Schreiber, H. D. Simon, V. Venkatakrishnan và S. K. Weeratunga.
[1991]. Các điểm chuẩn song song của NAS Tóm tắt và kết quả sơ bộ, trực tiếp Kỷ yếu của hội nghị ACM
/ IEEE năm 1991 về Siêu máy tính (Tháng Tám).
Mô tả các điểm chuẩn song song NAS.
Chuông, C. G. [1985]. Đa số: Một lớp máy tính đa xử lý mới, trực tiếp Khoa học 228 (ngày 26 tháng 4):
462 bóng467.
Phân biệt địa chỉ chia sẻ và bộ nhân địa chỉ không được chia sẻ dựa trên bộ xử lý vi mô.

Bienia, C., S. Kumar, J. P. Singh và K. Li [2008]. Bộ tiêu chuẩn PARSEC: đặc trưng và ý nghĩa kiến trúc,
Báo cáo kỹ thuật của Đại học Princeton Princeton TR-81 1-008 (tháng 1).
Mô tả các điểm chuẩn song song PARSEC. Cũng xem http://parsec.cs.princeton.edu/.
6.16 Quan điểm lịch sử và đọc thêm 587.e11

Bouknight, W. J., Denenberg, S. A., McIntyre, D. E., Randall, J. M., Sameh, A. H., và Slotnick, D. L. [1972].
Hệ thống Illiac IV , Thủ tục tố tụng của IEEE, 60 (4), 369 Từ388.
Điều này mô tả siêu máy tính SIMD khét tiếng nhất.

Chen, Y., T. Chen, Z. Xu, N. Sun và O. Teman. [2016]. Gia đình DianNao: Phần cứng tiết kiệm năng lượng
máy gia tốc cho máy học , Cộng đồng. ACM 59 (11): 105 bóng112 (tháng 11).
Culler, D. E. và J. P. Singh, với A. Gupta [1998]. Kiến trúc máy tính song song, Morgan Kaufmann, San
Francisco.
Một cuốn sách giáo khoa về máy tính song song.
Dongarra, J. J., J. R. Bunch, G. B. Moler, G. W. Stewart [1979]. Hướng dẫn sử dụng LINPACK, Hội Toán
học công nghiệp.
Tài liệu gốc mô tả Linpack, đã trở thành một dấu hiệu băng ghế song song được sử dụng rộng rãi.
Falk, H. [1976]. Tiếp cận với gigaflop, trực tiếp Phổ biến IEEE 13: 10 (tháng 10), 65 trận70.
Biên niên sử câu chuyện buồn về Illiac IV: bốn lần chi phí và ít hơn một phần mười hiệu suất của các mục
tiêu ban đầu.
Flynn, M. J. [1966]. Hệ thống máy tính tốc độ cao rất cao, trực tiếp Proc. IEEE 54 12 (tháng 12), 1901 Từ1909.
Bài viết cổ điển hiển thị phân loại SISD / SIMD / MISD / MIMD.
Hammerstrom, D. [1990]. Một kiến trúc VLSI cho học tập hiệu suất cao, chi phí thấp, trên chip. Trong: Thủ tục tố
tụng của Hội nghị chung quốc tế về mạng lưới thần kinh, San Diego, CA, Báo chí IEEE. (17 tháng 62121).
Hennessy, J. và D. Patterson [2019]. Chương 6 và 8 trong Kiến trúc máy tính: Cách tiếp cận định lượng,
phiên bản thứ sáu, Morgan Kaufmann, Cambridge, MA .
Một phạm vi bảo hiểm sâu hơn về một loạt các chủ đề đa bộ xử lý và cụm, bao gồm các chương trình và phép đo.

Henning, J. L. [2007]. Tăng trưởng bộ CPU SPEC: một viễn cảnh lịch sử , Tin tức kiến trúc máy tínhTập.
35, không. 1 (Tháng 3).
Cung cấp lịch sử của Spec, bao gồm việc sử dụng Specrate để đo lường hiệu suất đối với các công việc
độc lập, đang được sử dụng làm chuẩn mực song song.
Hillis, W. D. [1989]. Máy kết nốiBáo chí MIT.
Luận án tiến sĩ tạo vỏ cho máy tính SIMD 1 bit.

Hord, R. M. [1982]. Illiac-IV, siêu máy tính đầu tiên, Nhà xuất bản Khoa học Máy tính, Rockville, MD .
Một kế toán lịch sử của dự án Illiac IV.
Hwang, K. [1993]. Kiến trúc máy tính tiên tiến với lập trình song song, McGraw-Hill, New York.

Ienne, P., T. Cornu, G. Kuhn. [1996]. Phần cứng kỹ thuật số chuyên dùng cho mạng thần kinh: Một kiến trúc
khảo sát, Tạp chí Hệ thống xử lý tín hiệu VLSI cho công nghệ tín hiệu, hình ảnh và video 13 (1): 5 trận25.
Jouppi, N. [2018]. Google siêu nạp các tác vụ học máy với chip tùy chỉnh TPU. https://cloud.google.com/ blog /
sản phẩm / gcp / google-supercharges-machine-learning-task-with-tùy chỉnh-chip, (16 tháng 5).
Một cuốn sách giáo khoa khác bao gồm các máy tính song song.
Kozyrakis, C. và D. Patterson [2003]. Bộ xử lý vector có thể mở rộng cho các hệ thống nhúng , IEEE
Micro 23: 6 (Tháng 11, tháng 12), 36 trận45.
Kiểm tra kiến trúc vectơ cho tập lệnh MIPS trong phương tiện và xử lý tín hiệu.
587.e12 6.16 Quan điểm lịch sử và đọc thêm

Menabrea, L. F. [1842]. Phác thảo của động cơ phân tích được phát minh bởi Charles Babbage ',
Bibliothèque Universelle de Genève (Tháng Mười).
Chắc chắn là tài liệu tham khảo sớm nhất về bộ đa xử lý, nhà toán học này đã đưa ra nhận xét này trong
khi dịch các bài báo trên máy tính cơ Babbage.
Pfister, G. F. [1998]. Trong Tìm kiếm các cụm: Trận chiến sắp tới trong tính toán song song thấp, phiên
bản thứ hai, Hội trường Prentice, Thượng Yên River, NJ .
Putnam, A, et al. [2016]. Một loại vải có thể cấu hình lại để tăng tốc các dịch vụ trung tâm dữ
liệu quy mô lớn , Cộng đồng. ACM 59 (11): 114 Từ122 (tháng 11).
Một cuốn sách giải trí ủng hộ các cụm và chỉ trích các bộ xử lý đa năng của NUMA.
Regnier, G., S. Makineni, I. Illikkal, R. Iyer, D. Minturn, R. Huggahalli và A. Foong [2004]. TCP đang tải
cho các máy chủ trung tâm dữ liệu. Máy vi tính, 37 (11), 48 bóng58.
Một bài viết mô tả lợi ích của việc thực hiện TCP / IP bên trong máy chủ so với. phần cứng bên ngoài.
Seitz, C. [1985]. Khối vũ trụ khối , Thông tin. ACM 28 1 (tháng 1), 22 trận31.
Một bài viết hướng dẫn về một bộ xử lý song song được kết nối thông qua một hypertree. Cosmic Cube là
tổ tiên của siêu máy tính Intel.
Slotnick, D. L. [1982]. Quan niệm và phát triển bộ xử lý song song Một cuốn hồi ký cá nhân , Biên niên sử
của Lịch sử điện toán 4: 1 (tháng 1), 20 trận30.
Hồi ức về sự khởi đầu của việc xử lý song song bởi kiến trúc sư của Illiac I V .
Williams, S., J. Carter, L. Oliker, J. Shalf và K. Yelick [2008]. Tối ưu hóa mô phỏng của Lattice Boltzmann trên
các nền tảng đa lõi hàng đầu, trực tiếp Hội nghị chuyên đề xử lý song song và phân tán quốc tế (IPDPS).
Giấy chứa kết quả của bốn đa số cho LBMHD .

Williams, S., L. Oliker, R. Vuduc, J. Shalf, K. Yelick và J. Demmel [2007]. Tối ưu hóa phép nhân vectơ
ma trận thưa thớt trên các nền tảng đa lõi mới nổi, trực tiếp Siêu máy tính (SC).
Giấy chứa kết quả của bốn đa số cho SPmV .
Williams, S. [2008]. Hiệu suất tự động của máy tính đa lõi, Bằng tiến sĩ. Luận án, U.C. Berkeley.
Luận án có chứa mô hình mái nhà.
Woo, S. C., M. Ohara, E. Torrie, J. P. Singh và A. Gupta. Các chương trình SPLASH-2: đặc tính và cân
nhắc phương pháp, trực tiếp Kỷ yếu của Hội nghị chuyên đề quốc tế thường niên lần thứ 22 về máy tính
Kiến trúc (ISCA Hiện 95), Tháng 5, 24 trận36.
Bài viết mô tả phiên bản thứ hai của các tiêu chuẩn song song Stanford.
588 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Tài liệu tham khảo


B. F. Cooper, A. Silberstein, E. Tam, R. Ramakrishnan, R. Sears. Các hệ thống
phục vụ đám mây chuẩn với YCSB, Trong: Kỷ yếu của Hội nghị chuyên đề
ACM lần thứ nhất về điện toán đám mây, ngày 10 tháng 6 năm111, 2010,
Indianapolis, Indiana, Hoa Kỳ, doi: 10.1145 / 1807128.1807152.
G. Regnier, S. Makineni, R. Illikkal, R. Iyer, D. Minturn, R. Huggahalli, D.
Newell, L. Cline và A. Foong. TCP đang tải cho các máy chủ trung tâm dữ liệu.
Máy tính IEEE, 37 (11): 48 Hàng58, 2004.

6.17 Tự học

DSA đang dẫn đến nhiều tùy chọn điện toán hơn và nhu cầu lớn hơn để so sánh
chi phí của các lựa chọn thay thế. Ví dụ: cách chúng ta so sánh chi phí chạy
chương trình trên CPU đa năng, GPU hoặc FPGA? Chi phí theo truyền thống rất
khó đo lường, vì giá niêm yết có thể không phải là thứ khách hàng thực sự phải
trả, đặc biệt nếu họ đang mua một số lượng lớn máy tính.
Giá nhiều mâyMột thị trường nơi giá cả cố định và công khai cho tất cả mọi
người. là đám mây. Chuyển đến nhà cung cấp đám mây yêu thích và tìm chi phí hàng
giờ hiện tại để thuê CPU, FPGA và GPU. Ví dụ: tại AWS năm 2020, ví dụ như
trường hợp
■ CPU: r5.2xlarge
■ FPGA: f1.2xlarge
■ GPU: p3.2xlarge
Giá cho thuê của FPGA và GPU so với CPU là bao nhiêu?
Genome tăng cườngMột ước tính là tổng số người có. bộ gen đã được giải
trình tự là khoảng 1 triệu vào năm 2020. Chi phí giảm của trình tự bộ gen có thể
dẫn đến nhu cầu lớn để phân tích dữ liệu giải trình tự thô. Một bài báo của Lisa
Wu et al. [Wu19] đã sử dụng DSA được triển khai trong FPGA để tăng tốc phân
tích bộ gen quan trọng từ 42 giờ trên CPU lên 31 phút trên FPGA. Mặc dù Wu và
cộng sự. đã hoài nghi rằng chương trình sẽ chạy nhanh hơn trên GPU do mất cân
bằng tải giữa các luồng, vì lợi ích của tranh luận, chúng ta hãy giả sử nó chạy
nhanh gấp ba lần trên GPU như trên CPU. Sử dụng câu trả lời của bạn cho Giá
Mây, chi phí để sắp xếp một bộ gen trên mỗi nền tảng là gì? Chi phí của FPGA
và GPU so với CPU là bao nhiêu?
Bộ gen thực sự tăng cườngMột quy tắc thô là một chip tùy chỉnh đang ở. nhanh
gấp mười lần so với thiết kế tương đương trong một FPGA. Vấn đề là một con chip
tùy chỉnh có chi phí phát triển cao hơn nhiều (chi phí không định kỳ, hay hoặc NRE)
so với FPGA. Michael Taylor và các sinh viên của mình đã thực hiện một số cuộc
điều tra mới để thiết lập các chi phí này [Mag16, Kha17]. ASIC NRE phải bao gồm
chi phí chế tạo mặt nạ và chúng là một phần đáng kể trong tổng chi phí như bảng này
6.17 Tự học 589

cho thấy một số thiết kế ví dụ như năm 2017 [Kha17]. Các tác giả chỉ ra rằng
ASIC nhanh hơn rất nhiều so với các lựa chọn thay thế mà câu hỏi chính là làm
thế nào để trả tiền cho NRE .
Công nghệ 40nm 28nm 16nm
2.250.000 đô 5.700.000 đô
Mặt nạ chi phí $ 1.250.000 la la
Tỷ lệ phần trăm của NRE tổng thể 38% 52% 66%
4.301.000 đô
Tổng số NRE $ 3.259.000 la $ 8,616,000

Bạn cần bao nhiêu bộ gen để sắp xếp để phục hồi NRE cho mỗi thiết kế ASIC?
Chi phí phòng thí nghiệm ướt của giải trình tự bộ gen vào năm 2020 là khoảng
700 đô la cho mỗi bộ gen. Bạn có sử dụng FPGA hoặc ASIC tùy chỉnh để xử lý
dữ liệu?

Câu trả lời cho tự học


Giá nhiều mây cho AWS US East năm 2020.
■ CPU r5.2xlarge: 0,5 đô la mỗi giờ.
■ GPU p3.2xlarge: $ 3,06 mỗi giờ. Nó có giá gấp 6,1 lần CPU .
■ FPGA f1.2xlarge: $ 1,65 mỗi giờ. Nó có giá gấp 3,3 lần CPU .

Genome tăng cường


■ 42 giờ ∗ $ 0,504 mỗi giờ = $ 21,17 để sắp xếp một bộ gen trên CPU.
■ 31 phút / 60 phút mỗi giờ ∗ $ 1,65 mỗi giờ = $ 0,85. Các FPGA có giá gấp
0,04 lần so với CPU (25/1thứ).
■ 42/3 giờ ∗ $ 3,06 mỗi giờ = $ 21,17 = $ 42,84. GPU có giá gấp 2,0 lần so
với CPU.

Bộ gen thực sự tăng cường


Công nghệ 40nm 28nm 16nm
4.301.000
Tổng số NRE $ 3.259.000 đô la $ 8,616,000
Chi phí cho mỗi bộ gen trên
FPGA 0,85 đô la 0,85 đô la 0,85 đô la
Số bộ gen để phục hồi NRE 3.834.118 5.060.000 10.136.471
Với những giả định này, chi phí xử lý dữ liệu cho mỗi bộ gen đã quá rẻ so với
chi phí phòng thí nghiệm ướt đến mức khó có thể biện minh cho ASIC cho đến
khi nhu cầu giải trình tự mỗi năm trên mỗi trang web là hàng chục triệu bộ gen.
590 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

6.18 Bài tập

6.1 Đầu tiên, viết ra một danh sách các hoạt động hàng ngày của bạn mà bạn
thường làm trên a ngày trong tuần. Chẳng hạn, bạn có thể ra khỏi giường, tắm,
mặc quần áo, ăn sáng, sấy tóc, đánh răng. Đảm bảo chia nhỏ danh sách của bạn
để bạn có tối thiểu 10 hoạt động.
6.1.1 [5] <§6.2> Bây giờ hãy xem xét những hoạt động nào trong số này đã
được khai thác một số hình thức song song (ví dụ:., đánh nhiều răng cùng một
lúc, so với từng cái một, mang theo một cuốn sách cùng một lúc đến trường, so
với việc nạp tất cả chúng vào ba lô của bạn và sau đó mang chúng trong song
song). Đối với mỗi hoạt động của bạn, hãy thảo luận nếu chúng đã hoạt động
song song, nhưng nếu không, tại sao chúng không hoạt động.
6.1.2 [5] <§6.2> Tiếp theo, xem xét những hoạt động có thể được thực hiện
đồng thời (ví dụ:., ăn sáng và nghe tin tức). Đối với mỗi hoạt động của bạn, hãy
mô tả hoạt động nào khác có thể được kết hợp với hoạt động này.
6.1.3 [5] <§6.2> Đối với Bài tập 6.1.2, chúng ta có thể thay đổi gì về các hệ thống
hiện tại (ví dụ:., vòi hoa sen, quần áo, TV, xe hơi) để chúng tôi có thể thực hiện song
song nhiều nhiệm vụ hơn?
6.1.4 [5] <§6.2> Ước tính thời gian ngắn hơn để thực hiện những điều này các
hoạt động nếu bạn cố gắng thực hiện càng nhiều nhiệm vụ song song càng tốt.

6.2 Bạn đang cố gắng nướng ba chiếc bánh việt quất. Thành phần bánh là như
sau:
1 chén bơ, làm mềm
1 chén đường
4 quả trứng lớn
1 muỗng cà phê chiết xuất vani
1/2 muỗng cà phê muối
1/4 muỗng cà phê hạt nhục đậu khấu
1 1/2 chén bột
1 cốc quả việt quất
Công thức cho một chiếc bánh duy nhất như sau :
Bước 1: Làm nóng lò ở 325 ° F (160 ° C). Mỡ và bột chảo bánh của bạn.
Bước 2: Trong bát lớn, đánh cùng với bơ trộn và đường ở tốc độ trung bình
cho đến khi nhẹ và mịn. Thêm trứng, vani, muối và hạt nhục đậu khấu. Đánh
cho đến khi trộn kỹ. Giảm tốc độ máy trộn xuống thấp và thêm bột, 1/2 cốc
cùng một lúc, đập cho đến khi được trộn.
Bước 3: Nhẹ nhàng gấp trong quả việt quất. Trải đều trong chảo nướng đã
chuẩn bị. Nướng trong 60 phút.
6.18 Bài tập 591

6.2.1 [5] <§6.2> Công việc của bạn là nấu ba chiếc bánh hiệu quả nhất có thể.
Giả sử rằng bạn chỉ có một lò đủ lớn để chứa một bánh, một bát lớn, một chảo
bánh và một máy trộn, đưa ra một lịch trình để làm ba bánh càng nhanh càng tốt.
Xác định các nút thắt trong việc hoàn thành nhiệm vụ này.
6.2.2 [5] <§6.2> Giả sử bây giờ bạn có ba bát, ba chảo bánh và ba máy trộn. Quá
trình bây giờ nhanh hơn bao nhiêu khi bạn có thêm tài nguyên?
6.2.3 [5] <§6.2> Giả sử bây giờ bạn có hai người bạn sẽ giúp bạn nấu ăn , và
rằng bạn có một lò nướng lớn có thể chứa cả ba loại bánh. Điều này sẽ thay đổi
lịch trình bạn đã đến trong Bài tập 6.2.1 ở trên như thế nào?
6.2.4 [5] <§6.2> So sánh nhiệm vụ làm bánh với tính toán ba lần lặp của một
vòng lặp trên một máy tính song song. Xác định song song cấp dữ liệu và song
song cấp độ nhiệm vụ trong vòng lặp làm bánh.

6.3 Nhiều ứng dụng máy tính liên quan đến việc tìm kiếm thông qua một bộ dữ
liệu và sắp xếp dữ liệu. Một số thuật toán tìm kiếm và sắp xếp hiệu quả đã được
đưa ra để giảm thời gian chạy của các nhiệm vụ tẻ nhạt này. Trong vấn đề này,
chúng tôi sẽ xem xét cách tốt nhất để song song các nhiệm vụ này.
6.3.1 [10] <§6.2> Hãy xem xét thuật toán tìm kiếm nhị phân sau đây (một cổ
điển phân chia và chinh phục thuật toán) tìm kiếm một giá trị X trong mảng N-
element A được sắp xếp và trả về chỉ mục của mục phù hợp :
BinarySearch (A [0..N 1], X) {
thấp = 0
cao = N 1
trong khi (thấp <= cao) {
mid = (thấp + cao) / 2
nếu (A [giữa]> X)
cao = giữa 1
khác nếu (A [giữa] <X)
thấp = giữa + 1
khác
trở về giữa // tìm thấy
}
trả về −1 // không tìm thấy
}
Giả sử rằng bạn có lõi Y trên bộ xử lý đa lõi để chạy BinarySearch. Giả sử rằng
Y nhỏ hơn nhiều so với N, biểu thị hệ số tăng tốc mà bạn có thể mong đợi để có
được cho các giá trị của Y và N. Vẽ chúng trên biểu đồ.
6.3.2 [5] <§6.2> Tiếp theo, giả sử rằng Y bằng N. Điều này sẽ ảnh hưởng đến
bạn như thế nào kết luận trong câu trả lời trước của bạn? Nếu bạn được giao
nhiệm vụ đạt được yếu tố tăng tốc tốt nhất có thể (tức là., tỷ lệ mạnh), giải thích
cách bạn có thể thay đổi mã này để có được nó.
592 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

6.4 Hãy xem xét đoạn mã C sau :


cho (j = 2; j <= 1000; j ++)
D [j] = D [j 1] + D [j 2];
Mã RISC-V tương ứng với đoạn trên là :
addi x5, x0, 8000
thêm x12, x10, x5
addi x11, x10, 16
LOOP: fld f0, -16 (x11)
fld f1, -8 (x11)
fadd.d f2, f0, f1
fsd f2, 0 (x11)
addi x11, x11, 8
chảy máu x11, x12, LOOP

Độ trễ của một lệnh là số chu kỳ phải đến giữa lệnh đó và lệnh sử dụng kết
quả. Giả sử hướng dẫn điểm nổi có độ trễ liên quan sau (tính theo chu kỳ) :
fadd.d fld fsd
4 6 1

6.4.1 [10] <§6.2> Cần bao nhiêu chu kỳ để thực thi mã này?
6.4.2 [10] <§6.2> Đặt lại mã để giảm các quầy hàng. Bây giờ, có bao nhiêu
chu kỳ làm nó phải thực hiện mã này? (Gợi ý: Bạn có thể xóa các quầy hàng bổ
sung bằng cách thay đổi phần bù trên fsd chỉ dẫn.)
6.4.3 [10] <§6.2> Khi một lệnh trong lần lặp sau của vòng lặp phụ thuộc dựa trên
một giá trị dữ liệu được tạo ra trong một lần lặp trước đó của cùng một vòng lặp,
chúng tôi nói rằng có một vòng lặp phụ thuộc giữa các lần lặp của vòng lặp. Xác định
các phụ thuộc được thực hiện trong vòng lặp trong mã trên. Xác định biến chương
trình phụ thuộc và thanh ghi cấp lắp ráp. Bạn có thể bỏ qua biến cảm ứng vòng lặp j.
6.4.4 [15] <§6.2> Viết lại mã bằng cách sử dụng các thanh ghi để mang dữ liệu
giữa lặp của vòng lặp (trái ngược với việc lưu trữ và tải lại dữ liệu từ bộ nhớ chính).
Hiển thị nơi mã này dừng lại và tính toán số chu kỳ cần thiết để thực thi. Lưu ý rằng
đối với vấn đề này, bạn sẽ cần sử dụng trình lắp ráp giả hướng dẫn fmv.d rd, rs1, Viết
mà ghi giá trị của rs1 đăng ký dấu phẩy động vào rd đăng ký dấu phẩy động. Giả sử
rằng fmv.d thực hiện trong một chu kỳ duy nhất.
6.4.5 [10] <§6.2> Vòng lặp không kiểm soát được mô tả trong Chương 4. Bỏ
học và tối ưu hóa vòng lặp ở trên để mỗi vòng lặp không được kiểm soát xử lý ba
lần lặp của vòng lặp gốc. Hiển thị nơi mã này dừng lại và tính toán số chu kỳ cần
thiết để thực thi.
6.18 Bài tập 593

6.4.6 [10] <§6.2> Việc không kiểm soát từ Bài tập 6.4.5. hoạt động tốt bởi vì
chúng tôi xảy ra để muốn nhiều trong ba lần lặp. Điều gì xảy ra nếu số lần lặp
không được biết tại thời điểm biên dịch? Làm thế nào chúng ta có thể xử lý một
cách hiệu quả một số lần lặp không phải là bội số của số lần lặp trên mỗi vòng lặp
không được kiểm soát?
6.4.7 [15] <§6.2> Cân nhắc chạy mã này trên một nút hai được phân phối hệ thống
thông điệp bộ nhớ. Giả sử rằng chúng ta sẽ sử dụng thông báo truyền đi như được mô
tả trong Mục 6.8, nơi chúng tôi giới thiệu một hoạt động mới gửi ( x, y) gửi đến nút x
giá trị y và một thao tác nhận () chờ đợi giá trị được gửi đến nó. Giả sử rằng các hoạt
động gửi mất một chu kỳ để phát hành (tức là., các hướng dẫn sau trên cùng một nút
có thể tiến hành trong chu kỳ tiếp theo), nhưng thực hiện một số chu kỳ để nhận được
trên nút nhận. Nhận hướng dẫn thực hiện gian hàng trên nút nơi chúng được thực thi
cho đến khi chúng nhận được một tin nhắn. Bạn có thể sử dụng một hệ thống như
vậy để tăng tốc mã cho bài tập này? Nếu vậy, độ trễ tối đa để nhận thông tin có thể
được chấp nhận là bao nhiêu? Nếu không, tại sao không?

6.5 Hãy xem xét thuật toán hợp nhất đệ quy sau đây (một phân chia cổ điển
khác và chinh phục thuật toán). Mergesort được mô tả lần đầu tiên bởi John Von
Neumann vào năm 1945. Ý tưởng cơ bản là chia một danh sách chưa được sắp
xếp x của m các phần tử thành hai danh sách con có kích thước bằng một nửa
danh sách gốc. Lặp lại thao tác này trên mỗi danh sách con và tiếp tục cho đến
khi chúng tôi có danh sách kích thước 1 dài. Sau đó bắt đầu với các danh sách
con có độ dài 1, tích hợp các danh sách con vào một danh sách được sắp xếp duy
nhất.
Sáp nhập (m)
var danh sách trái, phải, kết quả
nếu chiều dài (m) 1
trở về m
khác
var mid = chiều dài (m) / 2
cho mỗi x trong m lên đến giữa
thêm x sang trái
cho mỗi x tính bằng m sau giữa
thêm x sang phải
trái = Mergesort (trái)
phải = Mergesort (phải)
kết quả = Hợp nhất (trái, phải)
kết quả trả lại

Bước hợp nhất được thực hiện bởi mã sau :

Hợp nhất (trái, phải)


kết quả danh sách var
594 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

trong khi chiều dài (trái)> 0 và chiều dài (phải)> 0


nếu đầu tiên (trái) đầu tiên (phải)
nối thêm đầu tiên (trái) để kết quả
trái = nghỉ (trái)
khác
nối thêm đầu tiên (phải) để kết quả
phải = nghỉ ngơi (phải)
nếu chiều dài (trái)> 0
nối phần còn lại (trái) để kết quả
nếu chiều dài (phải)> 0
nối phần còn lại (phải) để kết quả
kết quả trả lại

6.5.1 [10] <§6.2> Giả sử rằng bạn có lõi Y trên bộ xử lý đa lõi để chạy Sáp nhập. Giả
sử rằng Y nhỏ hơn nhiều so với chiều dài (m), biểu thị hệ số tăng tốc mà bạn có thể mong
đợi để có được cho các giá trị Y và chiều dài (m). Vẽ những thứ này trên một biểu đồ.
6.5.2 [10] <§6.2> Tiếp theo, giả sử rằng Y bằng chiều dài (m). Làm thế nào
điều này sẽ ảnh hưởng đến kết luận của bạn trong câu trả lời trước của bạn? Nếu
bạn được giao nhiệm vụ đạt được yếu tố tăng tốc tốt nhất có thể (tức là., tỷ lệ
mạnh), giải thích cách bạn có thể thay đổi mã này để có được nó.

6.6 Phép nhân ma trận đóng một vai trò quan trọng trong một số ứng dụng. Hai
ma trận chỉ có thể được nhân nếu số cột của ma trận thứ nhất bằng số lượng hàng
trong thứ hai.
Hãy giả sử chúng ta có một m × n ma trận A và chúng tôi muốn nhân nó với một n × tr
ma trận B Chúng tôi có thể thể hiện sản phẩm của họ như là một. m × tr ma trận được
biểu thị bằng AB (hoặc A·B). Nếu chúng ta chỉ định C = AB, và cTôi,j biểu thị mục nhập C
tại vị trí (Tôi, j), sau đó cho mỗi n
a
thành phần Tôi và j với 1≤ Tôi ≤ m và 1≤ j ≤ tr cTôi , j bk, jBây giờ chúng ∑ Tôi , tôi muốn.
k
C k= 1

xem nếu chúng ta có thể song song tính toán của . Giả sử rằng ma trận được đặt
trong bộ nhớ tuần tự như sau: a1,1, a2,1, a3,1, a4,1, ..., Vân vân.
6.6.1 [10] <§6,5> Giả sử rằng chúng ta sẽ tính toán C trên cả một lõi đơn máy
chia sẻ bộ nhớ và máy chia sẻ bộ nhớ bốn lõi. Tính toán tốc độ tăng mà chúng ta
mong đợi có được trên máy bốn lõi, bỏ qua mọi vấn đề về bộ nhớ.
6.6.2 [10] <§6,5> Lặp lại Bài tập 6.6.1, giả sử rằng cập nhật lên C phát sinh bộ nhớ
cache do chia sẻ sai khi các phần tử liên tiếp liên tiếp (tức là., chỉ số Tôi) được cập nhật.
6.6.3 [10] <§6,5> Làm thế nào bạn sẽ khắc phục vấn đề chia sẻ sai có thể xảy
ra?

6.7 Hãy xem xét các phần sau của hai chương trình khác nhau đang chạy tại
cùng thời gian trên bốn bộ xử lý trong a bộ xử lý đa lõi đối xứng (SMP). Giả sử
rằng trước khi mã này được chạy, cả x và y đều bằng 0.
6.18 Bài tập 595

Lõi 1: x = 2;
Lõi 2: y = 2;
Lõi 3: w = x + y + 1;
Lõi 4: z = x + y;

6.7.1 [10] <§6,5> Tất cả các giá trị kết quả có thể có của w, x, y , và z? Đối với
mỗi kết quả có thể, giải thích làm thế nào chúng ta có thể đến các giá trị đó. Bạn
sẽ cần kiểm tra tất cả các hướng dẫn có thể có.
6.7.2 [5] <§6,5> Làm thế nào bạn có thể làm cho việc thực hiện quyết định hơn
để điều đó chỉ có một bộ giá trị là có thể?

6,8 Vấn đề triết gia ăn uống là một vấn đề kinh điển của đồng bộ hóa và đồng
thời. Vấn đề chung được nêu là các nhà triết học ngồi ở bàn tròn làm một trong
hai điều: ăn hoặc suy nghĩ. Khi họ đang ăn, họ không suy nghĩ và khi họ suy nghĩ,
họ không ăn. Có một bát mì ống ở trung tâm. Một ngã ba được đặt ở giữa mỗi
triết gia. Kết quả là mỗi triết gia có một ngã ba bên trái và một ngã ba bên phải cô.
Với bản chất của việc ăn mì ống, nhà triết học cần hai dĩa để ăn, và chỉ có thể sử
dụng dĩa ở bên trái và bên phải của cô. Các nhà triết học không nói chuyện với
nhau.
6.8.1 [10] <§6.8> Mô tả kịch bản mà không ai trong số các nhà triết học từng
ăn (tức là., chết đói). Chuỗi các sự kiện xảy ra dẫn đến vấn đề này là gì?
6.8.2 [10] <§6.8> Mô tả làm thế nào chúng ta có thể giải quyết vấn đề này
bằng cách giới thiệu khái niệm ưu tiên. Chúng tôi có thể đảm bảo rằng chúng tôi
sẽ đối xử công bằng với tất cả các nhà triết học? Giải thích.
Bây giờ giả sử chúng tôi thuê một người phục vụ phụ trách phân công dĩa cho các
nhà triết học. Không ai có thể nhặt một cái nĩa cho đến khi người phục vụ nói
rằng họ có thể. Người phục vụ có kiến thức toàn cầu về tất cả các dĩa. Hơn nữa,
nếu chúng ta áp đặt chính sách mà các nhà triết học sẽ luôn yêu cầu lấy nĩa trái
của họ trước khi yêu cầu lấy nĩa bên phải của họ, thì chúng ta có thể đảm bảo
tránh bế tắc.
6.8.3 [10] <§6.8> Chúng tôi có thể thực hiện các yêu cầu cho người phục vụ như là
một hàng đợi yêu cầu hoặc như một thử lại định kỳ của một yêu cầu. Với một hàng
đợi, các yêu cầu được xử lý theo thứ tự chúng được nhận. Vấn đề với việc sử dụng
hàng đợi là chúng tôi có thể không phải lúc nào cũng có thể phục vụ nhà triết học có
yêu cầu đứng đầu hàng đợi (do không có tài nguyên). Mô tả một kịch bản với năm
nhà triết học nơi cung cấp hàng đợi, nhưng dịch vụ không được cấp mặc dù có các
dĩa có sẵn cho một triết gia khác (có yêu cầu sâu hơn trong hàng đợi) để ăn.
6.8.4 [10] <§6.8> Nếu chúng tôi thực hiện các yêu cầu cho người phục vụ bằng
cách lặp lại định kỳ yêu cầu của chúng tôi cho đến khi các tài nguyên có sẵn,
điều này sẽ giải quyết vấn đề được mô tả trong Bài tập 6.8.3? Giải thích.
596 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

6,9 Hãy xem xét ba tổ chức CPU sau :


CPU SS: Bộ vi xử lý siêu lõi hai lõi cung cấp khả năng phát hành ngoài thứ tự
trên hai đơn vị chức năng (FU). Chỉ một luồng duy nhất có thể chạy trên mỗi lõi
tại một thời điểm.
CPU MT: Bộ xử lý đa luồng hạt mịn cho phép các hướng dẫn từ hai luồng được
chạy đồng thời (tức là., có hai đơn vị chức năng), mặc dù chỉ có thể ban hành
hướng dẫn từ một luồng duy nhất trên bất kỳ chu kỳ nào.
CPU SMT: Bộ xử lý SMT cho phép các hướng dẫn từ hai luồng được chạy đồng
thời (tức là., có hai đơn vị chức năng) và hướng dẫn từ một hoặc cả hai luồng có
thể được ban hành để chạy trên bất kỳ chu kỳ nào.
Giả sử chúng ta có hai luồng X và Y để chạy trên các CPU này bao gồm các thao
tác sau :

Chủ đề X Chủ đề Y
A1 - mất ba chu kỳ để thực hiện B1 - mất hai chu kỳ để thực hiện
A2 - không phụ thuộc B2 - xung đột cho một đơn vị chức năng với B1
- xung đột cho một đơn vị chức năng với
A3 A1 B3 - phụ thuộc vào kết quả của B2
A4 - phụ thuộc vào kết quả của A3 B4 - không phụ thuộc và mất hai chu kỳ để thực hiện

Giả sử tất cả các hướng dẫn thực hiện một chu kỳ duy nhất để thực hiện trừ khi
có ghi chú khác hoặc chúng gặp phải mối nguy hiểm.
6.9.1 [10] <§6.4> Giả sử rằng bạn có một CPU SS. Nó sẽ có bao nhiêu chu kỳ thực
hiện hai chủ đề này? Có bao nhiêu khe vấn đề bị lãng phí do các mối nguy hiểm?
6.9.2 [10] <§6.4> Bây giờ giả sử bạn có hai CPU SS. Nó sẽ có bao nhiêu chu kỳ
thực hiện hai chủ đề này? Có bao nhiêu khe vấn đề bị lãng phí do các mối nguy hiểm?
6.9.3 [10] <§6.4> Giả sử rằng bạn có một CPU MT. Nó sẽ có bao nhiêu chu kỳ
thực hiện hai chủ đề này? Có bao nhiêu khe vấn đề bị lãng phí do các mối nguy hiểm?
6.9.4 [10] <§6.4> Giả sử bạn có một CPU SMT. Nó sẽ mất bao nhiêu chu kỳ để
thực hiện hai luồng? Có bao nhiêu khe vấn đề bị lãng phí do các mối nguy hiểm?

6.10 Phần mềm ảo hóa đang được triển khai mạnh mẽ để giảm chi phí quản lý
các máy chủ hiệu suất cao ngày hôm nay. Các công ty như VMWare, Microsoft
và IBM đều đã phát triển một loạt các sản phẩm ảo hóa. Khái niệm chung, được
mô tả trong Chương 5, là một lớp hypanneror có thể được giới thiệu giữa phần
cứng và hệ điều hành để cho phép nhiều hệ điều hành chia sẻ cùng một phần
cứng vật lý. Lớp hypanneror sau đó chịu trách nhiệm phân bổ CPU và tài nguyên
bộ nhớ, cũng như các dịch vụ xử lý thường được xử lý bởi hệ điều hành (ví dụ:.,
I / O).
6.18 Bài tập 597

Ảo hóa cung cấp một cái nhìn trừu tượng về phần cứng cơ bản cho hệ điều hành và
phần mềm ứng dụng được lưu trữ. Điều này sẽ yêu cầu chúng tôi suy nghĩ lại về cách
các hệ thống đa lõi và đa bộ xử lý sẽ được thiết kế trong tương lai để hỗ trợ việc chia
sẻ CPU và bộ nhớ bởi một số hệ điều hành đồng thời.
6.10.1 [30] <§6.4> Chọn hai giám sát viên trên thị trường ngày hôm nay, và so
sánh và đối chiếu cách chúng ảo hóa và quản lý phần cứng cơ bản (CPU và bộ
nhớ).
6.10.2 [15] <§6.4> Thảo luận về những thay đổi có thể cần thiết trong đa lõi
trong tương lai Các nền tảng CPU để phù hợp hơn với nhu cầu tài nguyên được
đặt trên các hệ thống này. Chẳng hạn, đa luồng có thể đóng một vai trò hiệu quả
trong việc giảm bớt sự cạnh tranh về tài nguyên điện toán?

6.11 Chúng tôi muốn thực hiện vòng lặp dưới đây một cách hiệu quả nhất có
thể. Chúng tôi có hai máy khác nhau, máy MIMD và máy SIMD.
cho (i = 0; i <2000; i ++)
cho (j = 0; j <3000; j ++)
X_array [i] [j] = Y_array [j] [i] + 200;

6.11.1 [10] <§6.3> Đối với máy MIMD bốn CPU, hiển thị trình tự Hướng dẫn
RISC-V mà bạn sẽ thực thi trên mỗi CPU. Tốc độ tăng tốc cho máy MIMD này
là gì?
6.11.2 [20] <§6.3> Đối với máy SIMD tám rộng (tức là., tám SIMD song song
các đơn vị chức năng), viết một chương trình lắp ráp bằng cách sử dụng các phần
mở rộng SIMD của riêng bạn cho RISC-V để thực hiện vòng lặp. So sánh số
lượng hướng dẫn được thực hiện trên máy SIMD với máy MIMD.

6.12 Một mảng tâm thu là một ví dụ về máy MISD. Một mảng tâm thu là một
mạng lưới đường ống hoặc sóng wavefront của các yếu tố xử lý dữ liệu. Mỗi yếu
tố này không cần bộ đếm chương trình vì việc thực thi được kích hoạt bởi sự xuất
hiện của dữ liệu. Các mảng tâm thu được đồng hồ tính toán trong bước khóa của
bước với mỗi bộ xử lý thực hiện các giai đoạn tính toán và giao tiếp thay thế.
6.12.1 [10] <§6.3> Xem xét đề xuất thực hiện một mảng tâm thu (bạn có thể
tìm thấy những thứ này trên Internet hoặc trong các ấn phẩm kỹ thuật). Sau đó cố
gắng lập trình vòng lặp được cung cấp trong Bài tập 6.11 sử dụng mô hình
MISD này. Thảo luận về bất kỳ khó khăn bạn gặp phải.
6.12.2 [10] <§6.3> Thảo luận về sự tương đồng và khác biệt giữa một MISD
và máy SIMD. Trả lời câu hỏi này về mặt song song cấp dữ liệu.
598 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

6.13 Giả sử chúng tôi muốn thực thi vòng lặp DAXPY được hiển thị trên trang
529 trong RISC-V lắp ráp vector trên GPU NVIDIA 8800 GTX được mô tả
trong chương này. Trong vấn đề này, chúng tôi sẽ giả định rằng tất cả các phép
toán được thực hiện trên các số dấu phẩy động có độ chính xác đơn (chúng tôi sẽ
đổi tên vòng lặp SAXPY). Giả sử rằng các hướng dẫn lấy số chu kỳ sau để thực
hiện.
Tải Cửa Thêm Đa năng
hàng .S
5 2 3 4

6.13.1 [20] <§6.7> Mô tả cách bạn sẽ xây dựng các sợi dọc cho vòng lặp
SAXPY để khai thác tám lõi được cung cấp trong một bộ xử lý đơn.

6.14 Tải xuống Bộ công cụ CUDA và SDK từ https://developer.nvidia.com/ cuda-


toolkitĐảm bảo sử dụng phiên bản thu hút của người dùng (Chế độ mô phỏng) của
phiên bản. mã. (Bạn sẽ không cần phần cứng NVIDIA thực tế cho nhiệm vụ này.)
Xây dựng các chương trình ví dụ được cung cấp trong SDK và xác nhận rằng chúng
chạy trên trình giả lập.
6.14.1 [90] <§6.7> Sử dụng mẫu SDK mẫu thử của người Viking làm điểm khởi
đầu, viết a
Chương trình CUDA để thực hiện các thao tác vector sau :
1) a - b (traction vector-vector)
2) a · b (sản phẩm chấm vector)
Các sản phẩm chấm của hai vectơ a = [a1, a2, ..., an] và b = [b1, b2, ..., bn] được định nghĩa
là :
n
a ⋅ b = ∑aTôi bTôi = a1b1 + a2 b2 + + an bn
i =1

Gửi mã cho mỗi chương trình thể hiện từng thao tác và xác minh tính chính xác
của kết quả.
6.14.2 [90] <§6.7> Nếu bạn có sẵn phần cứng GPU, hãy hoàn thành hiệu suất phân
tích về chương trình của bạn, kiểm tra thời gian tính toán cho GPU và phiên bản
CPU của chương trình của bạn cho một loạt các kích thước vector. Giải thích bất kỳ
kết quả bạn nhìn thấy.

6.15 AMD gần đây đã công bố tích hợp một đơn vị xử lý đồ họa với lõi x86 của
chúng thành một gói duy nhất (mặc dù có các đồng hồ khác nhau cho mỗi lõi).
Đây là một ví dụ về một hệ thống đa xử lý không đồng nhất. Một trong những
điểm thiết kế chính là cho phép truyền dữ liệu nhanh giữa CPU và GPU. Trước
kiến trúc AMD AMD Fusion, cần có thông tin liên lạc giữa các chip CPU và
GPU rời rạc. Hiện tại, kế hoạch là sử dụng nhiều (ít nhất 16) kênh PCI express để
tạo điều kiện liên lạc.
6.15.1 [25] <§6.7> So sánh băng thông và độ trễ liên quan đến những thứ này
hai công nghệ kết nối với nhau.
6.18 Bài tập 599

6.16 Tham khảo Hình 6.15b, trong đó cho thấy một cấu trúc liên kết n-cube
của thứ tự 3 kết nối tám nút. Một tính năng hấp dẫn của cấu trúc liên kết mạng n-
cube là khả năng duy trì các liên kết bị hỏng và vẫn cung cấp kết nối.
6.16.1 [10] <§6.9> Phát triển một phương trình tính toán có bao nhiêu liên kết
trong n-cube (trong đó n là thứ tự của khối lập phương) có thể thất bại và chúng
tôi vẫn có thể đảm bảo một liên kết không bị phá vỡ sẽ tồn tại để kết nối bất kỳ
nút nào trong khối n.
6.16.2 [10] <§6.9> So sánh khả năng phục hồi với thất bại của n-cube với đầy
đủ kết nối mạng kết nối. Vẽ một so sánh về độ tin cậy như là một hàm của số
lượng liên kết được thêm vào cho hai cấu trúc liên kết.

6.17 Điểm chuẩn là một lĩnh vực nghiên cứu liên quan đến việc xác định đại diện
khối lượng công việc để chạy trên các nền tảng điện toán cụ thể để có thể so sánh
khách quan hiệu suất của hệ thống này với hệ thống khác. Trong bài tập này, chúng
tôi sẽ so sánh hai loại điểm chuẩn: điểm chuẩn CPU Whetstone và bộ Điểm chuẩn
PARSEC. Chọn một chương trình từ PARSEC. Tất cả các chương trình nên được
cung cấp miễn phí trên Internet. Cân nhắc chạy nhiều bản sao của Whetstone so với
chạy Điểm chuẩn PARSEC trên bất kỳ hệ thống nào được mô tả trong Mục 6.11.
6.17.1 [60] <§6.11> Những gì vốn đã khác nhau giữa hai lớp này khối lượng
công việc khi chạy trên các hệ thống đa lõi này?
6.17.2 [60] <§6.11> Về mặt Mô hình Mái nhà, mức độ phụ thuộc sẽ như thế
nào kết quả bạn có được khi chạy các điểm chuẩn này là về số lượng chia sẻ và
đồng bộ hóa có trong khối lượng công việc được sử dụng?

6.18 Khi thực hiện tính toán trên ma trận thưa thớt, độ trễ trong bộ nhớ thứ bậc
trở thành nhiều hơn một yếu tố. Ma trận thưa thớt thiếu địa phương không gian
trong datastream thường được tìm thấy trong các hoạt động ma trận. Do đó, các
biểu diễn ma trận mới đã được đề xuất.
Một trong những biểu diễn ma trận thưa thớt sớm nhất là Định dạng Ma trận thưa
thớt Yale. Nó lưu trữ một thưa thớt ban đầu m × n ma trận, M ở dạng hàng sử
dụng ba mảng một chiều. Để cho R là số lượng các mục khác không trong M
Chúng tôi xây dựng một mảng. A chiều dài R trong đó có chứa tất cả các mục
khác không M (theo thứ tự từ trên xuống dưới từ trái sang phải). Chúng tôi cũng
xây dựng một mảng thứ hai IA chiều dài m+1 (tức là., một mục trên mỗi hàng,
cộng với một). IA(Tôi) chứa chỉ mục trong A của phần tử nonzero đầu tiên của
hàng Tôi Hàng. Tôi của ma trận ban đầu kéo dài từ A(IA(Tôi)) đến A(IA(Tôi+1)
1) . Mảng thứ ba , JA, chứa chỉ mục cột của từng thành phần A, vì vậy nó cũng có
chiều dài R.
6.18.1 [15] <§6.11> Hãy xem xét ma trận thưa thớt X bên dưới và viết mã C
đó sẽ lưu mã này ở Định dạng Ma trận thưa thớt Yale.
600 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Hàng 1 [1, 2, 0, 0, 0, 0]
Hàng 2 [0, 0, 1, 1, 0, 0]
Hàng 3 [0, 0, 0, 0, 9, 0]
Hàng 4 [2, 0, 0, 0, 0, 2]
Hàng 5 [0, 0, 3, 3, 0, 7]
Hàng 6 [1, 3, 0, 0, 0, 1]

6.18.2 [10] <§6.11> Về không gian lưu trữ, giả sử rằng mỗi yếu tố trong ma
trận X là điểm nổi chính xác đơn, tính toán lượng lưu trữ được sử dụng để lưu ma
trận ở trên trong Định dạng ma trận thưa thớt của Yale.
6.18.3 [15] <§6.11> Thực hiện nhân ma trận của ma trận X bằng ma trận Y
hiển thị bên dưới.
[2, 4, 1, 99, 7, 2]
Đặt tính toán này trong một vòng lặp và thời gian thực hiện nó. Đảm bảo tăng số
lần vòng lặp này được thực thi để có độ phân giải tốt trong phép đo thời gian của
bạn. So sánh thời gian chạy của việc sử dụng một biểu diễn ngây thơ của ma trận
và Định dạng ma trận thưa thớt Yale.
6.18.4 [15] <§6.11> Bạn có thể tìm thấy một đại diện ma trận thưa thớt hiệu
quả hơn (về không gian và chi phí tính toán)?

6.19 Trong các hệ thống trong tương lai, chúng tôi hy vọng sẽ thấy các nền
tảng điện toán không đồng nhất được xây dựng từ các CPU không đồng nhất.
Chúng tôi đã bắt đầu thấy một số xuất hiện trong thị trường xử lý nhúng trong
các hệ thống có chứa cả DSP dấu phẩy động và CPU vi điều khiển trong gói mô-
đun đa kênh.
Giả sử rằng bạn có ba lớp CPU :
CPU A Một CPU đa lõi tốc độ vừa phải (với đơn vị dấu phẩy động) có thể thực
hiện nhiều hướng dẫn trên mỗi chu kỳ.
CPU Bẻ Một CPU số nguyên lõi đơn nhanh (tức là., không có đơn vị dấu phẩy
động) có thể thực hiện một lệnh duy nhất cho mỗi chu kỳ.
CPU Cẩu Một CPU vector chậm (có khả năng dấu phẩy động) có thể thực thi
nhiều bản sao của cùng một lệnh trên mỗi chu kỳ.
Giả sử rằng bộ xử lý của chúng tôi chạy ở các tần số sau :
CPU A CPU B CPU C
1 GHz 3 250 MHz
GHz

CPU A có thể thực hiện hai hướng dẫn cho mỗi chu kỳ, CPU B có thể thực hiện
một lệnh cho mỗi chu kỳ và CPU C có thể thực hiện tám hướng dẫn (thông qua
cùng một lệnh) cho mỗi chu kỳ. Giả sử tất cả các hoạt động có thể hoàn thành
thực hiện trong một chu kỳ độ trễ duy nhất mà không có bất kỳ mối nguy hiểm
nào.
6.18 Bài tập 601

Tất cả ba CPU đều có khả năng thực hiện số học số nguyên, mặc dù CPU B
không thể thực hiện số học dấu phẩy động. CPU A và B có một bộ hướng dẫn
tương tự như bộ xử lý RISC-V. CPU C chỉ có thể thực hiện các thao tác cộng và
trừ điểm nổi, cũng như tải và lưu trữ bộ nhớ. Giả sử tất cả các CPU có quyền truy
cập vào bộ nhớ dùng chung và đồng bộ hóa có chi phí bằng không.
Nhiệm vụ trong tầm tay là so sánh hai ma trận X và Y mỗi phần tử chứa 1024 ×
1024. Đầu ra phải là số lượng chỉ số có giá trị trong đó X lớn hơn hoặc bằng giá
trị trong Y.
6.19.1 [10] <§6.12> Mô tả cách bạn sẽ phân vùng vấn đề trên ba CPU khác
nhau để có được hiệu suất tốt nhất.
6.19.2 [10] <§6.12> Những loại hướng dẫn bạn sẽ thêm vào CPU vector C để
có được hiệu suất tốt hơn?

6.20 Câu hỏi này xem xét số lượng xếp hàng đang xảy ra trong hệ thống đưa ra
tỷ lệ xử lý giao dịch tối đa và độ trễ quan sát trung bình cho một giao dịch. Độ trễ
bao gồm cả thời gian dịch vụ (được tính theo tỷ lệ tối đa) và thời gian xếp hàng.
Giả sử một hệ thống máy tính lõi tứ có thể xử lý các truy vấn cơ sở dữ liệu với
tốc độ tối đa trạng thái ổn định của các yêu cầu tốc độ mỗi giây. Cũng giả định
rằng mỗi giao dịch mất trung bình lat ms để xử lý. Đối với mỗi cặp trong bảng,
hãy trả lời các câu hỏi sau :

Độ trễ giao dịch trung bình Tỷ lệ xử lý giao dịch tối đa


1 ms 5000 / giây
2 ms 5000 / giây
1 ms 10.000 / giây
2 ms 10.000 / giây

Đối với mỗi cặp trong bảng, hãy trả lời các câu hỏi sau :
6.20.1 [10] <§6.12> Trung bình, có bao nhiêu yêu cầu đang được xử lý tại bất
kỳ đưa ra ngay lập tức?
6.20.2 [10] <§6.12> Nếu chúng ta chuyển sang một hệ thống tám lõi, lý tưởng nhất,
điều gì sẽ xảy ra đến thông lượng hệ thống (tức là., có bao nhiêu truy vấn / giây sẽ xử
lý máy tính)?
6.20.3 [10] <§6.12> Thảo luận về lý do tại sao chúng ta hiếm khi có được loại
tốc độ này chỉ đơn giản là tăng số lượng lõi.
602 Chương 6 Bộ xử lý song song từ máy khách đến đám mây

Câu trả lời để §6.1, trang 522: Sai. Song song cấp độ tác vụ có thể giúp các ứng dụng tuần tự và
kiểm tra chính các ứng dụng tuần tự có thể được thực hiện để chạy trên phần cứng song song,
mặc dù nó khó khăn hơn.
mình §6.2, trang 527: Sai. Yếu tỷ lệ có thể bù cho một phần nối tiếp của chương trình
có thể hạn chế khả năng mở rộng, nhưng không phải như vậy đối với tỷ lệ mạnh.
§6.3, trang 533: Đúng, nhưng chúng thiếu các tính năng vector hữu ích như các
thanh ghi độ phân tán và độ dài vector giúp cải thiện hiệu quả của kiến trúc vector.
(Như một Xây dựng trong phần này đề cập, các phần mở rộng SIMD AVX2 cung
cấp các tải được lập chỉ mục thông qua thao tác thu thập nhưng không phải phân
tán cho các cửa hàng được lập chỉ mục. Bộ vi xử lý Haswell thế hệ x86 là người
đầu tiên hỗ trợ AVX2.) §6.4, trang 537: 1. Thật. 2. Thật.
§6.5, trang 541: Sai. Vì địa chỉ được chia sẻ là a thể chất địa chỉ, nhiều nhiệm vụ
mỗi trong riêng của họ ảo không gian địa chỉ có thể chạy tốt trên bộ đa xử lý bộ
nhớ dùng chung.
§6.6, trang 549: Sai. Chip DRAM đồ họa được đánh giá cao cho băng thông cao
hơn của họ. §6.7: Sai. GPU và CPU bao gồm các tính năng dự phòng để tăng
năng suất chết, kết hợp với khối lượng lớn của chúng làm cho các khuôn lớn có
giá cả phải chăng, không giống như trường hợp của DSA. Các ưu điểm của DSA
bao gồm loại bỏ các tính năng của CPU và GPU không cần thiết cho tên miền và
sử dụng lại các tài nguyên đó cho nhiều đơn vị số học và bộ nhớ lớn trên chip, cả
hai đều phù hợp với miền vấn đề.
§6.8, trang 557: 1. Sai. Gửi và nhận tin nhắn là một sự đồng bộ hóa ngầm, cũng
như một cách để chia sẻ dữ liệu. 2. Thật. §6.9, trang 560: Đúng.

§6.11, trang 571: Đúng. Chúng tôi có thể cần sự đổi mới ở tất cả các cấp độ của
phần cứng và phần mềm để tính toán song song để thành công.
TRANG NÀY TUYỆT VỜI TRÁI CÂY
A
A P P E N D TÔI X
Những điều cơ bản
của thiết kế logic
A.1 Giới thiệu A-3
Tôi luôn yêu từ đó, A.2 Gates, Bàn sự thật và Logic

Boolean. Phương trình A-4


A.3 Logic kết hợp A-9
Claude Shannon
Phổ biến IEEE , Tháng 4 năm 1992 A.4 Sử dụng Mô tả phần cứng
(Luận án thạc sĩ Shannon sườn cho Ngôn ngữ A-20
thấy đại số do George Boole phát
minh vào những năm 1800 có thể đại A.5 Xây dựng một logic số học cơ bản
diện cho hoạt động của các công tắc
điện.) Đơn vị A-26
A.6 Bổ sung nhanh hơn: Mang theo Lookahead
A-37
A.7 Đồng hồ A-47
A.8 Các yếu tố bộ nhớ: Flip-Flops, Latches và Register A-49
A.9 Các yếu tố bộ nhớ: SRAM và DRAM A-57
A.10 Máy móc nhà nước hữu hạn A-66
A.11 Phương pháp thời gian A-71
A.12 Thiết bị lập trình hiện trường A-77
A.13 Kết luận A-78
A.14 Bài tập A-79

A.1 Giới thiệu

Phụ lục này cung cấp một cuộc thảo luận ngắn gọn về những điều cơ bản của thiết
kế logic. Nó không thay thế một khóa học trong thiết kế logic, cũng không cho
phép bạn thiết kế các hệ thống logic làm việc quan trọng. Tuy nhiên, nếu bạn có ít
hoặc không tiếp xúc với thiết kế logic, phụ lục này sẽ cung cấp đủ nền tảng để
hiểu tất cả các tài liệu trong cuốn sách này. Ngoài ra, nếu bạn đang tìm hiểu một
số động lực đằng sau cách thức máy tính được triển khai, tài liệu này sẽ đóng vai
trò là phần giới thiệu hữu ích. Nếu sự tò mò của bạn được khơi dậy nhưng không
được nêu trong phụ lục này, các tài liệu tham khảo ở cuối cung cấp một số nguồn
thông tin bổ sung.
Mục A.2 giới thiệu các khối xây dựng cơ bản của logic, cụ thể là , cổng. Mục A.3
sử dụng các khối xây dựng này để xây dựng đơn giản tổ hợp hệ thống logic, không
chứa bộ nhớ. Nếu bạn đã có một số tiếp xúc với logic hoặc hệ thống kỹ thuật số, có lẽ
bạn sẽ quen thuộc với tài liệu trong hai phần đầu tiên này. Mục A.5 cho thấy cách sử
dụng các khái niệm của Phần A.2 và A.3 để thiết kế một ALU cho bộ xử lý RISC-V.
Mục A.6 cho thấy làm thế nào để tạo một adder nhanh, và
A-4 Phụ lục A Những điều cơ bản của thiết kế logic

có thể được bỏ qua một cách an toàn nếu bạn không quan tâm đến chủ đề này. Mục
A.7 là một giới thiệu ngắn về chủ đề đồng hồ, cần thiết để thảo luận về cách các yếu
tố bộ nhớ hoạt động. Mục A.8 giới thiệu các yếu tố bộ nhớ, và Mục A.9 mở rộng nó
để tập trung vào các bộ nhớ truy cập ngẫu nhiên; nó mô tả cả hai đặc điểm quan
trọng để hiểu cách chúng được sử dụng, như được thảo luận trong Chương 4và nền
tảng thúc đẩy nhiều khía cạnh của thiết kế phân cấp bộ nhớ được thảo luận trong
Chương 5.Mục A.10 mô tả thiết kế và sử dụng các máy trạng thái hữu hạn, là các
khối logic tuần tự. Nếu bạn có ý định đọc Phụ lục C, bạn nên hiểu kỹ về tài liệu
trong Phần A.2 đến A.10. Nếu bạn chỉ có ý định đọc tài liệu về kiểm soát trong
Chương 4, bạn có thể lướt qua các phụ lục; tuy nhiên, bạn nên có một số quen
thuộc với tất cả các tài liệu ngoại trừ Mục A.11. Mục A.11 được dành cho những
người muốn hiểu sâu hơn phương pháp đồng hồ và thời gian. Nó giải thích
những điều cơ bản về cách thức hoạt động của đồng hồ kích hoạt cạnh, giới
thiệu một sơ đồ đồng hồ khác và mô tả ngắn gọn vấn đề đồng bộ hóa các đầu
vào không đồng bộ.
Trong suốt phụ lục này, nơi thích hợp, chúng tôi cũng bao gồm các phân đoạn
để chứng minh logic có thể được thể hiện như thế nào trong Verilog, mà chúng
tôi giới thiệu Mục A.4Một hướng dẫn Verilog rộng rãi và đầy đủ hơn có sẵn trực
tuyến trên. trang web đồng hành cho cuốn sách này.

A.2 Cổng, Bàn sự thật và Phương trình logic

Các thiết bị điện tử bên trong một máy tính hiện đại là kỹ thuật số Điện tử kỹ thuật số
hoạt động chỉ với hai mức điện áp quan tâm: điện áp cao và điện áp thấp. Tất cả các
giá trị điện áp khác là tạm thời và xảy ra trong khi chuyển đổi giữa các giá trị. (Như
chúng ta đã thảo luận sau trong phần này, một cạm bẫy có thể có trong thiết kế kỹ
thuật số đang lấy mẫu tín hiệu khi nó không rõ ràng ở mức cao hay thấp.) Thực tế là
máy tính là kỹ thuật số cũng là một lý do chính khiến chúng sử dụng số nhị phân, vì
hệ thống nhị phân phù hợp với sự trừu tượng cơ bản vốn có trong thiết bị điện tử.
Trong các họ logic khác nhau, các giá trị và mối quan hệ giữa hai giá trị điện áp khác
nhau. Do đó, thay vì đề cập đến các mức điện áp, chúng ta nói về các tín hiệu (về mặt
khẳng định tín hiệu logic) đúng hoặc 1 hoặc là. khẳng định; hoặc các tín hiệu (về mặt logic) sai, hoặc 0
Một tín hiệu đó là (về hoặc là bị coi thườngCác giá trị 0. và 1 được gọi bổ sung hoặc là nghịch đảo của
mặt logic) đúng, hoặc 1. nhau.
tín hiệu khử Các khối logic được phân loại là một trong hai loại, tùy thuộc vào việc chúng
Tín hiệu sai (về mặt có chứa bộ nhớ hay không. Các khối không có bộ nhớ được gọi tổ hợp; đầu ra
logic) hoặc 0. của một khối tổ hợp chỉ phụ thuộc vào đầu vào hiện tại. Trong các khối có bộ
nhớ, các đầu ra có thể phụ thuộc vào cả đầu vào và giá trị được lưu trong bộ nhớ,
được gọi là tiểu bang của khối logic. Trong phần này và tiếp theo, chúng tôi sẽ
tập trung
A.2 Gates, Bàn sự thật và Phương trình logic A-5

chỉ trên logic kết hợp Sau khi giới thiệu các yếu tố bộ nhớ khác nhau trong. Mục logic kết hợp Một hệ
A.8, chúng tôi sẽ mô tả làm thế nào logic tuần tự, đó là logic bao gồm cả nhà thống logic có các khối
không chứa bộ nhớ và
nước , được thiết kế.
do đó tính toán cùng một
đầu ra cho cùng một đầu
Bàn chân lý vào.
Do khối logic tổ hợp không chứa bộ nhớ, nên nó có thể được chỉ định hoàn toàn logic tuần tự
bằng cách xác định các giá trị của đầu ra cho mỗi bộ giá trị đầu vào có thể. Một Một nhóm các phần tử
mô tả như vậy thường được đưa ra như là một bảng thật Đối với một khối logic logic chứa bộ nhớ và do
với. n đầu vào, có 2n các mục trong bảng chân lý, vì có nhiều kết hợp có thể có đó giá trị của nó phụ thuộc
của các giá trị đầu vào. Mỗi mục chỉ định giá trị của tất cả các đầu ra cho kết hợp vào đầu vào cũng như nội
dung hiện tại của bộ nhớ.
đầu vào cụ thể đó.

Bàn chân lý
Hãy xem xét một hàm logic với ba đầu vào , A, B, và Cvà ba đầu ra , D, E,
và FHàm được định nghĩa như sau :. D là đúng nếu ít nhất một đầu vào là VÍ DỤ
đúng , E là đúng nếu chính xác hai đầu vào là đúng và F chỉ đúng nếu cả ba
đầu vào thật. Hiển thị bảng sự thật cho chức năng này.

Bảng sự thật sẽ chứa 23 = 8 mục. Đây là :


TRẢ LỜI
Đầu vào Đầu ra
A B C D E F
0 0 0 0 0 0
0 0 1 1 0 0
0 1 0 1 0 0
0 1 1 1 1 0
1 0 0 1 0 0
1 0 1 1 1 0
1 1 0 1 1 0
1 1 1 1 0 1

Các bảng sự thật hoàn toàn có thể mô tả bất kỳ chức năng logic kết hợp nào;
tuy nhiên, chúng phát triển kích thước nhanh chóng và có thể không dễ hiểu. Đôi
khi chúng tôi muốn xây dựng một hàm logic sẽ là 0 cho nhiều kết hợp đầu vào và
chúng tôi sử dụng một tốc ký chỉ định các mục nhập bảng thật cho các đầu ra
khác không. Cách tiếp cận này được sử dụng trong Chương 4 và Phụ lục C.
A-6 Phụ lục A Những điều cơ bản của thiết kế logic

Đại số Boolean
Một cách tiếp cận khác là thể hiện chức năng logic với các phương trình logic.
Điều này được thực hiện với việc sử dụng Đại số Boolean (được đặt theo tên của
Boole, một nhà toán học thế kỷ 19). Trong đại số Boolean, tất cả các biến có giá
trị 0 hoặc 1 và, trong các công thức điển hình, có ba toán tử :
■ Toán tử OR được viết là +, như trong A + B Kết quả của toán tử OR là 1
nếu một trong hai biến là 1. Hoạt động OR cũng được gọi là a. tổng hợp lý,
vì kết quả của nó là 1 nếu một trong hai toán hạng là 1.
■ Toán tử AND được viết là ·, như trong A · B Kết quả của toán tử AND chỉ
là 1 nếu cả hai đầu vào là 1. Toán tử AND cũng được gọi. sản phẩm hợp lý,
vì kết quả của nó là 1 chỉ khi cả hai toán hạng là 1.
■ Toán tử unary KHÔNG được viết là AKết quả của toán tử KHÔNG chỉ là 1 nếu
đầu vào là 0. Áp dụng toán tử KHÔNG cho giá trị logic dẫn đến đảo ngược hoặc
phủ định giá trị (tức là., nếu đầu vào là 0, đầu ra là 1 và ngược lại).
Có một số định luật đại số Boolean rất hữu ích trong việc thao tác các phương
trình logic.
■ Luật định danh : A + 0 = A và A · 1 = A

■ Không và Một luật : A + 1 = 1 và A · 0 = 0


■ Luật nghịch đảo : A A 1 và A ⋅ A 0
■ Luật giao hoán : A + B = B + A và A · B = B · A
■ Luật liên kết : A + (B + C) = (A + B) + C và A · (B · C) = (A · B) · C
■ Luật phân phối : A · (B + C) = (A · B) + (A · C) và
A+ (B·C) = (A+B) · (A+C)
Ngoài ra, có hai định lý hữu ích khác, được gọi là định luật DeMorgan, được
thảo luận sâu hơn trong các bài tập.
Bất kỳ tập hợp các hàm logic nào cũng có thể được viết dưới dạng một chuỗi
các phương trình có đầu ra ở phía bên trái của mỗi phương trình và một công thức
bao gồm các biến và ba toán tử ở trên ở phía bên phải.
A.2 Gates, Bàn sự thật và Phương trình logic A-7

Phương trình logic

Hiển thị các phương trình logic cho các hàm logic , D, E, và F, được mô tả
trong ví dụ trước. VÍ DỤ

Ở đây, phương trình cho Đ :


TRẢ LỜI
D A B C

F cũng đơn giản không kém :


F A⋅B⋅C

E là một chút khó khăn. Hãy nghĩ về nó trong hai phần: những gì phải đúng
cho E là sự thật (hai trong ba đầu vào phải đúng) và điều không thể đúng (cả
ba đều không thể đúng). Vì vậy, chúng ta có thể viết E như
E ((A⋅B) (A⋅C) (B⋅C))⋅(A⋅B⋅C)
Chúng ta cũng có thể rút ra E bằng cách nhận ra điều đó E chỉ đúng nếu
chính xác hai trong số các đầu vào là đúng. Sau đó chúng ta có thể viết E là
OR của ba thuật ngữ có thể có hai đầu vào thực và một đầu vào sai :
E (A⋅B⋅C) (A⋅C⋅B) (B⋅C⋅A)
Chứng minh rằng hai biểu thức này là tương đương được khám phá trong các bài
tập.

Trong Verilog, chúng tôi mô tả logic tổ hợp bất cứ khi nào có thể bằng cách sử
dụng câu lệnh gán, được mô tả bắt đầu trên trang A-23. Chúng ta có thể viết một định
nghĩa cho E sử dụng toán tử Verilog độc quyền OR như gán E = (A & (B ^ C)) | (B & C
& ~ A), đó là một cách khác để mô tả chức năng này. D và F thậm chí còn đơn
giản hơn các biểu diễn, giống như mã C tương ứng : gán D = A | B | C và gán F = A
& B & C.
A-8 Phụ lục A Những điều cơ bản của thiết kế logic

Cổng
cổng Một thiết bị mà Các khối logic được xây dựng từ cổng thực hiện các chức năng logic cơ bản. Ví
thực hiện các hàm logic dụ: cổng AND thực hiện chức năng AND và cổng OR thực hiện chức năng OR.
cơ bản, chẳng hạn như Vì cả AND và OR đều giao hoán và liên kết, cổng AND hoặc OR có thể có nhiều
VÀ hoặc HOẶC . đầu vào, với đầu ra bằng AND hoặc OR của tất cả các đầu vào. Hàm logic
KHÔNG được thực hiện với một biến tần luôn có một đầu vào duy nhất. Biểu
diễn tiêu chuẩn của ba khối xây dựng logic này được hiển thị trong Hình A.2.1.
Thay vì vẽ các bộ biến tần một cách rõ ràng, một thông lệ phổ biến là thêm
bong bóng đá vào các đầu vào hoặc đầu ra của một cổng để làm cho giá trị logic
trên đường đầu vào hoặc đường đầu ra đó bị đảo ngược. Ví dụ, Hình A.2.2 hiển
thị sơ đồ logic cho hàm A B, sử dụng bộ biến tần rõ ràng ở bên trái và đầu vào
sủi bọt và đầu ra bên phải.
Bất kỳ chức năng logic nào cũng có thể được xây dựng bằng cổng AND, cổng
OR và đảo ngược; một số bài tập cho bạn cơ hội để thử thực hiện một số chức
năng logic phổ biến với cổng. Trong phần tiếp theo, chúng tôi sẽ xem cách triển
khai bất kỳ chức năng logic nào có thể được xây dựng bằng kiến thức này.
Trong thực tế, tất cả các chức năng logic có thể được xây dựng chỉ với một
loại cổng duy nhất, nếu cổng đó đảo ngược. Hai cổng đảo ngược phổ biến được
Cổng NOR Một đảo gọi BÌNH THƯỜNG và NAND và tương ứng với các cổng OR và AND đảo
ngược HOẶC cổng. ngược, tương ứng. Cổng NOR và NAND được gọi phổ quát, vì bất kỳ chức năng
Cổng NAND Một đảo logic nào cũng có thể được xây dựng bằng cách sử dụng loại cổng này. Các bài
ngược VÀ cổng. tập khám phá khái niệm này hơn nữa.
Kiểm tra Là hai biểu thức logic sau đây tương đương? Nếu không, hãy tìm một cài đặt của
Bản thân bạn các biến để hiển thị chúng không phải là :
■ (A⋅B⋅C) (A⋅C⋅B) (B⋅C⋅A)
■ B⋅(A⋅C C⋅A)

HÌNH A.2.1 Bản vẽ tiêu chuẩn cho cổng AND, cổng OR và biến tần, được hiển thị từ trái
sang phải. Các tín hiệu ở bên trái của mỗi biểu tượng là các đầu vào, trong khi đầu ra xuất hiện ở bên
phải. Các VÀ cổng OR đều có hai đầu vào. Biến tần có một đầu vào duy nhất.

A A
B B

HÌNH A.2.2 Thực hiện cổng logic của A + B sử dụng các đảo ngược rõ ràng ở bên trái và
các đầu vào và đầu ra sủi bọt ở bên phải. Chức năng logic này có thể được đơn giản hóaA B hoặc
trong Verilog ,
A & ~ B.
A.3 Logic kết hợp A-9

A.3 Logic kết hợp

Trong phần này, chúng tôi xem xét một vài khối xây dựng logic lớn hơn mà
chúng tôi sử dụng nhiều và chúng tôi thảo luận về thiết kế logic có cấu trúc có
thể được tự động thực hiện từ phương trình logic hoặc bảng sự thật bằng chương
trình dịch. Cuối cùng, chúng tôi thảo luận về khái niệm của một loạt các khối
logic.

Bộ giải mã
Một khối logic mà chúng ta sẽ sử dụng để xây dựng các thành phần lớn hơn là a bộ giải mã Một khối
bộ giải mã Loại giải mã phổ biến nhất có một. n-bit đầu vào và 2n đầu ra, trong logic có một n-bit đầu vào
đó chỉ có một đầu ra được khẳng định cho mỗi kết hợp đầu vào. Bộ giải mã này và 2n đầu ra, trong đó chỉ
dịch n-bit đầu vào thành tín hiệu tương ứng với giá trị nhị phân của n-bit đầu vào. có một đầu ra được khẳng
định cho mỗi kết hợp đầu
Do đó, các đầu ra thường được đánh số, giả sử, Out0, Out1, ..., Out2n -1. Nếu giá
vào.
trị của đầu vào là Tôi, rồi ra ngoàiTôi sẽ đúng và tất cả các đầu ra khác sẽ sai.
Hình A.3.1 hiển thị bộ giải mã 3 bit và bảng sự thật. Bộ giải mã này được gọi là a
Bộ giải mã 3-8 vì có ba đầu vào và tám (23) đầu ra. Ngoài ra còn có một yếu tố
logic được gọi là an bộ mã hóa thực hiện chức năng nghịch đảo của bộ giải mã,
lấy 2n đầu vào và sản xuất một nđầu ra -bit.

Đầu
vào Đầu ra
Hết0
12 11 10 Ra7 Ra6 Ra5 Ra4 Ra3 Ra2 Ra1 Hết0
Ra1
0 0 0 0 0 0 0 0 0 0 1
Ra2 0 0 1 0 0 0 0 0 0 1 0
3
Bộ giải Ra3 0 1 0 0 0 0 0 0 1 0 0
mã 0 1 1 0 0 0 0 1 0 0 0
Ra4
1 0 0 0 0 0 1 0 0 0 0
Ra5 1 0 1 0 0 1 0 0 0 0 0
Ra6 1 1 0 0 1 0 0 0 0 0 0
Ra7 1 1 1 1 0 0 0 0 0 0 0

a. Bộ giải mã 3 bit b. Bảng sự thật cho bộ giải mã 3 bit

HÌNH A.3.1 Bộ giải mã 3 bit có ba đầu vào, được gọi là 12, 11 và 10 và 23 = 8 đầu ra, được gọi là Out0 đến Out7. Chỉ có
đầu ra tương ứng với giá trị nhị phân của đầu vào là đúng, như được hiển thị trong bảng chân lý. Nhãn 3 trên đầu vào của bộ giải mã cho
biết tín hiệu đầu vào rộng 3 bit.
A-10 Phụ lục A Những điều cơ bản của thiết kế logic

A
A 0
M
bạn C C
x
B 1
B

S
S
HÌNH A.3.2 Một bộ ghép hai đầu vào ở bên trái và việc thực hiện nó với các cổng ở bên
phải. Bộ ghép kênh có hai đầu vào dữ liệu (A và B), được dán nhãn 0 và 1và một đầu vào bộ chọn (S),
cũng như một đầu ra CViệc triển khai bộ ghép kênh trong Verilog đòi hỏi nhiều công việc hơn, đặc biệt
khi chúng rộng hơn hai đầu vào. Chúng tôi chỉ ra cách thực hiện điều này bắt đầu trên trang A-23.

Bộ ghép kênh
Một chức năng logic cơ bản mà chúng ta sử dụng khá thường xuyên Chương 4 là
ghép kênh Một bộ ghép kênh có thể được gọi đúng hơn là a. người chọn, vì đầu ra
của nó là một trong những đầu vào được chọn bởi một điều khiển. Hãy xem xét
bộ ghép kênh hai đầu vào. Phía bên trái của Hình A.3.2 cho thấy bộ ghép kênh
giá trị bộ chọn Cũng này có ba đầu vào: hai giá trị dữ liệu và a người chọn (hoặc điều khiển) giá trị
thế gọi kiểm soát giá Giá trị bộ chọn xác định đầu vào nào sẽ trở thành đầu ra. Chúng ta có thể biểu
trịTín hiệu điều khiển diễn hàm logic được tính bằng bộ ghép kênh hai đầu vào, được hiển thị ở dạng
được sử dụng để chọn cổng ở bên phải. Hình A.3.2, như
một trong các giá trị đầu C (A⋅S) (B⋅S).
vào của bộ ghép kênh
làm đầu ra của bộ ghép
Bộ ghép kênh có thể được tạo với số lượng dữ liệu đầu vào tùy ý. Khi chỉ có
kênh. hai đầu vào, bộ chọn là một tín hiệu duy nhất chọn một trong các đầu vào nếu nó
đúng (1) và đầu kia nếu nó sai (0). Nếu có n dữ liệu đầu vào, sẽ cần phải có nhật
ký2 n đầu vào chọn. Trong trường hợp này, bộ ghép kênh về cơ bản bao gồm ba
phần :
1. Một bộ giải mã tạo ra n tín hiệu, mỗi chỉ ra một giá trị đầu vào khác nhau
2. Một mảng của n VÀ cổng, mỗi cổng kết hợp một trong các đầu vào với tín
hiệu từ bộ giải mã
3. Một cổng OR lớn duy nhất kết hợp các đầu ra của cổng AND
Để liên kết các đầu vào với các giá trị bộ chọn, chúng tôi thường dán nhãn cho
các đầu vào dữ liệu bằng số (tức là., 0, 1, 2, 3, ..., n −1) và diễn giải các đầu vào
của bộ chọn dữ liệu dưới dạng số nhị phân. Đôi khi, chúng ta sử dụng bộ ghép
kênh với tín hiệu bộ chọn chưa được mã hóa.
Bộ ghép kênh dễ dàng được thể hiện kết hợp trong Verilog bằng cách sử dụng
nếu biểu thức. Đối với bộ ghép kênh lớn hơn , trường hợp các tuyên bố thuận
tiện hơn, nhưng phải cẩn thận để tổng hợp logic tổ hợp.
A.3 Logic kết hợp A-11

Logic hai cấp và PLA


Như đã chỉ ra trong phần trước, mọi hàm logic có thể được thực hiện chỉ với các hàm
AND, OR và KHÔNG. Trong thực tế, một kết quả mạnh mẽ hơn nhiều là đúng. Bất
kỳ hàm logic nào cũng có thể được viết dưới dạng chính tắc, trong đó mọi đầu vào là
một biến thực hoặc bổ sung và chỉ có hai cấp độ cổng một là VÀ và một OR OR
khác có thể đảo ngược trên đầu ra cuối cùng. Một đại diện như vậy được gọi là a đại
diện hai cấpvà có hai hình thức, được gọi tổng số sản phẩm và sản phẩm của các tổng số sản phẩm Một
khoản tiền Biểu diễn tổng sản phẩm là tổng hợp lý (OR) của sản phẩm (các thuật ngữ hình thức biểu diễn logic
sử dụng tổng hợp logic
sử dụng toán tử AND); một sản phẩm của các khoản tiền chỉ là ngược lại. Trong ví
(OR) của sản phẩm (các
dụ trước đây của chúng tôi, chúng tôi đã có hai phương trình cho đầu ra. E:
thuật ngữ được nối bằng
E ((A⋅B) (A⋅C) (B⋅C))⋅(A⋅B⋅C) toán tử AND).


E (A⋅B⋅C) (A⋅C⋅B) (B⋅C⋅A)

Phương trình thứ hai này ở dạng tổng sản phẩm: nó có hai cấp độ logic và các
nghịch đảo duy nhất là trên các biến riêng lẻ. Phương trình đầu tiên có ba cấp độ
logic.

Xây dựng: Chúng tôi cũng có thể viết E như một sản phẩm của khoản tiền :

E (A B C)⋅(A C B)⋅(B C A)

Để có được hình thức này, bạn cần phải sử dụng Định lý DeMorgan, được thảo luận
trong các bài tập.

Trong văn bản này, chúng tôi sử dụng mẫu tổng sản phẩm. Thật dễ dàng để
thấy rằng bất kỳ hàm logic nào cũng có thể được biểu diễn dưới dạng tổng của
các sản phẩm bằng cách xây dựng một biểu diễn như vậy từ bảng chân lý cho
hàm. Mỗi mục nhập bảng sự thật mà hàm là true tương ứng với một thuật ngữ
sản phẩm. Thuật ngữ sản phẩm bao gồm một sản phẩm logic của tất cả các đầu
vào hoặc bổ sung của các đầu vào, tùy thuộc vào việc mục trong bảng chân lý có
0 hay 1 tương ứng với biến này hay không. Hàm logic là tổng logic của các thuật
ngữ sản phẩm trong đó hàm là true. Điều này dễ dàng nhìn thấy hơn với một ví
dụ.
A-12 Phụ lục A Những điều cơ bản của thiết kế logic

Tổng sản phẩm

Hiển thị biểu diễn tổng sản phẩm cho bảng chân lý sau đây cho D.
VÍ DỤ
Đầu vào Đầu ra
A B C D
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
1 1 1 1

Có bốn thuật ngữ sản phẩm, vì hàm này là đúng (1) cho bốn kết hợp đầu vào
TRẢ LỜI khác nhau. Đó là:
A⋅B⋅C
A⋅B⋅C
A⋅B⋅C
mảng logic lập A⋅B⋅C
trình (PLA)
A phần tử logic có cấu
trúc bao gồm một tập hợp Vì vậy, chúng ta có thể viết các chức năng cho D như tổng của các điều
các đầu vào và các bổ khoản này :
sung đầu vào tương ứng
và hai giai đoạn logic: D (A⋅B⋅C) (A⋅B⋅C) (A⋅B⋅C) (A⋅B⋅C)
phần đầu tiên tạo ra các
thuật ngữ sản phẩm của Lưu ý rằng chỉ những mục nhập bảng chân lý mà hàm là true mới tạo ra các
các đầu vào và bổ sung thuật ngữ trong phương trình.
đầu vào và phần thứ hai
tạo ra các thuật ngữ tổng Chúng ta có thể sử dụng mối quan hệ này giữa một bảng sự thật và một biểu diễn
của các thuật ngữ sản hai cấp để tạo ra một triển khai cấp cổng của bất kỳ tập hợp các hàm logic nào. Một
phẩm. Do đó, PLA thực
tập hợp các hàm logic tương ứng với một bảng chân lý có nhiều cột đầu ra, như
hiện các chức năng logic
dưới dạng tổng của sản chúng ta đã thấy trong ví dụ trên trang A-5. Mỗi cột đầu ra đại diện cho một hàm
phẩm. logic khác nhau, có thể được xây dựng trực tiếp từ bảng chân lý.
Biểu diễn tổng sản phẩm tương ứng với một triển khai logic có cấu trúc chung
minterms Cũng được gọi
điều khoản sản
được gọi là a mảng logic lập trình (PLA) PLA có một tập hợp các đầu vào và
phẩmMột bộ. của đầu vào các bổ sung đầu vào tương ứng (có thể được thực hiện với một tập hợp các bộ
logic được nối bởi kết hợp biến tần) và hai giai đoạn logic. Giai đoạn đầu tiên là một mảng VÀ cổng tạo
(hoạt động AND); các thành một tập hợp. điều khoản sản phẩm (đôi khi được gọi minterms); mỗi
thuật ngữ sản phẩm tạo thuật ngữ sản phẩm có thể bao gồm bất kỳ đầu vào hoặc bổ sung của chúng. Giai
thành giai đoạn logic đầu đoạn thứ hai là một mảng các cổng OR, mỗi cổng tạo thành một tổng hợp lý của
tiên của lập trình mảng bất kỳ số lượng thuật ngữ sản phẩm nào. Hình A.3.3 cho thấy hình thức cơ bản
logic (PLA).
của PLA .
A.3 Logic kết hợp A-13

Đầu vào VÀ cổng

Điều khoản sản phẩm

HOẶC cổng Đầu ra

HÌNH A.3.3 Hình thức cơ bản của PLA bao gồm một mảng VÀ cổng theo sau là một mảng các
cổng OR. Mỗi mục trong mảng cổng AND là một thuật ngữ sản phẩm bao gồm bất kỳ số lượng đầu vào hoặc
đầu vào đảo ngược. Mỗi mục trong mảng cổng OR là một thuật ngữ tổng bao gồm bất kỳ số lượng các điều khoản
sản phẩm này.

PLA có thể trực tiếp triển khai bảng chân lý của một tập hợp các hàm logic
với nhiều đầu vào và đầu ra. Vì mỗi mục nhập mà đầu ra là true yêu cầu một
thuật ngữ sản phẩm, sẽ có một hàng tương ứng trong PLA. Mỗi đầu ra tương ứng
với một hàng tiềm năng của cổng OR trong giai đoạn thứ hai. Số lượng cổng OR
tương ứng với số lượng mục nhập bảng chân lý mà đầu ra là đúng. Tổng kích
thước của PLA, chẳng hạn như được hiển thị trong Hình A.3.3, bằng tổng kích
thước của mảng cổng AND (được gọi là VÀ máy bay) và kích thước của mảng
cổng OR (được gọi là HOẶC máy bay). Nhìn vào Hình A.3.3, chúng ta có thể
thấy rằng kích thước của mảng cổng AND bằng số lượng đầu vào nhân với số
lượng thuật ngữ sản phẩm khác nhau và kích thước của mảng cổng OR là số đầu
ra nhân với số lượng thuật ngữ sản phẩm.
PLA có hai đặc điểm giúp làm cho nó trở thành một cách hiệu quả để thực hiện
một tập hợp các hàm logic. Đầu tiên, chỉ các mục bảng chân lý tạo ra giá trị thực
cho ít nhất một đầu ra có bất kỳ cổng logic nào được liên kết với chúng. Thứ hai,
mỗi thuật ngữ sản phẩm khác nhau sẽ chỉ có một mục trong PLA, ngay cả khi
thuật ngữ sản phẩm được sử dụng trong nhiều đầu ra. Hãy cùng xem một ví dụ.

PLA

Hãy xem xét tập hợp các hàm logic được xác định trong ví dụ trên trang A-5.
Chỉ
một thực hiện PLA của ví dụ này cho D, E, và F. VÍ DỤ
A-14 Phụ lục A Những điều cơ bản của thiết kế logic

Đây là bảng sự thật chúng tôi xây dựng trước đó :


TRẢ LỜI
Đầu vào Đầu ra
A B C D E F
0 0 0 0 0 0
0 0 1 1 0 0
0 1 0 1 0 0
0 1 1 1 1 0
1 0 0 1 0 0
1 0 1 1 1 0
1 1 0 1 1 0
1 1 1 1 0 1

Vì có bảy thuật ngữ sản phẩm duy nhất có ít nhất một giá trị thực trong phần
đầu ra, sẽ có bảy cột trong mặt phẳng AND. Số lượng hàng trong mặt phẳng
AND là ba (vì có ba đầu vào) và cũng có ba hàng trong mặt phẳng OR (vì có
ba đầu ra). Hình A.3.4 hiển thị PLA kết quả, với các thuật ngữ sản phẩm
tương ứng với các mục trong bảng chân lý từ trên xuống dưới.

Thay vì vẽ tất cả các cổng, như chúng ta làm trong Hình A.3.4, các nhà thiết kế
bộ nhớ chỉ đọc (ROM) thường chỉ hiển thị vị trí của cổng AND và cổng OR. Các dấu chấm được sử dụng
Một ký ức có nội dung
trên giao điểm của đường tín hiệu thuật ngữ sản phẩm và đường đầu vào hoặc đường
được chỉ định tại thời điểm
tạo, sau đó nội dung chỉ có đầu ra khi cần có cổng AND hoặc cổng OR tương ứng. Hình A.3.5 cho thấy PLA của
thể được đọc. ROM được như thế nào Hình A.3.4 sẽ nhìn khi được vẽ theo cách này. Nội dung của PLA được
sử dụng làm logic cấu trúc cố định khi PLA được tạo, mặc dù cũng có các dạng cấu trúc giống như PLA, được
để thực hiện a gọi PLA, điều đó có thể được lập trình điện tử khi một nhà thiết kế sẵn sàng sử dụng
đặt các hàm logic bằng chúng.
cách sử dụng các thuật
ngữ trong các hàm logic
làm đầu vào địa chỉ và ROM
đầu ra dưới dạng bit Một dạng logic cấu trúc khác có thể được sử dụng để thực hiện một tập hợp các
trong mỗi từ của bộ nhớ. hàm logic là a bộ nhớ chỉ đọc (ROM) ROM được gọi là bộ nhớ vì nó có một tập
ROM lập trình hợp các vị trí có thể đọc được; tuy nhiên, nội dung của các vị trí này là cố định,
(PROM) Một hình thức thường là tại thời điểm ROM được sản xuất. Cũng có. lập trình ROM (PROM)
bộ nhớ chỉ đọc có thể có thể được lập trình điện tử, khi một nhà thiết kế biết nội dung của họ. Ngoài ra
được lập trình khi một còn có các KHUYẾN MÃI có thể xóa được; các thiết bị này yêu cầu quá trình
nhà thiết kế biết nội dung xóa chậm bằng ánh sáng cực tím và do đó được sử dụng làm bộ nhớ chỉ đọc,
của nó.
ngoại trừ trong quá trình thiết kế và gỡ lỗi.
ROM có một tập hợp các dòng địa chỉ đầu vào và một tập hợp các đầu ra. Số
lượng mục có thể định địa chỉ trong ROM xác định số lượng dòng địa chỉ: nếu
A.3 Logic kết hợp A-15

ROM chứa 2m mục địa chỉ, được gọi là chiều cao, sau đó có m dòng đầu vào. Số
lượng bit trong mỗi mục nhập có thể định địa chỉ bằng số bit đầu ra và đôi khi
được gọi là chiều rộng của ROM. Tổng số bit trong ROM bằng chiều cao nhân
với chiều rộng. Chiều cao và chiều rộng đôi khi được gọi chung là hình dạng của
ROM .

Đầu vào
A
B
C

Đầu ra
D

HÌNH A.3.4 PLA để thực hiện chức năng logic được mô tả trong ví dụ.

ROM có thể mã hóa một tập hợp các hàm logic trực tiếp từ bảng chân lý. Ví
dụ, nếu có n chức năng với m đầu vào, chúng tôi cần một ROM với m dòng địa
chỉ (và 2m mục), với mỗi mục được n bit rộng. Các mục trong phần đầu vào của
bảng chân lý thể hiện địa chỉ của các mục trong ROM, trong khi nội dung của
phần đầu ra của bảng chân lý tạo thành nội dung của ROM. Nếu bảng chân lý
được sắp xếp sao cho chuỗi các mục trong phần đầu vào tạo thành một chuỗi các
số nhị phân (như có tất cả các bảng sự thật chúng tôi đã chỉ ra cho đến nay) sau
đó phần đầu ra cũng cung cấp nội dung ROM theo thứ tự. Trong ví dụ bắt đầu từ
trang A-13, có ba đầu vào và ba đầu ra. Điều này dẫn đến một ROM với 23 = 8
mục, mỗi mục rộng 3 bit. Nội dung của các mục đó theo thứ tự tăng theo địa chỉ
được cung cấp trực tiếp bởi phần đầu ra của bảng sự thật xuất hiện trên trang A-
14.
ROM và PLA có liên quan chặt chẽ. ROM được giải mã hoàn toàn: nó chứa một từ
đầu ra đầy đủ cho mọi kết hợp đầu vào có thể. Một PLA chỉ được giải mã một phần.
Điều này có nghĩa là ROM sẽ luôn chứa nhiều mục hơn. Đối với bảng sự thật trước
đó trên trang A-14, ROM chứa các mục nhập cho tất cả tám đầu vào có thể, trong khi
PLA chỉ chứa bảy thuật ngữ sản phẩm đang hoạt động. Khi số lượng đầu vào tăng lên ,
A-16 Phụ lục A Những điều cơ bản của thiết kế logic

Đầu
vào
A

B VÀ máy
bay

Đầu ra
D

HOẶC máy bay E

HÌNH A.3.5 Một PLA được vẽ bằng các dấu chấm để chỉ ra các thành phần của các thuật
ngữ sản phẩm và các thuật ngữ tổng trong mảng. Thay vì sử dụng bộ biến tần trên cổng, thông
thường tất cả các đầu vào đều chạy chiều rộng của mặt phẳng AND ở cả dạng thật và dạng bổ sung. Một
dấu chấm trong mặt phẳng AND chỉ ra rằng đầu vào hoặc nghịch đảo của nó xảy ra trong thuật ngữ sản
phẩm. Một dấu chấm trong mặt phẳng OR chỉ ra rằng thuật ngữ sản phẩm tương ứng xuất hiện trong đầu
ra tương ứng.

số lượng mục trong ROM tăng theo cấp số nhân. Ngược lại, đối với hầu hết các hàm
logic thực, số lượng thuật ngữ sản phẩm tăng chậm hơn nhiều (xem các ví dụ trong
Phụ lục C). Sự khác biệt này làm cho PLA thường hiệu quả hơn để thực hiện các
chức năng logic tổ hợp. ROM có lợi thế là có thể thực hiện bất kỳ chức năng logic
nào với số lượng đầu vào và đầu ra phù hợp. Ưu điểm này giúp thay đổi nội dung
ROM dễ dàng hơn nếu chức năng logic thay đổi, vì kích thước của ROM không
cần thay đổi.
Ngoài ROM và PLA, các hệ thống tổng hợp logic hiện đại cũng sẽ dịch các
khối nhỏ logic tổ hợp thành một tập hợp các cổng có thể được đặt và nối dây tự
động. Mặc dù một số bộ sưu tập cổng nhỏ thường không hiệu quả theo khu vực,
nhưng đối với các chức năng logic nhỏ, chúng có ít chi phí hơn so với cấu trúc
cứng của ROM và PLA và do đó được ưu tiên.
Để thiết kế logic bên ngoài mạch tích hợp tùy chỉnh hoặc bán tự động, một lựa chọn
phổ biến là một thiết bị lập trình trường; chúng tôi mô tả các thiết bị này trong Mục A.12.
A.3 Logic kết hợp A-17

1 0
Don lồng Cares 1 1
1 1
Thông thường trong việc thực hiện một số logic tổ hợp, có những tình huống
chúng ta không quan tâm giá trị của một số đầu ra là gì, vì một đầu ra khác là
đúng hoặc do một tập hợp con của các kết hợp đầu vào xác định giá trị của đầu ra.
Những tình huống như vậy được gọi là don lồng quan tâmDonv quan tâm rất
quan trọng vì chúng giúp dễ dàng tối ưu hóa việc thực hiện chức năng logic hơn.
Có hai loại don lồng quan tâm: đầu ra don don quan tâm và đầu vào don don
quan tâm, cả hai đều có thể được thể hiện trong một bảng sự thật. Đầu ra don
lồng quan tâm phát sinh khi chúng tôi không quan tâm đến giá trị của đầu ra cho
một số kết hợp đầu vào. Chúng xuất hiện dưới dạng X trong phần đầu ra của
bảng chân lý. Khi một đầu ra là một sự chăm sóc don don cho một số kết hợp
đầu vào, chương trình tối ưu hóa logic hoặc thiết kế có thể tự do làm cho đầu ra
đúng hoặc sai cho kết hợp đầu vào đó. Đầu vào don lồng quan tâm phát sinh khi
một đầu ra chỉ phụ thuộc vào một số đầu vào và chúng cũng được hiển thị dưới
dạng X, mặc dù trong phần đầu vào của bảng sự thật.

Don lồng Cares

Hãy xem xét một chức năng logic với đầu vào A, B, và C được định nghĩa
như sau :
■ Nếu A hoặc là C là đúng, sau đó đầu ra D là đúng, bất kể giá trị của B.
■ Nếu A hoặc là B là đúng, sau đó đầu ra E là đúng, bất kể giá trị của C.
■ Đầu ra F là đúng nếu chính xác một trong những đầu vào là đúng, mặc
dù chúng tôi không quan tâm đến giá trị của nó F, bất cứ khi nào D và
E đều đúng.
Hiển thị bảng sự thật đầy đủ cho chức năng này và bảng sự thật bằng cách sử
dụng don lồng quan tâm. Có bao nhiêu điều khoản sản phẩm được yêu cầu
trong PLA cho mỗi điều khoản này?

Ở đây, bảng sự thật đầy đủ, không có don don quan tâm :

Đầu vào Đầu ra


A B C D E F
0 0 0 0 0 0
0 0 1 1 0 1
0 1 0 0 1 1
0 1 1 1 1 0
1 0 0 1 1 1
VÍ DỤ

TRẢ LỜI
A-18 Phụ lục A Những điều cơ bản của thiết kế logic

Điều này đòi hỏi bảy điều khoản sản phẩm mà không tối ưu hóa. Bảng sự
thật được viết với đầu ra don lồng quan tâm trông như thế này :

Đầu vào Đầu ra


A B C D E F
0 0 0 0 0 0
0 0 1 1 0 1
0 1 0 0 1 1
0 1 1 1 1 X
1 0 0 1 1 X
1 0 1 1 1 X
1 1 0 1 1 X
1 1 1 1 1 X

Nếu chúng ta cũng sử dụng đầu vào don lồng quan tâm, bảng sự thật này
có thể được đơn giản hóa hơn nữa để mang lại những điều sau đây :

Đầu vào Đầu ra


A B C D E F
0 0 0 0 0 0
0 0 1 1 0 1
0 1 0 0 1 1
X 1 1 1 1 X
1 X X 1 1 X

Bảng chân lý đơn giản hóa này yêu cầu PLA với bốn minterms hoặc có thể
được triển khai trong các cổng riêng biệt với một cổng VÀ hai đầu vào và ba
cổng OR (hai với ba đầu vào và một với hai đầu vào). Điều này so sánh với bảng
sự thật ban đầu có bảy minterms và sẽ yêu cầu bốn cổng AND.

Giảm thiểu logic là rất quan trọng để đạt được triển khai hiệu quả. Một công cụ
hữu ích để giảm thiểu tay của logic ngẫu nhiên là Bản đồ KarnaughBản đồ Karnaugh
đại diện cho bảng chân lý bằng đồ họa, do đó các thuật ngữ sản phẩm có thể được kết
hợp có thể dễ dàng nhìn thấy. Tuy nhiên, tối ưu hóa tay của các chức năng logic quan
trọng bằng cách sử dụng bản đồ Karnaugh là không thực tế, cả vì kích thước của bản
đồ và độ phức tạp của chúng. May mắn thay, quá trình giảm thiểu logic rất cơ học và
có thể được thực hiện bằng các công cụ thiết kế. Trong quá trình giảm thiểu, các công
cụ tận dụng lợi thế của don don quan tâm, vì vậy việc chỉ định chúng là quan trọng.
Các tài liệu tham khảo trong sách giáo khoa ở cuối phụ lục này cung cấp thảo luận
thêm về giảm thiểu logic, bản đồ Karnaugh và lý thuyết đằng sau các thuật toán giảm
thiểu như vậy.

Mảng các yếu tố logic


Nhiều thao tác kết hợp được thực hiện trên dữ liệu phải được thực hiện cho toàn
bộ từ (64 bit) dữ liệu. Vì vậy, chúng ta thường muốn xây dựng một mảng logic
A.3 Logic kết hợp A-19

các yếu tố, mà chúng ta có thể biểu diễn đơn giản bằng cách chỉ ra rằng một hoạt
động nhất định sẽ xảy ra với toàn bộ bộ sưu tập các đầu vào. Bên trong một chiếc
máy, phần lớn thời gian chúng tôi muốn chọn giữa một cặp xe buýt A. xe buýt là xe buýt Trong thiết kế
tập hợp các dòng dữ liệu được coi là một tín hiệu logic duy nhất. (Thuật ngữ xe logic, a thu thập các
buýt cũng được sử dụng để chỉ ra một tập hợp các dòng được chia sẻ với nhiều dòng dữ liệu được xử lý
nguồn và cách sử dụng.) cùng nhau như một tín
hiệu logic duy nhất;
Ví dụ: trong tập lệnh RISC-V, kết quả của một lệnh được ghi vào một thanh ghi
Ngoài ra, một bộ sưu tập
có thể đến từ một trong hai nguồn. Một bộ ghép kênh được sử dụng để chọn cái nào các dòng có nhiều nguồn
trong hai xe buýt (mỗi chiếc rộng 32 bit) sẽ được ghi vào thanh ghi Kết quả. Bộ ghép và sử dụng.
kênh 1 bit, mà chúng tôi đã trình bày trước đó, sẽ cần phải được sao chép
32 lần.
Chúng tôi chỉ ra rằng tín hiệu là một bus chứ không phải là một dòng 1 bit bằng
cách hiển thị nó với
một đường dày hơn trong một hình. Hầu hết các xe buýt rộng 32 bit; những cái không
được dán nhãn rõ ràng với chiều rộng của chúng. Khi chúng tôi hiển thị một đơn vị
logic có đầu vào và đầu ra là xe buýt, điều này có nghĩa là đơn vị phải được sao chép
đủ số lần để phù hợp với chiều rộng của đầu vào. Hình A.3.6 cho thấy cách chúng ta
vẽ một bộ ghép kênh chọn giữa một cặp xe buýt 32 bit và cách nó mở rộng theo các
bộ ghép kênh rộng 1 bit. Đôi khi chúng ta cần xây dựng một mảng các phần tử logic
trong đó các đầu vào cho một số phần tử trong mảng là đầu ra từ các phần tử trước đó.
Ví dụ, đây là cách ALU đa dạng được xây dựng. Trong các trường hợp như vậy,
chúng ta phải chỉ ra rõ ràng cách tạo các mảng rộng hơn, vì các phần tử riêng lẻ của
mảng không còn độc lập, vì chúng nằm trong trường hợp của bộ ghép kênh rộng 32
bit.
Chọn Chọn

32
A A31
M M
32
bạn C bạn C31
x x
B31
B 32

A30
M
bạn C30
x .
.

B30 .
.
.
.

A0

bạn C0
x
B0

a. Bộ ghép kênh 2-1 rộng 32 bit b. Bộ ghép kênh rộng 32 bit thực sự là
một mảng gồm 32 bộ ghép kênh 1 bit
HÌNH A.3.6 Một bộ ghép kênh được sắp xếp 64 lần để thực hiện lựa chọn giữa hai đầu
vào 64 bit. Lưu ý rằng vẫn chỉ có một tín hiệu chọn dữ liệu được sử dụng cho tất cả 32 bộ ghép kênh 1
bit.
A-20 Phụ lục A Những điều cơ bản của thiết kế logic

Kiểm tra chẵn lẻ là một hàm trong đó đầu ra phụ thuộc vào số 1s trong đầu vào. Đối với
Bản hàm chẵn lẻ, đầu ra là 1 nếu đầu vào có số chẵn. Giả sử ROM được sử dụng để
thân bạn thực hiện chức năng chẵn lẻ với đầu vào 4 bit. Cái nào của A, B, C hoặc D đại
diện cho nội dung của ROM?

Địa chỉ A B C D
0 0 1 0 1
1 0 1 1 0
2 0 1 0 1
3 0 1 1 0
4 0 1 0 1
5 0 1 1 0
6 0 1 0 1
7 0 1 1 0
số 8 1 0 0 1
9 1 0 1 0
10 1 0 0 1
11 1 0 1 0
12 1 0 0 1
13 1 0 1 0
14 1 0 0 1
15 1 0 1 0

A.4 Sử dụng ngôn ngữ mô tả phần cứng

Ngày nay, hầu hết các thiết kế kỹ thuật số của bộ xử lý và các hệ thống phần
ngôn ngữ mô tả phần cứng liên quan đều được thực hiện bằng cách sử dụng a ngôn ngữ mô tả phần
cứng cứngMột ngôn ngữ như vậy phục vụ hai mục đích. Đầu tiên, nó cung cấp một
Một ngôn ngữ lập trình để mô tả trừu tượng về phần cứng để mô phỏng và gỡ lỗi thiết kế. Thứ hai, với việc
mô tả phần cứng, được sử sử dụng các công cụ tổng hợp logic và biên dịch phần cứng, mô tả này có thể
dụng để tạo mô phỏng của
được biên dịch vào việc triển khai phần cứng.
thiết kế phần cứng và cũng
là đầu vào cho các công cụ
Trong phần này, chúng tôi giới thiệu ngôn ngữ mô tả phần cứng Verilog và
tổng hợp có thể tạo ra phần cho biết cách sử dụng nó cho thiết kế kết hợp. Trong phần còn lại của phụ lục,
cứng thực tế. chúng tôi mở rộng việc sử dụng Verilog để bao gồm thiết kế logic tuần tự. Trong
Verilog Một trong hai
các phần tùy chọn của Chương 4 xuất hiện trực tuyến, chúng tôi sử dụng Verilog
ngôn ngữ mô tả phần
để mô tả việc triển khai bộ xử lý. Trong phần tùy chọn từ Chương 5 xuất hiện
cứng phổ biến nhất. trực tuyến, chúng tôi sử dụng Verilog hệ thống để mô tả việc triển khai bộ điều
khiển bộ đệm. System Verilog bổ sung các cấu trúc và một số tính năng hữu ích
VHDL Một trong hai khác cho Verilog.
ngôn ngữ mô tả phần Verilog là một trong hai ngôn ngữ mô tả phần cứng chính; khác là
cứng phổ biến nhất. VHDLVerilog được sử dụng nhiều hơn trong công nghiệp và dựa trên C, trái
ngược với VHDL, dựa trên Ada. Người đọc thường quen thuộc với C sẽ tìm thấy
những điều cơ bản
của Verilog, mà
chúng tôi sử dụng
trong phụ lục này, dễ
làm theo.
A.4 Sử dụng ngôn ngữ mô tả phần cứng A-21

Người đọc đã quen thuộc với VHDL nên tìm các khái niệm đơn giản, miễn là
chúng được tiếp xúc với cú pháp của C .
Verilog có thể chỉ định cả định nghĩa hành vi và cấu trúc của hệ thống kỹ thuật
số. A đặc điểm kỹ thuật hành vi mô tả cách một hệ thống kỹ thuật số hoạt động hành vi
chức năng. A đặc điểm kỹ thuật cấu trúc mô tả tổ chức chi tiết của một hệ đặc điểm kỹ thuật Mô
thống kỹ thuật số, thường sử dụng mô tả phân cấp. Một đặc tả cấu trúc có thể tả
được sử dụng để mô tả một hệ thống phần cứng theo phân cấp các yếu tố cơ bản làm thế nào một hệ thống
kỹ thuật số
như cổng và công tắc. Do đó, chúng ta có thể sử dụng Verilog để mô tả nội dung hoạt động chức năng.
chính xác của các bảng sự thật và datapath của phần cuối cùng.
Với sự xuất hiện của công cụ tổng hợp phần cứng, hầu hết các nhà thiết kế hiện kết cấu
sử dụng Verilog hoặc VHDL để mô tả cấu trúc chỉ datapath, dựa vào tổng hợp logic đặc điểm kỹ thuật Mô
để tạo ra điều khiển từ mô tả hành vi. Ngoài ra, hầu hết các hệ thống CAD cung cấp tả
làm thế nào một hệ thống
các thư viện rộng lớn gồm các bộ phận được tiêu chuẩn hóa, chẳng hạn như ALU, bộ
kỹ thuật số là
ghép kênh, tệp đăng ký, bộ nhớ và khối logic lập trình, cũng như các cổng cơ bản. được tổ chức theo nghĩa
Có được một kết quả chấp nhận được bằng cách sử dụng các thư viện và tổng hợp của a
logic đòi hỏi đặc tả phải được viết bằng mắt đối với tổng hợp cuối cùng và kết quả kết nối phân cấp của
mong muốn. Đối với các thiết kế đơn giản của chúng tôi, điều này chủ yếu có nghĩa các yếu tố.
là làm rõ những gì chúng tôi mong đợi sẽ được thực hiện trong logic kết hợp và công cụ tổng hợp phần
những gì chúng tôi mong đợi đòi hỏi trong logic tuần tự. Trong hầu hết các ví dụ cứng Hỗ trợ máy tính
chúng tôi sử dụng trong phần này và phần còn lại của phụ lục này, chúng tôi đã viết phần mềm thiết kế có thể
Verilog với sự tổng hợp cuối cùng trong tâm trí. tạo ra một thiết kế cấp
cổng dựa trên các mô tả
hành vi của một hệ thống
kỹ thuật số.

Datatypes và Toán tử trong Verilog chỉ định một tệp đăng


ký biến tương đương
Có hai kiểu dữ liệu chính trong Verilog :
với tệp đăng ký
1. A dây chỉ định một tín hiệu tổ hợp. RISC-V, trong đó
2. A reg (đăng ký) giữ một giá trị, có thể thay đổi theo thời gian. Một reg thanh ghi 0 là đầu tiên.
không nhất thiết phải tương ứng với một đăng ký thực tế trong một thực Khi truy cập một
hiện, mặc dù nó thường sẽ. mảng, chúng ta có thể
tham khảo một phần
Một thanh ghi hoặc dây, được đặt tên X, rộng 32 bit được khai báo dưới dạng
một mảng : reg [31: 0] X hoặc là dây [31: 0] X, cũng đặt chỉ số 0 để chỉ định ít quan tử duy nhất, như trong
trọng nhất của đăng ký. Vì chúng ta thường muốn truy cập vào một trường con C, bằng cách sử dụng
của thanh ghi hoặc dây, chúng ta có thể đề cập đến một tập hợp các bit liền kề của ký hiệu đăng ký
thanh ghi hoặc dây có ký hiệu [bit bắt đầu: bit kết thúc], trong đó cả hai chỉ số phải [regnum].
là giá trị không đổi.

Một mảng các thanh ghi được sử dụng cho một cấu trúc như tệp đăng ký hoặc
bộ nhớ. Như vậy, tuyên bố
reg [31: 0] registerfile [0:31]
dây Trong Verilog, chỉ định một tín hiệu kết hợp.
reg Trong Verilog, một đăng ký.
A-22 Phụ lục A Những điều cơ bản của thiết kế logic

Các giá trị có thể cho một thanh ghi hoặc dây trong Verilog là
■ 0 hoặc 1, đại diện cho logic sai hoặc đúng
■ X, đại diện cho ẩn số, giá trị ban đầu được đưa ra cho tất cả các thanh ghi
và cho bất kỳ dây nào không được kết nối với một cái gì đó
■ Z, đại diện cho trạng thái trở ngại cao cho các cổng tristate, mà chúng ta sẽ
không thảo luận trong phụ lục này
Các giá trị không đổi có thể được chỉ định là số thập phân cũng như nhị phân,
bát phân hoặc thập lục phân. Chúng ta thường muốn nói chính xác mức độ lớn
của một trường không đổi trong bit. Điều này được thực hiện bằng cách thêm tiền
tố vào giá trị với số thập phân chỉ định kích thước của nó theo bit. Ví dụ:
■ 4 conb0100 chỉ định hằng số nhị phân 4 bit với giá trị 4, cũng như vậy 4
cond4.
■ −8 H44 chỉ định hằng số 8 bit với giá trị −4 (trong hai bổ sung đại diện)
Các giá trị cũng có thể được nối bằng cách đặt chúng bên trong {} cách nhau bằng
dấu phẩy.
Ký hiệu {x {bitfield}} sao chép bitfield x lần. Ví dụ:
■ {16 {2 bóngb01}} tạo giá trị 32 bit với mẫu 0101 ... 01.
■ {A [31:16], B [15: 0]} tạo ra một giá trị có 16 bit trên đến từ A và có 16 bit
thấp hơn đến từ B.
Verilog cung cấp đầy đủ các toán tử unary và nhị phân từ C, bao gồm các toán
tử số học (+, -, *. /), toán tử logic (&, |, ~), toán tử so sánh (= =, ! =,>, <, <=,> =),
toán tử dịch chuyển (<<,>>) và toán tử điều kiện C lề (?, được sử dụng trong các
hình thức điều kiện ? expr1: expr2 và trở về expr1 nếu điều kiện là đúng và expr2
nếu nó sai). Verilog thêm một tập hợp các toán tử giảm logic unary (&, |, ^) mang
lại một bit duy nhất bằng cách áp dụng toán tử logic cho tất cả các bit của toán
hạng. Ví dụ, & A trả về giá trị thu được bằng cách ANDing tất cả các bit của A
cùng nhau, và ^A trả về mức giảm thu được bằng cách sử dụng OR độc quyền
trên tất cả các bit của A.

Kiểm tra
Cái nào sau đây xác định chính xác cùng một giá trị?
Bản
thân bạn 1. 8 conbimoooo
2. 8 giờ sáng
3. 8 cond240
4. {{4 {1 Khănb1}}, {4 {1 Khănb0}}}
5. {4 conb1,4 conb0)
A.4 Sử dụng ngôn ngữ mô tả phần cứng A-23

Cấu trúc của một chương trình Verilog


Một chương trình Verilog được cấu trúc như một tập hợp các mô-đun, có thể đại diện
cho bất cứ điều gì từ một tập hợp các cổng logic đến một hệ thống hoàn chỉnh. Các
mô-đun tương tự như các lớp trong C ++, mặc dù gần như không mạnh bằng. Một
mô-đun chỉ định các cổng đầu vào và đầu ra của nó, mô tả các kết nối đến và đi của
một mô-đun. Một mô-đun cũng có thể khai báo các biến bổ sung. Phần thân của một
mô-đun bao gồm :
■ ban đầu xây dựng, có thể khởi tạo reg biến
■ Bài tập liên tục, trong đó chỉ xác định logic tổ hợp
■ luôn luôn các cấu trúc, có thể xác định tuần tự hoặc tổ hợp logic

■ Các trường hợp của các mô-đun khác, được sử dụng để thực hiện mô-đun
được xác định

Đại diện cho logic kết hợp phức tạp trong Verilog
Một bài tập liên tục, được chỉ định với từ khóa giao, hoạt động giống như một
hàm logic tổ hợp: đầu ra được gán liên tục giá trị và thay đổi giá trị đầu vào được
phản ánh ngay lập tức trong giá trị đầu ra. Dây chỉ có thể được gán giá trị với các
phép gán liên tục. Sử dụng các bài tập liên tục, chúng ta có thể xác định một mô-
đun thực hiện một nửa adder, như Hình A.4.1 chương trình.
Gán các câu lệnh là một cách chắc chắn để viết Verilog tạo ra logic tổ hợp.
Tuy nhiên, đối với các cấu trúc phức tạp hơn, các câu lệnh gán có thể khó xử
hoặc tẻ nhạt khi sử dụng. Nó cũng có thể sử dụng luôn luôn khối của một mô-đun
để mô tả một yếu tố logic kết hợp, mặc dù phải cẩn thận. Sử dụng một luôn luôn
khối cho phép bao gồm các cấu trúc điều khiển Verilog, chẳng hạn như if-then-
other, trường hợp tuyên bố, cho tuyên bố, và lặp lại báo cáo, sẽ được sử dụng.
Những tuyên bố này tương tự như những tuyên bố trong C với những thay đổi
nhỏ.
An luôn luôn block chỉ định một danh sách tùy chọn các tín hiệu mà khối nhạy
cảm (trong danh sách bắt đầu bằng @). Các luôn luôn khối được đánh giá lại nếu

HÌNH A.4.1 Một mô-đun Verilog xác định một nửa người làm việc bằng cách sử dụng các bài tập liên tục.
A-24 Phụ lục A Những điều cơ bản của thiết kế logic

tín hiệu được liệt kê thay đổi giá trị; nếu danh sách bị bỏ qua, luôn luôn khối liên tục
danh sách nhạy cảm được đánh giá lại. Khi một luôn luôn khối đang chỉ định logic tổ hợp, nhạy cảm danh
Danh sách tín hiệu chỉ sách nên bao gồm tất cả các tín hiệu đầu vào. Nếu có nhiều câu lệnh Verilog được
định khi an luôn luôn thực hiện trong một luôn luôn khối, chúng được bao quanh bởi các từ khóa bắt đầu và
khối nên được đánh giá
kết thúc, thay thế {và} trong C. An luôn luôn khối như vậy trông như thế này :
lại.
luôn @ (danh sách các tín hiệu gây ra đánh giá lại) bắt đầu
Báo cáo Verilog bao gồm các bài tập và kết thúc báo cáo kiểm soát khác

Reg các biến chỉ có thể được chỉ định bên trong an luôn luôn chặn, sử dụng một thủ
tục tuyên bố chuyển nhượng (như được phân biệt với chuyển nhượng liên tục chúng
tôi đã thấy trước đó). Tuy nhiên, có hai loại bài tập thủ tục khác nhau. Toán tử gán =
thực thi như trong C; phía bên phải được đánh giá và phía bên trái được gán giá trị.
Hơn nữa, nó thực thi giống như câu lệnh gán C thông thường: nghĩa là nó được hoàn
thành trước khi câu lệnh tiếp theo được thực thi. Do đó, toán tử gán = có tên chặn
chặn chuyển nhượng chuyển nhượngViệc chặn này có thể hữu ích trong việc tạo ra logic tuần tự và chúng
Trong Verilog, một tôi sẽ sớm quay lại với nó. Các hình thức chuyển nhượng khác (.không chặn) được
nhiệm vụ hoàn thành chỉ định bởi <= Trong bài tập không chặn, tất cả các mặt bên phải của bài tập trong an.
trước khi thực hiện tuyên luôn luôn nhóm được đánh giá và các bài tập được thực hiện đồng thời. Là một ví dụ
bố tiếp theo. đầu tiên về logic tổ hợp được thực hiện bằng cách sử dụng an luôn luôn khối, Hình
phân công không chặn A.4.2 cho thấy việc thực hiện bộ ghép kênh 4 trên 1, sử dụng a trường hợp xây dựng
An chuyển nhượng tiếp để làm cho nó dễ dàng để viết. Các trường hợp xây dựng trông giống như một C công
tục sau khi đánh giá phía tắc tuyên bố. Hình A.4.3 cho thấy định nghĩa về ALU RISC-V, cũng sử dụng a trường
bên tay phải, chỉ gán phía hợp tuyên bố.
bên trái giá trị sau khi tất
cả các bên tay phải được
Vì chỉ các biến reg có thể được chỉ định bên trong luôn luôn các khối, khi
đánh giá. chúng ta muốn mô tả logic tổ hợp bằng cách sử dụng an luôn luôn chặn, phải cẩn
thận để đảm bảo rằng reg không tổng hợp thành một thanh ghi. Một loạt các cạm
bẫy được mô tả trong phần xây dựng dưới đây.

Xây dựng: Báo cáo chuyển nhượng liên tục luôn mang lại logic tổ hợp , nhưng
các cấu trúc Verilog khác, ngay cả khi vào luôn luôn khối, có thể mang lại kết quả bất
ngờ trong quá trình tổng hợp logic. Vấn đề phổ biến nhất là tạo ra logic tuần tự bằng
cách ngụ ý sự tồn tại của một chốt hoặc thanh ghi, dẫn đến việc thực hiện vừa chậm
hơn vừa tốn kém hơn dự định. Để đảm bảo rằng logic mà bạn dự định là tổ hợp được
tổng hợp theo cách đó, hãy đảm bảo bạn làm như sau :
1. Đặt tất cả logic tổ hợp trong một bài tập liên tục hoặc một luôn luôn khối.

2. Đảm bảo rằng tất cả các tín hiệu được sử dụng làm đầu vào xuất hiện trong
danh sách độ nhạy của an luôn luôn khối.
3. Đảm bảo rằng mọi con đường thông qua một luôn luôn khối gán một giá trị cho
cùng một tập hợp bit.
Cuối cùng trong số này là dễ bỏ qua nhất; đọc qua ví dụ trong Hình A.5.15 để
thuyết phục bản thân rằng tài sản này được tuân thủ.
A.4 Sử dụng ngôn ngữ mô tả phần cứng A-25

HÌNH A.4.2 Một định nghĩa Verilog của bộ ghép kênh 4 trên 1 với đầu vào 32 bit, sử dụng
a trường hợp tuyên bố. Các trường hợp tuyên bố hoạt động như một C công tắc tuyên bố, ngoại
trừ trong Verilog chỉ có mã liên quan đến trường hợp đã chọn được thực thi (như thể mỗi trạng thái trường
hợp có một sự phá vỡ ở cuối) và không có sự rơi vào tuyên bố tiếp theo.

HÌNH A.4.3 Một định nghĩa hành vi Verilog của RISC-V ALU . Điều này có thể được tổng hợp bằng cách sử dụng một thư viện mô-
đun có chứa cơ bản toán học và logic.
A-26 Phụ lục A Những điều cơ bản của thiết kế logic

Kiểm tra Giả sử tất cả các giá trị ban đầu bằng không, các giá trị của là gì A và B sau khi
Bản thực hiện mã Verilog này bên trong an luôn luôn khối?
thân bạn C = 1;
A <= C;
B = C;

Xây dựng một số học cơ bản


A.5
Đơn vị logic
ALU n. [Arthritic Các đơn vị logic số học (ALU) là sự tinh tế của máy tính, thiết bị tạo thành các
Lthuốc phiện Unit phép toán số học như phép cộng và phép trừ hoặc các phép toán logic như AND
hoặc (hiếm) Asố học và OR. Phần này xây dựng ALU từ bốn khối xây dựng phần cứng (cổng AND và
Lthuốc phiện Unit] OR, bộ biến tần và bộ ghép kênh) và minh họa cách logic tổ hợp hoạt động.
A máy phát số ngẫu Trong phần tiếp theo, chúng ta sẽ thấy cách bổ sung có thể được tăng tốc thông
nhiên được cung qua các thiết kế thông minh hơn.
cấp theo tiêu chuẩn Vì các thanh ghi RISC-V rộng 32 bit, chúng tôi cần ALU rộng 32 bit. Giả sử
với tất cả các hệ rằng chúng tôi sẽ kết nối 32 ALU 1 bit để tạo ALU mong muốn. Do đó, chúng
thống máy tính. tôi sẽ bắt đầu bằng cách xây dựng ALU 1 bit .
Stan Kelly-Bootle ,
Các Từ điển quỷ dữ ALU 1 bit
DP, 1981 Các hoạt động logic là dễ nhất, bởi vì chúng ánh xạ trực tiếp vào các thành phần
phần cứng trong Hình A.2.1.
Đơn vị logic 1 bit cho AND và OR trông như thế nào Hình A.5.1 Bộ ghép
kênh bên phải sau đó chọn. a VÀ b hoặc là a HOẶC LÀ b, tùy thuộc vào giá trị
của Hoạt động là 0 hoặc 1. Dòng điều khiển bộ ghép kênh được hiển thị màu để
phân biệt với các dòng chứa dữ liệu. Lưu ý rằng chúng tôi đã đổi tên các dòng
điều khiển và đầu ra của bộ ghép kênh để đặt cho chúng các tên phản ánh chức
năng của ALU .
Chức năng tiếp theo bao gồm là bổ sung. Một adder phải có hai đầu vào cho
các toán hạng và đầu ra một bit cho tổng. Phải có một đầu ra thứ hai để vượt qua
mang, được gọi Thực hiện Vì CarryOut từ trình bổ sung hàng xóm phải được đưa
vào làm đầu vào, chúng tôi cần đầu vào thứ ba. Đầu vào này được gọi. Thực
hiện.Hình A.5.2 hiển thị đầu vào và đầu ra của bộ cộng 1 bit. Vì chúng ta biết
những gì Ngoài ra, chúng tôi có thể chỉ định các đầu ra của hộp đen này, dựa trên
các đầu vào của nó, như Hình A.5.3 chứng minh.
Chúng ta có thể biểu thị các hàm đầu ra CarryOut và Sum dưới dạng các
phương trình logic và các phương trình này có thể được thực hiện với các cổng
logic. Hãy để CarryOut. Hình A.5.4 hiển thị các giá trị của các đầu vào khi
CarryOut là 1.
Chúng ta có thể biến bảng sự thật này thành một phương trình logic :
Thực hiện (b ⋅ Thực hiện) (a ⋅ Thực hiện) (a ⋅ b) (a ⋅ b ⋅ Thực hiện)
A.5 Xây dựng một đơn vị logic số học cơ bản A-27

Hoạt động

a
0
Kết quả

b 1

HÌNH A.5.1 Đơn vị logic 1 bit cho AND và OR .

Thực
hiện

Tổng
+
b

Thực hiện

HÌNH A.5.2 Một bộ cộng 1 bit. Adder này được gọi là một adder đầy đủ; nó cũng được gọi là (3,2)
adder vì nó có ba đầu vào và hai đầu ra. Một bổ sung chỉ có đầu vào a và b được gọi là (2,2) adder hoặc
nửa adder.

Đầu vào Đầu ra


Tổn
Bình luận
a b Thực hiện Thực hiện g
0 0 0 0 0 0 + 0 + 0 = 00hai
0 0 1 0 1 0 + 0 + 1 = 01hai
0 1 0 0 1 0 + 1 + 0 = 01hai
0 1 1 1 0 0 + 1 + 1 = 10hai
1 0 0 0 1 1 + 0 + 0 = 01hai
1 0 1 1 0 1 + 0 + 1 = 10hai
1 1 0 1 0 1 + 1 + 0 = 10hai
1 1 1 1 1 1 + 1 + 1 = 11hai

HÌNH A.5.3 Đặc tả đầu vào và đầu ra cho bộ cộng 1 bit.


A-28 Phụ lục A Những điều cơ bản của thiết kế logic

Nếu a · b · CarryIn là đúng, thì tất cả ba thuật ngữ khác cũng phải đúng, vì vậy
chúng tôi có thể bỏ qua thuật ngữ cuối cùng này tương ứng với dòng thứ tư của
bảng. Do đó chúng ta có thể đơn giản hóa phương trình để
Thực hiện (b ⋅ Thực hiện) (a ⋅ Thực hiện) (a ⋅ b)

Hình A.5.5 cho thấy phần cứng trong hộp đen adder cho CarryOut bao gồm ba
cổng VÀ và một cổng OR. Ba cổng AND tương ứng chính xác với ba thuật ngữ
được ngoặc đơn của công thức trên cho CarryOut và cổng OR tổng hợp ba thuật
ngữ.

Đầu vào
a b Thực hiện
0 1 1
1 0 1
1 1 0
1 1 1

HÌNH A.5.4 Giá trị của các đầu vào khi CarryOut là 1.

Thực hiện

Thực hiện

HÌNH A.5.5 Phần cứng Adder cho tín hiệu CarryOut. Phần còn lại của phần cứng adder là logic
cho đầu ra Sum được đưa ra trong phương trình trên trang này.

Bit Sum được đặt khi chính xác một đầu vào là 1 hoặc khi cả ba đầu vào là 1.
Sum dẫn đến một phương trình Boolean phức tạp (nhớ lại điều đó a có nghĩa là
KHÔNG a) :
Tổng (a ⋅ b ⋅ Thực hiện) (a ⋅ b ⋅ Thực hiện) (a ⋅ b ⋅ Thực hiện) (a ⋅ b ⋅ Thực hiện)

Bản vẽ logic cho bit Sum trong hộp đen adder được để lại dưới dạng bài tập cho
người đọc.
A.5 Xây dựng một đơn vị logic số học cơ bản A-29

Hình A.5.6 hiển thị ALU 1 bit có nguồn gốc bằng cách kết hợp bộ cộng với
bộ cộng trước đó các thành phần. Đôi khi các nhà thiết kế cũng muốn ALU thực
hiện một vài thao tác đơn giản hơn, chẳng hạn như tạo 0. Cách dễ nhất để thêm
một thao tác là mở rộng bộ ghép kênh được điều khiển bởi dòng Hoạt động và, ví
dụ này, để kết nối 0 trực tiếp với đầu vào mới của bộ ghép kênh mở rộng đó.

Hoạt động
Thực hiện

a
0

Kết
1 quả

b 2

Thực hiện

HÌNH A.5.6 Một ALU 1 bit thực hiện VÀ, HOẶC và bổ sung (xem Hình A.5.5).

Một ALU 32 bit


Bây giờ chúng tôi đã hoàn thành ALU 1 bit, ALU 32 bit đầy đủ được tạo bằng
cách kết nối các hộp đen liền kề.Sử dụng xi có nghĩa là Tôichút của x, Hình A.5.7
hiển thị ALU 32 bit. Giống như một hòn đá duy nhất có thể khiến các gợn sóng
tỏa ra bờ hồ yên tĩnh, một lần thực hiện một chút ít quan trọng nhất (Result0) có
thể gợn qua bộ cộng, gây ra sự chú ý nhất bit (Result31). Do đó, trình bổ sung
được tạo bằng cách liên kết trực tiếp các bộ bổ sung 1 bit được gọi là a gợn mang
theo bổ sung. Chúng tôi sẽ thấy một cách nhanh hơn để kết nối các bộ bổ sung 1
bit bắt đầu trang A-38.
Phép trừ giống như thêm phiên bản âm của toán hạng và đây là cách người
thêm thực hiện phép trừ. Hãy nhớ lại rằng phím tắt để phủ nhận số bổ sung hai
chữ số là đảo ngược từng bit (đôi khi được gọi là một bổ sung) và sau đó thêm 1.
Để đảo ngược từng bit, chúng ta chỉ cần thêm một bộ ghép kênh 2: 1 chọn giữa b
và b, như Hình A.5.8 chương trình.
Giả sử chúng tôi kết nối 32 trong số các ALU 1 bit này, như chúng tôi đã làm
Hình A.5.7Bộ ghép kênh được thêm vào cung cấp tùy chọn b hoặc giá trị đảo ngược
của nó, tùy thuộc vào Binvert, nhưng.
Hoạt động

Thực hiện

a0 Thực
hiện
Kết quả0
ALU0
b0
Thực hiện

a1 Thực
hiện Kết quả1

ALU1
b1
Thực hiện

a2 Thực
Kết quả2
hiện

ALU2 .
b2 .

Thực hiện .

.
.
.
.

. .
Kết quả31
a31 Thực
hiện

b31 ALU31

HÌNH A.5.7 Một ALU 32 bit được xây dựng từ 32 ALU 1 bit. CarryOut của bit ít quan trọng hơn
được kết nối với CarryIn của bit quan trọng hơn. Tổ chức này được gọi là gợn mang.

Bát Hoạt động


Thực hiện

a
0

Kết
1 quả

b 0
2

Thực hiện

HÌNH A.5.8 Một ALU 1 bit thực hiện AND, OR và thêm vào a và b hoặc a và b. Bởi chọn b
(Binvert = 1) và đặt CarryIn thành 1 trong bit ít quan trọng nhất của ALU, chúng tôi nhận được hai phép
trừ bổ sung của b từ a thay vì thêm b vào a.
A.5 Xây dựng một đơn vị logic số học cơ bản A-31

đây chỉ là một bước trong việc phủ nhận một số bổ sung hai. Lưu ý rằng bit ít quan
trọng nhất vẫn có tín hiệu CarryIn, mặc dù nó không cần thiết để thêm vào. Điều gì
xảy ra nếu chúng ta đặt CarryIn này thành 1 thay vì 0? Sau đó, trình bổ sung sẽ tính
toán + b + 1. Bằng cách chọn phiên bản đảo ngược của b, chúng tôi có được chính
xác những gì chúng tôi muốn :
a b 1 a (b 1) a ( b) a b
Sự đơn giản của thiết kế phần cứng của một bộ cộng bổ sung hai giúp giải thích
tại sao hai biểu diễn bổ sung của Google đã trở thành tiêu chuẩn phổ quát cho số
học máy tính số nguyên.
Chúng tôi cũng muốn thêm một chức năng NOR. Thay vì thêm một cổng
riêng cho NOR, chúng tôi có thể sử dụng lại phần lớn phần cứng đã có trong
ALU, giống như chúng tôi đã làm để trừ. Cái nhìn sâu sắc đến từ sự thật sau đây
về NOR :
(a b) a⋅b

Nghĩa là, KHÔNG (a HOẶC b) tương đương với KHÔNG a VÀ KHÔNG b.


Thực tế này được gọi là định lý DeMorgan, và được khám phá trong các bài tập
sâu hơn.
Vì chúng tôi có VÀ KHÔNG b, chúng tôi chỉ cần thêm KHÔNG a vào ALU .
Hình A.5.9 cho thấy sự thay đổi đó.

Điều chỉnh ALU 32 bit cho RISC-V


Bốn thao tác này được thêm, trừ, VÀ, OR, được tìm thấy trong ALU của hầu hết
mọi máy tính và hoạt động của hầu hết các hướng dẫn RISC-V có thể được thực
hiện bởi ALU này. Nhưng thiết kế của ALU không đầy đủ.
Một hướng dẫn vẫn cần hỗ trợ là tập hợp ít hơn hướng dẫn (slt). Hãy nhớ lại
rằng hoạt động tạo ra 1 nếu rs1 <rs2 và 0 nếu không. Do đó, slt sẽ đặt tất cả
nhưng bit quan trọng nhất thành 0, với tập bit ít quan trọng nhất theo sự so sánh.
Để ALU thực hiện slt, trước tiên chúng ta cần mở rộng bộ ghép kênh ba đầu vào
Hình A.5.9 để thêm một đầu vào cho slt kết quả. Chúng tôi gọi đó là đầu vào mới
Ít hơn và chỉ sử dụng nó cho slt.
Bản vẽ trên cùng của Hình A.5.10 hiển thị ALU 1 bit mới với bộ ghép kênh
mở rộng. Từ mô tả của slt ở trên, chúng ta phải kết nối 0 với đầu vào Ít hơn cho
31 bit trên của ALU, vì các bit đó luôn được đặt thành 0. Những gì còn lại để
xem xét là làm thế nào để so sánh và thiết lập ít quan trọng nhất cho đặt ít hơn
hướng dẫn.
Điều gì xảy ra nếu chúng ta trừ b từ a? Nếu sự khác biệt là âm, thì <b kể từ đó

(a b) < 0 ⇒ ((a b) + b) < (0 b) ⇒ a < b

Chúng tôi muốn bit ít quan trọng nhất của một tập hợp nhỏ hơn hoạt động là 1
nếu a <b; nghĩa là, 1 nếu a - b âm và 0 nếu nó dương. Kết quả mong muốn này
tương ứng chính xác với các giá trị bit dấu: 1 có nghĩa là âm và 0 có nghĩa là
dương. Theo dòng đối số này, chúng ta chỉ cần kết nối bit dấu từ đầu ra của bộ
cộng với bit ít quan trọng nhất để được đặt ít hơn. (Than ôi, đối số này chỉ giữ
nếu phép trừ không tràn; chúng ta sẽ khám phá một triển khai hoàn chỉnh trong
các bài tập.)
A-32 Phụ lục A Những điều cơ bản của thiết kế logic

Ainvert Hoạt động


Bát Thực hiện

a 0

0
1

Kết
1 quả

b 0
2

Thực hiện

HÌNH A.5.9 Một ALU 1 bit thực hiện AND, OR và thêm vào a và b hoặc a và b. Bởi lựa chọn a
(Ainvert = 1) và b (Binvert = 1), chúng tôi nhận được BOR thay vì AND b.

Thật không may, đầu ra Kết quả từ bit ALU quan trọng nhất ở đầu Hình
A.5.10 cho slt hoạt động là không phải đầu ra của bộ cộng; đầu ra ALU đối với
hoạt động sdt rõ ràng là giá trị đầu vào Ít hơn.
Do đó, chúng ta cần một ALU 1 bit mới cho bit quan trọng nhất có bit đầu ra
phụ: đầu ra của bộ cộng. Bản vẽ dưới cùng của Hình A.5.10 hiển thị thiết kế, với
dòng đầu ra adder mới này được gọi Bộ Miễn là chúng tôi cần một ALU đặc biệt
cho bit quan trọng nhất, chúng tôi đã thêm logic phát hiện tràn vì nó cũng được
liên kết với bit đó. Hình A.5.11 hiển thị ALU 32 bit .
Lưu ý rằng mỗi khi chúng tôi muốn ALU trừ đi, chúng tôi đặt cả CarryIn và
Binvert thành 1. Đối với các hoạt động bổ sung hoặc logic, chúng tôi muốn cả
hai dòng điều khiển là 0. Do đó, chúng tôi có thể đơn giản hóa việc kiểm soát
ALU bằng cách kết hợp CarryIn và Binvert với một dòng điều khiển duy nhất
được gọi Cổng vào.
Để tiếp tục điều chỉnh ALU cho tập lệnh RISC-V, chúng tôi phải hỗ trợ các
hướng dẫn nhánh có điều kiện như Chi nhánh nếu bằng (beq), nhánh nào nếu hai
thanh ghi bằng nhau. Cách dễ nhất để kiểm tra sự bình đẳng với ALU là trừ b
khỏi a và sau đó kiểm tra xem kết quả có phải là 0 không, kể từ đó
(a b 0) ⇒ a b
A.5 Xây dựng một đơn vị logic số học cơ bản A-33

Ainvert Hoạt động


Thực
Bát hiện

a 0
0

Kết quả
b 0
2

Ít hơn 3

Thực hiện

Ainvert Hoạt động


Thực
Bát hiện

a 0
0

Kết quả
b 0
2

Ít hơn 3

Bộ

Tràn Tràn
phát hiện

HÌNH A.5.10 (Trên cùng) ALU 1 bit thực hiện AND, OR và thêm vào a và b hoặc b, và (dưới
cùng) ALU 1 bit cho bit quan trọng nhất. Bản vẽ trên cùng bao gồm một đầu vào trực tiếp được kết
nối để thực hiện tập hợp trên ít hơn hoạt động (xem Hình A.5.11); dưới cùng có một đầu ra trực tiếp từ bộ
cộng với giá thấp hơn so sánh được gọi là Set. (Xem Bài tập A.24 ở cuối phụ lục này để xem cách tính tràn
với ít đầu vào hơn.)
A-34 Phụ lục A Những điều cơ bản của thiết kế logic

Bát Hoạt động


Ainvert

Thực hiện

a0 Thực Kết quả0


b0 hiện
ALU0
Ít hơn
Thực
hiện

a1 Kết quả1
b1
0 Thực
hiện
ALU1
Ít hơn
Thực
hiện
a2 Kết quả2
b2
0
Thực
hiện
.
. . . ALU2 .
.
. . .
.
.
.
Ít hơn .
.
.
Thực
hiện
a31 Kết quả31
b31 Bộ
.
0 . Tràn
Thực hiện.

Thực
hiện
ALU31
Ít hơn
HÌNH A.5.11 Một ALU 32 bit được xây dựng từ 31 bản sao của ALU 1 bit ở đầu Hình A.5.10
và một ALU 1 bit ở dưới cùng của hình đó. Các đầu vào ít hơn được kết nối với 0 ngoại trừ bit có ý
nghĩa nhỏ nhất, được kết nối với đầu ra Set của bit quan trọng nhất. Nếu ALU thực hiện a - b và chúng tôi
chọn đầu vào 3 trong bộ ghép kênh Hình A.5.10, sau đó Kết quả = 0 ... 001 nếu a <b và Kết quả = 0 ... 000
nếu không.

Do đó, nếu chúng tôi thêm phần cứng để kiểm tra nếu kết quả là 0, chúng tôi
có thể kiểm tra tính bình đẳng. Cách đơn giản nhất là HOẶC tất cả các đầu ra với
nhau và sau đó gửi tín hiệu đó qua một biến tần :
Số không (Kết quả63 Kết quả62 Kết
quả2 Kết quả1 Kết quả0)
Hình A.5.12 cho thấy ALU 32 bit sửa đổi. Chúng ta có thể nghĩ về sự kết hợp của
dòng Ainvert 1 bit, dòng Bnegate 1 bit và dòng Hoạt động 2 bit dưới dạng các dòng
điều khiển 4 bit cho ALU, yêu cầu nó thực hiện thêm, trừ, AND, OR, NOR hoặc
A.5 Xây dựng một đơn vị logic số học cơ bản A-35

Bnegate Hoạt động


Ainvert

a0 Thực hiện
b0 ALU0 Kết quả0
Ít hơn
Thực
hiện

a1
b1 Thực
Kết
hiện
0 quả1
ALU1
Số
khôn
Ít hơn . g
Thực hiện .
.
a2
b2
0 Thực
Kết
hiện
quả2
. . . ALU2
. Ít hơn
. .. .
.
. .
Thực
.
hiện

a31 . . .
. . .
b31 . Thực hiện . .

0
Kết
Thực quả31
hiện
ALU3
1 Bộ
Ít hơn Tràn

HÌNH A.5.12 ALU 32 bit cuối cùng . Điều này thêm một máy dò Zero vàoHình A.5.11.

Đường điều khiển Chức năng


ALU
0000 VÀ
0001 HOẶC LÀ
0010 thêm
0110 trừ đi

HÌNH A.5.13 Các giá trị của ba dòng điều khiển ALU, Ainvert, Bnegate và Hoạt động và
các hoạt động ALU tương ứng.
đặt ít hơn. Hình A.5.13 hiển thị các dòng điều khiển ALU và hoạt động ALU
tương ứng.
Cuối cùng, bây giờ chúng ta đã thấy những gì bên trong ALU 32 bit, chúng ta
sẽ sử dụng biểu tượng phổ quát cho ALU hoàn chỉnh, như được hiển thị trong
Hình A.5.14.
A-36 Phụ lục A Những điều cơ bản của thiết kế logic

Hoạt động ALU

Số không
ALU Kết quả
Tràn

Thực hiện

HÌNH A.5.14 Biểu tượng thường được sử dụng để thể hiện ALU, như trong Hình A.5.12. Biểu
tượng này cũng được sử dụng để thể hiện một adder, vì vậy nó thường được dán nhãn bằng ALU hoặc Adder.

HÌNH A.5.15 Một định nghĩa hành vi Verilog của RISC-V ALU .

Xác định ALU RISC-V trong Verilog


Hình A.5.15 cho thấy một ALU RISC-V kết hợp có thể được chỉ định như thế
nào Verilog; một đặc tả như vậy có thể sẽ được biên dịch bằng cách sử dụng một
thư viện phần tiêu chuẩn cung cấp một bộ cộng, có thể được khởi tạo. Để hoàn
thiện, chúng tôi hiển thị điều khiển ALU cho RISC-V Hình A.5.16, được sử dụng
trong Chương 4, nơi chúng tôi xây dựng một phiên bản Verilog của datapath
RISC-V.
A.6 Bổ sung nhanh hơn: Mang theo Lookahead A-37

HÌNH A.5.16 Điều khiển ALU RISC-V: một phần đơn giản của logic điều khiển tổ hợp.

Câu hỏi tiếp theo là, ALU này có thể nhanh chóng thêm hai toán hạng 32
bit?Chúng tôi có thể xác định đầu vào a và b, nhưng đầu vào CarryIn phụ thuộc
vào hoạt động trong bộ cộng 1 bit liền kề. Nếu chúng ta theo dõi tất cả các cách
thông qua chuỗi phụ thuộc, chúng ta kết nối bit quan trọng nhất với bit ít quan
trọng nhất, do đó, bit quan trọng nhất của tổng phải chờ tuần tự đánh giá tất cả 32
người thêm 1 bit. Phản ứng chuỗi tuần tự này quá chậm để được sử dụng trong
phần cứng quan trọng về thời gian. Phần tiếp theo khám phá cách tăng tốc bổ
sung. Chủ đề này không quan trọng để hiểu phần còn lại của phụ lục và có thể bị
bỏ qua.

Kiểm tra
Giả sử bạn muốn thêm thao tác KHÔNG (a VÀ b), được gọi là NAND. Làm Bản thân bạn
thế nào ALU có thể thay đổi để hỗ trợ nó?
1. Không chbáo thù. Yobạn có thể tính toán NAND nhanh chóng bằng ALU
hiện tại kể từ (a ⋅ b) a b và chúng tôi đã KHÔNG có a, KHÔNG b và
HOẶC .
2. Bạn phải mở rộng bộ ghép kênh lớn để thêm đầu vào khác, sau đó thêm
logic mới để tính NAND .

A.6 Bổ sung nhanh hơn: Mang theo Lookahead

Chìa khóa để tăng tốc độ bổ sung là xác định việc mang vào các bit bậc cao sớm
hơn. Có nhiều kế hoạch để dự đoán việc mang theo để trường hợp xấu nhất là
chức năng của nhật ký2 số lượng bit trong bộ cộng. Những cái này
A-38 Phụ lục A Những điều cơ bản của thiết kế logic

tín hiệu dự đoán sẽ nhanh hơn vì chúng đi qua ít cổng hơn theo trình tự, nhưng
phải mất nhiều cổng hơn để dự đoán việc mang theo đúng cách.
Chìa khóa để hiểu các sơ đồ mang nhanh là nhớ rằng, không giống như phần
mềm, phần cứng thực hiện song song bất cứ khi nào đầu vào thay đổi.

Mang nhanh bằng cách sử dụng phần cứng vô hạn


Như chúng tôi đã đề cập trước đó, bất kỳ phương trình nào cũng có thể được biểu
diễn theo hai cấp độ logic. Vì các đầu vào bên ngoài duy nhất là hai toán hạng và
CarryIn đến bit ít quan trọng nhất của trình bổ sung, theo lý thuyết, chúng ta có
thể tính các giá trị CarryIn cho tất cả các bit còn lại của trình bổ sung chỉ bằng
hai cấp độ logic.
Ví dụ: CarryIn cho bit 2 của bộ cộng chính xác là CarryOut của bit 1, vì vậy
công thức là
Thực hiện2 (b1 ⋅ Thực hiện trong1) (a1 ⋅ Thực hiện trong1) (a1 ⋅ b1)

Tương tự, CarryIn1 được định nghĩa là


Thực hiện trong1 (b0 ⋅ Mang theo trong0) (a0 ⋅ Mang theo trong0) (a0 ⋅ b0)

Sử dụng chữ viết tắt ngắn hơn và truyền thống hơn của cTôi cho CarryInTôi,
chúng ta có thể viết lại các công thức như

c2 (b1 ⋅ c1) (a1 ⋅ c1) (a1 ⋅ b1)


c1 (b0 ⋅ c0) (a0 ⋅ c0) (a0 ⋅ b0)

Thay thế định nghĩa của c1 cho phương trình đầu tiên dẫn đến công thức này :

c2 (a1 ⋅ a0 ⋅ b0) (a1 ⋅ a0 ⋅ c0) (a1 ⋅ b0 ⋅ c0)


(b1 ⋅ a0 ⋅ b0) (b1 ⋅ a0 ⋅ c0) (b1 ⋅ b0 ⋅ c0) (a1 ⋅ b1)

Bạn có thể tưởng tượng phương trình mở rộng như thế nào khi chúng ta đạt được
các bit cao hơn trong trình bổ sung; nó phát triển nhanh chóng với số lượng bit.
Sự phức tạp này được phản ánh trong chi phí của phần cứng để mang nhanh, làm
cho sơ đồ đơn giản này cực kỳ tốn kém cho những người nghiện rộng.

Thực hiện nhanh bằng cách sử dụng mức độ trừu tượng


đầu tiên: Tuyên truyền và tạo ra
Hầu hết các sơ đồ mang nhanh hạn chế sự phức tạp của các phương trình để đơn
giản hóa phần cứng, trong khi vẫn thực hiện các cải tiến tốc độ đáng kể so với
việc mang gợn. Một kế hoạch như vậy là a adder mang theo nhìn Trong. Chương
1, chúng tôi cho biết các hệ thống máy tính đối phó với sự phức tạp bằng cách sử
dụng các mức độ trừu tượng. Một adder mang theo nhìn dựa trên mức độ trừu
tượng trong việc thực hiện nó.
A.6 Bổ sung nhanh hơn: Mang theo Lookahead A-39

Hãy để yếu tố của phương trình ban đầu của chúng tôi như là một bước đầu tiên :

c 1
(bTôi ⋅ (aTôi ⋅ cTôi) (aTôi ⋅ bTôi)
T
ôi (aTôi bTôi) ⋅ cTôi
cTôi)
(aTôi ⋅
bTôi)
Nếu chúng ta viết lại phương trình cho c2 bằng công thức này, chúng ta sẽ thấy
một số mẫu lặp lại :
c2 (a1 ⋅ b1) (a1 ⋅ b1) ⋅ ((a0 ⋅ b0) (a0 b0) ⋅ c0)

Lưu ý sự xuất hiện lặp đi lặp lại của (aTôi · BTôi) và (aTôi + bTôi) trong công thức
trên. Hai yếu tố quan trọng này được gọi theo truyền thống tạo ra (gTôi) và tuyên
truyền (pTôi):

gTôi aTôi ⋅ bTôi


trTôi aTôi bTôi

Sử dụng chúng để xác định cTôi + 1, chúng tôi nhận được


cTôi 1 gTôi trTôi ⋅ cTôi

Để xem các tín hiệu lấy tên của chúng ở đâu, giả sử gTôi là 1. Sau đó
cTôi 1 gTôi trTôi ⋅ cTôi 1 trTôi ⋅ cTôi 1

Đó là, adder tạo ra một CarryOut (cTôi + 1) độc lập với giá trị của CarryIn (cTôi).
Bây giờ giả sử rằng gTôi là 0 và pTôi là 1. Sau đó
cTôi 1 gTôi trTôi ⋅ cTôi 0 1 ⋅ cTôi cTôi

Đó là, adder tuyên truyềns CarryIn đến một CarryOut. Đặt hai người lại với nhau,
CarryInTôi + 1 là 1 nếu một trong hai gTôi là 1 hoặc cả hai pTôi là 1 và CarryInTôi
là 1.
Như một sự tương tự, hãy tưởng tượng một hàng domino đặt trên cạnh.
Domino cuối cùng có thể được lật bằng cách đẩy một người đi xa, miễn là không
có khoảng cách giữa hai người. Tương tự, một thực hiện có thể được thực hiện
bởi một tạo ở xa, miễn là tất cả các tuyên truyền giữa chúng là đúng.
Dựa vào các định nghĩa về truyền bá và tạo ra như mức độ trừu tượng đầu tiên
của chúng tôi, chúng tôi có thể thể hiện tín hiệu CarryIn một cách kinh tế hơn.
Hãy để hiển thị nó cho 4 bit :

c1 g0 (p0 ⋅ c0)
c2 g1 (p1 ⋅ g0) (p1 ⋅ p0 ⋅ c0)
c3 g2 (p2 ⋅ g1) (p2 ⋅ p1 ⋅ g0) (p2 ⋅ p1 ⋅ p0 ⋅ c0)
c4 g3 (p3 ⋅ g2) (p3 ⋅ p2 ⋅ g1) (p3 ⋅ p2 ⋅ p1 ⋅ g0)
(p3 ⋅ p2 ⋅ p1 ⋅ p0 ⋅ c0)
A-40 Phụ lục A Những điều cơ bản của thiết kế logic

Các phương trình này chỉ đại diện cho lẽ thường: CarryInTôi là 1 nếu một số
trình bổ sung trước đó tạo ra một mang và tất cả các trình thêm trung gian tuyên
truyền mang. Hình A.6.1 sử dụng hệ thống ống nước để cố gắng giải thích mang
theo nhìn.
Ngay cả hình thức đơn giản hóa này cũng dẫn đến các phương trình lớn và do
đó, logic đáng kể ngay cả đối với một bộ cộng 16 bit. Hãy thử di chuyển đến hai
cấp độ trừu tượng.

Thực hiện nhanh bằng cách sử dụng mức độ trừu tượng


thứ hai
Đầu tiên, chúng tôi coi bộ cộng 4 bit này với logic mang theo của nó như là một
khối xây dựng duy nhất. Nếu chúng ta kết nối chúng theo kiểu gợn mang theo
thời trang để tạo thành một bộ cộng 16 bit, phần bổ sung sẽ nhanh hơn bản gốc
với phần cứng nhiều hơn một chút.
Để đi nhanh hơn, chúng tôi sẽ cần mang theo cái nhìn ở cấp độ cao hơn. Để
thực hiện tra cứu cho người thêm 4 bit, chúng ta cần truyền và tạo tín hiệu ở cấp
độ cao hơn này. Ở đây chúng dành cho bốn khối adder 4 bit :
P0 p3 ⋅ p2 ⋅ p1 ⋅ p0
P1 p7 ⋅ p6 ⋅ p5 ⋅ p4
P2 p11 ⋅ p10 ⋅ p9 ⋅ p8
P3 p15 ⋅ p14 ⋅ p13 ⋅p12

Đó là, tín hiệu truyền bá siêu siêu cấp của người Viking cho sự trừu tượng 4 bit
(PTôi) chỉ đúng nếu mỗi bit trong nhóm sẽ truyền bá một lần mang.
Đối với tín hiệu siêu siêu cấp của người Viking (GTôi), chúng tôi chỉ quan tâm
nếu có một chút thực hiện quan trọng nhất của nhóm 4 bit. Điều này rõ ràng xảy
ra nếu tạo ra là đúng với bit quan trọng nhất đó; nó cũng xảy ra nếu một tạo trước
đó là đúng và tất cả các lan truyền trung gian, bao gồm cả bit quan trọng nhất,
cũng đúng :

G0 g3 (p3 ⋅ g2) (p3 ⋅ p2 ⋅ g1) (p3 ⋅ p2 ⋅ p1 ⋅ g0)


G1 g7 (p7 ⋅ g6) (p7 ⋅ p6 ⋅ g5) (p7 ⋅ p6 ⋅ p5 ⋅ g4)
G2 g11 (p11 ⋅ g10) (p11 ⋅ p10 ⋅ g9) (p11 ⋅ p10 ⋅ p9 ⋅ g8)
G3 g15 (p15 ⋅ g14) (p15 ⋅ p14 ⋅ g13) (p15 ⋅ p14 ⋅ p13 ⋅ g12)

Hình A.6.2 cập nhật tương tự hệ thống ống nước của chúng tôi để hiển thị P0 và
G0.
Sau đó, các phương trình ở mức độ trừu tượng cao hơn này để mang vào cho mỗi
nhóm 4 bit của bộ cộng 16 bit (C1, C2, C3, C4 in Hình A.6.3) rất giống với các
phương trình thực hiện cho từng bit của bộ cộng 4 bit (c1, c2, c3, c4) trên trang A-40 :

C1 G0 (P0 ⋅ c0)
C2 G1 (P1 ⋅ G0) (P1 ⋅ P0 ⋅ c0) (P2 ⋅ P1 ⋅ P0 ⋅ c0)
C3 G2 (P2 ⋅ G1) (P2 ⋅ P1 ⋅ G0)
C4 G3 (P3 ⋅ G2) (P3 ⋅ P2 ⋅ G1) (P3⋅P2⋅P1⋅G0)
(P3 ⋅ P2 ⋅ P1 ⋅ P0 ⋅ c0)
A.6 Bổ sung nhanh hơn: Mang theo Lookahead A-41

c0

g0

p0
c1
c0

g0
c0

p0
g0

g1
p0

p1
g1
c2

p1

g2

p2

g3

p3

c4

HÌNH A.6.1 Một tương tự ống nước để mang theo lookahead cho 1 bit, 2 bit và 4 bit sử
dụng ống nước và van. Các cờ lê được chuyển sang van mở và đóng. Nước được thể hiện bằng màu
sắc. Các đầu ra của ống (cTôi + 1) sẽ đầy nếu giá trị tạo gần nhất (gTôi) được bật hoặc nếu Tôi giá trị lan
truyền (pTôi) đang ở trên và có nước ở thượng nguồn, từ một sản phẩm trước đó hoặc một sự lan truyền
với nước đằng sau nó. CarryIn (c0) có thể dẫn đến việc thực hiện mà không cần sự trợ giúp của bất kỳ sự
tạo nào, nhưng với sự trợ giúp của tất cả tuyên truyền.
A-42 Phụ lục A Những điều cơ bản của thiết kế logic

p0

p1

g0

p2

p3 g1
P0

p1

g2

p2

g3

p3

G0

HÌNH A.6.2 Một sự tương tự hệ thống ống nước cho tín hiệu truyền hình trực tiếp cấp độ
tiếp theo P0 và G0. P0 chỉ mở nếu cả bốn lan truyền (pTôi) đang mở, trong khi nước chảy trong G0 chỉ
khi có ít nhất một tạo ra (gTôi) là mở và tất cả các lan truyền xuôi dòng từ tạo ra đó là mở.

Hình A.6.3 hiển thị các bộ cộng 4 bit được kết nối với một bộ phận mang theo
như vậy. Các bài tập khám phá sự khác biệt về tốc độ giữa các sơ đồ mang này,
các ký hiệu khác nhau để truyền đa tín hiệu và tạo tín hiệu và thiết kế của bộ
cộng 32 bit.
A.6 Bổ sung nhanh hơn: Mang theo Lookahead A-43

T
ôi
Thực hiện b15 c
C4
T
ôi + 4
a0 Thực hiện
b0
a1
b1
a2 ALU0
tr
T
b2 P0 ôi
a3 g
T
G0 ôi
b3
C1 c
T
ôi + 1

a4 Thực hiện
b4
a5
b5
a6 ALU1 tr
T
b6 P1 ôi + 1
g
T
a7 G1 ôi + 1
b7 c
C2 T
ôi + 2

a8 Thực hiện
b8
a9
b9
a10 ALU2 tr
T
b10 P2 ôi + 2
g
T
a11 G2 ôi + 2
b11 c
C3 T
ôi + 3

a12 Thực hiện


b12
a13
b13
a14 ALU3 tr
T
b14 P3 ôi + 3
a15 G3 g +3
Kết quả81111

Kết quả0 con3

Đơn vị mang theo lookahead


Kết quả121515

Kết quả4 trận7

Thực hiện

HÌNH A.6.3 Bốn ALU 4 bit sử dụng lookahead mang để tạo thành một bộ cộng 16 bit. Lưu ý
rằng mang đến từ đơn vị mang theo, không phải từ ALU 4 bit.
A-44 Phụ lục A Những điều cơ bản của thiết kế logic

Cả hai cấp độ của Tuyên truyền và Tạo

Xác định gTôi, trTôi, PTôivà GTôi giá trị của hai số 16 bit này :
VÍ DỤ
a: 0001 1010 0011 0011hai
b: 1110 0101 1110 1011hai
Ngoài ra, CarryOut15 (C4) là gì?

Căn chỉnh các bit giúp dễ dàng nhìn thấy các giá trị của việc tạo gTôi
TRẢ LỜI (aTôi· BTôi) và tuyên truyền pTôi (aTôi + bTôi):
a: 0001 1010 0011 0011
b: 1110 0101 1110 1011
gTôi: 0000 0000 0010 0011
trTôi: 1111 1111 1111 1011
trong đó các bit được đánh số 15 đến 0 từ trái sang phải. Tiếp theo, các lan truyền
siêu siêu cấp (P3, P2, P1, P0) chỉ đơn giản là AND của các lan truyền cấp thấp
hơn :
P3 1⋅1⋅1 ⋅ 1 1
P2 1⋅1⋅1 ⋅ 1 1
P1 1 ⋅ 1 ⋅1⋅1 1
P0 1 ⋅ 0 ⋅ 1 ⋅ 1 0
Các siêu siêu siêu tạo ra phức tạp hơn, vì vậy hãy sử dụng các phương trình
sau :
G0 g3 (p3 ⋅ g2) (p3 ⋅ p2 ⋅ g1) (p3 ⋅ p2 ⋅ p1 ⋅ g0)
0 (1⋅ 0) (1⋅ 0⋅1) (1⋅ 0⋅1⋅1) 0 0 0 0 0
G1 g7 (p7 ⋅ g6) (p7 ⋅ p6 ⋅ g5) (p7 ⋅ p6 ⋅ p5 ⋅ g4)
0 (1⋅ 0) (1⋅1⋅1) (1⋅1⋅1⋅ 0) 0010 1
G2 g11 (p11 ⋅ g10) (p11 ⋅ p10 ⋅ g9) (p11 ⋅ p10 ⋅ p9 ⋅ g8)
0 (1⋅ 0) (1⋅1⋅ 0) (1⋅1⋅1⋅ 0) 0 0 0 0 0
G3 g15 (p15 ⋅ g14) (p15 ⋅ p14 ⋅ g13) (p15 ⋅ p14 ⋅ p13 ⋅ g12)
0 (1⋅ 0) (1⋅1⋅ 0) (1⋅1⋅1⋅ 0) 0 0 0 0 0
Cuối cùng,
CarryOut15 là
C4 G3 (P3 ⋅ G2) (P3 ⋅ P2 ⋅ G1) (P3⋅P2⋅P1⋅G0)
(P3 ⋅ P2 ⋅ P1 ⋅ P0 ⋅ c0)
0 (1⋅0) (1⋅1⋅1) (1⋅1⋅1⋅0) (1⋅1⋅1⋅0⋅0)
0 0 1 0 0 1
Do đó, có là thực
hiện khi thêm hai
số 16 bit này.
A.6 Bổ sung nhanh hơn: Mang theo Lookahead A-45

Lý do mang theo lookahead có thể khiến việc mang nhanh hơn là tất cả logic
bắt đầu đánh giá thời điểm chu kỳ đồng hồ bắt đầu và kết quả sẽ không thay đổi
khi đầu ra của mỗi cổng ngừng thay đổi. Bằng cách đi đường tắt đi qua ít cổng
hơn để gửi tín hiệu mang theo, đầu ra của cổng sẽ ngừng thay đổi sớm hơn và do
đó thời gian cho bộ cộng có thể ít hơn.
Để đánh giá cao tầm quan trọng của việc mang theo, chúng ta cần tính toán
hiệu suất tương đối giữa nó và các bộ cộng mang gợn.

Tốc độ của Ripple Carry so với Carry Lookahead


Một cách đơn giản để mô hình hóa thời gian cho logic là giả định từng cổng AND hoặc OR
mất cùng thời gian để một tín hiệu đi qua nó. Thời gian được ước tính đơn giản VÍ DỤ đếm số
lượng cổng dọc theo đường dẫn thông qua một đoạn logic. So sánh
số lượng cổng chậm trễ đối với đường dẫn của hai bộ cộng 16 bit, một sử
dụng vật mang gợn và một sử dụng vật mang hai cấp độ.

Hình A.5.5 trên trang A-28 cho thấy tín hiệu thực hiện mất hai cổng độ trễ
mỗi bit. Sau đó, số lượng độ trễ cổng giữa một lần mang đến một chút ít TRẢ LỜI
quan trọng nhất và thực hiện quan trọng nhất là 16 × 2 = 32.

Đối với lookahead mang, việc thực hiện bit quan trọng nhất chỉ là C4, được
xác định trong ví dụ. Phải mất hai cấp độ logic để chỉ định C4 theo PTôi và GTôi
(HOẶC của một số điều khoản VÀ). PTôi được chỉ định trong một cấp độ logic
(AND) bằng pTôivà GTôi được chỉ định trong hai cấp độ sử dụng pTôi và gTôi,
vì vậy trường hợp xấu nhất cho mức độ trừu tượng tiếp theo này là hai cấp độ
logic. trTôi và gTôi là mỗi một cấp độ logic, được định nghĩa theo aTôi và
bTôiNếu chúng ta giả định độ trễ một cổng cho mỗi cấp độ logic trong các
phương trình này, trường hợp xấu nhất là độ trễ 2 + 2 + 1 = 5 cổng.
Do đó, đối với đường dẫn từ mang vào để thực hiện, việc bổ sung 16 bit
bằng bộ cộng mang theo nhanh hơn sáu lần, sử dụng ước tính tốc độ phần
cứng rất đơn giản này.

Tóm tắt
Carry lookahead cung cấp một con đường nhanh hơn so với việc chờ đợi mang đến
gợn qua tất cả 32 người thêm 1 bit. Đường dẫn nhanh hơn này được lát bởi hai tín
hiệu, tạo và truyền.
A-46 Phụ lục A Những điều cơ bản của thiết kế logic

Cái trước tạo ra một mang bất kể đầu vào mang, và cái sau vượt qua mang theo.
Carry lookahead cũng đưa ra một ví dụ khác về sự trừu tượng quan trọng trong
thiết kế máy tính để đối phó với sự phức tạp.

Kiểm tra Sử dụng ước tính đơn giản về tốc độ phần cứng ở trên với độ trễ cổng, hiệu suất
Bản tương đối của một gợn mang thêm 8 bit so với thêm 64 bit bằng logic mang theo?
thân bạn 1. Bộ cộng mang theo 64 bit nhanh hơn ba lần: Thêm 8 bit là độ trễ 16 cổng
và thêm 64 bit là độ trễ bảy cổng.
2. Chúng có cùng tốc độ, vì 64 bit thêm cần nhiều mức logic hơn trong bộ
cộng 16 bit.
3. Thêm tám bit nhanh hơn 64 bit, ngay cả khi mang theo.

Xây dựng: Bây giờ chúng tôi đã chiếm tất cả trừ một trong những số học và logic
các thao tác cho tập lệnh RISC-V cốt lõi: ALU in Hình A.5.14 bỏ qua hỗ trợ của
hướng dẫn thay đổi. Có thể mở rộng bộ ghép kênh ALU để bao gồm một ca trái thêm
1 bit hoặc một ca phải thêm 1 bit. Nhưng các nhà thiết kế phần cứng đã tạo ra một
mạch gọi là a thùng shifter, có thể chuyển từ 1 đến 31 bit trong thời gian không quá
hai lần để thêm hai Số 32 bit, do đó việc dịch chuyển thường được thực hiện bên
ngoài ALU .

Xây dựng: Phương trình logic cho đầu ra Sum của trình bổ sung đầy đủ trên trang
A-28 có thể được thể hiện đơn giản hơn bằng cách sử dụng một cổng mạnh hơn
AND và OR. An độc quyền HOẶC LÀ cổng là đúng nếu hai toán hạng không đồng ý;
đó là,

x ≠ y ⇒ 1 và x == y ⇒ 0

Trong một số công nghệ, OR độc quyền hiệu quả hơn hai cấp cổng AND và OR.
Sử dụng biểu tượng ⊕ để đại diện cho OR độc quyền, đây là phương trình mới :

Tổng a ⊕ b ⊕ Thực hiện

Ngoài ra, chúng tôi đã vẽ ALU theo cách truyền thống, sử dụng cổng. Máy tính
được thiết kế ngày nay trong các bóng bán dẫn CMOS, về cơ bản là các thiết bị
chuyển mạch. CMOS ALU và bộ chuyển đổi thùng tận dụng các công tắc này và có ít
bộ ghép kênh hơn so với thiết kế của chúng tôi, nhưng các nguyên tắc thiết kế là
tương tự nhau.

Xây dựng: Sử dụng chữ thường và chữ hoa để phân biệt thứ bậc của tạo và truyền
các biểu tượng bị phá vỡ khi bạn có nhiều hơn hai cấp độ. Một ký hiệu thay thế mà tỷ lệ là
gTôi..j và pTôi..j cho các tín hiệu tạo và truyền cho các bit Tôi đến j.
Như vậy, g1..1 được tạo
cho bit 1, g4..1 dành cho
bit 4 đến 1 và g16..1
dành cho bit 16 đến 1.
Đồng hồ A.7 A-47

A.7 Đồng hồ

Trước khi chúng ta thảo luận về các yếu tố bộ nhớ và logic tuần tự, sẽ rất hữu ích
khi thảo luận ngắn gọn về chủ đề đồng hồ. Phần ngắn này giới thiệu chủ đề và
tương tự như các cuộc thảo luận được tìm thấy trong Mục 4.2 Thông tin chi tiết
về phương pháp đồng hồ và thời gian được trình bày trong. Mục A.11.
Đồng hồ là cần thiết trong logic tuần tự để quyết định khi nào một yếu tố có
chứa nhà nước nên được cập nhật. Đồng hồ chỉ đơn giản là tín hiệu chạy tự do với
cố định chu kỳ thời gian; các tần số đồng hồ chỉ đơn giản là nghịch đảo của thời
gian chu kỳ. Như thể hiện trong Hình A.7.1, các thời gian chu kỳ đồng hồ hoặc là
thời gian đồng hồ được chia thành hai phần: khi đồng hồ cao và khi đồng hồ thấp. đồng hồ kích hoạt
Trong văn bản này, chúng tôi chỉ sử dụng kích hoạt cạnh đồng hồĐiều này có cạnh Một chiếc đồng
nghĩa là tất cả các thay đổi trạng thái xảy ra trên một cạnh đồng hồ. Chúng tôi sử hồ sơ đồ trong đó tất cả
dụng một. phương pháp kích hoạt cạnh vì nó đơn giản hơn để giải thích. Tùy các thay đổi trạng thái
xảy ra trên một cạnh
thuộc vào công nghệ, nó có thể hoặc không thể là lựa chọn tốt nhất cho a phương đồng hồ.
pháp đồng hồ.
đồng hồ
phương pháp luận Các
Rơi cạnh tiếp cận được sử dụng để
xác định khi dữ liệu
hợp lệ và ổn định liên quan
đến
đồng hồ.

Thời kỳ đồng hồ Cạnh tăng

HÌNH A.7.1 Tín hiệu đồng hồ dao động giữa các giá trị cao và thấp. Thời gian đồng hồ là thời
gian cho một chu kỳ đầy đủ. Trong một thiết kế kích hoạt cạnh, cạnh tăng hoặc giảm của đồng hồ đang
hoạt động và khiến trạng thái bị thay đổi.

Các hạn chế chính


trong một hệ thống
Trong một phương pháp kích hoạt cạnh, cạnh tăng hoặc cạnh rơi của đồng hồ
đồng hồ, cũng được gọi
là hoạt động và gây ra sự thay đổi trạng thái xảy ra. Như chúng ta sẽ thấy trong
phần tiếp theo, yếu tố nhà nước trong một thiết kế kích hoạt cạnh được thực là a hệ thống đồng bộ,
hiện sao cho nội dung của các thành phần trạng thái chỉ thay đổi trên cạnh đồng là các tín hiệu được
hồ hoạt động. Sự lựa chọn cạnh nào đang hoạt động bị ảnh hưởng bởi công nghệ viết thành các yếu tố
triển khai và không ảnh hưởng đến các khái niệm liên quan đến thiết kế logic.
trạng thái phải hợp lệ
Cạnh đồng hồ hoạt động như một tín hiệu lấy mẫu, làm cho giá trị của đầu vào
dữ liệu thành một phần tử trạng thái được lấy mẫu và lưu trữ trong phần tử trạng khi hoạt động
thái. Sử dụng bộ kích hoạt cạnh có nghĩa là quá trình lấy mẫu về cơ bản là tức
thời, loại bỏ các vấn đề có thể xảy ra nếu tín hiệu được lấy mẫu ở các thời điểm
hơi khác nhau.
yếu tố nhà nước
Một yếu tố bộ nhớ.

hệ thống đồng bộ A hệ thống bộ nhớ sử dụng đồng hồ và nơi tín hiệu dữ liệu chỉ được đọc
khi đồng hồ chỉ ra rằng các giá trị tín hiệu ổn định.
A-48 Phụ lục A Những điều cơ bản của thiết kế logic

cạnh đồng hồ xảy ra. Tín hiệu hợp lệ nếu nó ổn định (tức là., không thay đổi) và
giá trị sẽ không thay đổi một lần nữa cho đến khi các đầu vào thay đổi. Vì các
mạch tổ hợp không thể có phản hồi, nếu các đầu vào cho một đơn vị logic tổ hợp
không bị thay đổi, các đầu ra cuối cùng sẽ trở thành hợp lệ.
Hình A.7.2 cho thấy mối quan hệ giữa các yếu tố nhà nước và khối logic tổ
hợp trong một thiết kế logic đồng bộ, tuần tự. Các phần tử trạng thái, có đầu ra
chỉ thay đổi sau cạnh đồng hồ, cung cấp đầu vào hợp lệ cho khối logic tổ hợp. Để
đảm bảo rằng các giá trị được ghi vào các thành phần trạng thái trên cạnh đồng hồ
hoạt động là hợp lệ, đồng hồ phải có một khoảng thời gian đủ dài để tất cả các tín
hiệu trong khối logic tổ hợp ổn định, và sau đó cạnh đồng hồ lấy mẫu các giá trị
đó để lưu trữ trong các thành phần trạng thái. Ràng buộc này đặt giới hạn dưới
cho độ dài của chu kỳ đồng hồ, phải đủ dài để tất cả các yếu tố đầu vào trạng thái
có hiệu lực.
Trong phần còn lại của phụ lục này, cũng như trong Chương 4, chúng ta thường
bỏ qua tín hiệu đồng hồ, vì chúng ta cho rằng tất cả các yếu tố trạng thái được cập
nhật trên cùng một cạnh đồng hồ. Một số yếu tố trạng thái sẽ được viết trên mọi cạnh
đồng hồ, trong khi các yếu tố khác sẽ chỉ được viết trong một số điều kiện nhất định
(chẳng hạn như một thanh ghi được cập nhật). Trong những trường hợp như vậy,
chúng ta sẽ có tín hiệu ghi rõ ràng cho thành phần trạng thái đó. Tín hiệu ghi vẫn
phải được kiểm soát bằng đồng hồ để cập nhật chỉ xảy ra trên cạnh đồng hồ nếu tín
hiệu ghi được kích hoạt. Chúng ta sẽ thấy làm thế nào điều này được thực hiện và sử
dụng trong phần tiếp theo.
Một ưu điểm khác của phương pháp kích hoạt cạnh là có thể có một phần tử
trạng thái được sử dụng làm cả đầu vào và đầu ra cho cùng một khối logic tổ hợp,
như được hiển thị trong Hình A.7.3 Trong thực tế, phải cẩn thận để ngăn chặn
các cuộc đua trong các tình huống như vậy và để đảm bảo rằng thời gian đồng hồ
đủ dài; chủ đề này được thảo luận thêm trong. Mục A.11.
Bây giờ chúng ta đã thảo luận về cách sử dụng đồng hồ để cập nhật các thành
phần trạng thái, chúng ta có thể thảo luận về cách xây dựng các thành phần trạng
thái.

Tiểu bang Tiểu bang


thành phần
1 Logic kết hợp yếu tố 2

Chu kỳ đồng hồ
HÌNH A.7.2 Các đầu vào cho khối logic tổ hợp đến từ một phần tử trạng thái và các đầu ra
được viết thành một phần tử trạng thái. Cạnh đồng hồ xác định khi nội dung của các yếu tố nhà
nước được cập nhật.
A.8 Các yếu tố bộ nhớ: Flip-Flops, Latches và Register A-49

Tiểu bang Logic kết hợp


thành phần

HÌNH A.7.3 Phương pháp kích hoạt cạnh cho phép đọc và ghi phần tử trạng thái trong
cùng một chu kỳ đồng hồ mà không tạo ra một cuộc đua có thể dẫn đến các giá trị dữ liệu
không xác định. Tất nhiên, chu kỳ đồng hồ vẫn phải đủ dài để các giá trị đầu vào ổn định khi nào các
cạnh đồng hồ hoạt động xảy ra.

Xây dựng Đôi khi, các nhà thiết kế thấy hữu ích khi có một số lượng nhỏ nhà nước các
yếu tố thay đổi trên cạnh đồng hồ đối diện từ phần lớn các yếu tố trạng thái. Làm như vậy
đòi hỏi sự quan tâm cao độ, bởi vì cách tiếp cận như vậy có tác động đến cả đầu vào và
đầu ra của yếu tố trạng thái. Tại sao sau đó các nhà thiết kế sẽ làm điều này? Hãy xem xét
trường hợp số lượng logic tổ hợp trước và sau một yếu tố trạng thái đủ nhỏ để mỗi yếu tố
có thể hoạt động trong một nửa chu kỳ đồng hồ, thay vì chu kỳ đồng hồ đầy đủ thông đăng ký tập tin Một
thường hơn. Sau đó, phần tử trạng thái có thể được viết trên cạnh đồng hồ tương ứng với nhà nước phần tử bao
một nửa chu kỳ đồng hồ, vì cả đầu vào và đầu ra đều có thể sử dụng được sau một nửa gồm một tập hợp các
chu kỳ đồng hồ. Một nơi phổ biến mà kỹ thuật này được sử dụng là ở đăng ký các tập tin, thanh ghi có thể được
trong đó chỉ cần đọc hoặc viết tệp đăng ký thường có thể được thực hiện trong một nửa đọc và viết bằng cách
bình thường chu kỳ đồng hồ. Chương 4 sử dụng ý tưởng này để giảm chi phí đường ống. cung cấp số thanh ghi
được truy cập.

Các yếu tố bộ nhớ: Flip-Flops,


Latches ,
A.8
và Đăng ký

Trong phần này và phần tiếp theo, chúng tôi thảo luận về các nguyên tắc cơ bản
đằng sau các yếu tố bộ nhớ, bắt đầu bằng dép xỏ ngón và chốt, chuyển sang đăng
ký tệp và hoàn thiện với bộ nhớ. Tất cả các thành phần bộ nhớ lưu trữ trạng thái:
đầu ra từ bất kỳ thành phần bộ nhớ nào phụ thuộc cả vào đầu vào và vào giá trị đã
được lưu trữ bên trong thành phần bộ nhớ. Do đó, tất cả các khối logic chứa một
phần tử bộ nhớ đều chứa trạng thái và là tuần tự.
R
Q

Q
S

HÌNH A.8.1 Một cặp gat NOR ghép chéoes có thể lưu trữ một trongtgiá trị xương ức. Giá trị
Stored trên đầu ra Q được tái chế bằng cách đảo ngược nó để có được Q và sau đó đảo ngược Q để có
được Q Nếu một trong hai. R hoặc là Q được khẳng định , Q sẽ được xác nhận lại và ngược lại.
A-50 Phụ lục A Những điều cơ bản của thiết kế logic

Loại phần tử bộ nhớ đơn giản nhất là không đồng hồ; đó là, họ không có bất
kỳ đầu vào đồng hồ. Mặc dù chúng tôi chỉ sử dụng các thành phần bộ nhớ đồng
hồ trong văn bản này, một chốt không đồng hồ là yếu tố bộ nhớ đơn giản nhất, vì
vậy, trước tiên hãy xem xét mạch này. Hình A.8.1 cho thấy một S-R chốt (khớp
đặt lại), được xây dựng từ một cặp cổng NOR (HOẶC cổng có đầu ra đảo ngược).
Các đầu ra Q và Q đại diện cho giá trị của trạng thái được lưu trữ và bổ sung của
nó. Khi không S cũng không R được khẳng định, các cổng NOR ghép chéo đóng
vai trò là bộ biến tần và lưu trữ các giá trị trước đó Q và Q.
Ví dụ: nếu đầu ra , Q, là đúng, sau đó biến tần dưới cùng tạo ra một đầu ra sai
(đó là Q), trở thành đầu vào cho biến tần trên cùng, tạo ra đầu ra thực sự, đó là Q,
và như vậy. Nếu S được khẳng định, sau đó là đầu ra Q sẽ được khẳng định và Q
sẽ được xác nhận lại, trong khi nếu R được khẳng định, sau đó là đầu ra Q sẽ
được khẳng định và Q sẽ được xác nhận lại. Khi nào S và R đều được xác nhận
lại, các giá trị cuối cùng của Q và Q sẽ tiếp tục được lưu trữ trong cấu trúc ghép
chéo. Khẳng định S và R đồng thời có thể dẫn đến hoạt động không chính xác:
tùy thuộc vào cách S và R được khử khí, chốt có thể dao động hoặc trở nên di căn
(điều này được mô tả chi tiết hơn trong Mục A.11).
Cấu trúc ghép chéo này là cơ sở cho các yếu tố bộ nhớ phức tạp hơn cho phép
chúng tôi lưu trữ tín hiệu dữ liệu. Các phần tử này chứa các cổng bổ sung được sử
dụng để lưu trữ các giá trị tín hiệu và khiến trạng thái chỉ được cập nhật cùng với
lật Một ký ức phần tử đồng hồ. Phần tiếp theo cho thấy các yếu tố này được xây dựng như thế nào.
mà đầu ra bằng với giá trị
của trạng thái được lưu
trữ bên trong phần tử và
Lật và chốt
trạng thái bên trong chỉ Dép xỏ ngón và chốt là những yếu tố bộ nhớ đơn giản nhất. Trong cả dép xỏ ngón và
được thay đổi trên cạnh chốt, đầu ra bằng với giá trị của trạng thái được lưu trữ bên trong phần tử. Hơn nữa,
đồng hồ. không giống như chốt S-R được mô tả ở trên, tất cả các chốt và dép xỏ ngón chúng ta
chốt Một yếu tố bộ nhớ sẽ sử dụng từ thời điểm này đều được bấm giờ, điều đó có nghĩa là chúng có đầu vào
trong đó đầu ra bằng với đồng hồ và sự thay đổi trạng thái được kích hoạt bởi đồng hồ đó. Sự khác biệt giữa
giá trị của trạng thái được flip-flop và chốt là điểm mà đồng hồ khiến trạng thái thực sự thay đổi. Trong chốt
lưu trữ bên trong phần tử đồng hồ, trạng thái được thay đổi bất cứ khi nào đầu vào thích hợp thay đổi và đồng
và trạng thái được thay đổi hồ được khẳng định, trong khi ở dạng lật, trạng thái chỉ được thay đổi trên cạnh đồng
bất cứ khi nào đầu vào hồ. Vì trong toàn bộ văn bản này, chúng tôi sử dụng phương pháp định thời kích hoạt
thích hợp thay đổi và đồng
cạnh, trong đó trạng thái chỉ được cập nhật trên các cạnh đồng hồ, chúng tôi chỉ cần
hồ được khẳng định.
sử dụng dép xỏ ngón. Dép xỏ ngón thường được chế tạo từ chốt, vì vậy chúng tôi bắt
D lật Một cái dép xỏ đầu bằng cách mô tả hoạt động của một chốt đồng hồ đơn giản và sau đó thảo luận về
ngón với một đầu vào hoạt động của một dép xỏ ngón được chế tạo từ chốt đó.
dữ liệu lưu trữ giá trị
Đối với các ứng dụng máy tính, chức năng của cả dép xỏ ngón và chốt là lưu
của tín hiệu đầu vào đó
trong bộ nhớ trong khi trữ tín hiệu. A D chốt hoặc là D lậtlưu trữ giá trị của tín hiệu đầu vào dữ liệu của
cạnh đồng hồ xảy ra. nó trong bộ nhớ trong. Mặc dù có nhiều loại chốt và lật khác, loại D là khối xây
dựng cơ bản duy nhất mà chúng ta sẽ cần. Một chốt D có hai đầu vào và hai đầu
ra. Các đầu vào là giá trị dữ liệu sẽ được lưu trữ (được gọi là D) và tín hiệu đồng
hồ (được gọi là C) cho biết khi nào chốt sẽ đọc giá trị trên D đầu vào và lưu trữ
nó. Các đầu ra chỉ đơn giản là giá trị của trạng thái bên trong (Q)
A.8 Các yếu tố bộ nhớ: Flip-Flops, Latches và Register A-51

và bổ sung của nó (Q). Khi đồng hồ đầu vào C được khẳng định, chốt được cho
là mởvà giá trị của đầu ra (Q) trở thành giá trị của đầu vào DKhi nào. đồng hồ
đầu vào C được xác định lại, chốt được cho là đóng cửavà giá trị của đầu ra (Q)
là bất kỳ giá trị nào được lưu trữ trong lần cuối cùng chốt được mở.
Hình A.8.2 cho thấy cách chốt D có thể được thực hiện với hai cổng bổ sung
được thêm vào các cổng NOR ghép chéo. Kể từ khi chốt được mở giá trị của Q
thay đổi như D thay đổi, cấu trúc này đôi khi được gọi là a chốt trong suốt.Hình
A.8.3 cho thấy cách chốt D này hoạt động, giả sử rằng đầu ra Q ban đầu là sai và
đó D thay đổi đầu tiên.
Như đã đề cập trước đó, chúng tôi sử dụng dép xỏ ngón làm khối xây dựng cơ
bản, thay vì chốt. Dép xỏ ngón không trong suốt: đầu ra của chúng thay đổi chỉ
trên mép đồng hồ. Một flip-flop có thể được xây dựng để nó kích hoạt trên cạnh
đồng hồ tăng (dương) hoặc giảm (âm); đối với thiết kế của chúng tôi, chúng tôi có
thể sử dụng một trong hai loại. Hình A.8.4 cho thấy một flip-flop D cạnh rơi được
xây dựng từ một cặp chốt D. Trong flip-flop D, đầu ra được lưu trữ khi cạnh đồng
hồ xảy ra. Hình A.8.5 cho thấy cách flip-flop này hoạt động.

C
Q

Q
D

HÌNH A.8.2 Một chốt D được thực hiện với các cổng NOR. Một cổng NOR hoạt động như một
biến tần nếu khác đầu vào là 0. Do đó, cặp cổng NOR được ghép chéo hoạt động để lưu trữ giá trị trạng
thái trừ khi đầu vào đồng hồ , C, được khẳng định, trong trường hợp đó là giá trị của đầu vào D thay thế
giá trị của Q và được lưu trữ. Giá trị của đầu vào D phải ổn định khi tín hiệu đồng hồ C thay đổi từ khẳng
định sang deasserted.

HÌNH A.8.3 Hoạt động của chốt D, giả sử đầu ra ban đầu được xác định lại. Khi nào đồng hồ,
C, được khẳng định, chốt được mở và Q đầu ra ngay lập tức giả định giá trị của D đầu vào.
A-52 Phụ lục A Những điều cơ bản của thiết kế logic

D Q D Q
D D D Q
chốt chốt
Q
C C Q

HÌNH A.8.4 Một flip-flop với một kích hoạt cạnh rơi. Chốt đầu tiên, được gọi là chủ, là mở và theo đầu
vào D khi đồng hồ đầu vào , C, được khẳng định. Khi đồng hồ đầu vào , C, rơi, chốt thứ nhất được đóng lại,
nhưng chốt thứ hai, được gọi là nô lệ, được mở và lấy đầu vào từ đầu ra của chốt chính.

HÌNH A.8.5 Hoạt động của flip-flop với bộ kích hoạt cạnh rơi, giả sử đầu ra ban đầu được phân
rã. Khi đồng hồ đầu vào (C) thay đổi từ được khẳng định thành deasserted, the Q cửa hàng đầu ra giá trị của D
đầu vào. So sánh hành vi này với chốt D đồng hồ được hiển thị trong Hình A.8.3 Trong một chốt đồng hồ, giá trị
được lưu trữ và đầu ra ,. Q, cả hai thay đổi bất cứ khi nào C là cao, trái ngược với chỉ khi
C chuyển tiếp.

Dưới đây là mô tả Verilog về mô-đun cho flip-flop D cạnh tăng, giả sử rằng C
là đầu vào đồng hồ và D là đầu vào dữ liệu :
mô-đun DFF (đồng hồ, D, Q, Qbar);
đồng hồ đầu vào, D;
đầu ra reg Q;
Qbar đầu ra;
gán Qbar = ~ Q;
luôn luôn @ (đồng hồ định vị)
Q = D;
thời gian thiết lập Các mô-đun cuối
thời gian tối thiểu mà
đầu vào cho thiết bị bộ
Vì D đầu vào được lấy mẫu trên cạnh đồng hồ, nó phải có giá trị trong một
nhớ phải hợp lệ trước khoảng thời gian ngay trước và ngay sau mép đồng hồ. Thời gian tối thiểu mà đầu
cạnh đồng hồ. vào phải hợp lệ trước khi cạnh đồng hồ được gọi là thời gian thiết lập; các
A.8 Các yếu tố bộ nhớ: Flip-Flops, Latches và Register A-53

D
Thời gian thiết lập Giữ thời gian

HÌNH A.8.6 Yêu cầu thiết lập và giữ thời gian cho dép xỏ ngón D với bộ kích hoạt cạnh rơi.
Đầu vào phải ổn định trong một khoảng thời gian trước mép đồng hồ, cũng như sau mép đồng hồ. Thời
gian tối thiểu tín hiệu phải ổn định trước khi cạnh đồng hồ được gọi là thời gian thiết lập, trong khi thời
gian tối thiểu tín hiệu phải ổn định sau khi cạnh đồng hồ được gọi là thời gian giữ. Việc không đáp ứng các
yêu cầu tối thiểu này có thể dẫn đến tình huống đầu ra của flip-flop có thể không dự đoán được, như được
mô tả trong Mục A.11Thời gian giữ thường là 0 hoặc rất nhỏ và do đó không phải là nguyên nhân của lo
lắng.

thời gian tối thiểu trong đó nó phải hợp lệ sau khi cạnh đồng hồ được gọi là giữ thời giữ thời gian Tối thiểu
gianDo đó, các đầu vào cho bất kỳ flip-flop (hoặc bất cứ thứ gì được xây dựng bằng thời gian mà đầu vào phải
dép xỏ ngón) phải hợp lệ. trong một cửa sổ bắt đầu tại thời điểm tthiết lập trước khi hợp lệ sau cạnh đồng hồ.
cạnh đồng hồ và kết thúc tại tgiữ sau cạnh đồng hồ, như thể hiện trong Hình A.8.6.Mục
A.11 nói về các hạn chế về đồng hồ và thời gian, bao gồm cả sự chậm trễ lan truyền
thông qua một flip-flop, chi tiết hơn.
Chúng ta có thể sử dụng một mảng các flip-flops D để xây dựng một thanh ghi có thể
chứa một mốc dữ liệu đa dạng, chẳng hạn như một byte hoặc từ. Chúng tôi đã sử dụng các
thanh ghi trong suốt các datapath của chúng tôi trong Chương 4.
Đăng ký tập tin
Một cấu trúc là trung tâm của datapath của chúng tôi là a đăng ký tập tin Một tệp
đăng ký bao gồm một tập hợp các thanh ghi có thể được đọc và viết bằng cách cung
cấp số đăng ký sẽ được truy cập. Một tệp đăng ký có thể được thực hiện với một bộ
giải mã cho mỗi cổng đọc hoặc ghi và một mảng các thanh ghi được xây dựng từ dép
xỏ ngón D. Vì việc đọc một thanh ghi không thay đổi bất kỳ trạng thái nào, chúng tôi
chỉ cần cung cấp số thanh ghi làm đầu vào và đầu ra duy nhất sẽ là dữ liệu có trong
thanh ghi đó. Để viết một thanh ghi, chúng ta sẽ cần ba đầu vào: số thanh ghi, dữ liệu
cần viết và đồng hồ điều khiển chữ viết vào thanh ghi. Trong. Chương 4, chúng tôi đã
sử dụng một tệp đăng ký có hai cổng đọc và một cổng ghi. Tập tin đăng ký này được
rút ra như trong Hình A.8.7 Các cổng đọc có thể được thực hiện với một cặp ghép
kênh, mỗi cổng rộng bằng số bit trong mỗi thanh ghi của tệp thanh ghi. Hình A.8.8
cho thấy việc thực hiện hai cổng đọc đăng ký cho tệp đăng ký rộng 32 bit.
Việc thực hiện cổng ghi phức tạp hơn một chút, vì chúng tôi chỉ có thể thay
đổi nội dung của thanh ghi được chỉ định. Chúng ta có thể làm điều này bằng
cách sử dụng bộ giải mã để tạo tín hiệu có thể được sử dụng để xác định đăng ký
nào sẽ ghi. Hình A.8.9 cho thấy cách thực hiện cổng ghi cho tệp đăng ký. Điều
quan trọng cần nhớ là flip-flop chỉ thay đổi trạng thái trên cạnh đồng hồ.
TrongChương 4, chúng tôi đã nối các tín hiệu ghi cho tệp đăng ký một cách rõ
ràng và giả sử đồng hồ được hiển thị trong Hình A.8.9 được đính kèm ngầm.
Điều gì xảy ra nếu cùng một thanh ghi được đọc và viết trong một chu kỳ
đồng hồ? Bởi vì việc ghi tệp đăng ký xảy ra trên cạnh đồng hồ, thanh ghi sẽ được
A-54 Phụ lục A Những điều cơ bản của thiết kế logic

Đọc đăng ký
số 1 Đọc
dữ liệu
Đọc đăng ký 1
số 2
Đăng ký tập tin
Viết Đọc
dữ liệu
đăng ký 2
Viết
dữ liệu Viết

HÌNH A.8.7 Một tệp đăng ký có hai cổng đọc và một cổng ghi có năm đầu vào và hai đầu
ra. Đầu vào điều khiển Viết được hiển thị màu.

Đọc đăng ký
số 1
Đăng ký 0

Đăng ký 1
M
Đọc dữ liệu
... bạn 1
x
Đăng ký n - 2

Đăng ký n - 1

Đọc đăng ký
số 2

M
bạn Đọc dữ liệu 2

HÌNH A.8.8 Việc triển khai hai cổng đọc cho tệp đăng ký với n đăng ký có thể được thực
hiện với một cặp n-to-1 bộ ghép kênh, mỗi bộ rộng 32 bit. Số đọc đăng ký tín hiệu được sử dụng
làm tín hiệu chọn ghép kênh. Hình A.8.9 cho thấy cách thức cổng ghi được thực hiện.
A.8 Các yếu tố bộ nhớ: Flip-Flops, Latches và Register A-55

Viết

C
0
1 Đăng ký 0
n-đến n . D
Đăng ký số 2 .
bộ giải . C

Đăng ký 1

n-2 D

n-1 .
.
.

C
Đăng ký n - 2
D

C
Đăng ký n - 1
Đăng ký dữ D
liệu

HÌNH A.8.9 Cổng ghi cho tệp đăng ký được triển khai với bộ giải mã được sử dụng với tín
hiệu ghi để tạo đầu vào C cho các thanh ghi. Tất cả ba đầu vào (đăng ký số, dữ liệu và tín hiệu ghi)
sẽ có các ràng buộc về thiết lập và thời gian giữ để đảm bảo rằng dữ liệu chính xác được ghi vào tệp đăng
ký.

có giá trị trong thời gian nó được đọc, như chúng ta đã thấy trước đó Hình A.7.2
Giá trị được trả về sẽ là giá trị được viết trong chu kỳ đồng hồ trước đó. Nếu
chúng ta muốn đọc trả về giá trị hiện đang được viết, cần có logic bổ sung trong
tệp đăng ký hoặc bên ngoài nó. Chương 4 sử dụng rộng rãi logic như vậy.

Chỉ định logic tuần tự trong Verilog


Để chỉ định logic tuần tự trong Verilog, chúng ta phải hiểu cách tạo đồng hồ,
cách mô tả khi giá trị được ghi vào thanh ghi và cách chỉ định điều khiển tuần tự.
Hãy để chúng tôi bắt đầu bằng cách chỉ định một chiếc đồng hồ. Đồng hồ không
phải là một đối tượng được xác định trước trong Verilog; thay vào đó, chúng tôi
tạo ra một chiếc đồng hồ bằng cách sử dụng ký hiệu Verilog #n trước một tuyên
bố; điều này gây ra sự chậm trễ n thời gian mô phỏng các bước trước khi thực
hiện tuyên bố. Trong hầu hết các trình giả lập Verilog, cũng có thể tạo đồng hồ
làm đầu vào bên ngoài, cho phép người dùng chỉ định tại thời điểm mô phỏng số
chu kỳ đồng hồ trong đó chạy mô phỏng.
Mã trong Hình A.8.10 thực hiện một chiếc đồng hồ đơn giản cao hoặc thấp
cho một đơn vị mô phỏng và sau đó chuyển trạng thái. Chúng tôi sử dụng khả
năng trì hoãn và chặn chuyển nhượng để thực hiện đồng hồ.
A-56 Phụ lục A Những điều cơ bản của thiết kế logic

đồng hồ reg;
luôn luôn đồng hồ số 1 = ~ đồng hồ;

HÌNH A.8.10 Một đặc điểm kỹ thuật của đồng hồ.

Tiếp theo, chúng ta phải có khả năng chỉ định hoạt động của một thanh ghi
kích hoạt cạnh. Trong Verilog, điều này được thực hiện bằng cách sử dụng danh
sách độ nhạy trên an luôn luôn chặn và chỉ định làm kích hoạt cạnh dương hoặc
âm của biến nhị phân với ký hiệu đặt ra hoặc là phủ định, tương ứng. Do đó, mã
Verilog sau đây gây ra đăng ký A được viết với giá trị b ở đồng hồ cạnh dương :

31
31

31

31
31

HÌNH A.8.11 Một tệp đăng ký RISC-V được viết bằng Verilog hành vi. Tập tin đăng ký này ghi
trên cạnh đồng hồ tăng.

Trong suốt chương này và các phần Verilog của Chương 4, chúng tôi sẽ giả
định một thiết kế kích hoạt cạnh tích cực. Hình A.8.11 hiển thị thông số kỹ thuật
Verilog của tệp đăng ký RISC-V giả định hai lần đọc và một lần ghi, chỉ có ghi
được đồng hồ.
A.9 Các yếu tố bộ nhớ: SRAM và DRAM A-57

Trong Verilog cho tập tin đăng ký trong Hình A.8.11, các cổng đầu ra tương ứng với Kiểm tra
các thanh ghi đang đọc được gán bằng cách sử dụng một phép gán liên tục, nhưng Bản thân bạn
thanh ghi được ghi được gán trong an luôn luôn khối. Mà sau đây là lý do?
a. Không có lý do đặc biệt. Nó chỉ đơn giản là thuận tiện.
b. Vì Data1 và Data2 là các cổng đầu ra và WriteData là một cổng đầu vào.
c. Bởi vì đọc là một sự kiện kết hợp, trong khi viết là một sự kiện tuần tự.

A.9 Các yếu tố bộ nhớ: SRAM và DRAM

Các tệp đăng ký và đăng ký cung cấp các khối xây dựng cơ bản cho các bộ nhớ
nhỏ, nhưng lượng bộ nhớ lớn hơn được xây dựng bằng một trong hai SRAM bộ nhớ truy cập
(ngẫu nhiên tĩnh truy cập ký ức) hoặc là DRAM (bộ nhớ truy cập ngẫu nhiên ngẫu nhiên tĩnh
động). Chúng tôi lần đầu tiên thảo luận SRAM, có phần đơn giản hơn, và sau đó (SRAM) Một bộ nhớ
nơi dữ liệu được lưu
chuyển sang DRAM. trữ tĩnh (như trong dép
xỏ ngón) chứ không
SRAM phải động (như trong
DRAM). SRAM nhanh
SRAM chỉ đơn giản là các mạch tích hợp là mảng bộ nhớ với (thường) một cổng truy
hơn DRAM, nhưng ít
cập duy nhất có thể cung cấp đọc hoặc ghi. SRAM có thời gian truy cập cố định vào dày đặc hơn và đắt hơn
bất kỳ mốc thời gian nào, mặc dù các đặc điểm truy cập đọc và ghi thường khác nhau. mỗi bit.
Một chip SRAM có cấu hình cụ thể về số lượng vị trí có thể định địa chỉ, cũng như
chiều rộng của từng vị trí có thể định địa chỉ. Ví dụ: SRAM 4M × 8 cung cấp các
mục 4M, mỗi mục rộng 8 bit. Do đó, nó sẽ có 22 dòng địa chỉ (kể từ 4M = 2 22), dòng
đầu ra dữ liệu 8 bit và dòng đầu vào dữ liệu đơn 8 bit. Cũng như ROM, số lượng vị
trí có thể định địa chỉ thường được gọi là chiều cao, với số bit trên mỗi đơn vị được
gọi là chiều rộngVì nhiều lý do kỹ thuật, các SRAM mới nhất và nhanh nhất thường
có sẵn trong các cấu hình hẹp: × 1 và.
× 4. Hình A.9.1 hiển thị tín hiệu đầu vào và đầu ra cho SRAM 2M × 16 .

21
Địa chỉ

Chip chọn
SRAM 16
Đầu ra cho phép Kết xuất [15
2M 16
trận0]
Viết cho phép

16
Din [15 trận0]

HÌNH A.9.1 A 32K × 8 SRAM hiển thị 21 dòng địa chỉ (32K = 215) và 16 đầu vào dữ liệu, ba
dòng điều khiển và 16 đầu ra dữ liệu.
A-58 Phụ lục A Những điều cơ bản của thiết kế logic

Để bắt đầu truy cập đọc hoặc ghi, tín hiệu chọn Chip phải được kích hoạt. Để
đọc, chúng ta cũng phải kích hoạt tín hiệu cho phép Đầu ra kiểm soát xem mốc
thời gian được chọn bởi địa chỉ có thực sự được điều khiển trên các chân hay
không. Bật đầu ra rất hữu ích để kết nối nhiều bộ nhớ với bus một đầu ra và sử
dụng Đầu ra cho phép xác định bộ nhớ nào điều khiển bus. Thời gian truy cập
đọc SRAM thường được chỉ định là độ trễ kể từ thời điểm đầu ra cho phép là
đúng và các dòng địa chỉ có hiệu lực cho đến khi dữ liệu nằm trên các dòng đầu
ra. Thời gian truy cập đọc điển hình cho SRAM năm 2004 thay đổi từ khoảng 2
giây4 cho các phần CMOS nhanh nhất, có xu hướng nhỏ hơn và hẹp hơn, đến
82020 ns cho các phần lớn nhất điển hình, năm 2004 có hơn 32 triệu bit dữ liệu.
Nhu cầu về SRAM công suất thấp cho các sản phẩm tiêu dùng và thiết bị kỹ thuật
số đã tăng lên rất nhiều trong 5 năm qua; các SRAM này có khả năng truy cập và
khả năng truy cập thấp hơn nhiều, nhưng thường chậm hơn 5 lần10 lần. Gần đây
nhất, các SRAM đồng bộ, tương tự như các DRAM đồng bộ, mà chúng ta thảo
luận trong phần tiếp theo, cũng đã được phát triển.
Để viết, chúng tôi phải cung cấp dữ liệu được viết và địa chỉ, cũng như các tín
hiệu để làm cho việc ghi xảy ra. Khi cả kích hoạt Viết và chọn Chip đều đúng, dữ
liệu trên các dòng nhập dữ liệu được ghi vào ô được chỉ định bởi địa chỉ. Có các
yêu cầu về thời gian thiết lập và thời gian giữ cho địa chỉ và dòng dữ liệu, giống
như đối với dép xỏ ngón và chốt. Ngoài ra, tín hiệu Write cho phép không phải là
cạnh đồng hồ mà là xung có yêu cầu chiều rộng tối thiểu. Thời gian để hoàn
thành ghi được chỉ định bởi sự kết hợp của thời gian thiết lập, thời gian giữ và độ
rộng xung kích hoạt Viết.
Các SRAM lớn không thể được xây dựng giống như cách chúng tôi xây dựng tệp
đăng ký bởi vì, không giống như tệp đăng ký trong đó bộ ghép kênh 32 đến 1 có thể
thực tế, bộ ghép kênh 64K đến 1 cần thiết cho SRAM 64K × 1 là hoàn toàn không
thực tế. Thay vì sử dụng một bộ ghép kênh khổng lồ, các bộ nhớ lớn được thực hiện
với một dòng đầu ra được chia sẻ, được gọi là a dòng bit, mà nhiều ô nhớ trong mảng
bộ nhớ có thể khẳng định. Để cho phép nhiều nguồn lái một dòng duy nhất, a đệm ba
trạng thái (hoặc tristate đệm) được sử dụng. Bộ đệm ba trạng thái có hai đầu vào,
một tín hiệu dữ liệu và Đầu ra kích hoạt và một đầu ra duy nhất, ở một trong ba trạng
thái: được khẳng định, được xác nhận hoặc trở kháng cao. Đầu ra của bộ đệm tristate
bằng với tín hiệu đầu vào dữ liệu, được xác nhận hoặc được xác nhận lại, nếu kích
hoạt Đầu ra được xác nhận và nếu không thì trong a trạng thái trở kháng cao cho
phép một bộ đệm ba trạng thái khác có Đầu ra cho phép khẳng định để xác định giá
trị của một đầu ra được chia sẻ.
Hình A.9.2 hiển thị một bộ đệm ba trạng thái có dây để tạo thành một bộ ghép
kênh một đầu vào được giải mã. Điều quan trọng là Đầu ra cho phép nhiều nhất
một trong các bộ đệm ba trạng thái được khẳng định; mặt khác, bộ đệm ba trạng
thái có thể cố gắng đặt dòng đầu ra khác nhau. Bằng cách sử dụng bộ đệm ba
trạng thái trong các ô riêng lẻ của SRAM, mỗi ô tương ứng với một đầu ra cụ thể
có thể chia sẻ cùng một dòng đầu ra. Việc sử dụng một bộ đệm ba trạng thái phân
tán là một triển khai hiệu quả hơn so với một bộ ghép kênh tập trung lớn. Bộ đệm
ba trạng thái được tích hợp vào các flip-flops tạo thành các ô cơ bản của SRAM .
Hình A.9.3 cho thấy cách xây dựng SRAM 4 × 2 nhỏ, sử dụng chốt D với đầu vào
có tên Kích hoạt điều khiển đầu ra ba trạng thái.
A.9 Các yếu tố bộ nhớ: SRAM và DRAM A-59

Chọn 0 Cho
phép
Tro
Dữ liệu
ng Ngoài
0

Cho
Chọn 1 phép
Tro
Dữ liệu
ng Ngoài
1

Cho Đầu ra
Chọn 2 phép
Tro
Dữ liệu
ng Ngoài
2

Cho
Chọn 3 phép
Tro
Dữ liệu
ng Ngoài
3

HÌNH A.9.2 Bốn bộ đệm ba trạng thái được sử dụng để tạo thành một bộ ghép kênh. Chỉ
một trong bốn Chọn đầu vào có thể được khẳng định. Bộ đệm ba trạng thái với tính năng Đầu ra được xác
định có đầu ra có độ ấn cao cho phép bộ đệm ba trạng thái có tính năng Đầu ra được xác nhận để điều
khiển dòng đầu ra được chia sẻ.

Thiết kế trong Hình A.9.3 loại bỏ sự cần thiết của một bộ ghép kênh khổng lồ; tuy
nhiên, nó vẫn đòi hỏi một bộ giải mã rất lớn và một số lượng lớn các dòng từ tương
ứng. Ví dụ: trong SRAM 4M × 8, chúng ta sẽ cần bộ giải mã 22 đến 4M và các dòng
từ 4M (là các dòng được sử dụng để bật các flip-flops riêng lẻ)! Để khắc phục vấn đề
này, các bộ nhớ lớn được tổ chức dưới dạng mảng hình chữ nhật và sử dụng quy trình
giải mã hai bước. Hình A.9.4 cho thấy cách SRAM 4M × 8 có thể được tổ chức bên
trong bằng cách sử dụng giải mã hai bước. Như chúng ta sẽ thấy, quá trình giải mã
hai cấp khá quan trọng trong việc hiểu cách thức hoạt động của DRAM.
Gần đây, chúng tôi đã thấy sự phát triển của cả SRAM đồng bộ (SSRAM) và
DRAM đồng bộ (SDRAM). Khả năng chính được cung cấp bởi RAM đồng bộ là
khả năng chuyển a vỡ dữ liệu từ một loạt các địa chỉ tuần tự trong một mảng hoặc
hàng. Vụ nổ được xác định bởi một địa chỉ bắt đầu, được cung cấp theo kiểu
thông thường và độ dài bùng nổ. Ưu điểm tốc độ của RAM đồng bộ đến từ khả
năng truyền các bit trong vụ nổ mà không phải chỉ định các bit địa chỉ bổ sung.
Thay vào đó, một chiếc đồng hồ được sử dụng để truyền các bit liên tiếp trong vụ
nổ. Việc loại bỏ nhu cầu chỉ định địa chỉ cho các lần chuyển trong vụ nổ sẽ cải
thiện đáng kể tốc độ truyền khối dữ liệu. Do khả năng này, các SRAM và DRAM
đồng bộ đang nhanh chóng trở thành RAM được lựa chọn để xây dựng hệ thống
bộ nhớ trong máy tính. Chúng tôi thảo luận về việc sử dụng DRAM đồng bộ
trong một hệ thống bộ nhớ chi tiết hơn trong phần tiếp theo và trong Chương 5.
A-60 Phụ lục A Những điều cơ bản của thiết kế logic

Din [1] Din [1]

D D
D D
C chốt Q C chốt Q

Viết cho Cho phép Cho phép


phép
0

D D
2-4 D D
bộ giải
mã C chốt Q C chốt Q

Cho phép Cho phép

D D
D D
C chốt Q C chốt Q
Địa chỉ
Cho phép Cho phép

D D
D D
C chốt Q C chốt Q

Cho phép Cho phép

Kết xuất [1] Kết xuất [0]

HÌNH A.9.3 Cấu trúc cơ bản của 4 × 2 SRAM bao gồm một bộ giải mã chọn cặp ô nào để kích hoạt. Các ô được kích hoạt
sử dụng đầu ra ba trạng thái được kết nối với các đường bit dọc cung cấp dữ liệu được yêu cầu. Địa chỉ chọn ô được gửi trên một trong các
dòng địa chỉ ngang, được gọi là dòng từ. Để đơn giản, các tín hiệu chọn đầu ra và Chip đã bị bỏ qua, nhưng chúng có thể dễ dàng được
thêm vào bằng một vài cổng AND.
4K 4K 4K 4K 4K 4K 4K 4K
1024 1024 1024 1024 1024 1024 1024 1024
SRAM SRAM SRAM SRAM SRAM SRAM SRAM SRAM
12 4096
Địa chỉ đến
[21
trận10] 4096
bộ giải mã

1024
Địa chỉ
[9 trận0]

Mux
Mux Mux Mux Mux Mux Mux Mux

Dout7 Dout6 Dout5 Dout4 Dout3 Dout2 Dout1 Dout0

HÌNH A.9.4 Tổ chức điển hình của 4M × 8 SRAM dưới dạng một mảng 4K × 1024 mảng. Bộ giải mã đầu tiên tạo ra địa chỉ cho
tám mảng 4K × 1024; sau đó một bộ ghép kênh được sử dụng để chọn 1 bit từ mỗi mảng rộng 1024 bit. Đây là một thiết kế dễ dàng hơn
nhiều so với giải mã một cấp độ sẽ cần một bộ giải mã khổng lồ hoặc một bộ ghép kênh khổng lồ. Trong thực tế, một SRAM hiện đại có
kích thước này có thể sẽ sử dụng số lượng khối thậm chí còn lớn hơn, mỗi khối nhỏ hơn một chút.
A-62 Phụ lục A Những điều cơ bản của thiết kế logic

DRAM
Trong RAM tĩnh (SRAM), giá trị được lưu trong một ô được giữ trên một cặp
cổng đảo ngược và miễn là áp dụng nguồn điện, giá trị có thể được giữ vô thời
hạn. Trong RAM động (DRAM), giá trị được giữ trong một ô được lưu trữ dưới
dạng điện tích trong tụ điện. Sau đó, một bóng bán dẫn được sử dụng để truy cập
vào khoản phí được lưu trữ này, để đọc giá trị hoặc ghi đè lên khoản phí được
lưu trữ ở đó. Bởi vì DRAM chỉ sử dụng một bóng bán dẫn duy nhất cho mỗi bit
lưu trữ, chúng dày đặc hơn và rẻ hơn mỗi bit. Để so sánh, SRAM yêu cầu bốn
đến sáu bóng bán dẫn mỗi bit. Vì DRAM lưu trữ điện tích trên tụ điện, nên nó
không thể được giữ vô thời hạn và phải định kỳ làm mới Đó là lý do tại sao cấu
trúc bộ nhớ này được gọi. năng động, trái ngược với bộ lưu trữ tĩnh trong một tế
bào SRAM.
Để làm mới tế bào, chúng tôi chỉ đọc nội dung của nó và viết lại. Điện tích có
thể được giữ trong vài mili giây, có thể tương ứng với gần một triệu chu kỳ đồng
hồ. Ngày nay, bộ điều khiển bộ nhớ đơn chip thường xử lý chức năng làm mới
độc lập với bộ xử lý. Nếu mọi bit phải được đọc ra khỏi DRAM và sau đó được
viết lại riêng lẻ, với DRAM lớn chứa nhiều megabyte, chúng tôi sẽ liên tục làm
mới DRAM, không để lại thời gian truy cập. May mắn thay, DRAM cũng sử
dụng cấu trúc giải mã hai cấp độ và điều này cho phép chúng tôi làm mới toàn bộ
một hàng (chia sẻ một dòng từ) với một chu kỳ đọc theo sau ngay lập tức bởi một
chu kỳ ghi. Thông thường, các thao tác làm mới tiêu thụ 1% đến 2% chu kỳ hoạt
động của DRAM, để lại 98% còn lại đến 99% chu kỳ có sẵn để đọc và ghi dữ
liệu.

Xây dựng: Làm thế nào để DRAM đọc và ghi tín hiệu được lưu trữ trong một ô? Các
bóng bán dẫn bên trong tế bào là một công tắc, được gọi là a bóng bán dẫn, cho phép truy
cập giá trị được lưu trữ trên tụ điện để đọc hoặc ghi. Hình A.9.5 cho thấy các tế bào một
bóng bán dẫn trông như thế nào. Transitor pass hoạt động giống như một công tắc: khi tín
hiệu trên dòng từ được xác nhận, công tắc được đóng lại, kết nối tụ điện với đường bit.
Nếu thao tác là ghi, thì giá trị được ghi sẽ được đặt trên dòng bit. Nếu giá trị là 1, tụ điện
sẽ được sạc. Nếu giá trị là 0, thì tụ điện sẽ được xả. Đọc phức tạp hơn một chút, vì DRAM
phải phát hiện một điện tích rất nhỏ được lưu trữ trong tụ điện. Trước khi kích hoạt dòng
từ để đọc, dòng bit được sạc vào điện áp nằm giữa điện áp thấp và cao. Sau đó, bằng
cách kích hoạt dòng từ, điện tích trên tụ điện được đọc ra trên dòng bit. Điều này làm cho
đường bit di chuyển nhẹ về hướng cao hoặc thấp và thay đổi này được phát hiện với bộ
khuếch đại cảm giác, có thể phát hiện những thay đổi nhỏ về điện áp.
A.9 Các yếu tố bộ nhớ: SRAM và DRAM A-63

Dòng chữ

Truyền bóng bán dẫn

Tụ điện

Dòng bit

HÌNH A.9.5 Một tế bào DRAM một bóng bán dẫn chứa một tụ lưu trữ nội dung tế bào và
một bóng bán dẫn được sử dụng để truy cập vào tế bào.

Hàng 2048 2048


bộ giải mã mảng
11 đến
2048

Địa chỉ [10 trận0]


Chốt cột

Mux

Kết xuất

HÌNH A.9.6 A 4M × 1 DRAM được xây dựng với một năm 2048 × Mảng 2048. Truy cập hàng
sử dụng 11 bit để chọn một hàng, sau đó được chốt trong chốt 2048 1 bit. Một bộ ghép kênh chọn bit đầu
ra từ các chốt 2048 này. Tín hiệu RAS và CAS kiểm soát xem các dòng địa chỉ được gửi đến bộ giải mã
hàng hay bộ ghép kênh cột.
A-64 Phụ lục A Những điều cơ bản của thiết kế logic

DRAM sử dụng bộ giải mã hai cấp bao gồm a truy cập hàng theo sau là a cột truy
cập, như thể hiện trong Hình A.9.6Truy cập hàng chọn một trong một số hàng. và
kích hoạt dòng từ tương ứng. Nội dung của tất cả các cột trong hàng hoạt động sau đó
được lưu trữ trong một tập hợp các chốt. Sau đó, truy cập cột sẽ chọn dữ liệu từ các
chốt cột. Để tiết kiệm chân và giảm chi phí gói, các dòng địa chỉ giống nhau được sử
dụng cho cả địa chỉ hàng và cột; một cặp tín hiệu gọi là RAS (Hàng truy cập nhấp
nháy) và CAS (Cột truy cập nhấp nháy) được sử dụng để báo hiệu DRAM rằng địa
chỉ hàng hoặc cột đang được cung cấp. Làm mới được thực hiện bằng cách chỉ cần
đọc các cột vào chốt cột và sau đó viết lại các giá trị tương tự. Do đó, toàn bộ một
hàng được làm mới trong một chu kỳ. Lược đồ địa chỉ hai cấp, kết hợp với mạch bên
trong, làm cho thời gian truy cập DRAM dài hơn nhiều (theo hệ số 51010) so với thời
gian truy cập SRAM. Năm 2004, thời gian truy cập DRAM điển hình dao động từ 45
đến 65 ns; DRAM 256 Mbit được sản xuất đầy đủ và các mẫu khách hàng đầu tiên
của DRAM 1GB đã có sẵn trong quý đầu tiên của năm 2004. Chi phí mỗi bit thấp
hơn nhiều khiến DRAM trở thành lựa chọn cho bộ nhớ chính, trong khi thời gian truy
cập nhanh hơn khiến SRAM trở thành lựa chọn cho bộ nhớ cache.
Bạn có thể quan sát rằng DRAM 64M × 4 thực sự truy cập các bit 8K trên mỗi
truy cập hàng và sau đó ném đi tất cả trừ bốn trong số đó trong khi truy cập cột.
Các nhà thiết kế DRAM đã sử dụng cấu trúc bên trong của DRAM như một cách
để cung cấp băng thông cao hơn từ DRAM. Điều này được thực hiện bằng cách
cho phép địa chỉ cột thay đổi mà không thay đổi địa chỉ hàng, dẫn đến quyền truy
cập vào các bit khác trong chốt cột. Để làm cho quá trình này nhanh hơn và chính
xác hơn, các đầu vào địa chỉ đã được bấm giờ, dẫn đến dạng DRAM chiếm ưu thế
được sử dụng ngày nay: DRAM hoặc SDRAM đồng bộ .
Kể từ khoảng năm 1999, SDRAM đã trở thành chip bộ nhớ được lựa chọn cho
hầu hết các hệ thống bộ nhớ chính dựa trên bộ nhớ cache. SDRAM cung cấp quyền
truy cập nhanh vào một loạt các bit trong một hàng bằng cách truyền tuần tự tất cả
các bit trong một vụ nổ dưới sự điều khiển của tín hiệu đồng hồ. Vào năm 2004,
DDRRAM (RAM tốc độ dữ liệu kép), được gọi là tốc độ dữ liệu kép vì chúng truyền
dữ liệu trên cả cạnh tăng và giảm của đồng hồ được cung cấp bên ngoài, là dạng
SDRAM được sử dụng nhiều nhất. Như chúng ta thảo luận trong Chương 5, những
chuyển tốc độ cao này có thể được sử dụng để tăng băng thông có sẵn trong bộ nhớ
chính để phù hợp với nhu cầu của bộ xử lý và bộ nhớ cache.

Sửa lỗi
Do khả năng hỏng dữ liệu trong các bộ nhớ lớn, hầu hết các hệ thống máy tính sử
dụng một số loại mã kiểm tra lỗi để phát hiện sự hỏng dữ liệu có thể xảy ra. Một mã
đơn giản được sử dụng nhiều là a mã chẵn lẻTrong mã chẵn lẻ, số 1s trong một từ
được tính; từ này có tính chẵn lẻ nếu số 1 là số lẻ và.
A.9 Các yếu tố bộ nhớ: SRAM và DRAM A-65

thậm chí khác. Khi một từ được viết vào bộ nhớ, bit chẵn lẻ cũng được viết (1
cho lẻ, 0 cho chẵn). Sau đó, khi từ được đọc ra, bit chẵn lẻ được đọc và kiểm tra.
Nếu tính chẵn lẻ của từ bộ nhớ và bit chẵn lẻ được lưu trữ không khớp, đã xảy ra
lỗi.
Lược đồ chẵn lẻ 1 bit có thể phát hiện tối đa 1 bit lỗi trong một mục dữ liệu;
nếu có 2 bit lỗi, thì lược đồ chẵn lẻ 1 bit sẽ không phát hiện bất kỳ lỗi nào, vì tính
chẵn lẻ sẽ khớp dữ liệu với hai lỗi. (Trên thực tế, sơ đồ chẵn lẻ 1 bit có thể phát
hiện bất kỳ số lỗi lẻ nào; tuy nhiên, xác suất có ba lỗi thấp hơn nhiều so với xác
suất có hai, vì vậy, trên thực tế, mã chẵn lẻ 1 bit bị giới hạn trong việc phát hiện
một chút lỗi.) Tất nhiên, mã chẵn lẻ không thể cho biết bit nào trong mục dữ liệu
bị lỗi.
Một sơ đồ chẵn lẻ 1 bit là một mã phát hiện lỗi; cũng có sửa lỗi mã (ECC) sẽ mã phát hiện lỗi A mã
phát hiện và cho phép sửa lỗi. Đối với chính lớn bộ nhớ, nhiều hệ thống sử dụng cho phép phát hiện lỗi
mã cho phép phát hiện tối đa 2 bit lỗi và sửa một lỗi. Các mã này hoạt động bằng trong dữ liệu, nhưng
cách sử dụng nhiều bit hơn để mã hóa dữ liệu; ví dụ: các mã điển hình được sử không phải là vị trí chính
xác và do đó, sửa lỗi.
dụng cho các bộ nhớ chính yêu cầu 7 hoặc 8 bit cho mỗi 128 bit dữ liệu.

Xây dựng: Mã chẵn lẻ 1 bit là a mã khoảng cách 2, có nghĩa là nếu chúng ta nhìn tại
dữ liệu cộng với bit chẵn lẻ, không có thay đổi 1 bit nào đủ để tạo ra sự kết hợp pháp lý
khác của dữ liệu cộng với tính chẵn lẻ. Ví dụ: nếu chúng ta thay đổi một chút trong dữ liệu,
tính chẵn lẻ sẽ sai và ngược lại. Tất nhiên, nếu chúng ta thay đổi 2 bit (bất kỳ 2 bit dữ liệu
hoặc 1 bit dữ liệu và bit chẵn lẻ), tính chẵn lẻ sẽ khớp với dữ liệu và lỗi không thể được
phát hiện. Do đó, có một khoảng cách hai giữa các kết hợp pháp lý của tính chẵn lẻ và dữ
liệu.
Để phát hiện nhiều lỗi hoặc sửa lỗi, chúng tôi cần a mã khoảng cách 3, có thuộc
tính rằng bất kỳ sự kết hợp pháp lý nào của các bit trong mã sửa lỗi và dữ liệu có ít
nhất 3 bit khác với bất kỳ sự kết hợp nào khác. Giả sử chúng ta có một mã như vậy
và chúng ta có một lỗi trong dữ liệu. Trong trường hợp đó, mã cộng với dữ liệu sẽ
cách xa sự kết hợp pháp lý một chút và chúng tôi có thể sửa dữ liệu thành sự kết hợp
pháp lý đó. Nếu chúng tôi có hai lỗi, chúng tôi có thể nhận ra rằng có lỗi, nhưng
chúng tôi không thể sửa lỗi. Hãy cùng xem một ví dụ. Dưới đây là các từ dữ liệu và
mã sửa lỗi khoảng cách-3 cho mục dữ liệu 4 bit.

Dữ liệu Word Mã bit Dữ liệu Mã bit


0000 000 1000 111
0001 011 1001 100
0010 101 1010 010
0011 110 1011 001
0100 110 1100 001
0101 101 1101 010
0110 011 1110 100
0111 000 1111 111
A-66 Phụ lục A Những điều cơ bản của thiết kế logic

Để xem cách thức hoạt động của nó, hãy để Lừa chọn một từ dữ liệu, giả sử 0110,
có mã sửa lỗi là 011. Dưới đây là bốn khả năng lỗi 1 bit cho dữ liệu này: 1110, 0010,
0100 và 0111. Bây giờ hãy xem mục dữ liệu có cùng mã (011), đây là mục nhập có
giá trị 0001. Nếu bộ giải mã sửa lỗi nhận được một trong bốn từ dữ liệu có thể có lỗi,
thì nó sẽ phải chọn giữa sửa thành 0110 hoặc 0001. Mặc dù bốn từ có lỗi này chỉ có
1 bit thay đổi so với mẫu chính xác của 0110, nhưng mỗi từ có 2 bit khác với hiệu
chỉnh thay thế của 0001. Do đó, cơ chế sửa lỗi có thể dễ dàng chọn sửa thành 0110,
vì một lỗi duy nhất là xác suất cao hơn nhiều. Để thấy rằng hai lỗi có thể được phát
hiện, chỉ cần lưu ý rằng tất cả các kết hợp với 2 bit đã thay đổi có một mã khác nhau.
Việc sử dụng lại cùng một mã là với 3 bit khác nhau, nhưng nếu chúng tôi sửa lỗi 2
bit, chúng tôi sẽ sửa sai giá trị, vì bộ giải mã sẽ cho rằng chỉ có một lỗi duy nhất xảy
ra. Nếu chúng tôi muốn sửa lỗi 1 bit và phát hiện, nhưng không đúng, lỗi 2 bit, chúng
tôi cần mã khoảng cách 4.
Mặc dù chúng tôi phân biệt giữa mã và dữ liệu trong giải thích của mình, nhưng
thực tế, mã sửa lỗi xử lý sự kết hợp giữa mã và dữ liệu dưới dạng một từ trong mã
lớn hơn (7 bit trong ví dụ này). Do đó, nó xử lý các lỗi trong các bit mã theo cùng một
lỗi trong các bit dữ liệu.
Trong khi ví dụ trên yêu cầu n -1 bit cho n bit dữ liệu, số bit cần thiết tăng chậm, do
đó, đối với mã khoảng cách 3, từ 64 bit cần 7 bit và từ 128 bit cần 8. Loại mã này
được gọi là a Mã Hamming, sau R. Hamming, người đã mô tả một phương pháp để
tạo các mã như vậy.

A.10 Máy móc nhà nước hữu hạn


máy trạng thái hữu
hạn Hàm logic tuần tự Như chúng ta đã thấy trước đó, các hệ thống logic kỹ thuật số có thể được phân loại
bao gồm một tập hợp các là tổ hợp hoặc tuần tự. Các hệ thống tuần tự chứa trạng thái được lưu trữ trong các
đầu vào và đầu ra, hàm thành phần bộ nhớ bên trong hệ thống. Hành vi của chúng phụ thuộc cả vào tập hợp
trạng thái tiếp theo ánh xạ các đầu vào được cung cấp và vào nội dung của bộ nhớ trong hoặc trạng thái của hệ
trạng thái hiện tại và các thống. Do đó, một hệ thống tuần tự không thể được mô tả bằng một bảng sự thật.
đầu vào sang trạng thái Thay vào đó, một hệ thống tuần tự được mô tả như là một máy trạng thái hữu hạn
mới và hàm đầu ra ánh xạ (hoặc thường chỉ máy nhà nước). Một máy trạng thái hữu hạn có một tập hợp các
trạng thái hiện tại và có
trạng thái và hai chức năng, được gọi là chức năng trạng thái tiếp theo và chức
thể là đầu vào cho một tập
hợp các đầu ra được xác
năng đầu ra Tập hợp các trạng thái tương ứng với tất cả các giá trị có thể có của bộ
nhận . lưu trữ nội bộ. Như vậy, nếu có. n bit của lưu trữ, có 2n tiểu bang. Hàm trạng thái tiếp
theo là một hàm tổ hợp, với các đầu vào và trạng thái hiện tại, xác định trạng thái tiếp
theo của hệ thống. Hàm đầu ra tạo ra một tập hợp các đầu ra từ trạng thái hiện tại và
chức năng trạng thái
các đầu vào. Hình A.10.1 cho thấy điều này sơ đồ.
tiếp theo A hàm tổ hợp,
Các máy móc nhà nước chúng ta thảo luận ở đây và trong Chương 4 là đồng bộ
với các đầu vào và trạng
thái hiện tại, xác định Điều này có nghĩa là trạng thái thay đổi cùng với chu kỳ đồng hồ và trạng thái mới
trạng thái tiếp theo của được tính toán một lần mỗi đồng hồ. Do đó, các yếu tố trạng thái chỉ được cập nhật
máy trạng thái hữu hạn. trên cạnh đồng hồ. Chúng tôi sử dụng phương pháp này trong phần này và trong suốt.
Chương 4và chúng tôi thường không hiển thị đồng hồ rõ ràng. Chúng tôi sử dụng
máy móc nhà nước trong suốt Chương 4 để kiểm soát việc thực thi bộ xử lý và các
hành động của datapath.
A.10 Máy hữu hạn nhà nước A-67

Kế tiếp
tiểu bang
Nhà nước
tiếp theo
Hiện trạng chức năng

Đầu Đồng hồ
vào

Đầu ra
Đầu ra
chức năng

HÌNH A.10.1 Một máy trạng thái bao gồm bộ lưu trữ nội bộ có chứa trạng thái và hai chức
năng kết hợp: chức năng trạng thái tiếp theo và chức năng đầu ra. Thông thường, các chức
năng đầu ra bị hạn chế chỉ lấy trạng thái hiện tại làm đầu vào của nó; điều này không thay đổi khả năng
của một máy tuần tự, nhưng không ảnh hưởng đến nội bộ của nó.

Để minh họa cách một cỗ máy trạng thái hữu hạn hoạt động và được thiết kế,
hãy để Nhìn vào một ví dụ đơn giản và cổ điển: điều khiển đèn giao thông. Các
chương (4 và 5 chứa các ví dụ chi tiết hơn về việc sử dụng các máy trạng thái hữu
hạn để kiểm soát việc thực thi bộ xử lý.) Khi máy trạng thái hữu hạn được sử
dụng làm bộ điều khiển, chức năng đầu ra thường bị giới hạn chỉ phụ thuộc vào
trạng thái hiện tại. Một máy trạng thái hữu hạn như vậy được gọi là a Máy Moore
Đây là loại máy trạng thái hữu hạn mà chúng tôi sử dụng trong suốt cuốn sách
này. Nếu hàm đầu ra có thể phụ thuộc vào cả trạng thái hiện tại và đầu vào hiện
tại, máy được gọi là a. Máy có thịt Hai máy này tương đương với khả năng của
chúng, và một máy có thể được biến thành máy khác. Ưu điểm cơ bản của máy
Moore là nó có thể nhanh hơn, trong khi máy Mealy có thể nhỏ hơn, vì nó có thể
cần ít trạng thái hơn máy Moore. Trong. Chương 5, chúng tôi thảo luận về sự
khác biệt chi tiết hơn và hiển thị phiên bản Verilog của điều khiển trạng thái hữu
hạn bằng máy Mealy.
Ví dụ của chúng tôi liên quan đến việc kiểm soát đèn giao thông tại giao lộ của
tuyến đường bắc-nam và tuyến đông-tây. Để đơn giản, chúng tôi sẽ chỉ xem xét
đèn xanh và đỏ; thêm ánh sáng vàng còn lại cho một bài tập. Chúng tôi muốn đèn
quay không nhanh hơn 30 giây theo mỗi hướng, vì vậy chúng tôi sẽ sử dụng đồng
hồ 0,033 Hz để máy quay giữa các trạng thái không nhanh hơn 30 giây một lần.
Có hai tín hiệu đầu ra :
■ NSlite : Khi tín hiệu này được khẳng định, ánh sáng trên đường bắc-nam là
màu xanh lá cây; khi tín hiệu này được khử, ánh sáng trên đường bắc-nam có
màu đỏ.
A-68 Phụ lục A Những điều cơ bản của thiết kế logic

■ EWlite : Khi tín hiệu này được khẳng định, ánh sáng trên con đường đông-
tây có màu xanh lá cây; khi tín hiệu này được khử, ánh sáng trên đường
đông-tây có màu đỏ.
Ngoài ra, có hai đầu vào :
■ NScar : Chỉ ra rằng một chiếc xe hơi vượt qua máy dò được đặt ở lòng
đường phía trước của ánh sáng trên đường bắc-nam (đi về phía bắc hoặc
phía nam).
■ EWcar : Chỉ ra rằng một chiếc xe hơi vượt qua máy dò được đặt ở lòng
đường phía trước của ánh sáng trên con đường đông-tây (đi về phía đông
hoặc phía tây).
Đèn giao thông chỉ nên thay đổi từ hướng này sang hướng khác nếu xe đang chờ
để đi theo hướng khác; mặt khác, ánh sáng sẽ tiếp tục hiển thị màu xanh lá cây
theo cùng hướng với chiếc xe cuối cùng băng qua ngã tư.
Để thực hiện đèn giao thông đơn giản này, chúng tôi cần hai trạng thái :
■ NS xanh : Đèn giao thông màu xanh lá cây theo hướng bắc-nam.
■ EWgreen : Đèn giao thông xanh theo hướng đông tây.
Chúng ta cũng cần tạo hàm trạng thái tiếp theo, có thể được chỉ định bằng bảng :

Đầu vào
NScar EWcar Tiểu bang tiếp theo
NS xanh 0 0 NS xanh
NS xanh 0 1 Xanh lục
NS xanh 1 0 NS xanh
NS xanh 1 1 Xanh lục
Xanh lục 0 0 Xanh lục
Xanh lục 0 1 Xanh lục
Xanh lục 1 0 NS xanh
Xanh lục 1 1 NS xanh

Lưu ý rằng chúng tôi đã không chỉ định trong thuật toán những gì xảy ra khi
một chiếc xe đến từ cả hai hướng. Trong trường hợp này, chức năng trạng thái
tiếp theo được đưa ra ở trên sẽ thay đổi trạng thái để đảm bảo rằng một dòng xe
ổn định từ một hướng không thể khóa xe theo hướng khác.
Máy trạng thái hữu hạn được hoàn thành bằng cách chỉ định chức năng đầu ra.
Trước khi chúng tôi kiểm tra cách triển khai cỗ máy trạng thái hữu hạn này,
hãy để Nhìn vào
một biểu diễn đồ họa, thường được sử dụng cho các máy trạng thái hữu hạn. Trong
biểu diễn này, các nút được sử dụng để chỉ các trạng thái. Bên trong nút, chúng tôi
đặt một danh sách các đầu ra đang hoạt động cho trạng thái đó. Các cung được định
hướng được sử dụng để hiển thị chức năng trạng thái tiếp theo, với các nhãn trên các
cung chỉ định điều kiện đầu vào là các hàm logic. Hình A.10.2 hiển thị biểu diễn đồ
họa cho máy trạng thái hữu hạn này.
Đầu ra
NSlite EWlite
NS xanh 1 0
Xanh lục 0 1
A.10 Máy hữu hạn nhà nước A-69

EWcar

NS xanh Xanh lục

NScar
NSlite EWlite

EWcar NScar

HÌNH A.10.2 Biểu diễn đồ họa của bộ điều khiển đèn giao thông hai trạng thái. Chúng tôi
đơn giản hóa các func logicion on chuyển đổi nhà nước. Ví dụ: quá trình chuyển đổi từ NSgreen sang
EWgreen trong bảng trạng thái tiếp theo là (NScar ⋅ EWcar) (NScar ⋅ EWcar), tương đương với EWcar.

Một máy trạng thái hữu hạn có thể được thực hiện với một thanh ghi để giữ
trạng thái hiện tại và một khối logic tổ hợp tính toán hàm trạng thái tiếp theo và
hàm đầu ra. Hình A.10.3 cho thấy một máy trạng thái hữu hạn với 4 bit trạng thái,
và do đó có thể nhìn tới 16 trạng thái. Để triển khai máy trạng thái hữu hạn theo
cách này, trước tiên chúng ta phải gán số trạng thái cho các trạng thái. Quá trình
này được gọi chuyển nhượng nhà nướcVí dụ: chúng ta có thể gán NSgreen cho
trạng thái 0 và EWgreen. tiểu bang 1. Sổ đăng ký nhà nước sẽ chứa một bit duy
nhất. Chức năng trạng thái tiếp theo sẽ được đưa ra như
NextState (Hiện tại ⋅ EWcar) (Hiện tại ⋅ NScar)

Trong đó CurrentState là nội dung của thanh ghi trạng thái (0 hoặc 1) và
NextState là đầu ra của hàm trạng thái tiếp theo sẽ được ghi vào thanh ghi trạng
thái ở cuối chu kỳ đồng hồ. Chức năng đầu ra cũng đơn giản :

NSlite Hiện tại


EWlite Hiện tại

Khối logic tổ hợp thường được thực hiện bằng logic có cấu trúc, chẳng hạn
như PLA. Một PLA có thể được xây dựng tự động từ các bảng chức năng đầu ra
và trạng thái tiếp theo. Trong thực tế, có thiết kế hỗ trợ máy tính (CAD) chương
trình
A-70 Phụ lục A Những điều cơ bản của thiết kế logic

Đầu ra

Logic kết hợp

Tiểu bang tiếp


theo

Đăng ký nhà nước

Đầu vào

HÌNH A.10.3 Một máy trạng thái hữu hạn được triển khai với một thanh ghi trạng thái giữ
trạng thái hiện tại và khối logic tổ hợp để tính toán các hàm trạng thái và đầu ra tiếp theo.
Hai hàm sau thường được phân tách và thực hiện với hai khối logic riêng biệt , có thể yêu cầu ít cổng hơn.

có biểu diễn đồ họa hoặc văn bản của máy trạng thái hữu hạn và tự động thực hiện
tối ưu hóa. Trong Chương 4 và 5, máy trạng thái hữu hạn đã được sử dụng để điều
khiển thực thi bộ xử lý. Phụ lục C thảo luận
việc triển khai chi tiết các bộ điều khiển này với cả PLA và ROM.
Để cho thấy cách chúng ta có thể viết điều khiển trong Verilog , Hình A.10.4
hiển thị một phiên bản Verilog được thiết kế để tổng hợp. Lưu ý rằng đối với
chức năng điều khiển đơn giản này, máy Mealy không hữu ích, nhưng kiểu đặc
tả này được sử dụng Chương 5 để thực hiện chức năng điều khiển là máy Mealy
và có ít trạng thái hơn bộ điều khiển máy Moore.
A.11 Phương pháp thời gian A-71

HÌNH A.10.4 Một phiên bản Verilog của bộ điều khiển đèn giao thông.

Số lượng trạng thái nhỏ nhất trong máy Moore mà máy Mealy có thể có ít trạng Kiểm tra
thái hơn? Bản thân bạn
a. Hai, vì có thể có một máy Mealy một trạng thái có thể làm điều tương tự.
b. Ba, vì có thể có một cỗ máy Moore đơn giản đã đi đến một trong hai trạng
thái khác nhau và luôn trở về trạng thái ban đầu sau đó. Đối với một máy
đơn giản như vậy, một máy Mealy hai trạng thái là có thể.
c. Bạn cần ít nhất bốn trạng thái để khai thác các lợi thế của máy Mealy so
với máy Moore.

A.11 Phương pháp thời gian

Trong suốt phần phụ lục này và trong phần còn lại của văn bản, chúng tôi sử dụng
phương pháp định thời gian kích hoạt cạnh. Phương pháp thời gian này có một lợi
thế ở chỗ nó đơn giản hơn để giải thích và hiểu hơn là một phương pháp kích hoạt
cấp độ. Trong phần này, chúng tôi giải thích phương pháp thời gian này chi tiết
hơn một chút và cũng giới thiệu đồng hồ nhạy cảm cấp độ. Chúng tôi kết thúc
phần này bằng cách thảo luận ngắn gọn
A-72 Phụ lục A Những điều cơ bản của thiết kế logic

vấn đề tín hiệu và đồng bộ hóa không đồng bộ, một vấn đề quan trọng đối với
các nhà thiết kế kỹ thuật số.
Mục đích của phần này là để giới thiệu các khái niệm chính trong phương
pháp đồng hồ. Phần này đưa ra một số giả định đơn giản hóa quan trọng; nếu bạn
quan tâm đến việc hiểu phương pháp thời gian chi tiết hơn, hãy tham khảo một
trong những tài liệu tham khảo được liệt kê ở cuối phụ lục này.
Chúng tôi sử dụng một phương pháp thời gian kích hoạt cạnh vì nó đơn giản
hơn để giải thích và có ít quy tắc cần thiết hơn cho tính chính xác. Đặc biệt, nếu
chúng tôi giả định rằng tất cả các đồng hồ đến cùng một lúc, chúng tôi đảm bảo
rằng một hệ thống có các thanh ghi kích hoạt cạnh giữa các khối logic tổ hợp có
thể hoạt động chính xác mà không cần đua nếu chúng tôi chỉ cần làm cho đồng hồ
đủ dài. A cuộc đua xảy ra khi nội dung của một phần tử trạng thái phụ thuộc vào
tốc độ tương đối của các phần tử logic khác nhau. Trong một thiết kế kích hoạt
cạnh, chu trình đồng hồ phải đủ dài để phù hợp với đường dẫn từ một flip-flop
thông qua logic tổ hợp đến một flip-flop khác, nơi nó phải đáp ứng yêu cầu về thời
gian thiết lập. Hình A.11.1 cho thấy yêu cầu này đối với một hệ thống sử dụng dép
xỏ ngón có kích thước cạnh tăng. Trong một hệ thống như vậy, chu kỳ đồng hồ
(hoặc thời gian chu kỳ) phải lớn nhất bằng
t t t
chống đỡ tổ hợp thiết lập

đối với các giá trị trường hợp xấu nhất của ba độ trễ này, được xác định như sau :
■ tchống đỡ là thời gian để một tín hiệu truyền qua một flip-flop; nó cũng đôi
khi gọi là đồng hồ-Q .
■ ttổ hợp là độ trễ dài nhất cho bất kỳ logic tổ hợp nào (theo định nghĩa được
bao quanh bởi hai dép xỏ ngón).
■ tthiết lập là thời gian trước khi cạnh đồng hồ tăng mà đầu vào cho một flip-
flop phải có giá trị.

D Q D Q
Kết hợp
Lật-lật Lật-lật
khối logic
C C

t t t
chống đỡ tổ hợp thiết
lập

HÌNH A.11.1 Trong thiết kế kích hoạt cạnh, đồng hồ phải đủ dài để cho phép tín hiệu có
hiệu lực trong thời gian thiết lập cần thiết trước cạnh đồng hồ tiếp theo. Thời gian cho a đầu
vào flip-flop để truyền đến đầu ra flip làtchống đỡ; tín hiệu sau đó mất ttổ hợp để đi qua logic kết hợp và phải
có giá trị tthiết lập trước cạnh đồng hồ tiếp theo.
A.11 Phương pháp thời gian A-73

Chúng tôi đưa ra một giả định đơn giản hóa: các yêu cầu về thời gian giữ được
thỏa mãn, điều này gần như không bao giờ là vấn đề với logic hiện đại.
Một biến chứng bổ sung phải được xem xét trong các thiết kế kích hoạt cạnh là
xiên đồng hồSương đồng hồ là sự khác biệt về thời gian tuyệt đối giữa khi hai xiên đồng hồ Các sự
yếu tố trạng thái nhìn thấy cạnh đồng hồ. Sương đồng hồ phát sinh do tín hiệu khác biệt về thời gian
đồng hồ thường sẽ sử dụng hai đường dẫn khác nhau, với độ trễ hơi khác nhau, tuyệt đối giữa các lần khi
để đạt được hai yếu tố trạng thái khác nhau. Nếu độ lệch của đồng hồ đủ lớn, có hai phần tử trạng thái
thể một phần tử trạng thái có thể thay đổi và khiến đầu vào bị lật khác thay đổi nhìn thấy cạnh đồng hồ.
trước khi nhìn thấy cạnh đồng hồ bằng flip-flop thứ hai.
Hình A.11.2 minh họa vấn đề này, bỏ qua thời gian thiết lập và flip-flop tuyên
truyền chậm trễ. Để tránh hoạt động không chính xác, thời gian đồng hồ được
tăng lên để cho phép độ lệch đồng hồ tối đa. Do đó, thời gian đồng hồ phải dài
hơn
t t t t
chống đỡ tổ hợp thiết lập xiên

Với ràng buộc này trong khoảng thời gian đồng hồ, hai đồng hồ cũng có thể đến theo
thứ tự ngược lại, với đồng hồ thứ hai đến txiên sớm hơn, và mạch sẽ hoạt động

D Q D Q
Kết hợp
Lật-lật Lật-lật
Đồng hồ đến khối logic với
Đồng hồ đến
C thời gian trì hoãn C
tại thời điểm
t của
sau t +
HÌNH A.11.2 Minh họa về cách xiên đồng hồ có thể gây ra một cuộc đua, dẫn đến hoạt động không chính xác. Vì sự khác
biệt khi hai dép xỏ ngón nhìn thấy đồng hồ, tín hiệu được lưu vào flip-flop đầu tiên có thể chạy về phía trước và thay đổi đầu vào thành flip-
flop thứ hai trước khi đồng hồ đến flip-flop thứ hai.

chính xác. Các nhà thiết kế giảm các vấn đề về đồng hồ bằng cách định tuyến cẩn
thận tín hiệu đồng hồ để giảm thiểu sự khác biệt về thời gian đến. Ngoài ra, các
nhà thiết kế thông minh cũng cung cấp một số lề bằng cách làm cho đồng hồ dài
hơn một chút so với mức tối thiểu; điều này cho phép thay đổi các thành phần
cũng như trong nguồn điện. Vì độ lệch đồng hồ cũng có thể ảnh hưởng đến các
yêu cầu về thời gian giữ, việc giảm thiểu kích thước của độ lệch đồng hồ là rất đồng hồ nhạy cảm
quan trọng. cấp độ Một thời gian
Các thiết kế kích hoạt cạnh có hai nhược điểm: chúng đòi hỏi logic thêm và phương pháp trong đó
thay đổi trạng thái xảy
đôi khi chúng có thể chậm hơn. Chỉ cần nhìn vào flip-flop so với chốt nhạy cảm
ra ở mức đồng hồ cao
cấp độ mà chúng ta đã sử dụng để xây dựng flip-flop cho thấy thiết kế kích hoạt hoặc thấp nhưng không
cạnh đòi hỏi nhiều logic hơn. Một cách khác là sử dụng đồng hồ nhạy cảm cấp tức thời vì những thay
độBởi vì những thay đổi trạng thái trong một phương pháp nhạy cảm với mức độ đổi đó nằm trong các
không phải là tức thời, một sơ đồ nhạy cảm với mức độ phức tạp hơn một chút và thiết kế kích hoạt cạnh.
cần có sự chăm sóc bổ sung để làm cho nó hoạt động chính xác.
A-74 Phụ lục A Những điều cơ bản của thiết kế logic

Thời gian nhạy cảm cấp độ


Trong thời gian nhạy cảm với mức độ, các thay đổi trạng thái xảy ra ở mức cao hoặc thấp,
nhưng chúng không tức thời vì chúng nằm trong một phương pháp kích hoạt cạnh. Do sự
thay đổi không tức thời trong trạng thái, các chủng tộc có thể dễ dàng xảy ra. Để đảm bảo
rằng thiết kế nhạy cảm với mức độ cũng sẽ hoạt động chính xác nếu đồng hồ đủ chậm,
các nhà thiết kế sử dụng đồng hồ hai phaĐồng hồ hai pha là một sơ đồ sử dụng hai không
chồng chéo. tín hiệu đồng hồ. Vì hai đồng hồ, thường được gọi là φ 1 và φ2, là không
chồng chéo, tại hầu hết các tín hiệu đồng hồ đều cao tại bất kỳ thời điểm nào, như Hình
A.11.3 chương trình. Chúng ta có thể sử dụng hai đồng hồ này để xây dựng một hệ thống
có chốt nhạy cảm với cấp độ nhưng không có bất kỳ điều kiện chủng tộc nào, giống như
các thiết kế kích hoạt cạnh.

Φ1

Φ2

Không chồng chéo


giai đoạn

HÌNH A.11.3 Một sơ đồ đồng hồ hai pha cho thấy chu kỳ của từng đồng hồ và các khoảng
thời gian không chồng chéo.

D Q D Q D
Kết hợp Kết hợp
Φ1 Chốt khối logic Chốt khối logic Chốt
C Φ2 C Φ1 C

HÌNH A.11.4 Sơ đồ thời gian hai pha với chốt xen kẽ cho thấy hệ thống hoạt động như thế nào trên cả hai pha đồng hồ.
Đầu ra của một chốt ổn định ở pha đối diện với đầu vào C của nó. Do đó, khối đầu vào tổ hợp đầu tiên có đầu vào ổn định trong thời gian
φ2và đầu ra của nó được chốt bởi φ2Khối tổ hợp thứ hai (ngoài cùng bên phải) hoạt động theo kiểu ngược lại, với đầu vào ổn định trong. 1Do
đó, độ trễ thông qua các khối tổ hợp xác định thời gian tối thiểu mà các đồng hồ tương ứng phải được xác nhận. Kích thước của khoảng thời
gian không chồng chéo được xác định bởi độ lệch đồng hồ tối đa và độ trễ tối thiểu của bất kỳ khối logic nào.

Một cách đơn giản để thiết kế một hệ thống như vậy là thay thế việc sử dụng chốt
được mở trên φ1 với chốt được mở trên φ2Bởi vì cả hai đồng hồ không được khẳng
định cùng một lúc, một cuộc đua không thể xảy ra. Nếu đầu vào cho một khối tổ hợp
là một φ.1 đồng hồ, sau đó đầu ra của nó được chốt bởi một 2 đồng hồ, chỉ mở trong
thời gian2 khi chốt đầu vào được đóng và do đó có đầu ra hợp lệ. Hình A.11.4 cho
thấy một hệ thống với thời gian hai pha và chốt xen kẽ hoạt động như thế nào. Như
trong một thiết kế kích hoạt cạnh, chúng ta phải chú ý đến độ lệch đồng hồ, đặc biệt
là giữa hai
A.11 Phương pháp thời gian A-75

giai đoạn đồng hồ. Bằng cách tăng lượng không chồng chéo giữa hai giai đoạn,
chúng ta có thể giảm biên độ sai số tiềm năng. Do đó, hệ thống được đảm bảo
hoạt động chính xác nếu mỗi pha đủ dài và nếu có sự không chồng chéo đủ lớn
giữa các pha.

Đầu vào và đồng bộ hóa không đồng bộ


Bằng cách sử dụng đồng hồ đơn hoặc đồng hồ hai pha, chúng tôi có thể loại bỏ
các điều kiện cuộc đua nếu tránh được các vấn đề về đồng hồ. Thật không may,
việc tạo ra toàn bộ chức năng hệ thống với một chiếc đồng hồ duy nhất là không
thực tế và vẫn giữ cho đồng hồ bị lệch nhỏ. Mặc dù CPU có thể sử dụng một
đồng hồ duy nhất, các thiết bị I / O có thể sẽ có đồng hồ riêng. Một thiết bị không
đồng bộ có thể giao tiếp với CPU thông qua một loạt các bước bắt tay. Để dịch
đầu vào không đồng bộ sang tín hiệu đồng bộ có thể được sử dụng để thay đổi
trạng thái của hệ thống, chúng ta cần sử dụng a đồng bộ hóa, có đầu vào là tín
hiệu không đồng bộ và đồng hồ và đầu ra là đồng bộ tín hiệu với đồng hồ đầu
vào.
Nỗ lực đầu tiên của chúng tôi để xây dựng một bộ đồng bộ hóa sử dụng một
flip-flop D kích hoạt cạnh, có D đầu vào là tín hiệu không đồng bộ, như Hình
A.11.5 chương trình. Bởi vì chúng tôi liên lạc với một giao thức bắt tay, không
quan trọng việc chúng tôi phát hiện trạng thái được khẳng định của tín hiệu không
đồng bộ trên đồng hồ này hay đồng hồ tiếp theo, vì tín hiệu sẽ được xác nhận cho
đến khi được xác nhận. Do đó, bạn có thể nghĩ rằng cấu trúc đơn giản này đủ để
lấy mẫu tín hiệu chính xác, đó sẽ là trường hợp ngoại trừ một vấn đề nhỏ.

Đầu vào không đồng bộ D Q Đầu ra đồng bộ


Lật-lật
Đồng hồ C

HÌNH A.11.5 Một bộ đồng bộ hóa được xây dựng từ flip-flop D được sử dụng để lấy mẫu
tín hiệu không đồng bộ để tạo ra đầu ra đồng bộ với đồng hồ. Trình đồng bộ hóa này sẽ có ý
chí không phải làm việc đúng cách!

Vấn đề là một tình huống được gọi di căn Giả sử tín hiệu không đồng bộ đang di căn
chuyển đổi giữa cao và thấp khi cạnh đồng hồ đến. Rõ ràng, không thể biết liệu tín Một tình huống xảy ra
hiệu sẽ được chốt ở mức cao hay thấp. Vấn đề đó chúng ta có thể sống với. Thật nếu tín hiệu được lấy mẫu
khi nó không ổn định
không may, tình huống tồi tệ hơn: khi tín hiệu được lấy mẫu không ổn định cho thời
trong thời gian thiết lập
gian thiết lập và giữ cần thiết, flip-flop có thể đi vào a. di căn tiểu bang. Ở trạng thái và giữ cần thiết, có thể
như vậy, đầu ra sẽ không có giá trị cao hoặc thấp hợp pháp, nhưng sẽ ở khu vực khiến giá trị được lấy mẫu
không xác định giữa chúng. Hơn nữa, rơi vào vùng không xác
định giữa giá trị cao và
thấp.
A-76 Phụ lục A Những điều cơ bản của thiết kế logic

flip-flop không được đảm bảo để thoát khỏi trạng thái này trong bất kỳ khoảng
thời gian giới hạn nào. Một số khối logic nhìn vào đầu ra của flip-flop có thể thấy
lỗi đồng bộ hóa Một đầu ra của nó là 0, trong khi các khối khác có thể xem nó là 1. Tình huống này
tình huống trong đó một được gọi là alỗi đồng bộ hóa.
flip-flop đi vào trạng thái Trong một hệ thống hoàn toàn đồng bộ, có thể tránh được lỗi đồng bộ hóa
có thể di chuyển và trong bằng cách đảm bảo rằng thời gian thiết lập và giữ cho một flip-flop hoặc chốt
đó một số khối logic đọc
luôn được đáp ứng, nhưng điều này là không thể khi đầu vào không đồng bộ.
đầu ra của flip-flop nhìn
thấy 0 trong khi những
Thay vào đó, giải pháp duy nhất có thể là đợi đủ lâu trước khi nhìn vào đầu ra của
người khác nhìn thấy 1. flip-flop để đảm bảo rằng đầu ra của nó ổn định và nó đã thoát khỏi trạng thái có
thể di chuyển được, nếu nó được đưa vào. Bao lâu là đủ dài? Chà, xác suất mà
flip-flop sẽ ở trạng thái có thể di chuyển giảm theo cấp số nhân, vì vậy sau một
thời gian rất ngắn, xác suất flip-flop ở trạng thái có thể di chuyển là rất thấp; tuy
nhiên, xác suất không bao giờ đạt đến 0! Vì vậy, các nhà thiết kế chờ đợi đủ lâu
để xác suất xảy ra lỗi đồng bộ hóa là rất thấp và thời gian giữa những thất bại đó
sẽ là hàng năm hoặc thậm chí hàng ngàn năm.
Đối với hầu hết các thiết kế flip-flop, việc chờ đợi một khoảng thời gian dài hơn
nhiều lần so với thời gian thiết lập làm cho xác suất lỗi đồng bộ hóa rất thấp. Nếu tốc
độ đồng hồ dài hơn thời gian di căn tiềm năng (có khả năng), thì một bộ đồng bộ hóa
an toàn có thể được xây dựng với hai dép xỏ ngón D, nhưHình A.11.6 chương trình.
Nếu bạn quan tâm đến việc đọc thêm về những vấn đề này, hãy xem xét các tài liệu
tham khảo.

Đầu vào không đồng D Q D Q


bộ Đầu ra đồng bộ
Lật-lật Lật-lật
Đồng hồ
C C

HÌNH A.11.6 Bộ đồng bộ hóa này sẽ hoạt động chính xác nếu khoảng thời gian di căn mà
chúng tôi muốn bảo vệ chống lại nhỏ hơn thời gian đồng hồ. Mặc dù đầu ra của flip-flop đầu
tiên có thể di căn được, nó sẽ không được nhìn thấy bởi bất kỳ yếu tố logic nào khác cho đến đồng hồ thứ
hai, khi flip-flop thứ hai lấy mẫu tín hiệu, mà vào thời điểm đó sẽ không còn ở trạng thái di căn.

Kiểm tra Giả sử chúng ta có một thiết kế với độ lệch đồng hồ rất lớn dài hơn so với thanh
Bản thân bạn ghi thời gian nhân giốngCó phải luôn luôn có thể cho một thiết kế như vậy để
làm chậm đồng hồ. đủ để đảm bảo rằng logic hoạt động đúng?
a. Có, nếu đồng hồ đủ chậm, tín hiệu luôn có thể lan truyền và thiết kế sẽ
thời gian nhân giống
Các thời gian cần thiết hoạt động, ngay cả khi độ lệch rất lớn.
cho một đầu vào cho một
flip-flop để truyền đến
các đầu ra của flip-flop.
b. Không, vì có
thể hai thanh
ghi nhìn thấy
cùng một cạnh
đồng hồ cách
nhau đủ xa để
một thanh ghi
được kích hoạt,
và các đầu ra
của nó được
truyền và nhìn
thấy bởi một
thanh ghi thứ
hai có cùng
cạnh đồng hồ.
A.12 Thiết bị lập trình trường A-77

A.12 Thiết bị lập trình hiện trường


thiết bị lập trình
Trong một chip tùy chỉnh hoặc bán tùy chỉnh, các nhà thiết kế có thể sử dụng tính trường (FPD) An mạch
linh hoạt của cấu trúc cơ bản để dễ dàng thực hiện logic tổ hợp hoặc tuần tự. Làm thế tích hợp chứa logic tổ
nào một nhà thiết kế không muốn sử dụng IC tùy chỉnh hoặc bán tự động thực hiện hợp và có thể là các thiết
một phần logic phức tạp để tận dụng mức độ tích hợp rất cao có sẵn? Thành phần phổ bị bộ nhớ, có thể được
biến nhất được sử dụng cho thiết kế logic tuần tự và tổ hợp bên ngoài IC tùy chỉnh cấu hình bởi người dùng
cuối.
hoặc bán tự động là a lập trình trường thiết bị (FPD)Một FPD là một mạch tích
hợp chứa logic tổ hợp, và. có thể là thiết bị bộ nhớ, có thể được cấu hình bởi người thiết bị logic lập
dùng cuối. trình (PLD)
Các FPD thường rơi vào hai trại : thiết bị logic lập trình (PLD), đó hoàn toàn Một mạch tích hợp chứa
là tổ hợp, và mảng cổng lập trình trường (FPGA), cung cấp cả logic tổ hợp và logic tổ hợp có chức
năng được cấu hình bởi
dép xỏ ngón. PLD bao gồm hai hình thức : PLD đơn giản (SPLD), thường là
người dùng cuối.
PLA hoặc a logic mảng lập trình (PAL)và các PLD phức tạp, cho phép nhiều
hơn một khối logic cũng như kết nối cấu hình giữa các khối. Khi chúng ta nói về mảng cổng lập trình
PLA trong PLD, chúng tôi có nghĩa là PLA với người dùng có thể lập trình và lập trường (FPGA)
Một mạch tích hợp có thể
kế hoạch và hoặc máy bay. PAL giống như PLA, ngoại trừ việc máy bay hoặc
định cấu hình có chứa cả
máy bay được cố định. khối logic tổ hợp và dép
Trước khi chúng tôi thảo luận về các FPGA, rất hữu ích khi nói về cách cấu hình xỏ ngón.
các FPD. Cấu hình về cơ bản là một câu hỏi về nơi để thực hiện hoặc phá vỡ các kết
nối. Cấu trúc cổng và thanh ghi là tĩnh, nhưng các kết nối có thể được cấu hình. Lưu lập trình đơn giản
thiết bị logic
ý rằng bằng cách định cấu hình các kết nối, người dùng sẽ xác định chức năng logic
(SPLD) Có thể lập trình
nào được thực hiện. Hãy xem xét một PLA có thể định cấu hình: bằng cách xác định thiết bị logic, thường
vị trí của các kết nối trong và mặt phẳng và mặt phẳng, người dùng chỉ ra những chứa một trong hai
chức năng logic nào được tính toán trong PLA. Các kết nối trong FPD là vĩnh viễn PAL hoặc PLA .
hoặc có thể cấu hình lại. Các kết nối vĩnh viễn liên quan đến việc tạo hoặc phá hủy
kết nối giữa hai dây. Các FPLD hiện tại đều sử dụng một thuốc chống nấm công logic mảng lập trình
(PAL) Chứa a lập trình
nghệ, cho phép kết nối được xây dựng tại thời điểm lập trình là vĩnh viễn. Một cách
và máy bay theo sau là
khác để định cấu hình CMOS FPLD là thông qua SRAM. SRAM được tải xuống khi một máy bay cố định.
bật nguồn và nội dung điều khiển cài đặt các công tắc, từ đó xác định đường kim loại
nào được kết nối. Việc sử dụng điều khiển SRAM có lợi thế là FPD có thể được cấu thuốc chống nấm Một
hình lại bằng cách thay đổi nội dung của SRAM. Nhược điểm của điều khiển dựa cấu trúc trong một mạch
tích hợp mà khi được lập
trên SRAM là hai lần: cấu hình không ổn định và phải được tải lại khi bật nguồn, và
trình tạo ra một kết nối
việc sử dụng các bóng bán dẫn hoạt động cho các công tắc làm tăng nhẹ sức đề vĩnh viễn giữa hai dây.
kháng của các kết nối đó.
Các FPGA bao gồm cả thiết bị logic và bộ nhớ, thường được cấu trúc thành
một mảng hai chiều với các hành lang phân chia các hàng và cột được sử dụng
cho
A-78 Phụ lục A Những điều cơ bản của thiết kế logic

kết nối toàn cầu giữa các ô của mảng. Mỗi ô là sự kết hợp giữa cổng và dép xỏ
ngón có thể được lập trình để thực hiện một số chức năng cụ thể. Bởi vì về cơ bản
bảng tra cứu (LUT) chúng là RAM nhỏ, có thể lập trình, chúng cũng được gọi tra cứu bảng
Trong một thiết bị lập (LUT)Các FPGA mới hơn chứa các khối xây dựng tinh vi hơn như. các phần của
trình trường, tên được đặt bộ cộng và khối RAM có thể được sử dụng để xây dựng các tệp đăng ký. Một số
cho các ô vì chúng bao FPGA thậm chí còn chứa lõi RISC-V 64 bit!
gồm một lượng nhỏ logic
Ngoài việc lập trình từng ô để thực hiện một chức năng cụ thể, các kết nối
và RAM .
giữa các ô cũng có thể lập trình được, cho phép các FPGA hiện đại với hàng trăm
khối và hàng trăm ngàn cổng được sử dụng cho các chức năng logic phức tạp.
Kết nối là một thách thức lớn trong chip tùy chỉnh và điều này thậm chí còn đúng
hơn đối với các FPGA, bởi vì các tế bào không đại diện cho các đơn vị phân hủy
tự nhiên cho thiết kế có cấu trúc. Trong nhiều FPGA, 90% diện tích được dành
riêng cho kết nối và chỉ 10% dành cho logic và khối bộ nhớ.
Giống như bạn không thể thiết kế một chip tùy chỉnh hoặc bán tùy chỉnh mà
không có công cụ CAD, bạn cũng cần chúng cho FPD. Các công cụ tổng hợp
logic đã được phát triển nhắm mục tiêu các FPGA, cho phép tạo ra một hệ thống
sử dụng các FPGA từ Verilog cấu trúc và hành vi.

A.13 Kết luận

Phụ lục này giới thiệu những điều cơ bản của thiết kế logic. Nếu bạn đã tiêu hóa
vật liệu trong phụ lục này, bạn đã sẵn sàng để giải quyết vật liệu trong Chương 4
và 5, cả hai đều sử dụng các khái niệm được thảo luận rộng rãi trong phụ lục này.

Đọc thêm
Có một số văn bản tốt về thiết kế logic. Dưới đây là một số bạn có thể muốn xem
xét.

Ciletti, M. D. [2002]. Thiết kế kỹ thuật số tiên tiến với Verilog HDL, Vách đá
Englewood, NJ: Hội trường Prentice.
Một cuốn sách kỹ lưỡng về thiết kế logic sử dụng Verilog.
Katz, R. H. [2004]. Thiết kế logic hiện đại, Tái bản lần 2., Đọc, MA: Addison-Wesley.
Một văn bản chung về thiết kế logic.
Wakerly, J. F. [2000]. Thiết kế kỹ thuật số: Nguyên tắc và thực tiễn, Tái bản lần 3.,
Tiếng Anh
Vách đá, NJ: Hội trường Prentice.
Một văn bản chung về thiết kế logic.
A.14 Bài tập A-79

A.14 Bài tập

A.1 [10] <§A.2> Ngoài các luật cơ bản chúng tôi đã thảo luận trong phần này, ở
đó là hai định lý quan trọng, được gọi là định lý DeMorgan [:

A B A ⋅ B và A ⋅ B A B Chứng minh
các định lý DeMorgan, với một bảng chân lý của biểu mẫu

A B A B A+B A·B A·B A+B


0 0 1 1 1 1 1 1
0 1 1 0 0 0 1 1
1 0 0 1 0 0 1 1
1 1 0 0 0 0 0 0

A.2 [15] <§A.2> Chứng minh rằng hai phương trình cho E trong ví dụ bắt đầu
trang A-7 tương đương bằng cách sử dụng các định lý DeMorgan và các tiên đề
được hiển thị trên trang A-7.
A.3 [10] <§A.2> Cho thấy có 2n các mục trong một bảng sự thật cho một chức năng với
n đầu vào.
A.4 [10] <§A.2> Một chức năng logic được sử dụng cho nhiều mục đích khác
nhau (bao gồm cả trong các trình bổ sung và tính toán chẵn lẻ) là độc quyền
HOẶCĐầu ra của hàm OR độc quyền hai đầu vào chỉ đúng nếu chính xác một
trong các đầu vào là đúng. Hiển thị bảng chân lý cho hàm OR độc quyền hai đầu
vào và thực hiện chức năng này bằng cách sử dụng cổng AND, cổng OR và bộ
biến tần.
A.5 [15] <§A.2> Chứng minh rằng cổng NOR là phổ quát bằng cách chỉ ra cách
xây dựng các hàm AND, OR và KHÔNG sử dụng cổng NOR hai đầu vào.
A.6 [15] <§A.2> Chứng minh rằng cổng NAND là phổ quát bằng cách chỉ ra
cách xây dựng các hàm AND, OR và KHÔNG sử dụng cổng NAND hai đầu vào.
A.7 [10] <§ §A.2, A.3> Xây dựng bảng chân lý cho một chẵn lẻ bốn đầu vào
hàm (xem trang A-65 để biết mô tả về tính chẵn lẻ).
A.8 [10] <§ §A.2, A.3> Thực hiện chức năng chẵn lẻ bốn đầu vào với AND và
cổng OR sử dụng đầu vào và đầu ra sủi bọt.
A.9 [10] <§ §A.2, A.3> Thực hiện chức năng chẵn lẻ bốn đầu vào với PLA .
A-80 Phụ lục A Những điều cơ bản của thiết kế logic

A.10 [15] <§ §A.2, A.3> Chứng minh rằng một bộ ghép kênh hai đầu vào cũng
là phổ quát bởi hiển thị cách xây dựng cổng NAND (hoặc NOR) bằng bộ ghép
kênh.
A.11 [5] <§ §4.2, A.2, A.3> Giả sử rằng X bao gồm 3 bit, x2 x1 x0. Viết bốn
chức năng logic là đúng khi và chỉ khi
n X chỉ chứa một 0

n X chứa số chẵn là 0s
n X khi được hiểu là số nhị phân không dấu nhỏ hơn 4
n X khi được hiểu là số đã ký (hai bổ sung) là âm

A.12 [5] <§ §4.2, A.2, A.3> Thực hiện bốn chức năng được mô tả trong Bài tập
A.11 sử dụng PLA .
A.13 [5] <§ §4.2, A.2, A.3> Giả sử rằng X bao gồm 3 bit, x2 x1 x0 và Y bao
gồm 3 bit, y2 y1 y0. Viết các hàm logic là đúng khi và chỉ khi
n X <Y, trong đó X và Y được coi là số nhị phân không dấu

n X <Y, trong đó X và Y được coi là số đã ký (hai bổ sung) n X = Y

Sử dụng một cách tiếp cận phân cấp có thể được mở rộng đến số lượng bit lớn
hơn. Chỉ ra cách bạn có thể mở rộng nó để so sánh 6 bit.
A.14 [5] <§ §A.2, A.3> Thực hiện một mạng chuyển mạch có hai đầu vào dữ
liệu (A và B), hai đầu ra dữ liệu (C và D) và đầu vào điều khiển (S). Nếu S bằng 1,
mạng ở chế độ truyền qua và C nên bằng nhau A, và D nên bằng nhau B Nếu. S
bằng 0, mạng ở chế độ chéo và C nên bằng nhau B, và D nên bằng nhau A.
A.15 [15] <§ §A.2, A.3> Xuất phát đại diện sản phẩm tổng hợp cho E hiển thị
trên trang A-11 bắt đầu với đại diện tổng sản phẩm. Bạn sẽ cần sử dụng các định
lý DeMorgan.
A.16 [30] <§ §A.2, A.3> Đưa ra một thuật toán để xây dựng tổng sản phẩm biểu
diễn cho một phương trình logic tùy ý bao gồm AND, OR và KHÔNG. Thuật
toán nên được đệ quy và không nên xây dựng bảng chân lý trong quy trình.
A.17 [5] <§ §A.2, A.3> Hiển thị bảng sự thật cho một bộ ghép kênh (đầu vào A,
B, và S; đầu ra C ), sử dụng don lồng quan tâm để đơn giản hóa bảng nếu có thể.
A.14 Bài tập A-81

A.18 [5] <§A.3> Chức năng được thực hiện bởi Verilog sau đây là gì mô-đun:
mô-đun FUNC1 (I0, I1, S, out);
đầu vào I0, I1;
đầu vào S;
đầu ra;
ra = S? I1: I0; mô-đun
cuối

mô-đun FUNC2 (ra, ctl, clk, đặt lại);


đầu ra [7: 0];
đầu vào ctl, clk, đặt lại;
reg [7: 0] ra;
luôn luôn @ (gốc clk)
nếu (thiết lập lại) bắt đầu
ra <= 8 bóng đá;
kết thúc
khác nếu (ctl) bắt đầu
ra <= ra + 1;
kết thúc
khác bắt đầu
ra <= ra - 1;
cuối
cuối

A.19 [5] <§A.4> Mã Verilog trên trang A-53 dành cho flip-flop D. Hiển thị Mã
Verilog cho một chốt D.
A.20 [10] <§ §A.3, A.4> Viết ra một mô-đun Verilog thực hiện 2-to-
4 bộ giải mã (và / hoặc bộ mã hóa).
A.21 [10] <§ §A.3, A.4> Đưa ra sơ đồ logic sau cho một bộ tích lũy , viết ra việc
thực hiện mô-đun Verilog của nó. Giả sử một thanh ghi kích hoạt cạnh tích cực
và Rst không đồng bộ.
A-82 Phụ lục A Những điều cơ bản của thiết kế logic

Trong

Adder
16 16
Tải Ngoài
Clk

Rst
Đăng ký
Tải

A.22 [20] <§ §B3, A.4, A.5> Mục 3.3 trình bày hoạt động cơ bản và có thể thực
hiện hệ số nhân. Một đơn vị cơ bản của việc thực hiện như vậy là một đơn vị thay
đổi và thêm. Hiển thị một triển khai Verilog cho đơn vị này. Chỉ ra cách bạn có
thể sử dụng đơn vị này để xây dựng hệ số nhân 32 bit.
A.23 [20] <§ §B3, A.4, A.5> Lặp lại bài tập A.22, nhưng đối với bộ chia không
dấu chứ không phải là một số nhân.
A.24 [15] <§A.5> ALU được hỗ trợ đặt trên ít hơn (slt) chỉ bằng bit dấu của bộ
cộng. Hãy thử một tập hợp ít hơn hoạt động bằng cách sử dụng các giá trị - 7mười
và 6mườiĐể làm cho nó đơn giản hơn để làm theo ví dụ, hãy để giới hạn các biểu
diễn nhị phân thành 4 bit: 1001.hai và 0110hai.
1001hai - 0110hai = 1001hai + 1010hai = 0011hai
Kết quả này sẽ gợi ý rằng −7> 6, điều này rõ ràng là sai. Do đó, chúng ta phải
tính đến sự tràn ngập trong quyết định. Sửa đổi ALU 1 bit trong Hình A.5.10 trên
trang A-33 để xử lý slt chính xác. Thực hiện các thay đổi của bạn trên một bản
sao của hình này để tiết kiệm thời gian.
A.25 [20] <§A.6> Một kiểm tra đơn giản cho tràn trong quá trình bổ sung là để
xem nếu CarryIn đến bit quan trọng nhất không giống với CarryOut của bit quan
trọng nhất. Chứng minh rằng kiểm tra này giống như trong Hình 3.2.
A.26 [5] <§A.6> Viết lại các phương trình trên trang A-44 cho logic mang theo
cho một bộ cộng 16 bit sử dụng một ký hiệu mới. Đầu tiên, sử dụng tên cho tín
hiệu CarryIn của các bit riêng lẻ của trình bổ sung. Đó là, sử dụng c4, c8, c12,
Thay vì C1, C2, C3, .... Ngoài ra, hãy để PTôi,j; có nghĩa là một tín hiệu truyền
cho các bit Tôi đến jvà GTôi,j; có nghĩa là một tín hiệu tạo cho các bit Tôi đến
jVí dụ, phương trình.
C2 G1 (P1 ⋅ G0) (P1 ⋅ P0 ⋅ c0)
A.14 Bài tập A-83

có thể được viết lại như


c8 G7, 4 (P7, 4 ⋅ G3, 0 ) (P7, 4 ⋅ P3, 0 ⋅ c0)

Ký hiệu tổng quát hơn này rất hữu ích trong việc tạo ra các trình bổ sung rộng hơn.
A.27 [15] <§A.6> Viết các phương trình cho logic truyền hình cho bộ cộng 64
bit bằng cách sử dụng ký hiệu mới từ Bài tập A.26 và sử dụng bộ cộng 16 bit làm
khối xây dựng. Bao gồm một bản vẽ tương tự như Hình A.6.3 trong giải pháp
của bạn.
A.28 [10] <§A.6> Bây giờ tính toán hiệu suất tương đối của các bổ sung. Giả sử
rằng phần cứng tương ứng với bất kỳ phương trình nào chỉ chứa các thuật ngữ
OR hoặc AND, chẳng hạn như các phương trình cho pTôi và gTôi trên trang A-
40, mất một đơn vị thời gian T. Các phương trình bao gồm OR của một số thuật
ngữ AND, chẳng hạn như các phương trình cho c1, c2, c3, và c4 trên trang A-40,
do đó sẽ mất hai đơn vị thời gian, 2T. Lý do là T sẽ tạo ra các thuật ngữ AND và
sau đó là T bổ sung để tạo ra kết quả của OR. Tính toán số lượng và tỷ lệ hiệu
suất cho các bộ cộng 4 bit cho cả hai gợn mang và mang theo. Nếu các thuật ngữ
trong phương trình được xác định thêm bởi các phương trình khác, thì hãy thêm
độ trễ thích hợp cho các phương trình trung gian đó và tiếp tục đệ quy cho đến
khi các bit đầu vào thực tế của trình bổ sung được sử dụng trong một phương
trình. Bao gồm một bản vẽ của mỗi adder được dán nhãn với độ trễ được tính
toán và đường dẫn của độ trễ trong trường hợp xấu nhất được tô sáng.
A.29 [15] <§A.6> Bài tập này tương tự như Bài tập A.28, nhưng lần này tính toán tốc
độ tương đối của bộ cộng 16 bit chỉ sử dụng gợn sóng, gợn mang theo các nhóm 4 bit
sử dụng giao diện và sơ đồ mang theo trên trang A-39.
A.30 [15] <§A.6> Bài tập này tương tự như Bài tập A.28 và A.29, nhưng bài tập
này thời gian tính toán tốc độ tương đối của bộ cộng 64 bit chỉ sử dụng gợn sóng,
gợn mang theo các nhóm 4 bit sử dụng tra cứu, gợn mang theo các nhóm 16 bit sử
dụng tra cứu và sơ đồ mang theo từ Bài tập A .27.
A.31 [10] <§A.6> Thay vì nghĩ về một adder như một thiết bị có thêm hai các số
và sau đó liên kết các mang với nhau, chúng ta có thể nghĩ về bộ cộng như một
thiết bị phần cứng có thể thêm ba đầu vào với nhau (aTôi, bTôi, cTôi) và tạo ra
hai đầu ra (s , cTôi + 1). Khi thêm hai số với nhau, chúng ta có thể làm rất ít với
quan sát này. Khi chúng tôi thêm nhiều hơn hai toán hạng, có thể giảm chi phí
mang theo. Ý tưởng là tạo thành hai tổng độc lập, được gọi là S (bit tổng hợp) và
C ′ (bit mang). Khi kết thúc quá trình, chúng ta cần thêm C và S cùng nhau bằng
một bộ cộng bình thường. Kỹ thuật trì hoãn truyền này cho đến khi kết thúc một
tổng số được gọi mang theo tiết kiệm bổ sung Các khối vẽ ở phía dưới bên phải
của. Hình A.14.1 (xem bên dưới) hiển thị tổ chức, với hai cấp độ bổ sung lưu
mang được kết nối bởi một bộ cộng bình thường duy nhất.
Tính độ trễ để thêm bốn số 16 bit bằng cách sử dụng các bộ cộng hoàn toàn
mang theo so với lưu mang theo với một bộ cộng mang theo hình thức tạo thành
tổng cuối cùng. (Đơn vị thời gian T trong Bài tập A.28 là như nhau.)
A-84 Phụ lục A Những điều cơ bản của thiết kế logic

a3 b3 a2 b2 a1 b1 a0 b0
B EA F

Adder truyền thống


e3 e2 e1 e0

Adder truyền thống


f3 f2 f1 f0

Adder truyền thống

S
s5 s4 s3 s2 s1 s0

b3 e3 f3 b2 e2 f2 b1 A B E F
e1 f1 b0 e0 f0

Mang theo adder lưu

a3 a2 a1 a0
Mang theo adder lưu

C' S'

s'4 c'3 s'3 c'2 s'2 c'1 s'1 c'0 s'0 Adder truyền thống

s5 s4 s3 s2 s1 s0

HÌNH A.14.1 Ripple truyền thống mang và mang theo tiết kiệm thêm bốn số 4 bit. Các các
chi tiết được hiển thị ở bên trái, với các tín hiệu riêng lẻ ở chữ thường và các khối cấp cao tương ứng ở bên
phải, với tín hiệu tập thể ở chữ hoa. Lưu ý rằng tổng của bốn nsố -bit có thể mất n + 2 bit.

A.32 [20] <§A.6> Có lẽ trường hợp có khả năng nhất là thêm nhiều số cùng một
lúc trong máy tính sẽ là khi cố gắng nhân nhanh hơn bằng cách sử dụng nhiều bộ
cộng để thêm nhiều số trong một chu kỳ đồng hồ. So với thuật toán nhân trong
Chương 3, một sơ đồ lưu mang với nhiều người thêm có thể nhân nhanh hơn 10
lần. Bài tập này ước tính chi phí và tốc độ của một hệ số nhân tổ hợp để nhân hai
số 16 bit dương. Giả sử rằng bạn có 16 thuật ngữ trung gian M15, M14, ..., M0,
được gọi sản phẩm một phần, có chứa phép nhân ANDed với các bit số nhân m15,
m14, ..., m0. Ý tưởng là sử dụng các bộ cộng lưu mang để giảm n toán hạng
thành 2n/ 3 trong các nhóm song song gồm ba và thực hiện việc này nhiều lần
cho đến khi bạn nhận được hai số lớn để thêm vào cùng với một adder truyền
thống.
A.14 Bài tập A-85

Đầu tiên, hiển thị tổ chức khối của các bộ cộng lưu mang 16 bit để thêm 16 thuật
ngữ này, như được hiển thị ở bên phải Hình A.14.1 Sau đó tính toán độ trễ để
thêm 16 số này. So sánh thời gian này với sơ đồ nhân lặp trong. Chương 3 nhưng
chỉ giả sử 16 lần lặp bằng bộ cộng 16 bit có đầy đủ mang lookahead có tốc độ
được tính trong Bài tập A.29.
A.33 [10] <§A.6> Có những lúc chúng ta muốn thêm một bộ số cùng với nhau.
Giả sử bạn muốn thêm bốn số 4 bit (A, B, E, F) bằng các bộ cộng đầy đủ 1 bit.
Hãy để bỏ qua mang theo lookahead ngay bây giờ. Bạn có thể sẽ kết nối các bộ
cộng 1 bit trong tổ chức ở đầu Hình A.14.1Bên dưới tổ chức truyền thống là một
tổ chức mới lạ của những người nghiện đầy đủ. Hãy thử thêm bốn số bằng cả hai
tổ chức để thuyết phục bản thân rằng bạn nhận được câu trả lời giống nhau.
A.34 [5] <§A.6> Đầu tiên, hiển thị tổ chức khối của các bộ cộng lưu mang 16 bit để
thêm 16 thuật ngữ này, như được hiển thị trong Hình A.14.1 Giả sử rằng độ trễ thời
gian thông qua mỗi bộ cộng 1 bit là 2T. Tính thời gian thêm bốn số 4 bit vào tổ chức
ở trên cùng so với tổ chức ở cuối. Hình A.14.1.
A.35 [5] <§A.8> Khá thường xuyên, bạn sẽ mong đợi rằng đưa ra một sơ đồ thời
gian chứa một mô tả về các thay đổi diễn ra trên một dữ liệu đầu vào D và một đầu
vào đồng hồ C (như trong Hình A.8.3 và A.8.6 trên các trang A-52 và A-54, tương
ứng), sẽ có sự khác biệt giữa các dạng sóng đầu ra (Q) cho một chốt D và một flip-
flop. Trong một hoặc hai câu, mô tả các trường hợp (ví dụ:., bản chất của các đầu vào)
mà sẽ không có bất kỳ sự khác biệt nào giữa hai dạng sóng đầu ra.
A.36 [5] <§A.8> Hình A.8.8 trên trang A-55 minh họa việc thực hiện đăng ký tập tin
cho datapath RISC-V. Giả vờ rằng một tệp đăng ký mới sẽ được xây dựng, nhưng chỉ
có hai thanh ghi và chỉ có một cổng đọc và mỗi thanh ghi chỉ có 2 bit dữ liệu. Vẽ lại
Hình A.8.8 sao cho mỗi dây trong sơ đồ của bạn chỉ tương ứng với 1 bit dữ liệu
(không giống như sơ đồ trong Hình A.8.8, trong đó một số dây là 5 bit và một số dây
là 32 bit). Vẽ lại các thanh ghi bằng cách sử dụng dép xỏ ngón D. Bạn không cần chỉ
ra cách triển khai flip-flop D hoặc bộ ghép kênh.
A.37 [10] <§A.10> Một người bạn muốn bạn xây dựng một con mắt điện tử của
người dùng để sử dụng như một thiết bị bảo mật giả. Thiết bị bao gồm ba đèn
được xếp thành một hàng, được điều khiển bởi các đầu ra Trái, Trung và Phải, nếu
được khẳng định, chỉ ra rằng đèn sẽ sáng. Chỉ có một ánh sáng được bật tại một
thời điểm và ánh sáng di chuyển từ trái sang phải và sau đó từ phải sang trái, do đó
khiến những tên trộm sợ hãi tin rằng thiết bị đang theo dõi hoạt động của chúng.
Vẽ biểu diễn đồ họa cho máy trạng thái hữu hạn được sử dụng để chỉ định mắt
điện tử. Lưu ý rằng tốc độ của chuyển động mắt sẽ được kiểm soát bởi tốc độ đồng
hồ (không nên quá lớn) và về cơ bản không có đầu vào.
A.38 [10] <§A.10> Gán số trạng thái cho các trạng thái của máy trạng thái hữu
hạn bạn đã xây dựng cho Bài tập A.37 và viết một bộ phương trình logic cho
từng đầu ra, bao gồm các bit trạng thái tiếp theo.
A-86 Phụ lục A Những điều cơ bản của thiết kế logic

A.39 [15] <§ §A.2, A.8, A.10> Xây dựng bộ đếm 3 bit bằng ba flip-flops D và
lựa chọn cổng. Các đầu vào phải bao gồm tín hiệu đặt lại bộ đếm về 0, được gọi
thiết lập lạivà một tín hiệu để tăng bộ đếm, được gọi incCác đầu ra phải là giá trị
của bộ đếm. Khi bộ đếm có giá trị 7 và được tăng lên, nó sẽ bao quanh và trở
thành 0.
A.40 [20] <§A.10> A Mã màu xám là một chuỗi các số nhị phân với thuộc tính
rằng không có nhiều hơn 1 bit thay đổi trong việc chuyển từ một phần tử của
chuỗi này sang phần tử khác. Ví dụ: đây là mã Xám nhị phân 3 bit: 000, 001, 011,
010, 110, 111, 101 và 100. Sử dụng ba flip-flops D và PLA, xây dựng bộ đếm mã
Xám 3 bit có hai đầu vào : thiết lập lại, đặt bộ đếm thành 000, và inc, làm cho bộ
đếm đi đến giá trị tiếp theo trong chuỗi. Lưu ý rằng mã là tuần hoàn, do đó giá trị
sau 100 trong chuỗi là 000.
A.41 [25] <§A.10> Chúng tôi muốn thêm đèn vàng vào ví dụ đèn giao thông của chúng
tôi trang A-68. Chúng tôi sẽ làm điều này bằng cách thay đổi đồng hồ để chạy ở 0,25 Hz
(thời gian chu kỳ đồng hồ 4 giây), đó là thời lượng của đèn vàng. Để ngăn đèn xanh và đỏ
đạp xe quá nhanh, chúng tôi thêm bộ hẹn giờ 30 giây. Bộ hẹn giờ có một đầu vào duy nhất,
được gọi Hẹn giờ, khởi động lại bộ hẹn giờ và một đầu ra duy nhất, được gọi TimerSignal,
cái nào chỉ ra rằng thời hạn 30 giây đã hết hạn. Ngoài ra, chúng ta phải xác định lại tín
hiệu giao thông để bao gồm màu vàng. Chúng tôi thực hiện điều này bằng cách xác định
hai tín hiệu đầu ra cho mỗi ánh sáng: xanh lá cây và vàng. Nếu NSgreen đầu ra được
khẳng định, đèn xanh sẽ sáng; nếu NSyellow đầu ra được khẳng định, đèn vàng sẽ sáng.
Nếu cả hai tín hiệu đều tắt, đèn đỏ sẽ sáng. Làm không phải khẳng định cả tín hiệu xanh
và vàng cùng một lúc, kể từ khi các tài xế Mỹ chắc chắn sẽ bị nhầm lẫn, ngay cả khi các
tài xế châu Âu hiểu điều này có nghĩa là gì! Vẽ biểu diễn đồ họa cho máy trạng thái hữu
hạn cho bộ điều khiển được cải thiện này. Chọn tên cho các tiểu bang khác nhau từ tên của
các đầu ra.
A.42 [15] <§A.10> Viết các bảng trạng thái tiếp theo và chức năng đầu ra cho
bộ điều khiển đèn giao thông được mô tả trong Bài tập A.41.
A.43 [15] <§ §A.2, A.10 > Gán số nhà nước cho các tiểu bang trong đèn giao
thông ví dụ về Bài tập A.41 và sử dụng các bảng Bài tập A.42 để viết một bộ
phương trình logic cho từng đầu ra, bao gồm các đầu ra trạng thái tiếp theo.
A.44 [15] <§ §A.3, A.10> Thực hiện các phương trình logic của Bài tập A.43
như một PLA .
Câu trả lời để
kiểm tra chính §A.2, trang A-8: Không. Nếu A = 1 , C = 1 , B = 0, cái đầu tiên là đúng, nhưng cái
thứ hai là sai.
mình §A.3, trang A-20: C .
§A.4, trang A-22: Tất cả đều giống hệt nhau.
§A.4, trang A-26 : A = 0 , B = 1.
§A.5, trang A-37: 2.
§A.6, trang A-46: 1.
§A.8, trang A-57: c.
§A.10, trang A-71: b.
§A.11, trang A-76: b.
Chỉ số

Ghi chú: Thông tin trực tuyến được liệt kê theo số trang in và một khoảng thời gian tiếp theo là Số e e với số trang trực tuyến (54.e1). Tài liệu tham
khảo trang đi trước bởi một chữ cái duy nhất có dấu gạch nối tham khảo các phụ lục. Các tài liệu tham khảo trang tiếp theo là các f, các trò chơi, các
trò chơi và các trò chơi khác nhau, các bảng và các hộp, tương ứng.

0-9, và các ký hiệu Không gian địa chỉ (Tiếp tục) Kiểm soát ALU, 269 bóng271. Xem thêm
phẳng, 490 bóng491 Đơn vị logic số học (ALU)
ALU 1 bit, A-26, A-29. Xem thêm ID (ASID), 459b bit, 270 bóng271, 270f
Đơn vị logic số học (ALU) không đầy đủ, 495.e5 logic, C-6 C-7
bộ cộng, A-27f chia sẻ, 537 bóng538 ánh xạ tới cổng, C-4, C-7
CarryOut, A-28f vật lý đơn, 537 bóng538 bảng thật, C-5f
minh họa, A-30f ảo, 459 Khối điều khiển ALU, 274
đơn vị logic cho AND / OR, A-27f Thông số địa chỉ, D-54 được xác định, C-4 C-7
cho bit quan trọng nhất, A-33f thực Dịch địa chỉ tạo bit điều khiển ALU, C-6f
hiện AND, OR và bổ sung , đối với vỏ não ARM-A53, 481 ALUOp, 270
A-31, A-33f định nghĩa, 441 bóng442 bit, 270 bóng271
ALU 32 bit, A-29 cường A-31. nhanh, 451 bóng453 tín hiệu điều khiển, 275
Xem thêm Đơn vị logic số cho Intel lõi i7, 481 Dịch vụ web Amazon (AWS), 438b
học (ALU) TLB cho, 451 bóng453 AMD Opteron X4 (Barcelona), 567 ,
từ 31 bản ALU 1 bit, A-34f với Đường dây kiểm soát địa chỉ, C-26f 567f
32 ALU 1 bit, A-30f xác định Địa chỉ AMD SSE5
trong Verilog, A-36, A-37 minh cơ sở, 75b hướng dẫn đơn, 231b
họa, A-35f byte, 75b bóng76b AMD64, 174.e5, 234, D-32
vật liệu mang gợn, A-29 may xác định, 74 Luật Amdahl, 415, 523b Từ524b
theo RISC-V, A-31, A-35 bộ nhớ, 84b hệ quả, 51
Phần cứng 7090/7094, 242.e6 ảo, 441 bóng442, 461, 462b xác định, 51
Địa chỉ ngụy biện, 583 bóng585
A cơ sở, 125f và (và), 70f
trong các chi nhánh, 121 bóng124 VÀ cổng, A-12, A-13, A-13f, C-7
Gói A12, 13f, 20
chuyển vị, 125f VÀ vận hành, A-6, 96
Tập lệnh AArch64, D-24f Tài
ngay lập tức, 125f andi (và ngay lập tức), 70f
liệu tham khảo tuyệt đối, 134
PC tương đối, 122, 125f Tỷ lệ thất bại hàng năm (AFR), 431
trừu tượng
đăng ký, 125f so với. MTTF của đĩa, 431b Từ432b
giao diện phần cứng / phần
Chế độ RISC-V, 125 Chống độc, 346b Từ 347b
mềm, nguyên tắc 21, 21
chế độ x86, 162 Chống độc, 350
để đơn giản hóa thiết kế, 11
Chế độ địa chỉ Thuốc chống nấm, A-77, A-78
Kiến trúc tích lũy, 174.e1
cho máy tính để bàn và máy chủ RISC , Máy tính Apple, 54.e6
Từ viết tắt, 9
D-7, D-11, D-7f, D-8f Apple iPhone XS Max, 21
Ma trận hoạt động, 18
kiến trúc máy tính để bàn, D-7, D-11 thành phần, 6f
thêm (thêm), 70f
Intel 80 × 86, D-32, D-35 bảng logic, 7f
addi (thêm ngay lập tức), 70f, 78, 90 Bổ
Kiến trúc VAX, D-51 cường D-54 Giao diện nhị phân ứng dụng (ABI), 21
sung, 190 trừ193. Xem thêm Số học
Phần mở rộng Vector nâng cao (AVX) , Giao diện lập trình ứng dụng
nhị phân, 190b
160 (API)
191919191919191919
trong x86, 234 bóng238 được xác định, B-4
19 operands, 191 ý
AGP, B-9b đồ họa, B-14
nghĩa, tốc độ 214b,
Algol-60, 174.e6 ARC
193b
Bí danh, 457b bóng458b Kiến trúc RISC, 174.e4
Địa chỉ xen kẽ, 395
Hạn chế liên kết, 76b Sổ đăng ký kiến trúc, 358
Địa chỉ chọn logic, C-24, C-25f
Thuật toán N-body toàn cặp, B-65 Kiến trúc, D-68
Không gian địa chỉ, 441, 444b
I-1
mở rộng, 490b
Chỉ
I-2 số

Con trỏ đối số, D-56 Từ D-58 ARM Cortex-A53 (Tiếp tục) Nội suy thuộc tính, B-43, B-44
Số học lãng phí công việc do chi nhánh hiệu ứng auipc, 167
Ngoài ra, 190 bóng193 dự đoán sai, 356f Tăng tự động địa chỉ hoãn lại, D-52
cộng và trừ, 190 bóng193 ARMv7, D-4, D-5 Ô tô, ứng dụng máy tính trong, 4
Thời gian truy cập bộ nhớ trung bình
bộ phận, 199 bóng208 Kiến trúc RISC, 174.e4 (AMAT), 82
ngụy biện và cạm bẫy, 238 bóng241 Hướng dẫn ARMv7 (32 bit), 69 trận73 tính toán, 81b
điểm nổi, 208 bóng233 chế độ địa chỉ, 154 B
viễn cảnh lịch sử, 242 bóng246 so sánh và chi nhánh có điều kiện ,
nhân, 193 bóng199 154 bóng155 Phản ứng ngược, 572
song song và, 233 bóng234 tính năng độc đáo, 155 bóng157 Băng thông, 30
Truyền phát phần mở rộng SIMD và ARMv8, D-6 lưỡng tính, 558
phần mở rộng vector nâng cao trong
x86 , Hướng dẫn (64 bit), 157 trừ158 bên ngoài DRAM, 412
234 con238 Hướng dẫn ALU, D-23, D-24f bộ nhớ, 412b
trừ, 190 bóng193 hướng dẫn kiểm soát, D-19f mạng, 558
song song tiểu từ, 233 bóng234 hướng dẫn truyền dữ liệu, D-19f Đồng bộ hóa rào cản, B-18
song song và ma trận Kiến trúc RISC, 174.e4 được xác định, B-20
nhân, 236 con237 ARPAnet, 54,e9 để liên lạc chủ đề, B-34
Định dạng hướng dẫn số học, 256f Mảng, 429f Địa chỉ cơ sở, 75b, 125
Hướng dẫn số học. Xem thêm các yếu tố logic, A-18, A-20 Thanh ghi cơ sở, 75
Hướng dẫn nhiều chiều, 229b Khối cơ bản, 101b
RISC máy tính để bàn, D-14f con trỏ so với., 148 bóng151 Điểm chuẩn, 561 bóng572
RISC nhúng, D-18f thủ tục để thiết lập về 0, 148f xác định, 46
logic, 261 bóng262 Trí tuệ nhân tạo (AI), 520 Linpack, 242.e2, 242.e3
toán hạng, 73 bóng80 ASCII bộ xử lý đa, 561 bóng572
Cường độ số học, 564 bóng565 số nhị phân so với., 115b NAS song song, 563
Đơn vị logic số học (ALU). Xem thêm đại diện nhân vật, 114f song song, 562f
Kiểm soát ALU, Đơn vị điều khiển định nghĩa, 114 Bộ PARSEC, 563
1-bit, A-26 cường A-29 ký hiệu, 117 CPU ĐẶC BIỆT, 46 bóng48
32-bit, A-29 cường A-31 Hội đồng quản trị, 132 bóng134 Sức mạnh của SPEC, 48 bóng49
datapath nhánh, 264 bóng265 định nghĩa, 14 ĐẶC BIỆT, 563
trước khi chuyển tiếp, 318f chức năng, 132 bóng134 Luồng, 571b
phần cứng, 192 vi mã, C-30 Ký hiệu thiên vị, 87, 212
sử dụng hướng dẫn tham khảo bộ nhớ,
255 số chấp nhận, 133 Số nhị phân, 88
Hoạt động định dạng R, 263f tập tin đối tượng, 133 ASCII so với., 115b
cho các giá trị đăng ký, 262 Ngôn ngữ hội, 15f chuyển đổi thành số thập phân, 83b
đầu vào ngay lập tức, 321 định nghĩa, 14, 132 xác định, 80
Đơn vị số học-logic (ALU), D-7 điểm nổi, 224f Băng thông lưỡng cực, 558
ARM, D-17 minh họa, 15f Bản đồ bit
hướng dẫn số học / logic, 88f chương trình, 132 định nghĩa, 18
định dạng hướng dẫn, 153f RISC-V, 70f, 91b Từ92b mục tiêu, 18
hướng dẫn, D-22 cường D-23 dịch sang ngôn ngữ máy , lưu trữ, 18
đăng ký Đăng ký và truyền dữ liệu 91b Gian92b Tính chẵn lẻ xen kẽ bit (RAID 3), 479.e4
hướng dẫn, 74f Tín hiệu được xác nhận, A-4b, 260 Bit
ARM Cortex-A8 Liên kết ALUOp, 270 bóng271
hệ thống phân cấp bộ nhớ của, 480
bóng483 trong bộ nhớ cache, 418b Vang420b định nghĩa, 14
ARM Cortex-A53, 254, 283, 354 Từ355 mức độ, tăng, 418, 465 bẩn, 451b
dịch địa chỉ cho, 481f tăng, 422 bảo vệ, 231
bộ nhớ cache trong, 482f đặt, kích thước thẻ so với., 423b mẫu, 231b 2322232b
tỷ lệ bỏ lỡ bộ nhớ cache dữ liệu cho,
465f So sánh nguyên tử và hoán đổi, 130b tài liệu tham khảo, 449b
thành phần ước tính, 357f Trao đổi nguyên tử, 129 làm tròn, 231
hiệu suất của, 356 bóng357 Nguyên tử lấy và tăng, 130b ký tên, 81 bóng82
Phần cứng TLB cho, 481f Hoạt động bộ nhớ nguyên tử, B-21 tiểu bang, C-8, C-10
Chỉ số I-3

Bit (Tiếp tục) Dự báo chi nhánh Bộ nhớ cache kết hợp (Tiếp tục)
dính, 231 độ chính xác, 331 đề án thi hành án, 477
hợp lệ, 399 tương quan, 331 kỹ thuật thực hiện, 480.e10
Khối tải và cửa hàng, 156 bóng157 thông tin từ, 331 di cư, 477
Chặn song song (RAID 4) , giải đấu, 331 vấn đề, 475, 476f, 479b
479.e4 Bảng chi nhánh, 103 ví dụ giao thức, 480.e11
Chuyển nhượng chặn, A-24 Chi nhánh lấy giao thức, 477
Hệ số chặn, 428 giảm chi phí, 326 bóng328 nhân rộng, 477
Khối định nghĩa, 264 giao thức rình mò, 477 bóng479
tổ hợp, A-4 bóng A-5 Chi nhánh mục tiêu rình mò, 480.e16
xác định, 151.e5 địa chỉ, 264 sơ đồ trạng thái, 480.e15f
tìm kiếm, 465 bóng466 bộ đệm, 331b Giao thức kết hợp bộ đệm, 480.e11
sơ đồ chuyển tiếp trạng thái hữu hạn,
vị trí linh hoạt, 416 bóng420 Hướng dẫn chi nhánh trên không, 281 480.e14f
ít được sử dụng gần đây nhất (LRU), Chi nhánh. Xem thêm Chi nhánh có điều
422 kiện hoạt động, 480.e13f
định vị trong bộ đệm, 420 bóng421 giải quyết trong, 121 bóng124 cơ chế, 480.e13f
tỷ lệ bỏ lỡ và, 406f tạo trình biên dịch, 99b sơ đồ trạng thái, 480.e15f
đa từ, địa chỉ ánh xạ tới , quyết định, di chuyển lên, 326 tiểu bang, 480.e12
405b trì hoãn, 294b, 326 bóng328 bộ nhớ cache ghi lại, 480.e14f
vị trí vị trí, 464 bóng465 kết thúc, 101b Bộ điều khiển bộ đệm, 480
chiến lược vị trí, 417 bóng418 thực hiện trong giai đoạn ID, 327 thực hiện bộ nhớ cache mạch lạc
lựa chọn thay thế, 421 bóng423 đường ống, 327b Từ 328b kỹ thuật, 480.e10
chiến lược thay thế, 467 địa chỉ mục tiêu, 326 thực hiện, 480
khai thác không gian địa phương, 405 Bong bóng sắp xếp, 147b kết hợp bộ đệm snoopy, 480.e16
tiểu bang, A-4 bóng A-5 Bong bóng, 323 SystemVerilog, 480.e1
dữ liệu hợp lệ, 399b Bộ nhân mạch lạc dựa trên xe buýt , Bộ nhớ cache, 481 bóng482
Liên kết, 28 587.e6 Bộ nhớ cache bị bỏ lỡ
Đại số Boolean, A-6 cường A-7 Xe buýt, A-18, A-19 thay thế khối trên, 466 bóng467
Giới hạn kiểm tra lối tắt, 102 Byte / từ / dịch chuyển dài hoãn lại công suất, 468
Định dạng nổi não (bf16), 524 địa chỉ, D-52 bắt buộc, 468
Hoàn thành chi nhánh trong xe đạp nhiều
bánh Byte xung đột, 468
thực hiện, 282.e8 địa chỉ, 75b bóng76b xác định, 407
bộ nhớ cache được ánh xạ trực tiếp,
Chi nhánh datapath đặt hàng, 75b bóng76b 417 bóng418
ALU, 264 bóng265 C bộ đệm kết hợp đầy đủ, 418b Từ 420b
hoạt động, 264 bóng265 xử lý, 407 bóng408
Chi nhánh nếu bằng (beq), A-32, 98, 269 , Ngôn ngữ C chu kỳ đồng hồ cài đặt bộ nhớ, 413
chuyển nhượng, biên dịch thành RISC-
285b bóng286b V, 71b giảm với vị trí khối linh hoạt ,
Chi nhánh nếu lớn hơn hoặc bằng, không
dấu biên dịch, 151, 151 Từ152 416 bóng420
(bgeu), 101 bóng102 biên dịch bài tập với các thanh ghi , bộ đệm liên kết tập hợp, 418b Từ 420b
Chi nhánh nếu ít hơn (blt) hướng dẫn , 73b bóng74b các bước, 407
biên dịch trong khi các vòng lặp trong,
101 con102 100b 101101b trong bộ nhớ cache ghi qua, 408
Chi nhánh nếu ít hơn, không dấu (bltu) , ma trận nhân lên, 73 trận80 Hiệu suất bộ đệm, 412 bóng430
101 con102 thuật toán sắp xếp, 148f tính toán, 414b bóng415b
Hướng dẫn chi nhánh hệ thống phân cấp dịch thuật, 131f đánh thời gian và, 415
tác động đường ống, 328f dịch sang lắp ráp RISC-V tác động đến hiệu suất của bộ xử lý ,
Chi nhánh không lấy ngôn ngữ, 71b 414b bóng415b
giả định, 326 biến, 110b Hướng dẫn nhận biết bộ nhớ cache, 494
Bộ nhớ cache, 398 bóng412. Xem thêm
định nghĩa, 264 C.mmp, 587.e3 Khối
Dự đoán chi nhánh Ngôn ngữ C ++, 151.e25b, 174.e7 truy cập, 401 bóng407
bộ đệm, 330 Chặn bộ nhớ cache và nhân ma trận , trong vỏ não ARM-A53, 482f
như giải pháp kiểm soát nguy cơ, 294 488 bóng489 liên kết trong, 418b 420420b
được xác định, 293 bóng294 Bộ nhớ cache, 475 bóng479 bit trong, 404bTHER 405b
động, 294, 328 Từ332 sự gắn kết, 475 bit cần thiết cho, 404bTHER405b
tĩnh, 342 tính nhất quán, 475 nội dung minh họa, 402f
Chỉ
I-4 số

Bộ nhớ cache (Tiếp tục) Mang theo người thêm tiết kiệm, 198 Các cụm, 587.e7
định nghĩa, 13, 21 CDC 6600, 190, 368.e2 được xác định, 520, 520, 587.e7
lập bản đồ trực tiếp, 398, 400f,
404bTHER405b , Điện thoại di động, 6 trận7 cách ly, 554
416 Bộ xử lý trung tâm (CPU). Xem thêm tổ chức, 519
trống rỗng, 401 Bộ xử lý điện toán khoa học trên, 587.e7
FSM để kiểm soát, 470 bóng475 phương trình hiệu suất cổ điển , Cm *, 587.e3
liên kết đầy đủ, 416 36 con40 CMOS (oxit kim loại bổ sung
GPU, B-38 xác định, 20 chất bán dẫn), 41
không nhất quán, 408 thời gian thực hiện, 32 trận34 Đa luồng hạt thô, 534
chỉ số, 401 hiệu suất, 33 trận35 Cobol, 174.e6
trong Intel Core i7, 482f hệ thống, thời gian, 32 Tạo mã, 151.e12
Ví dụ FastMATH nội tại , thời gian, 412 Mã chuyển động, 151.e6
409 bóng411 đo thời gian, 33 con34 Bỏ lỡ khởi động lạnh, 468
định vị các khối trong, 420 bóng421 người dùng, thời gian, 32 Va chạm bỏ lỡ, 468
địa điểm, 400f Chương trình shader pixel Cg, B-15 Cột thứ tự chính, 425 bóng427
đa cấp, 412, 423b Từ425b Nhân vật Các khối kết hợp, A-4, A-5
không chặn, 472b Vang473b, 481
Từ482 Đại diện ASCII, 114f, 115 Các đơn vị kiểm soát kết hợp, C-4, C-7
địa chỉ vật lý, 457b bóng458b trong Java, 117 bóng119 Các yếu tố kết hợp, 258
được lập chỉ mục vật lý, 457b
bóng458b Chip, 20, 25 Logic kết hợp, A-3, A-4 ,
được gắn thẻ vật lý, 457b bóng458b quy trình sản xuất, 26 A-9 bóng A-20, 259
chính, 423, 430 Các lớp học mảng, A-18, A-20
thứ cấp, 423, 430 xác định, 151.e14 bộ giải mã, A-9, A-10
tập hợp, 416 bóng417 gói, 151.e20 được xác định, A-4, A-5
mô phỏng, 489b Đồng hồ chu kỳ don lồng quan tâm, A-17 cường A-18
kích thước, 404, 404b 405405b phá vỡ thực hiện hướng dẫn vào , bộ ghép kênh, A-10
chia, 411b 282.e6 ROM, A-14, A-16
tóm tắt, 411 bóng412 định nghĩa, 33 hai cấp độ, A-11, A-14
trường thẻ, 401 bộ nhớ, 413 Verilog, A-23
thẻ, 480.e1f, 480.e10 số lượng thanh ghi và, 73 Phát triển máy tính thương mại ,
bộ nhớ ảo và tích hợp TLB , trường hợp xấu nhất trì hoãn và, 282 54.e3
Chu kỳ đồng hồ trên mỗi hướng dẫn
456 bóng458 (CPI) , Cam kết đơn vị
hầu như được giải quyết, 457b
bóng458b 35 con36, 272 bộ đệm, 347 bóng348
hầu như được lập chỉ mục,
457bTHER458b một cấp độ bộ nhớ đệm, 35 được xác định, 347 bóng348
hầu như được gắn thẻ, 457b bóng458b hai cấp độ bộ nhớ đệm, 423b Từ 425b trong kiểm soát cập nhật, 353b
viết lại, 408, 467 Tỷ lệ đồng hồ Trường hợp phổ biến nhanh, 11
viết qua, 408, 409b, 467 định nghĩa, 33 Loại bỏ biểu thức con phổ biến ,
tần số chuyển đổi thành chức năng của,
viết, 408 bóng409 41 151.e5
Bộ nhớ đệm, 545 sức mạnh và, 40 Truyền thông, 23 trận25
Callee, 105, 107 Phương pháp đồng hồ, A-47, 259 Từ261 trên không, giảm, 44 bóng45
Người gọi, 105 kích hoạt cạnh, A-47, A-72, A-73 , sợi, B-34
Khả năng, 495.e12 259 Mã nhỏ gọn, 174.e3
Công suất bỏ lỡ, 468 nhạy cảm với cấp độ, A-73, A-75 So sánh và chi nhánh số 0, 326 bóng327
Mang theo lookahead, A-37, A-47 để dự đoán, 259 So sánh
Sử dụng ALU 4 bit, A-43f Đồng hồ, A-47, A-49 toán hạng không đổi trong, 78 bóng79
adder, A-38 cạnh, A-47, A-49b đã ký so với. không dấu, 101 bóng102
nhanh chóng, với phần cứng vô hạn của
người Viking, A-38 trong thiết kế kích hoạt cạnh, A-72f Trình biên dịch, 132
nhanh, với mức độ trừu tượng đầu tiên , xiên, A-73 tạo chi nhánh, 100b
A-38 bóng A-40 đặc điểm kỹ thuật, A-56f lịch sử ngắn gọn, 174.e7
nhanh, với mức độ trừu tượng thứ hai , hệ thống đồng bộ, A-47, A-48 bảo thủ, 151.e6
A-40 bóng A-45 Điện toán đám mây, 556 định nghĩa, 14
tương tự hệ thống ống nước, A-
41fTHER A-42f định nghĩa, 7 mặt trước, 151.e2
gợn mang tốc độ so với., A-45b Mạng cụm, 561.e1 Từ561.e9, 561 , chức năng, 14, 132
tóm tắt, A-45 bóng A-47 561.e3, 561.e6 tối ưu hóa cấp cao, 151.e3
Chỉ số I-5

Trình biên dịch (Tiếp tục) Chi nhánh có điều kiện (Tiếp tục) Kiểm soát các mối nguy hiểm (Tiếp tục)
Khai thác ILP, 368.e4 Just RISC máy tính để bàn, RISC bộ xử lý đa vấn đề tĩnh và, 342
In Time (JIT), tối ưu hóa nhúng D-15f, triển khai D-19f, Từ347
140, đầu cơ 148, 174.e8, 103b Đường điều khiển
cấu trúc 341 341342, trong các vòng lặp, địa chỉ khẳng định, 276
151.e1f tương đối PC 124b, 122 trong datapath, 275f
Biên soạn RISC, D-11THER D-17 thực hiện / tính toán địa chỉ, 311
Báo cáo chuyển nhượng C, 71b SPARC, D-11 ba giai đoạn cuối, 313f
Ngôn ngữ C, 100b Từ 101b, 151 Từ152, hướng dẫn giải mã / đăng ký tập tin
151 Hướng dẫn di chuyển có điều đọc ,
chương trình dấu phẩy động, 225b kiện , 311
2222222 331b bóng332b tìm nạp hướng dẫn, 311
if-then-other, 99b Bỏ lỡ xung đột, 468 truy cập bộ nhớ, 311
trong Java, 151.e18 Bộ nhớ không đổi, B-40 thiết lập của, 275 bóng276
thủ tục, 106b Từ 109b Các toán hạng không đổi, 78 bóng79 giá trị, 310
thủ tục đệ quy, 108b Từ 109b xảy ra thường xuyên, 78 viết lại, 311
trong khi các vòng lặp, 100b101b Bộ nhớ địa chỉ nội dung (CAM), 421b Tín hiệu điều khiển
Máy tính tập lệnh phức tạp (CISC), Công tắc bối cảnh, 459b hiệu lực của, 276f
D-50 Điều khiển ALUOp, 275
Ma trận hàng thưa nén (CSR), B-55, ALU, 269 bóng271 xác định, 260
B-56f thử thách, 333 đa bit, 276
Bỏ lỡ bắt buộc, 468 Kiến hoàn thiện, 281 datapaths đường ống với, 310
trúc sư máy tính, 10 chuyển tiếp, 319 bảng sự thật311, C-14f
trừu tượng để đơn giản hóa thiết kế, FSM, C-8 C-20 Đơn vị điều khiển, 257 bóng258.
11 thực hiện, tối ưu hóa, C-27 Xem thêm Đơn vị logic số
trường hợp phổ biến nhanh, 11 ánh xạ tới phần cứng, C-4, C-20 , học (ALU)
độ tin cậy thông qua dự phòng, 12 C-22 C-32 chọn địa chỉ logic, C-24, C-25f tổ
thứ bậc của ký ức, 12 bộ nhớ, C-26f hợp, thực hiện ,
song song, 11 tổ chức, để giảm logic, C-31 C-32 đã C-4 C-7
đường ống, 11 được điều khiển, 310 trừ311 với bộ đếm rõ ràng, minh
dự đoán, 11 Hướng dẫn truy cập kiểm soát và đăng họa C-23f, 277f
Kiến trúc máy tính, Máy ký trạng thái (CSR), 486 phương trình logic, chính
tính D-68 Định nghĩa điều khiển trong triển C-11, C-12, thiết kế, 271
lớp ứng dụng, truyền thống, 5 ứng khai nhiều xe đạp, 282.e9 Biểu trừ276 dưới dạng mã vi
dụng6, 4 đồ dòng điều khiển, 393 Tắt395 mô, C-28f
số học cho, 190 đặc điểm, phát ví dụ minh họa, chức năng đầu ra trạng thái tiếp theo, đầu ra C-10,
triển thương mại 54.e12f, tổ điều khiển 394f, 396f C-12b, C-13b, 270 trừ271, C-10
chức thành phần 54.e3, thành ALU, ánh xạ tới cổng, xác định RISC-V, C-10f
phần 17f, thước đo thiết kế 18f, C-4 C C-7, 275 trừ276 Mảng hợp tác (CTA), Máy photocopy
54 PLA, triển khai, C-7, C-20 B-30
máy tính để bàn, 5 ROM, mã hóa, C-19 xác định, 229b
nhúng, 5 trận6 để thực hiện một chu kỳ, 282 Tập lệnh Core RISC-V đặt chế độ
đầu tiên, 54.e1, 54.e2 Từ283 xem trừu tượng, triển khai 256f,
trong cuộc cách mạng thông tin, Các mối nguy kiểm soát, giảm độ trễ minh họa triển khai 254 254255,
4 đại diện hướng dẫn, đo lường nhánh 291, 294, giảm độ trễ nhánh tổng quan 257f, 255 Lỗi258
hiệu suất 87, 95, 54.e1 thời kỳ 325, 33333, không giả định chi nhánh, tập hợp con, 254
hậu PC, 6 máy chủ7, 5 dự đoán chi nhánh 326 là giải pháp, Trình sắp xếp lõi, 574
tiếp cận quyết định chậm 294, dự đoán Lõi
Mã điều kiện, D-56 nhánh động 294b, triển khai logic 328. xác định, 43
Mã điều kiện / cờ, 102 như giải pháp, tóm tắt đường ống 293f số trên mỗi chip, 43
Chi nhánh có điều kiện Công cụ dự đoán tương
thay đổi bộ đếm chương trình với, quan, 331 Cosmic Cube,
331b biên dịch if-then-other thành, 587.e6 Count đăng ký
99b được xác định, 98 của Power3, D-24
I-6 Chỉ
số
chia sẻ, 266

CPI trong CPU đa xe, CPU Datapaths


282.e12, 9 chi nhánh, 264 bóng265
Máy tính Cray, 242.e4, 242.e5 tòa nhà, 261 bóng269
Từ quan trọng đầu tiên, 406b Từ407b bảng sự thật tín hiệu điều khiển,
Mạng lưới thanh ngang, 559 bộ điều khiển C-14f, được xác
CTSS (Hệ thống chia sẻ thời định 277f, 20 Tắt21
gian tương thích), 495.e13 thiết kế, 261
Môi trường lập trình CUDA, đồng bộ xử lý ngoại lệ, 337f
hóa hàng rào 543, B-5, phát triển B-18, để tìm hướng dẫn, 263f
B-34, B-17 B-18 để giải quyết nguy hiểm thông qua
hệ thống phân cấp của các chuyển tiếp, 321f
nhóm luồng, hạt nhân B-18, đối với hướng dẫn bộ nhớ,
trừu tượng khóa B-19, B-24, B- 266bTHER267b đang hoạt động cho
18 nhánh-nếu bằng nhau
mô hình, B-19 B-22 hướng dẫn, 280
mẫu quét song song, bộ nhớ chia sẻ đang hoạt động cho lệnh tải, 279f
B-61f mỗi khối, triển khai giảm B-58, đang hoạt động cho lệnh loại R ,
chương trình B-63f, B-6, B-24 278f
lập trình song song có thể mở rộng hoạt động của, 276 bóng281
với, B-17, B-22 đường ống, 296 bóng313
chia sẻ ký ức, chủ đề đối với hướng dẫn loại R,
B-18, B-36 276 cho kiến trúc RISC-V,
Kiểm tra dự phòng theo chu 267 đơn, tạo, 265 chu269
kỳ, Xi lanh 436b, 396 một chu kỳ, 295
hai vấn đề tĩnh, tín hiệu khử
D khí 344f, A-4, 260
Dép xỏ ngón, A-50, A-52 DEC PDP-8, 174.e2f Bộ
Chốt D, A-50, A-51, A-51f xử lý DEC Alpha, D-4 Số
Dữ liệu bit, 434 thập phân
Phân tích luồng dữ liệu, 151.e8 chuyển đổi số nhị phân thành, xác
Các mối nguy dữ liệu, 288 bóng291, 313 định 83b, 80
bóng325. Xem thêm Nguy hiểm. Hướng dẫn ra quyết định, Bộ giải mã
chuyển tiếp, sử dụng tải 9810104, A-9, A-10
288, 313 313325, 289, hai cấp độ, A-64
326 quầy hàng và, 321 Giải mã, 282.e13
321325 Giải mã ngôn ngữ máy, 126 bóng127
Phân hủy vấn đề song song dữ liệu, Kiến trúc DECVAX, D-30f
B-17, B-18f Mạng thần kinh sâu (DNN), 520
Cuộc đua dữ liệu, 128 đào tạo so với. suy luận, 572
Bộ chọn dữ liệu, 255 bóng256 bóng573 Khiếm khuyết, 27
Định dạng hướng dẫn truyền dữ liệu, Chi nhánh bị trì hoãn, 294b. Xem
hướng dẫn truyền dữ liệu 256f. Xem thêm Chi nhánh
thêm như giải pháp nguy hiểm kiểm
Hướng dẫn soát, giảm 294, 326
xác định, 74 Quyết định chậm trễ, 294b
tải, 75 Số không chuẩn hóa, 233
bù, 75b Độ tin cậy thông qua dự phòng, 12
cửa hàng, 76, 77b Hệ thống phân cấp bộ nhớ đáng tin cậy, 431
bóng436
Chế độ địa chỉ dữ liệu, 76f
Song song mức dữ liệu, 528 thất bại, xác định, 431
Trung tâm dữ liệu, 7 Phụ thuộc432
Các yếu tố Datapath
định nghĩa, 261
chèn bong bóng và, phát
hiện 323, tên 315bTHER
316b, 346bTHER347b
Phụ thuộc (Tiếp tục)
giữa các thanh ghi đường ống, 256
bóng257
giữa các thanh ghi đường ống và
ALU
đầu vào, 317
trình tự, 313
Thiết kế
thỏa hiệp và, 321
datapath, 261
kỹ thuật số, 365
logic, 258 bóng261
đơn vị điều khiển chính, hệ thống
phân cấp bộ nhớ 2712276, các thử
thách, bộ hướng dẫn đường ống
470f, 287
Máy tính để bàn và máy chủ RISC,
D-4, D-7, D-5f
RISC máy tính để bàn và máy chủ.
Xem thêm Kiến trúc máy tính
tập lệnh (RISC) giảm
chế độ địa chỉ, D-7, D-11, D-7f, D-8f
tóm tắt kiến trúc, hướng dẫn số học
/ logic D-5f, hướng dẫn điều khiển
D-14f, D-15f
hướng dẫn truyền dữ liệu, hướng dẫn
dấu phẩy động D-13f, định dạng lệnh
D-16f, D-7, D-11, D-9f ,
D-12f
tiện ích mở rộng đa phương tiện,
máy tính để bàn D-26, D-27, được
xác định, 5 RISC máy tính để bàn
phương pháp tiếp cận các nhánh
có điều kiện, D-15f
hướng dẫn số học / logic, D-
14f
hướng dẫn điều khiển, hướng dẫn
truyền dữ liệu D-15f, hướng dẫn
dấu phẩy động D-13f, D-16f
Trình điều khiển thiết bị, 561.e4b
DGEMM (Nhân ma trận chung
chính xác kép), 103, 69, 427,
561 Phản562
bộ nhớ cache bị chặn phiên bản,
phiên bản C được tối ưu hóa 428,
363f, 487f
Đóng băng, 27
Chết, 27
Đường ống thiết kế kỹ thuật số,
365 Xử lý tín hiệu số (DSP) ,
D-28 cường D-29
Phần mở rộng xử lý tín hiệu số của
các RISC nhúng, D-28, D-29 DIMM
(mô-đun bộ nhớ nội tuyến kép) ,
495.e4
Chỉ số I-7

Dữ liệu trực tiếp IO (DDIO), 561.e6 Độ chính xác gấp đôi. Xem thêm Xác E
Truy cập bộ nhớ trực tiếp (DMA), định độ chính xác duy nhất, 210
561.e2f, 561.e3 FMA, B-45, B-46 Khởi động lại sớm, phương pháp
Bộ nhớ cache được ánh xạ GPU, B-45, B-74b đồng hồ kích hoạt 406bTHER 407b
trực tiếp. Xem thêm Bộ đại diện, 229 từ kép, Ma trận Edge ,
nhớ cache GEneral chính xác kép D-35 A-47, A-72, lợi thế
phần địa chỉ, 421f Nhân (DGEMM), 69 259, đồng hồ A-48,
lựa chọn, 421 Doubleword, 73, 163 nhược điểm A-72,
định nghĩa, 398, 416 Mô-đun bộ nhớ nội tuyến kép (DIMM), minh họa A-73, A-74,
minh họa, 400f 495.e4 A-49f
vị trí khối bộ nhớ, bỏ lỡ Dự đoán nhánh động, 328 Từ332. Xem cạnh tăng / giảm, A-47 EDSAC
417f, bộ so sánh đơn 418b, cũng Kiểm soát các mối nguy hiểm (Lưu trữ độ trễ điện tử
420b, 421 bộ đệm dự đoán nhánh, 330 Máy tính tự động), 54.e2, 495.
tổng số bit, 404bTHER405b vòng và, 330b 330331b e1, 495.e2f
Direct3D, B-13 Dự đoán phần cứng động, Eispack, 242.e2
Bit bẩn, 451b 330b Từ 331b Bộ nhớ chỉ đọc có thể lập trình có thể xóa
Trang bẩn, 451b Bộ xử lý đa vấn đề động, 340, 347 Từ352. bằng điện (EEPROM), 395
Bộ nhớ đĩa, 395 bóng398 Xem thêm Nhiều vấn đề Các yếu tố
Địa chỉ dịch chuyển, 461 lập kế hoạch đường ống, tổ hợp, 258
Phân phối ngang khối 347 siêu352 superscalar, datapath, 261, 266
(RAID 5), 479.e5 347 bộ nhớ, A-49 bóng A-57
Thuật toán phân chia, Lập kế hoạch đường ống động, đơn vị máy tính nhúng, 260, A-47, A-
Cổ tức 201b, Bộ phận cam kết 347 347352, 347 348 49b, 258, 262f, 5
200, 199 Phản208 khái niệm, đầu cơ dựa trên phần yêu cầu ứng dụng, 6
thuật toán, 202f cứng 34734348, 349 đơn vị thiết kế, 5
cổ tức, 200 chính, 348f tăng trưởng, 54.e11
ước, 200 đặt hàng lại bộ đệm, trạm đặt Điểm chuẩn vi xử lý nhúng
Ly hôn, 200 phòng 34734348, 347 Hiệp hội (EEMBC), 54.e11
divu (Divide Unsign). Xem Bộ nhớ truy cập ngẫu nhiên động RISC nhúng. Xem thêm Giảm
thêm Số học (DRAM), A-62, A-64, 392 máy tính tập lệnh (RISC)
nhanh hơn, 205 trừ395 kiến trúc
điểm nổi, 223 bóng229 băng thông bên ngoài, chi chế độ địa chỉ, D-8f
phần cứng, 200 con203 phí 412, 23 tóm tắt kiến trúc, D-6f
phần cứng, phiên bản cải tiến, 204f được xác định, 19, A-62 hướng dẫn số học / logic, D-14f
toán hạng, 200 DIMM, 495.e4 nhánh có điều kiện, D-19f
thương số, 200 Tỷ lệ ngày kép (DDR), bảng 393 hướng dẫn điều khiển, D-15f
còn lại, 200 393395, GPU 495.e4f, B-37 hướng dẫn truyền dữ liệu, phần mở rộng
trong RISC-V, 206 tăng trưởng công suất, 26f xử lý tín hiệu số D-13f của ,
đã ký, 203 bóng205 lịch sử, 480.e1 D-28 cường D-29
SRT, 205 tổ chức nội bộ của, bóng Mã hóa
Kiến trúc đặc trưng miền bán dẫn vượt qua 394f, giá Hướng dẫn 80x86, D-41 Từ D-42
Số học, 575 bóng576 A-62bTHER A-64b so với. được xác định, C-31
Mạng siêu máy tính kiến trúc đặc chi phí, 57 Hướng dẫn RISC-V, 91f, 126f
trưng tên miền, 573 SIMM, 495.e4, 495.e5f Chức năng điều khiển ROM, C-18
Kiến trúc đặc trưng miền Siêu máy bóng bán dẫn đơn, A-63f Chức năng logic ROM, A-15
tính Node, 573 bóng574 kích thước, 412 ENIAC (Nhà tích hợp số điện tử
Kiến trúc dành riêng cho tên miền tốc độ, 24 và Máy tính), 54.e2, 54.e3,
(DSA), 520 trừ522 đồng bộ (SDRAM), A-59, A-64, 495.e1
Don Tiết quan tâm, ví dụ 393 trừ395 EPIC, 368.e4
A-17, A-18, A-17b, bộ giải mã hai cấp, A-64 Thư viện Sửa lỗi, A-64, A-66
A-18b, 271 được liên kết động (DLL) , Mã phát hiện và sửa lỗi (RAID 2),
Tốc độ dữ liệu kép (DDR), 393 cường395 137 con138 479.e4
Tốc độ dữ liệu kép (DDR) SDRAM, A-64 , định nghĩa, 137 Mã phát hiện lỗi, A-65, 432
393 bóng395 phiên bản liên kết thủ tục lười biếng, cường433 Ethernet, 24
137
I-8 Chỉ
số
xác định, 50 bóng51
GPU, B-72, B-75

Sân khấu EX Ngụy biện (Tiếp tục)


hướng dẫn tải, 469f sử dụng thấp sử dụng ít năng lượng,
phát hiện ngoại lệ tràn, hướng dẫn lưu hiệu suất cực đại 51b, đường ống
trữ 336, 338f, 304f 583b, 365 trừ366
Exabyte, 6f hướng dẫn mạnh mẽ có nghĩa là
Cho phép ngoại lệ, hiệu suất cao hơn, 170
Ngoại lệ 460b, hiệp hội ca phải, 97b
333 bóng340, 339b Chia sẻ sai, 125b
datapath với các điều khiển để xử Nhanh chóng mang theo
lý, 337f với phần cứng vô hạn của
định nghĩa, 210, 333 người Viking, A-38 với mức
phát hiện, 334 độ trừu tượng đầu tiên ,
loại sự kiện và, 333 A-38 bóng A-40
không chính xác, 339b với mức độ trừu tượng thứ hai,
ngắt lời so với., 333 A-40, A-45
ví dụ máy tính đường ống , Biến đổi Fourier nhanh (FFT),
336b bóng337b A-47, A-48
trong triển khai đường ống, 335 Tránh lỗi, 432
bóng340 Dự báo lỗi, 432
chính xác, 339b Lỗi dung sai, 432
lý do cho, 335 Kiến trúc Fermi, 543
kết quả do tràn trong hướng Các thiết bị lập trình trường (FPD),
dẫn thêm, 338f A-77, A-78
trong kiến trúc RISC-V, 335 Mảng cổng lập trình trường (FPGA), A-
giai đoạn tiết kiệm / khôi phục 77
trên, 461 Cánh đồng
Tập tin thực thi xác định, 89
định nghĩa, định dạng, C-31
134 tên, 89
Thực hiện hoặc giai đoạn tính toán địa RISC-V, 89 bóng95
chỉ, 302 Thực hiện / tính toán địa chỉ Tập tin, đăng ký, A-49b, A-53, A-55,
đường dây điều khiển, 311 262, 266bTHER267b
hướng dẫn tải, 302 Đa luồng hạt mịn, 534 Máy trạng thái
hướng dẫn lưu trữ, 302 hữu hạn (FSM), 470 trừ475 ,
Thực hiện trong thực hiện nhiều xe đạp, A-66 bóng A-71, 282.e12
282.e8 hướng dẫn chi nhánh yêu cầu
Thời gian thực hiện trạng thái đơn, 282.e17f
CPU, 32 điều khiển, 282.e14f, 282.e18f, bộ
đường ống và, 296b điều khiển C-8, C-20, 282.e12f, 473f
như là thước đo hiệu suất hợp lệ, để kiểm soát hướng dẫn tham khảo
51 bộ đếm rõ ràng, C-23, C-24, C- bộ nhớ, 282.e15f
26f Exponents, 209 triển khai, A-69, 472 bóng474
Máy tích lũy mở rộng, Kiến trúc D- Mealy, 473bTHER474b Moore,
31 eXtends, D-68, D-69 473biêu474b
để điều khiển đa xe, chức năng
F trạng thái tiếp theo C-9f, chức năng
Thất bại, đồng bộ hóa, A-75, A- đầu ra A-66, 472, triển khai hướng
76 Fallacy. Xem thêm Cạm bẫy dẫn loại R A-66, A-68 ,
Luật Amdahl, 583 282.e16f
số học, 238 đối với bộ điều khiển bộ đệm đơn
ngôn ngữ lắp ráp cho hiệu suất, tương giản, gán trạng thái 474, 475, A-69
thích nhị phân thương mại 170b thực hiện đăng ký nhà nước, phong
tầm quan trọng, 171b cách A-70f, 473b 474b
Máy trạng thái hữu hạn (FSM)
(Tiếp tục)
đồng bộ, A-66
SystemVerilog, 480.e6f
ví dụ đèn giao thông, A-67
Bộ nhớ flash, 395
định nghĩa, 23
Không gian địa chỉ phẳng,
490 Fl491 Flip-flops
Dép xỏ ngón, A-50, A-
52 được xác định, A-50,
A-53
Điểm nổi, ngôn ngữ lắp ráp
2082233, bước lùi 224f,
242.e3
chuyển đổi nhị phân thành thập phân,
214b
chi nhánh, 223
thử thách, 241
đa dạng so với. tính di động,
phân chia 242.e2, 223
tranh chấp đầu tiên, 242.e1
mẫu, 209f
cộng lại nhiều lần, chữ
số bảo vệ 231b, lịch sử
230b, 242
Tiêu chuẩn IEEE 754, 210 trận215
tính toán trung gian, 229b
toán hạng, 224f
tràn, 209
định dạng đóng gói, 235
độ chính xác, 239
thủ tục với ma trận hai chiều,
226b 2222222
đăng ký, 229b
đại diện, 209 Gian210
Tần số lệnh RISC-V cho ,
242f
Hướng dẫn RISC-V, 223 Từ229
làm tròn, 229
dấu hiệu và cường độ,
kiến trúc 209 SSE2, trừ
234, 234f, dòng chảy 223,
209 đơn vị, 233

trong x86, 234f


Các vectơ nổi, 242.e2
Bổ sung điểm nổi, 215 bóng218
sơ đồ khối đơn vị số học,
219f
nhị phân, 216b Vang218b
minh họa, 217f
hướng dẫn, 223 bóng229
các bước, 215
Chỉ số I-9

Hoạt động hợp nhất-nhiều lần thêm


Số học điểm nổi (GPU) , (FMA) , Đơn vị xử lý đồ họa (Tiếp tục)
B-41 B-42 231b, B-45 Thế hệ 8 dòng GeForce, B-5
cơ bản, B-42 G tính toán chung, B-73b
độ chính xác kép, B-45, B-46, B-74b Mục đích chung (GPGPU), B-5
hiệu suất, B-44 Máy chơi game, B-9 chế độ đồ họa, B-6
chuyên ngành, B-42, B-44 Gates, A-3 bóng A-9 xu hướng đồ họa, B-4
các định dạng được hỗ trợ, B-42 VÀ, A-12 bóng A-13, C-7 lịch sử, B-3 B-4
hoạt động kết cấu, B-44 sự chậm trễ, A-45b đường ống đồ họa logic, B-13, B-14
Kiểm soát điểm nổi và đăng ký trạng thái ánh xạ hàm điều khiển ALU tới , ánh xạ các ứng dụng tới, B-55, B-72
(fcsr), 210 C-4 C-7 bộ nhớ, 543
Hướng dẫn điểm nổi NAND, A-8 bộ nhớ cache đa cấp và, 542
RISC máy tính để bàn, D-16f BÌNH THƯỜNG, A-8, A-49f Các ứng dụng cơ thể N, B-65, B-68
Phép nhân điểm nổi, 218 bóng223 Thu thập phân tán, 531 Kiến trúc NVIDIA, 543 bóng545
hệ thống bộ nhớ song song, B-36, B-
nhị phân, 222b Vang223b GPU mục đích chung (GPGPU), B-5 41
minh họa, 221f Sổ đăng ký đa năng, 158 song song, 543b, B-76
hướng dẫn, 223 bóng229 kiến trúc, 174.e2 tăng gấp đôi hiệu suất, B-4
ý nghĩa, 218 Tạo phối cảnh, 547 bóng549
các bước, 218 được xác định, A-39 lập trình, B-12 B-25
Hoạt động điểm nổi ví dụ, A-44bTHER A-45b giao diện lập trình đến, B-17
Intel 80 × 86, D-38, D-40, D-40f , siêu, A-40 đồ họa thời gian thực, B-13
Các chương trình shader đồ họa, B-14,
D-46f Gigabyte, 6f B-15
Thông tin nhạy cảm với dòng chảy,
151.e13b Biểu hiện chung toàn cầu Luật Gresham, 242.e1, 242
Hướng dẫn xả nước, 326 bóng327, 332 loại bỏ, 151.e5 Điện toán lưới, 557b
ngoại lệ và, 339b Bộ nhớ toàn cầu, B-21, B-39 Lưới, B-19
Đối với các vòng lặp, 149, 151.e25b Tỷ lệ bỏ lỡ toàn cầu, 23b Chữ số bảo vệ
bên trong, 151.e23 Tối ưu hóa toàn cầu, 151.e4 được xác định, 229
Các trường định dạng, C-31 mã, 151.e6 làm tròn với, 230b
Fortran, 174.e6 thực hiện, 151.e7
Truyền tiếp, 572 Con trỏ toàn cầu, 110b H
Chuyển tiếp, 313 bóng325 Điện toán GPU. Xem thêm Đồ họa
ALU trước, 318f đơn vị xử lý (GPU) Độ chính xác một nửa, B-42
kiểm soát, 319 được xác định, B-5 B-6 Nửa chữ, 118
datapath để giải quyết nguy hiểm, 321f ứng dụng trực quan, B-6 Hamming, Richard, 432 bóng433
được xác định, 288 Kiến trúc hệ thống GPU, B-7, B-12 Khoảng cách Hamming, 432 bóng433
biểu diễn đồ họa, 290f đường ống logic đồ họa, B-10 Mã sửa lỗi Hamming
hình minh họa, 365.e20 không đồng nhất, B-7 B-9 (ECC), 433
nhiều kết quả và, 291 hàm ý cho, B-24 B-25 tính toán, 433
bộ ghép kênh, 319f giao diện và trình điều khiển, B-9 B-10 Đĩa cứng
đăng ký đường ống trước, 318f thống nhất, B-10 B-11 thời gian truy cập, 24b
với hai hướng dẫn, 289b Tô màu đồ thị, 151.e11 xác định, 23b
Thực hiện Verilog, 365.e3 Đồ họa hiển thị Phần cứng
Phân số, 209 Gian210 hỗ trợ phần cứng máy tính, 18 như lớp phân cấp, 13f
Bộ đệm khung, 18 LCD, 18 ngôn ngữ của, 14 trận16
Con trỏ khung, D-56, D-58 Đường ống logic đồ họa, B-10 hoạt động, 69 bóng73
Con trỏ khung, 110 bóng111 Đơn vị xử lý đồ họa (GPU) , thủ tục hỗ trợ trong, 104 bóng114
542 bóng549. Xem thêm Điện toán
Mặt trước, 151.e2 GPU tổng hợp, A-21
Bộ nhớ cache liên kết đầy đủ. Xem thêm dịch các chương trình vi mô sang, C-28,
Bộ nhớ cache như máy gia tốc, 542 C-32
chiến lược thay thế khối, 466 bóng467 nội suy thuộc tính, B-43, B-44 ảo hóa, 439
lựa chọn, 466 xác định, 46, 60, B-3 Ngôn ngữ mô tả phần cứng. Xem thêm
xác định, 416 tiến hóa, B-5 Verilog
vị trí khối bộ nhớ, 417f ngụy biện và cạm bẫy, B-72 B-75 sử dụng, A-20, A-26
bỏ lỡ, 418b bóng420b số học dấu phẩy động, B-16 , được xác định, A-20
Mạng được kết nối đầy đủ, 558 B-41 bóng B-46, B-74b VHDL, A-20, A-21
I-10 Chỉ
số
chi nhánh và tải trọng đặc biệt và cửa
hàng, D-71
các nhánh và trạng thái cài đặt
Đa luồng phần cứng, 534 bóng537, 545 Kiến trúc IBM 360/370 cho Máy tính
hướng dẫn R-R, D-70
hạt thô, 534 Mainframe (Tiếp tục)
tùy chọn, 535f chi nhánh / hướng dẫn logic và dấu
đồng thời, 535 phẩy động, D-70, D-71
Đầu cơ dựa trên phần cứng, 349 phân phối tần số thực hiện lệnh, D-
Kiến trúc Harvard, 54.e3 73f
Đơn vị phát hiện mối nguy hiểm, 321 Hướng dẫn R-R số nguyên / logic và
Từ322 dấu phẩy động, D-69, D-70
kết nối đường ống cho, 324 Hướng dẫn định dạng RS và
mối nguy hiểm. Xem thêm SI, D-71, D-72
Đường ống SS hướng dẫn định dạng, Bộ
điều khiển, dữ liệu hướng dẫn D-72, D-74 System /
291222294, 325 dữ 360 ,
liệu333, 288 thuật291, D-69 bóng D-74
chuyển tiếp 313 313325 và, IBM 360/85, 495.e6
cấu trúc 320bTHER321b, IBM 360/370, D-3
288, 304 IBM 701, 54.e4
Đống IBM 7030, 368.e1
phân bổ không gian trên, IBM ALOG, 242.e6
110 bóng111 được xác định, IBM Blue Gene, 587.e8
111 Máy tính cá nhân của IBM, 54.e7,
Các hệ thống không đồng nhất, 174.e5 Hệ thống IBM / 360 máy tính,
kiến trúc B-4 B-5, B-7 B B-9 54.e5f ,
được xác định, B-3 242.e5, 242.e6, 368.e1 IBM
Số thập lục phân, 88 z / VM, kiến trúc 495.e12
chuyển đổi số nhị phân thành, 88f, IBM360 / 370, D-30f
89b Hồ băng. Xem Bộ xử lý Intel® Core
Đăng ký Hi-Lo, D-29 ™ (thế hệ thứ 10)
Phân cấp ký ức, 12 ICI, 522
Bộ nhớ băng thông cao (HBM), 573 Giai đoạn ID
Ngôn ngữ cấp cao, 14 trận16 thực hiện chi nhánh trong,
lợi ích, 16 hướng dẫn tải 327, hướng
kiến trúc máy tính, tầm quan dẫn lưu trữ 302f trong,
trọng 174.e4, 16 301f
Tối ưu hóa cấp cao, 151.e3 Tiêu chuẩn điểm nổi IEEE 754,
Tỷ lệ trúng, 390 210 bóng215, 211f, 242.e7.
Trúng thời gian Xem thêm Điểm nổi
hiệu suất bộ đệm và, được chip đầu tiên, 242.e7
xác định 415, 390 trong số học GPU, triển
Lượt dưới bỏ lỡ, 481 khai B-42, chế độ làm
bóng482 Hitachi SH tròn 242.e9, 230 trừ231
Kiến trúc RISC, 174.e4 ngày nay, 242.e1
Thời gian giữ, A-52, A-53 Nếu báo cáo, 122
Mã vi mô ngang, C-32 Hoán Nếu-sau đó-khác, 99b
đổi nóng, 479.e6 Dự án bộ Địa chỉ ngay lập tức, 125f
gen người, 4 Hướng dẫn ngay lập tức, 132 bóng133
Ngắt chính xác, 102b, 368.e3
TÔI Cam kết theo thứ tự, 349
Loại I, 93b Kiểm tra chỉ số ngoài giới hạn, 102b
I / O, 561.e1 Địa chỉ được lập chỉ mục, D-52
về hiệu suất hệ thống, điểm chuẩn Địa chỉ gián tiếp, D-52
I / O 561.e2b. Xem Điểm chuẩn kiến Loại bỏ biến cảm ứng ,
trúc IA-32, D-32 151.e6
Kiến trúc IBM 360/370, D-48 Kế thừa, 151.e14
Kiến trúc IBM 360/370 cho Máy tính Thiết bị đầu vào, 151.e18
Mainframe, D-68, D-74 Đầu vào, 271
Trường hợp, 151.e14 Kiến trúc VAX, hỗ trợ máy ảo
D-50, D-51, 439
Số lượng hướng dẫn, 36b, 38 Bước
giải mã hướng dẫn trong xe đạp
nhiều bánh
thực hiện, 282.e8
Hướng dẫn giải mã / đăng ký tập tin đọc
giai đoạn
đường điều khiển, 310
hướng dẫn tải, 299
hướng dẫn lưu trữ, 304
Hướng dẫn mã hóa Intel
80 × 86, D-41, D-42
Hướng dẫn thực hiện minh họa,
365.e13
chu kỳ đồng hồ 9, 365.e25f
đồng hồ quay 1 và 2,
365.e21f đồng hồ quay 3 và
4, 365.e22f đồng hồ chu kỳ
5 và 6, 365.e23f đồng hồ
chu kỳ 7 và 8, ví dụ
365.e24f, chuyển tiếp
365.e20 không có nguy
hiểm, 365.e15
đường ống có quầy hàng và chuyển
tiếp, 365.e15
Hướng dẫn tìm nạp
dòng điều khiển giai
đoạn, hướng dẫn tải
310, hướng dẫn lưu
trữ 299, 304
Hướng dẫn tìm nạp bước trong thực
hiện nhiều xe đạp, 282.e7
Định dạng hướng dẫn,
xác định D-41, 88
đối với máy tính để bàn và
máy chủ RISC, D-7, D-11,
D-9f, D-12f
Tôi loại, 90
Loại R, 90, 272
Loại S, 90
Loại SB, 121
Loại U, 120
Loại UJ, 122
x86, 165 bóng166
Độ trễ hướng dẫn, 367
Bộ nhớ hướng dẫn (Imem), 574
Hướng dẫn trộn, 39, 54.e9
Kiến trúc hướng dẫn, D-3
tính toán địa chỉ chi nhánh,
xác định 264, 21, 53
máy tính để bàn và máy chủ RISC,
D-4, D-7, D-5f
lịch sử, 174 bóng175
Kiến trúc Intel 80 × 86, D-30, D-32,
D-33f
duy trì, 53
bảo vệ và, 440
sợi, B-31 B-34
Chỉ số I-11

Bộ hướng dẫn, B-49 Hướng dẫn (Tiếp tục) Intel 80 × 86 (Tiếp tục)
RISC-V, 172 có thể khởi động lại, 461 thanh ghi và chế độ địa chỉ dữ liệu,
tăng trưởng x86, 174f nối lại, 461b Từ462b D-32, D-35
Hướng dẫn đầu cơ, 585 Loại R, 261 bóng262, 399b sơ đồ phân đoạn, D-36f
Song song cấp độ hướng dẫn (ILP), 364. Hướng dẫn cốt lõi RV64G, D-11 Kiến trúc Intel 8086, D-30f
Xem thêm Song song khai Hướng dẫn 16 bit lõi RV64GC, D-17 Kiến trúc Intel 8086, D-31
thác trình biên dịch, xác định SPARC, D-20, D-22 Bộ đồng xử lý điểm nổi Intel 8087, D-31
365.e1, khai thác 43b, 340, SSE, D-32 Intel 80x86, D-3
tăng, nhân 351b và ma trận, SSE2, D-32 Intel AVX
363 Lỗi365 cửa hàng, 77b Kiến trúc RISC, hướng dẫn
Hướng dẫn, D-20, D-24. Xem thêm ô chữ có điều kiện cửa hàng, 129 đơn 174.e4, 231b
Hướng dẫn số học; MIPS; Từ130 Intel Core i7, 46 Ném48, 254, 521
Toán tử trừ, 192 hệ thống phân cấp bộ nhớ, 480
thêm ngay lập tức, 78 sợi, B-30 B-31 mật483 dịch địa chỉ cho, 480 hệ
Ngoài ra, 192 duy nhất cho ARM, D-22, D-23 thống phân cấp bộ nhớ, 480
số học-logic, 261 Từ262 duy nhất cho MIPS64 R6, D-20 micro483 microarch
ARM, D-22 cường D-23 duy nhất cho Power3, D-23, D-24 architecture, hiệu suất 358 của
như tín hiệu điện tử, duy nhất cho SPARC v.9, D-20, D-22 388392 CPU CPU, 48 4844
lắp ráp 87, khối cơ bản vectơ, 528 bóng530 Intel Core i7 6700, 357 Từ360
71b, 101b như lời nói, 68 CPI cho điểm chuẩn
phá vỡ thực hiện lệnh vào chu kỳ x86, 158 bóng166 SPECCPUint2006, 361f
đồng hồ, 282.e6 Hướng dẫn cho mỗi chu kỳ đồng hồ vi kiến trúc, tỷ lệ sai lầm 358
bộ nhớ cache, 494 (IPC), 340 Mạch tích hợp (IC), 20. Xem cho số nguyên
các phần mở rộng phổ biến ngoài thêm Điểm chuẩn SPECCPU2006, cấu
RV64G, D-17, D-20 chip cụ thể trúc đường ống 362f, 359f
nhánh có điều kiện, di chi phí, 27 Kiến trúc Intel IA-64, 174.e2f
chuyển có điều kiện 98, 99b, xác định, 25 Intel Paragon, 587.e6
truyền dữ liệu 331b, 332b, ra quy trình sản xuất, 26 Khối xây dựng luồng Intel, bộ vi xử
quyết định 74, 98 .104 được quy mô rất lớn (VLSI), 25 lý B-60 Intel x86
xác định, 14, 53 Intel 80 × 86, D-30, D-32, D-33f tốc độ đồng hồ và công suất cho, 40f
phần mở rộng xử lý tín hiệu số của dựa trên chỉ số định địa chỉ chế độ Bộ xử lý Intel® Core ™ (thế hệ thứ 10),
các RISC nhúng, D-28, D-29 chỉ mục mở rộng, D-44f 27f
mã hóa, 91f đo lường hoạt động so sánh, D-46 Kết nối liên lõi (ICI), 573
tìm nạp, 263f mã hóa của bộ xác định địa chỉ đầu tiên, Biểu đồ giao thoa, 151.e10
dấu phẩy động (x86), 223 bóng229, các hoạt động dấu phẩy động D-43f, D- Interleaving, 412
234f 38, D-40 , Phân tích liên ngành, 151.e13b
xả nước, 326 bóng327, 332 D-40f, D-46f Bật ngắt, 460b
ngay lập tức, 78 mã hóa lệnh, định dạng lệnh D- I / O điều khiển gián đoạn, 561.e3b
giới thiệu về, 68 bóng69 41, D-42, độ dài lệnh D-41f, D- Gián đoạn
dòng chảy từ trái sang phải, 297 42f, hỗn hợp lệnh D-45f, các loại được xác định, 210,
tải, 75 lệnh D-47fTHER D-48f cho số 333 loại sự kiện và,
các thao tác logic, truy cập học , 333 trường hợp ngoại
bộ nhớ 95 bóng98, tham logic và truyền dữ liệu lệ so với., 333 không
chiếu bộ nhớ B-33, B-34, hướng dẫn, hướng dẫn và chính xác, 339b,
255 MMX, D-31 chức năng D-34f, hướng dẫn D- 368.e3 chính xác,
phần mở rộng đa phương tiện của 37f được thực thi và dữ liệu 339b vectored, 334
RISC máy tính để bàn / máy chủ, truy cập, D-49f Bộ xử lý FastMATH nội tại, bộ nhớ
D-26, D-27 số nguyên hoạt động, số đo D-35, cache 40941411, 410f
nhân, 198 bóng199 D-38 của toán hạng 80 × 86 tỷ lệ bỏ lỡ dữ liệu, 420fTHER 421f
nop, 322 bóng323 địa chỉ, các phép đo D-43 của D-46 đọc xử lý, 455f
hiệu suất, 35 trận36 về việc sử dụng tập lệnh , TLB, 453 bóng456
trình tự đường ống, 323f D-42 bóng D-46 xử lý ghi qua, 455f
Power3, B-10 B-11 phân phối chế độ địa chỉ toán hạng, D-
PTX, B-31, B-32f 45f
đại diện trong máy tính, 87 bóng95 hoạt động, D-39f
I-12 Chỉ
số
sử dụng, 344
lb (byte tải), 70f

Bảng trang đảo ngược, lbu (tải byte, không dấu), 70f
450 Gói phát hành, 343 ld (tải kép), 70f
Thủ tục lá. Xem thêm Thủ tục xác
J định, 108
Java ví dụ, 118f
mã byte, 139 Ít nhất được sử dụng gần đây (LRU)
kiến trúc bytecode, 151.e1, 151.e15 như chiến lược thay thế khối, 466
ký tự trong, 117 mật119 biên dịch bóng467
trong, 151.e18 xác định, 422
mục tiêu, 139 trang, 448, 449b
phiên dịch, từ khóa 139, 151, Ít bit quan trọng nhất
151 Từ152, 151.e20 xác định, 80
gọi phương thức trong, SPARC, D-22f
151.e20 con trỏ, 151.e25b Luồng hướng dẫn từ trái sang phải, 297
loại nguyên thủy, chương Đồng hồ nhạy cảm với cấp độ, A-73, A-
trình 151.e25b, bắt đầu, 139 75
loại140 tham chiếu, thuật được xác định, A-73, A-74
toán sắp xếp 151.e25b, chuỗi hai pha, A-74
148f trong, hệ thống phân cấp lh (tải nửa từ), 70f
dịch thuật 117, 139f lhu (tải nửa từ, không dấu), 70f
trong khi biên dịch vòng lặp trong, Liên kết, 561.e1
151.e17b Java, bắt đầu, 139 trừ140 Liên kết đăng ký
xử lý song song, bắt của Power3, D-23
đầu 520, dịch 131 Liên kết, 134 bóng136
bóng140, 131 trừ140 định nghĩa, 134
Máy ảo Java (JVM), 151 Hướng dẫn tập tin thực thi, 134
nhảy152 các bước, 134
hướng dẫn chi nhánh so với., Liên kết các tập tin đối tượng, 135b
Điều khiển và dữ liệu 268f Từ136b
cho, triển khai 269, định Linpack, 242.e2, 561 Từ562
dạng hướng dẫn 255222258, Màn hình tinh thể lỏng (LCD), 18
268b LISP, D-21 cường D-22
Hướng dẫn đăng ký Jump-and-link LISP, hỗ trợ SPARC, phạm vi D-
(jalr), 103b 21, D-22 Live, 151.e10
Trình biên dịch Just In Time (JIT), 140 Vòng lặp Livermore, cân
bằng tải 54.e10, byte tải
K 525b, 526b, 115
Bản đồ Karnaugh, A-18 Hướng dẫn tải. Xem thêm
Chế độ hạt nhân, 458b Hướng dẫn lưu trữ
Hạt nhân truy cập, B-41
CUDA, B-19, B-22, B- đăng ký cơ sở, 272
24 được xác định, B-19, biên dịch với, 77b
B-22 datapath trong hoạt động cho, 279f
Kilobyte, 6f xác định, 75
Giai đoạn EX, 302f
L nửa chữ ký, 118
Bộ đa xử lý quy mô lớn, chốt Giai đoạn ID, 301f
587.e6 NẾU giai đoạn, 301f
D chốt, A-50, A-51, A- tải byte không dấu, 84b
51f được xác định, A-50, tải một nửa, giai đoạn 118
A-51 MEM, datapath đường
Độ trễ ống 303f, 306 đã ký, 84b
hướng dẫn, 367 đơn vị thực hiện, 265f chưa
bộ nhớ, B-74b ký, giai đoạn 84b WB, 303f
đường ống, 296b Tải trên ngay lập tức, 120
Tải từ, 75, 77
Tải từ không dấu, 113b Từ
dành riêng cho tải, 129 Kiến
trúc cửa hàng tải130, 174.e2
Nguy hiểm dữ liệu sử dụng tải,
289, 326 Gian hàng sử dụng
tải, 326 Máy xúc lật, 137
Mạng cục bộ (LAN), 24. Xem thêm
Mạng
Bộ nhớ cục bộ, B-21, B-
40 Tỷ lệ bỏ lỡ cục bộ,
429b
Tối ưu hóa cục bộ, 151.e4. Xem
thêm Tối ưu hóa
thực hiện, 151.e7
Địa phương
nguyên tắc, 388
không gian, 388, 391b
tạm thời, 388, 391b
Đồng bộ hóa khóa, 128
Khóa, 538
Logic
chọn địa chỉ, C-24, C-25f
Kiểm soát ALU, C-6
tổ hợp, A-4, A-5, A-9, A-20 ,
260
thành phần, 259
phương trình đơn vị điều khiển, C-
11f
thiết kế, 258 bóng261
phương trình, A-7b
giảm thiểu, A-18
mảng lập trình (PAL), A-77
tuần tự, A-4, A-5, A-55, A-57
hai cấp độ, A-11, A-14
Hoạt động logic, 295
bóng296 VÀ, 96
RISC máy tính để bàn, D-14f
RISC nhúng, D-18f
KHÔNG, 97
HOẶC, 97
ca, 96
XOR, 97
Từ hướng dẫn dài (LIW), 368.e4
Chế độ dài, D-32
Bảng tra cứu (LUT), A-78
Vòng lặp không kiểm soát
được xác định, 151.e3, 346b Từ347b
đối với đường ống nhiều vấn đề, đổi tên
thanh ghi 346b 343347b và,
346biêu347b
Vòng lặp, 100 bóng102
cho, 149
các nhánh có điều kiện
trong, dự đoán 122 và, thử
nghiệm 330b, 331b, 149
trong khi, biên dịch, 100b 101101b
Chỉ số I-13

hoạt động tổng thể của, song


lr.d (tải dành riêng), 70f Ký ức (Tiếp tục) song 456bTHER457b và, 475
lui (tải trên ngay lập tức), 70f không bay hơi, 23 trừ479
lw (tải từ), 70f toán hạng, 11
lwu (tải từ, không dấu), 70f hệ thống song song, cấp
bậc B-36, B-41, 395
M chỉ đọc (ROM), A-14, A-16
Mã máy, 88 SDRAM, 393
Hướng dẫn sử dụng máy, 88 thứ cấp, 23
Ngôn ngữ máy, 15f chia sẻ, B-21, B-39, B-40
bù nhánh trong, giải mã không gian, B-39
123b12124b, 126 trừ127 SRAM, A-57, A-59
được xác định, 14, 34 minh quầy hàng, 414b bóng415b
họa, 15f RISC-V, 93 công nghệ xây dựng, 25 trận29
kết cấu, B-40
SRAM, 21 ảo, 440 bóng464
dịch ngôn ngữ lắp ráp RISC-V sang, dễ bay hơi, 23
91b 91b92b Hướng dẫn truy cập bộ nhớ, giai đoạn
Lập trình viên ngôn ngữ máy, D-68 Bộ truy cập bộ nhớ B-33 B-34
nhớ chính, 441. Xem thêm Ký ức đường dây điều khiển, 312f
định nghĩa, 23 hướng dẫn tải, 302f
bảng trang, 450 hướng dẫn lưu trữ, 302
địa chỉ vật lý, 441 ứng dụng Bước truy cập bộ nhớ trong xe đạp
Lập bản đồ, máy tính B-55 B B- nhiều bánh
72 Mark, 54.e3 thực hiện, tính toán địa chỉ
Ma trận nhân, 199, 236 bộ nhớ 282.e9 trong
bóng237 trong C, 73 triển khai đa xe đạp, băng thông
bóng80 bộ nhớ 282.e8, mô hình thống nhất bộ
trong Python, 7 trận10, 48f nhớ 584b, 479b
Đơn vị nhân ma trận (MXU), Đăng ký dữ liệu bộ nhớ (MDR), 282.e9
521f, 551 trừ552 Các yếu tố bộ nhớ, A-49, A-57
Máy có thịt, A-67, A-70, A-71, A-71b, đồng hồ, A-50
473biêu474b D flip-flop, A-50, A-51, A-
Thời gian trung bình đến thất bại 52f D, A-50, A-51 DRAM,
(MTTF), cải thiện 431b 432b, 432 A-62, A-64 flip-flop, A-50,
so với. AFR của đĩa, 431b Từ432b A-53
Địa chỉ kiểm soát truy cập phương tiện (MAC), giữ thời gian, A-52 bóng A-
561.e6 53, chốt A-53f, A-50 trừ A-
Megabyte, 6f 53
Ký ức thời gian thiết lập, A-52, A-
địa chỉ, 21b 53, A-53f SRAM, A-57, A-
ái lực, 570f 59 không được ép xung, A-
nguyên tử, B-21 50
băng thông, 393, 411b Hệ thống phân cấp bộ nhớ, 568
bộ nhớ cache, 11, 21 của ARM cortex-A48, khối
CAM, 421b 480483 (hoặc dòng), 389f
hằng số, B-40 hiệu suất bộ đệm, bộ nhớ
kiểm soát, C-26f cache 412430430, 398
định nghĩa, 21 bóng412
DRAM, 21, A-62, A-64, 393 khung chung, 464 bóng470
đèn flash395, 23 được xác định, 389
toàn cầu, B-21, B-39 thử thách thiết kế, 470f
GPU, 543 phát triển, 495.e5
hướng dẫn, datapath cho, 265 của Intel Core i7, các
địa phương, B-21, B-40 cặp cấp độ 480483483,
chính, 23 nhiều cấp độ 390f, 389
Phân cấp bộ nhớ (Tiếp tục)
cạm bẫy, 489 bóng494
thời gian thực hiện chương trình và,
430 thông số thiết kế định lượng,
mảng dự phòng 464f và không tốn
kém
đĩa, 479
phụ thuộc vào, 391
cấu trúc, 389f
sơ đồ cấu trúc, 392f
phương sai, 429b Vang430b
bộ nhớ ảo, 440 bóng464
Bước hoàn thành đọc bộ nhớ trong thực
hiện đa xe đạp, 282.e10
Công nghệ bộ nhớ, bộ nhớ đĩa
392 39239398, công nghệ
DRAM 39539398, bộ nhớ
flash 3933395, 395
Công nghệ SRAM, I / O
được ánh xạ bộ nhớ, 561.e2
Chu kỳ đồng hồ cài đặt bộ
nhớ, 413 Thông báo đi qua
xác định, 552
bộ đa xử lý, 552 bóng557
Khả năng di chuyển,
Phương pháp A-75, A-
76
được định nghĩa, 151.e14
gọi trong Java, 151.e19
Kiến trúc vi mô, 358
Intel Core i7 6700, 357 Từ360
kỹ thuật, 584 bóng585
Mã vi mô
lắp ráp, C-30
đơn vị điều khiển như, C-28f
được xác định, C-27
gửi ROM, C-27, C-30f
ngang, C-32
dọc, C-32
Microinstructions, C-
31 microMIPS32
hướng dẫn cho DSP, D-28, D-
29f microMIPS64, D-4
Phần mở rộng 16 bit,
hướng dẫn ALU D-10,
D-18f
đến các nhánh có điều kiện, D-
19f cho các ứng dụng nhúng,
truyền dữ liệu RISC nhúng D-6f
hướng dẫn, định dạng lệnh D-18f,
mã hóa thanh ghi D-11, D-12f cho
tập con 16 bit ,
D-8f
Bộ vi xử lý
thiết kế thay đổi, 521
đa lõi, 8, 43, 475
Chỉ
I-14 số

Microprograms Kiến trúc Motorola68000, D-30f Nhiều vấn đề, 340


như đại diện kiểm soát trừu tượng , MS-DOS, 495.e15 lập lịch mã, 345b
C-30 C-31 Nhiều con, 537 bóng541 động, 340, 347 Từ352
dịch thuật hiện trường, C-28, C-29 Bộ nhân đa lõi, 8, 43 phát hành gói, 342 bóng343
vòng lặp không kiểm soát và, 346b Từ
dịch sang phần cứng, C-28, C-32 được xác định, 8, 520 bóng521 347b
Di cư, 477 ĐA NĂNG (Thông tin đa kênh và bộ xử lý, 340
Triệu hướng dẫn mỗi giây (MIPS) , Dịch vụ điện toán), 495.e13 tĩnh, 340, 342 bóng347
52, 256f, D-30 Từ D-31 CPU đa xe, CPI trong, 282.e12 thông lượng và, 351b
so sánh và chi nhánh có điều kiện, D-17 Thực hiện nhiều xe đạp Nhiều bộ xử lý, 580 bóng583
định dạng hướng dẫn, 153f phá vỡ thực hiện hướng dẫn vào Sơ đồ đường ống nhiều chu kỳ ,
Minterms chu kỳ đồng hồ, 282.e6 306
được xác định, A-12, C-20 hoàn thành datapath, 282.e5f năm hướng dẫn, 306f
trong triển khai PLA, C-20 định nghĩa kiểm soát, 282.e9 minh họa, 307 bóng309
MIP CPI trong CPU đa xe, 282.e12 Bộ ghép kênh, A-10
Kiến trúc RISC, 174.e4 thực hiện, địa chỉ bộ nhớ điều khiển, 472
Bản đồ MIP, C-33 tính toán, hoặc hoàn thành chi nhánh , trong datapath, 418f
MIPS và RISC-V 282.e8 được xác định, 255 bóng256
các tính năng phổ biến giữa, 152 tầm nhìn cao cấp của xe đạp đa cấp chuyển tiếp, giá trị điều khiển, 319f
Phần mở rộng MIPS DSP, D-29 datapath, 282.e1f kiểm soát bộ chọn, 269
MIPS-16, D-6 giải mã hướng dẫn và đăng ký tìm nạp hai đầu vào, A-10
Tập lệnh MIPS-32, 152 bước, 282.e8 Đa số, 194
MIPS-64, D-5 tìm nạp hướng dẫn và giải mã phần , Phép nhân, 193 bóng199. Xem thêm
hướng dẫn kiểm soát, D-19f 282.e14f Số học
hướng dẫn truyền dữ liệu, D-19f hướng dẫn tìm nạp bước, 282.e7 nhanh, phần cứng, 199f
hướng dẫn đơn, 231b bước truy cập bộ nhớ, 282.e9 nhanh hơn, 198
Hướng dẫn MIPS-64, 152 bước hoàn thành đọc bộ nhớ, 282.e10 thuật toán đầu tiên, 196f
MIPS64 R6, D-6 datapath đa xe cho RISC-V , điểm nổi, 218 bóng223
hướng dẫn, D-20, D-20f 282.e3f phần cứng, 194 bóng198
Phản chiếu, 479.e4 datapath đa xe với các dòng điều khiển , hướng dẫn, 198
Hoa hậu phạt 282.e4f toán hạng, 198
định nghĩa, 390 Bước hoàn thành hướng dẫn loại R , sản phẩm, 198
quyết tâm, 406 282.e9 phiên bản tuần tự, 194 bóng198
bộ nhớ cache đa cấp, giảm, 423b Bộ nhớ cache đa cấp. Xem thêm Bộ nhớ
21425b cache đã ký, 198
Tỷ giá hoa hậu biến chứng, 429b Hệ số nhân, 194
kích thước khối so với., 406f xác định, 412, 429b Thuật toán nhân, 194 Từ198
bộ nhớ cache dữ liệu, 465f bỏ lỡ hình phạt, giảm, 423 bóng425 Thêm nhiều (MAD), B-42
xác định, 390b hiệu suất của, 423b Vang425b Bộ đa xử lý
toàn cầu, 429b tóm tắt, 430 điểm chuẩn, 561 bóng572
cải tiến, 406 Tiện ích mở rộng đa phương tiện kết hợp dựa trên xe buýt, 587.e6
RISC máy tính để bàn / máy chủ, D-26,
Bộ xử lý FastMATH nội tại, 411b D-27 xác định, 520
như các phần mở rộng SIMD cho các bộ
địa phương, 429b hướng dẫn , viễn cảnh lịch sử, 587 bóng588
bỏ lỡ nguồn, 469 587.e3 quy mô lớn, 587.e6
bộ nhớ cache chia, 411b vectơ so với., 529b bóng530b chuyển tin nhắn, 552 bóng557
Phần mở rộng đa phương tiện của máy
Hoa hậu dưới bỏ lỡ, 481 bóng482 tính để bàn / máy chủ kiến trúc đa luồng, B-26, B-27 ,
MMX (MultiMedia eXtension), 234
Từ238 , RISCs, D-26 cường D-27 B-36
D-31 Mảng nhiều chiều, 229b tổ chức, 519, 552
Máy Moore, A-67, A-71b , Nhiều hướng dẫn nhiều dữ liệu cho hiệu suất, 584
473b bóng474b (MIMD), 586 bộ nhớ dùng chung, 520 bóng521, 537
bóng542
Định luật Moore Moore, 393, 12, 542,
561.e1, B-72b xác định, 527 bóng534 phần mềm, 521f
Bit quan trọng nhất bộ nhân đầu tiên, 587.e3 TFLOPS, 587.e5
ALU 1 bit cho, A-29f Nhiều dữ liệu đơn hướng dẫn (MISD) , UMA, 538
xác định, 80 527 bóng528 Mạng đa tầng, 559
Chỉ số I-15

Kiến trúc đa bộ xử lý đa Mạng (Tiếp tục) kết nối NVIDIA GeForce 8800 (Tiếp tục)
luồng, B-25, B-36 đầy đủ, 558 Khu559 địa đơn vị chức năng đặc biệt (SFU),
kết luận, B-36 phương (LAN), 24 đa bộ đa xử lý phát trực tuyến B-50
ISA, B-31, B-34 tầng, 559 (SM) ,
đa luồng lớn, bộ vi xử lý B-25, B-26, diện tích rộng (WAN), 24 B-48 B-49
so sánh đa bộ xử lý B-26, B-27, B-35, Lặp lại Newton Newton, 229b bộ xử lý phát trực tuyến (SP), mảng
B-36 SIMT, B-27, B-29 Tiểu bang tiếp theo bộ xử lý phát trực tuyến B-49, B-50
các đơn vị chức năng đặc biệt (SFU), không quan trọng, C-24 (SPA) ,
bộ xử lý phát trực tuyến B-35 (SP), tuần tự, C-23 C-24 B-46
hướng dẫn luồng B-34, quản lý luồng Chức năng trạng thái tiếp theo, cụm kết cấu / bộ xử lý (TPC), kiến
B-34 / khối luồng, B-30 282.e12, 472, A-66 trúc GPU B-47 NVIDIA, GPU 543
Đa luồng, B-25, B-26 hạt xác định, 472 V545 NVIDIA Volta
thô, được xác định 534, triển khai, với trình sắp xếp so sánh được điều chỉnh, các
hạt mịn 526, phần cứng thứ tự, C-22, C-27 tính năng xử lý khóa 536f,
534, đồng thời 5345537 Đầu ra trạng thái tiếp theo, ví dụ C- đường viền mái 533f, tỷ lệ
(SMT), 535 12b, C-13b, C-27, triển khai C- siêu máy tính 535f, 539f
Phải thông tin, 520b 12bTHER C-13b, C-12 Cụm GPU NVIDIA Volta, 572 bóng579
Loại trừ lẫn nhau, 128 phương trình logic, bảng
chân lý C-12b, C-13b, C-13 Ôi
N Không có dự phòng (RAID 0), 479.e3 Tệp đối tượng, thông tin gỡ
N-body Không phân bổ ghi, 409b Phân công lỗi 135b136b, tiêu đề 134,
thuật toán tất cả các cặp, không chặn, bộ nhớ đệm A-24, 353b, 133
mô phỏng GPU B-65, 481 Chức năng kích hoạt phi tuyến, liên kết, thông tin di dời
toán học B-71, B-65, B- 521 Truy cập bộ nhớ không đồng nhất 135b136b, 133 phân đoạn
66 (NUMA) , dữ liệu tĩnh, bảng ký hiệu
nhiều luồng trên mỗi cơ thể, tối ưu 538 133, phân đoạn văn bản
hóa B-68, B-72, B-67 Bộ nhớ không bay hơi, 23 134, 133
so sánh hiệu suất, kết quả B-69 B-70, Hoa bia, 322 bóng323 Ngôn ngữ hướng đối tượng, 152. Xem
B-70 B-72 Cổng NOR, A-8 thêm Lịch sử tóm tắt Java, 174.e7
sử dụng bộ nhớ dùng chung, ghép chéo, A-49f được xác định, 151.e14,
Tên B-67 B-68, 349 trừ350 D chốt được thực hiện với, hoạt 152 Bổ sung One, A-29, 87
Tên phụ thuộc, 346b Từ347b, cổng 349 động A-51f KHÔNG, 97, Số A-6 Opcodes
Từ350 NAND, A-8 nhị phân, 80 cài đặt dòng điều khiển và,
NAS (NASA Advanced máy vi tính so với. thế giới thực, 78 được xác định, 89, 157
Supercomputing), 563 231b 232232b OpenGL, B-13
Phím tắt phủ định, 84b thủ thập phân, 80, 86b OpenMP (Mở MultiProcessing),
tục 85b lồng nhau, 108 không chuẩn hóa, 233 540b Từ541b, 563
biên dịch thủ tục đệ quy hiển thị, thập lục phân, 89b Địa chỉ hoạt động
108b Từ 109b đã ký, 80 bóng87 số đo 80 × 86, D-43 cường D-46
Thẻ Ethernet 10 Gigagit NetFPGA, 561. không dấu, 80 bóng87 phân phối chế độ, D-45f
e1f, 561.e2f NVIDIA GeForce 8800, B-46, B-55 Toán tử dịch chuyển, 68
Mạng lưới máy trạm, 587.e7 Cấu thuật toán toàn bộ N-body, tính toán Toán tử, 73 bóng80. Xem thêm
trúc liên kết mạng, 557 Tiết561 đại số tuyến tính dày đặc B-71 , Hướng dẫn 32 bit ngay lập tức, 120
thực hiện, 559 B-51 thêm, 191
đa561561, 560f Hiệu suất FFT, B-53 hướng dẫn số học, 73 biên dịch
Mạng, hệ điều hành 561.e3 trong, bộ hướng dẫn, B-49 gán khi vào
cải tiến hiệu suất 561.e3, 561.e6 hiệu suất, B-51 bộ nhớ, 75b
Mạng, 24 rasterization, B-50 hằng số, 78 bóng79
lợi thế, 24 ROP, B-50, B-51 bộ phận, 199 bóng208
băng thông, 558 khả năng mở rộng, B-51 điểm nổi, 224f
xà ngang, 559 hiệu suất sắp xếp, xấp xỉ chức Intel 80 × 86, D-43, D-46, bộ
năng đặc biệt B-54 B-55 nhớ D-45f, phép nhân 74, 78,
số liệu thống kê, B-43f 19310199 RISC-V, 70f
Kiến trúc VAX, D-51 cường D-54
I-16 Chỉ
số
minh họa, 447f
lập chỉ mục, 445, 447

Hệ điều hành Bảng trang (Tiếp tục)


lịch sử ngắn gọn, 495.e13 đảo ngược, 450
định nghĩa, 13 cấp độ, 450
đóng gói, 21 bộ nhớ chính, 450
trong mạng, 561.e3 đăng ký, 445 bóng446
Hoạt động kỹ thuật giảm lưu trữ, 450
nguyên tử, thực hiện, 129 cập nhật, 445b
phần cứng, 69 trận73 VMM, 462b
Intel 80 × 86, D-35, D- Trang. Xem thêm Bộ nhớ ảo được
38 logic, 95 Tắt98 xác định, 441 bóng442
Kiến trúc VAX, số nguyên bẩn, 451b
D-55, D-58 x86, 163 tìm kiếm, 444 bóng447
Tối ưu hóa LRU, 448, 449b
giải thích lớp học, trình bù, 442
biên dịch 151.e13f, 148f số vật lý, 442
kiểm soát thực hiện, C-27 đặt, 444 bóng447
toàn cầu, 151.e4 kích thước, 443f
cấp cao, 151.e3 số ảo, 442
địa phương, 151.e4 Xe buýt song song, 561.e1
hướng dẫn sử dụng, 151 Thực hiện song song, 128
hoặc (bao gồm hoặc), Hệ thống bộ nhớ song song, B-36 B-41.
hoạt động 70f OR, A-6, Xem thêm Đơn vị xử lý đồ họa
192b (GPU)
ori (bao gồm hoặc ngay lập tức), bộ nhớ cache, B-38
thực hiện 70f theo thứ tự bộ nhớ không đổi, B-40
định nghĩa, 349 Cân nhắc DRAM, bộ nhớ toàn cầu
độ phức tạp hiệu suất, bộ xử B-37, B-38, truy cập tải / lưu trữ B-
lý 429b, 353b 39, bộ nhớ cục bộ B-41, B-40
Phụ thuộc đầu ra, 350 không gian bộ nhớ, B-39
thiết bị đầu ra, 16 MMU, B-38 B-39
tràn17 ROP, B-41
xác định, 81, 209 bộ nhớ dùng chung, bề mặt
phát hiện, 192 B-39, B-40, bộ nhớ kết cấu
ngoại lệ, 337f B-41, B-40
điểm nổi, 210 Các chương trình xử lý song song, độ
xảy ra, 191 khó tạo 522 522527, được xác định
bão hòa và, 193b 522 52527, 520
trừ, 191 cuộc tranh luận lớn trong, 587.e4
đối với không gian địa chỉ dùng chung,
P sử dụng 539b 541541b, 549
Dự phòng P + Q (RAID 6), 479.e6 Giảm song song, B-62
PA-RISC, D-4 Quét song song, B-60 B-63
Định dạng dấu phẩy động được Mẫu CUDA, B-61f
đóng gói, 235 SIMD đóng gói, bao gồm, B-60
D-26 dựa trên cây, B-62f
Lỗi trang, 447 bóng449. Xem thêm Bộ Phần mềm song song,
nhớ ảo để truy cập dữ liệu, 482 521
bóng483 Song song, 11, 43b, 340 bóng354
được xác định, 441 bóng442 và máy tính số học, cấp độ dữ liệu
xử lý, 443, 460 bóng462 2332234, 241, 528 cuộc tranh luận,
gây ra địa chỉ ảo, 453 bóng456 587.e4
Bảng trang, 466 GPU và, 542, B-76
xác định, 445
Song song (Tiếp tục) cấp độ hướng
dẫn, 43b, 340, 352 phân cấp bộ
nhớ và, 475 đa479 và, 416b
nhiều vấn đề, đa luồng
456b, 457b và, 535 lợi ích
hiệu suất, 44 cấp độ quy
trình, 520
mảng dự phòng và đĩa rẻ tiền,
479
từ con, 488 bóng489
nhiệm vụ, B-24
cấp độ nhiệm vụ, 520
sợi, B-22
Paravirtualization, 493
Chẵn lẻ
bit, 433
mã, A-64, A-65, 433 PARSEC
(Ứng dụng Princeton
Kho lưu trữ cho máy tính bộ
nhớ dùng chung), 563
Transitor Pass, địa chỉ tương đối PC
A-62b, A-64b, 122, 125 PCI-Express
(PCIe), 561, 561.e1, B-9b Hiệu suất
nổi đỉnh, chơi đạo đức lỗi Pentium
565, Hiệu suất 582f, 29 Cẩu40
đánh giá, 29
phương trình CPU cổ điển,
36 thành phần4040, CPU
38f, 33 Tắt35
xác định, 29 con32
phương trình, sử dụng, 35b 35b36b
cải thiện, 34b bóng35b
hướng dẫn, 35 trận36
đo lường, 32 bóng33, 54,e9
chương trình, 9
tỷ lệ, 31b
người thân, 31b
thời gian đáp ứng, 30b
phân loại, B-51
thông lượng, 30b
đo thời gian, 32
Máy tính cá nhân (PC), xác
định 7f, 5
Thiết bị di động cá nhân (PMD)
xác định, 6 trận7
Petabyte, 6f
Địa chỉ vật lý, ánh xạ 441
đến, không gian
441442, 537,
541biêu542b
Bộ nhớ cache có địa chỉ vật lý, 457b Từ
458b
Chỉ số I-17

335340340 và, ngụy biện


Thanh ghi đường ống 296b, các mối nguy hiểm Đường ống (Tiếp tục) thiết kế
phụ thuộc, 317, 317f 365 bộ hướng dẫn cho, tương tự
trước khi chuyển tiếp, 319 giặt ủi 287, tổng quan 284f,
lựa chọn đơn vị chuyển tiếp, 320b nghịch lý 283222296, 283
320b321b cải thiện hiệu suất, 287 cạm
Gian hàng đường ống, 289 bẫy, 365 bóng367
tránh sắp xếp lại mã, 290b hướng dẫn thực hiện đồng thời,
Từ291b 296b
các mối nguy dữ liệu và, công thức tăng tốc, 286
chèn 321 321325, sử mối nguy cấu trúc, tóm tắt
dụng tải 324f, 326 288, 304, thông lượng 332
như là giải pháp để kiểm soát các 3323333 và, 296b
mối nguy hiểm, 292f Các nhánh Cạm bẫy. Xem thêm Fallacy
được phác thảo, 327b điều khiển giải quyết phần mở rộng
328b Đường ống, 310 Phản311. Xem không gian, số học 407, kết
thêm hợp 238241241, 490
Điều khiển xác định, 50
đường điều khiển, 310 GPU, B-74b
tổng quan minh họa, 325f bỏ qua hành vi hệ thống bộ nhớ, phân
chỉ định, 310 cấp bộ nhớ 489, đánh giá bộ xử lý
Datapaths đường ống, 296 bóng313 ngoài đơn hàng B-58, B-60, tập hợp
với tín hiệu điều khiển được kết nối, con phương trình hiệu suất 490, 52
314f đường ống, 366b
với tín hiệu điều khiển, 310 bóng311 con trỏ tới các biến tự động, 172
sửa, 306f địa chỉ từ tuần tự, 171 bộ đệm mô
minh họa, 299f phỏng, 489 phát triển phần mềm
trong các giai đoạn hướng dẫn với
tải, phụ thuộc đường ống 306f, bộ xử lý đa năng, triển khai
Đường ống 316f VMM 339b, ví dụ về bóng đổ
tác động hướng dẫn chi nhánh, hiệu Pixel 492, B-15 B-17
quả 328f, cải thiện, thực thi 368.e3 và Pixels, 18
giai đoạn tính toán địa chỉ , Con trỏ
300, 302 mảng so với., 148 bóng151
năm giai đoạn, 286, 300, 309b khung hình, 110 bóng111
biểu diễn đồ họa, giải mã lệnh 289f, toàn cầu, 110b
306 306310 và đăng ký tệp tăng, 150
giai đoạn đọc, giai đoạn tìm Java, 151.e25b
nạp hướng dẫn 298f, 300, 302, ngăn xếp, 105, 108b Từ 109b
299f, trình tự hướng dẫn 300, Bỏ phiếu, 561.e6
độ trễ 323f, 296b Pop, 105
giai đoạn truy cập bộ nhớ, sơ đồ Quyền lực
300, 302 chu kỳ nhiều giờ, nút tốc độ đồng hồ và, 40
thắt hiệu suất 306, sơ đồ chu kỳ mã điều kiện, tính chất quan
đơn 352b, 306 giai đoạn, 283 trọng của D-11, D-17, hiệu
Lỗi284 suất 54, tương đối 352,
hai vấn đề tĩnh, giai đoạn ghi 41biêu42b
lại 343f, 300, 302 trừ304 Công suất v3.0, D-6
Đường ống, 11, 283 Sức mạnh3
Vang296 nâng cao, thanh ghi nhánh, hướng dẫn D-23,
352 lợi ích, 283 D-24 duy nhất, D-23, D-24 ,
các mối nguy kiểm soát, D-25f
các mối nguy dữ liệu
291222294, các trường
hợp ngoại lệ 28822291 và,
thời gian thực hiện
PowerPC, D-7
Kiến trúc RISC, hướng dẫn
đơn 174.e4, hướng dẫn điều
khiển 231b, hướng dẫn truyền
dữ liệu D-19f, D-19f
Ngắt chính xác, Dự
đoán 339b, 11
Sơ đồ 2 bit, 331
độ chính xác, 331
nhánh động, 328
vòng332 và, trạng thái
ổn định 330b, 330b,
330b, 330b
Prefetching, 494, 568
Các loại nguyên thủy,
151.e25b Các cuộc gọi
thủ tục
bảo quản trên 110 thủ
tục, 104 trận114
biên dịch, 106b Từ 107b
biên dịch, hiển thị liên kết thủ tục
lồng nhau, 106b 1010107b
các bước thực hiện, 104
khung hình, 110
lá, 108
lồng nhau, 108b Từ 109b
đệ quy, 113b
để đặt mảng về 0, sắp xếp
148f, 142 trừ147
strcpy, bản sao chuỗi
116b11117b, hoán
đổi 116b11117b,
141 trừ142
Định danh quy trình, song
song cấp độ quy trình 459b,
Bộ xử lý 520
kiểm soát, 20 trận21
như lõi, 43
datapath, 19 trận20
xác định, 17b, 20
đa vấn đề động, 340 đa vấn đề,
thực hiện 340 đơn hàng, tăng
trưởng hiệu suất 353b, 429b, 44f
ROP, B-12, B-41
đầu cơ, 341 bóng342
đa vấn đề tĩnh, phát trực tuyến
340, 342 342347, B-34
superscalar, 347, 368.e3, 535 trừ536
công nghệ xây dựng, 25 trận28
hai vấn đề, 344
vectơ, 527 bóng534
VLIW, 342 bóng343
Sản phẩm, 194
Sản phẩm của các khoản tiền, A-11
I-18 Chỉ
số

Bộ đếm chương trình (PC), 261 thay Q Mảng dự phòng của các đĩa rẻ tiền
đổi với nhánh có điều kiện , (RAID), 479.e1
331b bóng332b Quad words, D- lịch sử, 479.e6
xác định, 105, 261 35THER D-36 RAID 0, 479.e3
ngoại lệ, 458b, 460 Quicksort, 425b, 426f RAID 1, 479.e4
tăng, 261, 263f Quotient, 200 RAID 2, 479.e4
cập nhật hướng dẫn, 298 bóng299 R RAID 3, 479.e4
Các yếu tố hiệu suất chương RAID 4, 479.e4
trình ảnh hưởng, hiểu biết Các hoạt động ALU định dạng RAID 5, 479.e5
39b, 40b, 9 R, loại R 263f, được xác định, RAID 6, 479.e6
Logic mảng lập trình (PAL), mảng 93b lây lan, 479.e5
logic lập trình A-77 (PLA) Bước hoàn thành hướng dẫn loại R trong tóm tắt, 479.e6
minh họa các dấu chấm thành phần, triển triển khai đa xe đạp, 282.e9 sử dụng số liệu thống kê, 479.e6f
khai chức năng điều khiển A-16f, C-7f , Hướng dẫn loại R, datapath 266b, Bit tham khảo, 449b
C-20 267b cho, 276 dat281 datapath Tài liệu tham khảo
được xác định, A-12 đang hoạt động cho, 278f tuyệt đối, 134
ví dụ, A-13bTHER A-14b Chủng tộc, A-72 loại, 151.e25b
minh họa, A-13f Sắp xếp Radix, 425b, 426f, B-63 Đăng ký địa chỉ, 125f
ROM và, A-15, A-16 Mã B-65 CUDA, triển khai B- Đăng ký phân bổ, 151.e10
kích thước, C-20 64f, B-63 B-65 Đăng ký địa chỉ hoãn lại, D-52
triển khai bảng chân lý, thiết bị RAID . Xem Mảng dư thừa Đăng ký bước tìm nạp trong xe đạp nhiều
logic lập trình A-13 (PLDs) , của đĩa rẻ tiền (RAID) bánh
A-77 RAM, 9 triển khai, 282.e8 Đăng ký tệp,
ROM lập trình (PROM), A-14 Bộ xử lý Raster (ROP), B-12, B-41, B- A-49b, A-53THER A-55 trong
Ngôn ngữ lập trình. Xem thêm ngôn ngữ 50 B-51 Verilog hành vi, A-56 được xác
cụ thể chức năng cố định, bộ đệm định, A-49b, A-53, 262
lịch sử ngắn gọn của, 174.e6 làm mới B-41 Raster, 18 đơn, 266b Vang267b
hướng đối tượng, 152 Rasterization, B-50 Nguy hai cổng đọc, A-54f với hai cổng đọc /
biến, 73 hiểm đọc sau khi ghi, 350 bộ một cổng ghi ,
Các chương trình nhớ chỉ đọc (ROM) , A-54f
ngôn ngữ lắp ráp, 132 A-14 bóng A-16 viết triển khai cổng, kiến trúc đăng
Tuyên truyền mục kiểm soát, C-16b, C-18b ký bộ nhớ A-55f, Đăng ký 174.e2,
được xác định, ví dụ mã hóa chức năng điều khiển, C-19 161 trừ162
A-39, siêu A-44b, A- công văn, C-25f kiến trúc, 334, 358
45b, A-40 thực hiện, C-15, C-19 cơ sở, 75b
Từ khóa được bảo vệ, Bảo mã hóa hàm logic, A-15 thời gian chu kỳ đồng hồ và, 73
vệ 151.e20 trên cao, C-18 biên dịch C gán với, 73b Từ74b
được xác định, thực PLA và, A-15, A-16 lập trình xác định, 73
hiện 441, cơ chế (PROM), tổng kích thước A- điểm đến, 272
458460460, 495.e12 14, C-15, C-16 điểm nổi, 229b
VM cho, 437 Chu kỳ đọc-cài, 413 nửa trái, 300
Nhóm bảo vệ, 479.e4 Đầu đọc viết, 395 bóng394 đặc điểm kỹ thuật số,
Pseudoinstructions Chế độ địa chỉ thực, D-31 bảng 262 trang, đường
định nghĩa, 132 Nhận tin nhắn thường xuyên, 552 ống 445, 317f, 321
tóm tắt, 133 Thủ tục đệ quy, 113b. Xem thêm nguyên thủy, 73 đổi tên,
Chủ đề Pthread (chủ đề Thủ tục 346bơi347b nửa phải,
POSIX), 563 hướng dẫn PTX, gọi nhân bản, 108 300
B-31 Từ khóa công khai, Kiến trúc máy tính tập lệnh (RISC) giảm, Các quy ước RISC-V,
151.e20 Đẩy 174.e4, 368.e3, D-4, D-7, D-22, D- tràn 275f, trạng thái 77b,
sử dụng, 108 26, D-27. Xem cũng RISC máy tính 78b, 335
xác định, 105 để bàn và máy chủ , RISC nhúng tạm thời, 73bTHER74b, biến
Con trăn loại nhóm, D-4 106b10107b, 73biêu74b
ma trận nhân với, 7 trận10, 48f Giảm hướng dẫn đặt máy tính Hiệu suất tương đối, 31b
(RISC), D-8 Sức mạnh tương đối, Độ
Giảm, 539b bóng541b tin cậy 41b, 42b, 431
Chỉ số I-19

Phần còn lại, được xác định, 200 RISC-V Gia hạn nén sd (lưu trữ ô chữ), 70f
Sắp xếp lại bộ đệm, 353b (Tiếp tục) Công cụ tìm kiếm, 4
Nhân rộng, 477 Hướng dẫn ALU, D-18f Bộ nhớ phụ, 23
Song song cấp yêu cầu, 555 bóng556 đến các nhánh có điều kiện, D-19f Các ngành, 396
Yêu cầu từ đầu tiên, 406b Từ407b cho các ứng dụng nhúng, D-6f Tìm kiếm, 397
Trạm đặt phòng truyền dữ liệu RISC nhúng Phân đoạn, 444b
bộ đệm hoạt động trong, 347 bóng348 hướng dẫn, D-18f Giá trị bộ chọn, A-10
được xác định, 347 bóng348 định dạng hướng dẫn, D-11, D-12f Công nghệ bán dẫn, 12
Thời gian đáp ứng, 30b đăng ký mã hóa cho tập hợp con 16 bit , Chất bán dẫn, 25
Hướng dẫn có thể khởi động lại, 461 D-8f Gửi tin nhắn thường xuyên, 552
Địa chỉ trả lại, 105 Mô hình mái, 565 bóng567, 566f, 569 Danh sách độ nhạy, A-23 cường A-24
Ripple mang với trần nhà, 570f Người tuần tự
adder, A-29 mái nhà tính toán, 566, 568 rõ ràng, C-32b
thực hiện chức năng nhà nước tiếp theo
mang tốc độ nhìn so với., A-45b minh họa, 566f với ,
RISC-V, 68, 91b Từ92b, D-3 Thế hệ Opteron, 567 bóng572 C-22 C-27
với các khu vực chồng chéo bóng mờ,
kiến trúc, 207f 571f Logic tuần tự, A-3 bóng A-4
Máy chủ, 479.e6. Xem thêm Máy tính để
hướng dẫn số học, 69 hiệu suất điểm nổi cao nhất, 570f bàn và
hướng dẫn số học / logic không có
trong , với hai hạt nhân, 571f RISC máy chủ
88f Độ trễ quay. Xem Độ trễ quay chi phí và khả năng, 5
hướng dẫn lắp ráp, lập bản đồ , Độ trễ quay, 397 Hoàn thành dịch vụ, 431
87b bóng88b Làm tròn, 229 Dịch vụ gián đoạn, 431
so sánh và chi nhánh có điều kiện, D-17 chính xác, 229 con231 Đặt ít hơn hướng dẫn (slt), A-31
Bộ nhớ cache liên kết, 416 bóng417. Xem
tổng hợp các báo cáo chuyển nhượng C bit, 231 thêm
vào, 71b với các chữ số bảo vệ, 230b Bộ nhớ cache
biên dịch phân công C phức tạp vào , Chế độ IEEE 754, 230 phần địa chỉ, 421f
Đơn hàng chính, 228b Từ 229b, 425
72b Từ427 chiến lược thay thế khối, 466 bóng467
hướng dẫn kiểm soát không có trong, D-
19f RV32, 79b lựa chọn, 465
thanh ghi điều khiển, 460b RV32G, D-4, D-5 bốn chiều, 418f, 421
đơn vị điều khiển, C-10 RV64, 79b vị trí khối bộ nhớ, 417f
hướng dẫn truyền dữ liệu không có
trong , RV64G, D-6 bỏ lỡ, 418b bóng420b
D-19f Hướng dẫn cốt lõi RV64G, D-11 n-way, 416 bóng417
chia thành, 206 phần mở rộng phổ biến ngoài , hai chiều, 418f
ngoại lệ trong, 334 bóng335 D-17 cường D-20 Thời gian thiết lập, A-52, A-53, A-53f
các lĩnh vực, 89 bóng95 so sánh và chi nhánh có điều kiện , sh (lưu trữ nửa từ), 70f
hướng dẫn dấu phẩy động, 223 bóng229 D-11 cường D-17 Bóng râm
lớp học hướng dẫn, 168f Hướng dẫn 16 bit lõi RV64GC, D-17 được xác định, B-14
mã hóa lệnh, 91f, 126f Phần mở rộng vector RV64V, D-26 số học dấu phẩy động, B-14
định dạng hướng dẫn, 127, 153f đồ họa, B-14 B-15
bộ hướng dẫn, 68, 172, 241, 254 , S ví dụ pixel, B-15, B-17
D-11 cường D-17 Độ bão hòa, 193b Ngôn ngữ tạo bóng, B-14
ngôn ngữ máy, 93 sb (cửa hàng byte), 70f Bóng tối, 479.e4
địa chỉ bộ nhớ, 74f Định dạng hướng dẫn kiểu SB, 121 Bộ nhớ dùng chung. Xem thêm Ký ức
phân bổ bộ nhớ cho chương trình và sc.d (cửa hàng có điều kiện), 70f bộ nhớ đệm trong, B-58 B-60
dữ liệu, 112f SCALAPAK, 239 CUDA, B-58
nhân lên, 198 Bộ nhớ dữ liệu vô hướng (Smem), 574 dưới dạng bộ nhớ có độ trễ thấp, B-21
Giả, 242f Thanh ghi vô hướng (Sregs), 574 N-body và, B-66f
đăng ký quy ước, 113f Thu nhỏ mỗi CTA, B-39
Kiến trúc RISC, 174.e4 mạnh mẽ, 525 Ngân hàng SRAM, B-40
hướng dẫn đơn, 231b yếu, 525 Bộ nhân bộ nhớ dùng chung (SMP) ,
vấn đề tĩnh nhiều với, 342 bóng347 Ký hiệu khoa học 537 bóng542
được xác định, 520 bóng521, 537
RISC-V Gia hạn nén thêm số vào, 216 bóng538
(RV64GC), D-4 xác định, 208 không gian địa chỉ vật lý duy nhất, 537
Phần mở rộng 16 bit, D-10 cho thực tế, 20820209 đồng bộ hóa, 538
Chỉ
I-20 số

Độ chính xác duy nhất. Xem thêm Nhân


Chuyển sang logic ngay lập tức (slli), 96 đôi Sắp xếp thủ tục, 142 bóng147. Xem thêm
Chuyển số học phải (srai), 96 độ chính xác Thủ tục
Chuyển ngay logic logic (srli), 96 đại diện nhị phân, 213b mã cho cơ thể, 143 bóng145
Dấu hiệu và cường độ, 209 xác định, 210 thủ tục đầy đủ, 146 bóng147
Ký bit, 83 Sơ đồ đường ống một chu kỳ đồng hồ , thông số truyền vào, 145
bảo quản sổ đăng ký trong, 145
Ký gia hạn, 264 307 con309 bóng146
xác định, 84b minh họa, 309f thủ tục gọi, 145
lối tắt, 84 Datapaths một chu kỳ. Xem thêm đăng ký phân bổ cho, 143
Tín hiệu Datapaths Hiệu suất sắp xếp, B-54 B-55
khẳng định, A-4, 260 minh họa, 297f Phân bổ không gian
kiểm soát, 260 thực hiện hướng dẫn, 298f trên đống, 111 bóng114
đã khử, A-4, 260 Thực hiện một chu kỳ trên ngăn xếp, 110 bóng111
Bộ phận đã ký, 203 bóng205 chức năng điều khiển cho, 281 SPARC, D-20, D-21
Đã ký nhân, 198 không sử dụng, 282 bóng283 hủy bỏ chi nhánh, D-19 cường D-20
thực hiện không đường ống so với.
Số đã ký, 80 bóng87 đường ống nhánh có điều kiện, 154 bóng155
dấu hiệu và cường độ, 81 thực hiện, 286f bẫy nhanh, D-21
coi là không dấu, 101 bóng102 phạt đền, 282 hướng dẫn, D-20, D-22
hiệu suất đường ống so với., 285b
Ý nghĩa, 210 bóng211 bóng286b bit ít quan trọng nhất, D-22f
ngoài ra, 215 bóng218 Đa luồng đơn hướng dẫn cửa sổ đăng ký, D-20, D-21
nhân, 218 con223 (SIMT), B-27 B-29 hỗ trợ cho LISP và Smalltalk ,
Silicon, 25 lập kế hoạch cong vênh đa luồng, B-28f D-21 cường D-22
Chi nhánh của SPARC, chi nhánh của D-
thỏi pha lê, 26 trên cao, B-35 19, D-20
xác định, 25 kiến trúc bộ xử lý, B-28, B-29 SPARC v.9, D-6
là công nghệ phần cứng quan trọng, 54 thực hiện sợi dọc và phân kỳ , hướng dẫn kiểm soát, D-19f
tấm wafer, 26 B-29 B-30 hướng dẫn truyền dữ liệu, D-19f
Thỏi tinh thể silicon, 26 Nhiều dữ liệu chương trình đơn (SPMD) , hướng dẫn, D-20, D-22
SIMD (Nhiều dữ liệu hướng dẫn đơn) , B-22 SPARC64
526 bóng527, 586 sll (shift trái logic), 70f hướng dẫn đơn, 231b
máy tính, 587.e1 slli (shift trái logic ngay lập tức), 70f SPARCv9, D-21
vectơ dữ liệu, B-35 Smalltalk, D-21 cường D-22 hướng dẫn, D-23f
phần mở rộng, 587.e3 Smalltalk-80, 174.e7 Ma trận thưa thớt, B-55, B-58
đa xử lý song song , Điện thoại thông minh, 6 trận7 Ma trận-Vector thưa thớt nhân (SpMV) ,
587.e1 Giao thức Snooping, 477 bóng479 B-55, B-57f, B-58
quy mô nhỏ, 587.e2 Bộ đệm bộ đệm Snoopy, 480.e16 Phiên bản CUDA, B-57f
kiến trúc vector, 527 bóng530 Phần mềm mã nối tiếp, B-57f
trong x86, 528 lớp, 13f phiên bản bộ nhớ dùng chung, B-59f
Tiện ích mở rộng SIMD, D-26, D-26f bộ đa xử lý, 520 Địa phương không gian, 388
hướng dẫn số học, D-27, D-27f song song, 521 khai thác khối lớn, 405
logic, bitwise, permute và pack / như dịch vụ, 7, 555 bóng556, 586 xu hướng, 391b
hướng dẫn giải nén, D-28f hệ thống, 13 ĐẶC BIỆT, 54.e10
SIMM (mô-đun bộ nhớ nội tuyến đơn) , Tối ưu hóa phần mềm thông qua chặn , Điểm chuẩn CPU, 46 bóng48
495.e4, 495.e5f 425 con430 điểm chuẩn sức mạnh, 48 bóng49
Thiết bị logic lập trình đơn giản sắp xếp, D-61 cường D-64 ĐẶC BIỆT, 54.e10
(SPLD), A-77 mã cho cơ thể của thủ tục sắp xếp , ĐẶC BIỆT, 54.e11
Đơn giản, 71 D-61 cường D-64 ĐẶC BIỆT, 54.e11
Đa luồng đồng thời (SMT), 535 sắp xếp thủ tục đầy đủ, D-64 ĐẶC BIỆT, 563
MIPS32 so với. Phiên bản lắp ráp
hỗ trợ, 535f VAX , Đặc biệt, 47
Các đơn vị chức năng đặc biệt (SFU), B-
song song cấp độ sợi, 535 D-65f 35, B-50
khe vấn đề chưa sử dụng, 535f bảo quản sổ đăng ký trên thủ tục được xác định, B-42 B-43
Sửa lỗi đơn / Lỗi kép cầu khẩn, D-64 Đầu cơ, 341 bóng342
sửa lỗi (SEC / DEC), 432 trừ436 đăng ký phân bổ, D-61 dựa trên phần cứng, 351b
Dữ liệu đơn hướng dẫn (SISD), 527 Sắp xếp các thuật toán, 148f thực hiện, 341
Chỉ số I-21

Đầu cơ (Tiếp tục) Yếu tố nhà nước (Tiếp tục) Luồng chuẩn, 571b
hiệu suất và, 341 đăng ký tập tin, A-49b Bộ nhân truyền phát (SM), B-25
Bộ xử lý phát trực tuyến, B-34, B-49, B-
vấn đề, 342 trong hướng dẫn lưu trữ / truy cập, 262f 50
cơ chế phục hồi, 341 bóng342 Dự đoán nhánh tĩnh, 342 mảng (SPA), B-41, B-46
Thử thách tăng tốc Phân đoạn dữ liệu tĩnh, 111 Truyền phát SIMD mở rộng 2 (SSE2)
cân bằng tải, 525b Vang526b Bộ xử lý đa vấn đề tĩnh, 340 , kiến trúc điểm nổi, 234
Truyền phát phần mở rộng SIMD (SSE)
vấn đề lớn hơn, 525b 342 con347. Xem thêm Nhiều vấn đề và
phần mở rộng vector nâng cao trong
Thanh ghi tràn, 77b Từ78b, 105 kiểm soát các mối nguy hiểm và, 343 x86 ,
Bộ nhớ cache, 411b bộ hướng dẫn, 342 234 con238
sra (thay đổi số học bên phải), 70f với RISC-V ISA, 342 trừ347 Máy tính căng, 365.e1, 365.e2f
srai (thay đổi số học ngay lập tức), 70f Bộ nhớ truy cập ngẫu nhiên tĩnh (SRAM) , Dây
srl (shift phải logic), 70f A-57 bóng A-66, 392 định nghĩa, 115
srli (thay đổi logic ngay lập tức), 70f tổ chức mảng, A-61f trong Java, 117 bóng119
SSE, D-32 cấu trúc cơ bản, A-60f đại diện, 114f
SSE2, D-32 được xác định, 21, A-57, A-59 Khai thác dải, 530b
Kiến trúc ngăn xếp, 174.e3 thời gian truy cập cố định, A-57 Sọc, 479.e3
Con trỏ ngăn xếp, D-56, D-58 lớn, A-58 Quy mô mạnh, 525
Con trỏ ngăn xếp đọc / ghi bắt đầu, A-58 Nguy cơ cấu trúc, 288, 304
điều chỉnh, 108 đồng bộ (SSRAM), A-59 phụ (trừ), 70f
xác định, 105 bộ đệm ba trạng thái, A-58, A-59f Subnormals, 233b
giá trị, 107f Biến tĩnh, 110b Phép trừ, 190 bóng193. Xem thêm
Ngăn xếp Dự đoán trạng thái ổn định, 330b Từ 331b Số học
phân bổ không gian trên, 110 trận111 Bit dính, 231 nhị phân, 190b Từ191b
cho các đối số, 105 Độ dốc gốc Stochastic (SGD), 521 , điểm nổi, 223
xác định, 105 572 bóng573 số âm, 192
pop, 105 Lưu trữ bộ đệm, 353b tràn, 192
đẩy, 105, 108 Cửa hàng byte, 115 Song song Subword, 233 bóng234
Các quầy hàng, 289 Lưu trữ ô kép, 76 và nhân ma trận, 363 bóng365
tránh sắp xếp lại mã , Hướng dẫn lưu trữ. Xem thêm Tải Tổng số sản phẩm, A-11, A-12b
290b bóng291b hướng dẫn Máy tính siêu máy tính, 368.e2
Verilog hành vi với phát hiện , truy cập, B-41 định nghĩa, 5
365.e3 đăng ký cơ sở, 272 Siêu sao
mối nguy dữ liệu và, 321 Từ325 biên dịch với, 77b được xác định, 347, 368.e3
hình minh họa, 365.e20 có điều kiện, 129 bóng130 lập kế hoạch đường ống động, 347
chèn vào đường ống, 324f xác định, 77 tùy chọn đa luồng, 526 bóng527
sử dụng tải, 326 Giai đoạn EX, 304f Giám sát ngoại lệ Nguyên nhân Đăng ký
bộ nhớ, 413 Giai đoạn ID, 301f (SCAUSE), 334
như một giải pháp để kiểm soát nguy cơ,
291 Vang294 NẾU giai đoạn, 301f Giám sát chương trình ngoại lệ truy cập
viết đệm, 413 phụ thuộc vào hướng dẫn, 320b Từ 321b (SEPC), 334, 460
sơ đồ viết lại, 413 Giai đoạn MEM, 320 nắm bắt địa chỉ, 337
Phụ tùng chờ, 479.e6 đơn vị thực hiện, 265f định nghĩa, 336
Tiểu bang Giai đoạn WB, 320 trong xác định khởi động lại, 334
Giám sát viên ngoại lệ trả lại (bí mật),
trong sơ đồ dự đoán 2 bit, 331 Lưu trữ từ, 76 458b
chuyển nhượng, A-69, C-27 Cửa hàng hai từ có điều kiện, 129 Từ130 Trang giám sát Đăng ký cơ sở
Từ có điều kiện trong cửa hàng, 129
bit, C-8 C-20 Từ130 (SPTBR), 448f
ngoại lệ, tiết kiệm / khôi phục, 461b
Từ462b Lưu trữ khái niệm chương trình, 69 Giám sát bẫy Vector (STVEC), 339b
thành phần logic, 259 theo nguyên tắc máy tính, 94b Bề mặt, B-41
đặc điểm kỹ thuật của, 445b minh họa, 94f sw (từ cửa hàng), 70f
Yếu tố nhà nước nguyên tắc, 172 trao đổi, D-58
đồng hồ và, 259 Thủ tục Strcpy, 116b Từ117b. Xem thêm mã cho cơ thể của trao đổi thủ tục ,
logic tổ hợp và, 259 Thủ tục D-58 bóng D-60
được xác định, A-47, 258 làm thủ tục lá, 117 trao đổi thủ tục đầy đủ, D-60
đầu vào, 259 con trỏ, 116b Từ117b MIPS so với. Lắp ráp VAX, D-60f
Chỉ
I-22 số

hoán đổi (Tiếp tục) Sổ đăng ký tạm thời, 73b Từ74b , TLB bỏ lỡ, 452. Xem thêm Dịch-
bảo quản sổ đăng ký trên thủ tục 106b bóng107b bộ đệm lookaside (TLB)
cầu nguyện, D-59 cường D-60 Đơn vị xử lý kiểm duyệt (TPU) , xử lý, 460 bóng462
đăng ký phân bổ, D-58 550 bóng552 xảy ra, 460
Thủ tục hoán đổi, 141 bóng142. Xem thêm Sơ đồ khối TPUv1, 521f vấn đề, 463b
Thủ tục Hàng chục, 573 Thuật toán Tomasulo, 368.e2
mã cơ thể, 141 bóng142 sơ đồ khối, 527f Màn hình cảm ứng, 19
đầy đủ, 142, 146 Từ147 khối, 522 Động vật ăn thịt chi nhánh giải đấu, 331
đăng ký phân bổ, 141 Terabyte (TB), 6f TPUv1
Trao đổi không gian, 448 định nghĩa, 5 tính năng xử lý khóa, 533f
Bảng biểu tượng, 133 Bộ nhớ kết cấu, B-40 TPUv3, 525
Đồng bộ hóa, 128 bóng131 Cụm kết cấu / bộ xử lý (TPC) , so sánh điều chỉnh, 536f
kiến trúc đặc trưng cho miền so với.
rào cản, B-18, B-20, B-34 B-47 Volta
xác định, 538 Bộ nhân TFLOPS, 587.e4 GPU, 576 bóng577
khóa, 128 Đập mạnh, 463b tính năng xử lý khóa, 533f
trên không, giảm, 44 bóng45 Khối chủ đề, 546f hiệu suất, 527 bóng534, 538f
mở khóa, 128 sáng tạo, B-23 mái nhà, 535f
Đồng bộ hóa được xác định, B-19 siêu máy tính, 532f, 573
từ D flip-flop, A-75f quản lý, B-30 tỷ lệ siêu máy tính, 539f
được xác định, A-75 chia sẻ bộ nhớ, B-20, B-21 Top500 và Green500, 544f
thất bại, A-75 bóng A-76 đồng bộ hóa, B-20 B-21 Bài hát, 396
DRAM đồng bộ (SRAM), A-59 , Chủ đề song song, B-22 Thời gian chuyển nhượng, 397
A-64, 393 Chủ đề Transitor, 25
SRAM đồng bộ (SSRAM), A-59 sáng tạo, B-23 Bộ đệm dịch-lookaside (TLB) ,
451 bóng453, 495.e5. Xem thêm
Hệ thống đồng bộ, A-47, A-48 CUDA, B-36 TLB
Cây cú pháp, 151.e2 ISA, B-31, B-34 bỏ lỡ
Phần mềm hệ thống, 13 quản lý, B-30 liên kết, 453
SystemVerilog độ trễ bộ nhớ và, B-74b minh họa, 452f
bộ điều khiển bộ đệm, 480.e1 nhiều, mỗi cơ thể, B-68, B-72 tích hợp, 456
dữ liệu bộ đệm và mô-đun thẻ, 480.e16 sợi dọc, B-27 B-28 Intrinsity FastMATH, 453 bóng456
FSM, 480.e6f Mô hình ba Cs, 468 bóng470 giá trị điển hình, 453
Truyền trình điều khiển và thời gian phần
sơ đồ khối bộ đệm đơn giản, 480.e3f Bộ đệm ba trạng thái, A-58, A-59f cứng của NIC
so với. nhận trình điều khiển và
khai báo kiểu, 480.e1f Thông lượng phần cứng NIC
T xác định, 30 thời gian, 561.e7f
nhiều vấn đề và, 340 Quét song song trên cây, B-62f
Máy tính bảng, 7f đường ống và, 283 bóng284 Phụ thuộc dữ liệu thực sự, 346, 350, 352
Thẻ Ngón cái, D-6, D-12f Bàn chân lý, A-5
định nghĩa, 399 Thumb-2, D-4, D-6 Đường điều khiển ALU, C-5f
trong khối định vị, 420 bóng421 Phần mở rộng 16 bit, D-10, D-12f đối với bit điều khiển, 271
bảng trang và, 448 Hướng dẫn ALU, D-18f đầu ra điều khiển datapath, C-17f
kích thước của, 423b đến các nhánh có điều kiện, D-19f tín hiệu điều khiển datapath, C-14f
Gọi đuôi, 113 cho các ứng dụng nhúng, D-6f định nghĩa, 271
Số nhận dạng nhiệm vụ, 459b truyền dữ liệu RISC nhúng ví dụ, A-5b
Song song nhiệm vụ, B-24 hướng dẫn, D-18f bit đầu ra trạng thái tiếp theo, C-15f
Song song cấp độ nhiệm vụ, 520 hướng dẫn cho DSP, D-28, D-29f Triển khai PLA, A-13
đăng ký mã hóa cho tập hợp con 16
Tebibyte (TiB), 5 bit , Logic hai cấp, A-11, A-14
Telsa PTX ISA, B-31 D-8f Đồng hồ hai pha, A-74, A-74f
hướng dẫn số học, B-33 Thời gian Đại diện bổ sung hai, 82
đồng bộ hóa rào cản, B-34 đầu vào không đồng bộ, A-75 lợi thế, 83
Hướng dẫn luồng GPU, B-32f A-77 lối tắt phủ định, 84b Từ85b
hướng dẫn truy cập bộ nhớ, B-33, B-34 nhạy cảm với cấp độ, A-74, A-75 quy tắc, 87b
Địa phương tạm thời, 388 phương pháp luận, A-71 cường A-77 ký tắt mở rộng, 85b Từ 86b
xu hướng, 391b hai pha, A-74f Máy tính TX-2, 587.e3
Chỉ số I-23

ngụy biện và cạm bẫy, các nhà


đầu cơ toán hạng D-64, D-66, Kiến trúc VAX (Tiếp tục) toán hạng
U và chế độ địa chỉ ,
D-53f
Các nhánh vô điều kiện, 99b D-51 cường D-54
Underflow, 209 Unicode hoạt động, D-55 cường D-58
sắp xếp, D-61 cường D-64
bảng chữ cái, 117 trao đổi, D-58
định nghĩa, 117 Làn đường vectơ, 530
bảng chữ cái ví dụ, 118f Bộ xử lý vectơ (VPU), bộ xử lý 574
Kiến trúc GPU hợp nhất, B-10 B-11 Vector, 527 trừ534. Xem thêm
minh họa, B-11f Bộ xử lý
mảng bộ xử lý, B-11, B-12 so sánh mã thông thường, 529b
Truy cập bộ nhớ thống nhất (UMA), 538, Vang530b
B-9 hướng dẫn, 528 phần mở rộng
bộ đa xử lý, 538 đơn đa phương tiện529 và, 528 vô
vị hướng so với., 530 bóng531
cam kết, 347 bóng348, 353b Vectored ngắt, 334
điều khiển, 257 bóng258, 269 Verilog
bóng271, C-4THER C-7, C-10f, định nghĩa hành vi của RISC-V ALU,
C-12 A-25f
xác định, 230 định nghĩa hành vi với bỏ qua,
điểm nổi, 230 365.e4f
phát hiện nguy hiểm, 321 bóng322, định nghĩa hành vi với các quầy
324 hàng cho tải, 365.e6f
để thực hiện tải / lưu trữ, chức năng đặc điểm kỹ thuật hành vi, A-21,
đặc biệt 265f (SFU), B-35 , 365.e1 đặc điểm kỹ thuật hành vi của
B-42 B-43, B-50 xe đạp đa bánh
UNIVAC I, 54.e3, 54.e4f Thiết kế MIPS, đặc tả hành
UNIX, 174.e6, 495.e10, 495.e13, vi 365.e12f với
495.e14 AT & T, 495.e14 mô phỏng, 365.e1
Phiên bản Berkeley (BSD), đặc điểm kỹ thuật hành vi với gian
thiên tài 495.e14, 495.e16 hàng
lịch sử, 495.e13, 495.e14 phát hiện, 365.e3
Mở khóa đồng bộ hóa, 128 đặc điểm kỹ thuật hành vi với tổng
số chưa ký, 80 Quay87 Sử hợp, 365.e8
dụng độ trễ chặn chuyển nhượng, A-24
xác định, 344 thực hiện logic nguy hiểm chi nhánh,
một hướng dẫn, 344 365.e8
logic tổ hợp, kiểu dữ liệu A-23,
V A-26, A-21, A-23 được xác
Ống chân không, 25f định, A-20, A-21
Bit hợp lệ, 399 triển khai chuyển tiếp, mô-đun
Phân bổ biến, D-58 365.e3, A-23f
Biến datapath đa xe đạp, gán không
Ngôn ngữ C, 110b chặn 365.e14f, toán tử A-24, cấu
ngôn ngữ lập trình, 73 trúc chương trình A-21, A-23, A-
đăng ký, 73 23
tĩnh, 110b reg, A-21
lớp lưu trữ, 110b Định nghĩa ALU của RISC-V
loại, 110b trong, A-36, A-37
Kiến trúc VAX, 174.e3, 495.e6, D-3, danh sách độ nhạy, đặc tả logic
D-50THER D-51 tuần tự A-23, A-24 ,
các lớp hướng dẫn VAX, hướng A-55 bóng A-57
dẫn VAX mã hóa D-57f , đặc điểm kỹ thuật kết cấu,
D-54 bóng D-55 dây A-21, A-21, A-22
Mã vi mô dọc, C-32
Tích hợp quy mô rất lớn (VLSI)
mạch, 25
Từ hướng dẫn rất dài (VLIW) được
xác định, 342
máy tính thế hệ đầu tiên, bộ xử
lý 368.e4, 342
VHDL, A-20, A-21
Bộ điều khiển mảng đồ họa video
(VGA), B-3 B-4
Địa chỉ ảo gây ra lỗi
trang, được xác định
461, ánh xạ 441442 từ,
kích thước 4414442,
443
Màn hình máy ảo (VMM)
định nghĩa, 437
thực hiện, 492
thái độ laissez-faire, 492
bảng trang, 462b
trong cải thiện hiệu suất, 440 yêu
cầu, 438 bóng439
Máy ảo (VM), 436 lợi
ích440440, 437
ảo ảnh, 440b
hướng dẫn đặt hỗ trợ kiến trúc,
440
cải thiện hiệu suất, 440 để cải thiện
bảo vệ, 437 Bộ nhớ ảo, 440 trừ464.
Xem thêm
Trang
dịch địa chỉ, tích hợp 441 bóng442,
tích hợp 451 bóng453, 456 bóng458
đối với các địa chỉ ảo lớn, cơ chế
449450450, 463
động lực, lỗi 440 trang441,
4414444, triển khai bảo vệ 447,
phân đoạn 458460460, tóm tắt
444b, 462 Lỗi464
ảo hóa, 462b
viết, 451
Phần cứng ảo hóa, 439
Bộ nhớ cache được xử lý theo địa chỉ,
457b Từ 458b
Điện toán trực quan, B-3
Bộ nhớ dễ bay hơi, 23
W
Tấm wafer, 26
khuyết điểm, 27
chết, 27
năng suất, 27
Máy tính quy mô kho (WSC), 7, 552
bóng557, 586
Chỉ
I-24 số

Máy tính quy mô kho (WSC), 520 lợi thế, 467 x86 (Tiếp tục)
Warps, B-27 B-28 giao thức kết hợp bộ đệm, 480.e4 lịch sử ngắn gọn, 174.e5
Quy mô yếu, 525 độ phức tạp, 409 kết luận, 166
Mặc san lấp mặt bằng, 395 xác định, 408, 467 chế độ địa chỉ dữ liệu, 161 Từ162
Trong khi các vòng lặp, 100b101b quầy hàng, 413 tiến hóa, 158 bóng160
Cơn lốc, 495.e1 viết bộ đệm, 409b mã hóa địa chỉ đầu tiên, 166f
Mạng diện rộng (WAN), 24. Xem thêm Giai đoạn viết lại mã hóa lệnh, 165 bóng166
Mạng đường dây điều khiển, 312f định dạng hướng dẫn, 165f
Các toán hạng rộng ngay lập tức, 120
trận121 hướng dẫn tải, 302 hướng dẫn thiết lập tăng trưởng, 174f
Từ, D-35 Từ D-36 hướng dẫn lưu trữ, 304 loại hướng dẫn, 164f
truy cập, 74 Chu kỳ viết, 413 số nguyên hoạt động, 163
Bộ nhớ cache ghi qua. Xem thêm Bộ nhớ
xác định, 73 cache đăng ký, 161 bóng162
gấp đôi, 163 lợi thế, 467 SIMD trong, 526 bóng527
Truyền phát phần mở rộng SIMD vào,
tải, 75, 77 xác định, 408, 467 234 Từ238
quad, 163 thẻ không phù hợp, 409b hướng dẫn / chức năng điển hình, 165f
cửa hàng, 77b bóng78b Viết hoạt động điển hình, 164f
Bộ làm việc, 463b biến chứng, 409b duy nhất, 155 bóng157
World Wide Web, 4 chi phí, 463 Máy tính Xerox Alto, 54.e7
Trường hợp xấu nhất trì hoãn, 282 xử lý, 408 bóng409 XMM, 234
xử lý hệ thống phân cấp bộ nhớ của,
Viết bộ đệm 352b xor (độc quyền hoặc), 70f
xác định, 409b đề án, 408 xori (độc quyền hoặc ngay lập tức), 70f
quầy hàng, 408 bộ nhớ ảo, 450 Y
bộ nhớ cache ghi lại, 409b bộ nhớ cache ghi lại, 408 Yahoo! Điểm chuẩn phục vụ đám mây
Viết giao thức vô hiệu, 477 bộ nhớ cache ghi qua, 408 (YCSB) ,
Viết tuần tự hóa, 476 bóng477 563
Nguy hiểm ghi sau khi đọc (nguy cơ
WAR) , Năng suất, 27
350 X YMM, 235
Viết sau khi ghi (nguy cơ WAW) , x86, 158 bóng166
350 Phần mở rộng Vector nâng cao trong , Z
Bộ nhớ cache ghi lại. Xem thêm Bộ nhớ
cache 234 con238 Zettabyte, 6f
TRANG NÀY TUYỆT VỜI TRÁI CÂY

?? ?? ??
TRANG NÀY TUYỆT VỜI TRÁI CÂY

?? ?? ??
TRANG NÀY TUYỆT VỜI TRÁI CÂY

?? ?? ??
B
A P P E N D TÔI X
Đồ họa và GPU
điện toán
John Nickolls
Trí tưởng tượng Giám đốc kiến trúc
quan trọng hơn NVIDIA
kiến thức. David Kirk
Nhà khoa học trưởng
Albert Einstein
NVIDIA
Về khoa học, những năm 1930
B.1 Giới thiệu B-3

B.1 Giới thiệu B-3


B.2 Kiến trúc hệ thống GPU B-7
B.3 Lập trình GPU B-12
B.4 Kiến trúc đa xử lý đa luồng B-25
B.5 Hệ thống bộ nhớ song song B-36
B.6 Số học điểm nổi B-41
B.7 Đồ thật: NVIDIA GeForce 8800 B-46
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-55
B.9 Ngụy biện và Cạm bẫy B-72
B.10 Kết luận B-76
B.11 Quan điểm lịch sử và đọc thêm B-77

B.1 Giới thiệu

Phụ lục này tập trung vào GPUPhổ biến có mặt khắp nơi đơn vị xử lý đồ họa trong đơn vị xử lý đồ họa
mỗi PC, máy tính xách tay, máy tính để bàn và máy trạm. Ở dạng cơ bản nhất, GPU (GPU) Một bộ xử lý
tạo ra đồ họa, hình ảnh và video 2D và 3D cho phép hệ điều hành dựa trên Cửa sổ, được tối ưu hóa cho đồ
giao diện người dùng đồ họa, trò chơi video, ứng dụng hình ảnh trực quan và video. họa 2D và 3D, video, điện
toán hình ảnh và hiển thị.
GPU hiện đại mà chúng tôi mô tả ở đây là một bộ đa xử lý song song, rất đa luồng
được tối ưu hóa cho điện toán trực quan Để cung cấp tương tác trực quan thời gian điện toán trực quan
thực với các đối tượng được tính toán thông qua đồ họa, hình ảnh và video, GPU có Một hỗn hợp về xử lý đồ
họa và điện toán cho phép
kiến trúc đồ họa và điện toán thống nhất, đóng vai trò là bộ xử lý đồ họa có thể lập
bạn tương tác trực quan
trình và nền tảng điện toán song song có thể mở rộng. PC và máy chơi game kết hợp với các đối tượng được
GPU với CPU để tạo thành. hệ thống không đồng nhất. tính toán thông qua đồ
họa, hình ảnh và video.
Lịch sử tóm tắt về sự tiến hóa GPU
Mười lăm năm trước, không có thứ gọi là GPU. Đồ họa trên PC được thực hiện hệ thống không đồng
bởi a mảng đồ họa video Bộ điều khiển (VGA). Bộ điều khiển VGA chỉ đơn giản nhất Một hệ thống kết
là bộ điều khiển bộ nhớ và bộ tạo hiển thị được kết nối với một số DRAM. Vào hợp các loại bộ xử lý
khác nhau. PC là một hệ
những năm 1990, công nghệ bán dẫn đã tiến bộ đầy đủ để có thể thêm nhiều chức thống GPU CPU không
năng vào bộ điều khiển VGA. Đến năm 1997, bộ điều khiển VGA đã bắt đầu kết đồng nhất.
hợp một số ba chiều (3D) chức năng tăng tốc, bao gồm
B-4 Phụ lục B Đồ họa và GPU điện toán

phần cứng để thiết lập tam giác và rasterization (tạo hình tam giác thành từng
pixel) và ánh xạ và tạo bóng kết cấu (áp dụng các đề can của cải tiến hoặc các
mẫu cho pixel và pha trộn màu sắc).
Năm 2000, bộ xử lý đồ họa chip đơn kết hợp hầu hết mọi chi tiết của đường
ống đồ họa máy trạm cao cấp truyền thống và do đó, xứng đáng có một tên mới
ngoài bộ điều khiển VGA. Thuật ngữ GPU được đặt ra để biểu thị rằng thiết bị
đồ họa đã trở thành bộ xử lý.
Theo thời gian, GPU trở nên có thể lập trình hơn, vì các bộ xử lý có thể lập
trình thay thế logic chuyên dụng chức năng cố định trong khi duy trì tổ chức
đường ống đồ họa 3D cơ bản. Ngoài ra, các tính toán trở nên chính xác hơn theo
thời gian, tiến triển từ số học được lập chỉ mục, đến số nguyên và điểm cố định,
đến điểm nổi chính xác đơn và gần đây đến điểm nổi chính xác kép. GPU đã trở
thành bộ xử lý lập trình song song với hàng trăm lõi và hàng ngàn luồng.
Gần đây, các hướng dẫn bộ xử lý và phần cứng bộ nhớ đã được thêm vào để hỗ
trợ các ngôn ngữ lập trình mục đích chung và môi trường lập trình được tạo để
cho phép GPU được lập trình bằng các ngôn ngữ quen thuộc, bao gồm C và C ++.
Sự đổi mới này làm cho GPU trở thành một bộ xử lý đa năng, có thể lập trình, đa
năng, mặc dù vẫn có một số lợi ích và hạn chế đặc biệt.

Xu hướng đồ họa GPU


GPU và trình điều khiển liên quan của họ triển khai các mô hình xử lý đồ họa
OpenGL và DirectX. OpenGL là một tiêu chuẩn mở cho lập trình đồ họa 3D có sẵn
cho hầu hết các máy tính. DirectX là một loạt các giao diện lập trình đa phương tiện
của Microsoft, bao gồm Direct3D cho đồ họa 3D. Vì những điều này giao diện lập
trình ứng dụng (API) có hành vi được xác định rõ, có thể xây dựng khả năng tăng
ứng dụng tốc phần cứng hiệu quả của các chức năng xử lý đồ họa được xác định bởi các API.
giao diện lập trình Đây là một trong những lý do (ngoài việc tăng mật độ thiết bị) tại sao GPU mới được
(API) Một tập hợp các phát triển cứ sau 12 đến 18 tháng, tăng gấp đôi hiệu suất của thế hệ trước trên các ứng
chức năng dụng hiện có.
và cấu trúc dữ liệu
định nghĩa cung cấp một
Việc nhân đôi hiệu suất GPU thường xuyên cho phép các ứng dụng mới mà
giao diện đến một thư trước đây không thể thực hiện được. Giao điểm của xử lý đồ họa và điện toán
viện của song song mời một mô hình mới cho đồ họa, được gọi là điện toán hình ảnh. Nó
chức năng. thay thế các phần lớn của mô hình đường ống đồ họa phần cứng tuần tự truyền
thống bằng các yếu tố có thể lập trình cho các chương trình hình học, đỉnh và
pixel. Điện toán trực quan trong GPU hiện đại kết hợp xử lý đồ họa và tính toán
song song theo những cách mới cho phép các thuật toán đồ họa mới được triển
khai và mở ra cơ hội cho các ứng dụng xử lý song song hoàn toàn mới trên GPU
hiệu suất cao phổ biến.

Hệ thống không đồng nhất


Mặc dù GPU được cho là bộ xử lý song song và mạnh nhất trong một PC thông
thường, nhưng nó chắc chắn không phải là bộ xử lý duy nhất. CPU, hiện đa lõi

B.1 Giới thiệu B-5

sớm trở thành nhiều lõi, là một bộ xử lý nối tiếp bổ sung, chủ yếu đồng hành với
GPU nhiều lõi song song. Cùng với nhau, hai loại bộ xử lý này bao gồm một hệ
thống đa bộ xử lý không đồng nhất.
Hiệu suất tốt nhất cho nhiều ứng dụng đến từ việc sử dụng cả CPU và GPU.
Phụ lục này sẽ giúp bạn hiểu cách thức và thời điểm phân chia công việc tốt nhất
giữa hai bộ xử lý ngày càng song song này.

GPU phát triển thành Bộ xử lý song song có thể mở rộng


GPU đã phát triển chức năng từ các bộ điều khiển VGA có khả năng hạn chế, cứng
cho đến các bộ xử lý song song có thể lập trình. Sự phát triển này đã được tiến hành
bằng cách thay đổi đường ống đồ họa logic (dựa trên API) để kết hợp các yếu tố có
thể lập trình và cũng bằng cách làm cho các giai đoạn đường ống phần cứng cơ bản ít
chuyên biệt hơn và có thể lập trình hơn. Cuối cùng, nó có ý nghĩa để hợp nhất các yếu
tố đường ống lập trình khác nhau thành một mảng thống nhất của nhiều bộ xử lý lập
trình.
Trong thế hệ GPU 8 dòng GeForce, xử lý hình học, đỉnh và pixel đều chạy trên
cùng một loại bộ xử lý. Sự thống nhất này cho phép khả năng mở rộng đáng kể.
Nhiều lõi xử lý lập trình hơn làm tăng tổng thông lượng hệ thống. Thống nhất các
bộ xử lý cũng cung cấp cân bằng tải rất hiệu quả, vì bất kỳ chức năng xử lý nào
cũng có thể sử dụng toàn bộ mảng bộ xử lý. Ở đầu kia của quang phổ, một mảng
bộ xử lý hiện có thể được xây dựng với rất ít bộ xử lý, vì tất cả các chức năng có
thể được chạy trên cùng một bộ xử lý.

Tại sao CUDA và GPU Máy tính?


Mảng bộ xử lý thống nhất và có thể mở rộng này mời một mô hình lập trình mới cho
GPU. Một lượng lớn công suất xử lý điểm nổi trong mảng bộ xử lý GPU rất hấp dẫn Điện toán GPU Sử
để giải quyết các vấn đề về đồ họa. Với mức độ song song lớn và phạm vi khả năng dụng GPU để tính toán
mở rộng của mảng bộ xử lý cho các ứng dụng đồ họa, mô hình lập trình cho tính toán thông qua ngôn ngữ lập
tổng quát hơn phải thể hiện trực tiếp sự song song lớn, nhưng cho phép thực thi có thể trình song song và API .
mở rộng.
Điện toán GPU là thuật ngữ được đặt ra để sử dụng GPU cho điện toán thông qua
a ngôn ngữ lập trình song song và API, không sử dụng API đồ họa truyền thống và GPGPU Sử dụng
mô hình đường ống đồ họa. Điều này trái ngược với trước đóMục đích chung tính GPU để tính toán mục
toán trên GPU (GPGPU) cách tiếp cận, bao gồm lập trình GPU sử dụng API đồ họa đích chung thông qua
và đường ống đồ họa để thực hiện các tác vụ đồ họa. API đồ họa truyền
thống và đường ống đồ
Tính toán kiến trúc thiết bị chưa sử dụng (CUDA) là một chương trình song
họa.
song có thể mở rộng mô hình và nền tảng phần mềm cho GPU và các bộ xử lý song
song khác cho phép lập trình viên bỏ qua API đồ họa và giao diện đồ họa của GPU CUDA Một khả năng
và chỉ đơn giản là lập trình trong C hoặc C ++. Mô hình lập trình CUDA có SPMD mở rộng mô hình lập
(nhiều chương trình dữ liệu) phong cách phần mềm, trong đó một lập trình viên viết trình song song và ngôn
một chương trình cho một luồng được tạo ra và thực hiện bởi nhiều luồng song song ngữ dựa trên C / C ++.
trên nhiều bộ xử lý của GPU. Trong thực tế, CUDA cũng cung cấp một cơ sở để lập Đây là một nền tảng lập
trình nhiều lõi CPU, vì vậy CUDA là môi trường để viết các chương trình song song trình song song cho GPU
và CPU đa lõi.
cho toàn bộ hệ thống máy tính không đồng nhất.
B-6 Phụ lục B Đồ họa và GPU điện toán

GPU Unifes Đồ họa và Máy tính


Với việc bổ sung CUDA và GPU vào các khả năng của GPU, giờ đây có thể sử
dụng GPU làm cả bộ xử lý đồ họa và bộ xử lý điện toán cùng một lúc và kết hợp
những sử dụng này trong các ứng dụng điện toán trực quan. Kiến trúc bộ xử lý cơ
bản của GPU được thể hiện theo hai cách: thứ nhất, khi triển khai API đồ họa có
thể lập trình và thứ hai, dưới dạng mảng bộ xử lý song song có thể lập trình theo
C / C ++ với CUDA .
Mặc dù các bộ xử lý cơ bản của GPU là thống nhất, nhưng không cần thiết tất
cả các chương trình luồng SPMD đều giống nhau. GPU có thể chạy các chương
trình bóng đồ họa cho khía cạnh đồ họa của GPU, xử lý hình học, đỉnh và pixel
và cũng chạy các chương trình luồng trong CUDA .
GPU thực sự là một kiến trúc đa bộ xử lý linh hoạt, hỗ trợ nhiều nhiệm vụ xử lý.
GPU rất xuất sắc về đồ họa và điện toán hình ảnh vì chúng được thiết kế dành riêng
cho các ứng dụng này. GPU cũng rất xuất sắc ở nhiều ứng dụng thông lượng đa năng
là anh em họ đầu tiên của đồ họa, trong đó chúng thực hiện rất nhiều công việc song
song, cũng như có nhiều cấu trúc vấn đề thông thường. Nói chung, chúng phù hợp với
các vấn đề song song dữ liệu (xem Chương 6), các vấn đề đặc biệt lớn, nhưng ít hơn
cho các vấn đề ít thường xuyên hơn, nhỏ hơn.

Ứng dụng tính toán trực quan GPU


Điện toán trực quan bao gồm các loại ứng dụng đồ họa truyền thống cộng với nhiều
ứng dụng mới. Mục đích ban đầu của GPU là bất cứ thứ gì có pixel, nhưng giờ đây
nó bao gồm nhiều vấn đề không có pixel nhưng với tính toán và / hoặc cấu trúc dữ
liệu thông thường. GPU có hiệu quả ở đồ họa 2D và 3D, vì đó là mục đích mà chúng
được thiết kế. Việc không cung cấp hiệu suất ứng dụng này sẽ gây tử vong. Đồ họa
2D và 3D sử dụng GPU trong chế độ đồ họa của nó, truy cập vào sức mạnh xử lý của
GPU thông qua các API đồ họa, OpenGL ™ và DirectX ™. Trò chơi được xây dựng
trên khả năng xử lý đồ họa 3D.
Ngoài đồ họa 2D và 3D, xử lý hình ảnh và video là những ứng dụng quan
trọng cho GPU. Chúng có thể được triển khai bằng cách sử dụng API đồ họa hoặc
dưới dạng các chương trình tính toán, sử dụng CUDA để lập trình GPU ở chế độ
tính toán. Sử dụng CUDA, xử lý hình ảnh đơn giản là một chương trình mảng
song song dữ liệu khác. Trong phạm vi truy cập dữ liệu là thường xuyên và có địa
phương tốt, chương trình sẽ hiệu quả. Trong thực tế, xử lý hình ảnh là một ứng
dụng rất tốt cho GPU. Xử lý video, đặc biệt là mã hóa và giải mã (nén và giải nén
theo một số thuật toán tiêu chuẩn), khá hiệu quả.
Cơ hội lớn nhất cho các ứng dụng điện toán trực quan trên GPU là để phá vỡ đường
ống đồ họa.GPU sớm chỉ triển khai các API đồ họa cụ thể, mặc dù hiệu suất rất cao. Điều
này thật tuyệt vời nếu API hỗ trợ các thao tác mà bạn muốn thực hiện. Nếu không, GPU
không thể tăng tốc nhiệm vụ của bạn, vì chức năng GPU sớm là không thể thay đổi. Giờ
đây, với sự ra đời của điện toán GPU và CUDA, các GPU này có thể được lập trình để
triển khai một đường ống ảo khác bằng cách viết một chương trình CUDA để mô tả tính
toán và luồng dữ liệu mong muốn. Vì vậy, tất cả các ứng dụng hiện có thể, sẽ kích thích
các phương pháp tính toán trực quan mới.
B.2 Kiến trúc hệ thống GPU B-7

B.2 Kiến trúc hệ thống GPU

Trong phần này, chúng tôi khảo sát các kiến trúc hệ thống GPU được sử dụng
phổ biến hiện nay. Chúng tôi thảo luận về cấu hình hệ thống, chức năng và dịch
vụ GPU, giao diện lập trình tiêu chuẩn và kiến trúc nội bộ GPU cơ bản.

Kiến trúc hệ thống CPU GPU không đồng nhất


Kiến trúc hệ thống máy tính không đồng nhất sử dụng GPU và CPU có thể được
mô tả ở mức cao bởi hai đặc điểm chính: thứ nhất, có bao nhiêu hệ thống con
chức năng và / hoặc chip được sử dụng và các công nghệ kết nối và cấu trúc liên
kết của chúng là gì; và thứ hai, những hệ thống con bộ nhớ có sẵn cho các hệ
thống con chức năng này. Xem Chương 6 cho nền trên các hệ thống I / O PC và
bộ chip.

PC lịch sử (khoảng năm 1990)


Hình B.2.1 hiển thị sơ đồ khối cấp cao của PC cũ, vào khoảng năm 1990. Phía bắc
cây cầu (xem Chương 6) chứa các giao diện băng thông cao, kết nối CPU, bộ nhớ và
bus PCI. Cầu phía nam chứa các giao diện và thiết bị cũ: bus ISA (âm thanh, LAN),
bộ điều khiển ngắt; Bộ điều khiển DMA; thời gian / quầy. Trong hệ thống này, màn
hình được điều khiển bởi một hệ thống con framebuffer đơn giản được biết đến

CPU

Xe buýt phía trước

Bắc
Ký ức
Cầu

Xe buýt PCI

Miền Nam VGA Khung


Cầu Bộ điều khiển Ký ức

VGA
LAN UART Hiển thị

HÌNH B.2.1 PC lịch sử . Bộ điều khiển VGA điều khiển hiển thị đồ họa từ bộ nhớ framebuffer.
B-8 Phụ lục B Đồ họa và GPU điện toán

là một VGA (mảng đồ họa video) được gắn vào bus PCI. Các hệ thống con đồ
họa có các yếu tố xử lý tích hợp (GPU) không tồn tại trong bối cảnh PC năm
PCI-Express (PCIe) 1990.
Một kết nối I / O hệ Hình B.2.2 minh họa hai sự nhầm lẫn trong sử dụng phổ biến ngày nay. Đây là
thống tiêu chuẩn sử
được đặc trưng bởi một GPU riêng (GPU rời) và CPU với các hệ thống con bộ nhớ
dụng các liên kết điểm-
điểm. tương ứng. Trong Hình B.2.2a, với CPU Intel, chúng ta thấy GPU được gắn qua làn
Liên kết có số làn đường 16 PCI-Express Liên kết 2.0 để cung cấp tốc độ truyền 16 GB / giây cao nhất (cực
và băng thông có thể đại 8 GB / giây theo mỗi hướng). Tương tự, trong Hình B.2.2b, với CPU AMD, GPU
định cấu hình.

Intel
CPU

Xe buýt phía
trước
x16 Liên kết PCI-Express

Bắc DDR2
trưng GPU
Cầu Ký ức
bày

x4 PCI-Express Link 128 bit


phái sinh 667 MT / s
GPU
Miền Nam
Ký ức
Cầu
(a)

AMD
CPU
CPU
cốt lõi

xe buýt nội 128 bit


bộ 667 MT / s

Bắc DDR2
Cầu Ký ức

x16 Liên kết PCI-


Express HyperTransport 1.03

GPU Chipset
trưng
bày

GPU
Ký ức

(b)
HÌNH B.2.2 PC đương đại có CPU Intel và AMD. Xem Chương 6 cho một lời giải thích về các
thành phần và kết nối trong hình này.
B.2 Kiến trúc hệ thống GPU B-9

được gắn vào chipset, cũng thông qua PCI-Express với cùng băng thông có sẵn.
Trong cả hai trường hợp, GPU và CPU có thể truy cập vào bộ nhớ khác, mặc dù
với băng thông ít có hơn so với quyền truy cập của chúng vào các bộ nhớ được
đính kèm trực tiếp hơn. Trong trường hợp của hệ thống AMD, cầu phía bắc hoặc
bộ điều khiển bộ nhớ được tích hợp vào cùng một khuôn với CPU .
Một biến thể chi phí thấp trên các hệ thống này, a kiến trúc bộ nhớ thống kiến trúc bộ nhớ
nhất (UMA) hệ thống, chỉ sử dụng bộ nhớ hệ thống CPU, bỏ qua bộ nhớ GPU thống nhất (UMA)
khỏi hệ thống. Các hệ thống này có GPU hiệu suất tương đối thấp, vì hiệu suất Một kiến trúc hệ thống
đạt được của chúng bị giới hạn bởi băng thông bộ nhớ hệ thống có sẵn và độ trễ trong đó CPU và GPU
truy cập bộ nhớ tăng lên, trong khi bộ nhớ GPU chuyên dụng cung cấp băng chia sẻ bộ nhớ hệ thống
chung.
thông cao và độ trễ thấp.
Một biến thể hệ thống hiệu suất cao sử dụng nhiều GPU đính kèm, thường là
hai đến bốn hoạt động song song, với màn hình được nối bằng cúc. Một ví dụ là
hệ thống đa GPU NVIDIA SLI (kết nối có thể mở rộng), được thiết kế để chơi
game và máy trạm hiệu suất cao.
Danh mục hệ thống tiếp theo tích hợp GPU với cầu phía bắc (Intel) hoặc
chipset (AMD) có và không có bộ nhớ đồ họa chuyên dụng.
Chương 5 giải thích cách bộ nhớ cache duy trì sự gắn kết trong một không
gian địa chỉ được chia sẻ. Với CPU và GPU, có nhiều không gian địa chỉ. GPU
có thể truy cập bộ nhớ cục bộ vật lý của riêng họ và bộ nhớ vật lý của hệ thống
CPU bằng cách sử dụng các địa chỉ ảo được dịch bởi MMU trên GPU. Nhân hệ
điều hành quản lý các bảng trang GPU. Một trang vật lý hệ thống có thể được
truy cập bằng các giao dịch PCI-Express mạch lạc hoặc không mạch lạc, được
xác định bởi một thuộc tính trong bảng trang GPU. CPU có thể truy cập bộ nhớ
cục bộ GPU, thông qua một phạm vi địa chỉ (còn gọi là khẩu độ) trong không
gian địa chỉ PCI-Express.

Bảng điều khiển trò chơi


Các hệ thống bảng điều khiển như Sony PlayStation 3 và Microsoft Xbox 360 giống
với các kiến trúc hệ thống PC được mô tả trước đây. Các hệ thống bảng điều khiển
được thiết kế để được vận chuyển với hiệu suất và chức năng giống hệt nhau trong
vòng đời có thể kéo dài năm năm trở lên. Trong thời gian này, một hệ thống có thể
được triển khai lại nhiều lần để khai thác các quy trình sản xuất silicon tiên tiến hơn
và do đó cung cấp khả năng liên tục với chi phí thấp hơn bao giờ hết. Các hệ thống
bảng điều khiển không cần phải mở rộng và nâng cấp các hệ thống con của chúng AGP Một phần mở rộng
theo cách mà các hệ thống PC làm, do đó, các bus hệ thống nội bộ chính có xu hướng phiên bản của bus I / O PCI
được tùy chỉnh thay vì tiêu chuẩn hóa. ban đầu, cung cấp băng
thông gấp tám lần so với
bus PCI ban đầu cho một
Giao diện GPU và Trình điều khiển khe cắm thẻ duy nhất. Mục
đích chính của nó là kết nối
Trong PC ngày nay, GPU được gắn vào CPU thông qua PCI-Express. Thế hệ các hệ thống con đồ họa
trước đã sử dụng AGPCác ứng dụng đồ họa gọi OpenGL [.Segal và Akeley, 2006] vào các hệ thống PC.
hoặc Direct3D [Microsoft DirectX Specifcation] Các chức năng API sử dụng
GPU làm bộ đồng xử lý. Các API gửi các lệnh, chương trình và dữ liệu tới GPU
thông qua trình điều khiển thiết bị đồ họa được tối ưu hóa cho GPU cụ thể .
B-10 Phụ lục B Đồ họa và GPU điện toán

Đường ống logic đồ họa


Các đường ống logic đồ họa được mô tả trong Mục B.3.Hình B.2.3 minh họa các
giai đoạn xử lý chính và làm nổi bật các giai đoạn lập trình quan trọng (giai đoạn
đỉnh, hình học và pixel).

Đầu vào Vertex Hình học Thiết lập Pixel Hoạt động raster /
Lắp ráp Shader Shader & Shader Sáp nhập đầu ra
Rasterizer
HÌNH B.2.3 Đường ống logic đồ họa. Các giai đoạn shader đồ họa có thể lập trình là màu xanh lam và các khối chức năng cố định có
màu trắng.

Ánh xạ đường ống đồ họa đến bộ xử lý GPU hợp nhất


Hình B.2.4 cho thấy các đường ống logic bao gồm độc lập riêng biệt các giai
đoạn lập trình được ánh xạ lên một mảng bộ xử lý phân tán vật lý.

Kiến trúc GPU thống nhất cơ bản


Kiến trúc GPU hợp nhất dựa trên một mảng song song của nhiều bộ xử lý có thể
lập trình. Chúng thống nhất xử lý đỉnh, hình học và pixel shader và tính toán song
song trên cùng một bộ xử lý, không giống như các GPU trước đó có bộ xử lý
riêng dành cho từng loại xử lý. Mảng bộ xử lý có thể lập trình được tích hợp chặt
chẽ với các bộ xử lý chức năng cố định để lọc kết cấu, raster hóa, vận hành raster,
khử răng cưa, nén, giải nén, hiển thị, giải mã video và xử lý video độ phân giải
cao. Mặc dù các bộ xử lý chức năng cố định vượt trội hơn đáng kể các bộ xử lý
lập trình tổng quát hơn về hiệu suất tuyệt đối bị hạn chế bởi một khu vực, chi phí
hoặc ngân sách điện, chúng tôi sẽ tập trung vào các bộ xử lý lập trình ở đây.
So với CPU đa lõi, nhiều GPU có một điểm thiết kế kiến trúc khác nhau, người
ta tập trung vào việc thực hiện nhiều luồng song song một cách hiệu quả trên
nhiều luồng

Đầu vào Vertex


Lắp ráp Shader

Hình học
Shader

Thiết lập Pixel Hoạt động raster /


& Shader Sáp nhập đầu ra
Rasterizer

Bộ xử lý thống
nhất
Mảng
HÌNH B.2.4 Đường ống logic được ánh xạ tới bộ xử lý vật lý. Các shader lập trình các giai đoạn
thực thi trên mảng các bộ xử lý thống nhất và luồng dữ liệu đường ống đồ họa logic tuần hoàn thông qua
các bộ xử lý.
B.2 Kiến trúc hệ thống GPU B-11

lõi xử lý. Bằng cách sử dụng nhiều lõi đơn giản hơn và tối ưu hóa cho hành vi
song song dữ liệu giữa các nhóm luồng, phần lớn ngân sách bóng bán dẫn trên
mỗi chip được dành cho tính toán và ít hơn cho bộ nhớ cache trên chip và trên
cao.

Bộ xử lý mảng
Một mảng bộ xử lý GPU thống nhất chứa nhiều lõi bộ xử lý, thường được tổ chức
thành các bộ đa xử lý đa luồng. Hình B.2.5 hiển thị GPU với một mảng 112 bộ xử
lý phát trực tuyến (SP) lõi, được tổ chức dưới dạng 14 đa luồng phát trực tuyến
bộ nhân (SM). Mỗi lõi SP có tính đa luồng cao, quản lý 96 chủ đề đồng thời và
trạng thái của chúng trong phần cứng. Các bộ xử lý kết nối với bốn phân vùng
DRAM rộng 64 bit thông qua mạng kết nối. Mỗi SM có tám lõi SP, hai đơn vị
chức năng đặc biệt (SFU), bộ nhớ hướng dẫn và bộ nhớ không đổi, đơn vị hướng
dẫn đa luồng và bộ nhớ dùng chung. Đây là kiến trúc Tesla cơ bản được thực hiện
bởi NVIDIA GeForce 8800. Nó có một kiến trúc thống nhất trong đó các chương
trình đồ họa truyền thống cho đỉnh, hình học và bóng pixel chạy trên các SM
thống nhất và lõi SP của chúng và các chương trình điện toán chạy trên cùng một
bộ xử lý.

CPU chủ Cầu Bộ nhớ hệ thống

GPU
Giao diện máy chủ

Viewport / Clip / Độ nét cao


SM
Thiết lập / Raster /
Trình biên dịch đầu vào ZCull Bộ xử lý video I-Cache
Công việc Vertex
Phân phối
Công việc pixel
Phân phối
Công việc tính toán
Phân phối
Vấn đề MT

C-Cache
TPC TPC TPC TPC TPC TPC TPC

SM SM SM SM SM SM SM SM SM SM SM SM SM SM
SP SP

SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP

SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SP SP SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SP SP SP SP SP SP
SP SP SP SP
SP SP

Đơn vị kết Đơn vị kết Đơn vị kết Đơn vị kết


Đơn vị kết cấu cấu cấu cấu cấu Đơn vị kết cấu Đơn vị kết cấu
Tex Tex Tex
L1 Tex L1 Tex L1 L1 Tex L1 L1 Tex L1 SFU SFU
Chia sẻ
Mạng kết nối
Ký ức
ROP L2 ROP L2 ROP L2 ROP L2 Giao diện hiển thị

DRAM DRAM DRAM DRAM Hiển thị

HÌNH B.2.5 Kiến trúc GPU thống nhất cơ bản. GPU ví dụ với 112 bộ xử lý phát trực tuyến (SP) lõi được tổ chức trong 14 phát trực
tuyến bộ nhân (SM); các lõi rất đa luồng. Nó có kiến trúc Tesla cơ bản của NVIDIA GeForce 8800. Bộ xử lý kết nối với bốn phân vùng
DRAM rộng 64 bit thông qua mạng kết nối. Mỗi SM có tám lõi SP, hai đơn vị chức năng đặc biệt (SFU), bộ nhớ hướng dẫn và bộ nhớ
không đổi, đơn vị hướng dẫn đa luồng và bộ nhớ dùng chung.
B-12 Phụ lục B Đồ họa và GPU điện toán

Kiến trúc mảng bộ xử lý có thể mở rộng thành các cấu hình GPU nhỏ hơn và lớn
hơn bằng cách chia tỷ lệ số lượng bộ xử lý và số lượng phân vùng bộ nhớ. Hình B.2.5
cho thấy bảy cụm hai SM chia sẻ một đơn vị kết cấu và bộ đệm L1 kết cấu. Đơn vị
kết cấu cung cấp kết quả được lọc cho SM được cung cấp một tập hợp tọa độ vào bản
đồ kết cấu. Do các vùng hỗ trợ của bộ lọc thường trùng nhau cho các yêu cầu kết cấu
liên tiếp, bộ đệm kết cấu L1 phát trực tuyến nhỏ có hiệu quả để giảm số lượng yêu
cầu đến hệ thống bộ nhớ. Mảng bộ xử lý kết nối với bộ xử lý hoạt động raster (ROP),
bộ nhớ kết cấu L2, bộ nhớ DRAM bên ngoài và bộ nhớ hệ thống thông qua mạng kết
nối toàn GPU. Số lượng bộ xử lý và số lượng bộ nhớ có thể mở rộng để thiết kế các
hệ thống GPU cân bằng cho các phân khúc thị trường và hiệu suất khác nhau.

B.3 Lập trình GPU

Các GPU đa bộ xử lý lập trình khác biệt về chất so với lập trình các bộ xử lý khác
như CPU đa lõi. GPU cung cấp hai đến ba bậc độ lớn của chuỗi và song song dữ
liệu so với CPU, mở rộng đến hàng trăm lõi bộ xử lý và hàng chục ngàn luồng
đồng thời. GPU tiếp tục tăng tính song song của chúng, tăng gấp đôi khoảng 12
đến 18 tháng một lần, được kích hoạt bởi luật Moore Moore [Năm 1965] tăng mật
độ mạch tích hợp và bằng cách cải thiện hiệu quả kiến trúc. Để mở rộng phạm vi
giá và hiệu suất của các phân khúc thị trường khác nhau, các sản phẩm GPU khác
nhau thực hiện số lượng bộ xử lý và luồng khác nhau. Tuy nhiên, người dùng
mong đợi các ứng dụng trò chơi, đồ họa, hình ảnh và điện toán hoạt động trên bất
kỳ GPU nào, bất kể nó thực thi bao nhiêu luồng song song hoặc có bao nhiêu lõi
xử lý song song và họ mong đợi GPU đắt hơn (có nhiều luồng và lõi hơn) chạy
các ứng dụng nhanh hơn. Do đó, các mô hình lập trình GPU và các chương trình
ứng dụng được thiết kế để mở rộng quy mô trong suốt đến một loạt các song song.
Động lực đằng sau số lượng lớn các luồng và lõi song song trong GPU là hiệu
suất đồ họa thời gian thực, cần phải hiển thị các cảnh 3D phức tạp với độ phân
giải cao ở tốc độ khung hình tương tác, ít nhất 60 khung hình mỗi giây. Tương
ứng, các mô hình lập trình có thể mở rộng của các ngôn ngữ tạo bóng đồ họa như
Cg (C cho đồ họa) và HLSL (ngôn ngữ bóng cao cấp) được thiết kế để khai thác
mức độ song song lớn thông qua nhiều luồng song song độc lập và để chia tỷ lệ
cho bất kỳ số lượng lõi bộ xử lý nào. Mô hình lập trình song song có thể mở rộng
CUDA tương tự cho phép các ứng dụng điện toán song song chung tận dụng số
lượng lớn các luồng và tỷ lệ song song cho bất kỳ số lượng lõi xử lý song song
nào, trong suốt cho ứng dụng.
Trong các mô hình lập trình có thể mở rộng này, lập trình viên viết mã cho một
luồng duy nhất và GPU chạy song song vô số các phiên bản luồng. Do đó, các chương
trình mở rộng quy mô trong suốt trên một loạt các song song phần cứng. Mô hình đơn
giản này phát sinh từ các API đồ họa và các ngôn ngữ tạo bóng mô tả cách tô bóng
một
B.3 GPU lập trình B-13

đỉnh hoặc một pixel. Nó vẫn là một mô hình hiệu quả vì GPU đã nhanh chóng
tăng tính song song và hiệu suất của chúng kể từ cuối những năm 1990.
Phần này mô tả ngắn gọn GPU lập trình cho các ứng dụng đồ họa thời gian
thực bằng API đồ họa và ngôn ngữ lập trình. Sau đó, nó mô tả các GPU lập trình
cho điện toán trực quan và các ứng dụng điện toán song song chung sử dụng ngôn
ngữ C và mô hình lập trình CUDA.

Lập trình đồ họa thời gian thực


API đã đóng một vai trò quan trọng trong sự phát triển nhanh chóng, thành công
của GPU và bộ xử lý. Có hai API đồ họa tiêu chuẩn chính : OpenGL và OpenGL API đồ họa
Direct3D, một trong những giao diện lập trình đa phương tiện Microsoft DirectX. tiêu chuẩn mở .
OpenGL, một tiêu chuẩn mở, ban đầu được đề xuất và xác định bởi Silicon Direct3D Một đồ họa
Graphics Incorporated. Sự phát triển và mở rộng liên tục của tiêu chuẩn OpenGL API được xác định bởi
[Segal và Akeley, 2006; Kessenich, 2006] được quản lý bởi Khronos, một tập Microsoft và các đối tác.
đoàn công nghiệp. Direct3D [Blythe, 2006], một tiêu chuẩn thực tế, được xác
định và phát triển về phía trước bởi Microsoft và các đối tác. OpenGL và
Direct3D có cấu trúc tương tự và tiếp tục phát triển nhanh chóng với các tiến bộ
phần cứng GPU. Họ xác định một đường ống xử lý đồ họa logic được ánh xạ lên
phần cứng và bộ xử lý GPU, cùng với các mô hình lập trình và ngôn ngữ cho các
giai đoạn đường ống có thể lập trình.

Đường ống đồ họa logic


Hình B.3.1 minh họa đường ống đồ họa logic Direct3D 10. OpenGL có một cấu trúc
đường ống đồ họa tương tự. API và đường ống logic cung cấp cơ sở hạ tầng luồng dữ liệu
và hệ thống ống nước cho các giai đoạn đổ bóng có thể lập trình, được hiển thị màu xanh
lam. Ứng dụng 3D gửi cho GPU một chuỗi các đỉnh được nhóm thành các điểm nguyên
thủy hình học, các đường, hình tam giác và đa giác. Trình biên dịch đầu vào thu thập các
đỉnh và nguyên thủy. Chương trình shader đỉnh thực thi xử lý per-vertex ,

Đầu
vào Vertex Hình học Thiết lập & Pixel Hoạt động raster /
Lắp ráp Shader Shader Rasterizer Shader Sáp nhập đầu ra

Luồng
Người Người Người
lấy mẫu lấy mẫu Ngo lấy mẫu
ài
GPU

Kết
Kết
Vertex Luồng Độ sâu xuất
cấu Kết cấu Kết cấu
Bộ Bộ Bộ đệm Mục
đệm đệm Z tiêu

Bộ đệm chỉ Hằng số Hằng số Hằng số Bút chì


số Ký ức
HÌNH B.3.1 Đường ống đồ họa Direct3D 10. Mỗi giai đoạn đường ống logic ánh xạ tới phần cứng GPU hoặc bộ xử lý GPU. Các giai
đoạn đổ bóng có thể lập trình là màu xanh lam, các khối chức năng cố định có màu trắng và các đối tượng bộ nhớ có màu xám. Mỗi giai
đoạn xử lý một đỉnh, nguyên thủy hình học hoặc pixel theo kiểu luồng dữ liệu phát trực tuyến.
B-14 Phụ lục B Đồ họa và GPU điện toán

bao gồm chuyển đổi vị trí 3D đỉnh thành vị trí màn hình và chiếu sáng đỉnh để xác
định màu sắc của nó. Chương trình shader hình học thực hiện xử lý theo nguyên thủy
và có thể thêm hoặc thả nguyên thủy. Đơn vị thiết lập và rasterizer tạo ra các đoạn
pixel (các đoạn là những đóng góp tiềm năng cho pixel) được bao phủ bởi một
nguyên thủy hình học. Chương trình shader pixel thực hiện xử lý theo phân đoạn, bao
gồm các tham số nội suy trên mỗi phân đoạn, kết cấu và tô màu. Shader Pixel sử
dụng rộng rãi các tra cứu được lấy mẫu và lọc thành các mảng 1D, 2D hoặc 3D lớn
kết cấu Một 1D, 2D, được gọi kết cấu, sử dụng tọa độ dấu phẩy động nội suy. Shader sử dụng truy cập kết
hoặc Mảng 3D hỗ trợ tra cấu cho bản đồ, chức năng, đề can, hình ảnh và dữ liệu. Các hoạt động raster xử lý
cứu lấy mẫu và lọc với (hoặc sáp nhập đầu ra) giai đoạn thực hiện kiểm tra độ sâu đệm Z và kiểm tra stprint,
tọa độ nội suy. có thể loại bỏ một đoạn pixel ẩn hoặc thay thế độ sâu pixel pixel bằng độ sâu đoạn
mảnh, và thực hiện thao tác trộn màu kết hợp màu phân mảnh với màu pixel và ghi
pixel với màu pha trộn.
API đồ họa và đường ống đồ họa cung cấp đầu vào, đầu ra, các đối tượng bộ
nhớ và cơ sở hạ tầng cho các chương trình shader xử lý từng đoạn đỉnh, nguyên
thủy và pixel.

Chương trình Shader đồ họa


bóng tối Một chương Các ứng dụng đồ họa thời gian thực sử dụng nhiều khác nhau bóng tối các chương
trình mà hoạt động trên trình mô hình hóa cách ánh sáng tương tác với các vật liệu khác nhau và để tạo ra ánh
dữ liệu đồ họa như đỉnh sáng và bóng tối phức tạp. Ngôn ngữ bóng được dựa trên một mô hình lập trình dữ
hoặc đoạn pixel. liệu hoặc phát trực tuyến tương ứng với đường ống đồ họa logic. Các chương trình
bóng mờ Vertex ánh xạ vị trí của các đỉnh tam giác lên màn hình, thay đổi vị trí, màu
ngôn ngữ bóng tối sắc hoặc hướng của chúng. Thông thường, một chuỗi bóng đỉnh đầu vào vị trí đỉnh
Một ngôn ngữ kết xuất dấu phẩy động (x, y, z, w) và tính toán vị trí màn hình dấu phẩy động (x, y, z). Các
đồ họa, thường có một chương trình shader hình học hoạt động trên các nguyên thủy hình học (như đường
mô hình lập trình dữ liệu và hình tam giác) được xác định bởi nhiều đỉnh, thay đổi chúng hoặc tạo ra các
hoặc phát trực tuyến. nguyên thủy bổ sung. Mảnh vỡ pixel làm mờ từng bóng râm một pixel, tính toán một
điểm nổi đỏ, xanh, xanh dương, alpha (RGBA) đóng góp màu cho hình ảnh được
hiển thị ở pixel của nó vị trí hình ảnh mẫu (x, y). Shader (và GPU) sử dụng số học
dấu phẩy động cho tất cả các tính toán màu pixel để loại bỏ các tạo phẩm có thể nhìn
thấy trong khi tính toán phạm vi cực đoan của các giá trị đóng góp pixel gặp phải
trong khi hiển thị cảnh với ánh sáng phức tạp, bóng tối và dải động cao. Đối với cả
ba loại trình tạo đồ họa, nhiều phiên bản chương trình có thể được chạy song song,
dưới dạng các luồng song song độc lập, bởi vì mỗi công trình trên dữ liệu độc lập,
tạo ra kết quả độc lập và không có tác dụng phụ. Các đỉnh, nguyên thủy và pixel độc
lập tiếp tục cho phép cùng một chương trình đồ họa chạy trên các GPU có kích thước
khác nhau, xử lý các số đỉnh, nguyên thủy và pixel khác nhau song song. Do đó, các
chương trình đồ họa mở rộng quy mô trong suốt tới các GPU với số lượng song song
và hiệu suất khác nhau.
Người dùng lập trình cả ba luồng đồ họa logic với ngôn ngữ cấp cao được nhắm
mục tiêu chung. HLSL (ngôn ngữ tạo bóng cấp cao) và Cg (C cho đồ họa) thường
được sử dụng. Chúng có cú pháp giống C và một bộ chức năng thư viện phong phú
cho các hoạt động ma trận, lượng giác, nội suy, và truy cập và lọc kết cấu, nhưng
khác xa với các ngôn ngữ điện toán nói chung: chúng hiện thiếu bộ nhớ chung
B.3 GPU lập trình B-15

truy cập, con trỏ, I / O tệp và đệ quy. HLSL và Cg cho rằng các chương trình
sống trong một đường ống đồ họa logic và do đó I / O là ngầm định. Ví dụ, một
bóng đổ mảnh pixel có thể mong đợi các tọa độ hình học bình thường và nhiều
kết cấu đã được nội suy từ các giá trị đỉnh theo các giai đoạn chức năng cố định
ngược dòng và chỉ có thể gán một giá trị cho tham số đầu ra MÀU để chuyển nó
xuống dòng được trộn với một pixel tại một ngụ ý (x, y) vị trí.
Phần cứng GPU tạo ra một luồng độc lập mới để thực thi chương trình shader
đỉnh, hình học hoặc pixel cho mọi đỉnh, mọi nguyên thủy và mọi đoạn pixel.
Trong các trò chơi video, phần lớn các luồng thực thi các chương trình bóng pixel,
vì thường có các đoạn pixel nhiều hơn 10 đến 20 lần so với các đỉnh và ánh sáng
và bóng phức tạp đòi hỏi tỷ lệ pixel so với các luồng bóng mờ đỉnh. Mô hình lập
trình shader đồ họa đã thúc đẩy kiến trúc GPU thực hiện hiệu quả hàng ngàn
luồng hạt mịn độc lập trên nhiều lõi bộ xử lý song song.

Ví dụ về Shader Pixel
Hãy xem xét chương trình trình tạo bóng pixel Cg sau đây thực hiện kỹ thuật kết xuất
bản đồ môi trường của Cameron. Đối với mỗi luồng pixel, trình tạo bóng này được
truyền năm tham số, bao gồm tọa độ hình ảnh kết cấu điểm nổi 2D cần thiết để lấy
mẫu màu bề mặt và vectơ dấu phẩy động 3D giúp hoàn thiện hướng nhìn ra khỏi bề
mặt. Ba tham số thống nhất khác của người Viking không thay đổi từ một ví dụ pixel
(luồng) sang phiên bản tiếp theo. Shader nhìn lên màu sắc trong hai hình ảnh kết cấu:
truy cập kết cấu 2D cho màu bề mặt và truy cập kết cấu 3D vào bản đồ khối (sáu hình
ảnh tương ứng với các mặt của khối lập phương) để có được màu thế giới bên ngoài
tương ứng với hướng tái chế . Sau đó, màu dấu phẩy động bốn thành phần (đỏ, xanh
lá cây, xanh dương, alpha) cuối cùng được tính bằng cách sử dụng trung bình có trọng
số gọi là hàm nội suy lép lép hoặc chức năng nội suy tuyến tính.

khử trùng khoảng trống (


phao2 texCoord : TEXCOORD0 ,
phao3 refection_dir: TEXCOORD1 ,
ra float4 màu sắc : MÀU SẮC,
đồng phục nổi sáng bóng ,
lấy mẫu thống nhất2D SurfaceMap ,
lấy mẫu thống nhấtCUBE envMap)
{
// Lấy màu bề mặt từ một kết cấu
float4 SurfaceColor = tex2D (surfaceMap, texCoord);

// Lấy màu phản xạ bằng cách lấy mẫu bản đồ khối


float4 refleColor = texCUBE (môi trường, recection_dir);

// Đầu ra có trọng số trung bình của hai màu color = lerp (surfaceColor,
refectedColor, sáng bóng);
}
B-16 Phụ lục B Đồ họa và GPU điện toán

Mặc dù chương trình shader này chỉ dài ba dòng, nhưng nó kích hoạt rất nhiều
phần cứng GPU. Đối với mỗi lần tìm nạp kết cấu, hệ thống con kết cấu GPU tạo ra
nhiều truy cập bộ nhớ vào các màu hình ảnh mẫu trong vùng lân cận của tọa độ lấy
mẫu, sau đó nội suy kết quả cuối cùng với số học lọc dấu phẩy động. GPU đa luồng
thực thi hàng ngàn luồng bóng mờ Cg pixel nhẹ này song song, xen kẽ sâu chúng để
ẩn tìm nạp kết cấu và độ trễ bộ nhớ.
Cg tập trung chế độ xem lập trình viên vào một đỉnh hoặc nguyên thủy hoặc
pixel, mà GPU thực hiện dưới dạng một luồng duy nhất; chương trình shader
trong suốt quy mô để khai thác song song luồng trên các bộ xử lý có sẵn. Là ứng
dụng cụ thể, Cg cung cấp một tập hợp phong phú các loại dữ liệu hữu ích, chức
năng thư viện và cấu trúc ngôn ngữ để thể hiện các kỹ thuật kết xuất đa dạng.
Hình B.3.2 hiển thị da được hiển thị bởi một mảnh vỡ pixel. Da thật xuất hiện khá
khác biệt so với sơn màu thịt vì ánh sáng nảy xung quanh rất nhiều trước khi tái xuất hiện.
Trong bóng râm phức tạp này, ba lớp da riêng biệt, mỗi lớp có hành vi tán xạ dưới bề mặt
độc đáo, được mô hình hóa để tạo cho da một chiều sâu thị giác và độ trong mờ. Sự tán xạ
có thể được mô hình hóa bằng một sự tích tụ mờ trong một không gian kết cấu được vỗ
béo, với màu đỏ được làm mờ nhiều hơn màu xanh lá cây và màu xanh lam ít bị mờ hơn.
Trình tạo bóng Cg đã biên dịch thực hiện 1400 hướng dẫn để tính màu của một pixel da.

Hình ảnh kết xuất GPU B.3.2. Để cung cấp cho da độ sâu thị giác và độ trong mờ, shader pixel chương trình
mô hình ba lớp da riêng biệt, mỗi lớp có hành vi tán xạ dưới bề mặt độc đáo. Nó thực hiện 1400 hướng dẫn để
hiển thị các thành phần màu đỏ, xanh lá cây, xanh dương và alpha của từng mảnh pixel da.
B.3 GPU lập trình B-17

Vì GPU đã phát triển hiệu suất dấu phẩy động vượt trội và băng thông bộ nhớ
phát trực tuyến rất cao cho đồ họa thời gian thực, chúng đã thu hút các ứng dụng
song song cao ngoài đồ họa truyền thống. Lúc đầu, quyền truy cập vào sức mạnh
này chỉ có sẵn bằng cách sử dụng một ứng dụng như một thuật toán kết xuất đồ
họa, nhưng phương pháp GPGPU này thường rất khó xử và hạn chế. Gần đây, mô
hình lập trình CUDA đã cung cấp một cách dễ dàng hơn nhiều để khai thác băng
thông bộ nhớ và điểm nổi hiệu suất cao có thể mở rộng của GPU với ngôn ngữ
lập trình C.

Lập trình ứng dụng điện toán song song


CUDA, Brook và CAL là các giao diện lập trình cho GPU tập trung vào tính toán
song song dữ liệu hơn là đồ họa. CAL (Tính toán trừu tượng Lớp) là giao diện
ngôn ngữ trình biên dịch cấp thấp cho GPU AMD. Brook là một ngôn ngữ phát
trực tuyến thích ứng cho GPU bằng cách Buck và cộng sự. [2004] CUDA, được
phát triển bởi. NVIDIA [2007], là một phần mở rộng cho các ngôn ngữ C và C +
+ để lập trình song song có thể mở rộng của nhiều GPU và CPU đa lõi. Mô hình
lập trình CUDA được mô tả dưới đây, được điều chỉnh từ một bài viết của
Nickolls et al. [2008].
Với mô hình mới, GPU vượt trội về tính toán song song và thông lượng dữ liệu,
thực hiện các ứng dụng điện toán hiệu năng cao cũng như các ứng dụng đồ họa.

Phân tích vấn đề song song dữ liệu


Để ánh xạ các vấn đề điện toán lớn một cách hiệu quả với kiến trúc xử lý song song
cao, lập trình viên hoặc trình biên dịch phân tách vấn đề thành nhiều vấn đề nhỏ có
thể được giải quyết song song. Ví dụ: lập trình viên phân vùng một mảng dữ liệu kết
quả lớn thành các khối và phân vùng tiếp theo mỗi khối thành các phần tử, sao cho
các khối kết quả có thể được tính toán độc lập song song và các phần tử trong mỗi
khối được tính song song. Hình B.3.3 hiển thị phân tách mảng dữ liệu kết quả thành
lưới các khối 3 × 2, trong đó mỗi khối được phân tách thành một mảng các phần tử 5
× 3. Phân rã song song hai cấp ánh xạ tự nhiên với kiến trúc GPU: bộ nhân song song
tính toán các khối kết quả và các luồng song song tính toán các phần tử kết quả.
Lập trình viên viết một chương trình tính toán một chuỗi các lưới dữ liệu kết
quả, phân vùng từng lưới kết quả thành các khối kết quả hạt thô có thể được tính
toán song song. Chương trình T0he tính toán từng khối kết quả với một mảng các
luồng song song hạt mịn, phân vùng công việc giữa các luồng để mỗi lần tính
một hoặc nhiều phần tử kết quả.

Lập trình song song có thể mở rộng với CUDA


Mô hình lập trình song song có thể mở rộng CUDA mở rộng các ngôn ngữ C và C
++ để khai thác mức độ song song lớn cho các ứng dụng chung trên các bộ đa xử lý
song song cao, đặc biệt là GPU. Kinh nghiệm sớm với CUDA cho thấy điều đó nhiều
các chương trình tinh vi có thể dễ dàng được thể hiện với một vài trừu tượng dễ hiểu.
Kể từ khi NVIDIA phát hành CUDA vào năm 2007, các nhà phát triển đã có
B-18 Phụ lục B Đồ họa và GPU điện toán

Trình tự
Lưới dữ liệu kết quả
Bước 1 : 1
Khối Khối Khối
(0,0) (1, 0) (2, 0)
Khối Khối Khối
(0,1) (1, 1) (2, 1)

Lưới dữ liệu kết quả


Bước 2 : 2

Khối (1, 1)

Elem Elem Elem Elem Elem


(0, 0) (1, 0) (2, 0) (3, 0) (4, 0)
Elem Elem Elem Elem Elem
(0, 1) (1, 1) (2, 1) (3, 1) (4, 1)
Elem Elem Elem Elem Elem
(0, 2) (1, 2) (2, 2) (3, 2) (4, 2)

HÌNH B.3.3 Phân tách dữ liệu kết quả thành một lưới các khối các phần tử được tính toán
song song.

phát triển nhanh chóng các chương trình song song có thể mở rộng cho một loạt
các ứng dụng, bao gồm xử lý dữ liệu địa chấn, hóa học tính toán, đại số tuyến
tính, bộ giải ma trận thưa thớt, sắp xếp, tìm kiếm, mô hình vật lý và điện toán
trực quan. Các ứng dụng này mở rộng quy mô trong suốt đến hàng trăm lõi bộ xử
lý và hàng ngàn luồng đồng thời. GPU NVIDIA với kiến trúc đồ họa và điện toán
thống nhất Tesla (được mô tả trong Phần B.4 và B.7) chạy các chương trình
CUDA C và có sẵn rộng rãi trong máy tính xách tay, PC, máy trạm và máy chủ.
Mô hình CUDA cũng được áp dụng cho các kiến trúc xử lý song song bộ nhớ
dùng chung khác, bao gồm cả CPU đa lõi.
CUDA cung cấp ba điểm trừu tượng quan trọng hệ thống phân cấp của các nhóm
chủ đề, chia sẻ kỷ niệm, và đồng bộ hóa rào cảnCung cấp một cấu trúc song song rõ
ràng mã C thông thường cho một luồng của hệ thống phân cấp. Nhiều cấp độ của
luồng, bộ nhớ và đồng bộ hóa cung cấp tính song song dữ liệu hạt mịn và song song
luồng, được lồng trong song song dữ liệu hạt thô và song song nhiệm vụ. Các trừu
tượng hướng dẫn lập trình viên phân vùng vấn đề thành các vấn đề phụ thô có thể
được giải quyết song song, và sau đó thành các phần tốt hơn có thể được giải quyết
song song. Mô hình lập trình chia tỷ lệ trong suốt với số lượng lớn lõi bộ xử lý:
chương trình CUDA được biên dịch thực thi trên bất kỳ số lượng bộ xử lý nào và chỉ
hệ thống thời gian chạy cần biết số lượng bộ xử lý vật lý.
B.3 GPU lập trình B-19

Mô hình CUDA
CUDA là một phần mở rộng tối thiểu của các ngôn ngữ lập trình C và C ++. Lập
trình viên viết một chương trình nối tiếp gọi song song hạt nhân, có thể là các chức hạt nhân Một chương
năng đơn giản hoặc các chương trình đầy đủ. Một hạt nhân thực thi song song trên trình hoặc chức năng cho
một tập hợp các luồng song song. Lập trình viên tổ chức các luồng này thành một hệ một luồng, được thiết kế
thống phân cấp các khối luồng và lưới của các khối luồng. A khối chủ đề là một tập để được thực hiện bởi
hợp các luồng đồng thời có thể hợp tác với nhau thông qua đồng bộ hóa rào cản và nhiều luồng.
thông qua truy cập chung vào một không gian bộ nhớ riêng tư cho khối. A lưới điện khối chủ đề Một bộ
là một tập hợp các khối luồng có thể mỗi khối được thực thi độc lập và do đó có thể của các luồng đồng thời
thực thi song song. thực hiện cùng một
Khi gọi kernel, lập trình viên chỉ định số lượng luồng trên mỗi khối và số khối chương trình luồng và
bao gồm lưới. Mỗi chủ đề được đưa ra một duy nhất ID chủ đề số chủ đề trong có thể hợp tác để tính
kết quả.
khối luồng của nó, được đánh số 0, 1, 2, ..., blockDim-1và mỗi khối luồng được
đưa ra một duy nhất chặn ID số blockIdx trong lưới của nó. CUDA hỗ trợ các khối lưới điện Một bộ chủ
luồng chứa tối đa 512 luồng. Để thuận tiện, các khối ren và lưới có thể có một, đề các khối thực thi
hai hoặc ba chiều, được truy cập thông qua .x, .y, và .z các trường chỉ mục. cùng một chương trình
Là một ví dụ rất đơn giản về lập trình song song, giả sử rằng chúng ta được cung kernel.
cấp hai vectơ x và y của n số dấu phẩy động mỗi số và chúng tôi muốn tính kết quả
của y = rìu + y đối với một số giá trị vô hướng aĐây là cái gọi là.SAXPY hạt nhân
được xác định bởi thư viện đại số tuyến tính BLAS. Hình B.3.4 hiển thị mã C để thực
hiện tính toán này trên cả bộ xử lý nối tiếp và song song sử dụng CUDA .
Các __global__ xác định khai báo chỉ ra rằng thủ tục là một điểm nhập kernel.
Các chương trình CUDA khởi chạy các hạt nhân song song với cú pháp gọi hàm
mở rộng :
kernel <<<dimGrid, dimBlock >>> (danh sách tham số của Google);
Ở đâu dimGrid và dimBlock là các vectơ ba yếu tố của loại dim3 tương ứng chỉ
định kích thước của lưới trong các khối và kích thước của các khối trong các
luồng. Kích thước không xác định mặc định là một.
Trong Hình B.3.4, chúng tôi khởi động một lưới n các luồng chỉ định một
luồng cho từng phần tử của vectơ và đặt 256 luồng trong mỗi khối. Mỗi luồng
riêng lẻ tính toán một chỉ mục phần tử từ ID luồng và khối của nó và sau đó thực
hiện phép tính mong muốn trên các phần tử vectơ tương ứng. So sánh các phiên
bản nối tiếp và song song của mã này, chúng tôi thấy rằng chúng rất giống nhau.
Điều này đại diện cho một mô hình khá phổ biến. Mã nối tiếp bao gồm một vòng
lặp trong đó mỗi lần lặp độc lập với tất cả các lần lặp khác. Các vòng lặp như vậy
có thể được chuyển đổi cơ học thành các hạt song song: mỗi lần lặp vòng lặp trở
thành một luồng độc lập. Bằng cách gán một luồng duy nhất cho từng thành phần
đầu ra, chúng tôi tránh sự cần thiết phải đồng bộ hóa giữa các luồng khi ghi kết
quả vào bộ nhớ.
Văn bản của hạt nhân CUDA chỉ đơn giản là hàm C cho một luồng tuần tự.
Do đó, nói chung là đơn giản để viết và thường đơn giản hơn là viết mã song
song cho các hoạt động của vector. Tính song song được xác định rõ ràng và rõ
ràng bằng cách chỉ định kích thước của lưới và các khối luồng của nó khi khởi
chạy kernel.
B-20 Phụ lục B Đồ họa và GPU điện toán

Tính toán y = rìu + y với một vòng lặp nối tiếp :

void saxpy_serial (int n, float alpha, float * x, float * y)


{
cho (int i = 0; i <n; ++ i)
y [i] = alpha * x [i] + y [i];
}
// Gọi kernel SAXPY nối tiếp
saxpy_serial (n, 2.0, x, y);

Tính toán y = rìu + y song song sử dụng CUDA :

__global__
void saxpy_parallel (int n, float alpha, float * x, float * y)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;

if (i <n) y [i] = alpha * x [i] + y [i];


}

// Gọi hạt nhân SAXPY song song (256 luồng trên mỗi khối) int nblocks = (n +
255) / 256; saxpy_parallel <<nblocks, 256 >>> (n, 2.0, x, y);

HÌNH B.3.4 Mã tuần tự (trên cùng) bằng C so với mã song song (dưới cùng) trong CUDA cho
SAXPY (xem Chương 6). Các luồng song song CUDA thay thế vòng lặp nối tiếp C mỗi luồng tính toán kết
quả tương tự như một vòng lặp lặp. Mã song song tính toán n kết quả với n chủ đề được tổ chức trong các khối
của 256 chủ đề.

Thực hiện song song và quản lý luồng là tự động. Tất cả việc tạo luồng, lập
lịch và chấm dứt được xử lý cho lập trình viên bởi hệ thống cơ bản. Thật vậy,
GPU kiến trúc Tesla thực hiện tất cả quản lý luồng trực tiếp trong phần cứng. Các
luồng của một khối thực thi đồng thời và có thể đồng bộ hóa tại a hàng rào đồng
hàng rào đồng bộ hóa bộ hóa bằng cách gọi __syncthreads () nội tại. Điều này đảm bảo rằng không có
Chủ đề chờ đợi tại một luồng nào trong khối có thể tiến hành cho đến khi tất cả các luồng trong khối đã
rào cản đồng bộ hóa cho đạt đến rào cản. Sau khi vượt qua rào cản, các luồng này cũng được đảm bảo để
đến khi tất cả các luồng xem tất cả các ghi vào bộ nhớ được thực hiện bởi các luồng trong khối trước rào
trong khối luồng đến rào cản. Do đó, các luồng trong một khối có thể giao tiếp với nhau bằng cách viết và
chắn.
đọc bộ nhớ chia sẻ trên mỗi khối tại một rào cản đồng bộ hóa.
Vì các luồng trong một khối có thể chia sẻ bộ nhớ và đồng bộ hóa thông qua các
rào cản, chúng sẽ nằm cùng nhau trên cùng một bộ xử lý vật lý hoặc bộ đa xử lý. Tuy
nhiên, số lượng khối luồng có thể vượt quá số lượng bộ xử lý. Mô hình lập trình
luồng CUDA ảo hóa các bộ xử lý và giúp lập trình viên linh hoạt song song với bất
kỳ mức độ chi tiết nào là thuận tiện nhất. Ảo hóa
B.3 GPU lập trình B-21

thành các luồng và khối luồng cho phép phân tách vấn đề trực quan, vì số lượng
khối có thể được quyết định bởi kích thước của dữ liệu được xử lý thay vì số
lượng bộ xử lý trong hệ thống. Nó cũng cho phép cùng một chương trình CUDA
mở rộng quy mô đến số lượng lõi bộ xử lý khác nhau.
Để quản lý ảo hóa phần tử xử lý này và cung cấp khả năng mở rộng, CUDA
yêu cầu các khối luồng có thể thực thi độc lập. Nó phải có thể thực hiện các khối
theo bất kỳ thứ tự nào, song song hoặc nối tiếp. Các khối khác nhau không có
phương tiện giao tiếp trực tiếp, mặc dù chúng có thể phối hợp hoạt động của họ sử vận hành bộ nhớ
dụng nguyên tử hoạt động bộ nhớ trên bộ nhớ toàn cầu có thể nhìn thấy đối với nguyên tử Một ký ức
tất cả các luồng bằng nguyên tử tăng con trỏ hàng đợi, ví dụ. Yêu cầu độc lập này đọc, sửa đổi, ghi trình
cho phép các khối luồng được lên lịch theo bất kỳ thứ tự nào trên bất kỳ số lượng tự hoạt động hoàn
lõi nào, làm cho mô hình CUDA có thể mở rộng trên một số lõi tùy ý cũng như thành mà không có bất
kỳ truy cập can thiệp
trên nhiều kiến trúc song song. Nó cũng giúp tránh khả năng bế tắc. Một ứng dụng nào.
có thể thực hiện nhiều lưới một cách độc lập hoặc phụ thuộc. Các lưới độc lập có
thể thực hiện đồng thời, cung cấp đủ tài nguyên phần cứng. Các lưới phụ thuộc
thực hiện tuần tự, với một rào cản liên hạt ngầm giữa chúng, do đó đảm bảo rằng
tất cả các khối của lưới đầu tiên hoàn thành trước khi bất kỳ khối nào của lưới phụ
thuộc thứ hai bắt đầu.
Chủ đề có thể truy cập dữ liệu từ nhiều không gian bộ nhớ trong khi thực hiện.
Mỗi chủ đề có một riêng tư bộ nhớ cục bộ CUDA sử dụng bộ nhớ cục bộ cho
các biến riêng tư không phù hợp với các thanh ghi luồng, cũng như cho các bộ nhớ toàn cầu Bộ
khung ngăn xếp và đăng ký tràn. Mỗi khối luồng có một. chia sẻ bộ nhớ, hiển thị nhớ ứng dụng được
cho tất cả các luồng của khối, có cùng tuổi thọ với khối. Cuối cùng, tất cả các chủ chia sẻ bởi tất cả các
chủ đề.
đề có quyền truy cập vào cùng bộ nhớ toàn cầu Các chương trình khai báo các
biến trong bộ nhớ chia sẻ và toàn cầu với. __shared__ và __device__ loại chất chia sẻ bộ nhớ Bộ nhớ
lượng. Trên GPU kiến trúc Tesla, các không gian bộ nhớ này tương ứng với các mỗi khối được chia sẻ bởi
bộ nhớ riêng biệt về mặt vật lý: bộ nhớ chia sẻ trên mỗi khối là RAM trên chip có tất cả các luồng của khối.
độ trễ thấp, trong khi bộ nhớ toàn cầu nằm trong DRAM nhanh trên bảng đồ họa. bộ nhớ cục bộ Bộ
Bộ nhớ dùng chung dự kiến sẽ là bộ nhớ có độ trễ thấp gần mỗi bộ xử lý, nhớ địa phương theo
giống như bộ đệm L1. Do đó, nó có thể cung cấp truyền thông hiệu suất cao và chủ đề riêng tư cho
chia sẻ dữ liệu giữa các luồng của khối luồng. Vì nó có cùng tuổi thọ với khối chủ đề.
luồng tương ứng, mã kernel thường sẽ khởi tạo dữ liệu trong các biến được chia
sẻ, tính toán bằng các biến được chia sẻ và sao chép kết quả bộ nhớ được chia sẻ
vào bộ nhớ toàn cầu. Các khối luồng của lưới phụ thuộc tuần tự giao tiếp qua bộ
nhớ toàn cầu, sử dụng nó để đọc kết quả đầu vào và ghi.
Hình B.3.5 hiển thị sơ đồ các mức lồng nhau của các luồng, khối luồng , và
lưới của các khối chủ đề. Nó cũng cho thấy các mức độ chia sẻ bộ nhớ tương ứng:
bộ nhớ cục bộ, chia sẻ và toàn cầu cho mỗi luồng, mỗi khối luồng và chia sẻ dữ
liệu cho mỗi ứng dụng.
Một chương trình quản lý không gian bộ nhớ toàn cầu hiển thị cho các hạt
nhân thông qua các cuộc gọi đến thời gian chạy CUDA, chẳng hạn như
cudaMalloc () và cudaFree () Hạt nhân có thể thực thi trên một thiết bị riêng biệt về
mặt vật lý, như trường hợp khi chạy hạt nhân trên GPU. Do đó, ứng dụng phải sử
dụng. cudaMemcpy () để sao chép dữ liệu giữa không gian được phân bổ và bộ
nhớ hệ thống máy chủ.
B-22 Phụ lục B Đồ họa và GPU điện toán

Chủ đề

Bộ nhớ địa phương theo chủ đề

Khối chủ đề

mỗi khối
Bộ nhớ dùng chung

Lưới 0 Trình tự

...

Đồng bộ hóa giữa các lưới Ký ức toàn cầu


Lưới 1

...

HÌNH B.3.5 Mức độ chi tiết lồng nhau Chủ đề, khối luồng và lưới có mức chia sẻ bộ nhớ
tương ứng. Bộ nhớ địa phương theo chủ đề là riêng tư cho chủ đề. Bộ nhớ chia sẻ trên mỗi khối được
chia sẻ bởi tất cả các luồng của khối. Bộ nhớ toàn cầu cho mỗi ứng dụng được chia sẻ bởi tất cả các chủ đề.

Mô hình lập trình CUDA có phong cách tương tự như quen thuộc nhiều dữ liệu
nhiều dữ liệu chương
chương trình đơn (SPMD) mô hình, nó thể hiện sự song song một cách rõ ràng, và
trình đơn (SPMD) Một
phong cách của mô hình
mỗi kernel thực thi trên một số luồng cố định. Tuy nhiên, CUDA linh hoạt hơn hầu
lập trình song song trong hết các nhận thức về SPMD, bởi vì mỗi lệnh gọi kernel sẽ tự động tạo ra một lưới
đó tất cả các luồng thực mới với số lượng khối luồng và luồng phù hợp cho bước ứng dụng đó. Lập trình viên
hiện cùng một chương có thể sử dụng mức độ song song thuận tiện cho từng hạt nhân, thay vì phải thiết kế
trình. Các luồng SPMD tất cả các giai đoạn tính toán để sử dụng cùng một số luồng. Hình B.3.6 cho thấy một
thường phối hợp với đồng ví dụ về trình tự mã CUDA giống như SPMD. Nó đầu tiên khởi động hạt nhân trên
bộ hóa rào cản. lưới 2D gồm 3 khối × 2 trong đó mỗi khối luồng 2D bao gồm 5 × 3 luồng. Sau đó nó
tức thì hạt nhân trên lưới 1D gồm bốn khối luồng 1D với sáu luồng mỗi luồng. Bởi vì
hạt nhân phụ thuộc vào kết quả của hạt nhân, chúng được phân tách bằng một rào cản
đồng bộ hóa liên hạt nhân.
Các luồng đồng thời của một khối luồng thể hiện song song dữ liệu hạt mịn và
song song luồng. Các khối luồng độc lập của lưới biểu thị song song dữ liệu hạt
thô. Lưới độc lập thể hiện song song nhiệm vụ hạt thô. Một kernel chỉ đơn giản
là mã C cho một luồng của hệ thống phân cấp.
B.3 GPU lập trình B-23

Trình tự Lưới 2D kernelF là 3 2 khối ren; mỗi khối là 5 3 sợi

Khối 0, 0 Khối 1, 0 Khối 2, 0

kernelF <<(3, 2), (5, 3) >>> (params);


Khối 0, 1 Khối 1, 1 Khối 2, 1

Khối 1, 1
Chủ đề 0, 0 Chủ đề 1, 0 Chủ đề 2, 0 Chủ đề 3, 0 Chủ đề 4, 0

Chủ đề 0, 1 Chủ đề 1, 1 Chủ đề 2, 1 Chủ đề 3, 1 Chủ đề 4, 1

Chủ đề 0, 2 Chủ đề 1, 2 Chủ đề 2, 2 Chủ đề 3, 2 Chủ đề 4, 2

Rào cản đồng bộ hóa Interkernel

Lưới 1D kernelG là 4 khối luồng; mỗi khối là 6 luồng

Khối 0 Khối 1 Khối 2 Khối 3

kernelG <<4, 6 >>> (params);

Khối 2
Chủ đề 0 Chủ đề 1 Chủ đề 2 Chủ đề 3 Chủ đề 4 Chủ đề 5

HÌNH B.3.6 Trình tự hạt nhân F khởi tạo trên lưới 2D của các khối luồng 2D, một hạt nhân hàng rào
đồng bộ hóa, tiếp theo là hạt nhân G trên lưới 1D của các khối luồng 1D.

Hạn chế
Để đạt hiệu quả và để đơn giản hóa việc thực hiện, mô hình lập trình CUDA có
một số hạn chế. Chủ đề và khối luồng chỉ có thể được tạo bằng cách gọi một hạt
nhân song song, không phải từ bên trong một hạt nhân song song. Cùng với tính
độc lập cần thiết của các khối luồng, điều này giúp có thể thực hiện các chương
trình CUDA với một bộ lập lịch đơn giản giới thiệu chi phí tối thiểu. Trong thực
tế, kiến trúc GPU Tesla thực hiện phần cứng quản lý và lập lịch trình của các chủ
đề và khối chủ đề.
B-24 Phụ lục B Đồ họa và GPU điện toán

Song song tác vụ có thể được thể hiện ở cấp khối luồng nhưng khó thể hiện trong
một khối luồng vì các rào cản đồng bộ hóa luồng hoạt động trên tất cả các luồng của
khối. Để cho phép các chương trình CUDA chạy trên bất kỳ số lượng bộ xử lý nào,
các phụ thuộc giữa các khối luồng trong cùng một lưới hạt nhân không được phép các
khối của Cameron phải thực thi độc lập. Vì CUDA yêu cầu các khối luồng phải độc
lập và cho phép các khối được thực thi theo bất kỳ thứ tự nào, nên việc kết hợp các
kết quả được tạo bởi nhiều khối nói chung phải được thực hiện bằng cách khởi chạy
kernel thứ hai trên một lưới các khối luồng mới (mặc dù các khối luồng có thể phối
hợp các hoạt động của chúng bằng cách sử dụng các hoạt động bộ nhớ nguyên tử trên
bộ nhớ toàn cầu có thể nhìn thấy đối với tất cả các luồng bằng cách tăng các con trỏ
hàng đợi, chẳng hạn).
Các cuộc gọi hàm đệ quy hiện không được phép trong các hạt nhân CUDA.
Recursion không hấp dẫn trong một hạt nhân song song ồ ạt, bởi vì việc cung cấp
không gian ngăn xếp cho hàng chục ngàn luồng có thể hoạt động sẽ đòi hỏi một
lượng bộ nhớ đáng kể. Các thuật toán nối tiếp thường được thể hiện bằng cách sử
dụng đệ quy, chẳng hạn như quicksort, thường được thực hiện tốt nhất bằng cách
sử dụng song song dữ liệu lồng nhau thay vì đệ quy rõ ràng.
Để hỗ trợ kiến trúc hệ thống không đồng nhất kết hợp CPU và GPU, mỗi hệ
thống có bộ nhớ riêng, các chương trình CUDA phải sao chép dữ liệu và kết quả
giữa bộ nhớ máy chủ và bộ nhớ thiết bị. Chi phí tương tác và truyền dữ liệu GPU
của CPU được giảm thiểu bằng cách sử dụng các công cụ truyền khối DMA và
kết nối nhanh. Các vấn đề đòi hỏi nhiều tính toán đủ lớn để cần tăng hiệu suất
GPU giúp khấu hao chi phí tốt hơn các vấn đề nhỏ.

Ý nghĩa của kiến trúc


Các mô hình lập trình song song cho đồ họa và điện toán đã thúc đẩy kiến trúc
GPU khác với kiến trúc CPU. Các khía cạnh chính của các chương trình GPU
thúc đẩy kiến trúc bộ xử lý GPU là :
■ Sử dụng rộng rãi song song dữ liệu hạt mịn : Các chương trình Shader mô
tả làm thế nào để xử lý một pixel hoặc đỉnh đơn và các chương trình
CUDA mô tả cách tính kết quả riêng lẻ.
■ Mô hình lập trình luồng cao : Một chương trình luồng shader xử lý a pixel
đơn hoặc đỉnh và chương trình luồng CUDA có thể tạo ra một kết quả duy
nhất. GPU phải tạo và thực hiện hàng triệu chương trình luồng như vậy trên
mỗi khung hình, với tốc độ 60 khung hình mỗi giây.
■ Khả năng mở rộng : Một chương trình phải tự động tăng hiệu suất của nó
khi được cung cấp với bộ xử lý bổ sung, mà không biên dịch lại.
■ Tính toán dấu phẩy động (hoặc số nguyên) chuyên sâu.
■ Hỗ trợ tính toán thông lượng cao.
B.4 Kiến trúc đa xử lý đa luồng B-25

B.4 Đa xử lý đa luồng
Kiến trúc

Để giải quyết các phân khúc thị trường khác nhau, GPU thực hiện số lượng bộ xử
lý đa cấp có thể mở rộng trên thực tế, GPU là bộ xử lý đa cấu tạo từ bộ xử lý. Hơn
nữa, mỗi bộ xử lý được đa luồng cao để thực thi nhiều luồng shader đỉnh và pixel
hạt mịn một cách hiệu quả. GPU cơ bản chất lượng có hai đến bốn bộ xử lý, trong
khi một người đam mê chơi game GPU hoặc nền tảng điện toán có hàng tá trong
số họ. Phần này xem xét kiến trúc của một bộ xử lý đa luồng như vậy, một phiên
bản đơn giản của NVIDIA Tesla phát trực tuyến đa xử lý (SM) được mô tả trong
Mục B.7.
Tại sao sử dụng bộ đa xử lý, thay vì một số bộ xử lý độc lập? Sự song song trong
mỗi bộ xử lý cung cấp hiệu suất cao cục bộ và hỗ trợ đa luồng rộng rãi cho các mô
hình lập trình song song hạt mịn được mô tả trong Mục B.3 Các luồng riêng lẻ của
một khối luồng thực thi với nhau trong một bộ xử lý để chia sẻ dữ liệu. Thiết kế đa bộ
xử lý đa luồng mà chúng tôi mô tả ở đây có tám lõi xử lý vô hướng trong kiến trúc
được ghép chặt và thực hiện tới 512 luồng (SM được mô tả trong. Mục B.7 thực hiện
tới 768 luồng). Đối với hiệu suất khu vực và công suất, bộ đa xử lý chia sẻ các đơn vị
phức tạp lớn trong số tám lõi của bộ xử lý, bao gồm bộ đệm lệnh, đơn vị hướng dẫn
đa luồng và RAM bộ nhớ dùng chung .

Đa luồng lớn
Bộ xử lý GPU rất đa luồng để đạt được một số mục tiêu :
■ Bao phủ độ trễ của tải bộ nhớ và tìm nạp kết cấu từ DRAM
■ Hỗ trợ các mô hình lập trình shader đồ họa song song hạt mịn
■ Hỗ trợ các mô hình lập trình điện toán song song hạt mịn
■ Ảo hóa các bộ xử lý vật lý dưới dạng các luồng và khối luồng để cung cấp
khả năng mở rộng trong suốt
■ Đơn giản hóa mô hình lập trình song song để viết một chương trình nối tiếp
cho một luồng
Độ trễ tìm nạp bộ nhớ và kết cấu có thể yêu cầu hàng trăm đồng hồ bộ xử lý, bởi vì
GPU thường có bộ nhớ truyền phát nhỏ thay vì bộ nhớ làm việc lớn như CPU. Yêu cầu
tìm nạp thường yêu cầu độ trễ truy cập DRAM đầy đủ cộng với kết nối và độ trễ đệm. Đa
luồng giúp bao phủ độ trễ với tính toán hữu ích trong khi một luồng đang chờ tải hoặc tìm
nạp kết cấu, bộ xử lý có thể thực thi một luồng khác. Các mô hình lập trình song song chi
tiết cung cấp hàng ngàn luồng độc lập theo nghĩa đen có thể khiến nhiều bộ xử lý bận rộn
mặc dù độ trễ bộ nhớ dài được nhìn thấy bởi các luồng riêng lẻ.
B-26 Phụ lục B Đồ họa và GPU điện toán

Một chương trình shader đỉnh hoặc pixel đồ họa là một chương trình cho một
luồng duy nhất xử lý một đỉnh hoặc pixel. Tương tự, chương trình CUDA là
chương trình C cho một luồng duy nhất tính kết quả. Các chương trình đồ họa và
điện toán khởi tạo nhiều luồng song song để hiển thị hình ảnh phức tạp và tính
toán các mảng kết quả lớn. Để tự động cân bằng khối lượng công việc chuyển
đổi đỉnh và pixel shader, mỗi bộ xử lý đồng thời thực hiện nhiều chương trình
luồng khác nhau và các loại chương trình shader khác nhau.
Để hỗ trợ mô hình lập trình đỉnh, nguyên thủy và pixel độc lập của các ngôn ngữ
tạo bóng đồ họa và mô hình lập trình một luồng của CUDA C / C + +, mỗi luồng GPU
có các thanh ghi riêng, bộ nhớ trên mỗi luồng riêng, bộ đếm chương trình và trạng thái
thực thi luồng và có thể thực thi một đường dẫn mã độc lập. Để thực thi hiệu quả hàng
trăm luồng nhẹ đồng thời, bộ đa xử lý GPU là phần cứng đa luồng, nó quản lý và thực
hiện hàng trăm luồng đồng thời trong phần cứng mà không cần lên lịch trên đầu. Các
luồng đồng thời trong các khối luồng có thể đồng bộ hóa tại một rào cản với một lệnh
duy nhất. Tạo ren nhẹ, lập lịch luồng không có đầu và đồng bộ hóa rào cản nhanh hỗ
trợ hiệu quả song song rất hạt mịn.

Kiến trúc đa bộ xử lý
Một bộ xử lý đồ họa và điện toán thống nhất thực hiện các chương trình shader
đỉnh, hình học và pixel và các chương trình điện toán song song. Như Hình B.4.1
cho thấy, bộ nhân ví dụ bao gồm tám bộ xử lý vô hướng (SP) lõi mỗi lõi có một
đa luồng lớn đăng ký tập tin (RF), hai đơn vị chức năng đặc biệt (SFU), một đơn
vị hướng dẫn đa luồng, bộ đệm lệnh, bộ đệm không đổi chỉ đọc và bộ nhớ dùng
chung.
Bộ nhớ dùng chung 16 KB chứa bộ đệm dữ liệu đồ họa và dữ liệu điện toán
dùng chung. Các biến CUDA được khai báo là __shared__ nằm trong bộ nhớ
dùng chung. Để ánh xạ khối lượng công việc đường ống đồ họa logic thông qua
bộ xử lý nhiều lần, như được hiển thị trong Mục B.2Các luồng đỉnh, hình học và
pixel có bộ đệm đầu vào và đầu ra độc lập, và khối lượng công việc đến và khởi
hành độc lập với thực thi luồng.
Mỗi lõi SP chứa số nguyên vô hướng và các đơn vị số học dấu phẩy động thực
hiện hầu hết các hướng dẫn. SP là phần cứng đa luồng, hỗ trợ tới 64 luồng. Mỗi lõi
SP được điều khiển thực hiện một lệnh vô hướng trên mỗi luồng trên mỗi đồng hồ,
dao động từ 1,2 GHz đến 1,6 GHz trong các sản phẩm GPU khác nhau. Mỗi lõi SP
có một RF lớn gồm 1024 thanh ghi 32 bit đa năng, được phân vùng giữa các luồng
được chỉ định. Các chương trình tuyên bố nhu cầu đăng ký của họ, thường là 16 đến
64 thanh ghi 32 bit vô hướng trên mỗi luồng. SP có thể chạy đồng thời nhiều luồng
sử dụng một vài thanh ghi hoặc ít luồng sử dụng nhiều thanh ghi hơn. Trình biên dịch
tối ưu hóa phân bổ đăng ký để cân bằng chi phí của các thanh ghi tràn so với chi phí
của ít luồng hơn. Các chương trình đổ bóng pixel thường sử dụng 16 thanh ghi trở
xuống, cho phép mỗi SP chạy các luồng bóng tối lên đến 64 pixel để che các tìm nạp
kết cấu có độ trễ dài. Các chương trình CUDA được biên dịch thường cần 32 thanh
ghi cho mỗi luồng, giới hạn mỗi SP thành 32 luồng, giới hạn chương trình kernel như
vậy ở mức 256 luồng trên mỗi khối luồng trên bộ đa xử lý ví dụ này, thay vì tối đa
512 luồng.
B.4 Kiến trúc đa xử lý đa luồng B-27

Đa xử lý đa luồng

Bộ nhớ cache hướng dẫn

Bộ đa xử lý
Đơn vị hướng dẫn đa luồng
Bộ điều khiển

Bộ nhớ cache không đổi Giao diện làm


việc

SP SP SP SP SP SP SP SP
SFU SFU

RF RF RF RF RF RF RF RF
Đầu vào
Giao
Mạng kết nối diện

Đầu ra
Giao
diện
Bộ nhớ dùng chung
Kết cấu
Giao diện

Ký ức
Giao diện

HÌNH B.4.1 Bộ nhân đa xử lý với tám lõi xử lý vô hướng (SP). Các tám lõi SP mỗi lõi có một đa
luồng lớn đăng ký tập tin (RF) và chia sẻ bộ đệm lệnh, đơn vị vấn đề hướng dẫn đa luồng, bộ đệm không
đổi, hai đơn vị chức năng đặc biệt (SFU), mạng kết nối và bộ nhớ chia sẻ đa cấp.

Các SFU đường ống thực hiện các hướng dẫn luồng tính toán các hàm đặc biệt và
các thuộc tính pixel nội suy từ các thuộc tính đỉnh nguyên thủy. Các hướng dẫn này
có thể thực hiện đồng thời với các hướng dẫn trên SP. SFU được mô tả sau.
Bộ xử lý thực hiện các hướng dẫn tìm nạp kết cấu trên đơn vị kết cấu thông qua
giao diện kết cấu và sử dụng giao diện bộ nhớ để tải bộ nhớ ngoài, lưu trữ và hướng
dẫn truy cập nguyên tử. Các hướng dẫn này có thể thực hiện đồng thời với các hướng
dẫn trên SP. Truy cập bộ nhớ dùng chung sử dụng mạng kết nối có độ trễ thấp giữa
bộ xử lý SP và ngân hàng bộ nhớ dùng chung. đa luồng đơn hướng
dẫn (SIMT) Một bộ
Đa luồng hướng dẫn (SIMT) xử lý kiến trúc áp dụng
một hướng dẫn cho
Để quản lý và thực hiện hàng trăm luồng chạy một số chương trình khác nhau một nhiều luồng độc lập
cách hiệu quả, bộ đa xử lý sử dụng a đa hướng dẫn đơn (SIMT) kiến trúc. Nó tạo ra, song song.
quản lý, lịch trình và thực hiện các chủ đề đồng thời trong các nhóm các luồng song cong vênh Tập hợp
song được gọi cong vênh Thuật ngữ. cong vênh bắt nguồn từ dệt, công nghệ sợi song song song các luồng thực
song đầu tiên. Bức ảnh trong Hình B.4.2 cho thấy một sợi dọc của các sợi song song hiện cùng một lệnh với
nổi lên từ một khung dệt. Bộ xử lý ví dụ này sử dụng kích thước cong vênh SIMT nhau trong kiến trúc
gồm 32 luồng, thực hiện bốn luồng trong mỗi tám lõi SP trên bốn SIMT.
B-28 Phụ lục B Đồ họa và GPU điện toán

Ảnh: Judy Schoonmaker


SIMT đa luồng
lập lịch hướng dẫn

thời gian
warp 8 hướng dẫn 11

warp 1 hướng dẫn 42

warp 3 hướng dẫn 95

warp 8 hướng dẫn 12

warp 3 hướng dẫn 96

warp 1 hướng dẫn 43

HÌNH B.4.2 Lập kế hoạch cong vênh đa luồng SIMT. Bộ lập lịch chọn một sợi dọc và các vấn đề
một hướng dẫn đồng bộ với các luồng song song cấu thành sợi dọc. Vì các sợi dọc là độc lập, nên bộ lập
lịch có thể chọn một sợi dọc khác nhau mỗi lần.

đồng hồ. Bộ nhân Tesla SM được mô tả trong Mục B.7 cũng sử dụng kích thước cong
vênh của 32 luồng song song, thực hiện bốn luồng trên lõi SP để đạt hiệu quả trên các
luồng pixel dồi dào và các luồng tính toán. Các khối chủ đề bao gồm một hoặc nhiều
sợi dọc.
Ví dụ này Bộ xử lý đa xử lý SIMT quản lý một nhóm gồm 16 sợi dọc, tổng cộng
có 512 sợi. Các luồng song song riêng lẻ tạo ra một sợi dọc có cùng loại và bắt đầu
cùng nhau tại cùng một địa chỉ chương trình, nhưng nếu không thì có thể tự do phân
nhánh và thực thi độc lập. Tại mỗi thời điểm phát hành lệnh, đơn vị hướng dẫn đa
luồng SIMT chọn một sợi dọc sẵn sàng thực hiện lệnh tiếp theo của nó, sau đó đưa ra
hướng dẫn cho các luồng hoạt động của sợi dọc đó. Một lệnh SIMT được phát đồng
bộ đến các luồng song song hoạt động của sợi dọc; các luồng riêng lẻ có thể không
hoạt động do phân nhánh hoặc dự đoán độc lập. Trong bộ xử lý đa xử lý này, mỗi lõi
bộ xử lý vô hướng SP thực hiện một lệnh cho bốn luồng riêng lẻ của sợi dọc bằng bốn
đồng hồ, phản ánh tỷ lệ 4: 1 của các sợi dọc thành lõi.
Kiến trúc bộ xử lý SIMT giống như đa dữ liệu hướng dẫn Thiết kế (SIMD), áp
dụng một lệnh cho nhiều làn dữ liệu, nhưng khác với SIMT đó áp dụng một lệnh cho
nhiều luồng độc lập song song, không chỉ
B.4 Kiến trúc đa xử lý đa luồng B-29

đến nhiều làn dữ liệu. Một lệnh cho bộ xử lý SIMD điều khiển một vectơ của
nhiều làn dữ liệu với nhau, trong khi đó, một lệnh cho bộ xử lý SIMT điều khiển
một luồng riêng lẻ và đơn vị hướng dẫn SIMT đưa ra một hướng dẫn cho một sợi
dọc của các luồng song song độc lập để có hiệu quả. Bộ xử lý SIMT tìm thấy sự
song song cấp dữ liệu giữa các luồng khi chạy, tương tự như cách bộ xử lý siêu
âm tìm thấy sự song song cấp độ lệnh giữa các hướng dẫn trong thời gian chạy.
Bộ xử lý SIMT nhận ra hiệu quả và hiệu suất đầy đủ khi tất cả các luồng của sợi
dọc có cùng đường dẫn thực thi. Nếu các luồng của sợi dọc phân kỳ thông qua nhánh
có điều kiện phụ thuộc dữ liệu, thực thi sẽ tuần tự hóa cho từng đường dẫn nhánh được
thực hiện và khi tất cả các đường dẫn hoàn thành, các luồng sẽ hội tụ đến cùng một
đường dẫn thực thi. Đối với các đường dẫn có độ dài bằng nhau, một khối mã if-other
khác nhau có hiệu quả 50%. Bộ xử lý sử dụng ngăn xếp đồng bộ hóa nhánh để quản lý
các luồng độc lập phân kỳ và hội tụ. Các sợi dọc khác nhau thực hiện độc lập ở tốc độ
tối đa bất kể chúng đang thực thi các đường dẫn mã chung hay rời rạc. Do đó, GPU
SIMT hiệu quả và linh hoạt hơn về mã phân nhánh so với GPU trước đó, vì độ cong
của chúng hẹp hơn nhiều so với chiều rộng SIMD của GPU trước.
Trái ngược với kiến trúc vector SIMD, SIMT cho phép các lập trình viên viết
mã song song cấp độ cho các luồng độc lập riêng lẻ, cũng như mã song song dữ
liệu cho nhiều luồng phối hợp. Để chính xác cho chương trình, lập trình viên về
cơ bản có thể bỏ qua các thuộc tính thực thi SIMT của warp; tuy nhiên, cải thiện
hiệu suất đáng kể có thể được thực hiện bằng cách lưu ý rằng mã hiếm khi yêu
cầu các luồng trong một warp để phân kỳ. Trong thực tế, điều này tương tự như
vai trò của các dòng bộ đệm trong các mã truyền thống: kích thước dòng bộ đệm
có thể được bỏ qua một cách an toàn khi thiết kế cho tính chính xác nhưng phải
được xem xét trong cấu trúc mã khi thiết kế cho hiệu suất cao nhất.

Thực hiện và phân kỳ cong vênh SIMT


Cách tiếp cận SIMT của lập lịch trình các sợi dọc độc lập linh hoạt hơn so với
việc lập lịch trình của các kiến trúc GPU trước đó. Một sợi dọc bao gồm các luồng
song song cùng loại: đỉnh, hình học, pixel hoặc tính toán. Đơn vị cơ bản của xử lý
bóng đổ phân đoạn pixel là quad 2 x 2 pixel được triển khai dưới dạng các luồng
bóng bốn pixel. Bộ điều khiển đa bộ xử lý gói các quads pixel thành một sợi dọc.
Nó tương tự nhóm các đỉnh và nguyên thủy thành các sợi dọc và gói các luồng
điện toán thành một sợi dọc. Một khối luồng bao gồm một hoặc nhiều sợi dọc.
Thiết kế SIMT chia sẻ đơn vị tìm nạp và phát hành hướng dẫn một cách hiệu quả
trên các luồng song song của sợi dọc, nhưng yêu cầu một sợi dọc đầy đủ các
luồng hoạt động để có được hiệu suất đầy đủ.
Lịch trình đa bộ xử lý thống nhất này và thực hiện đồng thời nhiều loại sợi dọc,
cho phép nó thực hiện đồng thời các cong vênh đỉnh và pixel. Bộ lập lịch cong vênh
của nó hoạt động ở mức thấp hơn tốc độ đồng hồ của bộ xử lý, bởi vì có bốn làn ren
trên mỗi lõi bộ xử lý. Trong mỗi chu kỳ lập lịch, nó chọn một sợi dọc để thực hiện
lệnh cong vênh SIMT, như được hiển thị trong Hình B.4.2Một hướng dẫn cong vênh
được ban hành thực hiện như bốn bộ tám luồng trên bốn chu kỳ thông lượng của bộ
xử lý. Đường ống xử lý sử dụng một số đồng hồ có độ trễ để hoàn thành mỗi hướng
dẫn. Nếu số lượng sợi dọc hoạt động nhân với số lần đồng hồ trên mỗi sợi dọc vượt
quá đường ống.
B-30 Phụ lục B Đồ họa và GPU điện toán

độ trễ, lập trình viên có thể bỏ qua độ trễ đường ống. Đối với bộ nhân này, lịch
trình vòng tròn gồm tám sợi dọc có chu kỳ 32 chu kỳ giữa các hướng dẫn liên
tiếp cho cùng một sợi dọc. Nếu chương trình có thể giữ 256 luồng hoạt động trên
mỗi bộ xử lý, độ trễ lệnh lên đến 32 chu kỳ có thể được ẩn khỏi một luồng tuần
tự riêng lẻ. Tuy nhiên, với một vài sợi dọc hoạt động, độ sâu đường ống của bộ
xử lý sẽ hiển thị và có thể khiến bộ xử lý bị đình trệ.
Một vấn đề thiết kế đầy thách thức là triển khai lập lịch cong vênh không đầu cho
sự kết hợp năng động của các chương trình và loại chương trình sợi dọc khác nhau.
Bộ lập lịch lệnh phải chọn một sợi dọc cứ sau bốn đồng hồ để đưa ra một lệnh cho
mỗi đồng hồ trên mỗi luồng, tương đương với IPC là 1,0 trên mỗi lõi bộ xử lý. Bởi vì
sợi dọc là độc lập, sự phụ thuộc duy nhất là trong số các hướng dẫn tuần tự từ cùng
một sợi dọc. Bộ lập lịch sử dụng bảng điểm phụ thuộc đăng ký để đủ điều kiện cong
vênh có luồng hoạt động sẵn sàng thực hiện lệnh. Nó ưu tiên tất cả các sợi dọc sẵn
sàng như vậy và chọn ưu tiên cao nhất cho vấn đề. Ưu tiên phải xem xét loại sợi dọc,
loại hướng dẫn và mong muốn công bằng cho tất cả các sợi dọc đang hoạt động.

Quản lý chủ đề và khối chủ đề


Bộ điều khiển đa bộ xử lý và đơn vị chỉ dẫn quản lý các luồng và khối luồng. Bộ
điều khiển chấp nhận các yêu cầu công việc và dữ liệu đầu vào và phân xử quyền
truy cập vào các tài nguyên được chia sẻ, bao gồm đơn vị kết cấu, đường dẫn
truy cập bộ nhớ và đường dẫn I / O. Đối với khối lượng công việc đồ họa, nó tạo
và quản lý đồng thời ba loại luồng đồ họa: đỉnh, hình học và pixel. Mỗi loại công
việc đồ họa có đường dẫn đầu vào và đầu ra độc lập. Nó tích lũy và đóng gói
từng loại công việc đầu vào này thành các sợi SIMT của các luồng song song
thực hiện cùng một chương trình luồng. Nó phân bổ một sợi dọc miễn phí, phân
bổ các thanh ghi cho các luồng dọc và bắt đầu thực hiện sợi dọc trong bộ đa xử
lý. Mỗi chương trình tuyên bố nhu cầu đăng ký trên mỗi luồng của nó; bộ điều
khiển chỉ bắt đầu một sợi dọc khi nó có thể phân bổ số lượng đăng ký được yêu
cầu cho các luồng dọc. Khi tất cả các luồng của lối ra dọc, bộ điều khiển sẽ giải
mảng sợi hợp tác nén kết quả và giải phóng các thanh ghi và tài nguyên dọc.
(CTA) Một bộ của các
luồng đồng thời thực
Bộ điều khiển tạo ra mảng sợi hợp tác (CTA) trong đó thực hiện các khối
hiện cùng một chương luồng CUDA dưới dạng một hoặc nhiều sợi dọc của các luồng song song. Nó tạo
trình luồng và có thể ra một CTA khi nó có thể tạo ra tất cả các sợi dọc CTA và phân bổ tất cả các tài
hợp tác để tính toán nguyên CTA. Ngoài các luồng và thanh ghi, CTA yêu cầu phân bổ bộ nhớ và rào
một kết quả. CTA cản được chia sẻ. Chương trình tuyên bố các năng lực cần thiết và bộ điều khiển
GPU thực hiện khối đợi cho đến khi nó có thể phân bổ số tiền đó trước khi khởi chạy CTA. Sau đó,
luồng CUDA.
nó tạo ra các cong vênh CTA ở tốc độ lập lịch dọc, để chương trình CTA bắt đầu
thực hiện ngay lập tức với hiệu suất đa bộ xử lý hoàn toàn. Bộ điều khiển giám
sát khi tất cả các luồng của CTA đã thoát và giải phóng tài nguyên được chia sẻ
CTA và tài nguyên dọc của nó.

Hướng dẫn chủ đề


Bộ xử lý luồng SP thực thi các hướng dẫn vô hướng cho các luồng riêng lẻ, không
giống như các kiến trúc lệnh vectơ GPU trước đó, đã thực hiện các hướng dẫn vectơ
bốn thành phần cho mỗi chương trình shader đỉnh hoặc pixel. Chương trình Vertex
B.4 Kiến trúc đa xử lý đa luồng B-31

thường tính toán các vectơ vị trí (x, y, z, w), trong khi các chương trình shader pixel
tính toán các vectơ màu (đỏ, xanh lá cây, xanh dương, alpha). Tuy nhiên, các chương
trình shader đang ngày càng dài hơn và có nhiều vô hướng hơn, và ngày càng khó
chiếm hoàn toàn ngay cả hai thành phần của kiến trúc vector bốn thành phần GPU cũ.
Trên thực tế, kiến trúc SIMT song song trên 32 luồng pixel độc lập, thay vì song song
bốn thành phần vectơ trong một pixel. Các chương trình CUDA C / C ++ có mã đầu
cơ chủ yếu trên mỗi luồng. GPU trước đây sử dụng đóng gói vector (ví dụ:., kết hợp
các tiểu ngành công việc để đạt được hiệu quả) nhưng điều đó làm phức tạp phần
cứng lập lịch cũng như trình biên dịch. Hướng dẫn mở rộng đơn giản và thân thiện
với trình biên dịch. Các hướng dẫn kết cấu vẫn dựa trên vectơ, lấy vectơ tọa độ nguồn
và trả về vectơ màu được lọc.
Để hỗ trợ nhiều GPU với các định dạng vi mô nhị phân khác nhau, trình biên dịch
ngôn ngữ điện toán và đồ họa cấp cao tạo ra các hướng dẫn cấp trình biên dịch trung
gian (ví dụ:., Hướng dẫn vector Direct3D hoặc hướng dẫn vô hướng PTX), sau đó
được tối ưu hóa và dịch sang các vi cấu trúc GPU nhị phân. Định nghĩa tập lệnh
NVIDIA PTX (thực thi luồng song song) [2007] cung cấp một ISA mục tiêu ổn định
cho các trình biên dịch và cung cấp khả năng tương thích qua nhiều thế hệ GPU với
các kiến trúc tập hợp vi mô nhị phân đang phát triển. Trình tối ưu hóa dễ dàng mở
rộng các hướng dẫn vector Direct3D sang nhiều vi cấu trúc nhị phân vô hướng.
Hướng dẫn vô hướng PTX dịch gần một sang một với các vi cấu trúc nhị phân vô
hướng, mặc dù một số hướng dẫn PTX mở rộng sang nhiều vi cấu trúc nhị phân và
nhiều hướng dẫn PTX có thể gấp thành một vi cấu trúc nhị phân. Vì các hướng dẫn
cấp trình biên dịch trung gian sử dụng các thanh ghi ảo, trình tối ưu hóa phân tích các
phụ thuộc dữ liệu và phân bổ các thanh ghi thực. Trình tối ưu hóa giúp loại bỏ mã
chết, gấp các hướng dẫn lại với nhau khi khả thi và tối ưu hóa phân kỳ nhánh SIMT
và hội tụ điểm.

Kiến trúc tập lệnh (ISA)


Chuỗi ISA được mô tả ở đây là phiên bản đơn giản của kiến trúc Tesla PTX ISA,
một bộ hướng dẫn vô hướng dựa trên thanh ghi bao gồm dấu phẩy động, số
nguyên, logic, chuyển đổi, các chức năng đặc biệt, điều khiển lưu lượng, truy cập
bộ nhớ và các hoạt động kết cấu. Hình B.4.3 liệt kê các hướng dẫn chủ đề GPX
GPU cơ bản; xem thông số kỹ thuật NVIDIA PTX [2007] để biết chi tiết. Định
dạng hướng dẫn là :
opcode.type d, a, b, c;

Ở đâu d là toán hạng đích , a, b, c là các toán hạng nguồn, và .type là một trong :

Kiểu .type Specifer


Các bit chưa được gõ 8, 16, 32 và 64 bit .b8, .b16, .b32, .b64
Số nguyên chưa ký 8, 16, 32 và 64 bit .u8, .u16, .u32, .u64
Số nguyên đã ký 8, 16, 32 và 64 bit .s8, .s16, .s32, .s64
Điểm nổi 16, 32 và 64 bit .f16, .f32, .f64
B-32 Phụ lục B Đồ họa và GPU điện toán

Hướng dẫn chủ đề GPX GPU cơ bản

Nhóm Hướng dẫn Thí dụ Ý nghĩa Bình luận

số học .type = .s32, .u32, .f32, .s64, .u64, .f64


thêm.type add.f32 d, a, b d = a + b;
phụ.kiểu phụ.f32 d, a, b d = a - b;
mul.kiểu mul.f32 d, a, b d = a * b;
điên.kiểu mad.f32 d, a, b, c d = a * b + c; nhân thêm
div.kiểu div.f32 d, a, b d = a / b; nhiều vi mô
rem.kiểu rem.u32 d, a, b d = a% b; số nguyên còn lại
abs.kiểu abs.f32 d, a d = | a |;
Số học
phủ định.type neg.f32 d, a d = 0 - a;
tối thiểu.kiểu tối thiểu 32 d, a, b d = (a <b)? a: b; chọn nổi không phải NaN
tối đa.kiểu max.f32 d, a, b d = (a> b)? a: b; chọn nổi không phải NaN
setp.cmp.kiểu setp.lt.f32 p, a, b p = (a <b); so sánh và đặt vị ngữ
số .cmp = eq, ne, lt, le, gt, ge; không có trật tự cmp = Equ, neu, ltu, leu, gtu, geu, num, nan
di chuyển.kiểu Mov.b32 d, a d = a; di chuyển
selp.type selp.f32 d, a, b, p d = p? a: b; chọn với vị ngữ
cvt.dtype.atype cvt.f32.s32 d, a d = chuyển đổi (a); chuyển đổi atype sang dtype
đặc biệt .kiểu = .f32 (một số .f64)
RCp.type RCp.f32 d, a d = 1 / a; đối ứng
sqrt.type sqrt.f32 d, a d = sqrt (a); căn bậc hai
Đặc biệt rsqrt.type rsqrt.f32 d, a d = 1 / sqrt (a); căn bậc hai đối ứng
Chức năng tội lỗi.type sin.f32 d, a d = tội lỗi (a); sin
cos.type cos.f32 d, a d = cos (a); cosin
lg2.type lg2.f32 d, a d = log (a) / log (2) logarit nhị phân
ex2.type ex2.f32 d, a d = 2 ** a; số mũ nhị phân
logickiểu. = .pred, .b32, .b64
và.kiểu và.b32 d, a, b d = a & b;
hoặc là.kiểu or.b32 d, a, b d = a | b;
xor.kiểu xor.b32 d, a, b d = a ^ b;
Hợp lý
không phải.kiểu không.b32 d, a, b d = ~ a; một bổ sung
cnot.kiểu cnot.b32 d, a, b d = (a == 0)? 1: 0; C logic không
shl.kiểu shl.b32 d, a, b d = a <<b; chuyển sang trái
thu nhỏ.kiểu shr.s32 d, a, b d = a >> b; chuyển sang phải
ký ức .không gian = .global, .shared, .local, .const; .type = .b8, .u8, .s8, .b16, .b32, .b64
ld.không gian.type ld.global.b32 d, [a + off] d = * (a + tắt); tải từ bộ nhớ không gian
lưu trữ vào bộ nhớ không
st.không gian.type st.shared.b32 [d + off], a * (d + off) = a; gian
Ký ức
tex.thứ
Truy cập hai.dtyp.btype tex.2d.v4.f32.f32 d, a, b d = tex2d (a, b); tra cứu kết cấu
nguyên
tử.spc.op.kiểu nguyên tử.global.add.u32 d, [a], b nguyên tử {d = * a; đọc nguyên tử-sửa đổi-viết
nguyên tử.global.cas.b32 d, [a], b, c * a = op (* a, b); } hoạt động
nguyên tử .op = và, hoặc, xor, thêm, tối thiểu, tối đa, trao đổi, cas; .spc = .global; .type = .b32
chi nhánh @p mục tiêu áo ngực nếu (p) goto chi nhánh có điều kiện
mục tiêu;
Điều khiển gọi gọi (nghỉ hưu), func, (params) ret = func (params); chức năng gọi
Dòng chảy ret ret trở về; trở về từ chức năng gọi
bar.sync bar.sync d chờ chủ đề đồng bộ hóa rào cản
lối ra lối ra lối ra; chấm dứt thực hiện chủ đề

HÌNH B.4.3 Hướng dẫn luồng GPU PTX cơ bản.


B.4 Kiến trúc đa xử lý đa luồng B-33

Các toán hạng nguồn là các giá trị 32 bit hoặc 64 bit vô hướng trong các thanh
ghi, một giá trị tức thời hoặc một hằng số; toán hạng vị ngữ là giá trị Boolean 1
bit. Điểm đến là các thanh ghi, ngoại trừ lưu trữ vào bộ nhớ. Hướng dẫn được
xác định bằng cách thêm tiền tố vào chúng @p hoặc là @!tr, Ở đâu tr là một thanh
ghi vị ngữ. Hướng dẫn bộ nhớ và kết cấu chuyển vô hướng hoặc vectơ của hai
đến bốn thành phần, tổng cộng lên tới 128 bit. Hướng dẫn PTX chỉ định hành vi
của một luồng.
Các hướng dẫn số học PTX hoạt động trên các loại số nguyên nổi 32 bit và 64
bit, số nguyên đã ký và các loại số nguyên không dấu. GPU gần đây hỗ trợ điểm
nổi chính xác kép 64 bit; xem Mục B.6 Trên các GPU hiện tại, các hướng dẫn
logic và số nguyên 64 bit PTX được dịch thành hai hoặc nhiều vi mô nhị phân
thực hiện các thao tác 32 bit. Các hướng dẫn chức năng đặc biệt của GPU được
giới hạn ở điểm nổi 32 bit. Các hướng dẫn dòng điều khiển luồng là có điều kiện.
chi nhánh, Chức năng gọi và trở về, chỉ lối ra, và bar.sync (rào cản đồng bộ hóa).
Các hướng dẫn chi nhánh có điều kiện @p mục tiêu áo ngực sử dụng một thanh ghi
vị ngữ tr (hoặc tr!) trước đây được đặt bởi một vị ngữ so sánh và đặt setp hướng
dẫn để xác định xem các chủ đề có chi nhánh hay không. Các hướng dẫn khác
cũng có thể được xác định trên một thanh ghi vị ngữ là đúng hoặc sai.
Hướng dẫn truy cập bộ nhớ
Các tex tìm nạp hướng dẫn và lọc các mẫu kết cấu từ các mảng kết cấu 1D, 2D và
3D trong bộ nhớ thông qua hệ thống con kết cấu. Các tìm nạp kết cấu thường sử
dụng tọa độ dấu phẩy động nội suy để giải quyết một kết cấu. Khi một luồng
shader pixel đồ họa tính toán màu phân đoạn pixel của nó, bộ xử lý hoạt động
raster sẽ trộn nó với màu pixel ở vị trí pixel được gán (x, y) và ghi màu cuối cùng
vào bộ nhớ.
Để hỗ trợ nhu cầu ngôn ngữ điện toán và C / C ++, Tesla PTX ISA thực hiện
các hướng dẫn tải / lưu trữ bộ nhớ. Nó sử dụng địa chỉ byte số nguyên với thanh
ghi cộng với số học địa chỉ bù để tạo điều kiện tối ưu hóa mã trình biên dịch
thông thường. Hướng dẫn tải / lưu trữ bộ nhớ là phổ biến trong bộ xử lý, nhưng là
một khả năng mới đáng kể trong GPU kiến trúc Tesla, vì GPU trước chỉ cung cấp
các truy cập kết cấu và pixel theo yêu cầu của API đồ họa.
Đối với máy tính, các hướng dẫn tải / lưu trữ truy cập ba không gian bộ nhớ
đọc / ghi để thực hiện các không gian bộ nhớ CUDA tương ứng Mục B.3:
■ Bộ nhớ cục bộ cho dữ liệu tạm thời có thể định địa chỉ riêng trên mỗi luồng
(được thực hiện trong DRAM bên ngoài)
■ Bộ nhớ dùng chung để truy cập độ trễ thấp vào dữ liệu được chia sẻ bằng
cách hợp tác các luồng trong cùng khối CTA / luồng (được thực hiện trong
SRAM trên chip)
■ Bộ nhớ toàn cầu cho các bộ dữ liệu lớn được chia sẻ bởi tất cả các luồng
của ứng dụng điện toán (được thực hiện trong DRAM bên ngoài)
Các hướng dẫn tải / lưu trữ bộ nhớ ld.global, st.global, ld.shared, st. chia sẻ,
ld.local, và st.local truy cập bộ nhớ toàn cầu, chia sẻ và cục bộ không gian. Các
chương trình điện toán sử dụng hướng dẫn đồng bộ hóa rào cản nhanh quán bar.
đồng bộ hóa để đồng bộ hóa các luồng trong khối CTA / luồng giao tiếp với nhau
thông qua bộ nhớ chia sẻ và toàn cầu.
B-34 Phụ lục B Đồ họa và GPU điện toán

Để cải thiện băng thông bộ nhớ và giảm chi phí, các hướng dẫn tải / lưu trữ
cục bộ và toàn cầu kết hợp các yêu cầu luồng song song riêng lẻ từ cùng một
SIMT cong vênh với nhau thành một yêu cầu khối bộ nhớ khi các địa chỉ nằm
trong cùng một khối và đáp ứng các tiêu chí căn chỉnh. Yêu cầu bộ nhớ kết hợp
cung cấp một hiệu suất tăng đáng kể so với các yêu cầu riêng biệt từ các luồng
riêng lẻ. Số lượng luồng lớn của bộ xử lý, cùng với hỗ trợ cho nhiều yêu cầu tải
nổi bật, giúp bù độ trễ tải để sử dụng cho bộ nhớ cục bộ và toàn cầu được triển
khai trong DRAM bên ngoài .
GPU kiến trúc Tesla mới nhất cũng cung cấp các hoạt động bộ nhớ nguyên tử hiệu
quả trên bộ nhớ với bộ nhớ nguyên tử.op.u32 hướng dẫn, bao gồm các hoạt động số
nguyên thêm, tối thiểu, tối đa và, hoặc, xor, trao đổi , và các hoạt động cas (so sánh và
hoán đổi) , tạo điều kiện giảm song song và quản lý cấu trúc dữ liệu song song.

Đồng bộ hóa rào cản cho truyền thông chủ đề


Đồng bộ hóa rào cản nhanh cho phép các chương trình CUDA giao tiếp thường
xuyên qua bộ nhớ dùng chung và bộ nhớ toàn cầu bằng cách gọi đơn giản
__syncthreads (); như là một phần của mỗi bước giao tiếp xen kẽ. Hàm nội tại
đồng bộ hóa tạo ra một bar.sync chỉ dẫn. Tuy nhiên, việc thực hiện đồng bộ hóa
rào cản nhanh giữa tối đa 512 luồng trên mỗi khối luồng CUDA là một thách
thức.
Việc nhóm các luồng vào các sợi dọc SIMT gồm 32 luồng giúp giảm độ khó đồng
bộ hóa xuống 32 lần. Các luồng chờ ở một rào cản trong bộ lập lịch luồng SIMT để
chúng không tiêu thụ bất kỳ chu kỳ xử lý nào trong khi chờ đợi. Khi một chủ đề thực
thi a bar.sync hướng dẫn, nó tăng bộ đếm đến chuỗi rào cản và bộ lập lịch đánh dấu
luồng là chờ ở rào chắn. Khi tất cả các luồng CTA đến, bộ đếm rào cản khớp với số
lượng thiết bị đầu cuối dự kiến và bộ lập lịch sẽ giải phóng tất cả các luồng đang chờ
ở rào chắn và tiếp tục thực hiện các luồng.

Bộ xử lý phát trực tuyến (SP)


Đa luồng bộ xử lý phát trực tuyến Lõi (SP) là bộ xử lý lệnh luồng chính trong bộ xử
lý đa xử lý. Nó là đăng ký tập tin (RF) cung cấp 1024 thanh ghi 32 bit vô hướng cho
tối đa 64 luồng. Nó thực hiện tất cả các hoạt động điểm nổi cơ bản, bao gồm thêm.f32,
mul.f32, điên.f32 (nổi nhân-thêm) , tối thiểu. f32, tối đa.f32, và setp.f32 (so sánh nổi và
đặt vị ngữ). Các phép toán cộng và nhân dấu phẩy động tương thích với tiêu chuẩn
IEEE 754 cho các số FP có độ chính xác đơn, bao gồm không phải là một con số
(NaN) và các giá trị vô cực. Lõi SP cũng thực hiện tất cả các hướng dẫn PTX số
nguyên 32 bit và 64 bit được hiển thị trong Hình B.4.3.
Điểm nổi thêm và mul các hoạt động sử dụng IEEE từ tròn đến gần nhất - ngay
cả khi chế độ làm tròn mặc định. Các điên.f32 phép toán nhân dấu phẩy động thực
hiện phép nhân với phép cắt, tiếp theo là phép cộng với điểm tròn đến trung bình
nhất. SP xả các toán hạng không chuẩn hóa đầu vào thành không được bảo quản
bằng không. Các kết quả làm suy giảm phạm vi số mũ đầu ra mục tiêu được
chuyển sang số không được bảo toàn bằng dấu sau khi làm tròn.
B.4 Kiến trúc đa xử lý đa luồng B-35

Đơn vị chức năng đặc biệt (SFU)


Một số hướng dẫn luồng có thể thực thi trên SFU, đồng thời với các hướng dẫn
luồng khác thực thi trên SP. SFU thực hiện các hướng dẫn chức năng đặc biệt
của Hình B.4.3, tính toán các xấp xỉ dấu phẩy động 32 bit cho các hàm đối ứng,
căn bậc hai đối ứng và các hàm siêu việt chính. Nó cũng thực hiện nội suy thuộc
tính phẳng dấu phẩy động 32 bit cho các bóng pixel, cung cấp phép nội suy chính
xác các thuộc tính như màu sắc, độ sâu và tọa độ kết cấu.
Mỗi SFU đường ống tạo ra một kết quả chức năng đặc biệt dấu phẩy động 32
bit mỗi chu kỳ; hai SFU trên mỗi bộ xử lý thực hiện các hướng dẫn chức năng
đặc biệt với một phần tư tốc độ lệnh đơn giản của tám SP. Các SFU cũng thực
hiện mul.f32 nhân hướng dẫn đồng thời với tám SP, tăng đỉnh tỷ lệ tính toán lên
tới 50% cho các luồng có hỗn hợp hướng dẫn phù hợp.
Để đánh giá chức năng, kiến trúc Tesla SFU sử dụng phép nội suy bậc hai dựa
trên các xấp xỉ minimax nâng cao để xấp xỉ gốc vuông đối ứng, đối ứng, log2x,
2xvà chức năng sin / cos. Độ chính xác của các ước tính hàm dao động từ 22 đến
24 bit mantissa. Xem Mục B.6 để biết thêm chi tiết về số học SFU.

So sánh với các bộ xử lý khác


So với các kiến trúc vector SIMD như x86 SSE, bộ đa xử lý SIMT có thể thực thi các
luồng riêng lẻ một cách độc lập, thay vì luôn thực hiện chúng cùng nhau trong các
nhóm đồng bộ. Phần cứng SIMT tìm thấy sự song song dữ liệu giữa các luồng độc lập,
trong khi phần cứng SIMD yêu cầu phần mềm thể hiện song song dữ liệu một cách rõ
ràng trong mỗi lệnh vector. Một máy SIMT thực hiện một sợi dọc gồm 32 luồng đồng
bộ khi các luồng có cùng một đường dẫn thực thi, nhưng có thể thực thi từng luồng
một cách độc lập khi chúng phân kỳ. Ưu điểm rất quan trọng vì các chương trình và
hướng dẫn SIMT chỉ đơn giản mô tả hành vi của một luồng độc lập duy nhất, thay vì
vectơ dữ liệu SIMD của bốn hoặc nhiều làn dữ liệu. Tuy nhiên, bộ đa xử lý SIMT có
hiệu quả giống SIMD, trải rộng diện tích và chi phí của một đơn vị hướng dẫn trên 32
luồng của sợi dọc và trên tám lõi bộ xử lý phát trực tuyến. SIMT cung cấp hiệu suất
của SIMD cùng với năng suất đa luồng, tránh phải mã hóa rõ ràng các vectơ SIMD
cho các điều kiện cạnh và phân kỳ một phần.
Bộ xử lý SIMT áp đặt ít chi phí vì phần cứng được đa luồng với đồng bộ hóa
rào cản phần cứng. Điều đó cho phép các shader đồ họa và các luồng CUDA thể
hiện sự song song rất chi tiết. Các chương trình đồ họa và CUDA sử dụng các
luồng để thể hiện tính song song dữ liệu chi tiết trong chương trình theo luồng,
thay vì buộc lập trình viên thể hiện nó dưới dạng hướng dẫn vector SIMD. Việc
phát triển mã đơn luồng vô hướng đơn hơn mã vector là đơn giản và hiệu quả
hơn và bộ đa xử lý SIMT thực thi mã với hiệu quả giống như SIMD.
B-36 Phụ lục B Đồ họa và GPU điện toán

Kết hợp tám lõi bộ xử lý phát trực tuyến với nhau thành một bộ xử lý đa xử lý
và sau đó thực hiện một số lượng lớn các bộ xử lý như vậy làm cho một bộ đa xử
lý hai cấp bao gồm các bộ xử lý đa cấp. Mô hình lập trình CUDA khai thác hệ
thống phân cấp hai cấp bằng cách cung cấp các luồng riêng lẻ cho các tính toán
song song chi và bằng cách cung cấp các lưới của các khối luồng cho các hoạt
động song song hạt thô. Chương trình luồng tương tự có thể cung cấp cả hoạt
động hạt mịn và hạt thô. Ngược lại, CPU có hướng dẫn vectơ SIMD phải sử
dụng hai mô hình lập trình khác nhau để cung cấp các thao tác hạt mịn và hạt thô:
các luồng song song hạt thô trên các lõi khác nhau và hướng dẫn vectơ SIMD
cho song song dữ liệu hạt mịn.

Kết luận đa bộ xử lý đa luồng


Bộ xử lý đa xử lý GPU dựa trên kiến trúc Tesla rất đa luồng, thực hiện tổng cộng
tối đa 512 luồng nhẹ đồng thời để hỗ trợ các bộ tạo pixel hạt mịn và các luồng
CUDA. Nó sử dụng một biến thể trên kiến trúc SIMD và đa luồng được gọi là
SIMT (đa hướng dẫn đơn) để phát một cách hiệu quả một lệnh tới một sợi dọc
gồm 32 luồng song song, trong khi cho phép mỗi luồng phân nhánh và thực thi
độc lập. Mỗi luồng thực hiện luồng hướng dẫn của nó trên một trong tám luồng bộ
xử lý phát trực tuyến (SP) lõi, được đa luồng lên đến 64 luồng.
PTX ISA là một ISA vô hướng tải / lưu trữ dựa trên đăng ký mô tả việc thực hiện
một luồng duy nhất. Do các hướng dẫn PTX được tối ưu hóa và dịch sang các vi cấu
trúc nhị phân cho một GPU cụ thể, các hướng dẫn phần cứng có thể phát triển nhanh
chóng mà không làm gián đoạn các trình biên dịch và công cụ phần mềm tạo ra các
hướng dẫn PTX.

B.5 Hệ thống bộ nhớ song song

Bên ngoài GPU, hệ thống con bộ nhớ là yếu tố quyết định quan trọng nhất đến
hiệu suất của hệ thống đồ họa. Khối lượng công việc đồ họa đòi hỏi tỷ lệ truyền
rất cao đến và từ bộ nhớ. Các thao tác ghi và trộn pixel (đọc-sửa đổi-viết), đọc và
ghi bộ đệm độ sâu và đọc bản đồ kết cấu, cũng như đọc dữ liệu đỉnh và đối tượng
và đối tượng, bao gồm phần lớn lưu lượng bộ nhớ.
GPU hiện đại rất song song, như thể hiện trong Hình B.2.5Ví dụ: GeForce 8800
có thể xử lý 32 pixel mỗi xung nhịp, ở mức 600 MHz. Mỗi pixel thường yêu cầu đọc
và ghi màu và đọc và ghi độ sâu của pixel 4 byte. Thông thường, trung bình hai hoặc
ba texels bốn byte mỗi byte được đọc để tạo màu pixel pixel. Vì vậy, đối với một
trường hợp điển hình, có nhu cầu 28 byte lần 32 pixel = 896 byte mỗi đồng hồ. Rõ
ràng nhu cầu băng thông trên hệ thống bộ nhớ là rất lớn.
B.5 Hệ thống bộ nhớ song song B-37

Để cung cấp các yêu cầu này, hệ thống bộ nhớ GPU có các đặc điểm sau :
■ Chúng rộng, có nghĩa là có một số lượng lớn chân để truyền dữ liệu giữa
GPU và các thiết bị bộ nhớ của nó và mảng bộ nhớ bao gồm nhiều chip
DRAM để cung cấp tổng chiều rộng bus dữ liệu.
■ Chúng nhanh, có nghĩa là các kỹ thuật báo hiệu tích cực được sử dụng để
tối đa hóa tốc độ dữ liệu (bit / giây) trên mỗi pin.
■ GPU tìm cách sử dụng mọi chu kỳ có sẵn để truyền dữ liệu đến hoặc từ
mảng bộ nhớ. Để đạt được điều này, GPU đặc biệt không nhằm mục đích
giảm thiểu độ trễ cho hệ thống bộ nhớ. Thông lượng cao (hiệu quả sử dụng)
và độ trễ ngắn về cơ bản là xung đột.
■ Các kỹ thuật nén được sử dụng, cả mất mát, trong đó lập trình viên phải nhận
thức được và không mất mát, điều này là vô hình đối với ứng dụng và cơ hội.
■ Bộ nhớ cache và cấu trúc kết hợp công việc được sử dụng để giảm lượng
lưu lượng ngoài chip cần thiết và để đảm bảo rằng các chu kỳ dành cho dữ
liệu di chuyển được sử dụng đầy đủ nhất có thể.

Cân nhắc DRAM


GPU phải tính đến các đặc điểm độc đáo của DRAM. Các chip DRAM được sắp
xếp bên trong thành nhiều ngân hàng (thường là bốn đến tám), trong đó mỗi ngân
hàng bao gồm một số lượng hàng 2 (thường là khoảng 16.384) và mỗi hàng chứa
một số bit có công suất 2 (thường là 8192). DRAM áp đặt nhiều yêu cầu về thời
gian đối với bộ xử lý điều khiển của chúng. Ví dụ: hàng chục chu kỳ được yêu
cầu để kích hoạt một hàng, nhưng sau khi được kích hoạt, các bit trong hàng đó
có thể truy cập ngẫu nhiên với một địa chỉ cột mới cứ sau bốn đồng hồ. Dữ liệu
kép tỷ lệ (DDR) dữ liệu truyền DRAM đồng bộ trên cả hai cạnh tăng và giảm của
đồng hồ giao diện (xem Chương 5). Vì vậy, DRAM DDR được chuyển xung
nhịp 1 GHz ở mức 2 gigabit mỗi giây cho mỗi pin dữ liệu. DRAM đồ họa DDR
thường có 32 chân dữ liệu hai chiều, vì vậy tám byte có thể được đọc hoặc ghi từ
DRAM mỗi đồng hồ.
GPU trong nội bộ có một số lượng lớn các bộ tạo lưu lượng bộ nhớ. Các giai đoạn
khác nhau của đường ống đồ họa logic, mỗi luồng có các luồng yêu cầu riêng: tìm nạp
thuộc tính lệnh và đỉnh, tìm nạp và tải / lưu trữ kết cấu shader, và độ sâu pixel và ghi
màu. Ở mỗi giai đoạn logic, thường có nhiều đơn vị độc lập để cung cấp thông lượng
song song. Đây là mỗi người yêu cầu bộ nhớ độc lập. Khi được xem tại hệ thống bộ
nhớ, có một số lượng lớn các yêu cầu không liên quan trong chuyến bay. Đây là một
sự không phù hợp tự nhiên với mẫu tham chiếu được DRAM ưa thích. Một giải pháp
là bộ điều khiển bộ nhớ GPU, duy trì một đống lưu lượng riêng biệt bị ràng buộc cho
các ngân hàng DRAM khác nhau và đợi cho đến khi đủ lưu lượng
B-38 Phụ lục B Đồ họa và GPU điện toán

một hàng DRAM cụ thể đang chờ xử lý trước khi kích hoạt hàng đó và chuyển tất
cả lưu lượng truy cập cùng một lúc. Lưu ý rằng việc tích lũy các yêu cầu đang chờ
xử lý, trong khi tốt cho địa phương hàng DRAM và do đó sử dụng hiệu quả bus dữ
liệu, dẫn đến độ trễ trung bình dài hơn như các nhà yêu cầu có yêu cầu dành thời
gian chờ đợi người khác. Thiết kế phải lưu ý rằng không có yêu cầu cụ thể nào chờ
đợi quá lâu, nếu không, một số đơn vị xử lý có thể chết đói chờ dữ liệu và cuối
cùng khiến các bộ xử lý lân cận trở nên nhàn rỗi.
Các hệ thống con bộ nhớ GPU được sắp xếp thành nhiều phân vùng bộ nhớ,
mỗi bộ bao gồm bộ điều khiển bộ nhớ hoàn toàn độc lập và một hoặc hai thiết bị
DRAM được sở hữu hoàn toàn và độc quyền bởi phân vùng đó. Để đạt được sự
cân bằng tải tốt nhất và do đó tiếp cận hiệu suất lý thuyết của n các phân vùng,
địa chỉ được xen kẽ đều trên tất cả các phân vùng bộ nhớ. Các sải chân xen kẽ
phân vùng thường là một khối vài trăm byte. Số lượng phân vùng bộ nhớ được
thiết kế để cân bằng số lượng bộ xử lý và các bộ nhớ khác.

Bộ nhớ cache
Khối lượng công việc GPU thường có các bộ làm việc rất lớn theo thứ tự hàng
trăm megabyte để tạo ra một khung đồ họa duy nhất. Không giống như CPU, việc
xây dựng bộ nhớ cache trên chip đủ lớn để chứa bất cứ thứ gì gần với toàn bộ
công việc của ứng dụng đồ họa là không thực tế. Trong khi CPU có thể giả định
tỷ lệ tấn công bộ đệm rất cao (99,9% trở lên), GPU trải nghiệm tỷ lệ đạt gần 90%
và do đó phải đối phó với nhiều lần bỏ lỡ trong chuyến bay. Mặc dù CPU có thể
được thiết kế hợp lý để dừng trong khi chờ đợi bộ nhớ cache hiếm gặp, GPU cần
tiến hành bỏ lỡ và các lần truy cập xen kẽ. Chúng tôi gọi đây là a phát trực tuyến
kiến trúc bộ nhớ cache.
Bộ nhớ cache GPU phải cung cấp băng thông rất cao cho khách hàng của họ.
Hãy xem xét trường hợp của một bộ đệm kết cấu. Một đơn vị kết cấu điển hình có
thể đánh giá hai phép nội suy song tuyến cho mỗi bốn pixel mỗi chu kỳ đồng hồ
và GPU có thể có nhiều đơn vị kết cấu như vậy đều hoạt động độc lập. Mỗi phép
nội suy song tuyến yêu cầu bốn texels riêng biệt và mỗi texel có thể là một giá trị
64 bit. Bốn thành phần 16 bit là điển hình. Do đó, tổng băng thông là 2 × 4 × 4 ×
64 = 2048 bit mỗi đồng hồ. Mỗi texel 64 bit riêng biệt được xử lý độc lập, vì vậy
bộ đệm cần xử lý 32 địa chỉ duy nhất trên mỗi đồng hồ. Điều này tự nhiên ủng hộ
sự sắp xếp đa cấp và / hoặc đa cổng của các mảng SRAM.

MMU
GPU hiện đại có khả năng dịch địa chỉ ảo sang địa chỉ vật lý. Trên GeForce 8800,
tất cả các đơn vị xử lý tạo địa chỉ bộ nhớ trong không gian địa chỉ ảo 40 bit. Đối
với máy tính, tải và hướng dẫn luồng lưu trữ, sử dụng địa chỉ byte 32 bit, được
mở rộng đến địa chỉ ảo 40 bit bằng cách thêm bù 40 bit. Một đơn vị quản lý bộ
nhớ thực hiện ảo đến địa chỉ vật lý
B.5 Hệ thống bộ nhớ song song B-39

dịch; phần cứng đọc các bảng trang từ bộ nhớ cục bộ để phản hồi các lỗi thay
mặt cho một hệ thống các bộ đệm lookaside dịch thuật trải rộng giữa các bộ xử lý
và công cụ kết xuất. Ngoài các bit trang vật lý, các mục trong bảng trang GPU
chỉ định thuật toán nén cho mỗi trang. Kích thước trang dao động từ 4 đến 128
kilobyte.

Không gian bộ nhớ


Như đã giới thiệu trong Mục B.3, CUDA phơi bày các không gian bộ nhớ khác
nhau để cho phép lập trình viên lưu trữ các giá trị dữ liệu theo cách tối ưu nhất về
hiệu suất. Đối với các cuộc thảo luận sau đây, GPU kiến trúc NVIDIA Tesla
được giả định.

Ký ức toàn cầu
Bộ nhớ toàn cầu được lưu trữ trong DRAM bên ngoài; nó không phải là cục bộ
cho bất kỳ một vật lý phát trực tuyến đa xử lý (SM) bởi vì nó có nghĩa là để giao
tiếp giữa các CTA khác nhau (khối ren) trong các lưới khác nhau. Trên thực tế,
nhiều CTA tham chiếu một vị trí trong bộ nhớ toàn cầu có thể không được thực
thi trong GPU cùng một lúc; theo thiết kế, trong CUDA, một lập trình viên
không biết thứ tự tương đối trong đó CTA được thực thi. Vì không gian địa chỉ
được phân bổ đều giữa tất cả các phân vùng bộ nhớ, nên phải có đường dẫn đọc /
ghi từ bất kỳ bộ đa xử lý phát trực tuyến nào đến bất kỳ phân vùng DRAM nào.
Truy cập vào bộ nhớ toàn cầu bằng các luồng khác nhau (và các bộ xử lý khác
nhau) không được đảm bảo có tính nhất quán tuần tự. Các chương trình chủ đề
thấy một mô hình đặt hàng bộ nhớ thoải mái. Trong một luồng, thứ tự bộ nhớ đọc
và ghi vào cùng một địa chỉ được bảo tồn, nhưng thứ tự truy cập vào các địa chỉ
khác nhau có thể không được bảo tồn. Bộ nhớ đọc và ghi được yêu cầu bởi các
chủ đề khác nhau không được sắp xếp. Trong CTA, hướng dẫn đồng bộ hóa rào
cản bar.sync có thể được sử dụng để có được thứ tự bộ nhớ nghiêm ngặt trong số
các luồng của CTA. Các membar lệnh luồng cung cấp một thao tác rào / hàng rào
bộ nhớ cam kết truy cập bộ nhớ trước và làm cho chúng hiển thị với các luồng
khác trước khi tiếp tục. Chủ đề cũng có thể sử dụng các hoạt động bộ nhớ nguyên
tử được mô tả trong Mục B.4 để phối hợp làm việc trên bộ nhớ họ chia sẻ.

Bộ nhớ dùng chung


Bộ nhớ chia sẻ Per-CTA chỉ hiển thị với các luồng thuộc về CTA đó và bộ nhớ
dùng chung chỉ chiếm lưu trữ từ khi CTA được tạo cho đến khi nó kết thúc. Do
đó, bộ nhớ dùng chung có thể nằm trên chip. Cách tiếp cận này có nhiều lợi ích.
Đầu tiên, buôn bán bộ nhớ dùng chung không cần phải cạnh tranh với băng thông
ngoài chip hạn chế cần thiết cho các tham chiếu bộ nhớ toàn cầu. Thứ hai, thực tế
là xây dựng các cấu trúc bộ nhớ băng thông rất cao trên chip để hỗ trợ nhu cầu
đọc / ghi của từng bộ xử lý phát trực tuyến. Trong thực tế, bộ nhớ dùng chung
được kết hợp chặt chẽ với bộ đa xử lý phát trực tuyến.
B-40 Phụ lục B Đồ họa và GPU điện toán

Mỗi bộ xử lý phát trực tuyến chứa tám bộ xử lý luồng vật lý. Trong một chu kỳ
đồng hồ bộ nhớ dùng chung, mỗi bộ xử lý luồng có thể xử lý hai luồng hướng dẫn
giá trị, do đó, 16 luồng giá trị của các yêu cầu bộ nhớ dùng chung phải được xử lý
trong mỗi đồng hồ. Vì mỗi luồng có thể tạo địa chỉ riêng và địa chỉ thường là duy
nhất, bộ nhớ dùng chung được xây dựng bằng 16 ngân hàng SRAM có thể định
địa chỉ độc lập. Đối với các mẫu truy cập chung, 16 ngân hàng đủ để duy trì thông
lượng, nhưng các trường hợp bệnh lý là có thể; ví dụ, tất cả 16 luồng có thể xảy ra
để truy cập một địa chỉ khác trên một ngân hàng SRAM. Phải có thể định tuyến
một yêu cầu từ bất kỳ làn đường chủ đề nào đến bất kỳ ngân hàng nào của SRAM,
do đó cần có mạng kết nối 16 x 16.

Ký ức địa phương
Bộ nhớ cục bộ theo luồng là bộ nhớ riêng chỉ hiển thị cho một luồng. Bộ nhớ cục
bộ lớn hơn về mặt kiến trúc so với tệp đăng ký luồng và một chương trình có thể
tính toán địa chỉ vào bộ nhớ cục bộ. Để hỗ trợ phân bổ lớn bộ nhớ cục bộ (nhớ lại
tổng phân bổ là số lần phân bổ cho mỗi luồng nhân với số lượng luồng hoạt
động), bộ nhớ cục bộ được phân bổ trong DRAM bên ngoài .
Mặc dù bộ nhớ cục bộ toàn cầu và mỗi luồng nằm ngoài chip, nhưng chúng rất
phù hợp để được lưu trữ trên chip.

Ký ức không đổi
Bộ nhớ không đổi chỉ đọc cho một chương trình chạy trên SM (nó có thể được
viết thông qua các lệnh tới GPU). Nó được lưu trữ trong DRAM bên ngoài và
được lưu trong SM. Bởi vì thông thường hầu hết hoặc tất cả các luồng trong sợi
dọc SIMT được đọc từ cùng một địa chỉ trong bộ nhớ không đổi, một địa chỉ duy
nhất tra cứu trên mỗi đồng hồ là đủ. Bộ đệm không đổi được thiết kế để phát các
giá trị vô hướng đến các luồng trong mỗi sợi dọc.

Bộ nhớ kết cấu


Bộ nhớ kết cấu chứa các mảng dữ liệu chỉ đọc lớn. Hoạ tiết cho điện toán có các
thuộc tính và khả năng giống như kết cấu được sử dụng với đồ họa 3D. Mặc dù
kết cấu thường là hình ảnh hai chiều (mảng 2D của giá trị pixel), kết cấu 1D
(tuyến tính) và 3D (âm lượng) cũng có sẵn.
Một chương trình tính toán tham chiếu một kết cấu bằng cách sử dụng a tex
chỉ dẫn. Các toán tử bao gồm một định danh để đặt tên cho kết cấu và một, hai
hoặc ba tọa độ dựa trên kích thước kết cấu. Các tọa độ dấu phẩy động bao gồm
một phần phân số chỉ định vị trí mẫu, thường ở giữa các vị trí texel. Các tọa độ
Noninteger gọi phép nội suy có trọng số song tuyến của bốn giá trị gần nhất (đối
với kết cấu 2D) trước khi kết quả được trả về chương trình.
Các tìm nạp kết cấu được lưu trong một hệ thống phân cấp bộ đệm phát trực
tuyến được thiết kế để tối ưu hóa thông lượng của các tìm nạp kết cấu từ hàng
ngàn luồng đồng thời. Một số chương trình sử dụng tìm nạp kết cấu như một
cách để lưu bộ nhớ toàn cầu.
B.6 Số học điểm nổi B-41

Bề mặt
Bề mặt là một thuật ngữ chung cho một mảng giá trị pixel một chiều, hai chiều
hoặc ba chiều và một định dạng liên quan. Một loạt các định dạng được xác định;
ví dụ: một pixel có thể được định nghĩa là bốn thành phần số nguyên RGBA 8 bit
hoặc bốn thành phần dấu phẩy động 16 bit. Một hạt nhân chương trình không cần
biết loại bề mặt. A tex lệnh gọi lại các giá trị kết quả của nó là dấu phẩy động, tùy
thuộc vào định dạng bề mặt.

Tải / truy cập cửa hàng


Tải / lưu trữ hướng dẫn với địa chỉ byte số nguyên cho phép viết và biên dịch
chương trình bằng các ngôn ngữ thông thường như C và C ++. Các chương trình
CUDA sử dụng hướng dẫn tải / lưu trữ để truy cập bộ nhớ.
Để cải thiện băng thông bộ nhớ và giảm chi phí, các hướng dẫn tải / lưu trữ
cục bộ và toàn cầu kết hợp các yêu cầu luồng song song riêng lẻ từ cùng một sợi
dọc thành một yêu cầu khối bộ nhớ khi các địa chỉ nằm trong cùng một khối và
đáp ứng các tiêu chí căn chỉnh. Kết hợp các yêu cầu bộ nhớ nhỏ riêng lẻ vào các
yêu cầu khối lớn cung cấp một hiệu suất đáng kể so với các yêu cầu riêng biệt. Số
lượng luồng lớn, cùng với hỗ trợ cho nhiều yêu cầu tải nổi bật, giúp bao gồm độ
trễ tải để sử dụng cho bộ nhớ cục bộ và toàn cầu được triển khai trong DRAM
bên ngoài .

ROP
Như thể hiện trong Hình B.2.5, GPU kiến trúc NVIDIA Tesla bao gồm một khả năng
mở rộng phát trực tuyến mảng bộ xử lý (SPA), thực hiện tất cả các chương trình GPU
tính toán và hệ thống bộ nhớ có thể mở rộng, bao gồm điều khiển DRAM bên ngoài
và chức năng cố định Bộ xử lý vận hành raster (ROP) thực hiện các thao tác khung
màu và độ sâu trực tiếp trên bộ nhớ. Mỗi đơn vị ROP được ghép nối với một phân
vùng bộ nhớ cụ thể. Các phân vùng ROP được cung cấp từ các SM thông qua mạng
kết nối. Mỗi ROP chịu trách nhiệm kiểm tra độ sâu và cập nhật stprint, cũng như pha
trộn màu sắc. ROP và bộ điều khiển bộ nhớ hợp tác để thực hiện nén màu và độ sâu
không mất dữ liệu (tối đa 8: 1) để giảm nhu cầu băng thông bên ngoài. Các đơn vị
ROP cũng thực hiện các hoạt động nguyên tử trên bộ nhớ.

B.6 Số học điểm nổi

GPU ngày nay thực hiện hầu hết các thao tác số học trong các lõi bộ xử lý có thể lập
trình bằng cách sử dụng các thao tác dấu phẩy động 32 bit chính xác tương thích với
IEEE 754 (xem Chương 3). Số học điểm cố định của GPU sớm đã thành công bởi
điểm nổi 16 bit, 24 bit và 32 bit, sau đó là điểm nổi 32 bit tương thích với IEEE 754.
B-42 Phụ lục B Đồ họa và GPU điện toán

Một số logic chức năng cố định trong GPU, chẳng hạn như phần cứng lọc kết cấu,
tiếp tục sử dụng các định dạng số độc quyền. Các GPU gần đây cũng cung cấp
các hướng dẫn dấu phẩy động 64 bit có độ chính xác kép tương thích với chuẩn
754.

Các định dạng được hỗ trợ


Tiêu chuẩn IEEE 754 cho số học dấu phẩy động chỉ định các định dạng cơ bản và
lưu trữ. GPU sử dụng hai trong số các định dạng cơ bản để tính toán, điểm nổi
độ chính xác một nửa nhị phân 32 bit và 64 bit, thường được gọi là độ chính xác đơn và độ chính xác
Một bit 16 định dạng kép. Tiêu chuẩn cũng chỉ định định dạng dấu phẩy động lưu trữ nhị phân 16 bit ,
dấu phẩy động nhị phân, độ chính xác một nửa GPU và ngôn ngữ tạo bóng Cg sử dụng định dạng nửa dữ
với 1 bit ký hiệu, số mũ
5 bit, phân số 10 bit và
liệu hẹp 16 bit để lưu trữ và di chuyển dữ liệu hiệu quả, trong khi vẫn duy trì dải
bit số nguyên ngụ ý. động cao. GPU thực hiện nhiều tính toán lọc kết cấu và trộn pixel với độ chính
xác một nửa trong bộ lọc kết cấu và bộ phận vận hành raster. Định dạng tệp hình
ảnh dải động cao OpenEXR được phát triển bởi. Ánh sáng công nghiệp và ma
thuật [2003] sử dụng định dạng một nửa giống hệt nhau cho các giá trị thành phần
màu trong các ứng dụng hình ảnh và hình ảnh chuyển động của máy tính.

Số học cơ bản
Các hoạt động dấu phẩy động chính xác đơn phổ biến trong các lõi lập trình GPU
nhân-thêm (MAD) bao gồm cộng, nhân , nhân thêm, tối thiểu, tối đa, so sánh, đặt vị ngữ và chuyển
Một lệnh dấu phẩy động đổi giữa các số nguyên và số dấu phẩy động. Các hướng dẫn điểm nổi thường
duy nhất thực hiện thao cung cấp các công cụ sửa đổi toán hạng nguồn cho phủ định và giá trị tuyệt đối.
tác ghép: phép nhân theo Các hoạt động cộng và nhân dấu phẩy động của hầu hết các GPU hiện nay đều
sau là phép cộng.
tương thích với tiêu chuẩn IEEE 754 cho các số FP chính xác duy nhất, bao gồm
không phải là một con số (NaN) và các giá trị vô cực. Các hoạt động cộng và
nhân của FP sử dụng vòng tròn từ gần nhất đến gần nhất - ngay cả khi chế độ làm
tròn mặc định. Để tăng thông lượng lệnh dấu phẩy động, GPU thường sử dụng
lệnh ghép nhân (điên). Thao tác nhân thêm thực hiện phép nhân FP với cắt ngắn,
tiếp theo là phép cộng FP với vòng tròn đến gần nhất. Nó cung cấp hai thao tác
dấu phẩy động trong một chu kỳ phát hành, mà không yêu cầu bộ lập lịch lệnh
gửi hai hướng dẫn riêng biệt, nhưng tính toán không được hợp nhất và cắt ngắn
sản phẩm trước khi bổ sung. Điều này làm cho nó khác với hướng dẫn nhân hợp
nhất được thảo luận trong Chương 3 và sau này trong phần này. Các GPU thường
xả các toán hạng nguồn không chuẩn hóa về số 0 được bảo toàn bằng dấu và
chúng sẽ tuôn ra các kết quả làm giảm phạm vi số mũ đầu ra đích đến số 0 được
bảo toàn sau khi làm tròn.

Số học chuyên ngành


GPU cung cấp phần cứng để tăng tốc tính toán chức năng đặc biệt, nội suy thuộc
tính và lọc kết cấu. Hướng dẫn chức năng đặc biệt bao gồm cosine ,
B.6 Số học điểm nổi B-43

sin, hàm mũ nhị phân, logarit nhị phân, đối ứng và căn bậc hai đối ứng. Các
hướng dẫn nội suy thuộc tính cung cấp việc tạo các thuộc tính pixel hiệu quả,
xuất phát từ đánh giá phương trình mặt phẳng. Các đơn vị chức năng đặc biệt đơn vị chức năng đặc
(SFU) giới thiệu trong Mục B.4 tính toán các hàm đặc biệt và nội suy các thuộc biệt (SFU) Một đơn vị
tính phẳng [Oberman và Siu, 2005]. phần cứng tính toán các
Một số phương pháp tồn tại để đánh giá các chức năng đặc biệt trong phần hàm đặc biệt và nội suy
các thuộc tính phẳng.
cứng. Nó đã được chỉ ra rằng phép nội suy bậc hai dựa trên các xấp xỉ Minimax
nâng cao là một phương pháp rất hiệu quả để xấp xỉ các chức năng trong phần
cứng, bao gồm đối ứng, căn bậc hai đối ứng, log2x, 2x, tội lỗi và cos.
Chúng ta có thể tóm tắt phương pháp nội suy bậc hai SFU. Đối với một đầu
vào nhị phân operand X với n-bit có ý nghĩa và, ý nghĩa được chia thành hai
phần :
Xbạn là phần trên có chứa m bit và Xl là phần dưới chứa n-m bit.
được sử dụng để tham khảo một bộ ba bảng tra cứu để trả về
Phần trên m bit Xbạn ba
hệ số từ hữu hạn C, C và C . Mỗi chức năng được tính gần đúng yêu cầu
0 1 2

một bộ bảng độc đáo. Các hệ số này được sử dụng để ước tính một hàm đã cho
f (X) trong phạm vi
X X <X + 2-m bằng cách đánh giá biểu thức :
bạ
n bạn

f (X) C0 C1X1 C2 X12

Độ chính xác của từng ước tính hàm dao động từ 22 đến 24 bit có ý nghĩa.
Thống kê chức năng ví dụ được hiển thị trong Hình B.6.1.
Tiêu chuẩn IEEE 754 chỉ định các yêu cầu làm tròn chính xác cho phân chia
và căn bậc hai; tuy nhiên, đối với nhiều ứng dụng GPU, không cần tuân thủ chính
xác. Thay vào đó, đối với các ứng dụng đó, thông lượng tính toán cao hơn quan
trọng hơn độ chính xác bit cuối cùng. Đối với các chức năng đặc biệt của SFU,
thư viện toán CUDA cung cấp cả chức năng chính xác đầy đủ và chức năng
nhanh với độ chính xác của lệnh SFU.
Một hoạt động số học chuyên ngành khác trong GPU là nội suy thuộc tính. Chìa
khóa thuộc tính thường được chỉ định cho các đỉnh của các nguyên thủy tạo thành
một cảnh được hiển thị. Các thuộc tính ví dụ là tọa độ màu, độ sâu và kết cấu. Các
thuộc tính này phải được nội suy trong không gian màn hình (x, y) khi cần để xác
định

Đầu Độ chính ULP* % chính


Chức vào xác lỗi xác tròn Đơn điệu
năng khoảng (bit tốt)
thời
gian
1
/x [1, 2) 24.02 0,98 87 Đúng
1 / sqrt (x ) [1, 4) 23,40 1,52 78 Đúng
x
2 [0, 1) 22,51 1.41 74 Đúng
đă
ng
nhậx [1, 2) 22,57 Không có** Không có Đúng
p
2

tội lỗi / cos [0, / 2) 22,47 Không có Không có Không

* ULP: đơn vị ở vị trí cuối cùng.**Không áp dụng: không áp dụng.

HÌNH B.6.1 Thống kê gần đúng chức năng đặc biệt. Đối với NVIDIA GeForce 8800 đặc biệt đơn
vị chức năng (SFU).
B-44 Phụ lục B Đồ họa và GPU điện toán

giá trị của các thuộc tính tại mỗi vị trí pixel. Giá trị của một thuộc tính đã cho U
trong một mặt phẳng (x, y) có thể được biểu thị bằng các phương trình mặt phẳng
có dạng :
U (x, y) Abạn x Bbạn Y Cbạn

Ở đâu A, B, và C là các tham số nội suy được liên kết với từng thuộc tính U Các
tham số nội suy. A, B, và C tất cả được biểu diễn dưới dạng số dấu phẩy động
chính xác đơn.
Do nhu cầu về cả bộ đánh giá chức năng và bộ nội suy thuộc tính trong bộ xử
lý bóng pixel, một SFU duy nhất thực hiện cả hai chức năng cho hiệu quả có thể
được thiết kế. Cả hai hàm sử dụng tổng hoạt động của sản phẩm để nội suy kết
quả và số lượng thuật ngữ được tổng hợp trong cả hai hàm là rất giống nhau.

Hoạt động kết cấu


Ánh xạ và lọc kết cấu là một tập hợp chính khác của các phép toán số học dấu
phẩy động chuyên dụng trong GPU. Các hoạt động được sử dụng để ánh xạ kết
cấu bao gồm :
Bản đồ MIP Một tiếng 1. Nhận địa chỉ kết cấu (s, t) cho pixel màn hình hiện tại (x, y), trong đó s và
Latin cụm từ multum t là số dấu phẩy động chính xác đơn.
trong parvo, hoặc nhiều
trong một không gian 2. Tính toán mức độ chi tiết để xác định kết cấu chính xác Bản đồ MIP cấp
nhỏ. Bản đồ MIP chứa độ.
hình ảnh được tính toán
trước của các độ phân 3. Tính phần nội suy trilinear.
giải khác nhau, được sử 4. Địa chỉ kết cấu tỷ lệ (s, t) cho cấp độ bản đồ MIP đã chọn.
dụng để tăng tốc độ kết
xuất và giảm các tạo 5. Truy cập bộ nhớ và truy xuất các texels mong muốn (các phần tử kết cấu).
phẩm.
6. Thực hiện thao tác lọc trên texels.
Ánh xạ kết cấu đòi hỏi một lượng đáng kể tính toán dấu phẩy động cho hoạt động
tốc độ đầy đủ, phần lớn được thực hiện ở độ chính xác một nửa 16 bit. Ví dụ,
GeForce 8800 Ultra cung cấp khoảng 500 GFLOPS tính toán dấu phẩy động định
dạng độc quyền cho các hướng dẫn ánh xạ kết cấu, ngoài các hướng dẫn dấu
phẩy động chính xác đơn thông thường của IEEE. Để biết thêm chi tiết về ánh xạ
kết cấu và lọc, xem Foley và van Dam [1995].

Hiệu suất
Phần cứng số học cộng và nhân dấu phẩy động được sắp xếp hoàn toàn và độ trễ
được tối ưu hóa để cân bằng độ trễ và diện tích. Trong khi đường ống, thông
lượng của các hàm đặc biệt nhỏ hơn các phép toán cộng và nhân điểm nổi. Thông
lượng tốc độ hàng quý cho các chức năng đặc biệt là hiệu suất điển hình trong
các GPU hiện đại, với một SFU được chia sẻ bởi bốn lõi SP. Ngược lại, CPU
thường có thông lượng thấp hơn đáng kể cho các chức năng tương tự, chẳng hạn
như phân chia và căn bậc hai, mặc dù có kết quả chính xác hơn. Phần cứng nội
suy thuộc tính
thường được đặt
hoàn toàn bằng ống
để kích hoạt các bộ
tạo pixel tốc độ đầy
đủ.
B.6 Số học điểm nổi B-45

Độ chính xác gấp đôi


Các GPU mới hơn như Tesla T10P cũng hỗ trợ các hoạt động chính xác kép 64
bit của IEEE 754 trong phần cứng. Các phép toán số học dấu phẩy động tiêu
chuẩn với độ chính xác kép bao gồm cộng, nhân và chuyển đổi giữa các định
dạng dấu phẩy động và số nguyên khác nhau. Tiêu chuẩn dấu phẩy động IEEE
754 2008 bao gồm thông số kỹ thuật cho hợp nhất-nhiều-thêm (FMA) hoạt động,
như đã thảo luận trong Chương 3Thao tác FMA thực hiện phép nhân dấu phẩy
động theo sau là phép cộng, với một vòng tròn duy nhất. Các phép nhân hợp nhất
và các phép toán bổ sung giữ được độ chính xác đầy đủ trong các phép tính trung
gian. Hành vi này cho phép tính toán dấu phẩy động chính xác hơn liên quan đến
việc tích lũy sản phẩm, bao gồm các sản phẩm chấm, nhân ma trận và đánh giá đa
thức. Hướng dẫn FMA cũng cho phép triển khai phần mềm hiệu quả của phân
chia tròn và căn bậc hai chính xác, loại bỏ nhu cầu phân chia phần cứng hoặc đơn
vị căn bậc hai.
Một đơn vị FMA phần cứng có độ chính xác kép thực hiện bổ sung 64 bit,
nhân, chuyển đổi và chính hoạt động FMA. Kiến trúc của a

64 64 64

A B C
53 53 53

Đảo ngược
Mảng số nhân
53 x 53 Sắp xếp Exp
shifter Khác biệt
Mang Thay
Tổng theo đổi 161
C
3-2 CSA 161 bit
Mang
Tổng theo

Mang theo Tuyên truyền Adder

Người bổ sung

Bình thường hóa

Tròn hơn

HÌNH B.6.2 Đơn vị hợp nhất chính xác kép (FMA). Phần cứng để thực hiện điểm nổi A × B + C
cho độ chính xác kép.
B-46 Phụ lục B Đồ họa và GPU điện toán

đơn vị FMA chính xác kép cho phép hỗ trợ số không chuẩn hóa tốc độ đầy đủ
trên cả đầu vào và đầu ra. Hình B.6.2 hiển thị sơ đồ khối của một đơn vị FMA.
Như thể hiện trong Hình B.6.2, ý nghĩa của A và B được nhân lên để tạo thành sản
phẩm 106 bit, với kết quả còn lại ở dạng lưu mang. Song song, phần bổ sung C 53 bit
được đảo ngược có điều kiện và được căn chỉnh theo sản phẩm 106 bit. Tổng và kết
quả mang theo của sản phẩm 106 bit được tính tổng với phần phụ được căn chỉnh
thông qua rộng 161 bit adder lưu mang (CSA). Đầu ra lưu mang sau đó được tổng
hợp lại với nhau trong một bộ cộng mang mầm bệnh để tạo ra kết quả không bị ảnh
hưởng ở dạng không bổ sung, hai dạng bổ sung. Kết quả được bổ sung có điều kiện,
để trả về kết quả ở dạng cường độ ký. Kết quả bổ sung được chuẩn hóa, và sau đó nó
được làm tròn để phù hợp với định dạng đích.

B.7 Đồ thật: NVIDIA GeForce 8800

GPU NVIDIA GeForce 8800, được giới thiệu vào tháng 11 năm 2006, là một thiết kế
bộ xử lý đỉnh và pixel thống nhất cũng hỗ trợ các ứng dụng điện toán song song được
viết bằng C bằng mô hình lập trình song song CUDA. Đây là triển khai đầu tiên của
kiến trúc đồ họa và điện toán thống nhất Tesla được mô tả trong Mục B.4 và trong
Lindholm và cộng sự. [2008]Một nhóm GPU kiến trúc Tesla giải quyết các nhu cầu
khác nhau của máy tính xách tay, máy tính để bàn, máy trạm và máy chủ.

Mảng bộ xử lý phát trực tuyến (SPA)


GPU GeForce 8800 được hiển thị trong Hình B.7.1 chứa 128 bộ xử lý phát trực
tuyến (SP) lõi được tổ chức là 16 phát trực tuyến đa bộ xử lý (SM). Hai SM chia
sẻ một đơn vị kết cấu trong mỗi cụm kết cấu / bộ xử lý (TPC). Một mảng gồm
tám TPC tạo nên phát trực tuyến mảng bộ xử lý (SPA), thực hiện tất cả các
chương trình shader đồ họa và chương trình điện toán.
Đơn vị giao diện máy chủ giao tiếp với CPU chủ thông qua bus PCI-Express,
kiểm tra tính nhất quán của lệnh và thực hiện chuyển đổi ngữ cảnh. Trình biên
dịch đầu vào thu thập các nguyên thủy hình học (điểm, đường, hình tam giác).
Các khối phân phối công việc gửi các đỉnh, pixel và tính toán các mảng luồng
đến các TPC trong SPA. Các TPC thực thi các chương trình shader đỉnh và hình
học và các chương trình điện toán. Dữ liệu hình học đầu ra được gửi đến khối
viewport / clip / setup / raster / zcull để được raster hóa thành các đoạn pixel sau
đó được phân phối lại vào SPA để thực hiện các chương trình shader pixel. Các
pixel được tô bóng được gửi qua mạng kết nối để xử lý bởi các đơn vị ROP.
Mạng cũng định tuyến các yêu cầu đọc bộ nhớ kết cấu từ SPA đến DRAM và
đọc dữ liệu từ DRAM thông qua bộ đệm cấp 2 trở lại SPA .
B.7 Real Stuff: NVIDIA GeForce 8800 B-47

CPU chủ Cầu Bộ nhớ hệ thống

GPU
Giao diện máy
chủ
Viewport / Clip / Độ nét cao
Thiết lập / Raster / Bộ xử lý video
ZCull
Trình biên dịch
đầu vào
Công việc pixel Công việc tính toán
SPA Phân phối Phân phối
Công việc Vertex
Phân phối
TPC TPC TPC TPC TPC TPC TPC TPC

SM SM SM SM SM SM SM SM SM SM SM SM SM SM SM SM

SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SP SP SP SP SP SP SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SP SP SP SP SP SP SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SP SP SP SP SP SP SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP

Đơn vị kết Đơn vị kết cấu Đơn vị kết cấu Đơn vị kết cấu Đơn vị kết cấu Đơn vị kết cấu Đơn vị kết cấu Đơn vị kết cấu
cấu
Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1

Mạng kết nối

ROP L2 ROP L2 ROP ROP L2 ROP L2 Giao diện


L2 ROP L2

DRAM DRAM DRAM DRAM DRAM DRAM Hiển thị

HÌNH B.7.1 NVIDIA Tesla thống nhất đồ họa và kiến trúc GPU điện toán. GeForce 8800 này có 128bộ xử lý phát trực tuyến (SP)
lõi trong 16 phát trực tuyến đa bộ xử lý (SM), sắp xếp thành tám cụm kết cấu / bộ xử lý (TPC). Các bộ xử lý kết nối với sáu phân vùng
DRAM rộng 64 bit thông qua mạng kết nối. Các GPU khác triển khai kiến trúc Tesla thay đổi số lượng lõi SP, SM, phân vùng DRAM và
các đơn vị khác.

Cụm kết cấu / bộ xử lý (TPC)


Mỗi TPC chứa một bộ điều khiển hình học, một SMC, hai SM và một đơn vị kết
cấu như được hiển thị trong Hình B.7.2.
Bộ điều khiển hình học ánh xạ đường ống đỉnh đồ họa logic vào tính toán lại
trên các SM vật lý bằng cách chỉ đạo tất cả các thuộc tính nguyên thủy và đỉnh và
cấu trúc liên kết trong TPC .
SMC kiểm soát nhiều SM, phân xử đơn vị kết cấu được chia sẻ, đường dẫn tải
/ lưu trữ và đường dẫn I / O. SMC phục vụ ba khối lượng công việc đồ họa cùng
một lúc: đỉnh, hình học và pixel.
Đơn vị kết cấu xử lý một lệnh kết cấu cho một đỉnh, hình học hoặc pixel quad
hoặc bốn luồng tính toán trên mỗi chu kỳ. Các nguồn hướng dẫn kết cấu là tọa độ
kết cấu và các đầu ra là các mẫu có trọng số, thường là màu dấu phẩy động bốn
thành phần (RGBA). Các đơn vị kết cấu được đường ống sâu. Mặc dù nó chứa
bộ đệm phát trực tuyến để nắm bắt địa phương lọc, nhưng nó phát ra các lần truy
cập trộn lẫn với các lần bỏ lỡ mà không bị đình trệ.
B-48 Phụ lục B Đồ họa và GPU điện toán

TPC SM
Bộ điều khiển hình học
I-Cache
SMC
Vấn đề MT
SM SM
I-Cache I-Cache C-Cache
Vấn đề Vấn đề
MT MT
SP SP
C-Cache C-Cache

SP SP SP SP
SP SP
SP SP SP SP

SP SP
SP SP SP SP

SP SP SP SP
SP SP

SFU SFU SFU SFU


Chia sẻ Chia sẻ SFU SFU
Ký ức Ký ức

Đơn vị kết cấu


Chia sẻ
Ký ức
Tex L1

HÌNH B.7.2 Cụm kết cấu / bộ xử lý (TPC) và bộ đa xử lý phát trực tuyến (SM). Mỗi SM có tám phát trực tuyếnr (SP) lõi, hai
SFU và bộ nhớ dùng chung.

Truyền phát đa bộ xử lý (SM)


SM là một bộ xử lý đồ họa và điện toán thống nhất thực hiện các chương trình
shader đỉnh, hình học và phân đoạn pixel và các chương trình điện toán song
song. SM bao gồm tám lõi xử lý luồng SP, hai SFU, đơn vị tìm nạp và phát hành
hướng dẫn đa luồng (vấn đề MT), bộ đệm lệnh, bộ đệm không đổi chỉ đọc và bộ
nhớ chia sẻ đọc / ghi 16 KB. Nó thực hiện các hướng dẫn vô hướng cho các chủ
đề riêng lẻ.
Đồng hồ GeForce 8800 Ultra đồng hồ lõi SP và SFU ở mức 1,5 GHz, cho mức
cao nhất là 36 GFLOPS mỗi SM. Để tối ưu hóa hiệu quả năng lượng và diện tích,
một số đơn vị SM nondatapath hoạt động ở một nửa tốc độ xung nhịp SP.
B.7 Real Stuff: NVIDIA GeForce 8800 B-49

Để thực thi hiệu quả hàng trăm luồng song song trong khi chạy một số chương
trình khác nhau, SM được đa luồng phần cứng. Nó quản lý và thực hiện tới 768 luồng
đồng thời trong phần cứng với chi phí lập lịch bằng không. Mỗi luồng có trạng thái
thực thi luồng riêng và có thể thực thi một đường dẫn mã độc lập.
Một sợi dọc bao gồm tối đa 32 luồng cùng loại đỉnh, hình học, pixel hoặc tính
toán. Thiết kế SIMT, được mô tả trước đây trong Mục B.4, chia sẻ đơn vị tìm nạp
và phát hành hướng dẫn SM một cách hiệu quả trên 32 luồng nhưng yêu cầu một
sợi dọc đầy đủ các luồng hoạt động để đạt hiệu suất đầy đủ.
Lịch trình SM và thực hiện nhiều loại sợi dọc đồng thời. Mỗi chu kỳ phát hành,
bộ lập lịch chọn một trong 24 sợi dọc để thực hiện lệnh cong vênh SIMT. Một
lệnh warp được ban hành thực thi như bốn bộ tám luồng trong bốn chu kỳ xử lý.
Các đơn vị SP và SFU thực hiện các hướng dẫn một cách độc lập và bằng cách
đưa ra các hướng dẫn giữa chúng theo các chu kỳ thay thế, bộ lập lịch có thể giữ
cả hai mức chiếm dụng hoàn toàn. Một bảng điểm đủ điều kiện mỗi sợi dọc cho
mỗi chu kỳ. Bộ lập lịch hướng dẫn ưu tiên tất cả các sợi dọc đã sẵn sàng và chọn
một loại có mức độ ưu tiên cao nhất cho vấn đề. Ưu tiên xem xét loại sợi dọc,
loại hướng dẫn và tính công bằng của Google đối với tất cả các sợi dọc đang thực
hiện trong SM .
SM thực thi mảng sợi hợp tác (CTA) dưới dạng nhiều sợi dọc đồng thời truy
cập vào vùng bộ nhớ dùng chung được phân bổ động cho CTA .

Bộ hướng dẫn
Chủ đề thực hiện các hướng dẫn vô hướng, không giống như các kiến trúc hướng
dẫn vector GPU trước đây. Hướng dẫn mở rộng đơn giản và thân thiện với trình
biên dịch. Các hướng dẫn kết cấu vẫn dựa trên vectơ, lấy vectơ tọa độ nguồn và
trả về vectơ màu được lọc.
Tập lệnh dựa trên thanh ghi bao gồm tất cả các số học dấu phẩy động và số
nguyên, siêu việt, logic, điều khiển lưu lượng, tải / lưu trữ bộ nhớ và hướng dẫn
kết cấu được liệt kê trong bảng hướng dẫn PTX Hình B.4.3 Hướng dẫn tải / lưu
trữ bộ nhớ sử dụng địa chỉ byte số nguyên với số học địa chỉ đăng ký cộng với bù.
Đối với máy tính, hướng dẫn tải / lưu trữ truy cập ba không gian bộ nhớ đọc: bộ
nhớ cục bộ cho dữ liệu tạm thời, riêng tư, tạm thời; bộ nhớ dùng chung cho dữ
liệu độ trễ trên mỗi CTA thấp được chia sẻ bởi các luồng của CTA; và bộ nhớ
toàn cầu cho dữ liệu được chia sẻ bởi tất cả các chủ đề. Các chương trình điện
toán sử dụng đồng bộ hóa rào cản nhanh. bar.sync hướng dẫn để đồng bộ hóa các
luồng trong CTA giao tiếp với nhau thông qua bộ nhớ chia sẻ và toàn cầu. Các
GPU kiến trúc Tesla mới nhất triển khai các hoạt động bộ nhớ nguyên tử PTX,
tạo điều kiện cho việc giảm song song và quản lý cấu trúc dữ liệu song song.

Bộ xử lý phát trực tuyến (SP)


Lõi SP đa luồng là bộ xử lý luồng chính, như được giới thiệu trong Mục B.4Tệp đăng
ký của nó cung cấp 1024 thanh ghi 32 bit vô hướng cho tối đa 96 luồng. (nhiều chủ
đề hơn trong ví dụ SP của Mục B.4). Điểm nổi của nó thêm và
B-50 Phụ lục B Đồ họa và GPU điện toán

các phép toán nhân tương thích với tiêu chuẩn IEEE 754 cho các số FP có độ chính
xác đơn, bao gồm không phải là một con số (NaN) và vô cùng. Các thao tác thêm và
nhân sử dụng IEEE tròn đến gần nhất - ngay cả khi chế độ làm tròn mặc định. Lõi SP
cũng thực hiện tất cả các hướng dẫn số học, so sánh, chuyển đổi và logic 32 bit và 64
bit Hình B.4.3Bộ xử lý được thiết kế hoàn toàn bằng ống và độ trễ được tối ưu hóa
để cân bằng độ trễ và diện tích.

Đơn vị chức năng đặc biệt (SFU)


SFU hỗ trợ tính toán cả hai hàm siêu việt và nội suy thuộc tính phẳng. Như được
mô tả trong Mục B.6, nó sử dụng phép nội suy bậc hai dựa trên các xấp xỉ
minimax nâng cao để tính gần đúng căn bậc hai, đối ứng, log2x, 2xvà các hàm sin
/ cos ở một kết quả trên mỗi chu kỳ. SFU cũng hỗ trợ nội suy thuộc tính pixel
như tọa độ màu, độ sâu và kết cấu ở bốn mẫu mỗi chu kỳ.

Rasterization
Các nguyên thủy hình học từ các SM đi theo thứ tự đầu vào vòng tròn ban đầu
của chúng đến khối xem / clip / setup / raster / zcull. Các đơn vị xem và clip cắt
các nguyên thủy vào chế độ xem và với bất kỳ mặt phẳng clip người dùng được
kích hoạt nào, sau đó chuyển đổi các đỉnh thành không gian màn hình (pixel).
Các nguyên thủy còn sống sau đó đi đến đơn vị thiết lập, tạo ra các phương
trình cạnh cho rasterizer. Một giai đoạn rasterization thô tạo ra tất cả các ô pixel
ít nhất là một phần bên trong nguyên thủy. Các đơn vị zcull duy trì một phân cấp
z bề mặt, từ chối các ô pixel nếu chúng được biết đến một cách bảo thủ bởi các
pixel được vẽ trước đó. Tốc độ từ chối lên tới 256 pixel mỗi đồng hồ. Các pixel
tồn tại zcull sau đó chuyển sang giai đoạn rasterization tạo ra thông tin chi tiết và
giá trị độ sâu.
Kiểm tra độ sâu và cập nhật có thể được thực hiện trước bộ tạo mảnh hoặc sau,
tùy thuộc vào trạng thái hiện tại. SMC lắp ráp các pixel còn sót lại thành các sợi
dọc để được xử lý bởi một SM chạy trình tạo pixel pixel hiện tại. SMC sau đó
gửi pixel còn tồn tại và dữ liệu liên quan đến ROP .

Bộ xử lý vận hành raster (ROP) và Hệ thống bộ nhớ


Mỗi ROP được ghép nối với một phân vùng bộ nhớ cụ thể. Đối với mỗi đoạn
pixel được phát ra bởi chương trình shader pixel, ROP thực hiện kiểm tra và cập
nhật độ sâu và stprint, và song song, pha trộn màu sắc và cập nhật. Nén màu
không mất (tối đa 8: 1) và nén độ sâu (tối đa 8: 1) được sử dụng để giảm băng
thông DRAM. Mỗi ROP có tốc độ cực đại bốn pixel mỗi đồng hồ và hỗ trợ các
định dạng HDR dấu phẩy động 16 bit và dấu phẩy động 32 bit. ROP hỗ trợ xử lý
độ sâu gấp đôi khi ghi màu.
B.7 Real Stuff: NVIDIA GeForce 8800 B-51

Hỗ trợ chống răng cưa bao gồm tối đa 16 × đa mẫu và siêu mẫu. Các chống
lấy mẫu bảo hiểm Thuật toán (CSAA) tính toán và lưu trữ Boolean phủ sóng tối
đa 16 mẫu và nén thông tin màu sắc, độ sâu và stprint dự phòng vào dấu chân bộ
nhớ và băng thông bốn hoặc tám mẫu để cải thiện hiệu suất.
Chiều rộng bus dữ liệu bộ nhớ DRAM là 384 chân, được sắp xếp thành sáu
phân vùng độc lập gồm 64 chân mỗi chân. Mỗi phân vùng hỗ trợ DDR2 tốc độ
dữ liệu kép và các giao thức GDDR3 định hướng đồ họa ở mức tối đa 1,0 GHz,
mang lại băng thông khoảng 16 GB / s cho mỗi phân vùng hoặc 96 GB / s.
Bộ điều khiển bộ nhớ hỗ trợ một loạt các tốc độ xung nhịp DRAM, giao thức,
mật độ thiết bị và chiều rộng bus dữ liệu. Các yêu cầu kết cấu và tải / lưu trữ có
thể xảy ra giữa bất kỳ TPC và bất kỳ phân vùng bộ nhớ nào, do đó, một mạng kết
nối sẽ định tuyến các yêu cầu và phản hồi.

Khả năng mở rộng


Kiến trúc thống nhất Tesla được thiết kế cho khả năng mở rộng. Thay đổi số
lượng SM, TPC, ROP, bộ nhớ cache và phân vùng bộ nhớ cung cấp sự cân bằng
phù hợp cho các mục tiêu hiệu suất và chi phí khác nhau trong các phân khúc thị
trường GPU. Liên kết có thể mở rộng kết nối với nhau (SLI) kết nối nhiều GPU,
cung cấp khả năng mở rộng hơn nữa.

Hiệu suất
Đồng hồ GeForce 8800 Ultra có lõi xử lý luồng SP và SFU ở mức 1,5 GHz, cho
đỉnh hoạt động lý thuyết là 576 GFLOPS. GeForce 8800 GTX có đồng hồ xử lý
1,35 GHz và đỉnh tương ứng là 518 GFLOPS .
Ba phần sau so sánh hiệu suất của GPU GeForce 8800 với CPU đa lõi trên ba
ứng dụng khác nhau Đại số tuyến tính dày đặc, biến đổi Fourier nhanh và sắp
xếp. Các chương trình và thư viện GPU được biên dịch mã CUDA C. Mã CPU
sử dụng thư viện Intel MKL 10.0 đa luồng chính xác để tận dụng các hướng dẫn
SSE và nhiều lõi.

Hiệu suất đại số tuyến tính dày đặc


Tính toán đại số tuyến tính dày đặc là cơ bản trong nhiều ứng dụng. Volkov và
Demmel [2008] trình bày kết quả hiệu suất GPU và CPU cho phép nhân ma trận
ma trận dày đặc một độ chính xác (chuẩn quy SGEMM) và các yếu tố ma trận
LU, QR và Cholesky. Hình B.7.3 so sánh tốc độ GFLOPS trên phép nhân ma
trận ma trận dày đặc SGEMM cho GPU GeForce 8800 GTX với CPU lõi tứ .
Hình B.7.4 so sánh tỷ lệ GFLOPS về hệ số ma trận cho GPU với CPU lõi tứ .
Bởi vì ma trận nhân SGEMM và các thói quen BLAS3 tương tự là phần lớn công
việc trong nhân tố ma trận, hiệu suất của chúng đặt giới hạn trên về tốc độ nhân tố.
Khi thứ tự ma trận tăng vượt quá 200 đến 400, hệ số
B-52 Phụ lục B Đồ họa và GPU điện toán

A: N3N, B: N3N A: N364, B: 643N


210
GeForce 8800 GTX
180

150

GFLOPS
120

90

60
Lõi2 Quad

30

0
64 128 256 512 1024 2048 4096 8192
N

HÌNH B.7.3 Tỷ lệ hiệu suất nhân ma trận ma trận dày đặc SGEMM. Biểu đồ hiển thị tỷ lệ
GFLOPS chính xác đơn đạt được trong việc nhân ma trận N × N vuông (đường liền mạch) và ma trận N ×
64 và 64 × N mỏng (đường đứt nét). Chuyển thể từ Hình 6 của Volkov và Demmel [2008]Các dòng màu
đen là GeForce 8800 GTX 1,35 GHz sử dụng mã Volkovùi SGEMM (hiện có trong NVIDIA CUBLAS
2.0) trên ma trận trong bộ nhớ GPU. Các đường màu xanh là Intel Core2 Quad Q6600 lõi tứ 2,4 GHz,
Linux 64 bit, Intel MKL 10.0 trên ma trận trong bộ nhớ CPU.

LU Cholesky QR
210

180

150
Bộ đôi
GFLOPS

120 +
Lõi2

GTX
90
8800

60 GeF orce
Lõi2 Quad

30

0
64 128 256 512 1024 2048 4096 8192 16.384
Thứ tự ma trận

HÌNH B.7.4 Tỷ lệ hiệu suất nhân tố ma trận dày đặc. Biểu đồ cho thấy tỷ lệ GFLOPS đạt được trong các
yếu tố ma trận bằng cách sử dụng GPU và chỉ sử dụng CPU. Chuyển thể từ Hình 7 của Volkov và Demmel
[2008]Các đường màu đen dành cho NVIDIA GeForce 8800 GTX, CUDA 1.1, Windows 1.35 GHz. XP được gắn
vào Intel Core2 Duo E6700 Windows XP 2,67 GHz, bao gồm tất cả thời gian truyền dữ liệu GPU CPU. Các
đường màu xanh dành cho Intel Core2 Quad Q6600 lõi tứ 2,4 GHz, Linux 64 bit, Intel MKL 10.0.
B.7 Real Stuff: NVIDIA GeForce 8800 B-53

vấn đề trở nên đủ lớn để SGEMM có thể tận dụng tính song song của GPU và
khắc phục hệ thống GPU CPU và sao chép trên cao. Phép nhân ma trận SGEMM
của Volkov đạt được 206 GFLOPS, khoảng 60% tốc độ nhân lên đỉnh GeForce
8800 GTX, trong khi hệ số QR đạt 192 GFLOPS, gấp khoảng 4,3 lần CPU lõi tứ .

Hiệu suất FFT


Biến đổi Fourier nhanh (FFT) được sử dụng trong nhiều ứng dụng. Các biến đổi
lớn và các biến đổi đa chiều được phân chia thành các lô biến đổi 1D nhỏ hơn.
Hình B.7.5 so sánh FFT chính xác đơn tại chỗ 1D hiệu suất của GeForce 8800
GTX 1,35 GHz (có niên đại từ cuối năm 2006) với dòng Intel Xeon E5462 bốn
cạnh 2,8 GHz (mã có tên là Harpertown, có niên đại từ cuối năm 2007). Hiệu
suất CPU được đo bằng Intel Hạt nhân toán học Thư viện (MKL) 10.0 FFT với
bốn luồng. Hiệu suất GPU được đo bằng cách sử dụng thư viện NVIDIA CUFFT
2.1 và các FFT phân rã tần số 1D radix-16. Cả hiệu suất thông lượng CPU và
GPU đều được đo bằng FFT theo đợt; kích thước lô là 224/n, Ở đâu n là kích
thước biến đổi. Do đó, khối lượng công việc cho mọi kích thước biến đổi là 128
MB. Để xác định tốc độ GFLOPS, số lượng thao tác trên mỗi biến đổi được lấy
là 5n đăng nhập2 n.

GeForce 8800GTX Xeon 5462


80

70

60

50
GFLOPS

40

30

20

10

0
131,072262,144524 , 1.048.5762.097.1524.194.304

128 256 512 1024 2048 4096 8192 16.38432.76865.536 288

Số lượng các yếu tố trong một biến đổi

HÌNH B.7.5 Hiệu suất thông lượng biến đổi Fourier nhanh. Biểu đồ so sánh hiệu suất của các
FFT phức tạp tại chỗ một chiều trên GeForce 8800 GTX 1,35 GHz với sê-ri Intel Xeon E5462 lõi tứ 2,8
GHz (mã có tên là Harpertown,), Bộ nhớ L2 6 MB, Bộ nhớ 4 GB, 1600 FSB, Red Hat Linux, Intel MKL
10.0.
B-54 Phụ lục B Đồ họa và GPU điện toán

Hiệu suất sắp xếp


Trái ngược với các ứng dụng vừa thảo luận, sắp xếp đòi hỏi sự phối hợp đáng kể
hơn nhiều giữa các luồng song song và tỷ lệ song song tương ứng khó hơn để có
được. Tuy nhiên, một loạt các thuật toán sắp xếp nổi tiếng có thể được song song
một cách hiệu quả để chạy tốt trên GPU .Satish et al. [2008] chi tiết thiết kế các
thuật toán sắp xếp trong CUDA và kết quả mà chúng báo cáo cho sắp xếp radix
được tóm tắt dưới đây.
Hình B.7.6 so sánh hiệu suất sắp xếp song song của GeForce 8800 Ultra với hệ
thống Intel Clovertown 8 lõi, cả hai đều có từ đầu năm 2007. Các lõi CPU được
phân phối giữa hai ổ cắm vật lý. Mỗi ổ cắm chứa một mô-đun đa kênh với hai
chip Core2 và mỗi chip có bộ đệm L2 4MB. Tất cả các thói quen sắp xếp được
thiết kế để sắp xếp các cặp khóa-giá trị trong đó cả khóa và giá trị là số nguyên 32
bit. Thuật toán chính đang được nghiên cứu là sắp xếp radix, mặc dù dựa trên
quicksort song_sort () quy trình được cung cấp bởi Khối xây dựng luồng Intel Intel
cũng được đưa vào để so sánh. Trong hai mã sắp xếp radix dựa trên CPU, một mã
được triển khai chỉ bằng tập lệnh vô hướng và mã còn lại sử dụng các thói quen
ngôn ngữ lắp ráp được điều chỉnh cẩn thận, tận dụng các hướng dẫn vector SIMD
SSE2.
Bản thân biểu đồ cho thấy tốc độ sắp xếp đạt được được xác định là số lượng
phần tử được sắp xếp chia theo thời gian để sắp xếp các bộ phận cho một loạt các
kích cỡ trình tự. Nó là

CPU sắp xếp Loại bức xạ CPU (vô


nhanh chóng hướng)
GPU sắp xếp Loại bức xạ CPU
radix (SIMD)
80
Hàng
triệu

70

60
Tỷ lệ (cặp / giây)

50

40

30
Sắp
xếp

20

10

0
1000 10.000 100.000 1.000.000 10.000.000 100.000.000
Kích thước trình tự

HÌNH B.7.6 Hiệu suất sắp xếp song song. Biểu đồ này so sánh tốc độ sắp xếp cho sắp xếp radix song song
triển khai trên hệ thống 1,5 GHz GeForce 8800 Ultra và hệ thống Intel Core2 Xeon E5345 8 lõi 2,33 GHz.
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-55

rõ ràng từ biểu đồ này rằng loại radix GPU đạt tỷ lệ phân loại cao nhất cho tất cả
các chuỗi các phần tử 8K và lớn hơn. Trong phạm vi này, nó trung bình nhanh
hơn 2,6 lần so với thói quen dựa trên quicksort và nhanh hơn khoảng hai lần so
với thói quen sắp xếp radix, tất cả đều sử dụng tám lõi CPU có sẵn. Hiệu suất sắp
xếp bộ đàm CPU rất khác nhau, có thể là do tính cục bộ bộ đệm kém của các
hoán vị toàn cầu của nó.

B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU

Sự ra đời của CPU đa lõi và GPU nhiều lõi có nghĩa là chip xử lý chính hiện là
hệ thống song song. Hơn nữa, sự song song của chúng tiếp tục mở rộng quy mô
với luật Moore Moore. Thách thức là phát triển các ứng dụng điện toán trực quan
và điện toán hiệu năng cao, mở rộng quy mô song song của chúng để tận dụng số
lượng lõi bộ xử lý ngày càng tăng, giống như các ứng dụng đồ họa 3D mở rộng
song song với GPU với số lượng lõi khác nhau.
Phần này trình bày các ví dụ về ánh xạ các ứng dụng điện toán song song có
thể mở rộng sang GPU bằng CUDA .

Ma trận thưa thớt


Một loạt các thuật toán song song có thể được viết bằng CUDA theo cách khá
đơn giản, ngay cả khi các cấu trúc dữ liệu liên quan không phải là các lưới thông
thường đơn giản. Phép nhân vectơ ma trận thưa thớt (SpMV) là một ví dụ điển
hình về khối xây dựng số quan trọng có thể được song song khá trực tiếp bằng
cách sử dụng các trừu tượng do CUDA cung cấp. Các hạt nhân chúng ta thảo
luận dưới đây, khi kết hợp với các thói quen vectơ CUBLAS được cung cấp, hãy
viết các bộ giải lặp lặp như phương pháp gradient liên hợp đơn giản.
Một thưa thớt n × n ma trận là một trong đó số lượng các mục khác không m
chỉ là một phần nhỏ trong tổng số. Các biểu diễn ma trận thưa thớt chỉ tìm cách
lưu trữ các phần tử khác không của ma trận. Vì nó khá điển hình mà thưa thớt n
× n ma trận sẽ chỉ chứa m = Ôi (n) các phần tử khác không, điều này thể hiện sự
tiết kiệm đáng kể trong không gian lưu trữ và thời gian xử lý.
Một trong những đại diện phổ biến nhất cho ma trận thưa thớt không có cấu
trúc nói chung là hàng nén thưa thớt (CSR) đại diện. Các m các phần tử khác
không của ma trận A được lưu trữ theo thứ tự hàng chính trong một mảng Av
Một mảng thứ hai. Aj ghi lại chỉ mục cột tương ứng cho mỗi mục nhập Av Cuối
cùng, một mảng. Ap của n + 1 phần tử ghi lại phạm vi của mỗi hàng trong các
mảng trước đó; các mục cho hàng Tôi trong Aj và Av mở rộng từ chỉ số Ap [i] lên
đến, nhưng không bao gồm, chỉ số Ap [i + 1]Điều này ngụ ý rằng.Ap [0] sẽ luôn là
0 và Ap [n] sẽ luôn là số phần tử khác không trong ma trận. Hình B.8.1 cho thấy
một ví dụ về biểu diễn CSR của một ma trận đơn giản.
B-56 Phụ lục B Đồ họa và GPU điện toán

Hàng Hàng
3010 Hàng 0 2 3
0000 Av [7] = {3 1 2 4 1 1 1}
A = 0241
Aj [7] = {0 2 1 2 3 0 3}
1001
Ap [5] = {0 2 2 5 7 }

a. Ma trận mẫu A b. Biểu diễn CSR của ma trận

HÌNH B.8.1 Ma trận hàng thưa nén (CSR).

float Multiply_row (không ký int rowsize ,


chỉ số int * Aj, // cột không dấu cho hàng
phao * Av , // mục nonzero cho hàng
nổi * x) // vectơ RHS
{
tổng số float = 0;

for (cột int không dấu = 0; cột <rowsize; ++ cột)


sum + = Av [cột] * x [Aj [cột]];

tổng lợi nhuận;


}

HÌNH B.8.2 Mã C nối tiếp cho một hàng vectơ ma trận thưa thớt nhân lên.

Cho một ma trận A ở dạng CSR và một vectơ x, chúng ta có thể tính toán một
hàng duy nhất của sản phẩm y = Axe sử dụng bội số () thủ tục thể hiện trong Hình
B.8.2 Tính toán toàn bộ sản phẩm sau đó chỉ đơn giản là vấn đề lặp trên tất cả
các hàng và tính toán kết quả cho hàng đó bằng cách sử dụng. bội số (), như trong
mã C nối tiếp được hiển thị trong Hình B.8.3.
Thuật toán này có thể được dịch thành hạt nhân CUDA song song khá dễ dàng.
Chúng tôi chỉ đơn giản là trải vòng lặp trong csrmul_serial () trên nhiều chủ đề
song song. Mỗi luồng sẽ tính toán chính xác một hàng của vectơ đầu ra y Mã cho
kernel này được hiển thị trong. Hình B.8.4 Lưu ý rằng nó trông cực kỳ giống với
vòng lặp nối tiếp được sử dụng trong. csrmul_serial () thủ tục. Thực sự chỉ có hai
điểm khác biệt. Đầu tiên, chỉ mục hàng cho mỗi luồng được tính từ các chỉ số
khối và luồng được gán cho mỗi luồng, loại bỏ vòng lặp. Thứ hai, chúng ta có
một điều kiện chỉ đánh giá một sản phẩm hàng nếu chỉ mục hàng nằm trong giới
hạn của ma trận (điều này là cần thiết vì số lượng hàng n không cần phải là bội số
của kích thước khối được sử dụng để khởi chạy kernel).
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-57

void csrmul_serial (không dấu int * Ap, int * Aj, float * Av, int num_rows
không dấu, float * x, float * y)

{
for (hàng int không dấu = 0; hàng <num_rows; ++ row)
{
không dấu int row_begin = Ap [row];
không dấu int row_end = Ap [hàng + 1];

y [row] = bội_row (row_end-row_begin, Aj + row_begin, Av + row_begin, x);

}
}

HÌNH B.8.3 Mã nối tiếp cho phép nhân vectơ ma trận thưa thớt.

__global__
void csrmul_kernel (không dấu int * Ap, int * Aj, float * Av, int num_rows
không dấu, float * x, float * y)

{
hàng int không dấu = blockIdx.x * blockDim.x + threadIdx.x;

if (hàng <num_rows)
{
không dấu int row_begin = Ap [row];
không dấu int row_end = Ap [hàng + 1];

y [row] = bội_row (row_end-row_begin, Aj + row_begin, Av + row_begin, x);

}
}

HÌNH B.8.4 CUDA phiên bản nhân vectơ ma trận thưa thớt.

Giả sử rằng các cấu trúc dữ liệu ma trận đã được sao chép vào bộ nhớ thiết bị
GPU, việc khởi chạy kernel này sẽ trông giống như :
khối không dấu = 128; // hoặc bất kỳ kích thước nào lên tới 512 nblocks không dấu =
(num_rows + blockize - 1) / blockize; csrmul_kernel <<<nblocks, blocksize >>> (Ap, Aj,
Av, num_rows, x, y);
B-58 Phụ lục B Đồ họa và GPU điện toán

Mẫu mà chúng ta thấy ở đây là một mẫu rất phổ biến. Thuật toán nối tiếp ban
đầu là một vòng lặp có các lần lặp độc lập với nhau. Các vòng lặp như vậy có thể
được song song khá dễ dàng bằng cách chỉ định một hoặc nhiều lần lặp của vòng
lặp cho mỗi luồng song song. Mô hình lập trình do CUDA cung cấp giúp thể
hiện loại song song này đặc biệt đơn giản.
Chiến lược chung này về phân tách các tính toán thành các khối công việc độc
lập và cụ thể hơn là phá vỡ các lặp vòng lặp độc lập, không phải là duy nhất đối
với CUDA. Đây là một cách tiếp cận phổ biến được sử dụng dưới hình thức này
hay hình thức khác bởi các hệ thống lập trình song song khác nhau, bao gồm Khối
xây dựng luồng OpenMP và Intel.

Bộ nhớ đệm trong bộ nhớ dùng chung


Các thuật toán SpMV được nêu ở trên khá đơn giản. Có một số tối ưu hóa có thể
được thực hiện trong cả mã CPU và GPU có thể cải thiện hiệu suất, bao gồm hủy
kiểm soát vòng lặp, sắp xếp lại ma trận và chặn đăng ký. Các hạt nhân song song
cũng có thể được thực hiện lại về mặt dữ liệu song song quét hoạt động được
trình bày bởi Sengupta et al. [2007].
Một trong những đặc điểm kiến trúc quan trọng được CUDA thể hiện là sự
hiện diện của bộ nhớ chia sẻ trên mỗi khối, bộ nhớ trên chip nhỏ với độ trễ rất
thấp. Tận dụng bộ nhớ này có thể mang lại những cải tiến hiệu suất đáng kể. Một
cách phổ biến để làm điều này là sử dụng bộ nhớ dùng chung làm bộ đệm được
quản lý bằng phần mềm để chứa dữ liệu được sử dụng lại thường xuyên. Các chế
độ sử dụng bộ nhớ dùng chung được hiển thị trong Hình B.8.5.
Trong bối cảnh nhân ma trận thưa thớt, chúng tôi quan sát thấy một số hàng A
có thể sử dụng một phần tử mảng cụ thể x [i] Trong nhiều trường hợp phổ biến và
đặc biệt khi ma trận đã được sắp xếp lại, các hàng sử dụng. x [i] sẽ là hàng gần
hàng Tôi Do đó, chúng tôi có thể thực hiện một sơ đồ bộ nhớ đệm đơn giản và
mong muốn đạt được một số lợi ích hiệu suất. Các khối của các hàng xử lý chủ
đề. Tôi thông qua j sẽ tải x [i] thông qua x [j] vào bộ nhớ dùng chung của nó.
Chúng tôi sẽ hủy đăng ký bội số () các phần tử lặp và tìm nạp của x từ bộ nhớ
cache bất cứ khi nào có thể. Mã kết quả được hiển thị trong Hình B.8.5 Bộ nhớ
dùng chung cũng có thể được sử dụng để thực hiện các tối ưu hóa khác, chẳng
hạn như tìm nạp. Ap [hàng + 1] từ một sợi liền kề thay vì lấy lại từ bộ nhớ.
Bởi vì kiến trúc Tesla cung cấp bộ nhớ chia sẻ trên chip được quản lý rõ ràng,
thay vì bộ đệm phần cứng hoạt động ngầm, nên việc thêm loại tối ưu hóa này là
khá phổ biến. Mặc dù điều này có thể áp đặt một số gánh nặng phát triển bổ sung
cho lập trình viên, nhưng nó tương đối nhỏ và lợi ích hiệu suất tiềm năng có thể
là đáng kể. Trong ví dụ được hiển thị ở trên, ngay cả việc sử dụng bộ nhớ dùng
chung khá đơn giản này cũng mang lại sự cải thiện hiệu suất khoảng 20% trên
các ma trận đại diện có nguồn gốc từ các lưới bề mặt 3D. Tính khả dụng của bộ
nhớ được quản lý rõ ràng thay cho bộ đệm ẩn cũng có lợi thế là các chính sách
lưu trữ và tìm nạp trước có thể được điều chỉnh cụ thể theo nhu cầu của ứng dụng.
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-59

__global__
void csrmul_cached (không ký int * Ap, int * Aj, float * Av, int num_rows
không dấu, const float * x, float * y)

{
// Bộ nhớ cache các hàng x [] tương ứng với khối này. __shared__ bộ đệm
phao [blocksize];

không dấu int block_begin = blockIdx.x * blockDim.x;


không dấu int block_end = block_begin + blockDim.x;
hàng int không dấu = block_begin + threadIdx.x;

// Lấy và lưu trữ bộ đệm cửa sổ x [] của chúng tôi.


if (hàng <num_rows) bộ đệm [threadIdx.x] = x [row]; __syncthreads
();

if (hàng <num_rows)
{
không dấu int row_begin = Ap [row];
không dấu int row_end = Ap [hàng + 1];
tổng số float = 0, x_j;

for (không dấu int col = row_begin; col <row_end; ++ col)


{
không dấu int j = Aj [col];

// Lấy x_j từ bộ đệm của chúng tôi khi có thể nếu (j> =
block_begin && j <block_end)
x_j = bộ đệm [j-block_begin];
khác
x_j = x [j];

tổng + = Av [col] * x_j;


}

y [hàng] = tổng;
}
}

HÌNH B.8.5 Phiên bản bộ nhớ dùng chung của vectơ ma trận thưa thớt nhân lên.
B-60 Phụ lục B Đồ họa và GPU điện toán

Đây là những hạt nhân khá đơn giản với mục đích là minh họa các kỹ thuật cơ bản
trong việc viết các chương trình CUDA, thay vì làm thế nào để đạt được hiệu suất tối
đa. Nhiều con đường có thể để tối ưu hóa có sẵn, một số trong đó được Williams et al
khám phá. [2007] trên một số kiến trúc đa lõi khác nhau. Tuy nhiên, vẫn còn mang
tính hướng dẫn để kiểm tra hiệu suất so sánh của ngay cả những hạt nhân đơn giản
này. Trên bộ xử lý Intel Core2 Xeon E5335 2 GHz, the csrmul_ nối tiếp () kernel chạy
ở mức khoảng 202 triệu nonzeros được xử lý mỗi giây, cho một bộ sưu tập ma trận
Laplacian có nguồn gốc từ các lưới bề mặt tam giác 3D. Song song hạt nhân này với
song song cấu trúc được cung cấp bởi Khối xây dựng luồng Intel Intel tạo ra các tốc độ
song song 2.0, 2.1 và 2.3 chạy trên hai, bốn và tám lõi của máy, tương ứng. Trên
GeForce 8800 Ultra, the csrmul_kernel () và csrmul_cached () hạt nhân đạt được tốc độ
xử lý khoảng 772 và 920 triệu nonzeros mỗi giây, tương ứng với tốc độ tăng tốc song
song 3,8 và 4,6 lần so với hiệu suất nối tiếp của một lõi CPU.

Quét và Giảm
Song song quét, còn được gọi là song song tiền tố tổng, là một trong những khối
xây dựng quan trọng nhất cho các thuật toán song song dữ liệu [Blelloch, 1990].
Đưa ra một trình tự a của n các yếu tố:
[a0 , a1 ,..., an 1]

và một nhà điều hành liên kết nhị phân ⊕, các quét hàm tính toán trình tự :

quét (a, ⊕) [a0 , (a0 ⊕ a1 ),... , (a0 ⊕ a1 ⊕ ... ⊕ an 1 )]

Ví dụ, nếu chúng ta lấy ⊕ để trở thành toán tử bổ sung thông thường, sau đó áp
dụng quét vào mảng đầu vào

a [317 0 4 16 3]

sẽ tạo ra chuỗi các tổng một phần :

quét (a, ) [3 4 11111516 22 25]

Toán tử quét này là một bao gồm quét, theo nghĩa là yếu tố đó Tôi của chuỗi đầu ra
kết hợp với phần tử aTôi của đầu vào. Chỉ kết hợp các yếu tố trước sẽ mang lại một
độc quyền toán tử quét, còn được gọi là a tiền tố-tổng hợp hoạt động.
Việc thực hiện nối tiếp của hoạt động này là vô cùng đơn giản. Nó chỉ đơn
giản là một vòng lặp lặp lặp lại một lần trên toàn bộ chuỗi, như được hiển thị
trong Hình B.8.6.
Thoạt nhìn, có vẻ như hoạt động này vốn đã nối tiếp. Tuy nhiên, nó thực sự có
thể được thực hiện song song một cách hiệu quả. Quan sát chính là thế
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-61

mẫu <lớp T>


__host__ T plus_scan (T * x, không dấu int n)
{
cho (không ký int i = 1; i <n; ++ i)
x [i] = x [i-1] + x [i];
}

HÌNH B.8.6 Mẫu để quét cộng nối tiếp.

mẫu <lớp T>


__device__ T plus_scan (T * x)
{
không dấu int i = threadIdx.x;
không dấu int n = blockDim.x;

cho (không ký int offset = 1; offset <n; offset * = 2)


{
T t;

if (i> = offset) t = x [i-offset];


__syncthreads ();

if (i> = offset) x [i] = t + x [i];


__syncthreads ();
}
trả lại x [i];
}

Mẫu B.8.7 CUDA cho quét cộng song song.

bởi vì bổ sung là liên kết, chúng tôi có thể tự do thay đổi thứ tự các yếu tố được
thêm vào với nhau. Chẳng hạn, chúng ta có thể tưởng tượng việc thêm các cặp
phần tử liên tiếp song song, sau đó thêm các tổng một phần này, v.v.
Một kế hoạch đơn giản để làm điều này là từ Hillis và Steele [1989]. Việc
thực hiện thuật toán của họ trong CUDA được hiển thị trong Hình B.8.7 Nó giả
định rằng mảng đầu vào. x [] chứa chính xác một phần tử trên mỗi luồng của khối
luồng. Nó thực hiện nhật ký2 n lặp lại của một vòng thu thập một phần tổng với
nhau.
Để hiểu hành động của vòng lặp này, hãy xem xét Hình B.8.8, trong đó minh
họa trường hợp đơn giản cho n= 8 luồng và phần tử. Mỗi cấp độ của sơ đồ đại
diện cho một bước của vòng lặp. Các dòng chỉ ra vị trí mà dữ liệu đang được tìm
nạp. Đối với mỗi phần tử của đầu ra (tức là., hàng cuối cùng của sơ đồ) chúng tôi
đang xây dựng một cây tổng hợp trên các phần tử đầu vào. Các cạnh được tô
màu xanh lam cho thấy hình dạng của cây tổng hợp này cho phần tử cuối cùng.
Lá của cây này là tất cả các yếu tố ban đầu. Truy tìm lại từ bất kỳ thành phần đầu
ra nào cho thấy rằng nó kết hợp tất cả các giá trị đầu vào lên đến và bao gồm cả
chính nó.
B-62 Phụ lục B Đồ họa và GPU điện toán

x [0] x [1] x [2] x [3] x [4] x [5] x [6] x [7]

x [0] x [1] x [2] x [3] x [4] x [5] x [6] x [7] x [i] + = x [i - 1];

x [0] x [1] x [2] x [3] x [4] x [5] x [6] x [7] x [i] + = x [i - 2];

x [0] x [1] x [2] x [3] x [4] x [5] x [6] x [7] x [i] + = x [i - 4];

HÌNH B.8.8 Tham chiếu dữ liệu quét song song dựa trên cây.

Mặc dù đơn giản, thuật toán này không hiệu quả như chúng ta mong muốn.
Kiểm tra việc thực hiện nối tiếp, chúng tôi thấy rằng nó thực hiện O (n) bổ sung.
Việc thực hiện song song, ngược lại, thực hiện Ô đăng nhập n) bổ sung. Vì lý do
này, nó không phải là làm việc hiệu quả, vì nó hoạt động nhiều hơn so với việc
thực hiện nối tiếp để tính kết quả tương tự. May mắn thay, có những kỹ thuật khác
để thực hiện quét hiệu quả công việc. Chi tiết về các kỹ thuật triển khai hiệu quả
hơn và mở rộng quy trình trên mỗi khối này cho các mảng đa khóa được cung cấp
bởi Sengupta et al. [2007].
Trong một số trường hợp, chúng ta chỉ có thể quan tâm đến việc tính toán tổng
của tất cả các phần tử trong một mảng, thay vì chuỗi tất cả các tổng tiền tố được
trả về bởi quét Đây là. giảm song song vấn đề. Chúng tôi chỉ đơn giản có thể sử
dụng thuật toán quét để thực hiện tính toán này, nhưng việc giảm thường có thể
được thực hiện hiệu quả hơn so với quét.
Hình B.8.9 hiển thị mã để tính toán giảm bằng cách sử dụng bổ sung. Trong
này ví dụ: mỗi luồng chỉ đơn giản tải một phần tử của chuỗi đầu vào (tức là., ban
đầu nó tổng hợp một phần tiếp theo của chiều dài 1). Khi kết thúc quá trình giảm,
chúng tôi muốn luồng 0 giữ tổng của tất cả các phần tử được tải ban đầu bởi các
luồng của khối. Vòng lặp trong kernel này ngầm xây dựng một cây tổng hợp trên
các phần tử đầu vào, giống như thuật toán quét ở trên.
Ở cuối vòng lặp này, luồng 0 giữ tổng của tất cả các giá trị được tải bởi khối này. Nếu
chúng ta muốn giá trị cuối cùng của vị trí được chỉ ra bởi tổng cộng để chứa tổng của tất cả
các phần tử trong mảng, chúng ta phải kết hợp các tổng một phần của tất cả các khối trong
lưới. Một chiến lược để thực hiện điều này là để mỗi khối ghi tổng một phần của nó vào
một mảng thứ hai và sau đó khởi chạy lại kernel giảm, lặp lại quá trình cho đến khi chúng
tôi giảm trình tự xuống một giá trị duy nhất. Một lựa chọn hấp dẫn hơn được hỗ trợ bởi
kiến trúc GPU Tesla là sử dụng nguyên tử () nguyên thủy, một nguyên tử hiệu quả
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-63

__global__
void plus_reduce (int * input, unsign int N, int * Total)
{
không dấu int tid = threadIdx.x;
không dấu int i = blockIdx.x * blockDim.x + threadIdx.x;

// Mỗi khối tải các yếu tố của nó vào bộ nhớ dùng chung, phần đệm
// với 0 nếu N không phải là bội số của khối
__shared__ int x [blocksize];
x [tid] = (i <N) ? đầu vào [i]: 0;
__syncthreads ();

// Mỗi luồng hiện giữ 1 giá trị đầu vào trong x []


//
// Xây dựng cây tổng hợp trên các yếu tố. for (int s =
blockDim.x / 2; s> 0; s = s / 2)
{
if (tid <s) x [tid] + = x [tid + s]; __syncthreads ();

// Chủ đề 0 hiện giữ tổng của tất cả các giá trị đầu vào
// đến khối này. Có nó thêm tổng đó vào tổng số chạy if (tid == 0) nguyên tửAdd
(tổng, x [tid]);
}

HÌNH B.8.9 CUDA thực hiện giảm cộng.

đọc-sửa đổi-viết nguyên thủy được hỗ trợ bởi hệ thống con bộ nhớ. Điều này giúp
loại bỏ sự cần thiết của các mảng tạm thời bổ sung và các lần phóng kernel lặp lại.
Giảm song song là một nguyên thủy thiết yếu để lập trình song song và làm nổi
bật tầm quan trọng của bộ nhớ chia sẻ trên mỗi khối và các rào cản chi phí thấp
trong việc hợp tác giữa các luồng hiệu quả. Mức độ xáo trộn dữ liệu giữa các luồng
này sẽ rất tốn kém nếu được thực hiện trong bộ nhớ toàn cầu ngoài chip.

Sắp xếp Radix


Một ứng dụng quan trọng của các nguyên thủy quét là trong việc thực hiện các
thói quen sắp xếp. Mã trong Hình B.8.10 thực hiện một loại số nguyên radix trên
một khối luồng duy nhất. Nó chấp nhận làm đầu vào một mảng giá trị chứa một số
nguyên 32 bit cho mỗi luồng của khối. Để đạt hiệu quả, mảng này phải được lưu
trữ trong bộ nhớ chia sẻ trên mỗi khối, nhưng điều này không bắt buộc để sắp xếp
hành xử chính xác.
Đây là một triển khai khá đơn giản của loại radix. Nó giả định sự sẵn có của
một thủ tục phân vùng_by_bit () đó sẽ phân vùng mảng đã cho như vậy
B-64 Phụ lục B Đồ họa và GPU điện toán

__device__ void radix_sort (giá trị int * không dấu)


{
cho (int bit = 0; bit <32; ++ bit)
{
phân vùng_by_bit (giá trị, bit);
__syncthreads ();
}
}

HÌNH B.8.10 Mã CUDA cho loại radix.

__device__ void phân vùng_by_bit (giá trị int * chưa ký, bit int không dấu)

{
không dấu int i = luồngIdx.x;
kích thước int không dấu = blockDim.x;
không dấu int x_i = giá trị [i];
không dấu int p_i = (x_i >> bit) & 1;

giá trị [i] = p_i;


__syncthreads ();

// Tính toán số bit T lên đến và bao gồm cả p_i.


// Ghi lại tổng số bit F là tốt. chưa ký int T_b Before = plus_scan
(giá trị); không dấu int T_total = giá trị [size-1]; không ký int
F_total = kích thước - T_total; __syncthreads ();

// Viết mỗi x_i đến đúng nơi của nó


nếu (p_i)
giá trị [T_b Before-1 + F_total] = x_i;
khác
giá trị [i - T_b Before] = x_i;
}

HÌNH B.8.11 Mã CUDA để phân vùng dữ liệu trên cơ sở từng bit, như là một phần của loại
radix.

tất cả các giá trị có 0 trong bit được chỉ định sẽ đến trước tất cả các giá trị có 1
trong bit đó. Để tạo ra đầu ra chính xác, phân vùng này phải ổn định.
Thực hiện quy trình phân vùng là một ứng dụng quét đơn giản. Chủ đề Tôi giữ giá
trị xTôi và phải tính toán chỉ số đầu ra chính xác để ghi giá trị này. Để làm như vậy, nó
cần tính toán (1) số lượng luồng j < Tôi trong đó bit được chỉ định là 1 và (2) tổng số
bit mà bit được chỉ định là 0. Mã CUDA cho phân vùng_by_bit () được hiển thị trong
Hình B.8.11.
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-65

Một chiến lược tương tự có thể được áp dụng để thực hiện một hạt nhân sắp
xếp radix sắp xếp một mảng có độ dài lớn, thay vì chỉ là một mảng một khối.
Bước cơ bản vẫn là quy trình quét, mặc dù khi tính toán được phân vùng trên
nhiều hạt nhân, chúng ta phải đệm hai mảng các giá trị thay vì thực hiện phân
vùng tại chỗ. Chi tiết về việc thực hiện các loại radix trên các mảng lớn một cách
hiệu quả được cung cấp bởi Satish et al. [2008].

Ứng dụng N-Body trên GPU1


Nyland và cộng sự. [2007] mô tả một hạt nhân tính toán đơn giản nhưng hữu ích
với xuất sắc Hiệu suất GPU tất cả các cặp N-body thuật toán. Nó là một thành
phần tốn thời gian của nhiều ứng dụng khoa học. Mô phỏng cơ thể N tính toán sự
tiến hóa của một hệ thống các cơ thể trong đó mỗi cơ thể liên tục tương tác với
mọi cơ thể khác. Một ví dụ là một mô phỏng vật lý thiên văn trong đó mỗi cơ thể
đại diện cho một ngôi sao riêng lẻ và các cơ thể thu hút nhau một cách hấp dẫn.
Các ví dụ khác là gấp protein, trong đó mô phỏng cơ thể N được sử dụng để tính
toán lực tĩnh điện và van der Waals; mô phỏng dòng chất lỏng hỗn loạn; và chiếu
sáng toàn cầu trong đồ họa máy tính.
Thuật toán N-body tất cả các cặp tính toán tổng lực trên mỗi cơ thể trong hệ
thống bằng cách tính toán từng lực khôn ngoan trong hệ thống, tổng hợp cho từng
cơ thể. Nhiều nhà khoa học coi phương pháp này là chính xác nhất, với sự mất độ
chính xác duy nhất đến từ các hoạt động phần cứng điểm nổi. Hạn chế là O (n2)
độ phức tạp tính toán, quá lớn đối với các hệ thống có hơn 10 cơ thể. Để khắc
phục chi phí cao này, một số đơn giản hóa đã được đề xuất để mang lại O (n đăng
nhập n) và O (n) thuật toán; ví dụ là thuật toán Barnes-Hut, Phương pháp đa cực
nhanh và tổng hợp hạt-Mesh-Ewald. Tất cả nhanh các phương thức vẫn dựa vào
phương pháp tất cả các cặp như một hạt nhân để tính toán chính xác các lực tầm
ngắn; do đó nó tiếp tục quan trọng.

Toán học cơ thể N


Đối với mô phỏng hấp dẫn, tính toán lực cơ thể bằng vật lý cơ bản. Giữa hai cơ
thể được lập chỉ mục bởi Tôi và j, vectơ lực 3D là :

r
mTôi mj ij
fijG 2
|| r || || r ||
ij ij

Độ lớn lực được tính theo thuật ngữ bên trái, trong khi hướng được tính ở bên
phải (vectơ đơn vị chỉ từ cơ thể này sang cơ thể khác).
Đưa ra một danh sách các cơ quan tương tác (toàn bộ hệ thống hoặc tập hợp
con), phép tính rất đơn giản: đối với tất cả các cặp tương tác, tính toán lực và
tổng cho từng cơ thể. Khi tổng lực được tính toán, chúng được sử dụng để cập
nhật từng vị trí và vận tốc của cơ thể, dựa trên vị trí và vận tốc trước đó. Việc
tính toán các lực có độ phức tạp O (n2), trong khi cập nhật là O (n).

1  Thích nghi từ Nyland và cộng sự. [2007], Mô phỏng cơ thể N nhanh với CUDA, trực
tiếp Chương 31 của GPU Gems 3.
B-66 Phụ lục B Đồ họa và GPU điện toán

Mã tính toán lực nối tiếp sử dụng hai vòng lặp lồng nhau lặp lại trên các cặp cơ
thể. Vòng lặp bên ngoài chọn cơ thể mà tổng lực đang được tính toán và vòng lặp
bên trong lặp lại trên tất cả các cơ thể. Vòng lặp bên trong gọi một hàm tính toán lực
khôn ngoan cặp, sau đó thêm lực vào một tổng chạy.
Để tính toán các lực song song, chúng tôi gán một luồng cho mỗi cơ thể, vì
việc tính toán lực trên mỗi cơ thể không phụ thuộc vào phép tính trên tất cả các
cơ quan khác. Một khi tất cả các lực được tính toán, vị trí và vận tốc của các cơ
thể có thể được cập nhật.
Mã cho các phiên bản nối tiếp và song song được hiển thị trong Hình B.8.12
và Hình B.8.13Phiên bản nối tiếp có hai vòng lặp lồng nhau. Việc chuyển đổi
sang CUDA ,. giống như nhiều ví dụ khác, chuyển đổi vòng lặp nối tiếp bên
ngoài thành hạt nhân trên mỗi luồng trong đó mỗi luồng tính tổng lực trên một cơ
thể. Nhân CUDA tính toán ID luồng toàn cầu cho mỗi luồng, thay thế biến lặp
của vòng lặp nối tiếp bên ngoài. Cả hai hạt nhân đều kết thúc bằng cách lưu trữ
tổng gia tốc trong một mảng toàn cầu được sử dụng để tính toán các giá trị vị trí
và vận tốc mới trong bước tiếp theo. Vòng lặp bên ngoài được thay thế bằng lưới
hạt nhân CUDA khởi chạy N chủ đề, một cho mỗi cơ thể.

void accel_on_all_body ()
{
int i, j;
float3 acc (0,0f, 0,0f, 0,0f);

cho (i = 0; i <N; i ++) {


cho (j = 0; j <N; j ++) {
acc = body_body_interaction (acc, body [i], body [j]);
}
accel [i] = acc;
}
}

HÌNH B.8.12 Mã nối tiếp để tính toán tất cả các lực khôn ngoan trên các cơ thể N.

__global__ void accel_on_one_body ()


{
int i = threadIdx.x + blockDim.x * blockIdx.x; int j;

float3 acc (0,0f, 0,0f, 0,0f);

cho (j = 0; j <N; j ++) {


acc = body_body_interaction (acc, body [i], body [j]);
}
accel [i] = acc;
}

HÌNH B.8.13 Mã luồng CUDA để tính tổng lực trên một cơ thể.
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-67

Tối ưu hóa cho việc thực hiện GPU


Mã CUDA được hiển thị là chính xác về mặt chức năng, nhưng không hiệu quả,
vì nó bỏ qua các tính năng kiến trúc chính. Hiệu suất tốt hơn có thể đạt được với
ba tối ưu hóa chính. Đầu tiên, bộ nhớ dùng chung có thể được sử dụng để tránh
đọc bộ nhớ giống hệt nhau giữa các luồng. Thứ hai, sử dụng nhiều luồng trên mỗi
cơ thể sẽ cải thiện hiệu suất cho các giá trị nhỏ NThứ ba, vòng lặp hủy kiểm soát
làm giảm chi phí vòng lặp.

Sử dụng bộ nhớ dùng chung


Bộ nhớ dùng chung có thể chứa một tập hợp con các vị trí cơ thể, giống như bộ
đệm, loại bỏ các yêu cầu bộ nhớ toàn cầu dư thừa giữa các luồng. Chúng tôi tối
ưu hóa mã hiển thị ở trên để có mỗi tr các luồng trong tải khối luồng một vị trí
vào bộ nhớ dùng chung (cho tổng số tr vị trí). Khi tất cả các luồng đã tải một giá
trị vào bộ nhớ dùng chung, được đảm bảo bởi __syncthreads (), mỗi chủ đề sau đó
có thể thực hiện tr tương tác (sử dụng dữ liệu trong bộ nhớ dùng chung). Điều
này được lặp lại N/tr lần để hoàn thành tính toán lực cho từng cơ thể, giúp giảm
số lượng yêu cầu vào bộ nhớ theo một yếu tố tr (thường trong phạm vi 32
trận128).
Hàm gọi accel_on_one_body () yêu cầu một vài thay đổi để hỗ trợ tối ưu hóa
này. Mã sửa đổi được hiển thị trong Hình B.8.14.

__shared__ float4 shPocation [256];


...
__global__ void accel_on_one_body ()
{
int i = threadIdx.x + blockDim.x * blockIdx.x; int j, k;

int p = blockDim.x;
float3 acc (0,0f, 0,0f, 0,0f);
float4 myBody = cơ thể [i];

cho (j = 0; j <N; j + = p) { // Vòng ngoài nhảy theo p mỗi lần shPocation [threadIdx.x] = body [j
+ threadIdx.x]; __syncthreads ();

for (k = 0; k <p; k ++) {// Truy cập vòng lặp bên trong p vị trí acc =
body_body_interaction (acc, myBody, shPocation [k]);
}
__syncthreads ();
}
accel [i] = acc;
}

HÌNH B.8.14 Mã CUDA để tính tổng lực trên mỗi cơ thể, sử dụng bộ nhớ dùng chung để cải thiện hiệu suất.
B-68 Phụ lục B Đồ họa và GPU điện toán

Hiệu suất N-Body trên GPU


250

200

150
GFLOPS
1 chủ đề, 8800
2 chủ đề, 8800
100 4 luồng, 8800

1 chủ đề, 9600


50
2 chủ đề, 9600
4 luồng, 9600
0

12.288

16.384

32.768
24,576
1024

1536

2048

3072
4096

6144

8192
512

768

Số lượng cơ quan

HÌNH B.8.15 Đo lường hiệu suất của ứng dụng N-body trên GeForce 8800 GTX và GeForce
9600. 8800 có 128 bộ xử lý luồng ở 1,35 GHz, trong khi 9600 có 64 at 0,80 GHz (khoảng 30% trong số
8800). Hiệu suất cao nhất là 242 GFLOPS. Đối với một GPU có nhiều bộ xử lý hơn, vấn đề cần phải lớn
hơn để đạt được hiệu suất đầy đủ (đỉnh 9600 là khoảng 2048 cơ thể, trong khi 8800 không đạt đến đỉnh
điểm cho đến 16.384 cơ thể). Đối với N nhỏ, nhiều hơn một luồng trên mỗi cơ thể có thể cải thiện đáng kể
hiệu suất, nhưng cuối cùng phải chịu một hình phạt hiệu suất khi N phát triển.

Vòng lặp trước đây lặp đi lặp lại trên tất cả các cơ thể bây giờ nhảy theo kích
thước khối trMỗi lần lặp của tải vòng lặp bên ngoài. tr vị trí liên tiếp vào bộ nhớ
dùng chung (một vị trí trên mỗi luồng). Các chủ đề đồng bộ hóa, và sau đó tr tính
toán lực được tính bằng mỗi luồng. Cần có sự đồng bộ hóa thứ hai để đảm bảo
rằng các giá trị mới không được tải vào bộ nhớ dùng chung trước khi tất cả các
luồng hoàn thành các phép tính lực với dữ liệu hiện tại.
Sử dụng bộ nhớ dùng chung giúp giảm băng thông bộ nhớ cần thiết xuống
dưới 10% tổng băng thông mà GPU có thể duy trì (sử dụng dưới 5 GB / s). Tối ưu
hóa này giữ cho ứng dụng bận rộn thực hiện tính toán thay vì chờ truy cập bộ nhớ,
như nó đã làm mà không sử dụng bộ nhớ dùng chung. Hiệu suất cho các giá trị
khác nhau của N được hiển thị trong Hình B.8.15.

Sử dụng nhiều chủ đề cho mỗi cơ thể


Hình B.8.15 cho thấy sự xuống cấp hiệu suất cho các vấn đề với các giá trị nhỏ của N (N
< 4096) trên GeForce 8800 GTX. Nhiều nỗ lực nghiên cứu dựa trên tính toán cơ thể N
tập trung vào nhỏ N (trong thời gian mô phỏng dài), làm cho nó trở thành mục tiêu của
những nỗ lực tối ưu hóa của chúng tôi. Giả định của chúng tôi để giải thích hiệu suất thấp
hơn là đơn giản là không có đủ công việc để giữ cho GPU bận rộn khi nào N nhỏ. Giải
pháp là phân bổ nhiều chủ đề hơn cho mỗi cơ thể. Chúng tôi thay đổi kích thước khối
luồng từ (tr, 1, 1) đến (tr, q, 1), ở đâu q các chủ đề chia công việc của một cơ thể thành
các phần bằng nhau. Bằng cách phân bổ các luồng bổ sung trong cùng một khối luồng,
kết quả một phần có thể được lưu trữ trong bộ nhớ dùng chung. Khi tất cả các tính toán
lực là
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-69

xong, q kết quả một phần có thể được thu thập và tổng hợp để tính kết quả cuối cùng.
Sử dụng hai hoặc bốn luồng trên mỗi cơ thể dẫn đến những cải tiến lớn cho nhỏ N.
Ví dụ, hiệu suất trên 8800 GTX tăng 110% khi N = 1024 (một luồng đạt được
90 GFLOPS, trong đó bốn luồng đạt được 190 GFLOPS). Hiệu suất xuống cấp
một chút trên lớn N, vì vậy chúng tôi chỉ sử dụng tối ưu hóa này cho N nhỏ hơn
4096. Việc tăng hiệu suất được hiển thị trong Hình B.8.15 cho GPU với 128 bộ
xử lý và GPU nhỏ hơn với 64 bộ xử lý tốc độ bằng hai phần ba tốc độ.

So sánh hiệu suất


Hiệu suất của mã N-body được hiển thị trong Hình B.8.15 và Hình B.8.16 Trong.
Hình B.8.15, hiệu suất của GPU hiệu suất cao và trung bình được hiển thị, cùng với
các cải tiến hiệu suất đạt được bằng cách sử dụng nhiều luồng trên mỗi cơ thể. Hiệu
suất trên GPU nhanh hơn dao động từ 90 đến chỉ dưới 250 GFLOPS .
Hình B.8.16 hiển thị mã gần như giống hệt nhau (C ++ so với CUDA) chạy trên
CPU Intel Core2. Hiệu suất CPU là khoảng 1% GPU, trong khoảng 0,2 đến 2
GFLOPS, gần như không đổi trong phạm vi rộng của các vấn đề.

Hiệu suất N-Body trên CPU Intel


2
1.8
1.6
1.4
GFLOPS

1.2
1
0,8

T2400
E8200
0,6
0,4 X9775

0,2 X9775-Cuda

0
12.288

16.384

24,576
32.768
1024

1536

2048

3072

4096

6144

8192
512

768

Số lượng cơ quan
HÌNH B.8.16 Đo hiệu suất trên mã N-body trên CPU . Biểu đồ cho thấy hiệu suất N-body chính xác duy
nhất sử dụng CPU Intel Core2, được biểu thị bằng số mô hình CPU của chúng. Lưu ý việc giảm đáng kể hiệu suất
GFLOPS (được hiển thị trong GFLOPS trên y-trục) chứng minh GPU nhanh hơn bao nhiêu so với CPU. Hiệu
suất trên CPU thường không phụ thuộc vào kích thước vấn đề, ngoại trừ hiệu suất thấp bất thường khi N = 16.384
trên CPU X9775. Biểu đồ cũng cho thấy kết quả chạy phiên bản CUDA của mã (sử dụng trình biên dịch CUDA-
for-CPU) trên một lõi CPU duy nhất, trong đó nó vượt trội hơn mã C ++ 24%. Là một ngôn ngữ lập trình, CUDA
thể hiện sự song song và địa phương mà trình biên dịch có thể khai thác. CPU Intel là Extreme X9775 3,2 GHz
(mã có tên là Pen Pennn) E8200 2,66 GHz (mã có tên là Wolf Wolfdale) một máy tính để bàn, CPU tiền Penryn,
và T2400 1,83 GHz (mã có tên là Yon Yonah) CPU máy tính xách tay 2007. Phiên bản Penryn của kiến trúc Core
2 đặc biệt thú vị cho các tính toán N-body với bộ chia 4 bit, cho phép các hoạt động phân chia và căn bậc hai thực
thi nhanh hơn bốn lần so với các CPU Intel trước đó.
B-70 Phụ lục B Đồ họa và GPU điện toán

Biểu đồ cũng cho thấy kết quả biên dịch phiên bản CUDA của mã cho CPU,
trong đó hiệu suất được cải thiện 24%. CUDA, như một ngôn ngữ lập trình, phơi
bày tính song song, cho phép trình biên dịch sử dụng tốt hơn đơn vị vectơ SSE
trên một lõi duy nhất. Phiên bản CUDA của mã N-body cũng tự nhiên ánh xạ tới
các CPU đa lõi (có lưới các khối), trong đó nó đạt được tỷ lệ gần như hoàn hảo
trên hệ thống tám lõi với N = 4096 (tỷ lệ 2.0, 3.97 và 7.94 trên hai, bốn và tám
lõi, tương ứng).

Các kết quả


Với một nỗ lực khiêm tốn, chúng tôi đã phát triển một hạt nhân tính toán giúp cải
thiện hiệu suất GPU so với CPU đa lõi với hệ số lên tới 157. Thời gian thực hiện
cho mã N-body chạy trên CPU gần đây của Intel (Penryn X9775 ở 3,2 GHz, lõi
đơn) mất hơn 3 giây mỗi khung hình để chạy cùng mã chạy ở tốc độ khung hình
44 Hz trên GPU GeForce 8800. Trên CPU tiền Penryn, mã yêu cầu 6 trận16 giây,
và trên bộ xử lý Core2 cũ hơn và bộ xử lý Pentium IV, thời gian là khoảng 25
giây. Chúng ta phải chia hiệu suất tăng một nửa rõ ràng, vì CPU chỉ cần một nửa
số tính toán để tính kết quả tương tự (sử dụng tối ưu hóa rằng các lực trên một
cặp cơ thể có sức mạnh tương đương và ngược chiều).
Làm thế nào GPU có thể tăng tốc mã lên một lượng lớn như vậy? Câu trả lời
yêu cầu kiểm tra chi tiết kiến trúc. Tính toán lực cặp đôi yêu cầu 20 phép toán dấu
phẩy động, bao gồm chủ yếu là các hướng dẫn cộng và nhân (một số có thể được
kết hợp bằng cách sử dụng lệnh nhân thêm), nhưng cũng có các hướng dẫn chia
và căn bậc hai để chuẩn hóa vectơ. CPU Intel có nhiều chu kỳ để phân chia chính
xác đơn và hướng dẫn căn bậc hai ,2 mặc dù điều này đã được cải thiện trong gia
đình CPU Penryn mới nhất với bộ chia 4 bit nhanh hơn.3 Ngoài ra, các hạn chế về
khả năng đăng ký dẫn đến nhiều hướng dẫn MOV trong mã x86 (có lẽ là / từ bộ
đệm L1). Ngược lại, GeForce 8800 thực hiện một hướng dẫn ren vuông đối ứng
trong bốn đồng hồ; xem Mục B.6 cho độ chính xác chức năng đặc biệt. Nó có một
tệp đăng ký lớn hơn (trên mỗi luồng) và bộ nhớ dùng chung có thể được truy cập
dưới dạng toán hạng lệnh. Cuối cùng, trình biên dịch CUDA phát ra 15 hướng dẫn
cho một lần lặp của vòng lặp, so với hơn 40 hướng dẫn từ nhiều trình biên dịch
CPU x86. Song song lớn hơn, thực hiện nhanh hơn các hướng dẫn phức tạp, nhiều
không gian đăng ký hơn và trình biên dịch hiệu quả tất cả kết hợp để giải thích sự
cải thiện hiệu suất mạnh mẽ của mã N-body giữa CPU và GPU .

2  Các hướng dẫn x86 SSE đối ứng-hình vuông-gốc (RSQRT *) và đối ứng (RCP *) là
không được xem xét, vì độ chính xác của chúng quá thấp để có thể so sánh được.
3  Tập đoàn Intel , Hướng dẫn tham khảo tối ưu hóa kiến trúc Intel 64 và IA-32. Tháng 11

năm 2007. Số thứ tự: 248966-016. Cũng có sẵn tại www.intel.com/design/ bộ xử lý /


hướng dẫn sử dụng / 248966.pdf.
B.8 Real Stuff: Lập bản đồ ứng dụng cho GPU B-71

Trên GeForce 8800, thuật toán N-body toàn cặp cung cấp hơn 240 GFLOPS
hiệu suất, so với ít hơn 2 GFLOPS trên các bộ xử lý tuần tự gần đây. Biên dịch
và thực thi phiên bản CUDA của mã trên CPU chứng tỏ rằng sự cố này có quy
mô tốt với CPU đa lõi, nhưng vẫn chậm hơn đáng kể so với một GPU duy nhất .
Chúng tôi đã ghép mô phỏng cơ thể GPU N với màn hình đồ họa của chuyển động
và có thể hiển thị tương tác các cơ thể 16K tương tác với tốc độ 44 khung hình mỗi
giây. Điều này cho phép các sự kiện vật lý thiên văn và sinh lý được hiển thị và điều
hướng ở mức tương tác. Ngoài ra, chúng tôi có thể tham số hóa nhiều cài đặt, chẳng
hạn như kỹ thuật giảm tiếng ồn, giảm xóc và tích hợp, ngay lập tức hiển thị hiệu ứng
của chúng trên động lực học của hệ thống. Điều này cung cấp cho các nhà khoa học
hình ảnh trực quan tuyệt đẹp, tăng cường hiểu biết của họ về các hệ thống vô hình
khác (quá lớn hoặc nhỏ, quá nhanh hoặc quá chậm), cho phép họ tạo ra các mô hình
hiện tượng vật lý tốt hơn.
Hình B.8.17 hiển thị chuỗi thời gian của mô phỏng vật lý thiên văn 16K cơ thể, với
mỗi cơ thể hoạt động như một thiên hà. Cấu hình ban đầu là vỏ hình cầu

HÌNH B.8.17 Mười hai hình ảnh được chụp trong quá trình phát triển của hệ thống cơ thể N với 16.384 cơ thể.
B-72 Phụ lục B Đồ họa và GPU điện toán

của cơ thể xoay quanh z-trục. Một hiện tượng quan tâm đối với các nhà vật lý
thiên văn là sự phân cụm xảy ra, cùng với sự hợp nhất của các thiên hà theo thời
gian. Đối với người đọc quan tâm, mã CUDA cho ứng dụng này có sẵn trong
CUDA SDK từ www.nvidia.com/CUDA.

B.9 Ngụy biện và Cạm bẫy

GPU đã phát triển và thay đổi nhanh chóng đến mức nhiều ngụy biện và cạm bẫy
đã phát sinh. Chúng tôi bao gồm một vài ở đây.
GPU Fallacy chỉ là bộ đa xử lý vector SIMD.
Thật dễ dàng để rút ra kết luận sai lầm rằng GPU chỉ đơn giản là bộ đa xử lý
vector SIMD. GPU có mô hình lập trình kiểu SPMD, trong đó lập trình viên có
thể viết một chương trình duy nhất được thực thi trong nhiều trường hợp luồng
với nhiều dữ liệu. Tuy nhiên, việc thực hiện các luồng này không hoàn toàn là
SIMD hoặc vector; nó là đa hướng dẫn đơn (SIMT), được mô tả trong Mục
B.4Mỗi luồng GPU có các thanh ghi vô hướng riêng, bộ nhớ riêng ,. trạng thái
thực thi luồng, ID luồng, thực thi độc lập và đường dẫn nhánh và bộ đếm chương
trình hiệu quả và có thể giải quyết bộ nhớ một cách độc lập. Mặc dù một nhóm
các luồng (ví dụ:., một sợi dọc gồm 32 luồng) thực thi hiệu quả hơn khi PC cho
các luồng giống nhau, điều này là không cần thiết. Vì vậy, bộ đa xử lý không hoàn
toàn là SIMD. Mô hình thực hiện luồng là MIMD với đồng bộ hóa rào cản và tối
ưu hóa SIMT. Việc thực thi sẽ hiệu quả hơn nếu các truy cập bộ nhớ lưu trữ / tải
chủ đề riêng lẻ cũng có thể được kết hợp thành các truy cập khối. Tuy nhiên, điều
này không thực sự cần thiết. Trong kiến trúc vectơ SIMD thuần túy, truy cập bộ
nhớ / đăng ký cho các luồng khác nhau phải được căn chỉnh theo mẫu vectơ thông
thường. GPU không có hạn chế như vậy đối với truy cập đăng ký hoặc bộ nhớ;
tuy nhiên, thực thi sẽ hiệu quả hơn nếu các sợi chỉ truy cập vào các khối dữ liệu
cục bộ.
Trong một lần khởi hành thêm từ một mô hình SIMD thuần túy, GPU SIMT
có thể thực hiện đồng thời nhiều sợi dọc. Trong các ứng dụng đồ họa, có thể có
nhiều nhóm chương trình đỉnh, chương trình pixel và chương trình hình học chạy
trong mảng đa bộ xử lý đồng thời. Các chương trình điện toán cũng có thể thực
hiện các chương trình khác nhau đồng thời trong các sợi dọc khác nhau.
Hiệu suất GPU Fallacy không thể tăng nhanh hơn luật Moore Moore.
Định luật Moore Moore chỉ đơn giản là một tỷ lệ. Nó không phải là một tốc độ giới
hạn ánh sáng của người Viking cho bất kỳ tỷ lệ nào khác. Định luật Moore Moore
mô tả một kỳ vọng rằng, theo thời gian, khi công nghệ bán dẫn tiến bộ và bóng bán
dẫn trở nên nhỏ hơn, chi phí sản xuất trên mỗi bóng bán dẫn sẽ giảm theo cấp số
nhân. Đặt một cách khác, với chi phí sản xuất không đổi,
B.9 Fallacy và Pit thác B-73

số lượng bóng bán dẫn sẽ tăng theo cấp số nhân. Gordon Moore [1965] dự đoán rằng
sự tiến bộ này sẽ cung cấp khoảng hai lần số lượng bóng bán dẫn cho cùng một chi
phí sản xuất mỗi năm, và sau đó sửa đổi nó thành gấp đôi mỗi lần
2 năm. Mặc dù Moore đã đưa ra dự đoán ban đầu vào năm 1965 khi chỉ có 50
thành phần cho mỗi mạch tích hợp, nhưng nó đã được chứng minh là phù hợp
đáng kể. Việc giảm kích thước bóng bán dẫn trong lịch sử có những lợi ích khác,
chẳng hạn như công suất thấp hơn trên mỗi bóng bán dẫn và tốc độ đồng hồ
nhanh hơn ở công suất không đổi.
Tiền thưởng ngày càng tăng này được sử dụng bởi các kiến trúc sư chip để xây
dựng bộ xử lý, bộ nhớ và các thành phần khác. Trong một thời gian, các nhà thiết
kế CPU đã sử dụng các bóng bán dẫn bổ sung để tăng hiệu suất của bộ xử lý với
tốc độ tương tự như định luật Moore Moore, đến mức nhiều người nghĩ rằng tăng
trưởng hiệu suất của bộ xử lý hai lần mỗi 18 tháng24 là luật Moore Moore. Trong
thực tế, nó không phải là.
Các nhà thiết kế vi xử lý dành một số bóng bán dẫn mới cho lõi bộ xử lý, cải
thiện kiến trúc và thiết kế, và đường ống để có thêm tốc độ đồng hồ. Phần còn lại
của các bóng bán dẫn mới được sử dụng để cung cấp nhiều bộ đệm hơn, để giúp
truy cập bộ nhớ nhanh hơn. Ngược lại, các nhà thiết kế GPU sử dụng hầu như
không có bóng bán dẫn mới nào để cung cấp nhiều bộ đệm hơn; hầu hết các bóng
bán dẫn được sử dụng để cải thiện lõi bộ xử lý và thêm nhiều lõi bộ xử lý.
GPU nhận được nhanh hơn bởi bốn cơ chế. Đầu tiên, các nhà thiết kế GPU gặt hái
tiền thưởng luật Moore Moore trực tiếp bằng cách áp dụng nhiều bóng bán dẫn theo
cấp số nhân để xây dựng song song hơn, và do đó nhanh hơn, bộ xử lý. Thứ hai, các
nhà thiết kế GPU có thể cải thiện kiến trúc theo thời gian, tăng hiệu quả xử lý. Thứ ba,
luật Moore Moore giả định chi phí không đổi, do đó, tỷ lệ luật Moore Moore rõ ràng
có thể bị vượt quá bằng cách chi tiêu nhiều hơn cho các chip lớn hơn với nhiều bóng
bán dẫn hơn. Thứ tư, hệ thống bộ nhớ GPU đã tăng băng thông hiệu quả với tốc độ
gần như tương đương với tốc độ xử lý, bằng cách sử dụng bộ nhớ nhanh hơn, bộ nhớ
rộng hơn, nén dữ liệu và bộ nhớ tốt hơn. Sự kết hợp của bốn phương pháp này trong
lịch sử đã cho phép hiệu suất GPU tăng gấp đôi thường xuyên, khoảng 12 đến 18
tháng một lần. Tỷ lệ này, vượt quá tỷ lệ của luật Moore Moore, đã được chứng minh
trên các ứng dụng đồ họa trong khoảng 10 năm và không có dấu hiệu chậm lại đáng kể.
Bộ giới hạn tốc độ thách thức nhất dường như là hệ thống bộ nhớ, nhưng sự đổi mới
cạnh tranh cũng đang tiến triển nhanh chóng.
GPU Fallacy chỉ hiển thị đồ họa 3D; họ có thể làm tính toán chung.
GPU được xây dựng để kết xuất đồ họa 3D cũng như đồ họa và video 2D. Để
đáp ứng nhu cầu của các nhà phát triển phần mềm đồ họa như được thể hiện
trong các giao diện và yêu cầu về hiệu suất / tính năng của API đồ họa, GPU đã
trở thành bộ xử lý dấu phẩy động lập trình song song. Trong miền đồ họa, các bộ
xử lý này được lập trình thông qua các API đồ họa và với các ngôn ngữ lập trình
đồ họa phức tạp (GLSL, Cg và HLSL, trong OpenGL và Direct3D). Tuy nhiên,
không có gì ngăn cản các kiến trúc sư GPU phơi bày
B-74 Phụ lục B Đồ họa và GPU điện toán

các lõi xử lý song song với các lập trình viên mà không có API đồ họa hoặc ngôn
ngữ đồ họa phức tạp.
Trên thực tế, họ GPU kiến trúc Tesla tiếp xúc với bộ xử lý thông qua môi
trường phần mềm được gọi là CUDA, cho phép các lập trình viên phát triển các
chương trình ứng dụng chung bằng ngôn ngữ C và sớm C ++. GPU là bộ xử lý
Turing-Complete, vì vậy họ có thể chạy bất kỳ chương trình nào mà CPU có thể
chạy, mặc dù có lẽ kém hơn. Và có lẽ nhanh hơn.
GPU Fallacy không thể chạy các chương trình dấu phẩy động chính xác kép
nhanh.
Trước đây, GPU hoàn toàn không thể chạy các chương trình dấu phẩy động có
độ chính xác kép, ngoại trừ thông qua mô phỏng phần mềm. Và điều đó không
nhanh lắm. GPU đã thực hiện tiến trình từ biểu diễn số học được lập chỉ mục
(bảng tra cứu màu) sang số nguyên 8 bit cho mỗi thành phần màu, đến số học
điểm cố định, đến điểm nổi chính xác đơn và gần đây đã thêm độ chính xác kép.
Các GPU hiện đại thực hiện hầu như tất cả các phép tính trong số học dấu phẩy
động đơn chính xác của IEEE và bắt đầu sử dụng độ chính xác kép.
Đối với một chi phí bổ sung nhỏ, GPU có thể hỗ trợ điểm nổi chính xác kép
cũng như điểm nổi chính xác đơn. Ngày nay, độ chính xác kép chạy chậm hơn
tốc độ chính xác đơn, chậm hơn khoảng năm đến mười lần. Đối với chi phí bổ
sung gia tăng, hiệu suất chính xác kép có thể được tăng lên so với độ chính xác
duy nhất trong các giai đoạn, vì nhiều ứng dụng đòi hỏi nó.
GPU Fallacy don lồng làm điểm nổi chính xác.
GPU, ít nhất là trong họ bộ xử lý kiến trúc Tesla, thực hiện xử lý điểm nổi chính
xác đơn ở mức được quy định bởi tiêu chuẩn điểm nổi IEEE 754. Vì vậy, về độ
chính xác, GPU là bằng với bất kỳ bộ xử lý tuân thủ nào khác của IEEE 754.
Ngày nay, GPU không triển khai một số tính năng cụ thể được mô tả trong
tiêu chuẩn, chẳng hạn như xử lý các số không chuẩn hóa và cung cấp các ngoại lệ
dấu phẩy động chính xác. Tuy nhiên, GPU Tesla T10P được giới thiệu gần đây
cung cấp đầy đủ làm tròn số IEEE, hỗ trợ số lượng nhiều lần và không chuẩn hóa
cho độ chính xác kép.
Pitfall Chỉ cần sử dụng nhiều luồng hơn để bao phủ độ trễ bộ nhớ dài hơn.
Các lõi CPU thường được thiết kế để chạy một luồng duy nhất ở tốc độ tối đa. Để
chạy ở tốc độ tối đa, mọi lệnh và dữ liệu của nó cần phải có sẵn khi đến lúc hướng
dẫn đó chạy. Nếu hướng dẫn tiếp theo chưa sẵn sàng hoặc dữ liệu cần thiết cho
hướng dẫn đó không khả dụng, hướng dẫn không thể chạy và bộ xử lý bị đình trệ. Bộ
nhớ ngoài cách xa bộ xử lý, do đó, phải mất nhiều chu kỳ thực thi lãng phí để lấy dữ
liệu từ bộ nhớ. Do đó, CPU yêu cầu địa phương lớn
B.9 Fallacy và Pit thác B-75

bộ nhớ cache để tiếp tục chạy mà không bị đình trệ. Độ trễ bộ nhớ dài, vì vậy nó
được tránh bằng cách phấn đấu để chạy trong bộ đệm. Tại một số điểm, nhu cầu tập
hợp chương trình có thể lớn hơn bất kỳ bộ đệm nào. Một số CPU đã sử dụng đa
luồng để chịu được độ trễ, nhưng số lượng luồng trên mỗi lõi thường bị giới hạn ở
một số nhỏ.
Chiến lược GPU là khác nhau. Các lõi GPU được thiết kế để chạy nhiều luồng
đồng thời, nhưng chỉ có một lệnh từ bất kỳ luồng nào tại một thời điểm. Một cách
khác để nói điều này là GPU chạy từng luồng từ từ, nhưng trong tổng hợp chạy
các luồng một cách hiệu quả. Mỗi luồng có thể chịu được một số độ trễ bộ nhớ, vì
các luồng khác có thể chạy.
Nhược điểm của điều này là nhiều luồng nhiều luồng nhiều được yêu cầu để
che độ trễ bộ nhớ. Ngoài ra, nếu các truy cập bộ nhớ bị phân tán hoặc không
tương quan giữa các luồng, hệ thống bộ nhớ sẽ dần dần chậm hơn trong việc đáp
ứng từng yêu cầu riêng lẻ. Cuối cùng, ngay cả nhiều luồng sẽ không thể bao gồm
độ trễ. Vì vậy, cạm bẫy là đối với người dùng chỉ cần sử dụng nhiều chiến lược
chủ đề hơn để làm việc để bao quát độ trễ, bạn phải có đủ chủ đề và các chủ đề
phải được xử lý tốt về mặt truy cập bộ nhớ.
Các thuật toán Fallacy O (n) rất khó để tăng tốc.
Cho dù GPU xử lý dữ liệu nhanh đến đâu, các bước truyền dữ liệu đến và từ thiết
bị có thể giới hạn hiệu suất của các thuật toán với O (n) độ phức tạp (với một
lượng nhỏ công việc trên mỗi mốc thời gian). Tốc độ truyền cao nhất so với bus
PCIe là khoảng 48 GB / giây khi chuyển DMA được sử dụng và ít hơn một chút
cho chuyển khoản nonDMA. Ngược lại, CPU có tốc độ truy cập điển hình là
81212 GB / giây đối với bộ nhớ hệ thống. Các vấn đề ví dụ, chẳng hạn như bổ
sung vector, sẽ bị giới hạn bởi việc chuyển các đầu vào vào GPU và đầu ra trả về
từ tính toán.
Có ba cách để khắc phục chi phí truyền dữ liệu. Đầu tiên, hãy cố gắng để dữ
liệu trên GPU càng lâu càng tốt, thay vì di chuyển dữ liệu qua lại cho các bước
khác nhau của thuật toán phức tạp. CUDA cố tình để dữ liệu một mình trong
GPU giữa các lần khởi chạy để hỗ trợ việc này.
Thứ hai, GPU hỗ trợ các hoạt động đồng thời của sao chép, sao chép và tính toán,
do đó dữ liệu có thể được truyền vào và ra khỏi thiết bị trong khi nó đang tính toán.
Mô hình này hữu ích cho bất kỳ luồng dữ liệu nào có thể được xử lý khi nó đến. Ví dụ
như xử lý video, định tuyến mạng, nén / giải nén dữ liệu và các tính toán đơn giản hơn
như toán học vector lớn.
Gợi ý thứ ba là sử dụng CPU và GPU cùng nhau, cải thiện hiệu suất bằng cách
gán một tập hợp con của công việc cho mỗi công việc, coi hệ thống là một nền tảng
điện toán không đồng nhất. Mô hình lập trình CUDA hỗ trợ phân bổ công việc cho
một hoặc nhiều GPU cùng với việc tiếp tục sử dụng CPU mà không sử dụng các
luồng (thông qua các hàm GPU không đồng bộ), do đó, việc giữ tất cả GPU và CPU
hoạt động đồng thời để giải quyết vấn đề là tương đối đơn giản nhanh hơn.
B-76 Phụ lục B Đồ họa và GPU điện toán

B.10 Kết luận

GPU là bộ xử lý song song ồ ạt và đã được sử dụng rộng rãi, không chỉ cho đồ
họa 3D, mà còn cho nhiều ứng dụng khác. Ứng dụng rộng rãi này đã được thực
hiện nhờ sự phát triển của các thiết bị đồ họa thành bộ xử lý có thể lập trình. Mô
hình lập trình ứng dụng đồ họa cho GPU thường là API như DirectX ™ hoặc
OpenGL ™. Để tính toán đa năng hơn, mô hình lập trình CUDA sử dụng SPMD
(nhiều chương trình dữ liệu) phong cách, thực hiện một chương trình với nhiều
luồng song song.
Song song GPU sẽ tiếp tục mở rộng quy mô với luật Moore Moore, chủ yếu
bằng cách tăng số lượng bộ xử lý. Chỉ các mô hình lập trình song song có thể dễ
dàng mở rộng quy mô đến hàng trăm lõi bộ xử lý và hàng ngàn luồng sẽ thành
công trong việc hỗ trợ nhiều GPU và CPU. Ngoài ra, chỉ những ứng dụng có
nhiều tác vụ song song độc lập phần lớn sẽ được tăng tốc bằng các kiến trúc đa
lõi song song.
Các mô hình lập trình song song cho GPU đang trở nên linh hoạt hơn, cho cả
đồ họa và điện toán song song. Ví dụ, CUDA đang phát triển nhanh chóng theo
hướng đầy đủ chức năng C / C ++. API đồ họa và mô hình lập trình có thể sẽ
điều chỉnh các khả năng và mô hình tính toán song song từ CUDA. Mô hình
luồng kiểu SPMD của nó có thể mở rộng và là mô hình thuận tiện, ngắn gọn và
dễ học để thể hiện một lượng lớn song song.
Được thúc đẩy bởi những thay đổi trong các mô hình lập trình, kiến trúc GPU
lần lượt trở nên linh hoạt hơn và có thể lập trình hơn. Các đơn vị chức năng cố
định GPU đang có thể truy cập được từ các chương trình chung, dọc theo cách
các chương trình CUDA đã sử dụng các chức năng nội tại kết cấu để thực hiện
tra cứu kết cấu bằng cách sử dụng đơn vị kết cấu và kết cấu GPU.
Kiến trúc GPU sẽ tiếp tục thích ứng với các mẫu sử dụng của cả đồ họa và các
lập trình viên ứng dụng khác. GPU sẽ tiếp tục mở rộng để bao gồm nhiều sức
mạnh xử lý hơn thông qua các lõi bộ xử lý bổ sung, cũng như tăng băng thông
luồng và bộ nhớ có sẵn cho các chương trình. Ngoài ra, các mô hình lập trình
phải phát triển để bao gồm các hệ thống nhiều lõi không đồng nhất lập trình bao
gồm cả GPU và CPU.

Lời cảm ơn
Phụ lục này là tác phẩm của một số tác giả tại NVIDIA. Chúng tôi trân trọng ghi
nhận những đóng góp quan trọng của Michael Garland, John Montrym, Doug
Voorhies, Lars Nyland, Erik Lindholm, Paulius Micikevicius, Massimiliano
Fatica, Stuart Oberman và Vasily Volkov.
B.11 Quan điểm lịch sử và đọc thêm B-77

B.11 Quan điểm lịch sử và hơn thế nữa


Đọc hiểu

Đồ họa đường ống tiến hóa


Phần cứng đường ống đồ họa 3D phát triển từ các hệ thống đắt tiền lớn đầu
những năm 1980 đến các máy trạm nhỏ và sau đó đến máy gia tốc PC vào giữa
đến cuối-
Những năm 1990. Trong giai đoạn này, ba lần chuyển đổi lớn đã xảy ra :
■ Các hệ thống con đồ họa hàng đầu về hiệu suất đã giảm giá từ 50.000 đô la
xuống còn 200 đô la.
■ Hiệu suất tăng từ 50 triệu pixel mỗi giây lên 1 tỷ pixel mỗi giây và từ 100.000
đỉnh mỗi giây lên 10 triệu đỉnh mỗi giây.
■ Khả năng phần cứng bản địa phát triển từ khung dây (đường viền đa giác)
đến đa giác được tô phẳng (màu không đổi), đến đa giác được tô bóng mịn
(màu nội suy), đến khử răng cưa toàn cảnh với ánh xạ kết cấu và đa pha thô
sơ.

Đường ống đồ họa chức năng cố định


Trong suốt thời gian này, phần cứng đồ họa có thể định cấu hình được, nhưng không
được lập trình bởi nhà phát triển ứng dụng. Với mỗi thế hệ, các cải tiến gia tăng đã
được cung cấp. Nhưng các nhà phát triển đã phát triển tinh vi hơn và yêu cầu nhiều
tính năng mới hơn mức có thể được cung cấp một cách hợp lý như các chức năng cố
định tích hợp. NVIDIA GeForce 3, được mô tả bởi Lindholm và cộng sự. [2001], đã
thực hiện bước đầu tiên để lập trình shader chung thực sự. Nó tiếp xúc với nhà phát
triển ứng dụng, bộ hướng dẫn nội bộ riêng của công cụ đỉnh dấu phẩy động. Điều này
trùng hợp với việc phát hành các phần mở rộng shader đỉnh Microsoft Microsoft
DirectX 8 và OpenGL. Các GPU sau này, tại thời điểm DirectX 9, khả năng lập trình
chung và khả năng dấu phẩy động mở rộng đến giai đoạn phân mảnh pixel và tạo ra
kết cấu có sẵn ở giai đoạn đỉnh. ATI Radeon 9700, được giới thiệu vào năm 2002, có
bộ xử lý phân đoạn pixel dấu phẩy động 24 bit có thể lập trình được lập trình với
DirectX 9 và OpenGL. GeForce FX đã thêm bộ xử lý pixel dấu phẩy động 32 bit. Đây
là một phần của xu hướng chung hướng tới việc thống nhất chức năng của các giai
đoạn khác nhau, ít nhất là về lập trình viên ứng dụng. Dòng NVIDIA GeForce 6800
và 7800 được chế tạo với các thiết kế bộ xử lý riêng biệt và phần cứng riêng biệt dành
riêng cho đỉnh và xử lý mảnh. XBox 360 đã giới thiệu GPU bộ xử lý hợp nhất sớm
vào năm 2005, cho phép các bộ tạo đỉnh và pixel thực thi trên cùng một bộ xử lý.
B-78 Phụ lục B Đồ họa và GPU điện toán

Sự phát triển của đồ họa thời gian thực có thể lập trình
Trong 30 năm qua, kiến trúc đồ họa đã phát triển từ một đường ống đơn giản để
vẽ sơ đồ khung dây thành một thiết kế song song cao bao gồm một số đường ống
song song sâu có khả năng hiển thị hình ảnh tương tác phức tạp xuất hiện ba
chiều. Đồng thời, nhiều tính toán liên quan trở nên tinh vi hơn và có thể lập trình
được.
Trong các đường ống đồ họa này, các giai đoạn nhất định thực hiện rất nhiều
số học dấu phẩy động trên dữ liệu hoàn toàn độc lập, chẳng hạn như chuyển đổi
vị trí của các đỉnh tam giác hoặc tạo màu pixel. Tính độc lập dữ liệu này là sự
khác biệt chính giữa GPU và CPU. Một khung hình duy nhất, được hiển thị trong
1/60 giây, có thể có 1 triệu hình tam giác và 6 triệu pixel. Cơ hội sử dụng song
song phần cứng để khai thác tính độc lập dữ liệu này là rất lớn.
Các hàm cụ thể được thực thi ở một vài giai đoạn đường ống đồ họa khác nhau với
các thuật toán kết xuất và đã phát triển để có thể lập trình được. Các chương trình
Vertex ánh xạ vị trí của các đỉnh tam giác trên màn hình, thay đổi vị trí, màu sắc hoặc
hướng của chúng. Thông thường, một chuỗi bóng đỉnh đầu vào vị trí đỉnh dấu phẩy
động (x, y, z, w) và tính toán vị trí màn hình dấu phẩy động (x, y, z). Các chương
trình hình học hoạt động trên các nguyên thủy được xác định bởi nhiều đỉnh, thay đổi
chúng hoặc tạo ra các nguyên thủy bổ sung. Mảnh vỡ pixel làm mờ từng bóng râm
một pixel, tính toán một điểm nổi đỏ, xanh lá cây, xanh dương, alpha (RGBA) đóng
góp màu cho hình ảnh được hiển thị ở vị trí hình ảnh mẫu pixel (x, y) của nó. Đối với
cả ba loại trình tạo đồ họa, các phiên bản chương trình có thể được chạy song song,
bởi vì mỗi tác phẩm trên dữ liệu độc lập, tạo ra kết quả độc lập và không có tác dụng
phụ.
Betweentheseprogrammablegraphicspipelinestagesaredozensoffixed-function
thực hiện các tác vụ được xác định rõ hiệu quả hơn nhiều so với bộ xử lý có thể
lập trình và sẽ có lợi hơn nhiều so với khả năng lập trình. Ví dụ, giữa giai đoạn xử
lý hình học và giai đoạn xử lý pixel là một rasterizer, một máy trạng thái phức tạp
xác định chính xác pixel nào (và các phần của chúng) nằm trong mỗi ranh giới
hình học nguyên thủy. Cùng với nhau, sự kết hợp của các giai đoạn lập trình và
chức năng cố định được thiết kế để cân bằng hiệu suất cực cao với kiểm soát của
người dùng đối với các thuật toán kết xuất.
Các thuật toán kết xuất thông thường thực hiện một lần vượt qua các nguyên
thủy đầu vào và truy cập các tài nguyên bộ nhớ khác một cách rất mạch lạc; các
thuật toán này cung cấp việc sử dụng băng thông tuyệt vời và phần lớn không
nhạy cảm với độ trễ bộ nhớ. Kết hợp với khối lượng công việc của trình tạo bóng
pixel thường bị giới hạn tính toán, các đặc điểm này có GPU được hướng dẫn dọc
theo một đường dẫn tiến hóa khác với CPU. Trong khi khu vực chết CPU bị chi
phối bởi bộ nhớ cache, GPU bị chi phối bởi datapath dấu phẩy động và logic
chức năng cố định. Giao diện bộ nhớ GPU nhấn mạnh băng thông trên độ trễ (vì
độ trễ có thể dễ dàng bị ẩn bởi số lượng luồng cao); thật vậy, băng thông thường
cao hơn nhiều lần so với CPU, vượt quá 100 GB / giây trong một số trường hợp.
Số lượng lớn các sợi nhẹ hạt mịn khai thác hiệu quả sự song song phong phú có
sẵn.
B.11 Quan điểm lịch sử và đọc thêm B-79

Bắt đầu với GPU NVIDIA NVIDIA GeForce 8800 vào năm 2006, ba giai
đoạn đồ họa có thể lập trình được ánh xạ tới một loạt các bộ xử lý thống nhất;
đường ống đồ họa logic là một đường dẫn tuần hoàn, truy cập các bộ xử lý này ba
lần, với logic đồ họa chức năng cố định nhiều giữa các lần truy cập. Vì các thuật
toán kết xuất khác nhau thể hiện tải cực kỳ khác nhau giữa ba giai đoạn lập trình,
sự thống nhất này cung cấp cân bằng tải bộ xử lý.

Bộ xử lý đồ họa và máy tính hợp nhất


Theo thế hệ DirectX 10, chức năng của các bộ tạo mảnh đỉnh và pixel phải được
tạo giống hệt với lập trình viên, và trên thực tế, một giai đoạn logic mới đã được
giới thiệu, trình tạo bóng hình học, để xử lý tất cả các đỉnh của một nguyên thủy
thay vì các đỉnh trong cách ly . GeForce 8800 được thiết kế với ý tưởng DirectX
10. Các nhà phát triển đã đưa ra các thuật toán tạo bóng tinh vi hơn và điều này
thúc đẩy sự gia tăng mạnh về tốc độ hoạt động của bóng tối có sẵn, đặc biệt là các
hoạt động của điểm nổi. NVIDIA đã chọn theo đuổi một thiết kế bộ xử lý có tần
số hoạt động cao hơn các phương pháp tế bào tiêu chuẩn đã cho phép, để cung cấp
thông lượng hoạt động mong muốn một cách hiệu quả nhất có thể. Thiết kế tốc độ
đồng hồ cao đòi hỏi nhiều nỗ lực kỹ thuật hơn và điều này được ưa chuộng khi
thiết kế một bộ xử lý, thay vì hai (hoặc ba, được đưa ra giai đoạn hình học mới).
Nó trở nên đáng giá để thực hiện các thách thức kỹ thuật của một bộ xử lý thống
nhất (cân bằng tải và tuần hoàn của một đường ống logic lên các luồng của mảng
bộ xử lý) để có được lợi ích của một thiết kế bộ xử lý.

GPGPU: Bước trung gian


Khi GPU có khả năng DirectX 9 trở nên khả dụng, một số nhà nghiên cứu đã chú
ý đến con đường tăng trưởng hiệu suất thô của GPU và bắt đầu khám phá việc sử
dụng GPU để giải quyết các vấn đề song song phức tạp. GPU DirectX 9 đã được
thiết kế chỉ để phù hợp với các tính năng theo yêu cầu của API đồ họa. Để truy
cập các tài nguyên tính toán, một lập trình viên đã phải đưa vấn đề của họ vào các
hoạt động đồ họa gốc. Ví dụ: để chạy nhiều phiên bản đồng thời của một trình tạo
pixel, một hình tam giác phải được phát ra cho GPU (với việc cắt thành hình chữ
nhật nếu đó là những gì mong muốn). Shader không có phương tiện để thực hiện
các thao tác phân tán tùy ý vào bộ nhớ. Cách duy nhất để ghi kết quả vào bộ nhớ
là phát ra nó dưới dạng giá trị màu pixel và định cấu hình giai đoạn vận hành bộ
đệm khung để ghi (hoặc trộn, nếu muốn) kết quả cho bộ đệm khung hai chiều.
Hơn nữa, cách duy nhất để có kết quả từ một lần tính toán sang lần tiếp theo là
viết tất cả các kết quả song song vào bộ đệm khung pixel, sau đó sử dụng bộ đệm
khung đó làm bản đồ kết cấu làm đầu vào cho bộ tạo phân đoạn pixel của giai
đoạn tiếp theo của tính toán. Lập bản đồ tính toán chung cho GPU trong thời đại
này là khá khó xử. Tuy nhiên, các nhà nghiên cứu gan dạ đã chứng minh một số ít
các ứng dụng hữu ích với những nỗ lực miệt mài. Trường này được gọi là GPGPU,
cho mục đích tính toán chung trên GPU.
B-80 Phụ lục B Đồ họa và GPU điện toán

Máy tính GPU


Trong khi phát triển kiến trúc Tesla cho GeForce 8800, NVIDIA nhận ra tính
hữu dụng tiềm năng của nó sẽ lớn hơn nhiều nếu các lập trình viên có thể nghĩ
GPU là bộ xử lý. NVIDIA đã chọn một phương pháp lập trình trong đó các lập
trình viên sẽ tuyên bố rõ ràng các khía cạnh song song dữ liệu trong khối lượng
công việc của họ.
Đối với thế hệ DirectX 10, NVIDIA đã bắt đầu làm việc trên bộ xử lý số
nguyên và dấu phẩy động hiệu suất cao có thể chạy nhiều khối lượng công việc
đồng thời để hỗ trợ đường ống đồ họa logic. Bộ xử lý này được thiết kế để tận
dụng trường hợp phổ biến của các nhóm luồng thực hiện cùng một đường dẫn mã.
NVIDIA đã thêm tải bộ nhớ và lưu trữ các hướng dẫn với địa chỉ byte số nguyên
để hỗ trợ các yêu cầu của các chương trình C được biên dịch. Nó đã giới thiệu
khối luồng (mảng luồng hợp tác), lưới các khối luồng và đồng bộ hóa rào cản để
gửi và quản lý công việc tính toán song song cao. Hoạt động bộ nhớ nguyên tử đã
được thêm vào. NVIDIA đã phát triển trình biên dịch CUDA C / C ++, thư viện
và phần mềm thời gian chạy để cho phép các lập trình viên dễ dàng truy cập mô
hình tính toán song song dữ liệu mới và phát triển các ứng dụng.

GPU có thể mở rộng


Khả năng mở rộng đã là một tính năng hấp dẫn của các hệ thống đồ họa ngay từ
đầu. Các hệ thống đồ họa máy trạm đã cho khách hàng lựa chọn mã lực pixel
bằng cách thay đổi số lượng bảng mạch bộ xử lý pixel được cài đặt. Trước giữa
những năm 1990, việc mở rộng đồ họa PC gần như không có. Có một lựa chọn,
bộ điều khiển VGA. Khi máy gia tốc có khả năng 3D xuất hiện, thị trường có chỗ
cho một loạt các dịch vụ. 3dfx giới thiệu tỷ lệ đa bội với SLI gốc (Quét Đường
xen kẽ) trên Voodoo2 của họ, đã giữ vương miện hiệu suất cho thời gian của nó
(1998). Cũng trong năm 1998, NVIDIA đã giới thiệu các sản phẩm riêng biệt
dưới dạng các biến thể trên một kiến trúc duy nhất với Riva TNT Ultra (hiệu suất
cao) và Vanta (chi phí thấp), đầu tiên bằng cách đóng thùng và đóng gói tốc độ,
sau đó với các thiết kế chip riêng biệt (GeForce 2 GTS & GeForce 2 MX). Hiện
tại, đối với một thế hệ kiến trúc nhất định, cần có bốn hoặc năm thiết kế chip
GPU riêng biệt để bao quát phạm vi hiệu suất và điểm giá của máy tính để bàn.
Ngoài ra, có các phân đoạn riêng biệt trong hệ thống máy tính xách tay và máy
trạm. Sau khi có được 3dfx, NVIDIA tiếp tục khái niệm SLI đa GPU vào năm
2004, bắt đầu với GeForce 6800, cung cấp khả năng mở rộng đa GPU cho lập
trình viên và người dùng. Hành vi chức năng là giống hệt nhau trong phạm vi mở
rộng; một ứng dụng sẽ chạy không thay đổi trong bất kỳ việc thực hiện nào của
một gia đình kiến trúc.
Các CPU đang mở rộng đến số lượng bóng bán dẫn cao hơn bằng cách tăng số
lượng lõi hiệu suất không đổi trên một khuôn, thay vì tăng hiệu suất của một lõi. Tại
văn bản này, ngành công nghiệp đang chuyển từ lõi kép sang lõi tứ, với tám lõi
không xa phía sau. Các lập trình viên buộc phải tìm song song nhiệm vụ gấp bốn đến
tám lần để sử dụng đầy đủ các bộ xử lý này và các ứng dụng sử dụng song song
nhiệm vụ phải được viết lại thường xuyên để nhắm mục tiêu nhân đôi liên tiếp
B.11 Quan điểm lịch sử và đọc thêm B-81

số lượng cốt lõi. Ngược lại, GPU đa luồng cao khuyến khích sử dụng song song
dữ liệu nhiều lần và song song luồng, dễ dàng chia tỷ lệ thành hàng ngàn luồng
song song trên nhiều bộ xử lý. Mô hình lập trình song song có thể mở rộng GPU
cho đồ họa và điện toán song song được thiết kế cho khả năng mở rộng trong
suốt và di động. Một chương trình đồ họa hoặc chương trình CUDA được viết
một lần và chạy trên GPU với bất kỳ số lượng bộ xử lý nào. Như thể hiện trong
Mục B.1, một lập trình viên CUDA tuyên bố rõ ràng cả song song hạt mịn và hạt
thô trong một chương trình luồng bằng cách phân tách vấn đề thành các lưới của
các khối luồng, cùng một chương trình sẽ chạy hiệu quả trên GPU hoặc CPU ở
mọi kích thước trong thế hệ hiện tại và tương lai.

Những phát triển gần đây


Công việc học tập và công nghiệp trên các ứng dụng sử dụng CUDA đã tạo ra hàng
trăm ví dụ về các chương trình CUDA thành công. Nhiều chương trình trong số này
chạy ứng dụng nhanh hơn hàng chục hoặc hàng trăm lần so với CPU đa lõi có khả
năng chạy chúng. Các ví dụ bao gồm mô phỏng n-body, mô hình phân tử, tài chính
tính toán và xử lý dữ liệu thăm dò dầu khí. Mặc dù nhiều trong số này sử dụng số học
dấu phẩy động chính xác đơn, một số vấn đề đòi hỏi độ chính xác kép. Sự xuất hiện
gần đây của dấu phẩy động chính xác kép trong GPU cho phép phạm vi ứng dụng
thậm chí rộng hơn để hưởng lợi từ việc tăng tốc GPU.
Để biết danh sách toàn diện và các ví dụ về các phát triển hiện tại trong các ứng
dụng được tăng tốc bởi GPU, hãy truy cập CUDAZone : www.nvidia.com/CUDA.

Xu hướng tương lai


Đương nhiên, số lượng lõi bộ xử lý sẽ tiếp tục tăng tỷ lệ để tăng các bóng bán
dẫn có sẵn khi các quy trình silicon được cải thiện. Ngoài ra, GPU sẽ tiếp tục tận
hưởng sự phát triển kiến trúc mạnh mẽ. Mặc dù hiệu suất cao đã được chứng
minh trên các ứng dụng song song dữ liệu, bộ xử lý lõi GPU vẫn có thiết kế
tương đối đơn giản. Các kỹ thuật tích cực hơn sẽ được giới thiệu với mỗi kiến
trúc kế tiếp để tăng mức độ sử dụng thực tế của các đơn vị tính toán. Bởi vì điện
toán song song có thể mở rộng trên GPU là một lĩnh vực mới, các ứng dụng mới
đang nhanh chóng được tạo ra. Bằng cách nghiên cứu chúng, các nhà thiết kế
GPU sẽ khám phá và triển khai tối ưu hóa máy mới.

Đọc thêm
Akeley, K. và T. Jermoluk [1988]. Kết xuất đa giác hiệu suất cao, trực tiếp Proc. SIGGRAPH 1988 (Tháng
8), 239 bóng46.
Akeley, K. [1993]. Đồ họa thực tế.Giáo dục Proc. SIGGRAPH 1993 (Tháng 8), 109 trận16.
Blelloch, G. B. [1990]. Tổng hợp Prefix và các ứng dụng của họ. Trong John H. Reif (Ed.), Tổng hợp song
song Thuật toán, Nhà xuất bản Morgan Kaufmann, San Francisco.
Blythe, D. [2006]. Hệ thống Direct3D 10 Hệ thống , ACM Trans. Đồ họa Tập. 25, không. 3 (tháng 7), 724 Từ34.
B-82 Phụ lục B Đồ họa và GPU điện toán

Buck, I., T. Foley, D. Horn, J. Sugerman, K. Fatahlian, M. Houston và P. Hanrahan [2004]. Brook Brook
cho GPU: Tính toán luồng trên phần cứng đồ họa.Giáo dục Proc. SIGGRAPH 2004, 777 bóng86, tháng 8.
http://doi.acm. org / 10.1145 / 1186562.1015800.

Anh Cả, G. [2002] Điên 9700.Hội thảo về đồ họa / SIGGRAPH về phần cứng đồ họa, phiên Hot3D ,
www.graphicshardware.org/preingly/www_2002/presentations/Hot3D-RADEON9700.ppt.

Fernando, R. và M. J. Kilgard [2003]. Hướng dẫn Cg: Hướng dẫn dứt khoát về thời gian thực có thể lập
trình Đồ họa, Addison-Wesley, Đọc, MA .

Fernando, R. (Ed.), [2004]. GPU Gems: Kỹ thuật lập trình, mẹo và thủ thuật cho đồ họa thời gian thực, Addison-
Wesley, Đọc, MA . https://developer.nvidia.com/gpugems/GPUGems/gpugems_pref01.html.

Foley, J., A. van Dam, S. Feiner và J. Hughes [1995]. Đồ họa máy tính: Nguyên tắc và thực hành, thứ hai
phiên bản tại C, Addison-Wesley, Đọc, MA .

Hillis, W. D. và G. L. Steele [1986]. Các thuật toán song song dữ liệu.Giáo dục Cộng đồng. ACM 29, 12
(tháng 12.), 1170 bóng83. http:// doi.acm.org/10.1145/7902.7903.

IEEE Std 754-2008 [2008]. Tiêu chuẩn IEEE cho số học dấu phẩy động Sê-ri 980-0-7381-5752-8,
STD95802 ,. http://ieeexplore.ieee.org/servlet/opac?người chơi chữ = 4610933 (Tháng Tám. 29).

Ánh sáng công nghiệp và ma thuật [2003]. OpenEXR, www.openexr.com.

Tập đoàn Intel [2007]. Hướng dẫn tham khảo tối ưu hóa kiến trúc Intel 64 và IA-32. Tháng 11. Số thứ tự:
248966-016. http://www.intel.com/content/dam/www/public/us/en/document/manuals/64-ia-32-arch
architectures-optimization-manual.pdf.

Kessenich, J. [2006]. Ngôn ngữ tạo bóng OpenGL, Phiên bản ngôn ngữ 1.20, tháng
9.2006.www.opengl.org/ tài liệu / thông số kỹ thuật /.

Kirk, D. và D. Voorhies [1990]. Kiến trúc kết xuất của DN10000VS Proc. SIGGRAPH 1990 (Tháng 8),
299 bóng307.

Lindholm E., M.J Kilgard và H. Moreton [2001]. Một người dùng- Động cơ Vertex có thể lập trình.Giáo
dục Proc. SIGGRAPH 2001 (Tháng 8), 149 bóng58.

Lindholm, E., J. Nickolls, S. Oberman và J. Montrym [2008]. NVIDIA Tesla: Kiến trúc đồ họa và tính
toán thống nhất , IEEE Micro Tập. 28, không. 2 (Tháng Ba Tháng Tư), 39 Hàng55.

Microsoft Tổng công ty. Microsoft DirectX Đặc điểm kỹ thuật, https://msdn.microsoft.com/en-us/l
Library /
windows / apps / hh452744.aspx.

Microsoft Tổng công ty [2003]. Đường ống đồ họa có thể lập trình DirectX 9, Nhấn,
Microsoft Microsoft
Redmond, WA .

Montrym, J., D. Baum, D. Dignam và C. Migdal [1997]. InfiniteReality: Một hệ thống đồ họa thời gian
thực.Giáo dục Proc. SIGGRAPH 1997 (Tháng 8), 293 bóng301.

Montrym, J. và H. Moreton [2005]. Mùi GeForce 6800 , IEEE Micro, Tập. 25, không. 2 (Tháng Ba Tháng Tư), 41
trận51.

Moore, G. E. [1965]. Cấm nhồi nhét nhiều thành phần hơn vào các mạch tích hợp Điện tử, Tập. 38, không.
8 (19 tháng 4).
B.11 Quan điểm lịch sử và đọc thêm B-83

Nguyễn, H. (Ed.), [2008]. GPU Gems 3, Addison-Wesley, Đọc, MA .

Nickolls, J., I. Buck, M. Garland và K. Skadron [2008]. Lập trình song song có thể mở rộng với CUDA ',
ACM Hàng đợi Tập. 6, không. 2 (Tháng Ba Tháng Tư) 40 trận53.

NVIDIA [2007]. Khu CUDA. http://www.nvidia.com/object/cuda_home_new.html.


NVIDIA [2007]. Hướng dẫn lập trình CUDA 1.1.https://developer.nvidia.com/nvidia-gpu-programming-
guide.
NVIDIA [2007]. PTX: Thực hiện chủ đề song song ISA phiên bản 1.1.www.nvidia.com/object/io_1195170102263.
html.

Nyland, L., M. Harris và J. Prins [2007]. Mô phỏng cơ thể N nhanh với CUDA. Trong H. Nguyễn (Ed.),
GPU Gems 3 , Addison-Wesley, Đọc, MA .
Oberman, S. F. và M. Y. Siu [2005]. Một khu vực hiệu suất cao - Bộ nội suy đa chức năng hiệu quả, trực tiếpProc.
Symp thứ mười bảy. Số học máy tính, 272 bóng79.
Patterson, D. A. và J. L. Hennessy [2004]. Tổ chức và thiết kế máy tính: Phần cứng / phần mềm liên kết
khuôn mặt, ấn bản thứ ba, Nhà xuất bản Morgan Kaufmann, San Francisco.
Pharr, M. ed. [2005]. GPU Gems 2: Kỹ thuật lập trình cho đồ họa hiệu suất cao và tính toán mục đích
chung, Addison-Wesley, Đọc, MA .
Satish, N., M. Harris và M. Garland [2008]. Thiết kế các thuật toán sắp xếp hiệu quả cho các GPU nhiều
lõi, Báo cáo kỹ thuật của NV NVIA NVR-2008-001.
Segal, M. và K. Akeley [2006]. Hệ thống đồ họa OpenGL: Đặc điểm kỹ thuật, Phiên bản 2.1, tháng 12. 1, 2006.www.
opengl.org/documentation/specs/.
Sengupta, S., M. Harris, Y. Zhang và J. D. Owens [2007]. Nguyên thủy quét quét cho tính toán
GPU."Trong Proc. của Phần cứng đồ họa 2007 (Tháng 8), 97 bóng106.
Volkov, V. và J. Demmel [2008]. Các yếu tố LU, QR và Cholesky sử dụng khả năng Vector của GPU,
Báo cáo kỹ thuật số. UCB / EECS-2008-49, 1 trận11. http://www.eecs.ber
siêu.edu/Pub/TechRpts/2008/EECS-2008-49.pdf.
Williams, S., L. Oliker, R. Vuduc, J. Shalf, K. Yelick và J. Demmel [2007]. Tối ưu hóa phép nhân vectơ ma trận
thưa thớt trên các nền tảng đa lõi mới nổi, In In Proc. Siêu máy tính 2007, tháng 11.
C
A P P E N D TÔI X
Kiểm soát ánh
Một định dạng tùy chỉnh
như thế này là nô lệ cho xạ tới phần
kiến trúc của phần cứng
và bộ hướng dẫn mà nó cứng
phục vụ. Định dạng phải
C.1 Giới thiệu C-3
đạt được sự thỏa hiệp
C.2 Thực hiện các đơn vị kiểm soát kết
thích hợp giữa kích
hợp C-4
thước ROM, giải mã C.3 Thực hiện kiểm soát máy trạng thái
đầu ra ROM, kích thước hữu hạn C-8
mạch và tốc độ thực thi C.4 Thực hiện chức năng trạng thái tiếp theo với
của máy. Trình sắp xếp C-22

Jim McKevit, et al.


Báo cáo thiết kế 8086, 1997
C.5 Dịch một Microprogram sang Phần cứng C-28
C.6 Kết luận C-32
C.7 Bài tập C-33

C.1 Giới thiệu

Điều khiển thường có hai phần: một phần kết hợp thiếu trạng thái và bộ điều khiển
tuần tự xử lý giải trình tự và điều khiển chính trong thiết kế nhiều xe đạp. Các đơn vị
kiểm soát kết hợp thường được sử dụng để xử lý một phần của quá trình giải mã và
kiểm soát. Kiểm soát ALU trong Chương 4 là một ví dụ như vậy. Một chu kỳ thực
hiện như thế trong Chương 4 cũng có thể sử dụng bộ điều khiển tổ hợp, vì nó không
yêu cầu nhiều trạng thái. Mục C.2 kiểm tra việc thực hiện hai đơn vị tổ hợp này từ
các bảng sự thật Chương 4.
Vì các đơn vị điều khiển tuần tự lớn hơn và thường phức tạp hơn, có nhiều kỹ
thuật khác nhau để thực hiện một đơn vị điều khiển tuần tự. Tính hữu ích của các
kỹ thuật này phụ thuộc vào độ phức tạp của điều khiển, các đặc điểm như số
lượng trạng thái trung bình tiếp theo cho bất kỳ trạng thái cụ thể nào và công
nghệ triển khai.
Cách đơn giản nhất để thực hiện chức năng điều khiển tuần tự là với một khối
logic lấy đầu vào trạng thái hiện tại và trường opcode của thanh ghi Hướng dẫn và
tạo ra như đầu ra tín hiệu điều khiển datapath và giá trị của trạng thái tiếp theo. Biểu
diễn ban đầu có thể là sơ đồ trạng thái hữu hạn hoặc chương trình vi mô. Trong
trường hợp sau, mỗi vi mô đại diện cho một trạng thái.
C-4 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Trong một triển khai sử dụng bộ điều khiển trạng thái hữu hạn, hàm trạng thái
tiếp theo sẽ được tính toán bằng logic. Mục C.3 xây dựng một triển khai như vậy
cho cả ROM và PLA .
Một phương thức thực hiện thay thế tính toán hàm trạng thái tiếp theo bằng
cách sử dụng bộ đếm tăng trạng thái hiện tại để xác định trạng thái tiếp theo. Khi
trạng thái tiếp theo không theo tuần tự, logic khác được sử dụng để xác định
trạng thái. Mục C.4 khám phá loại thực hiện này và cho thấy làm thế nào nó có
thể được sử dụng để thực hiện kiểm soát nhà nước hữu hạn.
Trong Mục C.5, chúng tôi chỉ ra cách biểu diễn microprogram của điều khiển
tuần tự được dịch sang logic điều khiển.

Thực hiện kết hợp


C.2
Đơn vị kiểm soát
Trong phần này, chúng tôi chỉ ra cách bộ điều khiển ALU và bộ điều khiển chính
cho thiết kế đồng hồ đơn được ánh xạ xuống mức cổng. Với hiện đại thiết kế hỗ
trợ máy tính (CAD) hệ thống, quá trình này là hoàn toàn cơ học. Các ví dụ minh
họa cách một hệ thống CAD tận dụng cấu trúc của chức năng điều khiển, bao
gồm cả sự hiện diện của các điều khoản chăm sóc don.

Lập bản đồ chức năng kiểm soát ALU cho Gates


Hình C.2.1 hiển thị bảng sự thật cho chức năng điều khiển ALU đã được phát
triển trong Chương 4, Mục 4.4 Một khối logic thực hiện chức năng điều khiển
ALU này sẽ có bốn đầu ra riêng biệt (được gọi là Chiến dịch3, Hoạt động2, Hoạt
động1 và Hoạt động0), mỗi đầu ra tương ứng với một trong bốn bit của điều
khiển ALU trong cột cuối cùng của. Hình C.2.1 Hàm logic cho mỗi đầu ra được
xây dựng bằng cách kết hợp tất cả các mục nhập bảng chân lý đặt đầu ra cụ thể
đó. Ví dụ: bit thứ tự thấp của điều khiển ALU (Operation0) được đặt bởi hai mục
cuối của bảng sự thật trong. Hình C.2.1Do đó, bảng sự thật cho Operation0 sẽ có
hai mục này.
Hình C.2.2 hiển thị các bảng sự thật cho mỗi trong bốn bit điều khiển ALU.
Chúng tôi đã tận dụng cấu trúc chung trong mỗi bảng sự thật để kết hợp thêm
don don quan tâm. Ví dụ, năm dòng trong bảng sự thật Hình C.2.1 tập hợp đó là
Operation1 được giảm xuống chỉ còn hai mục Hình C.2.2. Một chương trình
giảm thiểu logic sẽ sử dụng các thuật ngữ chăm sóc don don để giảm số lượng
cổng và số lượng đầu vào cho mỗi cổng trong việc thực hiện cổng logic của các
bảng sự thật này.
Một khía cạnh khó hiểu của Hình C.2.2 là không có chức năng logic cho
Opera-tion3. Đó là bởi vì dòng điều khiển này chỉ được sử dụng cho hoạt động
NOR, không cần thiết cho tập hợp con RISC-V Hình 4.12.
Từ bảng sự thật đơn giản hóa trong Hình C.2.2, chúng ta có thể tạo logic hiển thị
trong Hình C.2.3, mà chúng tôi gọi là Khối điều khiển ALU. Quá trình này là đơn giản
C.2 Thực hiện các đơn vị kiểm soát kết hợp C-5

ALUOp Trường Funct Hoạt động


ALUOp1 ALUOp0 F5 F4 F3 F2 F1 F0
0 0 X X X X X X 0010
X 1 X X X X X X 0110
1 X X X 0 0 0 0 0010
1 X X X 0 0 1 0 0110
1 X X X 0 1 0 0 0000
1 X X X 0 1 0 1 0001
1 X X X 1 0 1 0 0111

HÌNH C.2.1 Bảng chân lý cho bốn bit điều khiển ALU (được gọi là Hoạt động) là một hàm của
ALUOp và trường mã chức năng. Bảng này giống như bảng được hiển thị trong Hình 4.13.

Các trường mã chức


ALUOp năng
ALUOp1 ALUOp0 F5 F4 F3 F2 F1 F0
0 1 X X X X X X
1 X X X X X 1 X
a. Bảng chân lý cho Chiến dịch2 = 1 (bảng này tương ứng với bit thứ hai sang trái của trường Hoạt
động trong Hình C.2.1)

Các trường mã chức


ALUOp năng
ALUOp1 ALUOp0 F5 F4 F3 F2 F1 F0
0 X X X X X X X
X X X X X 0 X X
b. Bảng sự thật cho Chiến dịch1 = 1

Các trường mã chức


ALUOp năng
ALUOp1 ALUOp0 F5 F4 F3 F2 F1 F0
1 X X X X X X 1
1 X X X 1 X X X
c. Bảng sự thật cho Chiến dịch0 = 1
HÌNH C.2.2 Các bảng sự thật cho ba dòng điều khiển ALU. Chỉ các mục mà đầu ra là 1 được hiển
thị. Các bit trong mỗi trường được đánh số từ phải sang trái bắt đầu bằng 0; do đó F5 là bit quan trọng nhất
của trường hàm và F0 là bit ít quan trọng nhất. Tương tự, tên của các tín hiệu tương ứng với mã hoạt động
4 bit được cung cấp cho ALU là Operation3, Operation2, Operation1 và Operation0 (với bit cuối cùng là bit
ít quan trọng nhất). Do đó, bảng sự thật ở trên cho thấy các kết hợp đầu vào mà điều khiển ALU phải là
0010, 0001, 0110 hoặc 0111 (các kết hợp khác không được sử dụng). Các bit ALUOp được đặt tên là
ALUOp1 và ALUOp0. Ba giá trị đầu ra phụ thuộc vào trường ALUOp 2 bit và khi trường đó bằng 10, mã
hàm 6 bit trong lệnh. Theo đó, khi trường ALUOp không bằng 10, chúng tôi không quan tâm đến giá trị mã
chức năng (nó được biểu thị bằng X). Không có bảng sự thật khi Chiến dịch3 = 1 vì nó luôn được đặt thành
0 in Hình C.2.1 Xem. Phụ lục A để biết thêm thông tin về don lồng quan tâm.
C-6 Phụ lục C Kiểm soát ánh xạ tới phần cứng

ALUOp

Khối điều khiển ALU


ALUOp0

ALUOp1 Chiến dịch3

F3 Hoạt động2
Hoạt động
F2
F (5 trận0) Hoạt động1
F1
Hoạt động0
F0

HÌNH C.2.3 Khối điều khiển ALU tạo ra bốn bit điều khiển ALU, dựa trên mã chức năng và các
bit ALUOp. Logic này được tạo trực tiếp từ bảng sự thật trong Hình C.2.2. Chỉ có 4 trong số 6 bit trong mã chức
năng thực sự cần thiết làm đầu vào, vì 2 bit trên luôn được don don quan tâm. Hãy cùng xem xét cách logic này
liên quan đến bảng sự thật Hình C.2.2Hãy xem xét đầu ra Operation2, được tạo bởi hai dòng trong bảng chân lý
cho Operation2. Dòng thứ hai là AND gồm hai thuật ngữ (F1 = 1 và ALUOp1 = 1); cổng hai đầu vào VÀ đầu ra
tương ứng với thuật ngữ này. Thuật ngữ khác khiến cho Chiến dịch2 được khẳng định đơn giản là ALUOp0. Hai
thuật ngữ này được kết hợp với cổng OR có đầu ra là Chiến dịch2. Các đầu ra Operation0 và Operation1 có
nguồn gốc tương tự từ bảng chân lý. Vì Chiến dịch3 luôn là 0, chúng tôi kết nối tín hiệu và phần bổ sung của nó
làm đầu vào cho cổng AND để tạo 0.

và có thể được thực hiện với một chương trình CAD. Một ví dụ về cách các cổng
logic có thể được lấy từ các bảng sự thật được đưa ra trong truyền thuyết Hình
C.2.3.
Logic điều khiển ALU này rất đơn giản vì chỉ có ba đầu ra và chỉ một vài trong
số các kết hợp đầu vào có thể cần được nhận ra. Nếu một số lượng lớn mã chức
năng ALU có thể phải được chuyển đổi thành tín hiệu điều khiển ALU, phương
pháp đơn giản này sẽ không hiệu quả. Thay vào đó, bạn có thể sử dụng bộ giải mã,
bộ nhớ hoặc một mảng cổng logic có cấu trúc. Những kỹ thuật này được mô tả
trong Phụ lục Avà chúng ta sẽ thấy các ví dụ khi chúng ta kiểm tra việc thực hiện
bộ điều khiển đa xe đạp Mục C.3.

Xây dựng: Nói chung, một phương trình logic và biểu diễn bảng sự thật của một logic
chức năng tương đương. (Chúng tôi thảo luận điều này chi tiết hơn trong Phụ lục A). Tuy
nhiên, khi một bảng chân lý chỉ chỉ định các mục dẫn đến đầu ra khác không, nó có thể
không mô tả hoàn toàn hàm logic. Một bảng sự thật đầy đủ hoàn toàn chỉ ra tất cả các
mục chăm sóc don don. Ví dụ: mã hóa 11 cho ALUOp luôn tạo ra sự chăm sóc don don
trong đầu ra. Do đó, một bảng sự thật hoàn chỉnh sẽ có XXX trong phần đầu ra cho tất cả
các mục có 11 trong trường ALUOp. Các mục chăm sóc don don này cho phép chúng tôi
thay thế trường ALUOp 10 và 01 bằng 1X và X1, tương ứng. Kết hợp các thuật ngữ chăm
sóc don don và giảm thiểu logic vừa phức tạp vừa dễ bị lỗi và do đó, tốt hơn là để lại cho
một chương trình.
C.2 Thực hiện các đơn vị kiểm soát kết hợp C-7

Lập bản đồ chức năng điều khiển chính cho Gates


Việc triển khai chức năng điều khiển chính với bộ sưu tập cổng không cấu trúc,
như chúng tôi đã làm cho điều khiển ALU, là hợp lý vì chức năng điều khiển
không phức tạp cũng không lớn, như chúng ta có thể thấy từ bảng sự thật được
hiển thị Hình C.2.4Tuy nhiên, nếu hầu hết 64 opcodes có thể được sử dụng và có
nhiều dòng điều khiển hơn, số lượng cổng sẽ lớn hơn nhiều và mỗi cổng có thể
có nhiều đầu vào hơn.
Vì bất kỳ hàm nào cũng có thể được tính theo hai cấp độ logic, nên một cách
khác để thực hiện hàm logic là với mảng logic hai cấp có cấu trúc. Hình C.2.5
cho thấy một thực hiện như vậy. Nó sử dụng một mảng các cổng AND theo sau
là một mảng các cổng OR. Cấu trúc này được gọi là amảng logic lập trình (PLA).
PLA là một trong những cách phổ biến nhất để thực hiện chức năng điều khiển.
Chúng tôi sẽ trở lại chủ đề sử dụng các yếu tố logic có cấu trúc để thực hiện kiểm
soát khi chúng tôi triển khai bộ điều khiển trạng thái hữu hạn trong phần tiếp
theo.

Điều Tên tín hiệu Định lw sw beq


khiển dạng R
Op5 0 1 1 0
Op4 0 0 0 0
Op3 0 0 1 0
Đầu vào
Op2 0 0 0 1
Op1 0 1 1 0
Op0 0 1 1 0
RegDst 1 0 X X
ALUSrc 0 1 1 0
MemtoReg 0 1 X X
RegWrite 1 1 0 0
Đầu ra Ghi nhớ 0 1 0 0
Ghi nhớ 0 0 1 0
Chi nhánh 0 0 0 1
ALUOp1 1 0 0 0
ALUOp0 0 0 0 1

HÌNH C.2.4 Chức năng điều khiển để thực hiện một giờ đơn giản được chỉ định hoàn toàn
bởi bảng sự thật này. Bảng này giống như bảng được hiển thị trongHình 4.22.
C-8 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Đầu vào
Op5
Op4
Op3
Op2
Op1
Op0

Đầu ra
Định Iw sw beq
dạng R
RegDst

ALUSrc
MemtoReg
RegWrite
Ghi nhớ
Ghi nhớ
Chi nhánh
ALUOp1
ALUOp0

HÌNH C.2.5 Việc triển khai có cấu trúc của hàm điều khiển như được mô tả bởi bảng chân lý
trong Hình C.2.4. Cấu trúc, được gọi là a mảng logic lập trình (PLA), sử dụng một mảng VÀ cổng theo sau là
một mảng các cổng OR. Các đầu vào cho cổng AND là các đầu vào hàm và các nghịch đảo của chúng (bong bóng
biểu thị sự đảo ngược của tín hiệu). Các đầu vào cho cổng OR là đầu ra của cổng AND (hoặc, như một trường
hợp thoái hóa, đầu vào hàm và nghịch đảo). Đầu ra của cổng OR là đầu ra hàm.

Thực hiện máy trạng thái hữu hạn


C.3
Điều khiển
Để thực hiện điều khiển như một máy trạng thái hữu hạn, trước tiên chúng ta phải
gán một số cho mỗi trong số 10 trạng thái; bất kỳ trạng thái nào cũng có thể sử dụng
bất kỳ số nào, nhưng chúng tôi sẽ sử dụng đánh số tuần tự để đơn giản. Hình C.3.1
hiển thị sơ đồ trạng thái hữu hạn. Với 10 trạng thái, chúng ta sẽ cần 4 bit để mã hóa
số trạng thái và chúng ta gọi các bit trạng thái S3, S2, S1 và S0 này. Số trạng thái
hiện tại sẽ được lưu trữ trong một thanh ghi trạng thái, như được hiển thị trong Hình
C.3.2 Nếu các trạng thái được chỉ định tuần tự, trạng thái. Tôi được mã hóa bằng cách
sử dụng
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-9

Giải mã hướng
dẫn /
Hướng dẫn lấy đăng ký lấy
0 Ghi nhớ 1
ALUSrcA = 0
IorD = 0 ALUSrcA = 0
Khởi đầu IRWrite ALUSrcB = 10
ALUSrcB = 01 ALUOp = 00
ALUOp = 00
PCWrite
Nguồn PC = 0
R
-type)
=
'BEQ')
(Op =
Địa chỉ bộ nhớ Chi
= 'SW') nhánh
tính toán (Op Thi hành án hoàn thành (Op
hoặc là

=
'LW')
2 (Op 6 số 8
ALUSrcA = 1
ALUSrcA = 1 ALUSrcA = 1 ALUSrcB = 00
ALUSrcB = 10 ALUSrcB = 00 ALUOp = 01
ALUOp = 00 ALUOp = 10 PCWriteCond
Nguồn PC = 1

(Op
(Op = 'LW')

=
'SW')
Ký ức Ký ức
truy cập truy cập Hoàn thành loại R
3 5 7

RegDst = 1
Ghi nhớ Ghi nhớ RegWrite
IorD = 1 IorD = 1 MemtoReg = 0

Bước viết lại


4

RegDst = 0
RegWrite
MemtoReg = 1

HÌNH C.3.1 Sơ đồ trạng thái hữu hạn để điều khiển đa xe đạp.


C-10 Phụ lục C Kiểm soát ánh xạ tới phần cứng

PCWrite
PCWriteCon
IorD
Ghi nhớ
Ghi nhớ
IRWrite
Kiểm soát logic
MemtoReg
Nguồn PC
Đầu ra ALUOp
ALUSrcB
ALUSrcA
RegWrite

NS3
NS2
NS1
Đầu vào NS0
Op

Op

Op

Op

Op

S1
Op6
Op5

S0
4

S3

S2
Đăng ký hướng dẫn Đăng ký nhà nước
trường opcode

HÌNH C.3.2 Đơn vị điều khiển cho RISC-V sẽ bao gồm một số logic điều khiển và một
thanh ghi để giữ trạng thái. Thanh ghi trạng thái được viết ở cạnh đồng hồ hoạt động và ổn định trong
suốt thời gian chu kỳ.

bit trạng thái là số nhị phân Tôi. Ví dụ: trạng thái 6 được mã hóa là 0110hai hoặc
S3 = 0, S2 = 1, S1 = 1, S0 = 0, cũng có thể được viết là
S3⋅S2⋅S1⋅S0

Đơn vị điều khiển có đầu ra chỉ định trạng thái tiếp theo. Chúng được ghi vào
thanh ghi trạng thái trên cạnh đồng hồ và trở thành trạng thái mới vào đầu chu kỳ
đồng hồ tiếp theo sau cạnh đồng hồ hoạt động. Chúng tôi đặt tên cho các đầu ra
này là NS3, NS2, NS1 và NS0. Khi chúng tôi đã xác định số lượng đầu vào,
trạng thái và đầu ra, chúng tôi biết đường viền cơ bản của đơn vị điều khiển sẽ
trông như thế nào, như chúng tôi đã trình bày Hình C.3.2.
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-11

Các khối được dán nhãn logic điều khiển logic trong Hình C.3.2 là logic kết hợp.
Chúng ta có thể nghĩ về nó như một bảng lớn đưa ra giá trị của các đầu ra về mặt đầu
vào. Logic trong khối này thực hiện hai phần khác nhau của máy trạng thái hữu hạn.
Một phần là logic xác định cài đặt các đầu ra điều khiển datapath, chỉ phụ thuộc vào
các bit trạng thái. Phần khác của logic điều khiển thực hiện chức năng trạng thái tiếp
theo; các phương trình này xác định các giá trị của các bit trạng thái tiếp theo dựa
trên các bit trạng thái hiện tại và các đầu vào khác (opcode 6 bit).
Hình C.3.3 hiển thị các phương trình logic: phần trên cùng hiển thị các đầu ra
và phần dưới cùng cho thấy chức năng trạng thái tiếp theo. Các giá trị trong bảng
này là

Đầu ra Hiện trạng Op


PCWrite state0 + state9
PCWriteCond trạng thái8
IorD bang3 + bang5
Ghi nhớ state0 + state3
Ghi nhớ bang5
IRWrite trạng thái0
MemtoReg tiểu bang4
PCSource1 tiểu bang9
PCSource0 trạng thái8
ALUOp1 tiểu bang6
ALUOp0 trạng thái8
ALUSrcB1 bang1 + bang2
ALUSrcB0 state0 + state1
ALUSrcA bang2 + bang6 + bang8
RegWrite bang4 + bang7
NextState0 state4 + state5 + state7 + state8 + state9
NextState1 trạng thái0
NextState2 tiểu bang1 (Op = 'lw') + (Op = 'sw')
NextState3 bang2 (Op = 'lw')
NextState4 tiểu bang3
NextState5 bang2 (Op = 'sw')
NextState6 tiểu bang1 (Op = 'Loại R')
NextState7 tiểu bang6
NextState8 tiểu bang1 (Op = 'beq')

HÌNH C.3.3 Các phương trình logic cho đơn vị điều khiển được hiển thị ở dạng tốc ký.
Nhớ lại đó là + + là viết tắt của OR trong các phương trình logic. Các đầu vào trạng thái và đầu ra
NextState phải được mở rộng bằng cách sử dụng mã hóa trạng thái. Bất kỳ mục trống là một chăm sóc don
don.
C-12 Phụ lục C Kiểm soát ánh xạ tới phần cứng

xác định từ sơ đồ trạng thái trong Hình C.3.1Bất cứ khi nào một dòng điều khiển
được kích hoạt ở trạng thái, trạng thái đó được nhập vào cột thứ hai của bảng.
Tương tự như vậy, các mục trạng thái tiếp theo được thực hiện bất cứ khi nào
một trạng thái là sự kế thừa cho một trạng thái khác.
Trong Hình C.3.3, chúng tôi sử dụng trạng thái viết tắtN để đứng cho nhà nước
hiện tại NNhư vậy, nhà nước.N được thay thế bằng thuật ngữ mã hóa số trạng thái
N Chúng tôi sử dụng NextState.N để thay thế cho cài đặt của các đầu ra trạng thái
tiếp theo NĐầu ra này được thực hiện bằng cách sử dụng các đầu ra trạng thái tiếp
theo (NS) . Khi NextState.N đang hoạt động, các bit NS [3 Lỗi0] được đặt tương
ứng với phiên bản nhị phân của giá trị NTất nhiên, do một bit trạng thái tiếp theo
nhất định được kích hoạt ở nhiều trạng thái tiếp theo, phương trình cho mỗi bit
trạng thái sẽ là OR của các thuật ngữ kích hoạt tín hiệu đó. Tương tự như vậy, khi
chúng ta sử dụng một thuật ngữ như (Op =.lwCàng), điều này tương ứng với
AND của các đầu vào opcode chỉ định mã hóa của opcode lw trong 6 bit, giống
như chúng ta đã làm cho đơn vị điều khiển đơn giản trong phần trước của chương
này. Dịch các mục trong Hình C.3.3 vào các phương trình logic cho các đầu ra là
đơn giản.

Phương trình logic cho đầu ra trạng thái tiếp theo

VÍ DỤ Đưa ra phương trình logic cho bit trạng thái tiếp theo thứ tự thấp, NS0.

NS0 bit trạng thái tiếp theo sẽ hoạt động bất cứ khi nào trạng thái tiếp theo có
TRẢ LỜI NS0 = 1 trong mã hóa trạng thái. Điều này đúng với NextState1, NextState3,
NextState5, NextState7 và NextState9. Các mục cho các tiểu bang trong Hình
C.3.3 cung cấp các điều kiện khi các giá trị trạng thái tiếp theo này sẽ được
kích hoạt. Phương trình cho mỗi trạng thái tiếp theo được đưa ra dưới đây.
Phương trình đầu tiên nói rằng trạng thái tiếp theo là 1 nếu trạng thái hiện tại
là 0; trạng thái hiện tại là 0 nếu mỗi bit đầu vào trạng thái là 0, đó là thuật
ngữ sản phẩm ngoài cùng bên phải chỉ ra.

NextState1 5 Nhà nước0 5 S3 ⋅ S2 ⋅ S1 ⋅ S0


NextState3 5 Nhà nước2 ⋅ (Op [5-0]51w)
5 S3 ⋅ S2 ⋅ S1 ⋅ S0 ⋅ Op5 ⋅ Op4 ⋅ Op3 ⋅ Op2 ⋅ Op1 ⋅
Op0 NextState5 5 Nhà nước2 ⋅ (Op [5-0]=sw)
5 S3 ⋅ S2 ⋅ S1 ⋅ S0 ⋅ Op5 ⋅ Op4 ⋅ Op3 ⋅ Op2 ⋅ Op1 ⋅
Op0 NextState7 5 Bang6 5 S3 ⋅ S2 ⋅ S1 ⋅ S0
NS0 là tổng hợp lý
của tất cả các điều
khoản này.
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-13

Như chúng ta đã thấy, hàm điều khiển có thể được biểu thị dưới dạng phương
trình logic cho mỗi đầu ra. Tập hợp các phương trình logic này có thể được thực
hiện theo hai cách: tương ứng với một bảng chân lý hoàn chỉnh hoặc tương ứng
với cấu trúc logic hai cấp độ cho phép mã hóa thưa thớt của bảng chân lý. Trước
khi chúng ta xem xét các triển khai này, hãy để Nhìn vào bảng sự thật cho chức
năng điều khiển hoàn chỉnh.

Nó là đơn giản nhất nếu chúng ta phá vỡ chức năng điều khiển được xác định
trong Hình C.3.3 thành hai phần: đầu ra trạng thái tiếp theo, có thể phụ thuộc vào
tất cả các đầu vào và đầu ra tín hiệu điều khiển, chỉ phụ thuộc vào các bit trạng
thái hiện tại. Hình C.3.4 hiển thị các bảng sự thật cho tất cả các tín hiệu điều
khiển datapath. Bởi vì các tín hiệu này thực sự chỉ phụ thuộc vào các bit trạng
thái (chứ không phải opcode), mỗi mục trong một bảng trong Hình C.3.4 thực sự
đại diện cho 64 (= 26) các mục, với 6 bit có tên Op có tất cả các giá trị có thể;
nghĩa là, các bit Op là các bit chăm sóc don trong việc xác định các đầu ra kiểm
soát đường dẫn dữ liệu. Hình C.3.5 hiển thị bảng sự thật cho các bit trạng thái
tiếp theo NS [3 Lỗi0], phụ thuộc vào các bit đầu vào trạng thái và các bit lệnh,
cung cấp opcode.

Xây dựng: Có nhiều cơ hội để đơn giản hóa chức năng điều khiển bằng cách
quan sát sự tương đồng giữa hai hoặc nhiều tín hiệu điều khiển và bằng cách sử
dụng ngữ nghĩa của việc thực hiện. Ví dụ: các tín hiệu PCWriteCond, PCSource0 và
ALUOp0 đều được xác nhận ở chính xác một trạng thái, trạng thái 8. Ba tín hiệu điều
khiển này có thể được thay thế bằng một tín hiệu duy nhất.
C-14 Phụ lục C Kiểm soát ánh xạ tới phần cứng

s3 s2 s1 s0 s3 s2 s1 s0 s3 s2 s1 s0
0 0 0 0 1 0 0 0 0 0 1 1
1 0 0 1 0 1 0 1
c. Bảng sự thật cho
a. Bảng sự thật cho PCWrite b. Bảng sự thật cho PCWriteCond IorD

s3 s2 s1 s0 s3 s2 s1 s0 s3 s2 s1 s0
0 0 0 0 0 1 0 1 0 0 0 0
0 0 1 1
d. Bảng sự thật cho MemRead e. Bảng sự thật cho MemWrite f. Bảng sự thật cho IRWrite

s3 s2 s1 s0 s3 s2 s1 s0 s3 s2 s1 s0
0 1 0 0 1 0 0 1 1 0 0 0
g. Bảng sự thật cho MemtoReg h. Bảng sự thật cho PCSource1 Tôi. Bảng sự thật cho PCSource0

s3 s2 s1 s0 s3 s2 s1 s0 s3 s2 s1 s0
0 1 1 0 1 0 0 0 0 0 0 1
0 0 1 0
j. Bảng sự thật cho ALUOp1 k. Bảng sự thật cho ALUOp0 l. Bảng sự thật cho ALUSrcB1

s3 s2 s1 s0 s3 s2 s1 s0 s3 s2 s1 s0
0 0 0 0 0 0 1 0 0 1 0 0
0 0 0 1 0 1 1 0 0 1 1 1
1 0 0 0
m. Bảng sự thật cho
ALUSrcB0 n. Bảng sự thật cho ALUSrcA o. Bảng sự thật cho RegWrite

HÌNH C.3.4 Các bảng chân lý được hiển thị cho 15 tín hiệu điều khiển datapath chỉ phụ thuộc vào các bit đầu vào
trạng thái hiện tại, được hiển thị cho mỗi bảng. Mỗi hàng bảng sự thật tương ứng với 64 mục: một cho mỗi giá trị có thể có của sáu
Op bit. Lưu ý rằng một số đầu ra đang hoạt động trong các trường hợp gần như giống nhau. Ví dụ: trong trường hợp PCWriteCond,
PCSource0 và ALUOp0, các tín hiệu này chỉ hoạt động ở trạng thái 8 (xem b, i và k). Ba tín hiệu này có thể được thay thế bằng một tín hiệu.
Có những cơ hội khác để giảm logic cần thiết để thực hiện chức năng điều khiển bằng cách tận dụng những điểm tương đồng hơn nữa trong
các bảng chân lý.
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-15

Op5 Op4 Op3 Op2 Op1 Op0 S3 S2 S1 S0


0 0 0 0 1 0 0 0 0 1
0 0 0 1 0 0 0 0 0 1
a. Bảng chân lý cho đầu ra NS3, hoạt động khi trạng thái tiếp theo là 8 hoặc 9. Tín hiệu này được kích
hoạt khi trạng thái hiện tại là 1.

Op5 Op4 Op3 Op2 Op1 Op0 S3 S2 S1 S0


0 0 0 0 0 0 0 0 0 1
1 0 1 0 1 1 0 0 1 0
X X X X X X 0 0 1 1
X X X X X X 0 1 1 0
b. Bảng chân lý cho đầu ra NS2, hoạt động khi trạng thái tiếp theo là 4, 5, 6 hoặc 7. Tình huống này
xảy ra khi trạng thái hiện tại là một trong 1, 2, 3 hoặc 6.

Op5 Op4 Op3 Op2 Op1 Op0 S3 S2 S1 S0


0 0 0 0 0 0 0 0 0 1
1 0 0 0 1 1 0 0 0 1
1 0 1 0 1 1 0 0 0 1
1 0 0 0 1 1 0 0 1 0
X X X X X X 0 1 1 0
c. Bảng chân lý cho đầu ra NS1, hoạt động khi trạng thái tiếp theo là 2, 3, 6 hoặc 7. Trạng thái tiếp
theo là một trong 2, 3, 6 hoặc 7 chỉ khi trạng thái hiện tại là một trong 1, 2 hoặc 6.

Op5 Op4 Op3 Op2 Op1 Op0 S3 S2 S1 S0


X X X X X X 0 0 0 0
1 0 0 0 1 1 0 0 1 0
1 0 1 0 1 1 0 0 1 0
X X X X X X 0 1 1 0
0 0 0 0 1 0 0 0 0 1
d. Bảng chân lý cho đầu ra NS0, hoạt động khi trạng thái tiếp theo là 1, 3, 5, 7 hoặc 9. Điều này chỉ
xảy ra nếu trạng thái hiện tại là một trong 0, 1, 2 hoặc 6.

HÌNH C.3.5 Bốn bảng chân lý cho bốn bit đầu ra trạng thái tiếp theo (NS [3 Tắt0]). Các đầu ra
trạng thái tiếp theo phụ thuộc vào giá trị của Op [5-0], là trường opcode và trạng thái hiện tại, được đưa ra
bởi S [3 Lỗi 0]. Các mục với X là các điều khoản chăm sóc don. Mỗi mục có một thuật ngữ chăm sóc don
don tương ứng với hai mục, một mục có đầu vào đó ở 0 và một với đầu vào đó ở 1. Do đó, một mục với n
điều khoản chăm sóc don don thực sự tương ứng với 2n mục bảng sự thật.

Thực hiện ROM


Có lẽ cách đơn giản nhất để thực hiện chức năng điều khiển là mã hóa các bảng sự
thật trong bộ nhớ chỉ đọc (ROM). Số lượng mục trong bộ nhớ cho các bảng sự thật
Hình C.3.4 và C.3.5 bằng với tất cả các giá trị có thể có của các đầu vào (6 bit
opcode cộng với 4 bit trạng thái), là 2# đầu vào = 210 = 1024. Các đầu vào
C-16 Phụ lục C Kiểm soát ánh xạ tới phần cứng

để đơn vị điều khiển trở thành các dòng địa chỉ cho ROM, thực hiện khối logic
điều khiển được hiển thị trong Hình C.3.2Độ rộng của mỗi mục (hoặc từ trong bộ
nhớ) là 20 bit, vì có 16 đầu ra điều khiển datapath và 4 bit trạng thái tiếp theo.
Điều này có nghĩa là tổng kích thước của ROM là 2.10 × 20 = 20 Kbit.
Cài đặt các bit trong một từ trong ROM phụ thuộc vào đầu ra nào được kích hoạt
trong từ đó. Trước khi chúng ta xem xét các từ điều khiển, chúng ta cần đặt hàng các
bit trong đầu vào điều khiển (địa chỉ) và các từ đầu ra (nội dung), tương ứng. Chúng
tôi sẽ đánh số các bit bằng cách sử dụng thứ tự trong Hình C.3.2, với các bit trạng thái
tiếp theo là các bit thứ tự thấp của điều khiển từ và các bit đầu vào trạng thái hiện tại
là các bit bậc thấp của Địa chỉ. Điều này có nghĩa là đầu ra PCWrite sẽ là bit bậc cao
(bit 19) của mỗi từ bộ nhớ và NS0 sẽ là bit bậc thấp. Bit địa chỉ thứ tự cao sẽ được
cung cấp bởi Op5, đây là bit thứ tự cao của hướng dẫn và bit địa chỉ thứ tự thấp sẽ
được S0 cung cấp.
Chúng ta có thể xây dựng nội dung ROM bằng cách xây dựng toàn bộ bảng
chân lý theo dạng mà mỗi hàng tương ứng với một trong 2n kết hợp đầu vào duy
nhất và một tập hợp các cột cho biết đầu ra nào được kích hoạt cho kết hợp đầu
vào đó. Chúng tôi không có không gian ở đây để hiển thị tất cả 1024 mục trong
bảng sự thật. Tuy nhiên, bằng cách tách điều khiển datapath và đầu ra trạng thái
tiếp theo, chúng tôi làm, vì đầu ra điều khiển datapath chỉ phụ thuộc vào trạng
thái hiện tại. Bảng chân lý cho các đầu ra điều khiển datapath được hiển thị trong
Hình C.3.6Chúng tôi chỉ bao gồm các mã hóa của các đầu vào trạng thái đang sử
dụng (nghĩa là các giá trị từ 0 đến 9 tương ứng với 10 trạng thái của máy trạng
thái).
Bảng sự thật trong Hình C.3.6 trực tiếp cung cấp nội dung của 16 bit trên của
mỗi từ trong ROM. Trường đầu vào 4 bit cung cấp các bit địa chỉ thứ tự thấp của
mỗi từ và cột cung cấp nội dung của từ tại địa chỉ đó.
Nếu chúng tôi đã hiển thị một bảng sự thật đầy đủ cho các bit điều khiển
datapath với cả số trạng thái và các bit opcode làm đầu vào, tất cả các đầu vào
opcode sẽ được don don quan tâm. Khi chúng tôi xây dựng ROM, chúng tôi
không thể có bất kỳ sự quan tâm nào, vì các địa chỉ vào ROM phải được hoàn
thành. Do đó, các đầu ra điều khiển datapath tương tự sẽ xảy ra nhiều lần trong
ROM, vì phần này của ROM giống nhau bất cứ khi nào các bit trạng thái giống
hệt nhau, không phụ thuộc vào giá trị của các đầu vào opcode.

Kiểm soát ROM Entries


VÍ DỤ Đối với những gì địa chỉ ROM sẽ bit tương ứng với PCWrite, bit cao của từ
điều khiển, là 1?
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-17

Giá trị đầu vào (S [3


Đầu ra trận0])
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
PCWrite 1 0 0 0 0 0 0 0 0 1
PCWriteCond 0 0 0 0 0 0 0 0 1 0
IorD 0 0 0 1 0 1 0 0 0 0
Ghi nhớ 1 0 0 1 0 0 0 0 0 0
Ghi nhớ 0 0 0 0 0 1 0 0 0 0
IRWrite 1 0 0 0 0 0 0 0 0 0
MemtoReg 0 0 0 0 1 0 0 0 0 0
PCSource1 0 0 0 0 0 0 0 0 0 1
PCSource0 0 0 0 0 0 0 0 0 1 0
ALUOp1 0 0 0 0 0 0 1 0 0 0
ALUOp0 0 0 0 0 0 0 0 0 1 0
ALUSrcB1 0 1 1 0 0 0 0 0 0 0
ALUSrcB0 1 1 0 0 0 0 0 0 0 0
ALUSrcA 0 0 1 0 0 0 1 0 1 0
RegWrite 0 0 0 0 1 0 0 1 0 0

HÌNH C.3.6 Bảng chân lý cho 16 đầu ra điều khiển datapath, chỉ phụ thuộc vào đầu vào
trạng thái. Các giá trị được xác định từ Hình C.3.4Mặc dù có 16 giá trị có thể cho. trường trạng thái 4 bit,
chỉ có 10 trong số này được sử dụng và được hiển thị ở đây. 10 giá trị có thể được hiển thị ở trên cùng; mỗi
cột hiển thị cài đặt của các đầu ra điều khiển datapath cho giá trị đầu vào trạng thái xuất hiện ở đầu cột. Ví
dụ: khi các đầu vào trạng thái là 0011 (trạng thái 3), các đầu ra điều khiển datapath hoạt động là IorD hoặc
MemRead.

PCWrite cao ở các trạng thái 0 và 9; điều này tương ứng với các địa chỉ với TRẢ LỜI
4 bit bậc thấp là 0000 hoặc 1001. Bit sẽ cao trong từ bộ nhớ độc lập với các
đầu vào Op [5, 0], vì vậy các địa chỉ có bit cao là 000000000, 0000001001,
0000010000, 0000011001 , . . . , 1111110000, 1111111001. Dạng chung của
điều này là XXXXXX0000 hoặc XXXXXX1001, trong đó XXXXXX là bất
kỳ sự kết hợp nào của các bit và tương ứng với opcode 6 bit mà đầu ra này
không phụ thuộc.
C-18 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Chúng tôi sẽ hiển thị toàn bộ nội dung của ROM thành hai phần để dễ hiển thị
hơn. Hình C.3.7 hiển thị 16 bit trên của từ điều khiển; điều này đến trực tiếp từ
Hình C.3.6Các đầu ra điều khiển datapath này chỉ phụ thuộc vào đầu vào trạng
thái và tập hợp các từ này sẽ được sao chép 64 lần trong ROM đầy đủ, như chúng
ta đã thảo luận ở trên. Các mục tương ứng với các giá trị đầu vào 1010 đến 1111
không được sử dụng, vì vậy chúng tôi không quan tâm chúng chứa gì.
Hình C.3.8 hiển thị bốn bit dưới của từ điều khiển tương ứng với đầu ra trạng thái
tiếp theo. Cột cuối cùng của bảng trong Hình C.3.8 tương ứng với tất cả các giá trị có
thể có của opcode không khớp với opcodes đã chỉ định. Ở trạng thái 0, trạng thái tiếp
theo luôn là trạng thái 1, vì hướng dẫn vẫn đang được tìm nạp. Sau trạng thái 1,
trường opcode phải hợp lệ. Bảng chỉ ra điều này bởi các mục được đánh dấu bất hợp
pháp; chúng tôi thảo luận về cách đối phó với các ngoại lệ này và làm gián đoạn các
opcodes trong Mục 4.9.
Đại diện này không chỉ là hai bảng riêng biệt một cách nhỏ gọn hơn để hiển thị
nội dung ROM; nó cũng là một cách hiệu quả hơn để thực hiện ROM. Phần lớn
các đầu ra (16 trên 20 bit) chỉ phụ thuộc vào bốn trong số 10 đầu vào. Tổng số bit
khi điều khiển được thực hiện dưới dạng hai ROM riêng biệt là 24 × 16 + 210 × 4 =
256 + 4096 = 4.3 Kbit, có kích thước khoảng một phần năm kích thước của một
ROM duy nhất, yêu cầu 210 × 20 = 20 Kbit. Có một số chi phí liên quan đến bất kỳ
khối logic có cấu trúc nào, nhưng trong trường hợp này, chi phí bổ sung của một
ROM bổ sung sẽ nhỏ hơn nhiều so với khoản tiết kiệm từ việc chia ROM đơn .

Hạ 4 bit của địa chỉ Bit 19 Từ4 của từ này


0000 1001010000001000
0001 000000000011000
0010 000000000010100
0011 0011000000000000
0100 0000001000000010
0101 001010000000000
0110 000000001000100
0111 000000000000011
1000 0100000010100100
1001 1000000100000000

HÌNH C.3.7 Nội dung của 16 bit trên của ROM chỉ phụ thuộc vào đầu vào trạng thái. Những
giá trị này giống như những giá trị trong Hình C.3.6, chỉ đơn giản là xoay 90 °. Tập hợp các từ điều khiển
này sẽ được sao chép 64 lần cho mọi giá trị có thể có của sáu bit trên của địa chỉ.
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-19

Mặc dù mã hóa ROM này của chức năng điều khiển rất đơn giản, nhưng nó rất
lãng phí, ngay cả khi được chia thành hai phần. Ví dụ: các giá trị của đầu vào
thanh ghi lệnh thường không cần thiết để xác định trạng thái tiếp theo. Do đó,
ROM trạng thái tiếp theo có nhiều mục được sao chép hoặc được chăm sóc don
don. Hãy xem xét trường hợp khi máy ở trạng thái 0: có 26 các mục trong ROM
(vì trường opcode có thể có bất kỳ giá trị nào) và tất cả các mục này sẽ có cùng
nội dung (cụ thể là từ điều khiển 0001). Lý do mà rất nhiều ROM bị lãng phí là vì
ROM thực hiện bảng sự thật hoàn chỉnh, tạo cơ hội để có một đầu ra khác nhau
cho mỗi kết hợp các đầu vào. Nhưng hầu hết các kết hợp của các đầu vào hoặc
không bao giờ xảy ra hoặc là dư thừa!

Op [5 trận0]
Hiện trạng 000000 000100 100011 101011 Bất kỳ khác
(Định dạng
S [3 trận0] R) (beq) (lw) (sw) giá trị
0000 0001 0001 0001 0001 0001
0001 0110 1000 0010 0010 Bất hợp pháp
0010 XXXX XXXX 0011 0101 Bất hợp pháp
0011 0100 0100 0100 0100 Bất hợp pháp
0100 0000 0000 0000 0000 Bất hợp pháp
0101 0000 0000 0000 0000 Bất hợp pháp
0110 0111 0111 0111 0111 Bất hợp pháp
0111 0000 0000 0000 0000 Bất hợp pháp
1000 0000 0000 0000 0000 Bất hợp pháp
1001 0000 0000 0000 0000 Bất hợp pháp

HÌNH C.3.8 Bảng này chứa 4 bit dưới của từ điều khiển (đầu ra NS), phụ thuộc vào cả đầu vào
trạng thái, S [3 Ném0] và opcode, Op [5 Nott0], tương ứng với opcode hướng dẫn. Những giá trị
này có thể được xác định từ Hình C.3.5Tên opcode là. hiển thị dưới mã hóa trong tiêu đề. Bốn bit của từ điều
khiển có địa chỉ được cung cấp bởi các bit trạng thái hiện tại và các bit Op được hiển thị trong mỗi mục nhập. Ví
dụ: khi các bit đầu vào trạng thái là 0000, đầu ra luôn là 0001, không phụ thuộc vào các đầu vào khác; khi trạng
thái là hai, trạng thái tiếp theo là don lồng chăm sóc cho ba trong số các đầu vào, ba cho lwvà năm cho sw Cùng
với các mục trong. Hình C.3.7, bảng này chỉ định nội dung của đơn vị điều khiển ROM. Ví dụ: từ tại địa chỉ
1000110001 có được bằng cách tìm 16 bit trên trong bảng Hình C.3.7 chỉ sử dụng các bit đầu vào trạng thái (0001)
và ghép bốn bit thấp hơn được tìm thấy bằng cách sử dụng toàn bộ địa chỉ (0001 để tìm hàng và 100011 để tìm
cột). Các mục từ Hình C.3.7 mang lại 000000000011000, trong khi mục thích hợp trong bảng ngay trên là 0010.
Do đó, từ kiểm soát tại địa chỉ 1000110001 là 0000000000110000010. Cột có nhãn là Bất kỳ giá trị nào khác, chỉ
áp dụng khi các bit Op không khớp với một trong các opcodes được chỉ định.
C-20 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Một triển khai PLA


Chúng tôi có thể giảm lượng lưu trữ điều khiển cần thiết với chi phí sử dụng giải mã
địa chỉ phức tạp hơn cho các đầu vào điều khiển, sẽ chỉ mã hóa các kết hợp đầu vào
cần thiết. Cấu trúc logic thường được sử dụng để làm điều này là a mảng logic được
lập trình (PLA), mà chúng tôi đã đề cập trước đó và minh họa trong Hình
C.2.5Trong PLA, mỗi đầu ra là logic HOẶC của một hoặc nhiều minterms. A
minterm, cũng được gọi là a thời hạn sản phẩm, chỉ đơn giản là logic VÀ của một
hoặc nhiều đầu vào. Các đầu vào có thể được coi là địa chỉ để lập chỉ mục PLA,
trong khi các minterms chọn kết hợp địa chỉ nào có thể thú vị. Một minterm tương
ứng với một mục duy nhất trong bảng sự thật, chẳng hạn như những mục trong Hình
C.3.4, bao gồm các điều khoản chăm sóc don don có thể. Mỗi đầu ra bao gồm một
OR của những thứ này minterms, chính xác tương ứng với một bảng sự thật hoàn
chỉnh. Tuy nhiên, không giống như ROM, chỉ những mục nhập bảng sự thật tạo ra
đầu ra hoạt động là cần thiết và chỉ cần một bản sao của mỗi minterm, ngay cả khi
minterm có chứa don don quan tâm. Hình C.3.9 cho thấy PLA thực hiện chức năng
điều khiển này.
Như chúng ta có thể thấy từ PLA trong Hình C.3.9, có 17 minterms duy nhất 10
chỉ phụ thuộc vào trạng thái hiện tại và bảy cái khác phụ thuộc vào sự kết hợp giữa
trường Op và các bit trạng thái hiện tại. Tổng kích thước của PLA tỷ lệ thuận với
(#inputs × #product terms) + (#outputs × #product terms), như chúng ta có thể thấy
một cách tượng trưng từ hình. Điều này có nghĩa là tổng kích thước của PLA
trongHình C.3.9 tỷ lệ thuận với (10 × 17) + (20 × 17) = 510. Để so sánh, kích thước
của một ROM đơn tỷ lệ với 20 Kb và thậm chí ROM hai phần có tổng cộng 4,3 Kb.
Do kích thước của một ô PLA sẽ chỉ lớn hơn một chút so với kích thước của một bit
trong ROM, PLA sẽ là một triển khai hiệu quả hơn nhiều cho đơn vị điều khiển này.
Tất nhiên, giống như khi chúng tôi chia ROM thành hai, chúng tôi có thể chia PLA
thành hai PLA: một với bốn đầu vào và 10 minterms tạo ra 16 đầu ra điều khiển và
một với 10 đầu vào và bảy minterms tạo ra bốn trạng thái tiếp theo đầu ra. PLA đầu
tiên sẽ có kích thước tỷ lệ thuận với (4 × 10) + (10 × 16) = 200 và PLA thứ hai sẽ có
kích thước tỷ lệ thuận với (10 × 7) + (4 × 7) = 98. Điều này sẽ mang lại tổng kích
thước tỷ lệ thuận với 298 tế bào PLA, khoảng 55% kích thước của một PLA duy nhất.
Hai PLA này sẽ nhỏ hơn đáng kể so với việc triển khai sử dụng hai ROM. Để biết
thêm chi tiết về PLA và việc triển khai chúng, cũng như các tài liệu tham khảo cho
sách về thiết kế logic, xem Phụ lục Một .
C.3 Thực hiện kiểm soát máy trạng thái hữu hạn C-21

Op5

Op4

Op3

Op2

Op1

Op0

S3

S2

S1

S0

PCWrite
PCWriteCond
IorD
Ghi nhớ
Ghi nhớ
IRWrite
MemtoReg
PCSource1
PCSource0
ALUOp1
ALUOp0
ALUSrcB1
ALUSrcB0
ALUSrcA
RegWrite
NS3
NS2
NS1
NS0

HÌNH C.3.9 PLA này thực hiện logic chức năng điều khiển để thực hiện đa xe đạp. Các đầu
vào cho điều khiển xuất hiện ở bên trái và các đầu ra ở bên phải. Nửa trên của hình là mặt phẳng AND tính
toán tất cả các minterms. Các minterms được mang đến mặt phẳng OR trên các đường thẳng đứng. Mỗi
dấu chấm màu tương ứng với một tín hiệu tạo nên minterm được mang trên dòng đó. Các thuật ngữ tổng
được tính từ các minterms này, với mỗi chấm màu xám biểu thị sự hiện diện của minterm giao nhau trong
thuật ngữ tổng đó. Mỗi đầu ra bao gồm một thuật ngữ tổng duy nhất.
C-22 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Thực hiện chức năng Nhà nước tiếp


theo
C.4
với một Sequencer
Hãy để nhìn kỹ vào bộ điều khiển mà chúng tôi đã xây dựng trong phần cuối
cùng. Nếu bạn kiểm tra các ROM thực hiện kiểm soát Hình C.3.7 và C.3.8, bạn
có thể thấy rằng phần lớn logic được sử dụng để chỉ định hàm trạng thái tiếp theo.
Trên thực tế, đối với việc triển khai sử dụng hai ROM riêng biệt, 4096 trong số
4368 bit (94%) tương ứng với hàm trạng thái tiếp theo! Hơn nữa, hãy tưởng
tượng logic điều khiển sẽ trông như thế nào nếu tập lệnh có nhiều loại hướng dẫn
khác nhau, một số trong đó yêu cầu nhiều đồng hồ để thực hiện. Sẽ có nhiều
trạng thái hơn trong bộ máy trạng thái hữu hạn. Ở một số tiểu bang, chúng tôi có
thể phân nhánh đến một số lượng lớn các trạng thái khác nhau tùy thuộc vào loại
hướng dẫn (như chúng tôi đã làm ở trạng thái 1 của máy trạng thái hữu hạn Hình
C.3.1). Tuy nhiên, nhiều tiểu bang sẽ tiến hành theo kiểu tuần tự, giống như các
tiểu bang 3 và 4 làm Hình C.3.1.
Ví dụ: nếu chúng ta bao gồm điểm nổi, chúng ta sẽ thấy một chuỗi nhiều trạng
thái liên tiếp thực hiện lệnh dấu phẩy động nhiều bánh. Ngoài ra, hãy xem xét cách
điều khiển có thể tìm kiếm một máy có thể có nhiều toán hạng bộ nhớ cho mỗi lệnh.
Nó sẽ yêu cầu nhiều trạng thái hơn để tìm nạp nhiều toán hạng bộ nhớ. Kết quả của
điều này sẽ là logic điều khiển sẽ bị chi phối bởi mã hóa của hàm trạng thái tiếp theo.
Hơn nữa, phần lớn logic sẽ được dành cho các chuỗi trạng thái chỉ có một đường dẫn
qua chúng trông giống như các trạng thái từ 2 đến 4 in Hình C.3.1Với nhiều hướng
dẫn hơn, các chuỗi này sẽ bao gồm nhiều trạng thái được đánh số tuần tự hơn so với
tập hợp con đơn giản của chúng tôi.
Để mã hóa các chức năng điều khiển phức tạp hơn này một cách hiệu quả,
chúng ta có thể sử dụng một đơn vị điều khiển có bộ đếm để cung cấp trạng thái
tiếp theo tuần tự. Bộ đếm này thường loại bỏ sự cần thiết phải mã hóa rõ ràng
chức năng trạng thái tiếp theo trong đơn vị điều khiển. Như thể hiện trong Hình
C.4.1, một adder được sử dụng để tăng trạng thái, về cơ bản biến nó thành một bộ
đếm. Trạng thái tăng luôn là trạng thái theo thứ tự số. Tuy nhiên, cỗ máy trạng
thái hữu hạn đôi khi là cành cây.Ví dụ, ở trạng thái 1 của máy trạng thái hữu hạn
(xem Hình C.3.1), có bốn trạng thái tiếp theo có thể, chỉ một trong số đó là trạng
thái tiếp theo tuần tự. Do đó, chúng ta cần có khả năng lựa chọn giữa trạng thái
tăng và trạng thái mới dựa trên các đầu vào từ thanh ghi Hướng dẫn và trạng thái
hiện tại. Mỗi từ điều khiển sẽ bao gồm các dòng điều khiển sẽ xác định cách chọn
trạng thái tiếp theo.
Thật dễ dàng để thực hiện phần tín hiệu đầu ra điều khiển của từ điều khiển, vì,
nếu chúng ta sử dụng cùng một số trạng thái, phần này của từ điều khiển sẽ trông
giống hệt như nội dung ROM được hiển thị trong Hình C.3.7Tuy nhiên, phương
pháp chọn trạng thái tiếp theo khác với chức năng trạng thái tiếp theo trong máy
trạng thái hữu hạn.
C.4 Thực hiện chức năng trạng thái tiếp theo với Trình sắp xếp C-23

Đơn vị điều
khiển PCWrite
PCWriteCond
IorD
Ghi nhớ
PLA hoặc ROM
Ghi nhớ
IRWrite

Đầu ra MemtoReg
Nguồn PC
ALUOp
ALUSrcB
ALUSrcA
RegWrite
O
p


n
0
r
[

]
Đầu vào AddrCtl

Tiểu bang

Adder

Địa chỉ chọn logic

Đăng ký hướng dẫn


trường opcode

HÌNH C.4.1 Đơn vị điều khiển sử dụng bộ đếm rõ ràng để tính trạng thái tiếp theo. Trong
này đơn vị điều khiển, trạng thái tiếp theo được tính bằng bộ đếm (ít nhất là ở một số trạng thái). Bằng
cách so sánh , Hình C.3.2 mã hóa trạng thái tiếp theo trong logic điều khiển cho mọi trạng thái. Trong đơn
vị điều khiển này, các tín hiệu được dán nhãn AddrCtl kiểm soát cách xác định trạng thái tiếp theo.

Với một bộ đếm rõ ràng cung cấp trạng thái tiếp theo tuần tự, logic đơn vị điều
khiển chỉ cần chỉ định cách chọn trạng thái khi nó không phải là trạng thái theo tuần
tự. Có hai phương pháp để làm điều này. Đầu tiên là một phương pháp chúng ta đã
thấy: cụ thể là, đơn vị điều khiển mã hóa rõ ràng chức năng trạng thái tiếp theo. Sự
khác biệt là đơn vị điều khiển chỉ cần đặt các dòng trạng thái tiếp theo khi trạng thái
tiếp theo được chỉ định không phải là trạng thái mà bộ đếm chỉ ra. Nếu số lượng
C-24 Phụ lục C Kiểm soát ánh xạ tới phần cứng

các trạng thái lớn và chức năng trạng thái tiếp theo mà chúng ta cần mã hóa hầu
hết là trống, đây có thể không phải là một lựa chọn tốt, vì đơn vị điều khiển kết
quả sẽ có nhiều không gian trống hoặc dự phòng. Một cách tiếp cận khác là sử
dụng logic bên ngoài riêng biệt để chỉ định trạng thái tiếp theo khi bộ đếm không
chỉ định trạng thái. Nhiều đơn vị điều khiển, đặc biệt là những đơn vị thực hiện
các bộ hướng dẫn lớn, sử dụng phương pháp này và chúng tôi sẽ tập trung vào
việc chỉ định điều khiển bên ngoài.
Mặc dù trạng thái tiếp theo không quan trọng sẽ đến từ một bảng bên ngoài,
đơn vị điều khiển cần chỉ định khi nào điều này sẽ xảy ra và làm thế nào để tìm
trạng thái tiếp theo. Có hai loại phân nhánh của người Viking mà chúng ta phải
thực hiện trong logic chọn địa chỉ. Đầu tiên, chúng ta phải có khả năng nhảy đến
một trong một số trạng thái dựa trên phần opcode của thanh ghi Hướng dẫn. Hoạt
động này, được gọi là a công văn, thường được thực hiện bằng cách sử dụng một
bộ ROM hoặc PLA đặc biệt được bao gồm như một phần của logic lựa chọn địa
chỉ. Một bộ đầu ra điều khiển bổ sung, mà chúng ta gọi là AddrCtl, cho biết khi
nào nên thực hiện gửi. Nhìn vào sơ đồ trạng thái hữu hạn (Hình C.3.1), chúng tôi
thấy rằng có hai trạng thái trong đó chúng tôi thực hiện một nhánh dựa trên một
phần của opcode. Vì vậy, chúng tôi sẽ cần hai bảng điều phối nhỏ. (Ngoài ra,
chúng ta cũng có thể sử dụng một bảng điều khiển duy nhất và sử dụng các bit
điều khiển chọn bảng làm bit địa chỉ chọn phần nào của bảng điều phối để chọn
địa chỉ.)
Loại phân nhánh thứ hai mà chúng ta phải thực hiện bao gồm phân nhánh trở
về trạng thái 0, bắt đầu thực hiện lệnh RISC-V tiếp theo. Do đó, có bốn cách có
thể để chọn trạng thái tiếp theo (ba loại nhánh, cộng với tăng số trạng thái hiện
tại), có thể được mã hóa thành 2 bit. Hãy để giả định rằng mã hóa như sau :

Giá trị AddrCtl Hoạt động


0 Đặt trạng thái thành 0
1 Công văn với ROM 1
2 Công văn với ROM 2
3 Sử dụng trạng thái tăng dần

Nếu chúng ta sử dụng mã hóa này, logic chọn địa chỉ cho đơn vị điều khiển này
có thể được thực hiện như được hiển thị trong Hình C.4.2.
Để hoàn thành đơn vị điều khiển, chúng tôi chỉ cần chỉ định nội dung của ROM
gửi và các giá trị của các dòng điều khiển địa chỉ cho từng trạng thái. Chúng tôi đã
chỉ định phần điều khiển datapath của từ điều khiển bằng nội dung ROM của Hình
C.3.7 (hoặc các phần tương ứng của PLA trong Hình C.3.9). Bộ đếm và điều phối
ROM trạng thái tiếp theo thay thế một phần của đơn vị điều khiển đang tính toán
trạng thái tiếp theo, được hiển thị trong Hình C.3.8 Chúng tôi chỉ thực hiện một phần
của tập lệnh, vì vậy ROM gửi sẽ trống phần lớn. Hình C.4.3 hiển thị các mục phải
được gán cho tập hợp con này.
C.4 Thực hiện chức năng trạng thái tiếp theo với Trình sắp xếp C-25

PLA hoặc ROM

Tiểu bang

Adder

Mux AddrCtl
3 2 1 0

Công văn ROM 2 Công văn ROM 1

Địa chỉ chọn logic


Op

Đăng ký hướng dẫn


trường opcode

HÌNH C.4.2 Đây là logic chọn địa chỉ cho đơn vị điều khiển Hình C.4.1.

Công văn ROM 1 Công văn ROM 2


Op Tên mã Giá trị Op Tên mã Giá trị
000000 Định dạng R 0110 100011 lw 0011
000100 beq 1000 101011 sw 0101
100011 lw 0010
101011 sw 0010

HÌNH C.4.3 Các ROM gửi mỗi có 26 = 64 mục rộng 4 bit, vì đó là số bit trong mã hóa trạng
thái. Hình này chỉ hiển thị các mục trong ROM đó được quan tâm cho tập hợp con này. Cột đầu tiên trong
mỗi bảng cho biết giá trị của Op, là địa chỉ được sử dụng để truy cập ROM gửi. Cột thứ hai hiển thị tên
tượng trưng của opcode. Cột thứ ba cho biết giá trị tại địa chỉ đó trong ROM .
C-26 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Số nhà nước Hành động kiểm soát Giá trị của AddrCtl
địa chỉ
0 Sử dụng trạng thái tăng dần 3
1 Sử dụng công văn ROM 1 1
2 Sử dụng công văn ROM 2 2
3 Sử dụng trạng thái tăng dần 3
4 Thay thế số trạng thái bằng 0 0
5 Thay thế số trạng thái bằng 0 0
6 Sử dụng trạng thái tăng dần 3
7 Thay thế số trạng thái bằng 0 0
số 8 Thay thế số trạng thái bằng 0 0
9 Thay thế số trạng thái bằng 0 0

HÌNH C.4.4 Các giá trị của các dòng điều khiển địa chỉ được đặt trong từ điều khiển
tương ứng với từng trạng thái.

Bây giờ chúng ta có thể xác định cài đặt của các dòng lựa chọn địa chỉ
(AddrCtl) trong mỗi từ điều khiển. Cái bàn trong Hình C.4.4 cho thấy cách kiểm
soát địa chỉ phải được đặt cho mọi tiểu bang. Thông tin này sẽ được sử dụng để
chỉ định cài đặt của trường AddrCtl trong từ điều khiển được liên kết với trạng
thái đó.
Nội dung của toàn bộ ROM điều khiển được hiển thị trong Hình C.4.5Tổng
lưu trữ cần thiết cho điều khiển là khá nhỏ. Có 10 từ điều khiển, mỗi từ rộng 18
bit, với tổng số 180 bit. Ngoài ra, hai bảng điều phối rộng 4 bit và mỗi bảng có 64
mục, với tổng số 512 bit bổ sung. Tổng số 692 bit này đánh bại việc triển khai sử
dụng hai ROM với hàm trạng thái tiếp theo được mã hóa trong ROM (yêu cầu 4.3
Kbit).
Tất nhiên, các bảng điều phối rất thưa thớt và có thể được thực hiện hiệu quả hơn với
hai PLA nhỏ. ROM điều khiển cũng có thể được thay thế bằng PLA .

Số nhà nước Kiểm soát bit từ 17 trận2 Kiểm soát bit từ 1 trận0
0 1001010000001000 11
1 000000000011000 01
2 000000000010100 10
3 0011000000000000 11
4 0000001000000010 00
5 001010000000000 00
6 000000001000100 11
7 000000000000011 00
số 8 0100000010100100 00
9 1000000100000000 00

HÌNH C.4.5 Nội dung của bộ nhớ điều khiển để thực hiện bằng bộ đếm rõ ràng. Cột đầu tiên hiển
thị trạng thái, trong khi cột thứ hai hiển thị các bit điều khiển datapath và cuối cùng cột hiển thị các bit kiểm soát
địa chỉ trong mỗi từ kiểm soát. Các bit 17 Vang2 giống hệt với các bit trong Hình C.3.7.
C.4 Thực hiện chức năng trạng thái tiếp theo với Trình sắp xếp C-27

Tối ưu hóa việc thực hiện kiểm soát


Chúng ta có thể giảm thêm lượng logic trong đơn vị điều khiển bằng hai kỹ thuật
khác nhau. Đầu tiên là giảm thiểu logic, sử dụng cấu trúc của các phương trình
logic, bao gồm các thuật ngữ chăm sóc don don, để giảm lượng phần cứng cần
thiết. Thành công của quá trình này phụ thuộc vào số lượng mục tồn tại trong
bảng sự thật và cách các mục đó có liên quan. Ví dụ, trong tập hợp con này, chỉ
có lw và sw opcodes có giá trị hoạt động cho tín hiệu Op5, vì vậy chúng tôi có thể
thay thế hai mục nhập bảng sự thật kiểm tra xem đầu vào có lw hoặc là sw bằng
một thử nghiệm duy nhất trên bit này; tương tự, chúng ta có thể loại bỏ một số bit
được sử dụng để lập chỉ mục ROM công văn vì bit đơn này có thể được sử dụng
để tìm lw và sw trong ROM công văn đầu tiên. Tất nhiên, nếu không gian opcode
ít thưa thớt hơn, cơ hội tối ưu hóa này sẽ khó xác định vị trí hơn. Tuy nhiên,
trong việc chọn opcodes, kiến trúc sư có thể cung cấp các cơ hội bổ sung bằng
cách chọn các opcodes liên quan cho các hướng dẫn có khả năng chia sẻ trạng
thái trong điều khiển.
Một loại tối ưu hóa khác nhau có thể được thực hiện bằng cách gán các số trạng
thái trong một triển khai trạng thái hữu hạn hoặc mã vi mô để giảm thiểu logic. Tối
ưu hóa này, được gọi chuyển nhượng nhà nước, cố gắng chọn các số trạng thái sao
cho các phương trình logic kết quả chứa nhiều dự phòng hơn và do đó có thể được
đơn giản hóa. Trước tiên, hãy xem xét trường hợp của một máy trạng thái hữu hạn
với điều khiển trạng thái tiếp theo được mã hóa, vì nó cho phép các trạng thái được
gán tùy ý. Ví dụ: lưu ý rằng trong máy trạng thái hữu hạn, tín hiệu RegWrite chỉ hoạt
động ở trạng thái 4 và 7. Nếu chúng tôi mã hóa các trạng thái đó là 8 và 9, thay vì 4
và 7, chúng tôi có thể viết lại phương trình cho RegWrite chỉ đơn giản là một thử
nghiệm trên bit S3 (chỉ dành cho các trạng thái 8 và 9). Việc đánh số lại này cho phép
chúng tôi kết hợp hai mục bảng chân lý trong phần (o) của Hình C.3.4 và thay thế
chúng bằng một mục duy nhất, loại bỏ một thuật ngữ trong đơn vị kiểm soát. Tất
nhiên, chúng ta sẽ phải đánh số lại các trạng thái 8 và 9 hiện có, có lẽ là 4 và 7.
Tối ưu hóa tương tự có thể được áp dụng trong một triển khai sử dụng bộ đếm
chương trình rõ ràng, mặc dù chúng tôi bị hạn chế hơn. Vì số trạng thái tiếp theo
thường được tính bằng cách tăng số trạng thái hiện tại, chúng tôi không thể tự ý gán
các trạng thái. Tuy nhiên, nếu chúng ta giữ các trạng thái nơi trạng thái tăng được sử
dụng làm trạng thái tiếp theo theo cùng một thứ tự, chúng ta có thể chỉ định lại các
trạng thái liên tiếp dưới dạng một khối. Trong một triển khai với bộ đếm trạng thái
tiếp theo rõ ràng, việc gán trạng thái có thể cho phép chúng tôi đơn giản hóa nội dung
của ROM gửi.
Nếu chúng ta nhìn lại đơn vị điều khiển trong Hình C.4.1, nó trông giống như một
máy tính theo đúng nghĩa của nó. ROM hoặc PLA có thể được coi là hướng dẫn cung
cấp bộ nhớ cho datapath. Trạng thái có thể được coi là một địa chỉ hướng dẫn. Do đó
nguồn gốc của tên mã vi mô hoặc là điều khiển vi mô. Các từ kiểm soát được nghĩ là
vi mô kiểm soát datapath và đăng ký Nhà nước được gọi là quầy vi mô. Hình C.4.6
cho thấy một cái nhìn của đơn vị điều khiển như mã vi môPhần tiếp theo mô tả cách
chúng tôi ánh xạ từ chương trình vi mô sang mã vi mô.
C-28 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Đơn vị điều
khiển PCWrite
PCWriteCond
IorD Datapath
Bộ nhớ mã Ghi nhớ
Ghi nhớ
IRWrite
BWrite
Đầu ra MemtoReg
Nguồn PC
ALUOp
ALUSrcB
ALUSrcA
RegWrite
O
p


n
0
r
[

]
AddrCtl
Đầu vào
1

Bộ đếm vi mô

Adder

Địa chỉ chọn logic

Đăng ký hướng dẫn


trường opcode

HÌNH C.4.6 Đơn vị điều khiển dưới dạng mã vi mô. Việc sử dụng từ micro micro phục vụ để phân biệt giữa bộ đếm chương trình
datapath và bộ đếm microprogram và giữa bộ nhớ vi mã và bộ nhớ lệnh.

C.5 Dịch một Microprogram sang Phần cứng

Để dịch một chương trình vi mô thành phần cứng thực tế, chúng ta cần chỉ định cách
mỗi trường chuyển thành tín hiệu điều khiển. Chúng tôi có thể triển khai chương
trình vi mô với điều khiển trạng thái hữu hạn hoặc triển khai mã vi mô với trình sắp
xếp thứ tự rõ ràng. Nếu chúng ta chọn một máy trạng thái hữu hạn, chúng ta cần xây
dựng hàm trạng thái tiếp theo từ đó
C.5 Dịch một chương trình vi mô sang phần cứng C-29

chương trình vi mô. Khi chức năng này được biết đến, chúng ta có thể ánh xạ một
tập hợp các mục nhập bảng sự thật cho các đầu ra trạng thái tiếp theo. Trong
phần này, chúng tôi sẽ chỉ ra cách dịch chương trình vi mô, giả sử rằng trạng thái
tiếp theo được chỉ định bởi trình sắp xếp thứ tự. Từ các bảng sự thật chúng tôi sẽ
xây dựng, sẽ rất đơn giản để xây dựng chức năng trạng thái tiếp theo cho một
máy trạng thái hữu hạn.

Tên Giá Tín hiệu hoạt động Bình luận


trường trị
Thêm vào ALUOp = 00 Nguyên nhân ALU để thêm.
Kiểm soát ALU Subt ALUOp = 01 Làm cho ALU trừ đi; điều này thực hiện việc so sánh cho các chi nhánh.
Mã Func ALUOp = 10 Sử dụng mã chức năng hướng dẫn để xác định kiểm soát ALU.
PC ALUSrcA = 0 Sử dụng PC làm đầu vào ALU đầu tiên.
SRC1
A ALUSrcA = 1 Đăng ký A là đầu vào ALU đầu tiên.
B ALUSrcB = 00 Đăng ký B là đầu vào ALU thứ hai.
4 ALUSrcB = 01 Sử dụng 4 làm đầu vào ALU thứ hai.
SRC2
Mở rộng ALUSrcB = 10 Sử dụng đầu ra của đơn vị mở rộng dấu hiệu làm đầu vào ALU thứ hai.
Mở rộng ALUSrcB = 11 Sử dụng đầu ra của đơn vị shift-by-hai làm đầu vào ALU thứ hai.
Đọc hai thanh ghi bằng cách sử dụng các trường rs và rt của IR làm số thanh
Đọc ghi
và đưa dữ liệu vào các thanh ghi A và B .
Viết ALU RegWrite , Viết một thanh ghi bằng cách sử dụng trường rd của IR làm số thanh ghi và
Đăng ký MemtoReg = 0 nội dung của ALUOut là dữ liệu.
điều khiển
Viết MDR RegWrite , Viết một thanh ghi bằng cách sử dụng trường rt của IR làm số thanh ghi và
MemtoReg = 1 nội dung của MDR là dữ liệu.

Đọc PC Ghi nhớ , Đọc bộ nhớ bằng PC làm địa chỉ; ghi kết quả vào IR (và MDR).
IorD = 0, IRWrite
Đọc ALU Ghi nhớ , Đọc bộ nhớ bằng ALUOut làm địa chỉ; ghi kết quả vào MDR .
Ký ức
IorD = 1
Viết ALU Ghi nhớ , Viết bộ nhớ bằng ALUOut làm địa chỉ, nội dung của B làm dữ liệu.
IorD = 1
ALU Nguồn PC = 00 , Viết đầu ra của ALU vào PC .
PCWrite
PC điều khiển ALUOut-cond Nguồn PC = 01 , Nếu đầu ra Zero của ALU đang hoạt động, hãy viết PC với nội dung của
ghi
PCWriteCond đăng ký ALUOut.
Nhảy địa chỉ Nguồn PC = 10 , Viết PC với địa chỉ nhảy từ hướng dẫn.
PCWrite
Seq AddrCtl = 11 Chọn vi mô tiếp theo tuần tự.
Lấy AddrCtl = 00 Đi đến vi mô đầu tiên để bắt đầu một hướng dẫn mới.
Trình tự
Công văn 1 AddrCtl = 01 Công văn sử dụng ROM 1.
Công văn 2 AddrCtl = 10 Công văn sử dụng ROM 2.

HÌNH C.5.1 Mỗi trường mã vi mô chuyển thành một tập hợp tín hiệu điều khiển được đặt. 22 giá trị khác nhau của các trường chỉ
định tất cả các kết hợp cần thiết của 18 dòng điều khiển. Các dòng điều khiển không được đặt, tương ứng với các hành động, là 0 theo mặc định. Các
dòng điều khiển ghép kênh được đặt thành 0 nếu đầu ra quan trọng. Nếu một dòng điều khiển ghép kênh không được đặt rõ ràng, đầu ra của nó là
một chăm sóc don don và không được sử dụng.
C-30 Phụ lục C Kiểm soát ánh xạ tới phần cứng

Giả sử một trình sắp xếp rõ ràng, chúng ta cần thực hiện hai nhiệm vụ bổ sung
để dịch chương trình vi mô: gán địa chỉ cho các cấu trúc vi mô và điền vào nội
dung của ROM gửi. Quá trình này về cơ bản giống như quá trình dịch chương
trình ngôn ngữ lắp ráp thành hướng dẫn máy: các trường của ngôn ngữ lắp ráp
hoặc hướng dẫn vi mô được dịch và nhãn trên hướng dẫn phải được giải quyết
thành địa chỉ.
Hình C.5.1 cho thấy các giá trị khác nhau cho từng lĩnh vực vi mô mà kiểm
soát datapath và cách các trường này được mã hóa dưới dạng tín hiệu điều khiển.
Nếu trường tương ứng với tín hiệu ảnh hưởng đến một đơn vị có trạng thái (tức
là., Bộ nhớ, Thanh ghi bộ nhớ, đích ALU hoặc PCWriteControl) trống, sau đó
không có tín hiệu điều khiển nào được kích hoạt. Nếu một trường tương ứng với
tín hiệu điều khiển ghép kênh hoặc điều khiển hoạt động ALU (tức là., ALUOp,
SRC1 hoặc SRC2) trống, đầu ra không được sử dụng, do đó các tín hiệu liên
quan có thể được đặt là chăm sóc don don.
Trường giải trình tự có thể có bốn giá trị: Lấy (có nghĩa là chuyển đến trạng
thái Lấy), Công văn 1, Công văn 2 và Seq. Bốn giá trị này được mã hóa để đặt
điều khiển địa chỉ 2 bit giống như chúng đã ở Hình C.4.4: Lấy = 0, Công văn 1 =
1, Công văn 2 = 2, Seq = 3. Cuối cùng, chúng ta cần chỉ định nội dung của các
bảng gửi để liên kết các mục gửi của trường trình tự với các nhãn tượng trưng
trong chương trình vi mô. Chúng tôi sử dụng các bảng điều phối giống như
chúng tôi đã làm trước đó Hình C.4.3.
Một trình biên dịch mã hóa sẽ sử dụng mã hóa của trường giải trình tự, nội
dung của các bảng gửi biểu tượng trong Hình C.5.2, các đặc điểm kỹ thuật trong
Hình C.5.1và chương trình vi mô thực tế để tạo ra các vi mô.
Vì chương trình vi mô là một biểu diễn trừu tượng của điều khiển, nên có rất
nhiều sự linh hoạt trong cách dịch chương trình vi mô. Ví dụ: địa chỉ được gán
cho nhiều vi mô có thể được chọn tùy ý; các hạn chế duy nhất là những hạn chế
được áp đặt bởi thực tế là các vi mô nhất định phải

gửi bảng 1 Bảng gửi mã vi mô 2


Trường mã Trường mã nguồn Tên mã Giá trị
nguồn Tên mã Giá trị
100011 lw LW2
Định 101011 sw SW2
000000 Định dạng R dạng1
000100 beq BEQ1
100011 lw Mem1
101011 sw Mem1
HÌNH C.5.2 Hai ROM gửi mã vi mô hiển thị nội dung ở dạng tượng trưng và sử dụng nhãn
trong chương trình vi mô.
C.5 Dịch một chương trình vi mô sang phần cứng C-31

xảy ra theo thứ tự tuần tự (để tăng đăng ký Trạng thái tạo địa chỉ của hướng dẫn
tiếp theo). Do đó, trình biên dịch mã vi mô có thể làm giảm độ phức tạp của điều
khiển bằng cách gán các vi cấu trúc một cách khéo léo.

Tổ chức kiểm soát để giảm logic


Đối với một máy có điều khiển phức tạp, có thể có rất nhiều logic trong bộ điều
khiển. ROM hoặc PLA điều khiển có thể rất tốn kém. Mặc dù việc triển khai đơn
giản của chúng tôi chỉ có một vi cấu trúc 18 bit (giả sử một trình sắp xếp rõ ràng),
đã có những máy có cấu trúc vi mô rộng hàng trăm bit. Rõ ràng, một nhà thiết kế
muốn giảm số lượng vi mô và chiều rộng.
Cách tiếp cận lý tưởng để giảm cửa hàng điều khiển là trước tiên viết chương trình
vi mô hoàn chỉnh theo ký hiệu tượng trưng và sau đó đo cách các dòng điều khiển
được đặt trong mỗi vi mô. Bằng cách thực hiện các phép đo, chúng ta có thể nhận ra
các bit điều khiển có thể được mã hóa thành một trường nhỏ hơn. Ví dụ: nếu không có
nhiều hơn một trong tám dòng được đặt đồng thời trong cùng một vi mô, thì tập hợp
con các dòng điều khiển này có thể được mã hóa thành trường 3 bit (log2 8 = 3). Thay
đổi này tiết kiệm năm bit trong mỗi vi mô và không làm tổn thương CPI, mặc dù điều
đó có nghĩa là chi phí phần cứng thêm của bộ giải mã 3 đến 8 cần thiết để tạo ra tám
dòng điều khiển khi chúng được yêu cầu tại datapath. Nó cũng có thể có một số tác
động chu kỳ đồng hồ nhỏ, vì bộ giải mã nằm trong đường dẫn tín hiệu. Tuy nhiên, cạo
năm bit khỏi chiều rộng cửa hàng điều khiển thường sẽ vượt qua chi phí của bộ giải
mã và tác động thời gian chu kỳ có thể sẽ nhỏ hoặc không tồn tại. Ví dụ: kỹ thuật này
có thể được áp dụng cho các bit 13 Lỗi6 của các vi cấu trúc trong máy này, vì chỉ một
trong bảy bit của từ điều khiển được kích hoạt (xem Hình C.4.5).
Kỹ thuật giảm chiều rộng trường này được gọimã hóaĐể tiết kiệm không gian
hơn nữa, các dòng điều khiển có thể được mã hóa với nhau nếu chúng chỉ thỉnh
thoảng được đặt trong cùng một vi mô; hai vi mô thay vì một sau đó được yêu
cầu khi cả hai phải được đặt. Miễn là điều này không xảy ra trong các thói quen
quan trọng, việc xây dựng vi mô hẹp hơn có thể biện minh cho một vài từ bổ
sung của cửa hàng điều khiển.
Các vi mô có thể được làm hẹp hơn nếu chúng được chia thành các định dạng
khác nhau và được cung cấp một opcode hoặc trường định dạng để phân biệt
chúng. Trường định dạng cung cấp cho tất cả các dòng điều khiển không xác
định các giá trị mặc định của chúng, để không thay đổi bất kỳ thứ gì khác trong
máy và tương tự như opcode của một lệnh trong tập lệnh mạnh hơn. Ví dụ: chúng
ta có thể sử dụng một định dạng khác cho các vi cấu trúc đã truy cập bộ nhớ từ
các hoạt động ALU đăng ký, lợi dụng thực tế là các dòng điều khiển truy cập bộ
nhớ không cần thiết trong các hoạt động kiểm soát ALU.
Giảm chi phí phần cứng bằng cách sử dụng các trường định dạng thường có
chi phí hiệu suất bổ sung ngoài yêu cầu cho nhiều bộ giải mã hơn. Một chương
trình vi mô sử dụng định dạng vi mô duy nhất có thể chỉ định bất kỳ sự kết hợp
hoạt động nào trong một biểu đồ và có thể mất ít chu kỳ đồng hồ hơn một chương
trình vi mô được tạo thành từ các vi cấu trúc bị hạn chế không thể thực hiện bất
kỳ sự kết hợp hoạt động nào
C-32 Phụ lục C Kiểm soát ánh xạ tới phần cứng

một vi mô duy nhất. Tuy nhiên, nếu toàn bộ khả năng của từ vi mô rộng hơn
không được sử dụng nhiều, thì phần lớn cửa hàng điều khiển sẽ bị lãng phí và
máy có thể được làm nhỏ hơn và nhanh hơn bằng cách hạn chế khả năng vi mô.
Cách tiếp cận hẹp, nhưng thường dài hơn, thường được gọi vi mã dọc, trong
khi cách tiếp cận rộng nhưng ngắn được gọi vi mã ngang. Cần lưu ý rằng các
thuật ngữ microcode dọc và microcode ngang không có định nghĩa phổ quát, các
nhà thiết kế của 8086 coi microinocate 21 bit của nó ngang hơn so với các máy
tính đơn chip khác thời bấy giờ. Các điều khoản liên quan mã hóa tối đa và mã
hóa tối thiểu có lẽ tốt hơn so với dọc và ngang.

C.6 Kết luận

Chúng tôi đã bắt đầu phụ lục này bằng cách xem cách dịch sơ đồ trạng thái hữu
hạn sang triển khai bằng máy trạng thái hữu hạn. Sau đó, chúng tôi đã xem xét
các trình sắp xếp rõ ràng sử dụng một kỹ thuật khác để hiện thực hóa chức năng
trạng thái tiếp theo. Mặc dù các chương trình vi mô lớn thường được nhắm mục
tiêu triển khai bằng cách sử dụng phương pháp tiếp theo rõ ràng này, chúng tôi
cũng có thể triển khai chương trình vi mô với máy trạng thái hữu hạn. Như chúng
ta đã thấy, cả việc triển khai ROM và PLA của các hàm logic đều có thể. Những
lợi thế của việc rõ ràng so với được mã hóa ở trạng thái tiếp theo và thực hiện
ROM so với PLA được tóm tắt dưới đây.

Các
Không phụ thuộc vào việc điều khiển được thể hiện dưới dạng sơ đồ
LỚN trạng thái hữu hạn hay dưới dạng chương trình vi mô, dịch sang thực
hiện kiểm soát phần cứng là tương tự nhau. Mỗi trạng thái hoặc vi mô
Hình ảnh khẳng định một tập hợp các đầu ra điều khiển và chỉ định cách chọn
trạng thái tiếp theo.
Hàm trạng thái tiếp theo có thể được thực hiện bằng cách mã hóa nó
trong máy trạng thái hữu hạn hoặc sử dụng trình sắp xếp thứ tự rõ ràng.
Trình sắp xếp rõ ràng sẽ hiệu quả hơn nếu số lượng trạng thái lớn và có
nhiều chuỗi trạng thái liên tiếp mà không phân nhánh.
Logic điều khiển có thể được thực hiện với ROM hoặc PLA (hoặc
thậm chí là hỗn hợp). PLA hiệu quả hơn trừ khi chức năng điều khiển rất
dày đặc. ROM có thể phù hợp nếu điều khiển được lưu trữ trong một bộ
nhớ riêng biệt, trái ngược với trong cùng một chip với datapath.
C.7 Bài tập C-33

C.7 Bài tập

C.1 [10] <§C.2> Thay vì sử dụng bốn bit trạng thái để thực hiện trạng thái hữu
hạn máy trong Hình C.3.1, sử dụng chín bit trạng thái, mỗi bit chỉ là 1 nếu máy
trạng thái hữu hạn ở trạng thái cụ thể đó (ví dụ:., S1 là 1 ở trạng thái 1, S2 là 1 ở
trạng thái 2, v.v.). Vẽ lại PLA (Hình C.3.9).
C.2 [5] <§C.3> Chúng tôi muốn thêm hướng dẫn jal (nhảy và liên kết). Làm
bất kỳ những thay đổi cần thiết đối với datapath hoặc tín hiệu điều khiển nếu cần.
Bạn có thể sao chép số liệu để làm cho nó nhanh hơn để hiển thị các bổ sung. Có
bao nhiêu điều khoản sản phẩm được yêu cầu trong PLA thực hiện kiểm soát đối
với datapath một chu kỳ cho jal?
C.3 [5] <§C.3> Bây giờ chúng tôi muốn thêm hướng dẫn addi (thêm ngay lập
tức). Thêm bất kỳ thay đổi cần thiết nào vào datapath và tín hiệu điều khiển. Có
bao nhiêu điều khoản sản phẩm được yêu cầu trong PLA thực hiện kiểm soát đối
với datapath một chu kỳ cho addiu?
C.4 [10] <§C.3> Xác định số lượng thuật ngữ sản phẩm trong PLA đó thực
hiện máy trạng thái hữu hạn cho addi Cách dễ nhất để làm điều này là xây dựng
các bổ sung cho các bảng sự thật cho. addi.
C.5 [20] <§C.4> Thực hiện máy trạng thái hữu hạn sử dụng bộ đếm rõ ràng để
xác định trạng thái tiếp theo. Điền vào các mục mới cho các bổ sung Hình C.4.5
Ngoài ra, thêm bất kỳ mục cần thiết cho ROM gửi. Hình C.5.2.
C.6 [15] <§ §C.3 C.6> Xác định kích thước của PLA cần thiết để thực hiện
máy đa bánh, giả sử rằng chức năng trạng thái tiếp theo được thực hiện với bộ
đếm. Thực hiện các bảng điều phối của Hình C.5.2 sử dụng hai PLA và nội dung
của đơn vị điều khiển chính trong Hình C.4.5 sử dụng một PLA khác. Làm thế
nào để tổng kích thước của giải pháp này so với giải pháp PLA duy nhất với
trạng thái tiếp theo được mã hóa? Điều gì sẽ xảy ra nếu các PLA chính cho cả hai
phương pháp được chia thành hai PLA riêng biệt bằng cách bao gồm các tín hiệu
chọn trạng thái hoặc địa chỉ tiếp theo?
TRANG NÀY TUYỆT VỜI TRÁI CÂY

?? ?? ??
D
A P P E N D TÔI X
Khảo sát kiến trúc
tập lệnh
D.1 Giới thiệu D-2
RISC: bất kỳ máy tính D.2 Khảo sát về Kiến trúc RISC cho Máy tính để
nào được công bố sau bàn, Máy chủ và Máy tính nhúng D-3
D.3 Intel 80×86 D-30
năm 1985.
D.4 Kiến trúc VAX D-50
Steven Przybylski D.5 Kiến trúc IBM 360/370 cho Máy tính
Một nhà thiết kế của Stanford MIPS
Mainframe D-69
D.6 Quan điểm lịch sử và tài liệu tham khảo D-75
D. 1 Giới thiệu

Phụ lục này bao gồm 10 kiến trúc tập lệnh, một số trong đó vẫn là một phần quan
trọng của ngành CNTT và một số trong đó đã nghỉ hưu trên đồng cỏ xanh hơn.
Chúng tôi giữ tất cả chúng một phần để hiển thị những thay đổi trong thời trang
của kiến trúc tập lệnh theo thời gian.
Chúng tôi bắt đầu với tám kiến trúc RISC, sử dụng RISC V làm cơ sở để so sánh.
Có hàng tỷ đô la máy tính được vận chuyển mỗi năm cho ARM (bao gồm Thumb-2),
MIPS (bao gồm cả microMIPS), Power và SPARC. ARM thống trị trong cả PMD
(bao gồm cả điện thoại thông minh và máy tính bảng) và thị trường nhúng.
80x86 vẫn là ISA có khối lượng đô la cao nhất, thống trị máy tính để bàn và
phần lớn thị trường máy chủ. 80x86 không có lực kéo trong thị trường nhúng
hoặc PMD và đã bắt đầu mất chỗ đứng trên thị trường máy chủ. Nó đã được mở
rộng hơn bất kỳ ISA nào khác trong cuốn sách này và không có kế hoạch ngăn
chặn nó sớm. Bây giờ nó đã thực hiện quá trình chuyển đổi sang địa chỉ 64 bit,
chúng tôi hy vọng kiến trúc này sẽ xuất hiện, mặc dù nó có thể đóng một vai trò
nhỏ hơn trong tương lai sau đó nó đã làm trong 30 năm qua.
VAX tiêu biểu cho một ISA trong đó nhấn mạnh vào kích thước mã và cung
cấp ngôn ngữ máy cấp cao hơn với hy vọng phù hợp hơn với ngôn ngữ lập trình.
Các kiến trúc sư rõ ràng dự kiến nó sẽ được thực hiện với một lượng lớn mã vi
mô, khiến cho việc triển khai chip đơn và đường ống trở nên khó khăn hơn.
Người kế vị của nó là Alpha, một kiến trúc RISC tương tự như MIPS và RISC V,
nhưng có một cuộc đời ngắn ngủi.
IBM 360/370 dễ bị tổn thương vẫn là một tác phẩm kinh điển đặt ra tiêu chuẩn
cho nhiều bộ hướng dẫn tuân theo. Trong số các quyết định mà các kiến trúc sư
đưa ra vào đầu những năm 1960 là :
■ Byte 8 bit
■ Byte giải quyết
■ Từ 32 bit
■ Định dạng dấu phẩy động chính xác đơn 32 bit + định dạng dấu phẩy động
chính xác kép 64 bit
■ Thanh ghi đa năng 32 bit, thanh ghi dấu phẩy động 64 bit riêng biệt
■ Khả năng tương thích nhị phân trên một họ máy tính có hiệu suất chi phí
khác nhau
■ Tách kiến trúc khỏi việc thực hiện
IBM 370 được mở rộng để có thể ảo hóa, do đó, nó có chi phí thấp nhất cho
một máy ảo của bất kỳ ISA nào. IBM 360/370 vẫn là nền tảng của doanh nghiệp
máy tính lớn của IBM trong một phiên bản đã mở rộng lên 64 bit.
D-4 Phụ lục D Khảo sát các kiến trúc tập lệnh

Một khảo sát về kiến trúc RISC cho


D.2 Máy tính để bàn, máy chủ và nhúng
Máy tính

Giới thiệu
Chúng tôi bao gồm hai nhóm kiến trúc Máy tính đặt hướng dẫn giảm (RISC)
trong phần này. Nhóm đầu tiên là RISC máy tính để bàn, máy chủ và bộ xử lý
PMD :
■ Máy RISC tiên tiến ARMv8, AArch64, ISA 64 bit ,
■ MIPS64, phiên bản 6, ISA 64 bit gần đây nhất ,
■ Phiên bản điện 3.0, hợp nhất kiến trúc IBM Power trước đó và kiến trúc
PowerPC.
■ RISC-V, cụ thể là RV64G, phần mở rộng 64 bit của RISC-V .
■ SPARCv9, ISA 64 bit .
Như Hình D.1 cho thấy những kiến trúc này là tương tự đáng kể.
Có hai bộ xử lý RISC lịch sử quan trọng khác gần giống với bộ xử lý trong
danh sách trên: bộ xử lý DEC Alpha, được sản xuất bởi Tập đoàn Thiết bị Kỹ
thuật số từ năm 1992 đến 2004 và gần giống với MIPS64. Hewlett-Packard từ
PA-RISC được sản xuất bởi HP từ khoảng năm 1986 đến 2005, khi nó được thay
thế bằng Itanium. PA-RISC có liên quan chặt chẽ nhất với Power ISA, xuất hiện
từ thiết kế IBM Power, bản thân nó là hậu duệ của IBM 801.
Nhóm thứ hai là các RISC nhúng được thiết kế cho các ứng dụng cấp thấp hơn :
■ Máy RISC nâng cao, Thumb-2: bộ hướng dẫn 32 bit với hướng dẫn 16 bit
và 32 bit. Kiến trúc bao gồm các tính năng từ cả ARMv7 và ARMv8.
■ microMIPS64: một phiên bản của tập lệnh MIPS64 với các hướng dẫn 16
bit và
■Phần mở rộng nén RISC-V (RV64GC), một bộ hướng dẫn 16 bit được
thêm vào RV64G
Cả RV64GC và microMIPS64 đều có các phiên bản 32 bit tương ứng:
RV32GC và microMIPS32.
Do việc so sánh kiến trúc máy tính để bàn và máy chủ 32 bit hoặc 64 bit cơ sở sẽ
kiểm tra sự khác biệt giữa các ISA đó, cuộc thảo luận của chúng tôi về các kiến trúc
nhúng tập trung vào các hướng dẫn 16 bit. Hình D.2 cho thấy những kiến trúc nhúng
này cũng tương tự nhau. Trong cả ba, các hướng dẫn 16 bit là các phiên bản của
hướng dẫn 32 bit, thường có một bộ thanh ghi bị hạn chế. Ý tưởng
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-5

ARMv8 MIPS64R6 Powerv3.0 RV64G SPARCv9

Ngày gốc (cơ sở ISA) 1986 1986 1990 2016 1987


Ngày của ISA này 2011 2014 2013 2016 2008
Kích thước hướng dẫn (bit) 32 32 32 32 32
Không gian địa chỉ (kích thước,
mô hình) 64 bit (phẳng) 64 bit, phẳng 64 bit, phẳng 64 bit, phẳng 64 bit, phẳng

Căn chỉnh Căn chỉnh Căn chỉnh Căn chỉnh Căn chỉnh
Căn chỉnh dữ liệu
ưa thích ưa thích ưa thích ưa thích ưa thích
8 (bao gồm
thu nhỏ, trước / 1 (+1 cho FP 4 1 2
Chế độ địa chỉ dữ liệu bài
gia tăng)
31 GPR x 64 , 31 GPR 31 GPR 31 GPR 31 GPR
Số đăng ký (số , x 64 bit x 64 bit x 64 bit x 64 bit
cộng với ngăn
xếp
mô hình, kích thước) 32 x 32 hoặc 32 x 32 hoặc 32 x 32 hoặc 32 x 32 hoặc
con trỏ
32x32 hoặc 32 x 64 bit 32 x 64 bit 32 x 64 bit 32 x 64 bit
Điểm nổi riêng biệt 32x64
sổ đăng ký bit IEEE 754 đơn, IEEE 754 đơn, IEEE 754 đơn, IEEE 754 đơn,
đôi đôi đôi đôi
IEEE 754
Định dạng điểm nổi
đơn, đôi

HÌNH D.1 Tóm tắt phiên bản mới nhất của năm kiến trúc cho máy tính để bàn, máy chủ và sử dụng PMD (tất cả đều
có phiên bản trước đó). Ngoại trừ số lượng chế độ địa chỉ dữ liệu và một số chi tiết về tập lệnh, các bộ lệnh số nguyên của các chế
độ này kiến trúc rất giống nhau. Tương phản điều này với Hình D.29Trong ARMv8, thanh ghi 31 là 0 (như thanh ghi 0 trong các kiến
trúc khác), nhưng khi nó được sử dụng trong tải hoặc lưu trữ, nó là con trỏ ngăn xếp hiện tại, một thanh ghi mục đích đặc biệt. Chúng ta
có thể nghĩ về địa chỉ dựa trên SP như một chế độ khác (đó là cách thức hoạt động của ghi nhớ lắp ráp) hoặc đơn giản là chế độ địa chỉ
bù + đăng ký (đó là cách mã hóa lệnh).

là giảm kích thước mã bằng cách thay thế các hướng dẫn 32 bit phổ biến bằng
các phiên bản 16 bit. Đối với RV32GC hoặc Thumb-2, bao gồm các hướng dẫn
16 bit mang lại sự giảm kích thước mã xuống khoảng 0,73 kích thước mã chỉ sử
dụng ISA 32 bit (RV32G hoặc ARMv7).
Một sự khác biệt quan trọng trong ba kiến trúc này là cấu trúc của ISA 32 bit cơ sở.
Trong trường hợp của RV64GC, các hướng dẫn 32 bit chính xác là của RV64G. Điều
này là có thể bởi vì RISC V đã lên kế hoạch cho tùy chọn 16 bit ngay từ đầu, và địa
chỉ nhánh và địa chỉ nhảy được chỉ định cho ranh giới 16 bit. Trong trường hợp của
microMIPS64, ISA cơ sở là MIPS64, với một thay đổi: bù nhánh và nhảy được hiểu
là 16 bit thay vì căn chỉnh 32 bit. (microMIPS cũng sử dụng không gian mã hóa được
dành riêng trong MIPS64 cho các phần mở rộng tập lệnh do người dùng xác định; các
phần mở rộng đó không phải là một phần của ISA cơ sở.)
Thumb-2 sử dụng một cách tiếp cận hơi khác. Các hướng dẫn 32 bit trong
Thumb2 chủ yếu là một tập hợp con của ARMv7; không bao gồm các tính năng nhất
định bị loại bỏ trong ARMv8 (ví dụ:., thực hiện có điều kiện hầu hết các hướng dẫn
và khả năng viết PC dưới dạng GPR). Thumb-2 cũng bao gồm một vài chục hướng
dẫn được giới thiệu
D-6 Phụ lục D Khảo sát các kiến trúc tập lệnh

microMlPS64 RV64GC Thumb-2


Ngày công bố 2009 2016 2003

Kích thước hướng dẫn (bit) 16/32 16/32


16/32
Không gian địa chỉ (kích thước, mô hình) 32/64 bit, phẳng 32/64 bit, phẳng 32/64 bit, phẳng
Căn chỉnh dữ liệu Căn chỉnh Căn chỉnh, ưa thích Căn chỉnh

Chế độ địa chỉ dữ liệu 2 1 6


Thanh ghi số nguyên (số, mô hình, kích thước) 31 GPR x 64 bit 31 GPR x 64 bit 15 GPR x 32 bit

8GPR + SP + GP
Thanh ghi số nguyên có thể truy cập bởi hầu hết
16 bit + RA 8 GPR + SP 8 GPR + SP x 32 bit
hướng dẫn (sử dụng nên chỉ định) GPR: 0, 2-7, 17 , GPR: 8-15
hoặc 2-7, 16,17

HÌNH D.2 Tóm tắt ba kiến trúc gần đây cho các ứng dụng nhúng. Cả ba đều sử dụng phần mở rộng 16 bit của một cơ sở bộ
hướng dẫn. Ngoại trừ số lượng chế độ địa chỉ dữ liệu và một số chi tiết tập lệnh, các bộ lệnh số nguyên của các kiến trúc này là tương
tự nhau. Tương phản điều này với Hình D.29Một phiên bản 16 bit trước đó của bộ hướng dẫn MIPS, được gọi là MIPS16, đã được tạo
ra vào năm 1995 và được thay thế bằng microMIPS32 và microMIPS64. Kiến trúc Thumb đầu tiên chỉ có hướng dẫn 16 bit và được
tạo ra vào năm 1996. Thumb-2 được xây dựng chủ yếu trên ARMv7, bộ hướng dẫn ARM 32 bit; nó cung cấp 16 thanh ghi. RISC-V
cũng định nghĩa RV32E, chỉ có 16 thanh ghi, bao gồm các hướng dẫn 16 bit và không thể có dấu phẩy động. Dường như hầu hết các
triển khai cho các ứng dụng nhúng đều chọn RV32C hoặc RV64GC ..

trong ARMv8, cụ thể là thao tác trường bit, hướng dẫn hệ thống bổ sung và hỗ
trợ đồng bộ hóa. Do đó, các hướng dẫn 32 bit trong Thumb2 tạo thành một ISA
duy nhất .
Các phiên bản trước của bộ lệnh 16 bit cho MIPS (MIPS16) và ARM
(Thumb), đã thực hiện phương pháp tạo một chế độ riêng biệt, được gọi bằng
một lệnh gọi thủ tục, để chuyển điều khiển sang phân đoạn mã chỉ sử dụng các
hướng dẫn 16 bit .
Tập lệnh 16 bit chưa hoàn thành và chỉ dành cho các chương trình người dùng
có kích thước mã quan trọng.
Một điều phức tạp của mô tả này là một số RISC cũ đã được gia hạn qua
nhiều năm. Chúng tôi quyết định mô tả các phiên bản mới nhất của kiến trúc:
ARMv8 (kiến trúc 64 bit AArch64), MIPS64 R6, Power v3.0, RV64G và
SPARC v9 cho máy tính để bàn / máy chủ / PMD và tập hợp con 16 bit của ISA
cho microMIPS64, RV64GC và Thumb-2.
Các phần còn lại tiến hành như sau. Sau khi thảo luận về các chế độ địa chỉ và
định dạng hướng dẫn của kiến trúc RISC của chúng tôi, chúng tôi trình bày khảo
sát các hướng dẫn theo năm bước :
n Hướng dẫn tìm thấy trong lõi RV64G.
n Các hướng dẫn không được tìm thấy trong RV64G hoặc RV64GC nhưng
được tìm thấy trong hai hoặc nhiều kiến trúc khác. Chúng tôi mô tả và sắp
xếp những thứ này theo chức năng, ví dụ:., hướng dẫn hỗ trợ số học số
nguyên mở rộng.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-7

ARMv8 MIPS64R6 RV64G SPARCv9


Powerv3.0
Đăng ký + bù (dịch chuyển hoặc dựa trên) B, H, W, D B, H, W, D B, H, W, D B, H, W, D B, H, W, D

Đăng ký + đăng ký (được lập chỉ mục) B, H, W, D B, H, W, D B, H, W, D

Đăng ký + đăng ký mở rộng (thu nhỏ) B, H, W, D W, D

Đăng ký + đăng ký + bù B, H, W, D

Đăng ký + bù và đăng ký cập nhật


B, H, W, D B, H, W, D
địa chỉ hiệu quả (dựa trên cập nhật)
Đăng ký và cập nhật đăng ký để đăng ký +
B, H, W, D
bù (đăng ký với cập nhật)
Đăng ký + Đăng ký và cập nhật đăng ký B, H, W, D
B, H, W, D
địa chỉ hiệu quả (được lập chỉ mục với cập
nhật)
PC-tương đối (PC + dịch chuyển) W, D W, D

HÌNH D.3 Tóm tắt các chế độ địa chỉ dữ liệu được hỗ trợ bởi các kiến trúc máy tính để bàn, trong đó B, H, W, D chỉ
ra các kiểu dữ liệu nào có thể sử dụng chế độ địa chỉ. Lưu ý rằng ARM bao gồm hai loại chế độ địa chỉ khác nhau với các
bản cập nhật, một trong đó được bao gồm trong Quyền lực.

n Các nhóm hướng dẫn duy nhất cho ARM, MIPS, Power hoặc SPARC,
được tổ chức theo chức năng.
n Tiện ích mở rộng đa phương tiện của RISCs máy tính để bàn / máy chủ / PMD
n Phần mở rộng xử lý tín hiệu số của các RISC nhúng
Mặc dù phần lớn các hướng dẫn trong các kiến trúc này được bao gồm, chúng
tôi không bao gồm mọi hướng dẫn duy nhất; điều này đặc biệt đúng với các ISA
Power và ARM, có nhiều hướng dẫn.

Các chế độ địa chỉ và định dạng hướng dẫn


Hình D.3 hiển thị các chế độ địa chỉ dữ liệu được hỗ trợ bởi máy tính để bàn / máy
chủ / Kiến trúc PMD. Vì tất cả, nhưng ARM, có một thanh ghi luôn có giá trị 0 khi
được sử dụng trong các chế độ địa chỉ, chế độ địa chỉ tuyệt đối với phạm vi giới hạn
có thể được tổng hợp bằng cách sử dụng thanh ghi 0 làm cơ sở trong địa chỉ dịch
chuyển. (Thanh ghi này có thể được thay đổi bằng các phép toán đơn vị số học (ALU)
trong PowerPC, nhưng luôn bằng 0 khi nó được sử dụng trong tính toán địa chỉ.)
Tương tự, đăng ký địa chỉ gián tiếp được tổng hợp bằng cách sử dụng địa chỉ dịch
chuyển với độ lệch là 0. Các chế độ địa chỉ đơn giản là một đặc điểm nổi bật của kiến
trúc RISC.
Như Hình D.4 cho thấy, các kiến trúc nhúng hạn chế các thanh ghi có thể được
truy cập bằng các hướng dẫn 16 bit, thường chỉ có 8 thanh ghi, cho hầu hết các
hướng dẫn và một vài hướng dẫn đặc biệt đề cập đến các thanh ghi khác. Hình D.5
D-8 Phụ lục D Khảo sát các kiến trúc tập lệnh

Đăng ký chỉ định microMIPS64 RV64GC Thumb-2

3 bit 2-7,16,17 8-15 0-7


o (khi sử dụng
xếp con trỏ đăng ký 29 2
trong tải / lưu
trữ)
đăng ký con trỏ toàn cầu 28
đăng ký địa chỉ trở lại 31 1 14
xếp con trỏ hoặc toàn
cầu xếp con trỏ; xếp con trỏ;
Sử dụng đăng ký đặc biệt
con trỏ; Bù 5 bit Bù 5 bit Bù 8 bit

HÌNH D.4 Đăng ký mã hóa cho các tập hợp con 16 bit của microMIPS64, RV64GC và
Thumb-2, bao gồm các thanh ghi mục đích chung cốt lõi và các thanh ghi mục đích đặc
biệt có thể truy cập bằng một số hướng dẫn.

Chế độ địa chỉ microMIPS64 RV64GC Thumb-2

Đăng ký + bù Bù 4 bit, một trong 8 Bù 5 bit, một trong 8 Bù 5 bit, một trong 8
(dịch chuyển hoặc dựa
trên) sổ đăng ký sổ đăng ký sổ đăng ký
Dữ liệu tương đối PC
Sử dụng đăng ký đặc biệt xếp con trỏ hoặc toàn cầu xếp con trỏ; 5 bit xếp con trỏ; 8 bit
con trỏ; Bù 5 bit bù đắp bù đắp

HÌNH D.5 Tóm tắt các chế độ địa chỉ dữ liệu được hỗ trợ bởi các kiến trúc nhúng. microMIPS64, RV64c
và Thumb-2 chỉ hiển thị các chế độ được hỗ trợ ở định dạng lệnh 16 bit. Con trỏ stack trong RV64GC và microMIPS64
là một GPR được thiết kế; nó là một phiên bản khác của r31 là Thumb-2. Trong microMIPS64, con trỏ toàn cầu được
đăng ký 30 và được sử dụng bởi quy ước liên kết để trỏ đến nhóm dữ liệu biến toàn cầu. Lưu ý rằng thông thường chỉ
có 8 thanh ghi có thể truy cập dưới dạng thanh ghi cơ sở (và như chúng ta sẽ thấy là nguồn và điểm đến ALU).

hiển thị các chế độ địa chỉ dữ liệu được hỗ trợ bởi các kiến trúc nhúng trong chế
độ hướng dẫn 16 bit của chúng. Các phiên bản hướng dẫn tải / lưu trữ này hạn
chế các thanh ghi có thể được sử dụng trong tính toán địa chỉ, cũng như rút ngắn
đáng kể các trường tức thời, được sử dụng cho các chuyển vị.
Các tham chiếu đến mã thường tương đối với PC, mặc dù đăng ký nhảy gián
tiếp được hỗ trợ để quay lại từ các thủ tục, cho các câu lệnh trường hợp và cho
các cuộc gọi hàm con trỏ. Một biến thể là các địa chỉ nhánh tương đối với PC
thường được dịch sang trái 2 bit trước khi được thêm vào PC cho các RISC trên
máy tính để bàn, do đó làm tăng khoảng cách nhánh. Điều này hoạt động vì độ
dài của tất cả các hướng dẫn cho máy tính để bàn
RISC là 32 bit và các hướng dẫn phải được căn chỉnh trên các từ 32 bit trong
bộ nhớ. Kiến trúc nhúng và RISC V (khi được mở rộng) có các hướng dẫn dài 16
bit và thường thay đổi địa chỉ tương đối PC thành 1 vì những lý do tương tự.
Hình D.6 hiển thị các định dạng hướng dẫn quan trọng nhất của máy tính để bàn /
máy chủ / Hướng dẫn PMD RISC. Mỗi kiến trúc tập lệnh sử dụng bốn chính
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-9

31 25 20 15 10 4 0

ARM Op6 Opx5 1 rupee5 Hằng5 2 rupee5 Rd5

Op6 1 rupee5 2 rupee5 Rd5 Hằng5 Opx6


Đăng ký đăng ký

MIPS
Quyền
lực Op6 Rd5 1 rupee5 2 rupee5 Opx11
2
rupee
RISC-V Opx2 / Const 7 5 1 rupee5 Opx3 Rd5 Op7
2
SPARC Op2 Rd5 Opx6 1 rupee5 0 Opxsố 8 rupee5
31 29 24 18 13 12 4 0
31 25 20 15 0

ARM Op6 Opx4 Hằng12 1 rupee5 Rd5


Đăng ký ngay lập

MIPS Op6 1 rupee5 Rd5 Hằng16


Quyền
lực Op6 Rd5 1 rupee5 Hằng16
tức

RISC-V Hằng12 1 rupee5 Opx3 Rd5 Op7

SPARC Op2 Rd5 Opx6 1 rupee5 1 Hằng13


31 29 24 18 13 12 0
31 25 20 15 0
Cánh 1
tay Op6 Hằng21 rupee5
Opx5/2
Op6 1 rupee5 rupee5 Hằng16
nhánh

MIPS
Chi

Quyền
lực Op6 Opx6 1 rupee5 Hằng14 Opx22
2
RISC-V Hằng7 rupee5 1 rupee5 Opx3 Hằng5 Op7

SPARC Op2 Opx11 Hằng19


31 29 18 12 1 0
31 25 20 0

ARM Op6 Hằng26

MIPS Op6 Hằng26


Nhảy /
gọi

Quyền
lực Op6 Hằng24 Opx2

RISC-V Hằng21 Rd5 Op7

SPARC Op2 Hằng30


31 29 20 15 12 1 0

Mã nguồn Đăng ký Hằng số

HÌNH D.6 Định dạng hướng dẫn cho kiến trúc RISC máy tính để bàn / máy chủ. Bốn định dạng này
được tìm thấy trong tất cả năm kiến trúc. (Ký hiệu siêu ký tự trong hình này có nghĩa là chiều rộng của một trường
tính bằng bit.) Mặc dù các trường đăng ký được đặt trong các phần tương tự của hướng dẫn, hãy lưu ý rằng đích
và hai trường nguồn đôi khi bị xáo trộn. Op = opcode chính, Opx = phần mở rộng opcode, Rd = thanh ghi đích,
R1 = thanh ghi nguồn 1, R2 = thanh ghi nguồn 2 và Const = một hằng số (được sử dụng làm số lượng ngay lập tức,
địa chỉ, mặt nạ hoặc số lượng sàng lọc) . Mặc dù các nhãn trên các định dạng lệnh cho biết nơi các hướng dẫn
khác nhau được mã hóa, có các biến thể. Ví dụ: tải và lưu trữ, cả hai đều sử dụng biểu mẫu ALU ngay lập tức
trong MIPS. Trong RISC-V, tải sử dụng định dạng ALU ngay lập tức, trong khi các cửa hàng sử dụng định dạng
nhánh.
D-10 Phụ lục D Khảo sát các kiến trúc tập lệnh

Bổ sung
chỉ dẫn
Kiến trúc định dạng Định dạng chức năng và sử dụng
Logic ngay lập tức với trường 13 bit ngay lập tức.

Ít nhất 10 (nhiều Ca làm việc với số lượng không đổi.(opcode 16 bit)

ARMv8 biến thể nhỏ); Hình thức ngay lập tức 16 bit
các hình thức chính là
Hoạt động độc quyền: ba lĩnh vực đăng ký
hiển thị.
Đăng ký chi nhánh: opcode dài
Tải / lưu trữ với các bit chế độ địa chỉ.
Một bộ tải / cửa hàng tương đối PC sử dụng định dạng đăng ký ngay lập tức nhưng với
Trực tiếp 18 bit (vì nguồn khác là PC).

MIPS64 1 Chế độ DQ: sử dụng dạng ALU ngay lập tức nhưng lấy bốn bit của
dịch chuyển cho các chức năng khác.
Chế độ DS: sử dụng dạng ALU ngay lập tức nhưng có hai bit
dịch chuyển cho các chức năng khác.
DX-fonn: Giống như đăng ký ngay lập tức, nhưng với nguồn đăng ký được thay thế
bằng PC .
Quyền lực 9 (không bao gồm a Các định dạng MD, MDS: như đăng ký đăng ký nhưng được sử dụng cho các ca và
số lượng nhỏ xoay.
biến thể hoặc
x, XS và một số biến thể nhỏ: được sử dụng cho các chế độ địa chỉ được lập chỉ mục ,
phần mở rộng vector)
ca, và một loạt các mục đích mở rộng.
Các định dạng Z22, Z23: được sử dụng để thao tác các số dấu phẩy động
Định dạng SB: một biến thể của định dạng nhánh với cách xử lý ngay lập tức khác
nhau
RV64
2 Định dạng UJ: một biến thể của định dạng nhảy / gọi với cách xử lý ngay lập tức khác
nhau
Một fonnat khác cho các nhánh có điều kiện chứa thêm 3 bit
SPARC 3 dịch chuyển (tổng cộng 22 so với 19) nhưng không có gợi ý dự đoán.
Một định dạng với 22 bit ngay lập tức được sử dụng để tải nửa trên của thanh ghi ,

Một định dạng cho các nhánh có điều kiện dựa trên một thanh ghi so với số không.

HÌNH D.7 Các định dạng hướng dẫn khác ngoài bốn định dạng chính của hình trước. Trong một số trường hợp, có là
các định dạng rất giống với một trong bốn định dạng cốt lõi, nhưng trong đó trường đăng ký được sử dụng cho các mục đích khác.
Kiến trúc Power cũng bao gồm một số định dạng cho các hoạt động vector.

các định dạng hướng dẫn, thường bao gồm 90 Lời98% hướng dẫn. Định dạng đăng
ký đăng ký được sử dụng cho các hướng dẫn ALU đăng ký, trong khi định dạng
ALU ngay lập tức được sử dụng cho các hướng dẫn ALU với một toán hạng ngay lập
tức và cũng cho các tải và cửa hàng. Định dạng nhánh được sử dụng cho các nhánh
có điều kiện và định dạng nhảy / gọi cho các nhánh vô điều kiện (nhảy) và các cuộc
gọi thủ tục.
Có một số định dạng hướng dẫn ít được sử dụng hơn Hình D.6 bỏ đi. Hình D.7
tóm tắt những điều này cho kiến trúc máy tính để bàn / máy chủ / PMD.
Không giống như, kiến trúc cơ sở 32 bit của họ, các phần mở rộng 16 bit
(microMIPS64, RV64GC và Thumb-2) được tập trung vào việc giảm thiểu mã. Kết
quả là, có một số lượng lớn hơn các định dạng hướng dẫn, mặc dù có ít hướng dẫn
hơn.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-11

microMIPs64 và RV64GC có tám và bảy định dạng chính tương ứng và


Thumb-2 có 15. Như Hình D.8 cho thấy, chúng liên quan đến số lượng toán hạng
đăng ký khác nhau (0 đến 3), kích thước tức thời khác nhau và thậm chí cả các
chỉ định đăng ký kích thước khác nhau, với một số lượng nhỏ các thanh ghi có
thể truy cập được hầu hết các hướng dẫn của tôi và ít hướng dẫn hơn có thể truy
cập vào tất cả 32 thanh ghi.

Hướng dẫn
Sự tương đồng của từng kiến trúc cho phép mô tả đồng thời, bắt đầu với các hoạt
động tương đương với ISA 64 bit RISC-V .

Hướng dẫn cốt lõi RV64G


Hầu như mọi hướng dẫn được tìm thấy trong RV64G đều được tìm thấy trong
các kiến trúc khác, như Số liệu D.9 thông qua D.19 chương trình. Hướng dẫn
được liệt kê theo bốn loại: truyền dữ liệu (Hình D.9); số học, logic (Hình D.10);
kiểm soát (Hình D.11 và Hình D.12); và điểm nổi (Hình D.13).
Nếu một lệnh lõi RV64G yêu cầu một chuỗi các hướng dẫn ngắn trong các
kiến trúc khác, các hướng dẫn này được phân tách bằng dấu chấm phẩy Hình D.9
thông qua Hình D.13(Để tránh nhầm lẫn, đăng ký đích sẽ luôn là ngoài cùng bên
trái. toán hạng trong phụ lục này, độc lập với ký hiệu thường được sử dụng với
mỗi kiến trúc.)

So sánh và chi nhánh có điều kiện


Mỗi kiến trúc phải có một sơ đồ để so sánh và các nhánh có điều kiện, nhưng
mặc dù có tất cả các điểm tương đồng, mỗi kiến trúc này đã tìm thấy một cách
khác nhau để thực hiện thao tác! Hình D.11 tóm tắt các hướng dẫn kiểm soát,
trong khi Hình D.12 cho thấy chi tiết về cách các nhánh có điều kiện được xử lý.
SPARC sử dụng bốn bit mã điều kiện truyền thống được lưu trữ trong từ trạng
thái chương trình : tiêu cực, số không, mang theo, và tràn Chúng có thể được đặt
trên bất kỳ hướng dẫn số học hoặc logic; Không giống như các kiến trúc trước đó,
cài đặt này là tùy chọn trên mỗi hướng dẫn. Một tùy chọn rõ ràng dẫn đến ít vấn
đề hơn trong việc thực hiện đường ống. Mặc dù mã điều kiện có thể được đặt làm
tác dụng phụ của thao tác, các so sánh rõ ràng được tổng hợp với một phép trừ sử
dụng r0 làm đích. SPARC các nhánh điều kiện kiểm tra mã điều kiện để xác định
tất cả các mối quan hệ không dấu và có chữ ký. Điểm nổi sử dụng các mã điều
kiện riêng biệt để mã hóa các điều kiện EEE 754, yêu cầu hướng dẫn so sánh
điểm nổi. Phiên bản 9 đã mở rộng các nhánh SPARC theo bốn cách: một bộ mã
điều kiện riêng cho các hoạt động 64 bit; một nhánh kiểm tra nội dung của một
thanh ghi và các nhánh nếu giá trị là. =, không =, <, <=,> = hoặc <= 0; thêm ba bộ
mã điều kiện dấu phẩy động; và hướng dẫn nhánh mã hóa dự đoán nhánh tĩnh.
Power cũng sử dụng bốn mã điều kiện : ít hơn, lớn hơn, bằng nhau, và tóm tắt
tràn, nhưng nó có tám bản sao của chúng. Sự dư thừa này cho phép Hướng dẫn sử
dụng mã điều kiện khác nhau mà không có xung đột, về cơ bản
D-12 Phụ lục D Khảo sát các kiến trúc tập lệnh

Mã nguồn Đăng ký Ngay lập


chính: định danh x tức
Kiến trúc mở rộng chiều dài cánh đồng Hướng dẫn điển hình
chiều dài
6 Không ai Nhảy
6 1x5 10
Hoạt động đăng ký (32 thanh ghi) và Tải bằng SP làm
5 thanh ghi cơ sở; bất kỳ đích đến
6 1x3 Chi nhánh bằng / không bằng không. Tải sử dụng GP. làm cơ sở.
microMIPS64 6: 4 2x3 7
Đăng ký đăng ký hoạt động, rd / rs1 và rs2; 8 thanh ghi
6: 1 2x3
Đăng ký đăng ký ngay lập tức, rd / rs1 và rs2; 8 đăng ký
6 2x3 3
Tải và lưu trữ; 8 đăng ký
6: 4 2x3 4
Đăng ký đăng ký hoạt động, rd và rs1; 8 đăng ký Đăng
6 2x5
ký đăng ký hoạt động; 32 đăng ký.
2: 3
Nhảy
2: 3 1x3 11
Chi nhánh
2: 3 1x3 7
Ngay lập tức một đăng ký nguồn.
RV64GC 2: 3 1x5 số 8
2: 3 1x5 Lưu trữ sử dụng SP làm cơ sở.
6
2: 4 2x5 ALU ngay lập tức và tải bằng SP làm cơ sở.
6
2: 3 2x3 Đăng ký đăng ký hoạt động
3: 2 2x3 Tải và lưu trữ sử dụng 8 thanh ghi. Chuyển, di
5
3: 2 1x3 chuyển, tải / lưu trữ từ / byte ngay lập tức: thêm,
5
trừ, di chuyển và so sánh
4: 1 1x3 số 8
Tải / lưu trữ với con trỏ ngăn xếp làm cơ sở, Thêm vào SP
4: 3 3x3 số 8 hoặc PC, Tải / lưu trữ nhiều
4: 4
Tải đăng ký được lập chỉ mục
số 8 Chi nhánh có điều kiện, hướng dẫn hệ thống
Thumb-2 4:12
Linh tinh: 22 hướng dẫn khác nhau với 12 định dạng (bao gồm
so sánh và nhánh trên 0, thanh ghi pop / push, điều chỉnh con
5 1x3 trỏ stack, byte ngược, lệnh IF-THEN).
5
số 8 Tải liên quan đến PC
: 6: 1 3x3
11 Chi nhánh vô điều kiện
6: 3 1x4, 1x3
Thêm / trừ
6: 4 2x3
Xử lý dữ liệu đặc biệt
6: 6 1x4
Xử lý dữ liệu logic
Chi nhánh và bộ hướng dẫn thay đổi (ARM so với. Ngón tay cái)

HÌNH D.8 Các định dạng hướng dẫn cho các hướng dẫn 16 bit của microMIPS64, RV64GC và Thumb-2. Cho hướng dẫn
với một điểm đến và hai nguồn, nhưng chỉ có hai trường đăng ký, lệnh sử dụng một trong các thanh ghi làm cả nguồn và đích. Lưu ý rằng
trường opcode mở rộng (hoặc trường chức năng) và trường ngay lập tức đôi khi trùng nhau hoặc giống hệt nhau. Đối với RV64GC và
microMIPS64, tất cả các định dạng được hiển thị; đối với Thumb-2, định dạng Linh tinh bao gồm 22 hướng dẫn với 12 định dạng hơi
khác nhau; chúng tôi sử dụng trường opcode mở rộng, nhưng một vài trong số các hướng dẫn này có các trường ngay lập tức hoặc đăng
ký.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-13

Truyền dữ liệu
(định dạng hướng dẫn) R-I R-I R-I, R-R R-I R-I, R-R

Tên hướng dẫn ARMv8 MIPS64 Quyền lực RV64G SPARC

Tải byte LBZ;


LDR_B LB_ LB_ LD_B
đã ký / chưa ký. EXTSB
Tải nửa chữ ký ,
LDR_H LH_ LHA / LHZ LH_ LD_H
không dấu
Tải từ LDRSW / LDR LW_ LW_ LW_ LD_W
Tải gấp đôi LDRX LD LD LD LDD
Tải đăng ký phao SP / DP LD_ L_C1 LF_ FL_ LD_F
Lưu trữ byte STB SB STB SB STB
Lưu trữ một nửa từ STW SH STH STH STH
Lưu trữ từ STL SW STW SW ST
Lưu trữ từ kép STX SD SD SD STD
Lưu trữ SP / DP nổi ST_ S_C1 STF_ FS_ ST_F
LDEXB, LDEXH
Tải dành riêng LL, LLD lwarx, ldarx , LR
LDEW, LDEXD

Lưu trữ có điều kiện STEXB, STEXH , SC, SCD stwcx, stdcx SC
STEXW, STEXD
Đọc / viết thông số kỹ thuật. csrr_ ,
đăng ký MF_, MT_ MF, MT_ M_SPR , RD__, WR__
csrr_i ,
Di chuyển số nguyên sang FP MFC1 /
ITOFS STW; LDFS STW; FLDWX ST; LDF
đăng ký DMFC1
Di chuyển FP sang số nguyên MTC1 /
FTTOIS STFS; LW FSTWX; LDW STF; LD
đăng ký DMTC1
TRIỆU
Đồng bộ hóa dữ liệu , DSB CHỨNG , TRIỆU CHỨNG , Hàng rào THÀNH VIÊN
TRIỆU
luồng hướng dẫn ISB CHỨNG ISYNC Hàng rào. Tôi HOA
AMOSWAP.W /
D,
LLWP , AMOADD, W.D ,
LDWAT, LDDAT LLDP , AMOAND.W / D , CASA, SWAP ,
Hoạt động nguyên tử
STWAT, STDAT SCWP , AMOXOR.W / D , LDSTUB
SCDP AMOOR.W / D ,
AMOMIN_.W / D ,
AMOMAX_.W / D

HÌNH D.9 Hướng dẫn truyền dữ liệu RISC trên máy tính để bàn tương đương với lõi RV64G. Một chuỗi các hướng dẫn để tổng
hợp một lệnh RV64G được hiển thị tách biệt bởi dấu chấm phẩy. Các hướng dẫn MIPS và Power cho các hoạt động nguyên tử tải và lưu trữ có
điều kiện một cặp thanh ghi và có thể được sử dụng để thực hiện các hoạt động nguyên tử RV64G với nhiều nhất một hướng dẫn ALU can
thiệp. Các hướng dẫn SPARC: so sánh và trao đổi, trao đổi, LDSTUB cung cấp các bản cập nhật nguyên tử cho vị trí bộ nhớ và có thể được sử
dụng để xây dựng các hướng dẫn RV64G. Các hướng dẫn Power3 cung cấp tất cả các chức năng, như các hướng dẫn RV64G, tùy thuộc vào
trường chức năng.
D-14 Phụ lục D Khảo sát kiến trúc tập lệnh

Số học / logic
(định dạng hướng dẫn) R-R, R-I R-R, R-I R-R, R-I R-R, R-I R-R, R-I

Tên hướng dẫn ARM v8 MIPS64 Sức mạnh v3 RISC-V SPARC v.9

Thêm từ, ngay lập tức THÊM , ADDI THÊM , VÀ, ANDI THÊM , THÊM
THÊM , THÊM
Thêm từ kép THÊM DADDU , VÀ, ANDI VÀ, ANDI THÊM
DADDUI
Trừ SUB, SUBI SUB SU SUBI SUBF ĐĂNG KÝ , SUB
SUBWI

Trừ hai từ DSUBU ,


SUBX SUBF SUB, SUBI SUB
DSUBUI
ĐA NĂNG,
Nhân lên TÓM TẮT MUL, MULU , ĐẦY ĐỦ, MUL, MULU , MULX
DMUL, DMULU MULLI ĐA NĂNG ,
MULWU
Chia MULX , DIV , DIVW DIV, DIVU , DIVX
NHỎ DIVU, DDIV , DIVW ,
DDIVU DIVWU
Còn lại MOD, MODU MODSW , REM, REMU ,
DMOD, DMODU MODUW NHỚ ,
NHỚ

Và VÀ, ANDI VÀ, ANDI VÀ, ANDI VÀ, ANDI VÀ


Hoặc là HOẶC, ORI HOẶC, ORI HOẶC, ORI HOẶC, ORI HOẶC LÀ
Xor XOR, XORI XOR, XORI XOR, XORI XOR, XORI XOR

Tải bit 31..16 BIẾN LUI THÊM THÊM SETHI


(BFMT.)
Tải các bit trên của PC ADR ADDIUPC ADDPCIS AUIPC
Chuyển trái logic, gấp đôi LSL SLLV, SLL RLWINM SLL, SLLI , SLL
phiên bản từ và từ , SLLW ,
ngay lập tức và biến đổi SLLWI
Chuyển sang phải logic, gấp
đôi RSL SRLV, SRL RLWINM SRL, SRLI , SRL
từ và từ verion , 32 - tôi SRLW ,
ngay lập tức và các biến SRLWI
Chuyển số học phải ,
từ kép và từ RSA SRAV, SRA SRAW SRA, SRAI , SRA
xác minh, ngay lập tức và SRAW ,
biến SRAWI

CMP SLT / U, SL CMP (I) CLR SLT / U , SUBcc


So sánh TI / U SLTI / U r0 , . . .

HÌNH D.10 Hướng dẫn số học / logic RISC trên máy tính để bàn tương đương với số nguyên RISC-V ISA . MIPS
cũng cung cấp các hướng dẫn bẫy trên tràn số học, được tổng hợp trong các kiến trúc khác với nhiều hướng dẫn. Lưu ý rằng trong
danh mục Số học / logic của tất cả các máy nhưng SPARC sử dụng ghi nhớ lệnh riêng để chỉ ra một toán hạng ngay lập tức; SPARC
cung cấp các phiên bản ngay lập tức của các hướng dẫn này nhưng sử dụng một ghi nhớ duy nhất. (Tất nhiên, đây là các opcodes
riêng biệt!)
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-15

Tên hướng dẫn ARMv8 MIPS64 PowerPC RISC-V SPARCv.9

Chi nhánh trên số nguyên B.cond , BEQ, BNE , BC BEQ, BNE , BR_Z, BPcc
so sánh CBZ, CBNZ B_Z (<, BLT, BGE , (<,> ,
>, BLTU, BGEU <=,> =, =,
<=,> =) không =)
HOẶC LÀ
S ***; BEZ
Chi nhánh trên điểm nổi B.cond BC1T , BC BEZ, BNZ FBPfcc (<,>,
so sánh BC1F <=,
> =, =,...)
Nhảy, nhảy đăng ký B, BR J, JR B, BCLR , JAL, JALR BA, JMPL
BCCTR (với x0) r0 ,...
Gọi, đăng ký cuộc gọi BL, BLR JAL , BL, BLA , JAL, JALR GỌI, JMPL
JALR BCLRL ,
BCCTRL
Bẫy SVC, HVC , BREAK TW, TWI ECALL Ticc, SIR
SMC
XONG ĐÔI,
Trở về từ ngắt ERET JR; ERET RFI EBREAK RETRY ,
TRẢ LẠI

HÌNH D.11 Hướng dẫn điều khiển RISC trên máy tính để bàn tương đương với RV64G .

ARMv8 MIPS64 PowerPC RISC-V SPA RCv.9

Số bit mã điều kiện 16 (8 + Không ai 8 4 cả hai Không ai 2 4


(số nguyên và FP) nghịch đảo) số nguyên,
4 2 FP
1 số
Hướng dẫn so sánh cơ bản nguyên; 1 1 số nguyên, 1 FP 4 số nguyên, 2 FP 2 số nguyên; 3 FP 1 FP
(số nguyên và FP) FP
4 số nguyên (đã sử
Hướng dẫn chi nhánh cơ bản 1 2 số nguyên, 1 FP 1 cả hai dụng 3 số nguyên ,
(số nguyên và FP) cho FP là tốt) 1 FP
=, không phải =,>
So sánh đăng ký với đăng ký / - =, không phải = - =, < -
hằng số và nhánh
=, không phải
So sánh đăng ký với số không và - =, không =, <, <=, - =, không =, <, <=, =, <,
chi nhánh >,> = >,> = <=,>,> =
HÌNH D.12 Tóm tắt năm cách tiếp cận RISC trên máy tính để bàn cho các nhánh có điều kiện. So sánh số nguyên trên
SPARC là được tổng hợp với một lệnh số học đặt mã điều kiện sử dụng r0 làm đích.
D-16 Phụ lục D Khảo sát kiến trúc tập lệnh

Điểm nổi (công cụ-


định dạng tion) R-R R-R R-R R-R R-R

Tên hướng dẫn ARMv8 MIPS64 PowerPC RISC-V SPARC v.9

Thêm đơn, đôi FADD THÊM. * FADD * FADD. * FADD *


Trừ đơn, đôi FSUB SUB. * FSUB * FSUB. * FSUB *
LỪA
Nhân đơn, đôi ĐẢO ĐA NĂNG. * FMUL * FMUL. * FMUL *
Chia đơn, đôi FDIV DIV. * FDIV * FDIV. * FDIV *
Căn bậc hai, đôi FSQRT SQRT. * FSQRT * FSQRT. * FSQRT *
FMADD
Thêm nhiều; Tiêu cực , MADD. * FMADD *, FMADD. *
nhân thêm: đơn , FNMADD NMAD. * FNMADD * FNMADD. *
gấp đôi
FMSUB
Nhân trừ đơn , , MSUB. *, FMSUB *, FMSUB. *,
nhân đôi, nhân âm FNMSUB NMSUB. * FNMSUB * FNMSUB. *
trừ: đơn, đôi
Sao chép dấu hiệu hoặc dấu
âm FMOV , FMOV. *, FNEG. * FMOV * , FSGNJ. *, FMOV * ,
gấp đôi hoặc đơn lẻ cho
người khác FNEG FNEG * FSGNJN. * FNEG *
Đăng ký FP
Thay thế bit ký bằng XOR FABS FABS. * FABS * FSGNJX. * FABS *
của bit ký hiệu đôi
Tối đa hoặc tối thiểu FMAX , TỐI ĐA. *, MIN. * FMAX. *, FMIN. *
đơn, đôi FMIN
Phân loại điểm nổi LỚP. * FCLASS. *
giá trị đơn gấp đôi
So sánh FCMP CMP. * FCMP * FCMP. * FCMP *
Chuyển đổi giữa đơn FP FCVT CVT, CEIL , FCVT F * TO *
hoặc gấp đôi và FP đơn hoặc SÀN
đôi, HOẶC số nguyên đơn
hoặc gấp đôi, ký tên và
không dấu với làm tròn

HÌNH D.13 Hướng dẫn dấu phẩy động RISC trên máy tính để bàn tương đương với RV64G ISA với một mục trống có
nghĩa là hướng dẫn không khả dụng. ARMv8 sử dụng cùng một ghi nhớ lắp ráp cho độ chính xác đơn và kép; đăng ký người chỉ định
cho biết độ chính xác. Cúc∗Được sử dụng làm tên viết tắt cho S hoặc D. Đối với dấu phẩy động so sánh tất cả các điều kiện: bằng nhau, không
bằng, nhỏ hơn và ít hơn hoặc bằng nhau được cung cấp. Di chuyển hoạt động theo cả hai hướng từ / đến thanh ghi số nguyên. Phân loại đặt
một thanh ghi dựa trên việc số lượng dấu phẩy động là cộng hay trừ vô cực, denorm , +/ - 0, v.v.). Các hướng dẫn tiêm ký có hai toán hạng,
nhưng chủ yếu được sử dụng để tạo thành di chuyển điểm nổi, phủ định và giá trị tuyệt đối, là các hướng dẫn riêng biệt trong các ISA khác.

cung cấp cho Power tám thanh ghi 4 bit thêm. Bất kỳ mã nào trong số tám mã điều
kiện này đều có thể là mục tiêu của một lệnh so sánh và bất kỳ mã nào cũng có thể là
nguồn của một nhánh có điều kiện. Các lệnh số nguyên có một bit tùy chọn hoạt động
như thể số nguyên được theo sau bởi một so sánh với số 0 đặt điều kiện đầu tiên
Đăng ký.Sức mạnh cũng cho phép đăng ký thứ hai của người dùng được đặt tùy chọn
theo hướng dẫn dấu phẩy động. PowerPC cung cấp các hoạt động logic trong số tám
thanh ghi mã điều kiện 4 bit này (CRAND, CROR, CRXOR, CRNAND, CRNOR,
CREQV), cho phép các điều kiện phức tạp hơn được kiểm tra bởi một nhánh duy nhất.
Cuối cùng, Power bao gồm một bộ chi nhánh
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-17

đếm các thanh ghi được tự động giảm khi thử nghiệm và có thể được sử dụng
trong điều kiện nhánh. Ngoài ra còn có các hướng dẫn đặc biệt để di chuyển từ /
đến thanh ghi điều kiện.
RISC-V và MIPS giống nhau nhất. RISC-V sử dụng một so sánh và nhánh với
một bộ so sánh số học đầy đủ. MIPS cũng sử dụng so sánh và nhánh, nhưng các
so sánh được giới hạn ở mức bình đẳng và các thử nghiệm so với không. Tập hợp
các điều kiện giới hạn này đơn giản hóa việc xác định nhánh (vì không yêu cầu
thao tác ALU để kiểm tra điều kiện), với chi phí đôi khi yêu cầu sử dụng một
hướng dẫn ít hơn so với hướng dẫn (SLT, SLTI, SLTU, SLTIU), so sánh hai toán
hạng và sau đó đặt thanh ghi đích thành 1 nếu ít hơn và 0 khác. Hình D.12 cung
cấp thêm chi tiết về chi nhánh có điều kiện. RISC-V nổi so sánh điểm đặt một
thanh ghi số nguyên thành 0 hoặc 1, và sau đó sử dụng các nhánh có điều kiện
trên nội dung đó. MIPS cũng sử dụng so sánh điểm nổi riêng biệt, đặt thanh ghi
điểm nổi thành 0 hoặc 1, sau đó được kiểm tra bởi một nhánh có điều kiện điểm
nổi.
ARM tương tự như SPARC, trong đó nó cung cấp bốn mã điều kiện truyền
thống được đặt tùy chọn. CMP trừ một toán hạng từ toán hạng khác và sự khác
biệt đặt mã điều kiện. So sánh âm tính (CMN) thêm một toán hạng vào toán hạng
khác và tổng đặt mã điều kiện. TST thực hiện logic VÀ trên hai toán hạng để đặt
tất cả các mã điều kiện nhưng tràn, trong khi TEQ sử dụng OR độc quyền để đặt
ba mã điều kiện đầu tiên. Giống như SPARC, phiên bản có điều kiện của lệnh
ARM kiểm tra mã điều kiện để xác định tất cả các mối quan hệ không được ký và
ký có thể. ARMv8 đã thêm cả hướng dẫn kiểm tra bit và cũng so sánh và phân
nhánh với số không. Điểm nổi so sánh trên ARM, đặt mã điều kiện số nguyên,
được sử dụng bởi B.cond chỉ dẫn.
Như Hình D.13 cho thấy hỗ trợ điểm nổi tương tự trên cả năm kiến trúc.

Hướng dẫn lõi 16 bit RV64GC


Số liệu D.14 thông qua D.17 tóm tắt việc truyền dữ liệu, ALU và kiểm soát
hướng dẫn cho ba bộ xử lý nhúng của chúng tôi: microMIPS64, RV64GC và
Thumb-2. Vì các kiến trúc này đều dựa trên các phiên bản 32 bit hoặc 64 bit của
kiến trúc đầy đủ, chúng tôi tập trung chú ý vào chức năng được thực hiện theo
hướng dẫn 16 bit. Vì dấu phẩy động là tùy chọn, chúng tôi không bao gồm nó.

Hướng dẫn: Tiện ích mở rộng chung ngoài RV64G


Số liệu D.15 thông qua D.18 hướng dẫn danh sách không tìm thấy trong Số liệu D.9
thông qua D.13 trong cùng bốn loại (chuyển dữ liệu, ALU và kiểm soát. Phần mở
rộng điểm nổi quan trọng duy nhất là hướng dẫn đối ứng, cả MIPS64 và Power đều
hỗ trợ. Các hướng dẫn được đưa vào các danh sách này nếu chúng xuất hiện trong
nhiều hơn một trong những kiến trúc tiêu chuẩn. Nhớ lại điều đó Hình D.3 trên trang
6 cho thấy các chế độ địa chỉ được hỗ trợ bởi các bộ hướng dẫn khác nhau. Tất cả ba
bộ xử lý cung cấp nhiều chế độ địa chỉ hơn so với RV64G cung cấp. Tải và lưu trữ sử
dụng các chế độ địa chỉ bổ sung này không được hiển thị trong Hình D.17, nhưng là
hướng dẫn truyền dữ liệu bổ sung hiệu quả. Điều này có nghĩa là ARM có 64 hướng
dẫn tải và lưu trữ bổ sung, trong khi Power3 có 12 và MIPS64 và SPARVv9 mỗi có 4.
microMIPS64 RV64GC Thumb-2
Tên hướng dẫn
rs1; rs2 / dst; o đặt rs1; rs2 / dst; o đặt rs1; rs2 / dst; o đặt

Tải từ 8; 8; 4 8; 8; 5 8; 8; 5
Tải từ kép 8; 8; 5
Tải từ với con trỏ stack làm thanh ghi cơ sở 1; 32; 5 1; 32; 6 1; 3; 8
Tải từ kép với con trỏ ngăn xếp làm thanh ghi cơ sở 1; 32; 6
Lưu trữ từ 8; 8; 4 8; 8; 5 8; 8; 5
Lưu trữ từ kép 8; 8; 5
Lưu trữ từ với con trỏ stack làm thanh ghi cơ sở 1; 32; 5 1; 32; 6 1; 3; 8

Lưu trữ gấp đôi với con trỏ ngăn xếp làm thanh ghi cơ sở 1; 32; 6

HÌNH D.14 Hướng dẫn truyền dữ liệu RISC nhúng tương đương với RV64GC ISA 16 bit; một khoảng trống chỉ ra rằng
lệnh không phải là lệnh 16 bit. Thay vì hiển thị tên hướng dẫn, khi thích hợp, chúng tôi hiển thị số lượng các thanh ghi có thể đăng ký cơ
sở để tính toán địa chỉ, theo sau là số thanh ghi có thể là đích cho tải hoặc nguồn cho một cửa hàng, và cuối cùng, kích thước của ngay lập tức
được sử dụng để tính toán địa chỉ. Ví dụ: 8; số 8; 5 cho một tải có nghĩa là có 8 thanh ghi cơ sở có thể, 8 thanh ghi đích có thể cho tải và bù 5
bit để tính toán địa chỉ. Đối với một cửa hàng, 8; số 8; 5, chỉ định rằng nguồn của giá trị để lưu trữ đến từ một trong 8 thanh ghi. Hãy nhớ rằng
Thumb-2 cũng có các hướng dẫn 32 bit (mặc dù không phải là bộ ARMv8 đầy đủ) và RV64GC và microMIPS64 có đầy đủ các hướng dẫn 32
bit trong RV64I hoặc MIPS64.

Tên hướng dẫn / Chức năng microMIPS64 RV64GC Thumb-2


Tải ngay lập tức 8; 7 32; 6 8; 8
Tải trên ngay lập tức 32; 6
thêm ngay lập tức 32; 4 32; 6 8; 8; 3
thêm từ ngay lập tức (32 bit) & ký tên 32; 6
mở rộng
thêm ngay lập tức để xếp con trỏ 1; 9 1; 6 1; 7
(thêm 4x im.)
thêm ngay vào cửa hàng con trỏ ngăn
xếp 1; 8; 6 1; 8; 6
trong reg. (thêm 4x im.)
8; 8; 3 (dịch chuyển 8; 6 (dịch chuyển 8; 8; 5 (dịch chuyển
dịch chuyển trái / phải logic amt.) amt.) amt.)
8; 6 (dịch chuyển 8; 8; 5 (dịch chuyển
dịch chuyển số học phải amt.) amt.)
VÀ ngay lập tức 8; 8; 4 8; 6 8; 8
di chuyển 32; 32 32; 32 16; 16
8; 8; 8
thêm 8; 8; 8 32; 32 16; 16
VÀ, HOẶC, XOR 8; 8 8; 8 8; 8
siêu âm 8; 8; 8 8; 8 8; 8; 8
thêm từ, từ siêu âm (32 bit) 8; 8
& ký mở rộng

Các hướng dẫn ALU của FIGURE D.15 được cung cấp trong RV64GC và các tương đương, nếu có, trong các
hướng dẫn 16 bit của microMIPS64 hoặc Thumb-2. Một mục nhập cho thấy số lượng nguồn đăng ký / điểm đến, theo sau là
kích thước của trường ngay lập tức , nếu nó tồn tại cho hướng dẫn đó. Con trỏ thêm vào ngăn xếp với các hướng dẫn ngay lập tức
được thu nhỏ được sử dụng để điều chỉnh con trỏ ngăn xếp và tạo một con trỏ đến một vị trí trên ngăn xếp. Trong Thumb, add có hai
dạng một với ba toán hạng từ tập hợp con 8 đăng ký (Lo) và một với hai toán hạng nhưng bất kỳ 16 thanh ghi nào.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-19

microMIPS64 RV64GC Thumb-2


Chi nhánh vô điều kiện Bù 10 bit Bù 11 bit Bù 11 bit
Chi nhánh và liên kết vô điều kiện Bù 11 bit Bù 11 bit
Chi nhánh vô điều kiện để đăng ký w / w link bất kỳ trong số 32 bất kỳ trong số 32
So sánh đăng ký với số không (= /!=) và chi thanh ghi thanh ghi không: nhưng xem chú thích
nhánh 8 thanh ghi; Bù 7 8 thanh ghi; Bù 8
bit bit
HÌNH D.16 Tóm tắt ba cách tiếp cận RISC nhúng cho các nhánh có điều kiện. Một khoảng trống chỉ ra rằng
hướng dẫn không tồn tại. Thumb-2 sử dụng 4 bit mã điều kiện; nó cung cấp một nhánh có điều kiện kiểm tra mã điều kiện 4
bit và có độ lệch nhánh là 8 bit.

Chức Định ARMv8 MIPS64 PowerPC SPARC v.9


năng nghĩa
Tải / lưu trữ Tải hoặc lưu trữ 2 hoặc Tải cặp , Cửa hàng tải
nhiều thanh ghi đăng ký nhiều hơn cặp cửa hàng bội số (<= 31
đăng ký) ,
Sửa đổi trạng thái của
Bộ nhớ cache a Prefetch CACHE , Prefetch Prefetch
dòng bộ đệm hoặc làm
thao túng và a TRƯỚC
prefetch prefetch

HÌNH D.17 Hướng dẫn truyền dữ liệu không được tìm thấy trong lõi RISC-V nhưng được tìm thấy trong hai hoặc
nhiều hơn năm kiến trúc máy tính để bàn. SPARC yêu cầu các truy cập bộ nhớ phải được căn chỉnh, trong khi các kiến trúc khác hỗ
trợ truy cập không được phân bổ, mặc dù , thường với hình phạt hiệu suất lớn. Các kiến trúc khác không yêu cầu căn chỉnh, nhưng có thể
sử dụng các cơ chế chậm để xử lý các truy cập không được sắp xếp. MIPS cung cấp một bộ hướng dẫn để xử lý các truy cập không đúng:
LDL và LDR (tải hai lần hướng dẫn trái và tải hai lần phải) hoạt động như một cặp để tải một từ sai; các hướng dẫn cửa hàng tương ứng
thực hiện nghịch đảo. Hướng dẫn Prefetch gây ra một prefetch bộ đệm, trong khi CACHE cung cấp quyền kiểm soát người dùng hạn chế
đối với trạng thái bộ đệm.

Tên Định nghĩa ARMv8 MIPS64 PowerPC SPARC v.9


Chi nhánh bị trì
hoãn Chi nhánh bị trì hoãn BEQ, BNE, BGTZ , BPcc, A ,
có / không hủy bỏ BLEZ, BCxEQZ , FPBcc, A
BCxNEZ
Bẫy nếu một điều kiện là
Bẫy có điều kiện đúng TEQ, TNE, TGE , TW, TD , Tcc
TLT, TGEU, TLTU HAI, TDI

HÌNH D.18 Hướng dẫn điều khiển không được tìm thấy trong lõi RV64G nhưng được tìm thấy trong
hai hoặc nhiều kiến trúc khác. MIPS64 Phiên bản 6 có các nhánh bị trì hoãn và bình thường, trong khi SPARC v.9
đã trì hoãn các nhánh với việc hủy bỏ dựa trên dự đoán tĩnh.

Để tăng tốc các nhánh, bộ xử lý hiện đại sử dụng dự đoán nhánh động. Nhiều kiến
trúc trong các phiên bản trước đã hỗ trợ các nhánh bị trì hoãn, mặc dù chúng đã bị
loại bỏ hoặc bị loại bỏ phần lớn trong các phiên bản sau của kiến trúc, điển hình là
bằng cách cung cấp một phiên bản không được cung cấp, như là nhánh có điều kiện
ưa thích. Chi nhánh hủy bỏ SPARC là một dạng nhánh bị trì hoãn tối ưu hóa, chỉ thực
hiện lệnh trong khe trễ nếu nhánh được thực hiện; mặt khác, hướng dẫn bị hủy bỏ.
Điều này có nghĩa là hướng dẫn tại mục tiêu của chi nhánh có thể được sao chép một
cách an toàn
D-20 Phụ lục D Khảo sát các kiến trúc tập lệnh

vào khe trễ vì nó sẽ chỉ được thực thi nếu nhánh được lấy. Các hạn chế là mục
tiêu không phải là một nhánh khác và mục tiêu được biết đến tại thời điểm biên
dịch. (SPARC cũng cung cấp một bước nhảy không cần thiết bởi vì một nhánh
vô điều kiện với tập bit annul nào không phải thực hiện các hướng dẫn sau.).
Trái ngược với sự khác biệt giữa các ISA đầy đủ, các tập hợp con 16 bit của ba
ISA nhúng về cơ bản không có sự khác biệt đáng kể nào ngoài những mô tả trong
các hình trước đó (ví dụ:., kích thước của các trường ngay lập tức, sử dụng SP
hoặc các thanh ghi khác, v.v.).
Bây giờ chúng tôi đã bao gồm những điểm tương đồng, chúng tôi sẽ tập trung
vào các tính năng độc đáo của mỗi kiến trúc. Trước tiên, chúng tôi bao gồm các
RISC máy tính để bàn / máy chủ, đặt hàng chúng theo độ dài mô tả của các tính
năng độc đáo từ ngắn nhất đến dài nhất, và sau đó là các RISC nhúng.

Hướng dẫn duy nhất cho MIPS64 R6


MIPS đã trải qua sáu thế hệ bộ hướng dẫn. Thế hệ 1 Hướng4 chủ yếu được thêm
hướng dẫn. Bản phát hành 6 đã loại bỏ nhiều hướng dẫn cũ hơn nhưng cũng cung
cấp hỗ trợ cho các chi nhánh không được kiểm soát và truy cập dữ liệu không
được phân bổ sai. Hình D.19 tóm tắt các hướng dẫn duy nhất trong MIPS64 R6.

Hướng dẫn duy nhất cho SPARC v.9


Một số tính năng là duy nhất cho SPARC. Chúng tôi xem xét các số liệu chính và
sau đó tóm tắt những điểm đó và sự khác biệt nhỏ trong một hình.

Đăng ký Windows
Các tính năng độc đáo chính của SPARC là đăng ký windows, tối ưu hóa để giảm lưu
lượng đăng ký trên các cuộc gọi thủ tục. Một số ngân hàng của các thanh ghi được sử
dụng, với một ngân hàng mới được phân bổ cho mỗi cuộc gọi thủ tục. Mặc dù điều này
có thể giới hạn độ sâu của

Hướng dẫn
lớp học Tên hướng dẫn Chức năng

ALU Byte căn chỉnh Lấy một cặp thanh ghi và trích xuất một từ hoặc hai từ byte.
Được sử dụng để thực hiện các bản sao byte không được sắp xếp.
Thêm 16 bit trên của PC vào 16 bit bên trái được dịch chuyển ngay lập tức
và đặt kết quả vào một thanh ghi; Được sử dụng để có được một địa chỉ
Căn chỉnh ngay lập tức với PC tương đối PC.
Trao đổi bit Đảo ngược các bit trong mỗi byte của một thanh ghi.
Không có liên kết và liên kết Đưa giá trị của PC + 8 vào một thanh ghi
Logic NOR Tính toán NOR của 2 thanh ghi
Kiểm soát chuyển Chi nhánh và liên kết có điều So sánh một thanh ghi với 0 và không phân nhánh nếu điều kiện là đúng;
nhượng kiện địa điểm
địa chỉ trả lại trong đăng ký liên kết.
Nhảy được lập chỉ mục, Nhảy
và Thêm một phần bù và đăng ký để có được PC mới, địa chỉ liên kết w / wo
liên kết được lập chỉ mục
HÌNH D.19 Hướng dẫn bổ sung được cung cấp MIPS64 R6. Ngoài ra, có một số hướng dẫn để hỗ trợ ảo máy móc, hầu hết là
đặc quyền.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-21

các cuộc gọi thủ tục, giới hạn được tránh bằng cách vận hành các ngân hàng dưới
dạng bộ đệm tròn. Đầu gối của đường cong hiệu suất chi phí dường như là sáu đến
tám ngân hàng; các chương trình với ngăn xếp cuộc gọi sâu hơn, sẽ cần lưu và khôi
phục các thanh ghi vào bộ nhớ.
SPARC có thể có từ 2 đến 32 cửa sổ, thường sử dụng 8 thanh ghi mỗi cửa sổ
cho các quả cầu, địa phương, các tham số đến và các tham số đi. (Cho rằng mỗi
cửa sổ có 16 thanh ghi duy nhất, việc triển khai SPARC có thể có ít nhất 40 thanh
ghi vật lý và có đến 520, mặc dù hầu hết có từ 128 đến 136, cho đến nay.) Thay vì
buộc thay đổi cửa sổ với hướng dẫn gọi và trả về , SPARC có hướng dẫn riêng
TIẾT KIỆM và NHÀ HÀNG.TIẾT KIỆM được sử dụng để lưu lại các cửa sổ của
người gọi bằng cách chỉ vào cửa sổ đăng ký tiếp theo ngoài việc thực hiện một
hướng dẫn thêm. Thủ thuật là các thanh ghi nguồn nằm trong cửa sổ của người
gọi của hoạt động bổ sung, trong khi thanh ghi đích nằm trong cửa sổ callee.
Trình biên dịch SPARC thường sử dụng hướng dẫn này để thay đổi con trỏ ngăn
xếp để phân bổ các biến cục bộ trong khung ngăn xếp mới. NHÀ HÀNG là nghịch
đảo của TIẾT KIỆM, mang lại cửa sổ người gọi trong khi hoạt động như một
hướng dẫn thêm, với các thanh ghi nguồn từ cửa sổ callee và thanh ghi đích trong
cửa sổ người gọi. Điều này tự động phân bổ khung ngăn xếp. Trình biên dịch
cũng có thể sử dụng nó để tạo giá trị trả về cuối cùng của callee.
Nguy hiểm của các cửa sổ đăng ký là số lượng thanh ghi lớn hơn có thể làm chậm
tốc độ đồng hồ. Đây không phải là trường hợp để thực hiện sớm. Kiến trúc SPARC
(có cửa sổ đăng ký) và kiến trúc MIPS R2000 (không có) đã được xây dựng trong một
số công nghệ kể từ năm 1987. Trong nhiều thế hệ, tốc độ xung nhịp SPARC không
chậm hơn tốc độ xung nhịp MIPS để triển khai trong các công nghệ tương tự, có lẽ vì
thời gian truy cập bộ đệm chi phối thời gian truy cập đăng ký trong các triển khai này.
Với sự ra đời của nhiều vấn đề, đòi hỏi nhiều cổng đăng ký hơn, cũng như đăng ký
đổi tên hoặc sắp xếp lại bộ đệm, các cửa sổ đăng ký đặt ra một hình phạt lớn hơn. Cửa
sổ đăng ký là một tính năng của các thiết kế RISC Berkeley ban đầu và việc đưa
chúng vào SPARC được lấy cảm hứng từ những thiết kế đó. Tensilica là kiến trúc lớn
duy nhất khác được sử dụng ngày nay sử dụng chúng và chúng không được bao gồm
trong RISC-V ISA .

Bẫy nhanh
SPARCv9 bao gồm hỗ trợ để thực hiện bẫy nhanh. Nó mở rộng mức bẫy duy
nhất lên ít nhất bốn cấp độ, cho phép các trình xử lý bẫy tràn cửa sổ và tràn dưới
bị gián đoạn. Các mức bổ sung có nghĩa là trình xử lý không cần kiểm tra lỗi
trang hoặc con trỏ ngăn xếp sai rõ ràng trong mã, bằng cách làm cho trình xử lý
nhanh hơn. Hai hướng dẫn mới đã được thêm vào để trả về từ trình xử lý đa cấp
này : TRẢ LẠI (mà thử lại hướng dẫn bị gián đoạn) và LÀM XONG (mà không).
Để hỗ trợ bẫy cấp người dùng, hướng dẫn TRẢ LẠI sẽ trở về từ bẫy trong chế độ
không đặc quyền.

Hỗ trợ cho LISP và Smalltalk


Tính năng số học chính còn lại được gắn thẻ bổ sung và trừ.
Các nhà thiết kế của SPARC đã dành thời gian suy nghĩ về các ngôn ngữ như LISP và
D-22 Phụ lục D Khảo sát các kiến trúc tập lệnh

Smalltalk và điều này ảnh hưởng đến một số tính năng của SPARC đã được thảo
luận: đăng ký cửa sổ, hướng dẫn bẫy có điều kiện, các cuộc gọi với địa chỉ lệnh
32 bit và số học nhiều từ (xem Taylor et al. [1986] và Ungar et al. [1984]). Một
lượng nhỏ hỗ trợ được cung cấp cho các loại dữ liệu được gắn thẻ với các hoạt
động để thêm, trừ và do đó so sánh. Hai bit có ý nghĩa nhỏ nhất cho biết liệu toán
hạng có phải là số nguyên hay không (được mã hóa là 00), vì vậy TADDcc và
TSUBcc đặt bit tràn nếu một trong hai toán hạng không được gắn thẻ dưới dạng
số nguyên hoặc nếu kết quả quá lớn. Một nhánh có điều kiện tiếp theo hoặc
hướng dẫn bẫy có thể quyết định phải làm gì. (Nếu toán hạng không phải là số
nguyên, phần mềm sẽ phục hồi các toán hạng, kiểm tra các loại toán hạng và gọi
thao tác chính xác dựa trên các loại đó.) Hóa ra bẫy truy cập bộ nhớ bị sai cũng
có thể được sử dụng cho dữ liệu được gắn thẻ, vì tải từ một con trỏ với thẻ sai có
thể là một truy cập không hợp lệ. Hình D.20 hiển thị cả hai loại hỗ trợ thẻ.
Hình D.21 tóm tắt các hướng dẫn bổ sung được đề cập ở trên cũng như vài
người khác.

Hướng dẫn duy nhất cho ARM


Các phiên bản trước của kiến trúc ARM (ARM v6 và v7) có một số tính năng khác
thường bao gồm thực hiện có điều kiện tất cả các hướng dẫn và biến PC thành một
thanh ghi mục đích chung. Các tính năng này đã được loại bỏ với sự xuất hiện của
ARMv8 (trong cả ISA 32 bit và 64 bit). Tuy nhiên, những gì còn lại là phần lớn sự
phức tạp, ít nhất là về kích thước của tập lệnh. Như Hình D.3 trên trang 6 chương
trình, ARM có nhiều chế độ địa chỉ nhất, bao gồm tất cả các chế độ được liệt kê

(a) Thêm, phụ, hoặc 00 (R5)


so sánh số nguyên
(mã hóa là 00) +
- 00 (R6)

TADDcc r7, r5, r6

00 (R7)

(b) Đang tải qua


con trỏ hợp lệ 11 (R4)
(được mã hóa là
11)
3
-
LD rD, r4, - 3 00 (Lời
Địa chỉ)

HÌNH D.20 SPARC sử dụng hai bit có ý nghĩa nhỏ nhất để mã hóa các loại dữ liệu khác nhau
cho các hướng dẫn số học được gắn thẻ. (a) Số học số nguyên, mất một chu kỳ duy nhất miễn là toán
hạng và kết quả là số nguyên. (b) Bẫy được sắp xếp sai có thể được sử dụng để bắt các truy cập bộ nhớ không hợp
lệ, chẳng hạn như cố gắng sử dụng một số nguyên làm con trỏ. Đối với các ngôn ngữ có dữ liệu được ghép nối
như LISP, có thể sử dụng phần bù của 33 để truy cập từ chẵn của một cặp (CAR) và +1 cho từ lẻ của một cặp
(CDR).
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-23

trong bảng; hãy nhớ rằng các chế độ địa chỉ này thêm hàng tá hướng dẫn tải / lưu
trữ so với RVG, mặc dù chúng không được liệt kê trong bảng sau. Như Hình D.6
trên trang D-8 cho thấy, ARMv8 cũng có số lượng định dạng hướng dẫn khác
nhau lớn nhất, phản ánh nhiều hướng dẫn khác nhau, cũng như các chế độ địa chỉ
khác nhau, một số áp dụng cho một số tải và lưu trữ nhưng không phải là các chế
độ khác.
Hầu hết các hướng dẫn ALU ARMv8 cho phép chuyển toán hạng thứ hai trước
khi hoàn thành thao tác. Điều này mở rộng phạm vi của các lần xuất hiện, nhưng
chuyển đổi toán hạng không giới hạn ở các lần xuất hiện. Các tùy chọn dịch
chuyển là dịch chuyển trái logic, dịch chuyển phải logic, dịch chuyển số học phải
và xoay phải. Ngoài ra, như trong Power3, hầu hết các hướng dẫn ALU có thể tùy
ý đặt cờ điều kiện. Hình D.22 bao gồm các hướng dẫn bổ sung, nhưng không liệt
kê tất cả các giống (chẳng hạn như cài đặt tùy chọn của cờ điều kiện); xem chú
thích để biết thêm chi tiết. Mặc dù việc thực hiện có điều kiện tất cả các hướng dẫn
đã bị loại bỏ, ARMv8 cung cấp một số hướng dẫn có điều kiện ngoài việc di
chuyển có điều kiện và tập hợp có điều kiện, đã đề cập trước đó.

Hướng dẫn duy nhất cho Power3


Power3 là kết quả của một số thế hệ máy RISC thương mại của IBM, IBM IBM
RT / PC, IBM Power1 và IBM Power2 và sự phát triển PowerPC, được thực hiện
chủ yếu bởi IBM và Motorola. Đầu tiên, chúng tôi mô tả các thanh ghi nhánh và
hỗ trợ cho các nhánh vòng lặp. Hình D.23 sau đó liệt kê các hướng dẫn khác chỉ
được cung cấp trong Power3.

Đăng ký chi nhánh: Liên kết và truy cập


Thay vì dành một trong 32 thanh ghi đa năng để lưu địa chỉ trả về trong cuộc gọi
thủ tục, Power3 đặt địa chỉ vào một thanh ghi đặc biệt được gọi là đăng ký liên
kếtVì nhiều thủ tục sẽ trở lại mà không cần gọi thủ tục khác ,. liên kết không phải
lúc nào cũng phải được lưu đi. Làm cho địa chỉ trả về trở thành một thanh ghi
đặc biệt làm cho việc quay trở lại tăng nhanh hơn vì phần cứng không cần phải đi
qua giai đoạn đọc đường ống để nhảy trở lại.

Hướng dẫn
lớp học Tên hướng dẫn Chức năng
Truyền dữ liệu TIẾT KIỆM, RESTORE Lưu hoặc khôi phục một cửa sổ đăng ký
Tải không bị lỗi Phiên bản hướng dẫn tải không tạo ra lỗi trên địa chỉ
ngoại lệ; cho phép đầu cơ cho tải.
ALU Tagged thêm, Tagged trừ , Thực hiện một add / subtract được gắn thẻ, đặt mã điều kiện, tùy chọn
có và không có bẫy bẫy.
Kiểm soát chuyển
nhượng Thử lại, trở về, và hoàn thành Để cung cấp xử lý cho bẫy.
Điểm nổi FMOVcc Di chuyển có điều kiện giữa các thanh ghi FP dựa trên số nguyên hoặc FP
Hướng dẫn mã điều kiện.

HÌNH D.21 Hướng dẫn bổ sung được cung cấp trong SPARCv9. Mặc dù cửa sổ đăng ký là quan trọng nhất phân biệt,
họ không yêu cầu nhiều hướng dẫn!
D-24 Phụ lục D Khảo sát các kiến trúc tập lệnh

Hướng dẫn
lớp học Tên hướng dẫn Chức năng
Truyền dữ liệu Tải / Cửa hàng cặp Nontemporal Tải / lưu trữ cặp thanh ghi có chỉ dẫn không lưu trữ bộ đệm
dữ liệu. Chỉ có chế độ địa chỉ bù + mở rộng.
ALU Thêm từ mở rộng / từ kép Thêm 2 thanh ghi vào bên trái chuyển thanh ghi afsecond
điều hành và mở rộng nó.
Thêm với ca; thêm ngay lập tức với Thêm với sự thay đổi của toán hạng thứ hai.
ca làm việc
Địa chỉ của trang Tính toán địa chỉ của một trang dựa trên PC (tương tự
ADDUIPC, giống như ADR trong ARMv8)
VÀ, HOẶC, XOR, XOR KHÔNG thay đổi Hoạt động hợp lý trên một thanh ghi và một thanh ghi thay đổi.
đăng ký
Trường bit rõ ràng thay đổi Chuyển toán hạng, đảo ngược và VÀ với một toán hạng khác
So sánh có điều kiện, ngay lập tức , Nếu điều kiện đúng, sau đó đặt cờ điều kiện để so sánh kết quả ,
tiêu cực, tiêu cực ngay lập tức nếu không để lại cờ điều kiện không bị ảnh hưởng.
Gia tăng có điều kiện, đảo ngược , Nếu điều kiện sau đó đặt đích thành tăng / đảo ngược / cổng sau của
phủ định đăng ký nguồn
CRC Tính toán tổng kiểm tra CRC: byte, từ, nửa chữ, đôi
Nhân, trừ Số nguyên nhân cộng hoặc nhân trừ
Nhân phủ định Bắt đầu sản phẩm của hai số nguyên; từ & từ kép
Di chuyển ngay lập tức hoặc nghịch
đảo Lặp lại 16 bit trong một thanh ghi withla ngay lập tức, có thể thay đổi
Thứ tự bit ngược Đảo ngược thứ tự của bit trong một thanh ghi
Di chuyển một trường bit đã ký; dấu mở rộng sang trái; không mở
Đã ký trường bit di chuyển rộng sang phải
Chia không ký, nhiều, nhân Phiên bản chưa ký của các hướng dẫn cơ bản
phủ định, nhân thêm, nhân phụ
Kiểm soát So sánh chi nhánh = /!= 0, cho biết đây không phải là một cuộc gọi
chuyển nhượng CBNZ, CBZ hoặc trả lại.
TBNZ, TBZ Kiểm tra bit trong một thanh ghi = /!= 0 và chi nhánh.

HÌNH D.22 Hướng dẫn bổ sung được cung cấp trong ARMv8, bộ hướng dẫn AArch64. Trừ khi ghi nhận hướng
dẫn có sẵn ở định dạng từ và từ kép, nếu có sự khác biệt. Hầu hết các hướng dẫn ALU có thể tùy chọn đặt mã điều kiện; chúng
không được bao gồm dưới dạng hướng dẫn riêng ở đây hoặc trong các bảng trước đó.

Trong một tĩnh mạch tương tự, Power3 có a đếm đăng ký được sử dụng cho
các vòng lặp trong đó chương trình lặp lại một số lần cố định. Bằng cách sử dụng
một thanh ghi đặc biệt, phần cứng nhánh có thể xác định nhanh chóng liệu một
nhánh dựa trên thanh ghi đếm có khả năng phân nhánh hay không, vì giá trị của
thanh ghi được biết sớm trong chu kỳ thực hiện. Các thử nghiệm về giá trị của
thanh ghi đếm trong một lệnh nhánh sẽ tự động làm giảm thanh ghi đếm.
Cho rằng thanh ghi đếm và thanh ghi liên kết đã được đặt với phần cứng kiểm
soát các nhánh, và rằng một trong những vấn đề trong dự đoán chi nhánh là lấy địa
chỉ mục tiêu sớm trong đường ống (xem Phụ lục C) các kiến trúc sư quyền lực đã
quyết định sử dụng lần thứ hai các thanh ghi này. Hoặc đăng ký có thể giữ một địa
chỉ mục tiêu của một chi nhánh có điều kiện. Do đó, PowerPC bổ sung nhánh điều
kiện cơ bản của mình bằng hai hướng dẫn lấy địa chỉ mục tiêu từ các thanh ghi này
(BCLR , BCCTR). Hình D.23 cho thấy vài chục hướng dẫn đã được thêm vào; lưu ý
rằng cũng có một cơ sở rộng lớn cho điểm nổi thập phân.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-25

Lớp hướng Tên hướng dẫn Chức năng


dẫn
LHBRX, LWBRX, LDBRX Tải một nửa từ / từ / từ kép nhưng đảo ngược bằng cách đặt hàng.
Datatransfer SHBRX, SWBRX, SDBRX Lưu trữ một nửa từ / từ / từ kép nhưng đảo ngược bằng cách đặt hàng
LDQ, STQ Tải / lưu trữ ô tiêu đề vào một cặp đăng ký.
DRAN Tạo một số ngẫu nhiên trong một thanh ghi
CMPB So sánh các byte riêng lẻ trong một thanh ghi và đặt một byte khác
đăng ký byte bằng byte.
CMPRB So sánh một byte (x) với hai byte khác (yandz) và seta
điều kiện để cho biết nếu giá trị của y <= x <= z.
TIÊU CHUẨN, CRNAND,
CROR , Hoạt động logic trên thanh ghi điều kiện.
CRNOR, CRXOR, CREQV ,
CORC, CRANDC
So sánh một byte (x) với tám byte trong một thanh ghi khác và
ZCMPEQB
ALU đặt điều kiện để cho biết nếu x = bất kỳ trong số 8 byte
EXTSWSL Ký tên mở rộng từ và chuyển sang trái

POPCNTB, POPCNTW Đếm số 1s trong mỗi byte và đặt tổng số ở một byte khác.
POPCNTD Đếm số 1s trong mỗi từ và tổng số vị trí trong một từ khác.
Đếm số 1s trong một từ kép.
PRTYD, PRTYW Tính chẵn lẻ byte của các byte trong một từ hoặc từ kép.
BPERMD Cho phép các bit trong một từ kép, tạo ra một byte được hoán vị.

Hướng dẫn chuyển đổi từ / sang số thập phân mã hóa nhị phân (BCD)
CDTBCD, CDCBCD , hoặc
ADDGCS hoạt động trên hai giá trị BCD
BA, BCA Chi nhánh đến một địa chỉ tuyệt đối, có điều kiện & vô điều kiện
Kiểm soát BCCTR, BCCTRL Chi nhánh có điều kiện để giải quyết trong sổ đăng ký đếm, w / wolinking
chuyển
BCTSAR, BCTARL Chi nhánh có điều kiện để giải quyết trong Địa chỉ mục tiêu chi nhánh
đăng ký, w / wolinking
CLRBHRB, MFBHRBE Thao tác lịch sử nhánh cán đệm.
Điểm nổi
FRSQRTE Tính toán ước tính đối ứng của bình phương ,
Hướng dẫn
FTDIV, FTSQRT Các thử nghiệm để chia cho số 0 hoặc bình phương số âm
FSEL Kiểm tra đăng ký so với 0 và chọn một trong hai toán hạng để di chuyển
Điểm nổi thập phân Một loạt 48 hướng nội để hỗ trợ dấu phẩy động thập phân.
hoạt động

HÌNH D.23 Hướng dẫn bổ sung được cung cấp trong Power3. Hướng dẫn xoay có hai hình thức: một hình thức đặt điều
kiện đăng ký và một trong đó không. Có một bộ hướng dẫn chuỗi tải tối đa 32 byte từ một địa chỉ tùy ý đến một bộ các thanh ghi. Các
hướng dẫn này sẽ được loại bỏ trong các triển khai trong tương lai và do đó chúng tôi chỉ đề cập đến chúng ở đây.
D-26 Phụ lục D Khảo sát các kiến trúc tập lệnh

Hướng dẫn: Tiện ích mở rộng đa phương tiện của


RISC máy tính để bàn / máy chủ
Hỗ trợ cho các hoạt động đa phương tiện và đồ họa được phát triển theo nhiều giai đoạn,
bắt đầu vào năm 1996 với Intel MMX, MIPS MDMX, và SPARC VIS. Các phần mở
rộng này cho phép một thanh ghi được coi là nhiều số nguyên nhỏ độc lập (Dài 8 hoặc 16
bit) với các phép toán số học và logic được thực hiện song song trên tất cả các mục trong
một thanh ghi. Các phần mở rộng SIMD ban đầu này, đôi khi được gọi là SIMD đóng gói,
được phát triển thêm sau năm 2000 bằng cách mở rộng các thanh ghi, tách một phần hoặc
toàn bộ chúng khỏi mục đích chung hoặc các thanh ghi con trỏ nổi và bằng cách thêm hỗ
trợ cho các hoạt động điểm nổi song song. RISC-V đã dành một phần mở rộng cho các
hướng dẫn SIMD được đóng gói như vậy, nhưng các nhà thiết kế đã chọn tập trung vào
một phần mở rộng vector thực sự cho hiện tại. Phần mở rộng vector RV64V là một kiến
trúc vector và một tập lệnh vector thực sự tổng quát hơn đáng kể và thường có thể thực
hiện các thao tác được xử lý bởi các phần mở rộng SIMD bằng các thao tác vector.
Hình D.24 hiển thị cấu trúc cơ bản của các phần mở rộng SIMD trong ARM,
MIPS , Nguồn và SPARC. Lưu ý sự khác biệt trong cách các thanh ghi vectơ SIMD
có cấu trúc: tái sử dụng điểm nổi, mở rộng điểm nổi hoặc thêm các thanh ghi bổ sung.
Các khác biệt chính khác bao gồm hỗ trợ cho FP cũng như các số nguyên, hỗ trợ cho
các số nguyên 128 bit và các quy định cho các trường ngay lập tức dưới dạng toán
hạng trong các phép toán số nguyên và logic. Hướng dẫn tải và lưu trữ tiêu chuẩn
được sử dụng để di chuyển dữ liệu từ các thanh ghi SIMD sang bộ nhớ với các tiện
ích mở rộng đặc biệt để xử lý di chuyển ít hơn một thanh ghi SIMD đầy đủ. SPARC
VIS, một trong những tiện ích mở rộng sớm nhất của ISA cho đồ họa, bị hạn chế hơn
nhiều: chỉ thêm, trừ và nhân

ARMv8 MIPS64 R6 Công suất v3.0 SPARCv9

Tên của phần mở rộng ISA SIMD nâng cao SIMD MIPS64 Cơ sở Vector VIS
Kiến trúc
Ngày của phiên bản hiện tại 2011 2012 2015 1995
Thanh ghi vector: # x kích
thước 32 x 128 bit 32 x 128 bit 32 x 128 bit 32 x 64 bit
Sử dụng thanh ghi GP / FP Giống như các thanh
hoặc mở rộng đăng ký FP mở rộng đăng ký FP Độc lập ghi FP
bộ độc lập nhân đôi chiều rộng nhân đôi chiều rộng
Kích thước dữ liệu số nguyên 8, 16, 32, 64 8, 16, 32, 64 8, 16, 32, 64, 128 8,16, 32
Kích thước dữ liệu FP 32, 64 32, 64 32
Bắt chước cho số nguyên và Số học 5 bit
hoạt động logic 8 bit logic

HÌNH D.24 Cấu trúc của các phần mở rộng SIMD dành cho hỗ trợ đa phương tiện. Ngoài các cơ sở vector, The hàng
cuối cùng cho biết liệu tập lệnh SIMD có hỗ trợ ngay lập tức hay không (ví dụ: thêm vector ngay lập tức hoặc Vector ngay lập tức);
mục nhập nêu rõ kích thước của các phần mềm cho các ISA hỗ trợ chúng. Lưu ý rằng thực tế là một sự hiện diện ngay lập tức được
mã hóa trong không gian opcode và có thể được thêm vào bảng tiếp theo dưới dạng hướng dẫn bổ sung. Power 3 có Phần mở rộng
Vector-Scalar tùy chọn. Phần mở rộng Vector-Scalar xác định một tập hợp các thanh ghi vector chồng lên các thanh ghi FP và vector
thông thường, loại bỏ nhu cầu di chuyển dữ liệu qua lại các thanh ghi vector. Nó cũng hỗ trợ các hoạt động điểm nổi chính xác kép.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-27

được bao gồm, không có hỗ trợ FP và chỉ có hướng dẫn giới hạn cho các hoạt
động của phần tử bit; chúng tôi bao gồm nó trong Hình D.24 nhưng sẽ không đi
vào chi tiết hơn.
Hình D.25 hiển thị các hướng dẫn số học có trong các SIMD này phần mở rộng;
chỉ những người xuất hiện trong ít nhất hai phần mở rộng được bao gồm. MIPS
SIMD bao gồm nhiều hướng dẫn khác, cũng như phần mở rộng Power 3 Vector-
Scalar, chúng tôi không bao gồm. Một tính năng thường xuyên không được tìm thấy
trong các bộ vi xử lý đa năng là các hoạt động bão hòa. Độ bão hòa có nghĩa là khi
phép tính tràn, kết quả được đặt thành số dương lớn nhất hoặc số âm nhất, thay vì
phép tính modulo như trong hai số học bổ sung. Thường được tìm thấy trong các bộ
xử lý tín hiệu số (xem tiểu mục tiếp theo), các hoạt động bão hòa này rất hữu ích
trong các thói quen lọc. Một phần mở rộng phổ biến khác là các hướng dẫn để tích
lũy các giá trị trong một thanh ghi duy nhất; hướng dẫn sản phẩm chấm một hướng
dẫn tối đa / tối thiểu là các ví dụ điển hình.
Ngoài các hướng dẫn số học, các bổ sung phổ biến nhất là các thao tác và
hướng dẫn logic và bitwise để thực hiện phiên bản hoán vị và đóng gói các thành
phần vào các thanh ghi SIMD. Những bổ sung này được tóm tắt trong Hình D.26,
Cuối cùng, cả ba tiện ích mở rộng đều hỗ trợ các hoạt động của SIMD FP, như
được tóm tắt trong Hình D.27.

Thể loại hướng dẫn ARM SIMD nâng cao SIMD MIPS Cơ sở Vector điện

Thêm / trừ 16B, 8H, 4W; 2 D 16B, 8H; 4W; 2 D 16B, 8H, 4W, 2 D, Q
Saturation add / sub 16B, 8H, 4W; 2 D 16B, 8H; 4W; 2 D 16B, 8H, 4W, 2 D, Q
Giá trị tuyệt đối của sự khác biệt 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Liền kề thêm & trừ (theo cặp) 16B, 8H, 4W 16B, 8H, 4W 16B, 8H, 4W; 2 D
Trung bình 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Dot thêm sản phẩm, chấm trừ sản phẩm 16B, 8H, 4W 16B, 8H, 4W 16B, 8H, 4W; 2 D
Chia: đã ký, chưa ký 16B, 8H, 4W 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Nhân: đã ký, chưa ký 16B, 8H, 4W 16B, 8H, 4W 16B, 8H, 4W; 2 D
Nhân thêm, nhân trừ 16B, 8H, 4W 16B, 8H, 4W 16B, 8H, 4W; 2 D
Tối đa, đã ký và không dấu 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Tối thiểu, đã ký và không dấu 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Modulo, đã ký và không ký 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Đồng hành 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
So sánh <, <=, đã ký, chưa ký 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q

HÌNH D.25 Tóm tắt các hướng dẫn SIMD số học. B là viết tắt của byte (8 bit), H cho một nửa từ (16 bit) và W cho từ (32 bit),
D cho từ kép (64 bit) và Q cho từ quad (128 bit). Do đó, 8B có nghĩa là một hoạt động trên 8 byte trong một lệnh duy nhất. Lưu ý rằng
một số hướng dẫn, chẳng hạn như cộng / trừ liền kề hoặc nhân các kết quả tạo ra có chiều rộng gấp đôi chiều rộng của các đầu vào (ví
dụ:. nhân trên 16 byte tạo ra 8 kết quả nửa chữ). Sản phẩm chấm là một bội số và tích lũy. Các hướng dẫn VIS SPARC chủ yếu nhắm
vào đồ họa và được cấu trúc phù hợp.
D-28 Phụ lục D Khảo sát các kiến trúc tập lệnh

Thể loại hướng dẫn ARM SIMD nâng cao SIMD MIPS Cơ sở Vector điện

Chuyển sang phải / trái, logic, số học 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q 16B, 8H, 4W; 2 D; Q
Đếm số không dẫn đầu hoặc theo dõi 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
và / hoặc / xor Q Q Q
Bit chèn và trích xuất 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Số lượng dân số 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D; Q
Interleave chẵn / lẻ, trái / phải 16B, 8H, 4W; 2 D 6B, 8H, 4W; 2 D
Gói chẵn / lẻ 16B, 8H, 4W; 2 D 6B, 8H, 4W; 2 D
Xáo trộn 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D
SPLAT 16B, 8H, 4W; 2 D 16B, 8H, 4W; 2 D

HÌNH D.26 Tóm tắt các hướng dẫn logic, bitwise, permute và pack / unpack, sử dụng cùng định dạng với hình trước. Khi
có một toán hạng duy nhất, hướng dẫn áp dụng cho toàn bộ thanh ghi; đối với các hoạt động logic không có sự khác biệt. Interleave tập hợp
các yếu tố (tất cả đều, lẻ, ngoài cùng bên trái hoặc ngoài cùng bên phải) từ hai thanh ghi khác nhau để tạo một giá trị; nó có thể được sử dụng
để giải nén. Gói di chuyển các phần tử chẵn hoặc lẻ từ hai thanh ghi khác nhau sang nửa ngoài cùng bên trái và ngoài cùng bên phải của kết
quả. Shuffle tạo một từ hai thanh ghi dựa trên mặt nạ chọn nguồn nào cho mỗi mục. SPLAT sao chép một giá trị vào mỗi mục trong một thanh
ghi.

Thể loại khởi xướng ARM SIMD nâng cao SIMD MIPS Cơ sở Vectory điện
FP thêm, trừ, nhân, chia 4W, 2D 4W, 2D 4W, 2D
FP nhân thêm / trừ 4W, 2D 4W, 2D 4W, 2D
FP tối đa / tối thiểu 4W, 2D 4W, 2D 4W, 2D
FP SQRT và 1 / SQRT 4W, 2D 4W, 2D 4W, 2D
So sánh FP 4W, 2D 4W, 2D 4W, 2D
FP Chuyển đổi sang / từ số nguyên 4W, 2D 4W, 2D 4W, 2D

HÌNH D.27 Tóm tắt điểm nổi, sử dụng cùng định dạng với hình trước đó.

Hướng dẫn: Phần mở rộng xử lý tín hiệu số của các


RISC nhúng
Cả Thumb2 và microMIPS32 đều cung cấp hướng dẫn cho DSP (Xử lý tín hiệu
số) và các hoạt động đa phương tiện. Trong Thumb2, đây là một phần của tập
lệnh cốt lõi; trong microMIPS32, chúng là một phần của phần mở rộng DSP. Các
tiện ích mở rộng này, được mã hóa dưới dạng hướng dẫn 32 bit, ít rộng hơn so
với hỗ trợ đa phương tiện và đồ họa được cung cấp trong các tiện ích mở rộng
SIMD / Vector của MIPS64 hoặc ARMv8 (AArch64). Giống như các phần mở
rộng toàn diện hơn, các phần mở rộng trong Thumb2 và microMIPS32 cũng dựa
vào SIMD được đóng gói, nhưng chúng sử dụng các thanh ghi số nguyên hiện có,
với một phần mở rộng nhỏ để cho phép tích lũy rộng và chỉ hoạt động trên dữ
liệu số nguyên. RISC-V đã chỉ định rằng phần mở rộng của Pv sẽ hỗ trợ SIMD số
nguyên được đóng gói bằng các thanh ghi dấu phẩy động, nhưng tại thời điểm
xuất bản, thông số kỹ thuật không được hoàn thành.
D.2 Khảo sát về Kiến trúc RISC cho Máy tính để bàn, Máy chủ và Máy tính nhúng D-29

Chức năng Thumb-2 microMIPS32DSP


Thêm / Trừ 4B, 2H 4B, 2Q15
Thêm / Trừ với độ bão hòa 4B, 2H 4B, 2Q15, Q31
Thêm / Trừ với Exchange (trao đổi nửa từ trong rt, sau đó thêm trước
2H
nửa từ và trừ thứ hai) với độ bão hòa tùy chọn
Giảm bằng cách thêm (tổng các giá trị) 4B
Giá trị tuyệt đối 2Q15, Q31
Giảm / tăng chính xác (giảm hoặc tăng độ chính xác của giá trị) 2B, Q15, 2Q15, Q31
Chuyển đổi: trái, phải, logic và số học, với độ bão hòa tùy chọn 4B, 2H
Nhân lên 2H 2B, 2H, 2Q15
Nhân thêm / trừ (vào GPR hoặc thanh ghi tích lũy trong MIPS) 2H 2Q15
Bước nhân phức tạp (2 phép nhân và phép cộng / phép trừ) 2H 2Q15
Nhân và tích lũy (bằng cách cộng hoặc trừ) Câu 15, Câu 31
Sao chép bit B, H
So sánh: =, <, <=, đặt trường điều kiện 4B, 2H
Chọn (sử dụng bit điều kiện để chọn byte hoặc nửa từ từ hai toán hạng) 4B, 2H
Gói chọn một nửa từ từ mỗi toán hạng H
Trích xuất Câu 63
Di chuyển từ / đến tích lũy DW

HÌNH D.28 Tóm tắt hai thao tác DSP RISC nhúng, hiển thị các loại dữ liệu cho mỗi thao tác. A trống chỉ ra rằng thao
tác không được hỗ trợ dưới dạng một lệnh duy nhất. Số lượng byte thường không được ký. Bước nhân phức tạp thực hiện phép nhân
các số phức trong đó mỗi thành phần là giá trị Q15. ARM sử dụng thanh ghi điều kiện tiêu chuẩn của nó, trong khi MIPS thêm một
tập hợp các bit điều kiện làm một phần của trạng thái trong phần mở rộng DSP.

Các hoạt động DSP thường bao gồm các hàm và hoạt động đại số tuyến tính như
các phép toán; các hoạt động này tạo ra kết quả trung gian sẽ lớn hơn các đầu vào.
Trong Thumb2, điều này được xử lý bởi một tập hợp các hoạt động tạo ra kết quả 64
bit bằng cách sử dụng một cặp thanh ghi số nguyên. Trong microMIPS32 DSP, có 4
thanh ghi tích lũy 64 bit, bao gồm thanh ghi Hi-Lo, đã tồn tại để thực hiện nhân và
chia số nguyên. Cả hai kiến trúc đều cung cấp số học song song bằng cách sử dụng
byte, nửa từ và từ, như trong các phần mở rộng đa phương tiện trong ARMv8 và
MIPS64. Ngoài ra, phần mở rộng MIPS DSP xử lý dữ liệu phân đoạn, dữ liệu đó
được sử dụng nhiều trong các hoạt động DSP. Các mục dữ liệu phân số có một bit ký
hiệu và các bit còn lại được sử dụng để biểu diễn phân số, cung cấp một phạm vi các
giá trị từ -1.0 đến 0.9999 (theo số thập phân). MIPS DSP hỗ trợ hai kích thước dữ
liệu phân số Q15 và Q31 mỗi kích thước với một bit ký hiệu và 15 hoặc 31 bit phân
số.
Hình D.28 hiển thị các hoạt động phổ biến sử dụng cùng ký hiệu như đã được
sử dụng trong Hình D.25Hãy nhớ rằng tập lệnh 32 bit cơ bản cung cấp chức năng
bổ sung, bao gồm thao tác số học cơ bản, logic và bit.
D-30 Phụ lục D Khảo sát các kiến trúc tập lệnh

IBM360 / 370 Intel 8086 Motorola68000 DECVAX


Ngày công bố 1964/1970 1978 1980 1977
Kích thước hướng dẫn
(bit) 16,32,48 8, 16, 24, 32, 40, 48 16, 32, 48, 64, 80 8, 16, 24, 32 , ... ,
432
Địa chỉ (kích thước, mô
hình) 24 bit, phẳng / 4 + 16 bit ,
24 bit, phẳng 32 bit, phẳng
31 bit, phẳng phân khúc
Dữ liệu được căn chỉnh? Có 360 / Không 370 Không Căn chỉnh 16 bit Không
Chế độ địa chỉ dữ liệu 2/3 5 9 = 14
Sự bảo vệ Trang Không ai Không bắt buộc Trang
Kích thước trang 2KB & 4KB - 0,25 đến 32 KB 0,5 KB
Tôi / O Mã nguồn Mã nguồn Ký ức được ánh xạ Ký ức được ánh xạ
Thanh ghi số nguyên (kích
thước, mô hình , 16 GPR × 32 bit 8 dành riêng 8 dữ liệu và 8 địa chỉ 15 GPR × 32 bit
số) dữ liệu × 16 bit × 32 bit
Điểm nổi riêng biệt 4 × 64 bit Tùy chọn: 8 × 80 bit Tùy chọn: 8 × 80 bit 0
sổ đăng ký
Định dạng điểm nổi IBM (nổi IEEE 754 đơn , IEEE 754 đơn , THÁNG 12
thập lục phân) gấp đôi, mở rộng gấp đôi, mở rộng

HÌNH D.29 Tóm tắt bốn kiến trúc thập niên 1970. Không giống như các kiến trúc trong Hình D.1, có rất ít thỏa thuận giữa những kiến
trúc trong bất kỳ thể loại. (Xem Phần D.3 để biết thêm chi tiết về 80 × 86 và Phần D.4 để biết mô tả về VAX.)

Kết luận
Khảo sát này bao gồm các chế độ địa chỉ, định dạng hướng dẫn và hầu hết tất cả
các hướng dẫn được tìm thấy trong 8 kiến trúc RISC. Mặc dù các phần sau tập
trung vào sự khác biệt, nhưng sẽ không thể bao gồm 8 kiến trúc trong vài trang
này nếu không có nhiều điểm tương đồng. Trên thực tế, chúng tôi sẽ đoán rằng
hơn 90% các hướng dẫn được thực hiện cho bất kỳ kiến trúc nào trong số này sẽ
được tìm thấy Số liệu D.9 thông qua D.13 Để đối chiếu tính đồng nhất này ,. Hình
D.29 đưa ra một bản tóm tắt cho bốn kiến trúc từ những năm 1970 theo định dạng
tương tự như được hiển thị trong Hình D.1(Vì không thể viết một phần duy nhất
theo phong cách này cho các kiến trúc đó, ba phần tiếp theo bao gồm 80 × 86,
VAX và IBM 360/370.) Trong lịch sử điện toán, chưa bao giờ có thỏa thuận rộng
rãi như vậy về kiến trúc máy tính như đã có kể từ khi các ý tưởng RISC xuất hiện
vào những năm 1980.

D.3 Intel 80 × 86

Giới thiệu
MIPS là tầm nhìn của một kiến trúc sư duy nhất. Các mảnh của kiến trúc này phù
hợp độc đáo với nhau và toàn bộ kiến trúc có thể được mô tả ngắn gọn. Đó không
phải là
D.3 Intel 80 × 86 D-31

trường hợp 80 × 86: Đây là sản phẩm của một số nhóm độc lập đã phát triển kiến trúc
hơn 20 năm, thêm các tính năng mới vào bộ hướng dẫn ban đầu vì bạn có thể thêm
quần áo vào túi đóng gói. Dưới đây là các mốc quan trọng 80 × 86 :
■ 1978 Kiến trúc Intel 8086 được công bố là ngôn ngữ lắp ráp, phần mở rộng
tương thích của Intel 8080, bộ vi xử lý 8 bit thành công. 8086 là kiến trúc 16
bit, với tất cả các thanh ghi bên trong rộng 16 bit. Trong khi 8080 là một máy
tích lũy đơn giản, 8086 đã mở rộng kiến trúc với các thanh ghi bổ sung. Do gần
như mọi thanh ghi đều có một mục đích sử dụng chuyên dụng, 8086 nằm ở đâu
đó giữa máy tích lũy và máy đăng ký đa năng và có thể được gọi là an tích lũy
mở rộng Máy móc.
■ 1980 Bộ đồng xử lý điểm nổi Intel 8087 được công bố. Kiến trúc này mở rộng
8086 với khoảng 60 hướng dẫn dấu phẩy động. Các kiến trúc sư của nó đã từ
chối các bộ tích lũy mở rộng để đi với một loạt các ngăn xếp và đăng ký, về cơ
bản là một ngăn xếp mở rộng kiến trúc: Một bộ hướng dẫn ngăn xếp hoàn chỉnh
được bổ sung bởi một bộ hướng dẫn bộ nhớ đăng ký giới hạn.
■ 1982, 80286 đã mở rộng kiến trúc 8086 bằng cách tăng không gian địa chỉ
lên 24 bit, bằng cách tạo một mô hình bảo vệ và ánh xạ bộ nhớ phức tạp và
bằng cách thêm một vài hướng dẫn để làm tròn bộ hướng dẫn và thao tác
mô hình bảo vệ. Vì điều quan trọng là chạy 8086 chương trình mà không
thay đổi, 80286 cung cấp a chế độ địa chỉ thực để làm cho máy trông giống
như một chiếc 8086.
■ 1985, 80386 đã mở rộng kiến trúc 80286 lên 32 bit. Ngoài kiến trúc 32 bit với
các thanh ghi 32 bit và không gian địa chỉ 32 bit, 80386 đã thêm các chế độ địa
chỉ mới và các thao tác bổ sung. Các hướng dẫn được thêm vào làm cho 80386
gần như một máy đăng ký đa năng. 80386 cũng thêm hỗ trợ phân trang ngoài
địa chỉ được phân đoạn. Giống như 80286, 80386 có chế độ để thực thi 8086
chương trình mà không thay đổi.
Lịch sử này minh họa tác động của còng tay vàng Vàng của khả năng tương thích
trên 80 × 86, vì cơ sở phần mềm hiện có ở mỗi bước là quá quan trọng để gây
nguy hiểm cho những thay đổi kiến trúc quan trọng. May mắn thay, 80486 tiếp
theo vào năm 1989, Pentium năm 1992 và P6 năm 1995 nhằm mục đích hiệu suất
cao hơn, chỉ có bốn hướng dẫn được thêm vào bộ hướng dẫn hiển thị của người
dùng: ba để giúp xử lý đa xử lý cộng với hướng dẫn di chuyển có điều kiện.
Từ năm 1997, Intel đã thêm hàng trăm hướng dẫn để hỗ trợ đa phương tiện bằng
cách vận hành trên nhiều loại dữ liệu hẹp hơn trong một chiếc đồng hồ (xem Phụ lục
A)Các hướng dẫn SIMD hoặc vector này chủ yếu được sử dụng trong các thư viện
hoặc trình điều khiển được mã hóa bằng tay và hiếm khi được tạo bởi các trình biên
dịch. Phần mở rộng đầu tiên, được gọi là MMX, xuất hiện vào năm 1997. Nó bao
gồm 57 hướng dẫn đóng gói và giải nén nhiều byte, từ 16 bit hoặc từ kép 32 bit thành
các thanh ghi 64 bit và thực hiện số học dịch chuyển, logic và số nguyên trên các mục
dữ liệu hẹp song song. Nó hỗ trợ cả số học bão hòa và không bão hòa. MMX sử dụng
các thanh ghi bao gồm ngăn xếp dấu phẩy động và do đó không có trạng thái mới cho
các hệ điều hành để lưu.
D-32 Phụ lục D Khảo sát các kiến trúc tập lệnh

Năm 1999, Intel đã thêm 70 hướng dẫn khác, được dán nhãn SSE, như một
phần của Pentium III. Những thay đổi chính là thêm tám thanh ghi riêng biệt,
tăng gấp đôi chiều rộng của chúng thành 128 bit và thêm một kiểu dữ liệu dấu
phẩy động chính xác. Do đó, bốn thao tác dấu phẩy động 32 bit có thể được thực
hiện song song. Để cải thiện hiệu suất bộ nhớ, SSE bao gồm các hướng dẫn tìm
nạp bộ đệm cộng với hướng dẫn lưu trữ phát trực tuyến bỏ qua bộ nhớ cache và
ghi trực tiếp vào bộ nhớ.
Năm 2001, Intel đã thêm 144 hướng dẫn khác, lần này được dán nhãn SSE2.
Kiểu dữ liệu mới là số học chính xác kép, cho phép các cặp hoạt động dấu phẩy
động 64 bit song song. Hầu như tất cả 144 hướng dẫn này là các phiên bản của
hướng dẫn MMX và SSE hiện có hoạt động song song trên 64 bit dữ liệu. Thay
đổi này không chỉ cho phép các hoạt động đa phương tiện, mà còn cung cấp cho
trình biên dịch một mục tiêu khác cho các hoạt động dấu phẩy động so với kiến
trúc ngăn xếp độc đáo. Trình biên dịch có thể chọn sử dụng tám thanh ghi SSE
làm thanh ghi dấu phẩy động như được tìm thấy trong các máy RISC. Sự thay
đổi này đã tăng hiệu suất trên Pentium 4, bộ vi xử lý đầu tiên bao gồm các hướng
dẫn SSE2. Tại thời điểm công bố, Pentium 4 1,5 GHz nhanh hơn 1,24 lần so với
Pentium III 1 GHz cho Specint2000 (cơ sở), nhưng nó nhanh hơn 1,88 lần đối
với Specfp2000 (cơ sở).
Năm 2003, một công ty khác ngoài Intel đã tăng cường kiến trúc IA-32 lần
này. AMD đã công bố một bộ phần mở rộng kiến trúc để tăng không gian địa chỉ
cho 32 đến 64 bit. Tương tự như quá trình chuyển đổi từ 16 - sang không gian địa
chỉ 32 bit vào năm 1985 với 80386, AMD64 mở rộng tất cả các thanh ghi thành
64 bit. Nó cũng tăng số lượng thanh ghi lên mười sáu và có 16 thanh ghi 128 bit
để hỗ trợ XMM, AMD trả lời cho SSE2. Thay vì mở rộng tập lệnh, thay đổi
chính là thêm một chế độ mới được gọi chế độ dài xác định lại việc thực hiện tất
cả các hướng dẫn IA-32 với địa chỉ 64 bit. Để giải quyết số lượng thanh ghi lớn
hơn, nó thêm một tiền tố mới vào hướng dẫn. AMD64 vẫn có chế độ 32 bit
tương thích ngược với tập lệnh Intel tiêu chuẩn, cho phép chuyển đổi duyên dáng
hơn sang địa chỉ 64 bit so với HP / Intel Itanium. Intel sau đó đã đi theo sự dẫn
dắt của AMD, thực hiện các thay đổi gần như giống hệt nhau để hầu hết phần
mềm có thể chạy trên phiên bản địa chỉ 64 bit của 80 × 86 mà không thay đổi.

Bất kể thất bại nghệ thuật của 80 × 86, hãy nhớ rằng có nhiều trường hợp của
gia đình kiến trúc này hơn bất kỳ máy chủ hoặc bộ xử lý máy tính để bàn nào
khác trên thế giới. Tuy nhiên, tổ tiên ca rô của nó đã dẫn đến một kiến trúc khó
giải thích và không thể yêu.
Chúng tôi bắt đầu giải thích với các thanh ghi và chế độ địa chỉ, chuyển sang
các phép toán số nguyên, sau đó bao gồm các phép toán dấu phẩy động và kết
thúc bằng kiểm tra mã hóa lệnh.

80 × 86 Đăng ký và Chế độ địa chỉ dữ liệu


Sự phát triển của tập lệnh có thể được nhìn thấy trong các thanh ghi của 80 × 86
(Hình D.30). Các thanh ghi gốc được hiển thị theo kiểu màu đen, với các phần mở
rộng của 80386 được hiển thị trong một màu sáng hơn, một sơ đồ tô màu theo sau
trong các hình tiếp theo.
D.3 Intel 80 × 86 D-33

80x386, 80x486, Pentium 80x86, 80x286


số
31 15 8 7 0

GPR 0 EAX AX AH AL Tích lũy

GPR 1 ECX CX CH CL Đếm reg: chuỗi, vòng lặp

GPR 2 EDX DX DH DL Dữ liệu reg: nhân, chia

GPR 3 EBX BX BH BL Bổ sung cơ sở. reg

GPR 4 ESP SP Chồng ptr.

GPR 5 EBP HA Cơ sở ptr. (đối với cơ sở của stack seg.)

GPR 6 ESI SI Chỉ mục reg, chuỗi nguồn ptr.

GPR 7 EDI DI Chỉ số reg, chuỗi số phận. ptr.

CS Phân đoạn mã ptr.


SS Phân khúc ngăn xếp ptr. (đỉnh ngăn xếp)
DS Phân khúc dữ liệu ptr.
ES Phân đoạn dữ liệu bổ sung ptr.
FS Phân khúc dữ liệu ptr. 2
GS Phân khúc dữ liệu ptr. 3

PC EIP IP Hướng dẫn ptr. (PC)

HIỆU QUẢ FLAGS Mã điều kiện


79 0
FPR 0
FPR 1
FPR 2
FPR 3
FPR 4
FPR 5
FPR 6
FPR 7
15 0 Đầu ngăn xếp FP ,
Tình trạng
Mã điều kiện FP

HÌNH D.30 80 × 86 đã phát triển theo thời gian và do đó, bộ đăng ký của nó cũng vậy. Các bộ ban đầu được hiển thị
trong màu đen và bộ mở rộng màu xám. 8086 chia bốn thanh ghi đầu tiên làm đôi để chúng có thể được sử dụng làm thanh ghi 16
bit hoặc hai thanh ghi 8 bit. Bắt đầu với 80386, tám thanh ghi hàng đầu được mở rộng thành 32 bit và cũng có thể được sử dụng
làm thanh ghi mục đích chung. Các thanh ghi dấu phẩy động ở phía dưới rộng 80 bit và mặc dù chúng trông giống như các thanh
ghi thông thường nhưng chúng không có. Họ thực hiện một ngăn xếp, với đỉnh ngăn xếp được chỉ ra bởi thanh ghi trạng thái. Một
toán hạng phải là đỉnh của ngăn xếp và cái còn lại có thể là bất kỳ trong bảy thanh ghi khác bên dưới đỉnh của ngăn xếp.
D-34 Phụ lục D Khảo sát các kiến trúc tập lệnh

80386 về cơ bản đã mở rộng tất cả các thanh ghi 16 bit (ngoại trừ các thanh ghi
phân đoạn) thành 32 bit, đặt tiền tố cho một E E đến tên của chúng để chỉ ra
phiên bản 32 bit. Các hướng dẫn truyền số học, logic và truyền dữ liệu là các
hướng dẫn hai toán tử cho phép các kết hợp được hiển thị trong Hình D.31.
Để giải thích các chế độ địa chỉ, chúng ta cần ghi nhớ liệu chúng ta đang nói
về chế độ 16 bit được sử dụng bởi cả chế độ 8086 và 80286 hoặc 32 bit có sẵn
trên 80386 và những người kế nhiệm. Bảy chế độ địa chỉ bộ nhớ dữ liệu được hỗ
trợ là
■ Tuyệt đối
■ Đăng ký gián tiếp
■ Dựa
■ Lập chỉ mục
■ Dựa vào chỉ số với sự dịch chuyển
■ Dựa trên quy mô được lập chỉ mục
■ Dựa trên quy mô được lập chỉ mục và dịch chuyển
Dịch chuyển có thể là 8 hoặc 32 bit ở chế độ 32 bit và 8 hoặc 16 bit ở chế độ
16 bit. Nếu chúng ta đếm kích thước của địa chỉ dưới dạng chế độ địa chỉ riêng
biệt, tổng cộng là 11 chế độ địa chỉ.
Mặc dù toán hạng bộ nhớ có thể sử dụng bất kỳ chế độ địa chỉ nào, có những hạn
chế về những thanh ghi nào có thể được sử dụng trong chế độ. Phần Mã hóa hướng
dẫn 80 × 86 trên trang K-11 cung cấp đầy đủ các hạn chế đối với các thanh ghi,
nhưng mô tả sau đây về các chế độ địa chỉ cung cấp các tùy chọn đăng ký cơ bản :
■ Tuyệt đốiChuyển động với chuyển vị 16 bit hoặc 32 bit, tùy thuộc vào chế
độ.

■ Đăng ký gián tiếp-BX, SI, DI ở chế độ 16 bit và EAX, ECX, EDX, EBX , ESI ,
và EDI ở chế độ 32 bit.

Nguồn / loại toán hạng đích Nguồn thứ hai

Đăng ký Đăng ký
Đăng ký Ngay lập tức
Đăng ký Ký ức
Ký ức Đăng ký
Ký ức Ngay lập tức

HÌNH D.31 Các loại hướng dẫn cho các hướng dẫn truyền dữ liệu, logic và số học.
80 × 86 cho phép kết hợp được hiển thị. Hạn chế duy nhất là không có chế độ bộ nhớ. Immediates có thể
dài 8, 16 hoặc 32 bit; một thanh ghi là bất kỳ một trong 14 thanh ghi chính trong Hình D.30 (không phải IP
hoặc FLAGS).
D.3 Intel 80 × 86 D-35

■ Chế độ dựa với chuyển vị 8 bit hoặc 16 bit / 32 bit-HA, BX, SI , và DI ở chế
độ 16 bit và EAX, ECX, EDX, EBX, ESI , và EDI ở chế độ 32 bit. Độ dịch
chuyển là 8 bit hoặc kích thước của chế độ địa chỉ: 16 hoặc 32 bit. (Intel đưa
ra hai tên khác nhau cho chế độ địa chỉ duy nhất này , dựa trên và lập chỉ
mục, nhưng về cơ bản chúng giống hệt nhau và chúng tôi kết hợp chúng.
Cuốn sách này sử dụng địa chỉ được lập chỉ mục để có nghĩa là một cái gì
đó khác nhau, giải thích tiếp theo.)

■ Lập chỉ mụcĐịa chỉ của chúng tôi là tổng của hai thanh ghi. Các kết hợp
cho phép là BX + SI, BX + DI, BP + SI , và HA + DIChế độ này được gọi.dựa
trên lập chỉ mục trên 8086. (Chế độ 32 bit sử dụng chế độ địa chỉ khác để
có được hiệu ứng tương tự.)

■ Dựa trên chỉ số với chuyển vị 8 hoặc 16 bitĐịa chỉ là tổng của chuyển vị và
nội dung của hai thanh ghi. Các hạn chế tương tự đối với các thanh ghi
được áp dụng như trong chế độ được lập chỉ mục.

■ Cơ sở cộng với quy mô được lập chỉ mụcChế độ địa chỉ này và tiếp theo đã
được thêm vào 80386 và chỉ khả dụng ở chế độ 32 bit. Việc tính toán địa chỉ là

Thanh ghi cơ sở +2Quy mô × Chỉ mục × đăng ký ,

Ở đâu Quy mô có giá trị 0, 1, 2 hoặc 3; Chỉ số đăng ký có thể là bất kỳ trong
số tám thanh ghi chung 32 bit ngoại trừ ESP; và Đăng ký cơ sở có thể là bất kỳ
trong số tám thanh ghi chung 32 bit.
■ Cơ sở cộng với chỉ số tỷ lệ với chuyển vị 8 hoặc 32 bitĐịa chỉ là địa chỉ
tổng dịch chuyển và địa chỉ được tính theo chế độ thu nhỏ ngay phía trên.
Các hạn chế tương tự trên các thanh ghi được áp dụng.
80 × 86 sử dụng địa chỉ Little Endian.
Hình D.32 hiển thị các tùy chọn ánh xạ bộ nhớ trên các thế hệ 80 × 86 máy
móc.
Lập trình viên ngôn ngữ lắp ráp rõ ràng phải chỉ định đăng ký phân đoạn nào
sẽ được sử dụng với một địa chỉ, bất kể chế độ địa chỉ nào được sử dụng. Để tiết
kiệm không gian trong hướng dẫn, các thanh ghi phân đoạn được chọn tự động
tùy thuộc vào thanh ghi địa chỉ nào được sử dụng. Các quy tắc rất đơn giản:
Tham chiếu đến hướng dẫn (IP) sử dụng thanh ghi phân đoạn mã (CS), tham
chiếu đến ngăn xếp (BP hoặc SP) sử dụng thanh ghi phân đoạn ngăn xếp (SS) và
thanh ghi phân đoạn mặc định cho các thanh ghi khác là dữ liệu đăng ký phân
đoạn (DS). Phần tiếp theo giải thích làm thế nào họ có thể được ghi đè.

Hoạt động số nguyên 80 × 86


8086 cung cấp hỗ trợ cho cả 8 bit (byte) và 16-bit (được gọi là từ) các loại dữ liệu.
Sự phân biệt kiểu dữ liệu áp dụng cho các hoạt động đăng ký cũng như truy cập
bộ nhớ. 80386 thêm địa chỉ và dữ liệu 32 bit, được gọi từ képHầu hết.
D-36 Phụ lục D Khảo sát các kiến trúc tập lệnh

Chế độ thực Chế độ bảo vệ


(8086) (80286) (80386, 80486, Pentium)
Địa chỉ logic Địa chỉ logic Địa chỉ logic

Phân đoạn Bù đắp Phân đoạn Bù đắp Phân đoạn Bù đắp

16 12 4 16 16 16 32

16
24 32

20
Địa chỉ vật lý Phân đoạn Phân đoạn

24 Địa chỉ tuyến tính 32

Địa chỉ vật lý 20 12

10 10

Phân
trang 20 20

32

Địa chỉ vật lý

HÌNH D.32 Sơ đồ phân đoạn ban đầu của 8086 được hiển thị ở bên trái. Tất cả các bộ xử lý 80 × 86 hỗ trợ phong cách này
địa chỉ, được gọi chế độ thựcNó chỉ đơn giản là lấy nội dung của một thanh ghi phân đoạn, dịch chuyển nó sang lại 4 bit và thêm nó
vào phần bù 16 bit, tạo thành một địa chỉ vật lý 20 bit. 80286 (giữa) đã sử dụng nội dung của thanh ghi phân đoạn để chọn một mô tả
phân đoạn, bao gồm địa chỉ cơ sở 24 bit trong số các mục khác. Nó được thêm vào phần bù 16 bit để tạo thành địa chỉ vật lý 24 bit.
80386 và người kế nhiệm (phải) mở rộng địa chỉ cơ sở này trong bộ mô tả phân đoạn thành 32 bit và cũng thêm một lớp phân trang tùy
chọn bên dưới phân đoạn. Địa chỉ tuyến tính 32 bit được hình thành đầu tiên từ phân đoạn và bù, sau đó địa chỉ này được chia thành hai
trường 10 bit và bù trang 12 bit. Trường 10 bit đầu tiên chọn mục nhập trong bảng trang cấp một và sau đó mục này được sử dụng kết
hợp với trường 10 bit thứ hai để truy cập bảng trang cấp hai để chọn 20 bit trên của địa chỉ vật lý . Chuẩn bị địa chỉ 20 bit này cho
trường 12 bit cuối cùng cung cấp địa chỉ vật lý 32 bit. Phân trang có thể được tắt, xác định lại địa chỉ tuyến tính 32 bit là địa chỉ vật lý.
Lưu ý rằng không gian địa chỉ 80 × 86 phẳng phẳng của đơn giản bằng cách tải cùng một giá trị trong tất cả các thanh ghi phân đoạn;
nghĩa là, nó không phải là vấn đề mà đăng ký phân khúc được chọn.

mọi hoạt động đều hoạt động trên cả dữ liệu 8 bit và một kích thước dữ liệu dài
hơn. Kích thước đó được xác định bởi chế độ và là 16 hoặc 32 bit.
Rõ ràng một số chương trình muốn hoạt động trên dữ liệu của cả ba kích cỡ, vì
vậy các kiến trúc sư 80 × 86 cung cấp một cách thuận tiện để chỉ định từng phiên
bản mà không mở rộng đáng kể kích thước mã. Họ quyết định rằng hầu hết các
chương trình sẽ bị chi phối bởi dữ liệu 16 hoặc 32 bit và do đó, thật hợp lý khi có
thể đặt kích thước lớn mặc định. Kích thước mặc định này được đặt bởi một bit
trong thanh ghi phân đoạn mã. Để ghi đè kích thước mặc định, 8 bit tiền tố được
đính kèm với hướng dẫn để báo cho máy sử dụng kích thước lớn khác cho hướng
dẫn này.
D.3 Intel 80 × 86 D-37

Hướng dẫn Chức năng

Tên JE nếu bằng (CC) {IP tên}; IPIP 128 tên IP + 128 IP tên
Tên JMP SP SPTHER 2; M [SS: SP] IP + 5; SP SP 2;
Tên CALLF, seg M [SS: SP] CS; IP tên; CS seg;
MOVW BX, [DI + 45] BX 16M [DS: DI + 45]
SP SPTHER 2; M [SS: SP] SI
ĐÚNG SI DI M [SS: SP]; SP SP + 2
POP DI AX AX + 6765
THÊM AX, # BX BX1..15## 0
6765 SHL BX, 1 Đặt cờ CC với DX & 42
KIỂM TRA DX, M [ES: DI] số 8M [DS: SI]; DI DI + 1; SI SI + 1
# 42 MOVSB
HÌNH D.33 Một số hướng dẫn 80 × 86 điển hình và chức năng của chúng. Một danh sách các
hoạt động thường xuyên xuất hiện trong Hình D.34 Chúng tôi sử dụng chữ viết tắt. SR: X để chỉ ra sự hình
thành của một địa chỉ với đăng ký phân khúc SR và bù đắp X Địa chỉ hiệu quả này tương ứng với. SR: X là
(SR <<4) + X Các. GỌI tiết kiệm IP của hướng dẫn tiếp theo và hiện tại CS trên ngăn xếp.

Giải pháp tiền tố được mượn từ 8086, cho phép nhiều tiền tố sửa đổi hành vi
hướng dẫn. Ba tiền tố ban đầu ghi đè lên thanh ghi phân đoạn mặc định, khóa bus
để thực hiện semaphore hoặc lặp lại lệnh sau cho đến khi CX đếm ngược về 0.
Tiền tố cuối cùng này được dự định kết hợp với một lệnh di chuyển byte để di
chuyển một số byte khác nhau. 80386 cũng đã thêm một tiền tố để ghi đè kích
thước địa chỉ mặc định.
Các phép toán số nguyên 80 × 86 có thể được chia thành bốn lớp chính :
1. Hướng dẫn chuyển động dữ liệu, bao gồm di chuyển, đẩy và bật
2. Các hướng dẫn số học và logic, bao gồm các phép toán logic, kiểm tra,
dịch chuyển và các phép toán số nguyên và số thập phân
3. Luồng điều khiển, bao gồm các nhánh có điều kiện và nhảy, gọi và trả về
vô điều kiện
4. Hướng dẫn chuỗi, bao gồm di chuyển chuỗi và so sánh chuỗi
Hình D.33 cho thấy một số 80 điển hình × 86 hướng dẫn và chức năng của chúng.
Các hướng dẫn truyền dữ liệu, số học và logic là không đáng kể, ngoại trừ các
hoạt động hướng dẫn số học và logic cho phép đích đến là một thanh ghi hoặc
một vị trí bộ nhớ.
Hướng dẫn dòng điều khiển phải có khả năng giải quyết các điểm đến trong phân
khúc khác. Điều này được xử lý bằng cách có hai loại hướng dẫn luồng điều khiển:
gần gần như đối với sự xâm nhập (trong một phân đoạn) và trên xa để chuyển giao
(giữa các phân đoạn). Trong các bước nhảy xa, phải là vô điều kiện, hai đại lượng 16
bit tuân theo opcode ở chế độ 16 bit. Một trong số này được sử dụng làm con trỏ lệnh,
trong khi
D-38 Phụ lục D Khảo sát các kiến trúc tập lệnh

cái khác được tải vào CS và trở thành phân đoạn mã mới. Trong chế độ 32 bit,
trường đầu tiên được mở rộng thành 32 bit để khớp với bộ đếm chương trình 32
bit (EIP).
Các cuộc gọi và trả về hoạt động tương tự như một cuộc gọi xa đẩy con trỏ lệnh trả về
và phân đoạn trả về trên ngăn xếp và tải cả con trỏ lệnh và phân đoạn mã. Một lợi nhuận
xa bật cả con trỏ lệnh và đoạn mã từ ngăn xếp. Các lập trình viên hoặc người viết trình
biên dịch phải chắc chắn luôn sử dụng cùng một loại cuộc gọi và trả về cho một thủ tục,
một lần trở lại gần không hoạt động với một cuộc gọi xa, và ngược lại.
Hướng dẫn chuỗi là một phần của tổ tiên 8080 của 80 × 86 và không được
thực hiện phổ biến trong hầu hết các chương trình.
Hình D.34 liệt kê một số số nguyên 80 × 86 hướng dẫn. Nhiều người trong số
hướng dẫn có sẵn ở cả định dạng byte và từ.

Hoạt động 80 × 86 Điểm nổi


Intel cung cấp kiến trúc ngăn xếp với các hướng dẫn dấu phẩy động của nó: tải
các số đẩy lên ngăn xếp, các thao tác tìm toán hạng trong hai yếu tố trên cùng
của ngăn xếp và các cửa hàng có thể bật các phần tử khỏi ngăn xếp.
Intel đã bổ sung kiến trúc ngăn xếp này với các hướng dẫn và chế độ địa chỉ cho
phép kiến trúc có một số lợi ích của mô hình bộ nhớ đăng ký. Ngoài việc tìm toán
hạng trong hai phần tử trên cùng của ngăn xếp, một toán hạng có thể nằm trong bộ
nhớ hoặc trong một trong bảy thanh ghi bên dưới đỉnh của ngăn xếp.
Sự kết hợp này vẫn là một mô hình bộ nhớ đăng ký bị hạn chế, tuy nhiên, trong
đó các tải luôn di chuyển dữ liệu lên đỉnh của ngăn xếp trong khi tăng đỉnh của
con trỏ ngăn xếp và các cửa hàng chỉ có thể di chuyển đỉnh của ngăn xếp vào bộ
nhớ. Intel sử dụng ký hiệu ST để chỉ đỉnh của stack và ST (i)để đại diện cho
Tôiđăng ký dưới đầu ngăn xếp.
Một đặc điểm mới của kiến trúc này là các toán hạng rộng hơn trong ngăn xếp
thanh ghi so với lưu trữ trong bộ nhớ và tất cả các thao tác được thực hiện ở độ chính
xác bên trong rộng này. Các số được tự động chuyển đổi sang định dạng 80 bit bên
trong khi tải và được chuyển đổi trở lại kích thước phù hợp trên cửa hàng. Dữ liệu bộ
nhớ có thể là các số dấu phẩy động 32 bit (độ chính xác đơn) hoặc 64 bit (độ chính
xác kép), được gọi có thật không bởi Intel. Phiên bản bộ nhớ đăng ký của các hướng
dẫn này sau đó sẽ chuyển đổi toán hạng bộ nhớ sang định dạng Intel 80 bit này trước
khi thực hiện thao tác. Các hướng dẫn truyền dữ liệu cũng sẽ tự động chuyển đổi số
nguyên 16 và 32 bit thành thực và ngược lại, cho tải số nguyên và cửa hàng.
Các hoạt động dấu phẩy động 80 × 86 có thể được chia thành bốn lớp chính :
1. Hướng dẫn chuyển động dữ liệu, bao gồm tải, hằng số tải và lưu trữ
2. Hướng dẫn số học, bao gồm thêm, trừ, nhân, chia, căn bậc hai và giá trị
tuyệt đối
3. So sánh, bao gồm các hướng dẫn để gửi kết quả đến CPU số nguyên để nó
có thể phân nhánh
4. Hướng dẫn siêu việt, bao gồm sin, cosin, log và số mũ
D.3 Intel 80 × 86 D-39

TÔIxây dựng Ý nghĩa


Điều khiển Chi nhánh có điều kiện và vô điều kiện
JNZ, JZ Nhảy nếu điều kiện để IP + bù 8 bit; JNE (cho JNZ) và JE (cho JZ) là tên thay thế
JMP, JMPF Nhảy vô điều kiện các phiên bản xâm nhập bù 8 hoặc 16 bit (gần) và các phiên bản xen kẽ (xa)
GỌI, GỌI Subroutine gọi bù 16 bit; địa chỉ trả lại đẩy; phiên bản gần và xa
RET, RETF Pops trả lại địa chỉ từ stack và nhảy đến nó; phiên bản gần và xa
LOOP Vòng lặp chi nhánh giảm dần CX; nhảy sang IP + chuyển vị 8 bit nếu CX ¦ 0
Truyền dữ liệu Di chuyển dữ liệu giữa các thanh ghi hoặc giữa thanh ghi và bộ nhớ
BIẾN Di chuyển giữa hai thanh ghi hoặc giữa thanh ghi và bộ nhớ
ĐÚNG Đẩy nguồn toán hạng trên stack
POP Pop operand từ stack top đến một thanh ghi
LES Tải ES và một trong những GPR từ bộ nhớ
Số học / logic Các phép toán số học và logic sử dụng các thanh ghi dữ liệu và bộ nhớ
THÊM Thêm nguồn đến đích; định dạng đăng ký bộ nhớ
SUB Trừ nguồn từ đích đến; định dạng bộ nhớ đăng ký
CMP So sánh nguồn và điểm đến; định dạng bộ nhớ đăng ký
SHL Chuyển sang trái
SHR Chuyển đổi logic ngay
RCR Xoay ngay với mang theo như điền
CBW Chuyển đổi byte trong AL để từ trong AX
KIỂM TRA Logic VÀ của nguồn và đích đặt cờ
INC Điểm đến tăng; định dạng đăng ký bộ nhớ
THÁNG 12 Điểm đến giảm; định dạng đăng ký-bộ nhớ
HOẶC LÀ Hợp lý HOẶC; định dạng đăng ký bộ nhớ
XOR Độc quyền HOẶC; định dạng đăng ký bộ nhớ
Hướng dẫn chuỗi Di chuyển giữa các toán hạng chuỗi; độ dài được đưa ra bởi một tiền tố lặp lại
PHONG CÁCH Bản sao từ nguồn chuỗi đến đích; có thể được lặp lại
LODS Tải một byte hoặc từ của một chuỗi vào thanh ghi A

HÌNH D.34 Một số hoạt động điển hình trên 80 × 86. Nhiều hoạt động sử dụng định dạng bộ nhớ đăng ký ,
trong đó nguồn hoặc đích có thể là bộ nhớ và nguồn kia có thể là thanh ghi hoặc toán hạng ngay lập tức.

Hình D.35 cho thấy một số trong 60 hoạt động dấu phẩy động. Chúng tôi sử
dụng xoăn dấu ngoặc {} để hiển thị các biến thể tùy chọn của các hoạt động cơ
bản : {TÔI} có nghĩa là có một phiên bản số nguyên của hướng dẫn , {P} có
nghĩa là biến thể này sẽ bật một toán hạng ra khỏi ngăn xếp sau khi thao tác và{R}
có nghĩa là đảo ngược ý nghĩa của các toán hạng trong hoạt động này.
D-40 Phụ lục D Khảo sát các kiến trúc tập lệnh

Datatransfer Số học So sánh Siêu việt

F {I} LD mem / ST (i) F {I} THÊM {P} mem / ST (i) F {I} COM {P} {P} FPATAN
F {I} ST {P} mem / ST (i) F {I} SUB {R} {P} mem / ST (i) F {I} UCOM {P} {P} F2XM1
FLDPI F {I} MUL {P} mem / ST (i) FSTSW AX / mem FCOS
FLD1 F {I} DIV {R} {P} mem / ST (i) FPTAN
FLDZ FSQRT CHẾ ĐỘ
FABS FSIN
TRÁI CÂY FYL2X

HÌNH D.35 Các hướng dẫn dấu phẩy động của 80 × 86. Cột đầu tiên hiển thị các hướng dẫn truyền dữ liệu, di chuyển dữ liệu vào bộ nhớ hoặc
đến một trong các thanh ghi bên dưới đỉnh của ngăn xếp. Ba thao tác cuối cùng đẩy các hằng số trên ngăn xếp: pi, 1.0 và 0.0. Cột thứ hai chứa các phép
toán số học được mô tả ở trên. Lưu ý rằng ba cuối cùng chỉ hoạt động trên đầu ngăn xếp. Cột thứ ba là các hướng dẫn so sánh. Do không có hướng dẫn
nhánh dấu phẩy động đặc biệt, kết quả của phép so sánh phải được chuyển đến CPU số nguyên thông qua lệnh FSTSW, vào thanh ghi AX hoặc vào bộ
nhớ, theo sau là lệnh SAHF để đặt mã điều kiện. So sánh dấu phẩy động sau đó có thể được kiểm tra bằng các hướng dẫn nhánh số nguyên. Cột cuối
cùng cung cấp cho các hoạt động điểm nổi cấp cao hơn.

Không phải tất cả các kết hợp được cung cấp. Do đó,

F {I} SUB {R} {P}


đại diện cho các hướng dẫn được tìm thấy trong 80 × 86 :

FSUB
FISUB
FSUBR
FISUBR
FSUBP
FSUBRP
Không có phiên bản pop hoặc pop đảo ngược của hướng dẫn trừ số nguyên.
Lưu ý rằng chúng tôi nhận được nhiều kết hợp hơn nữa khi bao gồm các chế
độ toán hạng
cho các hoạt động này. Bổ sung dấu phẩy động có các tùy chọn này, bỏ qua các
FADD phiên bản số nguyên và pop của hướng dẫn :
Cả hai toán hạng đều nằm trong ngăn xếp và kết quả thay thế
FADD ST (i) FADD phần trên của ngăn xếp.
Một toán hạng nguồn là Tôithanh ghi bên dưới đỉnh của ngăn
ST (i), ST FADD
xếp và kết quả thay thế đỉnh của ngăn xếp.
mem32 Một toán hạng nguồn là đỉnh của ngăn xếp và kết quả thay
thế Tôiđăng ký dưới đầu ngăn xếp.
Toán hạng một nguồn là một vị trí 32 bit trong bộ nhớ và
FADD mem64 kết quả thay thế phần trên cùng của ngăn xếp.
Toán hạng một nguồn là một vị trí 64 bit trong bộ nhớ
và kết quả thay thế phần trên cùng của ngăn xếp.
Như đã đề cập trước đó, SSE2 trình bày một mô hình các thanh ghi dấu phẩy động
của IEEE.
D.3 Intel 80 × 86 D-41

Nói lại

Khóa

Cống. ghi đè Tiền tố

Thêm vào. ghi


đè

Ghi đè kích thước

Mã nguồn Mã nguồn

Opcode ext.
Địa chỉ
mod, reg, r / m nhà đầu cơ

sc, chỉ số, cơ sở

Tranh
chấp8
Dịch chuyển

Tranh
chấp16

Tranh
chấp24

Tranh Ngay lập tức


chấp32

Imm8

Imm16

Imm24

Imm32

HÌNH D.36 Định dạng hướng dẫn của 8086 (loại màu đen) và các phần mở rộng cho 80386
(loại bóng). Mỗi trường là tùy chọn ngoại trừ opcode.

80 × 86 Mã hóa hướng dẫn


Tiết kiệm tồi tệ nhất cho lần cuối, mã hóa các hướng dẫn trong 80 × 86 rất phức
tạp, với nhiều định dạng hướng dẫn khác nhau. Các hướng dẫn có thể thay đổi từ
1 byte, khi không có toán hạng, đến tối đa 6 byte, khi lệnh chứa ngay lập tức 16
bit và sử dụng địa chỉ dịch chuyển 16 bit. Hướng dẫn tiền tố tăng độ dài lệnh
8086 vượt quá kích thước rõ ràng.
Các bổ sung 80386 mở rộng kích thước hướng dẫn hơn nữa, như Hình D.36 chương
trình. Cả hai trường dịch chuyển và trường tức thời có thể dài 32 bit, có thể có thêm hai
tiền tố, opcode có thể dài 16 bit và trình xác định chế độ chỉ mục tỷ lệ thêm 8 bit nữa.
Hướng dẫn 80386 tối đa có thể dài 17 byte.
Hình D.37 hiển thị định dạng hướng dẫn cho một số hướng dẫn ví dụ trong Hình
D.33Byte opcode thường chứa một chút cho biết liệu toán hạng là a. byte rộng hoặc
kích thước lớn hơn, 16 bit hoặc 32 bit tùy thuộc vào chế độ. Đối với chế độ và đăng
ký; điều này đúng trong nhiều hướng dẫn có hình thức đăng ký đăng ký op ngay lập
tứcCác hướng dẫn khác sử dụng một byte postbyte và một byte opcode bổ sung, được
dán nhãn. Mod mod, reg, r / m trong Hình D.36, trong đó có chứa thông tin chế độ địa
chỉ. Postbyte này được sử dụng cho nhiều hướng dẫn giải quyết bộ nhớ. Dựa trên chỉ
số tỷ lệ sử dụng một postbyte thứ hai, được dán nhãn là sc sc, chỉ mục, cơ sở Hình
D.36.
Các hướng dẫn dấu phẩy động được mã hóa trong opcode thoát của 8086 và bộ chỉ
định địa chỉ byte bài. Các hoạt động bộ nhớ dự trữ 2 bit để quyết định xem toán hạng là số
thực 32 hoặc 64 bit hay số nguyên 16 hoặc 32 bit. 2 bit tương tự được sử dụng
D-42 Phụ lục D Khảo sát các kiến trúc tập lệnh

4 4 số 8

JE Điều kiện Dịch chuyển

a. JE PC + dịch chuyển

số 8 16 16

GỌI Bù đắp Số phân đoạn

b. GỌI

6 2 số 8 số 8
r-m
BIẾN d/w Dịch chuyển
postbyte

c. BIẾN BX, [DI + 45]

5 3

ĐÚNG Reg

d. ĐÚNG SI

4 3 1 16

THÊ Reg w Hằng số


M

e. THÊM AX, # 6765

6 2 số 8
v/ r-r
SHL w
postbyte

f. SHL BX, 1

7 1 số 8 số 8

KIỂM TRA w Postbyte Ngay lập tức

g. KIỂM TRA DX, # 42

HÌNH D.37 Định dạng hướng dẫn 8086 điển hìnhMã hóa của postbyte được hiển thị trong. Hình
D.38Nhiều hướng dẫn chứa trường 1 bit w, cho biết liệu thao tác là byte hay từ. Các trường có dạng v / w
hoặc d / w là trường d hoặc trường v theo sau là trường w. Các trường d trong BIẾN được sử dụng trong các
hướng dẫn có thể di chuyển đến hoặc từ bộ nhớ và hiển thị hướng di chuyển. Các trường v trong SHL
hướng dẫn chỉ ra một sự thay đổi chiều dài thay đổi; dịch chuyển có độ dài thay đổi sử dụng một thanh ghi
để giữ số lượng ca. Các THÊM lệnh chỉ hiển thị mã hóa ngắn được tối ưu hóa điển hình chỉ có thể sử dụng
khi toán hạng đầu tiên AXNhìn chung. hướng dẫn có thể thay đổi từ 1 đến 6 byte chiều dài.
trong các phiên bản không truy cập bộ nhớ để quyết định xem ngăn xếp có nên được bật
sau khi vận hành hay không và liệu đầu ngăn xếp hoặc thanh ghi thấp hơn sẽ nhận được
kết quả.
Than ôi, bạn không thể tách các hạn chế trên các thanh ghi khỏi mã hóa của các
chế độ địa chỉ trong 80 × 86. Do đó, Hình D.38 và D.39 hiển thị mã hóa của hai bộ
chỉ định địa chỉ postbyte cho cả hai chế độ 16 và 32 bit.

Đặt tất cả lại với nhau: Các phép đo của việc sử dụng bộ
hướng dẫn
Trong phần này, chúng tôi trình bày các phép đo chi tiết cho 80 × 86 và sau đó so
sánh các phép đo với MIPS cho cùng các chương trình. Để tạo điều kiện so sánh giữa
các phép đo tập lệnh động, chúng tôi sử dụng một tập hợp con của các chương trình
SPEC92.
D.3 Intel 80 × 86 D-43

w=1 mod = 0 mod = 1 mod = 2


reg w = 0 16b 32b r / m 16b 32b 16b 32b 16b 32b mod = 3
0 AL AX EAX 0 addr = BX + SI = EAGX giống nhau giống nhau giống nhau giống nhau giống nhau

1 CL CX ECX 1 addr = BX + DI = ECX bổ sung như bổ sung như bổ sung như bổ sung như như

2 DL DX EDX 2 addr = BP + SI = EDX mod = 0 mod = 0 mod = 0 mod = 0 reg

+ phân + phân
3 BL BX EBX 3 addr = BP + SI = EBX phối8 + phân phối8 phối16 + phân phối32 cánh đồng

SI + phân (sib) + phân SI + phân (sib) + phân


4 AH SP ESP 4 addr = SI = (si) b tán16 tán8 tán8 tán32 "

= phân DI + phân EBP + phân DI + phân EBP + phân


5 CH HA EBP 5 addr = DI tán32 tán8 tán8 tán16 tán32 "
addr = phân HA + phân ESI + phân BP + phân ESI + phân
6 DH SI ESI 6 tán16 = ESI tán8 tán8 tán16 tán32 "

BX + phân EDI + phân BX + phân EDI + phân


7 BH DI EDI 7 addr = BX = EDI tán8 tán8 tán16 tán32 "

HÌNH D.38 Mã hóa của bộ chỉ định địa chỉ đầu tiên của 80 × 86, mod, reg, r / m. Bốn cột đầu tiên hiển thị mã hóa
của trường reg 3 bit, phụ thuộc vào bit w từ opcode và liệu máy có ở chế độ 16 hoặc 32 bit hay không. Các cột còn lại giải thích các trường
mod và r / m. Ý nghĩa của trường r / m 3 bit phụ thuộc vào giá trị trong trường mod 2 bit và kích thước địa chỉ. Về cơ bản, các thanh ghi
được sử dụng trong tính toán địa chỉ được liệt kê trong các cột thứ sáu và thứ bảy, dưới mod = 0, với mod = 1 thêm chuyển vị 8 bit và mod =
2 thêm chuyển vị 16 hoặc 32 bit, tùy thuộc vào chế độ địa chỉ. Các ngoại lệ là r / m = 6 khi mod = 1 hoặc mod = 2 ở chế độ 16 bit chọn HA
cộng với sự dịch chuyển; r / m = 5 khi mod = 1 hoặc mod = 2 ở chế độ 32 bit chọn EBP cộng với dịch chuyển; và r / m = 4 ở chế độ 32 bit
khi mod ¦3 (sib) có nghĩa là sử dụng chế độ chỉ mục tỷ lệ được hiển thị trong Hình D.39Khi mod = 3, trường r / m cho biết một thanh ghi, sử
dụng cùng mã hóa với trường reg kết hợp với bit w.

Các kết quả 80 × 86 đã được thực hiện vào năm 1994 bằng cách sử dụng bộ biên
dịch Sun Solaris FORTRAN và C V2.0 và được thực hiện ở chế độ 32 bit. Các
trình biên dịch này có chất lượng tương đương với các trình biên dịch được sử
dụng cho MIPS .
Hãy nhớ rằng các phép đo này phụ thuộc vào điểm chuẩn được chọn và công
nghệ trình biên dịch được sử dụng. Mặc dù chúng tôi cảm thấy rằng các phép đo
trong phần này là chỉ dẫn hợp lý cho việc sử dụng các kiến trúc này, các chương
trình khác có thể hoạt động khác với bất kỳ điểm chuẩn nào ở đây và các trình
biên dịch khác nhau có thể mang lại kết quả khác nhau. Khi thực hiện một
nghiên cứu tập lệnh thực tế, kiến trúc sư sẽ muốn có một bộ điểm chuẩn lớn hơn
nhiều, trải rộng phạm vi ứng dụng càng rộng càng tốt và xem xét hệ điều hành và
cách sử dụng bộ hướng dẫn. Điểm chuẩn của người dùng đơn như những điểm
được đo ở đây không nhất thiết phải hành xử theo cùng một kiểu với hệ điều
hành.
Chúng tôi bắt đầu với việc đánh giá các tính năng của 80 × 86 một cách cô lập
và sau đó so sánh số lượng hướng dẫn với DLX .
Các phép đo của Địa chỉ toán tử 80 × 86
Chúng tôi bắt đầu với các chế độ địa chỉ. Hình D.40 cho thấy sự phân phối của
các loại toán hạng trong 80 × 86. Các phép đo này bao gồm toán hạng thứ hai
của các hoạt động; ví dụ
EAX, [45]
D-44 Phụ lục D Khảo sát các kiến trúc tập lệnh

Chỉ số Căn cứ
0 EA X EA X
1 ECX ECX
2 EDX EDX
3 EBX EBX
4 Không có chỉ số ESP
Nếu mod = 0, phân
5 EBP phối 32
Nếu mod ¦ 0, EBP
6 ESI ESI
7 EDI EDI

HÌNH D.39 Dựa trên chỉ số định địa chỉ chế độ chỉ mục được thu nhỏ được tìm thấy trong
80386. Điều này chế độ được biểu thị bằng ký hiệu (sib) trong Hình D.38 Lưu ý rằng chế độ này mở rộng
danh sách các thanh ghi sẽ được sử dụng trong các chế độ khác: Đăng ký sử dụng gián tiếp. ESP đến từ Tỷ
lệ = 0, Chỉ số = 4 và Cơ sở = 4 và dịch chuyển cơ sở với EBP đến từ Tỷ lệ = 0, Chỉ số = 5 và mod = 0.
Trường tỷ lệ hai bit được sử dụng trong công thức này của địa chỉ hiệu quả: Thanh ghi cơ sở + 2 quy mô Chỉ số
đăng ký.

Số nguyên trung Trung bình FP


bình
Đăng ký 45% 22%
Ngay lập tức 16% 6%
Ký ức 39% 72%

HÌNH D.40 Phân phối loại toán tử cho trung bình năm chương trình Specint92 (nén,
eqntott, espresso, gcc, li) và trung bình của năm chương trình Specfp92 (doduc, tai,
hydro2d, mdljdp2, su2cor).

được tính là một toán hạng bộ nhớ duy nhất. Nếu các loại toán hạng đầu tiên
được tính, tỷ lệ sử dụng thanh ghi sẽ tăng khoảng 1,5 lần.
Các toán hạng bộ nhớ 80 × 86 được chia thành các chế độ địa chỉ tương ứng của
chúng Hình D.41Có lẽ bất ngờ lớn nhất là sự phổ biến của các chế độ địa chỉ được
thêm vào bởi 80386, bốn hàng cuối cùng của hình. Họ chiếm khoảng một nửa số truy
cập bộ nhớ. Một bất ngờ khác là sự phổ biến của địa chỉ trực tiếp. Trên hầu hết các
máy khác, tương đương với chế độ địa chỉ trực tiếp là rất hiếm. Có lẽ không gian địa
chỉ được phân đoạn của 80 × 86 làm cho địa chỉ trực tiếp trở nên hữu ích hơn, vì địa
chỉ này liên quan đến địa chỉ cơ sở từ thanh ghi phân đoạn.
Các chế độ địa chỉ này phần lớn xác định kích thước của các hướng dẫn Intel.
Hình D.42 cho thấy sự phân phối kích thước hướng dẫn. Số lượng trung bình của
byte trên mỗi lệnh cho các chương trình số nguyên là 2,8, với độ lệch chuẩn là
1,5 và 4,1 với độ lệch chuẩn là 1,9 cho các chương trình dấu phẩy động. Sự khác
biệt về độ dài phát sinh một phần từ sự khác biệt trong các chế độ địa chỉ: Các
chương trình số nguyên phụ thuộc nhiều hơn vào sự dịch chuyển gián tiếp và
đăng ký ngắn hơn
D.3 Intel 80 × 86 D-45

Chế độ địa chỉ Số nguyên trung Trung bình FP


bình
Đăng ký gián tiếp 13% 3%
Cơ sở + phân phối 8 bit. 31% 15%
Cơ sở + phân phối 32 bit. 9% 25%
Lập chỉ mục 0% 0%
Dựa trên chỉ số + 8 bit. 0% 0%
Dựa trên chỉ số + 32 bit. 0% 1%
Cơ sở + được lập chỉ mục theo tỷ lệ 22% 7%
Cơ sở + được lập chỉ mục + phân phối 8 bit. 0% 8%
Cơ sở + được lập chỉ mục + phân phối 32 bit. 4% 4%
Trực tiếp 32 bit 20% 37%

HÌNH D.41 Vận hành phân phối chế độ địa chỉ theo chương trình. Biểu đồ này không bao gồm
chế độ địa chỉ được sử dụng bởi các chi nhánh hoặc hướng dẫn kiểm soát.

0%
11
0%
0%
10 Điểm nổi
0%
trung bình
0% Số nguyên trung
9 bình
0%
số 0%
8
1%

7 4%
Độ dài hướng dẫn

2%

39%
6
8%

4%
5
6%

7%
4
5%

18%
3
25%

2 19%
40%

10%
1
14%

0% 20% 40% 60%

Tỷ lệ hướng dẫn ở mỗi độ dài

HÌNH D.42 Trung bình của biểu đồ 80 × 86 độ dài lệnh cho năm chương trình SPECint92
và cho năm chương trình SPECfp92, tất cả đều chạy ở chế độ 32 bit.
D-46 Phụ lục D Khảo sát các kiến trúc tập lệnh

các chế độ địa chỉ, trong khi các chương trình dấu phẩy động thường xuyên hơn
sử dụng các chế độ địa chỉ 80386 với các chuyển vị 32 bit dài hơn.
Cho rằng các hướng dẫn dấu phẩy động có các khía cạnh của cả ngăn xếp và
thanh ghi, cách sử dụng chúng? Hình D.43 cho thấy, ít nhất là đối với các trình
biên dịch được sử dụng trong phép đo này, mô hình thực thi ngăn xếp hiếm khi
được tuân theo.
Cuối cùng, Hình D.44 và D.45 hiển thị các hỗn hợp hướng dẫn cho 10 chương
trình SPEC92.

Các phép đo hoạt động so sánh


Hình D.46 và D.47 hiển thị số lượng hướng dẫn được thực hiện cho mỗi trong số 10
các chương trình trên 80 × 86 và tỷ lệ thực hiện lệnh so với DLX: Các số nhỏ hơn 1.0
có nghĩa là 80 × 86 thực hiện ít hướng dẫn hơn DLX. Số lượng hướng dẫn gần với
DLX cho nhiều chương trình số nguyên, như bạn mong đợi một kiến trúc tập lệnh
lưu trữ tải như DLX sẽ thực hiện nhiều hướng dẫn hơn kiến trúc bộ nhớ đăng ký như
80x86. Các chương trình dấu phẩy động luôn có số lượng cao hơn cho 80 × 86, có lẽ
là do thiếu các thanh ghi dấu phẩy động và sử dụng kiến trúc ngăn xếp.
Một câu hỏi khác là tổng lưu lượng dữ liệu cho 80 × 86 so với DLX, vì 80 ×
86 có thể chỉ định toán hạng bộ nhớ là một phần của hoạt động trong khi DLX
chỉ có thể truy cập qua tải và lưu trữ. Hình D.46 và D.47 cũng hiển thị dữ liệu
đọc, ghi dữ liệu và đọc dữ liệu-sửa đổi-viết cho 10 chương trình này. Tổng tỷ lệ
truy cập vào DLX của từng loại truy cập bộ nhớ được hiển thị ở các hàng dưới
cùng, với số lần đọc-sửa đổi-viết là một lần đọc và một lần viết. 80 × 86 thực
hiện số lần truy cập dữ liệu gấp hai đến bốn lần so với DLX cho các chương trình
dấu phẩy động và gấp 1,25 lần so với các chương trình số nguyên. Cuối cùng,
Hình D.48 hiển thị tỷ lệ phần trăm của các hướng dẫn trong mỗi danh mục cho
80 × 86 và DLX .

Kết luận
Vẻ đẹp là trong mắt của kẻ si tình.
Adage cũ

Như chúng ta đã thấy , trực giao không phải là một thuật ngữ được tìm thấy
trong từ điển kiến trúc Intel. Để hiểu đầy đủ các thanh ghi và chế độ địa chỉ là

tinh Trung bình


Lựa chọn ranh tai hydro2d mdljdp2 su2cor FP
Chồng (điều hành thứ 2 ST (1)) 1,1% 0,0% 0,0% 0,2% 0,6% 0,4%
Đăng ký (điều hành thứ 2 ST (i), i> 1) 17,3% 63,4% 14,2% 7,1% 30,7% 26,5%
Ký ức 81,6% 36,6% 85,8% 92,7% 68,7% 73,1%

HÌNH D.43 Tỷ lệ phần trăm của các hướng dẫn cho các hoạt động dấu phẩy động (thêm, phụ, mul,
div) sử dụng mỗi trong ba tùy chọn để chỉ định toán hạng dấu phẩy động trên 80 × 86. Ba các tùy
chọn là (1) mô hình ngăn xếp nghiêm ngặt của các toán hạng ngầm trên ngăn xếp, (2) phiên bản đăng ký đặt tên cho
một toán hạng rõ ràng không phải là một trong hai yếu tố hàng đầu của ngăn xếp và (3) toán hạng bộ nhớ.
D.3 Intel 80 × 86 D-47

có sẵn, bạn cần xem mã hóa của tất cả các chế độ địa chỉ và đôi khi mã hóa các
hướng dẫn.
Một số ý kiến cho rằng sự không phù hợp của bộ hướng dẫn 80 × 86 là không
thể tránh khỏi, mức giá phải trả cho sự thành công tràn lan của bất kỳ kiến trúc
nào. Chúng tôi bác bỏ quan niệm đó. Rõ ràng, không có kiến trúc thành công nào
có thể loại bỏ các tính năng đã được thêm vào trong các triển khai trước đó và
theo thời gian, một số tính năng có thể được coi là không mong muốn. Sự lúng
túng của 80 × 86 bắt đầu từ cốt lõi của nó với bộ hướng dẫn 8086 và bị làm trầm
trọng thêm bởi sự mở rộng không nhất quán về mặt kiến trúc của 8087, 80286 và
80386.

Hướng dẫn tinh tai hydro2d mdljdp2 su2cor Trung bình FP


ranh
Tải 8,9% 6,5% 18,0% 27,6% 27,6% 20%
Cửa hàng 12,4% 3,1% 11,5% 7,8% 7,8% 8%
Thêm vào 5,4% 6,6% 14,6% 8,8% 8,8% 10%
Tiểu 1,0% 2,4% 3,3% 2,4% 2,4% 3%
Mul 0%
Div 0%

So sánh 1,8% 5,1% 0,8% 1,0% 1,0% 2%


Di chuyển reg-reg 3,2% 0,1% 1,8% 2,3% 2,3% 2%
Tải 0,4% 1,5% 0%
Cond. chi nhánh 5,4% 8.2% 5,1% 2,7% 2,7% 5%
Nhánh thứ hai 0,8% 0,4% 1,3% 0,3% 0,3% 1%
Gọi 0,5% 1,6% 0,1% 0,1% 0%
Trả lại, jmpindirect 0,5% 1,6% 0,1% 0,1% 0%
Ca làm việc 1,1% 4,5% 2,5% 2,5% 2%
VÀ 0,8% 0,8% 0,7% 1,3% 1,3% 1%
HOẶC LÀ 0,1% 0,1% 0,1% 0%
Khác (XOR, không , . . .) 0%
Tải trọng 14,1% 22,5% 9,1% 12,6% 12,6% 14%
StoreFP 8,6% 11,4% 4,1% 6,6% 6,6% 7%
AddFP 5,8% 6,1% 1,4% 6,6% 6,6% 5%
SubFP 2,2% 2,7% 3,1% 2,9% 2,9% 3%
MulFP 8,9% 8,0% 4,1% 12,0% 12,0% 9%
DivFP 2,1% 0,8% 0,2% 0,2% 0%
So sánh FP 9,4% 6,9% 10,8% 0,5% 0,5% 5%
Di chuyển reg-reg FP 2,5% 0,8% 0,3% 0,8% 0,8% 1%
Khác (abs, sqrt , . . .) 3,9% 3,8% 4,1% 0,8% 0,8% 2%

HÌNH D.44 80×86 hỗn hợp hướng dẫn cho năm chương trình SPECfp92.
D-48 Phụ lục D Khảo sát các kiến trúc tập lệnh

Hướng dẫn nén eqntott espresso gcc (cc1) li Nội bộ. trung
bình

Tải 20,8% 18,5% 21,9% 24,9% 23,3% 22%


Cửa hàng 13,8% 3,2% 8,3% 16,6% 18,7% 12%
Thêm vào 10,3% 8,8% 8,15% 7,6% 6,1% 8%
Tiểu 7,0% 10,6% 3,5% 2,9% 3,6% 5%
Mul 0,1% 0%
Div 0%
So sánh 8.2% 27,7% 15,3% 13,5% 7,7% 16%
Di chuyển reg-reg 7,9% 0,6% 5,0% 4.2% 7,8% 4%
Tải 0,5% 0,2% 0,6% 0,4% 0%
Cond. chi nhánh 15,5% 28,6% 18,9% 17,4% 15,4% 20%
Vô điều kiện. chi nhánh 1,2% 0,2% 0,9% 2,2% 2,2% 1%
Gọi 0,5% 0,4% 0,7% 1,5% 3,2% 1%
Trả lại, jmp gián tiếp 0,5% 0,4% 0,7% 1,5% 3,2% 1%
Ca làm việc 3,8% 2,5% 1,7% 1%
VÀ 8.4% 1,0% 8,7% 4,5% 8.4% 6%
HOẶC LÀ 0,6% 2,7% 0,4% 0,4% 1%
Khác (XOR, không ,...) 0,9% 2,2% 0,1% 1%
Tải FP 0%
Lưu trữ FP 0%
Thêm FP 0%
Tiểu FP 0%
Mul FP 0%
Div FP 0%
So sánh FP 0%
Di chuyển reg-reg FP 0%
Khác (abs, sqrt , . . .) 0%

HÌNH D.45 80×86 hỗn hợp hướng dẫn cho năm chương trình SPECint92.

Một ví dụ điển hình là kiến trúc IBM 360/370, cũ hơn nhiều so với 80 × 86.
Nó thống trị thị trường máy tính lớn giống như 80 × 86 thống trị thị trường PC.
Do chắc chắn là có cơ sở tốt hơn và các cải tiến tương thích hơn, bộ hướng dẫn
này có ý nghĩa hơn nhiều so với 80 × 86 hơn 30 năm sau lần thực hiện đầu tiên.
Dù tốt hay xấu, Intel đã có bộ vi xử lý 16 bit trước khi các đối thủ cạnh tranh của
nó có kiến trúc thanh lịch hơn, và sự khởi đầu này đã dẫn đến việc lựa chọn 8086 như
D.3 Intel 80 × 86 D-49

Nội bộ.
nén eqntott espresso gcc (cc1) li avg.
Hướng dẫn thực hiện trên 80x86 (hàng triệu) 2226 1203 2216 3770 5020
Hướng dẫn thực hiện tỷ lệ với DLX 0,61 1.74 0,85 0,96 0,98 1.03
Dữ liệu đọc trên 80x86 (hàng triệu) 589 229 622 1079 1459
Dữ liệu ghi trên 80x86 (hàng triệu) 311 39 191 661 981
Dữ liệu đọc-sửa đổi-viết trên 80x86 (hàng triệu) 26 1 129 48 48
Tổng số dữ liệu đọc trên 80x86 (hàng triệu) 615 230 751 1127 1507
Tỷ lệ đọc dữ liệu với DLX 0,85 1,09 1,38 1.25 0,94 1.10
Tổng số dữ liệu ghi trên 80x86 (hàng triệu) 338 40 319 709 1029
Trình ghi dữ liệu atioto DLX 1.67 9,26 2,39 1.25 1.20 3.15
Tổng số truy cập dữ liệu trên 80x86 (hàng triệu) 953 269 1070 1836 2536
Tỷ lệ truy cập dữ liệu vào DLX 1.03 1.25 1,58 1.25 1.03 1,23

HÌNH D.46 Hướng dẫn được thực hiện và truy cập dữ liệu trên 80×86 và tỷ lệ so với DLX cho năm chương trình
Specint92.

Trung bình
tinh ranh tai hydro2d mdljdp2 su2cor FP

Hướng dẫn thực hiện trên 80x86 (hàng triệu) 1223 15.220 13.342 6197 6197
Hướng dẫn thực hiện tỷ lệ với DLX 1.19 1.19 2.53 2,09 1.62 1.73
Dữ liệu đọc trên 80x86 (hàng triệu) 515 6007 5501 3696 3643
Dữ liệu ghi trên 80x86 (hàng triệu) 260 2205 2085 892 892
Dữ liệu đọc-sửa đổi-viết trên 80x86 (hàng triệu) 1 0 189 124 124
Tổng số dữ liệu đọc trên 80x86 (hàng triệu) 517 6007 5690 3820 3767
Tỷ lệ đọc dữ liệu với DLX 2.04 2.36 4,48 4,77 3.91 3.51
Tổng số dữ liệu ghi trên 80x86 (hàng triệu) 261 2205 2274 1015 1015
Tỷ lệ ghi dữ liệu vào DLX 3,68 33,25 38,74 16,74 9,35 20,35
Tổng số truy cập dữ liệu trên 80x86 (hàng triệu) 778 8212 7965 4835 4782
Tỷ lệ truy cập dữ liệu vào DLX 2,40 3.14 5,99 5,73 4,47 4,35

HÌNH D.47 Hướng dẫn được thực hiện và truy cập dữ liệu cho năm chương trình SPECfp92 trên 80×86 và tỷ lệ với
DLX .

CPU cho PC IBM. Những gì nó thiếu trong phong cách được tạo thành từ số
lượng, làm cho 80 × 86 đẹp từ góc nhìn đúng.
Ân sủng tiết kiệm của 80x86 là các thành phần kiến trúc của nó không quá khó
để thực hiện, vì Intel đã chứng minh bằng cách cải thiện nhanh chóng hiệu suất
của các chương trình số nguyên kể từ năm 1978. Hiệu suất điểm nổi cao là một
thách thức lớn hơn trong kiến trúc này.
D-50 Phụ lục D Khảo sát kiến trúc tập lệnh

Số nguyên trung
bình Trung bình FP

Thể loại x86 DLX x86 DLX

Tổng số truyền dữ liệu 34% 36% 28% 2%


Tổng số nguyên số học 34% 31% 16% 12%
Tổng kiểm soát 24% 20% 6% 10%
Tổng số logic 8% 13% 3% 2%
Tổng truyền dữ liệu FP 0% 0% 22% 33%
Tổng số học FP 0% 0% 25% 41%

HÌNH D.48 Tỷ lệ phần trăm của các hướng dẫn được thực hiện theo danh mục cho 80×86 và DLX cho mức trung
bình của năm chương trình Specint92 và Specfp92 của Hình D.46 và D.47.

D.4 Kiến trúc VAX

VAX: thiết kế máy tính mini thành công nhất trong lịch sử ngành . . . VAX có lẽ
là máy yêu thích của hacker . . . . Đặc biệt lưu ý với hướng dẫn lớn, thân thiện
với lập trình viên, đặt ra một tài sản đã trở thành một trách nhiệm sau cuộc cách
mạng RISC.
Eric Raymond
Từ điển Hacker mới (1991)

Giới thiệu
Để nâng cao hiểu biết của bạn về kiến trúc tập lệnh, chúng tôi đã chọn VAX làm đại diện
Bộ hướng dẫn phức tạp Máy tính (CISC) vì nó rất khác với MIPS và vẫn dễ hiểu. Bằng
cách nhìn thấy hai phong cách khác nhau như vậy, chúng tôi tự tin rằng bạn sẽ có thể tự
học các bộ hướng dẫn khác.
Vào thời điểm VAX được thiết kế, triết lý phổ biến là tạo ra các bộ hướng dẫn gần với
ngôn ngữ lập trình để đơn giản hóa các trình biên dịch. Ví dụ: vì ngôn ngữ lập trình có
vòng lặp, nên các bộ hướng dẫn phải có hướng dẫn vòng lặp. Như kiến trúc sư VAX
William Strecker đã nói (Phần mềm VAX-11/780 Một phần mở rộng địa chỉ ảo cho Gia
đình PDP-11, Hồi AFIPS Proc., Hội nghị máy tính quốc gia, 1978) :
Mục tiêu chính của tập lệnh VAX-11 là cung cấp mã được tạo trình biên dịch hiệu quả.
Bốn quyết định đã giúp hiện thực hóa mục tiêu này: 1) Một cách đối xử rất thường xuyên
và nhất quán của các nhà khai thác . . . . 2) Việc tránh các hướng dẫn không có khả năng
được tạo bởi trình biên dịch . . . . 3) Bao gồm một số hình thức của các nhà khai thác phổ
biến . . . . 4) Thay thế các chuỗi hướng dẫn chung bằng các hướng dẫn đơn . . . .
Các ví dụ bao gồm gọi thủ tục, phân nhánh đa chiều, điều khiển vòng lặp và tính
toán chỉ mục mảng.
D.4 Kiến trúc VAX D-51

Hãy nhớ lại rằng DRAM của giữa những năm 1970 chứa ít hơn 1/1000 công
suất của DRAM ngày nay, vì vậy không gian mã cũng rất quan trọng. Do đó, một
triết lý phổ biến khác là giảm thiểu kích thước mã, được nhấn mạnh trong các bộ
hướng dẫn có độ dài cố định như MIPS. Ví dụ: các trường địa chỉ MIPS luôn sử
dụng 16 bit, ngay cả khi địa chỉ rất nhỏ. Ngược lại, VAX cho phép các hướng
dẫn là một số byte thay đổi, do đó có rất ít không gian lãng phí trong các trường
địa chỉ.
Toàn bộ sách đã được viết về VAX, vì vậy phần mở rộng VAX này không thể
đầy đủ. Do đó, các phần sau chỉ mô tả một vài chế độ và hướng dẫn địa chỉ của nó.
Để hiển thị các hướng dẫn VAX đang hoạt động, các phần sau hiển thị mã lắp ráp
VAX cho hai quy trình C. Kiểu chung sẽ tương phản các hướng dẫn này với mã
MIPS mà bạn đã quen thuộc. Các mục tiêu khác nhau cho VAX và MIPS đã dẫn
đến các kiến trúc rất khác nhau. Các mục tiêu VAX, trình biên dịch đơn giản và
mật độ mã, dẫn đến các chế độ địa chỉ mạnh mẽ, hướng dẫn mạnh mẽ và mã hóa
lệnh hiệu quả. Các mục tiêu MIPS có hiệu suất cao thông qua đường ống, dễ thực
hiện phần cứng và khả năng tương thích với các trình biên dịch tối ưu hóa cao.
Các mục tiêu MIPS dẫn đến các hướng dẫn đơn giản, chế độ địa chỉ đơn giản,
định dạng hướng dẫn có độ dài cố định và một số lượng lớn các thanh ghi.

Các toán tử VAX và các chế độ địa chỉ


VAX là kiến trúc 32 bit, với các địa chỉ rộng 32 bit và các thanh ghi rộng 32 bit.
Tuy nhiên, VAX hỗ trợ nhiều kích thước và loại dữ liệu khác, như Hình D.49
chương trình. Thật không may, VAX sử dụng tên từ Word để chỉ số lượng 16 bit;
trong văn bản này, một từ có nghĩa là 32 bit. Hình D.49 hiển thị chuyển đổi giữa
tên kiểu dữ liệu MIPS và tên VAX. Hãy cẩn thận khi đọc về các hướng dẫn VAX,
vì chúng đề cập đến tên của các loại dữ liệu VAX.
VAX cung cấp mười sáu thanh ghi 32 bit. Trình biên dịch VAX sử dụng ký
hiệu r0, r1 ,..., r15 để tham khảo các thanh ghi này, và chúng tôi sẽ bám vào ký
hiệu đó. Than ôi, 4 trong số 16 thanh ghi này được yêu cầu một cách hiệu quả bởi
kiến trúc tập lệnh. Ví dụ, r14 là con trỏ ngăn xếp (sp) và r15 là bộ đếm chương
trình (máy tính ). Do đó, r15 không thể được sử dụng như một thanh ghi mục đích
chung và sử dụng r14 rất khó vì nó can thiệp vào các hướng dẫn thao tác chồng.
Các thanh ghi chuyên dụng khác là r12, được sử dụng làm con trỏ đối số (ap), và
r13, được sử dụng làm con trỏ khung (fp); mục đích của họ sẽ trở nên rõ ràng sau
này. (Giống như MIPS, trình biên dịch VAX chấp nhận số đăng ký hoặc tên đăng
ký.)
Các chế độ địa chỉ VAX bao gồm những chế độ được thảo luận trong Phụ lục
A , trong đó có tất cả các chế độ địa chỉ MIPS : đăng ký, chuyển vị, ngay lập tức,
và PC-họ hàngHơn nữa, tất cả các chế độ này có thể được sử dụng cho địa chỉ
nhảy hoặc cho địa chỉ dữ liệu.
Nhưng đó không phải là tất cả các chế độ địa chỉ. Để giảm kích thước mã, VAX
có ba độ dài địa chỉ cho địa chỉ dịch chuyển: địa chỉ 8 bit, 16 bit và 32 bit được gọi
tương ứng , dịch chuyển byte, dịch chuyển từ, và chuyển vị dài địa chỉ. Do đó, một
địa chỉ có thể không chỉ nhỏ nhất có thể mà còn lớn nhất có thể
D-52 Phụ lục D Khảo sát kiến trúc tập lệnh

Bit Kiểu dữ liệu Tên MIPS Tên VAX


số 8 Số nguyên Byte Byte
16 Số nguyên Nửa chữ Lời
32 Số nguyên Lời Từ dài
32 Điểm nổi Độ chính xác duy nhất F_floating
64 Số nguyên Từ kép Quad từ
64 Điểm nổi Độ chính xác gấp đôi D_floating hoặc G_floating
8n Chuỗi ký tự Nhân vật Nhân vật

HÌNH D.49 Các loại dữ liệu VAX, độ dài và tên của chúng. Chữ cái đầu tiên của loại VAX (b, w,
l , f, q, d, g, c) thường được sử dụng để hoàn thành tên hướng dẫn. Ví dụ về hướng dẫn di chuyển bao gồm
Movb , Movw, Movl, Movf, Movq, Movd, Movg , và Movc3Mỗi hướng dẫn di chuyển chuyển.
một toán hạng của kiểu dữ liệu được chỉ định bởi chữ cái sau Mov.

cần thiết; các địa chỉ lớn không cần phải được phân chia, do đó không có tương
đương với hướng dẫn MIPS lui (xem Hình A.24 trên trang A-37).
Đó vẫn không phải là tất cả các chế độ địa chỉ VAX. Một số có a hoãn lại tùy
chọn, có nghĩa là đối tượng được giải quyết chỉ là Địa chỉ của đối tượng thực, yêu
cầu một bộ nhớ khác truy cập để có được toán hạng. Chế độ địa chỉ này được gọi
giải quyết gián tiếp trong các máy khác. Như thế, đăng ký hoãn lại, tăng tự động
hoãn lại, và byte/từ/dịch chuyển dài hoãn lại là các chế độ địa chỉ khác để chọn từ.
Ví dụ: sử dụng ký hiệu của trình biên dịch VAX, r1 có nghĩa là toán hạng là thanh
ghi 1 và (r1) có nghĩa là toán hạng là vị trí trong bộ nhớ được trỏ tới r1.
Vẫn còn một chế độ địa chỉ khác. Địa chỉ được lập chỉ mục tự động chuyển
đổi giá trị trong toán hạng chỉ mục thành địa chỉ byte thích hợp để thêm vào phần
còn lại của địa chỉ. Đối với một từ 32 bit, chúng ta cần nhân chỉ mục của số
lượng 4 byte với 4 trước khi thêm nó vào một địa chỉ cơ sở. Địa chỉ được lập chỉ
mục, được gọi địa chỉ mở rộng trên một số máy tính, tự động nhân chỉ mục của
số lượng 4 byte với 4 như một phần của tính toán địa chỉ.
Để đối phó với rất nhiều tùy chọn địa chỉ như vậy, kiến trúc VAX tách biệt đặc
tả của chế độ địa chỉ với đặc điểm kỹ thuật của thao tác. Do đó, opcode cung cấp
hoạt động và số lượng toán hạng và mỗi toán hạng có bộ chỉ định chế độ địa chỉ
riêng. Hình D.50 hiển thị tên, ký hiệu trình biên dịch, ví dụ, ý nghĩa và độ dài của
trình xác định địa chỉ.
Kiểu địa chỉ VAX có nghĩa là một thao tác không biết các toán hạng của nó đến từ
đâu; một lệnh thêm VAX có thể có ba toán hạng trong các thanh ghi, ba toán hạng
trong bộ nhớ hoặc bất kỳ sự kết hợp nào của các thanh ghi và toán hạng bộ nhớ.
D.4 Kiến trúc VAX D-53

Chế độ địa chỉ Độ dài của địa chỉ


tên Cú pháp Thí dụ Ý nghĩa xác định theo byte
Nghĩa đen #giá trị #Cẩu1 Cẩu1 1 (Giá trị ký 6 bit)
Ngay lập tức #giá trị # 100 100 1 + chiều dài
ngay lập tức
Đăng ký rn r3 r3 1
Đăng ký hoãn lại (rn) (r3) Bộ nhớ [r3] 1
Byte / từ / dài Dịch chuyển (rn) 100 (r3) Bộ nhớ [r3 + 100] 1 + chiều dài của
chuyển vị chuyển vị
Byte / từ / dài @displocation (rn) @ 100 (r3) Bộ nhớ [Bộ nhớ [r3 + 100]] 1 + chiều dài của
dịch chuyển hoãn lại chuyển vị
Lập chỉ mục (thu nhỏ) Basemode [rx] (r3) [r4] Bộ nhớ [r3 + r4 d] 1 + chiều dài cơ sở
(ở đâu d là kích thước dữ liệu tính
bằng byte) chế độ địa chỉ
Tự động tăng (rn) + (r3) + Bộ nhớ [r3]; r3 = r3 + d 1
Tự động giải mã - (rn) - (r3) r3 = r3 - d; Bộ nhớ [r3] 1
Tự động hoãn lại @ (rn) + @ (r3) + Bộ nhớ [Bộ nhớ [r3]]; r3 = r3 + d 1

HÌNH D.50 Định nghĩa và độ dài của các bộ chỉ định toán hạng VAX. Độ dài của mỗi chế độ địa chỉ là 1 byte cộng
chiều dài của bất kỳ chuyển vị hoặc trường ngay lập tức cần thiết bởi chế độ. Chế độ chữ sử dụng thẻ 2 bit đặc biệt và 6 bit còn
lại mã hóa giá trị không đổi. Nếu hằng số quá lớn, nó phải sử dụng chế độ địa chỉ ngay lập tức. Lưu ý rằng độ dài của một toán
hạng ngay lập tức được quyết định bởi độ dài của kiểu dữ liệu được chỉ định trong opcode, không phải giá trị của tức thời. Biểu
tượng d trong bốn chế độ cuối cùng biểu thị độ dài của dữ liệu tính bằng byte; d là 4 cho thêm 32 bit.

Bao lâu là hướng dẫn sau đây?


VÍ DỤ
add13 r1.737 (r2), (r3) [r4]

Tên addl3 có nghĩa là một lệnh thêm 32 bit với ba toán hạng. Giả sử độ dài
của opcode VAX là 1 byte.
TRẢ LỜI
Các nhà đầu cơ operand đầu tiênr1Địa chỉ đăng ký địa chỉ và dài 1 byte. Các
chỉ định toán hạng thứ hai737 (r2)Địa chỉ dịch chuyển của giáo dục và có hai
phần: Phần đầu tiên là một byte chỉ định chế độ địa chỉ dịch chuyển từ và
thanh ghi cơ sở (r2); phần thứ hai là sự dịch chuyển dài 2 byte (737) Các nhà
đầu cơ toán hạng thứ ba. (r3) [r4]Phần mềm có hai phần: Byte đầu tiên chỉ
định địa chỉ trả chậm chế độ ((r3))và byte thứ hai chỉ định thanh ghi Index và
việc sử dụng địa chỉ được lập chỉ mục ([r4]). Do đó, tổng chiều dài của lệnh
là 1 + (1)
+ (1 + 2) + (1 + 1) = 7 byte.

Trong hướng dẫn ví dụ này, chúng tôi hiển thị toán hạng đích VAX ở bên trái
và toán hạng nguồn ở bên phải, giống như chúng tôi hiển thị mã MIPS. Trình biên
dịch VAX thực sự mong đợi các toán hạng theo thứ tự ngược lại, nhưng chúng tôi
cảm thấy sẽ ít khó hiểu hơn khi giữ đích ở bên trái cho cả hai máy. Rõ ràng, định
hướng trái hoặc phải là tùy ý; yêu cầu duy nhất là tính nhất quán.
D-54 Phụ lục D Khảo sát các kiến trúc tập lệnh

Xây dựng: Bởi vì PC là 1 trong 16 thanh ghi có thể được chọn trong a Chế độ địa
chỉ VAX, 4 trong số 22 chế độ địa chỉ VAX được tổng hợp từ các chế độ địa chỉ khác.
Sử dụng PC làm thanh ghi được chọn trong từng trường hợp, địa chỉ ngay lập tức
thực sự là tự động, tương đối PC là dịch chuyển, tuyệt đối là tự động hoãn lại và
hoãn lại tương đối là dịch chuyển hoãn lại.

Mã hóa hướng dẫn VAX


Với tính độc lập của các hoạt động và chế độ địa chỉ, mã hóa của các hướng dẫn
khá khác so với MIPS .
Các hướng dẫn VAX bắt đầu với một opcode byte đơn chứa hoạt động và số
lượng toán hạng. Các toán hạng theo opcode. Mỗi toán hạng bắt đầu bằng một
byte đơn, được gọi là xác định địa chỉ, mô tả chế độ địa chỉ cho toán hạng đó.
Đối với chế độ địa chỉ đơn giản, chẳng hạn như địa chỉ đăng ký, byte này chỉ
định số đăng ký cũng như chế độ (xem cột ngoài cùng bên phải Hình D.50).
Trong các trường hợp khác, byte ban đầu này có thể được theo sau bởi nhiều byte
khác chỉ định phần còn lại của thông tin địa chỉ.
Như một ví dụ cụ thể, hãy để cho hiển thị mã hóa của hướng dẫn thêm từ ví dụ
trên trang D-24 :

thêm 13 r1, 737 (r2), (r3) [r4]

Giả sử rằng hướng dẫn này bắt đầu tại vị trí 201.
Hình D.51 cho thấy mã hóa. Lưu ý rằng các toán hạng được lưu trữ trong bộ
nhớ theo thứ tự ngược lại với mã lắp ráp ở trên. Việc thực hiện các hướng dẫn
VAX bắt đầu bằng việc tìm nạp các toán hạng nguồn, do đó, việc chúng đến
trước là điều hợp lý. Thứ tự không quan trọng trong các hướng dẫn có độ dài cố
định như MIPS, vì các toán hạng nguồn và đích dễ dàng được tìm thấy trong một
từ 32 bit.
Byte đầu tiên, tại vị trí 201, là opcode. Byte tiếp theo, tại vị trí 202, là một chỉ định cho chế
độ chỉ mục sử dụng thanh ghi r4 Giống như nhiều bộ chỉ định khác, 4 bit bên trái của bộ chỉ
định cung cấp chế độ và 4 bit bên phải cung cấp cho thanh ghi được sử dụng trong chế độ đó.
Kể từ đó. thêm13 là một hoạt động 4 byte , r4 sẽ được nhân với 4 và thêm vào bất kỳ địa chỉ nào

Địa chỉ byte Nội dung tại mỗi byte Mã máy

c1hex
201 Opcode chứa addl3
44
202 Chỉ số kỹ thuật chế độ cho [r4] hex
63
203 Đăng ký chỉ định chế độ gián tiếp cho (r3) hex
Trình xác định chế độ dịch chuyển Word sử dụng r2 làm c2
204 cơ sở hex
e1
205 Hằng số 16 bit 737 hex
02
206 hex
51hex
207 Đăng ký chỉ định chế độ cho r1

HÌNH D.51 Mã hóa của lệnh VAX addl3 r1.737 (r2), (r3) [r4], giả sử nó bắt đầu tại địa chỉ
201. Để thỏa mãn sự tò mò của bạn, cột bên phải hiển thị mã hóa VAX thực tế ký hiệu thập lục phân. Lưu
ý rằng hằng số 16 bit 737mười mất 2 byte.
D.4 Kiến trúc VAX D-55

quy định tiếp theo. Trong trường hợp này, nó được đăng ký địa chỉ hoãn lại bằng
cách sử dụng đăng ký r3Do đó, byte 202 và 203 kết hợp xác định toán hạng thứ ba
trong mã lắp ráp.
Byte sau, tại địa chỉ 204, là một đặc tả cho địa chỉ dịch chuyển từ bằng cách sử
dụng thanh ghi r2 như đăng ký cơ sở. Trình xác định này cho VAX biết rằng hai byte
sau, vị trí 205 và 206, chứa địa chỉ 16 bit được thêm vào r2.
Byte cuối cùng của lệnh cung cấp cho toán hạng đích và trình xác định này
chọn địa chỉ đăng ký bằng cách sử dụng thanh ghi r1.
Sự thay đổi như vậy trong địa chỉ có nghĩa là một hoạt động VAX duy nhất có
thể có nhiều độ dài khác nhau; ví dụ, một số nguyên thêm thay đổi từ 3 byte đến
19 byte. Việc triển khai VAX phải giải mã toán hạng đầu tiên trước khi họ có thể
tìm thấy thứ hai và do đó, những người triển khai bị cám dỗ mạnh mẽ để thực
hiện 1 chu kỳ đồng hồ để giải mã từng toán hạng; do đó, kiến trúc tập lệnh tinh vi
này có thể dẫn đến chu kỳ đồng hồ cao hơn cho mỗi hướng dẫn, ngay cả khi sử
dụng các địa chỉ đơn giản.

Hoạt động VAX


Theo triết lý của nó, VAX có một số lượng lớn các hoạt động cũng như một số lượng lớn các
chế độ địa chỉ. Chúng tôi xem xét một vài ở đây để cung cấp hương vị của máy.
Với sức mạnh của các chế độ địa chỉ, VAX di chuyển hướng dẫn thực hiện
một số hoạt động được tìm thấy trong các máy khác. Nó chuyển dữ liệu giữa bất
kỳ hai vị trí có thể định địa chỉ và tải phụ, lưu trữ, di chuyển đăng ký và di
chuyển bộ nhớ bộ nhớ dưới dạng trường hợp đặc biệt. Chữ cái đầu tiên của kiểu
dữ liệu VAX (b, w, l, f, q, d, g, c in Hình D.49) được thêm vào từ viết tắt Mov để
xác định kích thước của dữ liệu. Một động thái đặc biệt, được gọi di chuyển địa
chỉ, di chuyển địa chỉ 32 bit của toán hạng chứ không phải dữ liệu. Nó sử dụng từ
viết tắt Mova.
Các phép toán số học của MIPS cũng được tìm thấy trong VAX, với hai điểm
khác biệt chính. Đầu tiên, loại dữ liệu được đính kèm với tên. Như thế, addb,
addw , và thêm vào hoạt động trên dữ liệu 8 bit, 16 bit và 32 bit trong bộ nhớ hoặc
thanh ghi, tương ứng; MIPS có một lệnh thêm duy nhất chỉ hoạt động trên thanh
ghi 32 bit đầy đủ. Sự khác biệt thứ hai là để giảm kích thước mã, lệnh thêm chỉ
định số lượng toán hạng duy nhất; MIPS luôn chỉ định ba ngay cả khi một toán
hạng là dư thừa. Ví dụ: hướng dẫn MIPS
thêm $ 1, $ 1, $ 2
mất 32 bit giống như tất cả các hướng dẫn MIPS, nhưng hướng dẫn VAX
thêm l2 r1, r2
sử dụng r1 đối với cả đích và nguồn, chỉ lấy 24 bit: 8 bit cho opcode và mỗi
bit 8 bit cho hai bộ chỉ định thanh ghi.
Số lượng hoạt động
Bây giờ chúng ta có thể chỉ ra cách hình thành tên lệnh VAX :

(hoạt động) (datatype) (23)


Thao tác thêm hoạt động với các kiểu dữ liệu byte, word, long, float và double
và có các phiên bản cho 2 hoặc 3 toán hạng duy nhất, vì vậy tất cả các hướng dẫn
sau đây đều được tìm thấy trong VAX :
D-56 Phụ lục D Khảo sát các kiến trúc tập lệnh

addb2 addw2 thêm12 addf2 add2


addb3 addw3 thêm13 addf3 add3

Kế toán cho tất cả các chế độ địa chỉ (nhưng bỏ qua số đăng ký và giá trị tức
thời) và giới hạn chỉ bằng byte, từ và dài, có hơn 30.000 phiên bản số nguyên
được thêm vào VAX; MIPS chỉ có 4!
Một lý do khác cho số lượng lớn các hướng dẫn VAX là các hướng dẫn thay
thế các chuỗi hướng dẫn hoặc mất ít byte hơn để thể hiện một lệnh duy nhất.
Dưới đây là bốn ví dụ như vậy (∗ có nghĩa là kiểu dữ liệu) :
Hoạt động VAX Thí dụ Ý nghĩa
clr∗ clrl r3 r3 = 0
inc∗ bao gồm r3 r3 = r3 + 1
tháng mười hai∗ giảm r3 r3 = r3 -1
đẩy∗ đẩy r3 sp = sp −4;
Bộ nhớ [sp] = r3;

Các hướng dẫn đẩy ở hàng cuối cùng giống hệt như sử dụng lệnh di chuyển với
địa chỉ tự động phân loại trên con trỏ ngăn xếp :
Movl - (sp), r3
Brevity là lợi thế của pushl: Nó ngắn hơn 1 byte kể từ khi sp được ngụ ý.

Chi nhánh, Nhảy và Thủ tục Gọi


Các hướng dẫn nhánh VAX có liên quan đến các hướng dẫn số học vì các hướng dẫn
nhánh dựa vào mã điều kiện Mã điều kiện được đặt làm tác dụng phụ của thao tác và
chúng cho biết liệu kết quả là dương, âm hay không hoặc nếu xảy ra tràn. Hầu hết các
hướng dẫn đặt mã điều kiện VAX theo kết quả của chúng; hướng dẫn mà không có kết
quả, chẳng hạn như các chi nhánh, không. Các mã điều kiện VAX là N (Tiêu cực), Z
(Không), V (oVerflow) và C (Carry). Ngoài ra còn có một. so sánh hướng dẫn cmp∗ chỉ
để đặt mã điều kiện cho một nhánh tiếp theo.
Các hướng dẫn chi nhánh VAX bao gồm tất cả các điều kiện. Hướng dẫn chi
nhánh phổ biến bao gồm beql (=), bneq (), blss (<), bleq (≤), bgtr (>) và bgeq (≥) , mà
làm những gì bạn mong đợi. Ngoài ra còn có các nhánh vô điều kiện có tên được
xác định bởi kích thước của phần bù tương đối PC. Do đó, brb (chi nhánh byte)
có độ dịch chuyển 8 bit và brw (từ nhánh) có chuyển vị 16 bit.
Danh mục chính cuối cùng chúng tôi đề cập ở đây là thủ tục gọi và trả lại hướng dẫn.
Không giống như kiến trúc MIPS, các hướng dẫn phức tạp này có thể mất hàng chục chu
kỳ đồng hồ để thực thi. Hai phần tiếp theo cho thấy cách chúng hoạt động, nhưng chúng
ta cần giải thích mục đích của các con trỏ liên quan đến ngăn xếp được thao tác bởi các
cuộc gọi và retCác. xếp con trỏ, sp, giống như con trỏ ngăn xếp trong MIPS; nó chỉ lên đầu
của ngăn xếp. Các con trỏ đối số, ap, trỏ đến cơ sở của danh sách các đối số hoặc tham số
trong bộ nhớ được truyền cho thủ tục. Các con trỏ khung, fp, trỏ đến cơ sở của các biến
cục bộ của thủ tục được lưu trong bộ nhớ (the chồng khung hình). Các lệnh gọi và trả về
VAX thao tác các con trỏ này để duy trì ngăn xếp trong điều kiện thích hợp trên các cuộc
gọi thủ tục và để cung cấp cơ sở thuận tiện
D.4 Kiến trúc VAX D-57

Hướng dẫn Thí dụ Hướng dẫn

Truyền dữ liệu Di chuyển dữ liệu giữa các byte, nửa từ, từ hoặc toán hạng hai từ; * là kiểu dữ liệu
di chuyển * Di chuyển giữa hai toán hạng
Di chuyển một byte đến một nửa từ hoặc từ, mở rộng nó bằng số
Movzb * không
Mova * M ove địa chỉ 32 bit của một toán hạng; kiểu dữ liệu là cuối cùng
đẩy* Đẩy toán hạng lên stack
Số học / logic Hoạt động trên các byte số nguyên hoặc logic, nửa từ (16 bit), từ (32 bit); * là dữ liệu
kiểu
thêm * _ Thêm với 2 hoặc 3 toán hạng
cmp * So sánh và đặt mã điều kiện
tst * So sánh với số không và đặt mã điều kiện
tro * Sự dịch chuyển số học
clr * Thông thoáng
cvtb * Ký kết mở rộng byte theo kích thước của kiểu dữ liệu
Điều khiển Chi nhánh có điều kiện và vô điều kiện
beql, bneq Chi nhánh bằng nhau, chi nhánh không bằng nhau
Chi nhánh nhỏ hơn hoặc bằng nhau, chi nhánh lớn hơn hoặc bằng
bleq, bgeq nhau
brb, brw Nhánh vô điều kiện có địa chỉ 8 bit hoặc 16 bit
jmp Nhảy bằng bất kỳ chế độ địa chỉ để chỉ định mục tiêu
aobleq Thêm một vào toán hạng; nhánh nếu kết quả toán hạng hai
trường hợp_ Nhảy dựa trên bộ chọn trường hợp
Thủ tục Gọi / trở về từ thủ tục
các cuộc gọi Thủ tục cuộc gọi với các đối số trên stack (xem phần A A Longer
Ví dụ: sắp xếp trên trang K-33)
gọi Thủ tục cuộc gọi với danh sách tham số kiểu FORTRAN
jsb Chuyển đến chương trình con, lưu địa chỉ trả về (như MIPS jal)
ret Trở về từ thủ tục gọi
Điểm nổi Hoạt động điểm nổi trên các định dạng D, F, G và H
thêm vào Thêm số nổi định dạng D chính xác kép
con_ Trừ các số nổi định dạng D chính xác kép
mulf_ Điểm nổi định dạng F chính xác kép
Đánh giá một đa thức bằng cách sử dụng bảng các hệ số ở định dạng
polyf F
Khác Chuyên môn
crc Tính kiểm tra dự phòng theo chu kỳ
không rõ ràng Chèn một hàng đợi vào một hàng đợi

HÌNH D.52 Các lớp hướng dẫn VAX với các ví dụ. Dấu hoa thị là viết tắt của nhiều loại dữ liệu: b, w, l, d, f, g, h và q.
Các gạch chân, như trong thêm vào, có nghĩa là có 2-operand (addd2) và 3-operand (addd3) các hình thức của hướng dẫn này.
D-58 Phụ lục D Khảo sát các kiến trúc tập lệnh

hoán đổi (int v [], int k)


{
int temp;
temp = v [k];
v [k] = v [k + 1];
v [k + 1] = temp;
}

HÌNH D.53 Một thủ tục C hoán đổi hai vị trí trong bộ nhớ. Quy trình này sẽ được sử dụng
trong ví dụ sắp xếp trong phần tiếp theo.

đăng ký để sử dụng khi truy cập toán hạng bộ nhớ. Như chúng ta sẽ thấy, gọi và
trả lại cũng lưu và khôi phục các thanh ghi mục đích chung cũng như bộ đếm
chương trình. Hình D.52 đưa ra một mẫu tiếp theo của tập lệnh VAX.

Một ví dụ để đặt tất cả lại với nhau: trao đổi


Để xem lập trình bằng ngôn ngữ lắp ráp VAX, chúng tôi dịch hai quy trình C ,
hoán đổi và sắp xếpMã C để hoán đổi được sao chép trong. Hình D.53.
Phần tiếp theo bao gồm sắp xếp.
Chúng tôi mô tả hoán đổi thủ tục trong ba bước chung của lập trình ngôn ngữ
lắp ráp :
1. Phân bổ các thanh ghi cho các biến chương trình.
2. Sản xuất mã cho cơ thể của thủ tục.
3. Bảo quản các thanh ghi trên các yêu cầu thủ tục.
Mã VAX cho các quy trình này dựa trên mã được tạo bởi trình biên dịch VMS
C bằng cách sử dụng tối ưu hóa.

Đăng ký phân bổ để trao đổi


Trái ngược với MIPS, các tham số VAX thường được phân bổ cho bộ nhớ, do đó
bước lập trình ngôn ngữ lắp ráp này được gọi đúng hơn là phân bổ biến đổi.Quy
ước VAX tiêu chuẩn về truyền tham số là sử dụng ngăn xếp. Hai tham số , v [] và
k, có thể được truy cập bằng cách sử dụng đăng ký ap, con trỏ đối số: Địa chỉ 4
(ap) tương ứng với v [] và 8(ap) tương ứng với k. Hãy nhớ rằng với byte giải
quyết địa chỉ của các từ 4 byte tuần tự khác nhau bởi 4. Biến duy nhất khác là
tạm thời, mà chúng tôi liên kết với đăng ký r3.

Mã cho cơ quan của thủ tục trao đổi


Các dòng còn lại của mã C trong trao đổi là

temp = v [k];
v [k] = v [k + 1];
v [k + 1] = temp;
D.4 Kiến trúc VAX D-59

Vì chương trình này sử dụng v [] và k nhiều lần, để làm cho các chương trình
chạy nhanh hơn, trình biên dịch VAX trước tiên di chuyển cả hai tham số vào
các thanh ghi :
Movl r2, 4 (ap); r2 = v []
Movl r1, 8 (ap); r1 = k

Lưu ý rằng chúng tôi tuân theo quy ước VAX về việc sử dụng dấu chấm phẩy
để bắt đầu nhận xét; ký hiệu nhận xét MIPS # đại diện cho một toán hạng không
đổi trong ngôn ngữ lắp ráp VAX.
VAX đã lập chỉ mục địa chỉ, vì vậy chúng tôi có thể sử dụng chỉ mục k mà
không cần chuyển đổi nó thành địa chỉ byte. Mã VAX sau đó đơn giản :
Movl r3, (r2) [r1] ; r3 (nhịp độ) = v [k]
addl3 r0, # 1,8 (ap) ; r0 =k+ 1
di
chuyể
n (r2) [r1] , (r2) [r0] ; v [k] = v [r0] (v [k + 1])
di
chuyể
n (r2) [r0] , r3 ; v [k + 1] = r3 (nhịp độ)
Không giống như mã MIPS, về cơ bản là hai tải và hai cửa hàng, mã VAX
chính là một lần di chuyển từ bộ nhớ đến bộ nhớ, một lần di chuyển từ bộ nhớ
đến bộ nhớ và một lần di chuyển từ bộ nhớ đến bộ nhớ. Lưu ý rằng addl3 lệnh
cho thấy tính linh hoạt của các chế độ địa chỉ VAX: Nó thêm hằng số 1 vào toán
hạng bộ nhớ và đặt kết quả vào một thanh ghi.
Bây giờ chúng tôi đã phân bổ lưu trữ và viết mã để thực hiện các hoạt động
của thủ tục. Mục còn thiếu duy nhất là mã bảo tồn các thanh ghi trong suốt quá
trình gọi hoán đổi.

Bảo quản Đăng ký trên thủ tục Yêu cầu trao đổi
VAX có một cặp hướng dẫn bảo quản các thanh ghi , các cuộc gọi và retVí dụ này
cho thấy cách họ làm việc.
Trình biên dịch VAX C sử dụng một hình thức quy ước callee. Kiểm tra mã ở
trên, chúng tôi thấy rằng các giá trị trong thanh ghi r0, r1, r2 , và r3 phải được lưu
để sau này chúng có thể được khôi phục. Các các cuộc gọi hướng dẫn mong đợi
một mặt nạ 16 bit ở đầu thủ tục để xác định các thanh ghi nào được lưu: nếu bit
Tôi được đặt trong mặt nạ, sau đó đăng ký Tôi được lưu trên ngăn xếp bởi các
cuộc gọi chỉ dẫn. Ngoài ra, các cuộc gọi lưu mặt nạ này trên ngăn xếp để cho phép
hướng dẫn trả về (ret) để khôi phục các thanh ghi thích hợp. Do đó, các cuộc gọi
được thực hiện bởi người gọi thực hiện lưu, nhưng callee đặt mặt nạ cuộc gọi để
chỉ ra những gì cần lưu.
Một trong những toán hạng cho các cuộc gọi đưa ra số lượng tham số được
truyền, để các cuộc gọi có thể điều chỉnh các con trỏ được liên kết với ngăn xếp:
con trỏ đối số (ap), con trỏ khung (fp) và xếp con trỏ (sp). Tất nhiên, các cuộc gọi
cũng lưu bộ đếm chương trình để thủ tục có thể trở lại!
Do đó, để bảo toàn bốn thanh ghi này để trao đổi, chúng tôi chỉ cần thêm mặt nạ ở
đầu quy trình, để cho lệnh gọi trong người gọi thực hiện tất cả công việc :
từ ∧m <r0, r1, r2, r3>; đặt bit trong mặt nạ cho 0, 1, 2, 3
Lệnh này cho trình biên dịch đặt hằng số 16 bit với các bit thích hợp được đặt
để lưu các thanh ghi r0 thông qua r3.
D-60 Phụ lục D Khảo sát các kiến trúc tập lệnh

Các hướng dẫn trở lại hoàn tác công việc của các cuộc gọi Khi hoàn thành ,. ret
đặt con trỏ stack từ con trỏ khung hiện tại để bật mọi thứ các cuộc gọi đặt trên
ngăn xếp. Trên đường đi, nó khôi phục các giá trị đăng ký được lưu bởi các cuộc
gọi, bao gồm cả các giá trị được đánh dấu bằng mặt nạ và các giá trị cũ của fp, ap ,
và máy tính.
Để hoàn thành trao đổi thủ tục, chúng tôi chỉ cần thêm một hướng dẫn :

giữ lại; khôi phục đăng ký và trả lại

Trao đổi thủ tục đầy đủ


Bây giờ chúng tôi đã sẵn sàng cho toàn bộ thói quen. Hình D.54 xác định từng
khối mã với mục đích của nó trong quy trình, với mã MIPS ở bên trái và mã VAX
ở bên phải. Ví dụ này cho thấy lợi thế của địa chỉ được lập chỉ mục theo tỷ lệ và
các hướng dẫn gọi và trả về tinh vi của VAX trong việc giảm số lượng dòng mã.
17 dòng mã lắp ráp MIPS đã trở thành 8 dòng mã lắp ráp VAX. Nó cũng cho thấy
rằng việc truyền các tham số trong bộ nhớ dẫn đến việc truy cập bộ nhớ bổ sung.
Hãy nhớ rằng số lượng hướng dẫn được thực hiện không giống như hiệu suất;
sai lầm trên trang K-38 làm cho điểm này.
Lưu ý rằng phần mềm VAX tuân theo quy ước xử lý các thanh ghi r0 và r1
như các thời gian không được lưu trong một lệnh gọi thủ tục, vì vậy trình biên
dịch VMS C không bao gồm các thanh ghi r0 và r1 trong mặt nạ tiết kiệm đăng
ký. Ngoài ra, trình biên dịch C nên đã sử dụng r1 thay vì 8 (ap) trong addl3 chỉ
dẫn; những ví dụ như vậy truyền cảm hứng cho các kiến trúc sư máy tính để cố
gắng viết trình biên dịch!

MIPS so với VAX


Lưu đăng ký
$ 29, $ 29, hoán đổi: .word ^ m <r0, r1, r2, r3>
trao đổi: addi Mạnh12
sw $ 2, 0 ($ 29)
4 (29 đô
sw $ 15 , la)
8 (29 đô
sw $ 16 , la)
Thủ tục cơ quan
di
muli $ 2, $ 5,4 chuyển r2, 4 (a)
di
thêm $ 2, $ 4, $ 2 chuyển r1, 8 (a)
di
lw $ 15 , 0 ($ 2) chuyển r3, (r2) [r1]
lw $ 16 , 4 ($ 2) addl3 r0, # 1,8 (ap)
di
sw $ 16 , 0 ($ 2) chuyển (r2) [r1], (r2) [r0]
di
sw $ 15 , 4 ($ 2) chuyển (r2) [r0], r3
Khôi phục sổ đăng ký
lw $ 2, 0 ($ 29)
lw $ 15 , 4 (29 đô la)
lw $ 16 , 8 (29 đô la)
addi $ 29, $ 29, 12
Thủ tục trả lại
jr $ 31 ret

HÌNH D.54 MIPS so với mã lắp ráp VAX của trao đổi thủ tục trong Hình D.53 trên trang D-
58.
D.4 Kiến trúc VAX D-61

Một ví dụ dài hơn: sắp xếp


Chúng tôi hiển thị ví dụ dài hơn về thủ tục sắp xếp. Hình D.55 hiển thị phiên bản
C của chương trình. Một lần nữa, chúng tôi trình bày quy trình này theo nhiều
bước, kết luận với so sánh song song với mã MIPS.
Đăng ký phân bổ để sắp xếp
Hai tham số của loại thủ tục, v và n, được tìm thấy trong ngăn xếp ở vị trí 4
(ap) và 8 (ap), tương ứng. Hai biến cục bộ được gán cho các thanh ghi: i đến r6
và j đến r4. Vì hai tham số được tham chiếu thường xuyên trong mã, trình biên
dịch VMS C sao chép Địa chỉ của các tham số này vào các thanh ghi khi nhập
thủ tục :
; di
di chuyển r7 , 8 (ap) chuyển Địa chỉ của n vào r7
; di
di chuyển r5 , 4 (ap) chuyển Địa chỉ của v vào r5
Có vẻ như di chuyển giá trị của toán hạng cho một thanh ghi sẽ hữu ích hơn địa chỉ
của nó, nhưng một lần nữa chúng ta lại đi theo quyết định của trình biên dịch VMS C. Rõ
ràng trình biên dịch không thể chắc chắn rằng v và n don lồng trùng nhau trong bộ nhớ.

Mã cho cơ quan của thủ tục sắp xếp


Cơ thể thủ tục bao gồm hai lồng nhau cho các vòng lặp và một cuộc gọi để trao
đổi, bao gồm các tham số. Hãy để mở mã từ bên ngoài đến giữa.
Vòng ngoài
Bước dịch đầu tiên là bước đầu tiên cho vòng lặp :

cho (i = 0; i <n; i = i + 1) {
Hãy nhớ lại rằng C cho câu lệnh có ba phần: khởi tạo, kiểm tra vòng lặp và
tăng lặp. Chỉ cần một lệnh để khởi tạo i thành 0, phần đầu tiên của câu lệnh for :
clrl r6; i = 0
Nó cũng chỉ mất một lệnh để tăng i, phần cuối cùng của :
bao gồm r6 ;i=i+1

sắp xếp (int v [], int n)


{
int i, j;
cho (i = 0; i <n; i = i + 1) {
cho (j = i - 1; j> = 0 && v [j]> v [j + 1]; j = j - 1)
{hoán đổi (v, j);
}
}
}

HÌNH D.55 Một thủ tục C thực hiện sắp xếp bong bóng trên mảng v.
D-62 Phụ lục D Khảo sát các kiến trúc tập lệnh

Vòng lặp sẽ được thoát nếu i <n là saihoặc nói một cách khác, thoát khỏi vòng
lặp nếu i≥.
nBài kiểm tra này có hai hướng dẫn :.

for1tst: cmpl r6, (r7); so sánh r6 và bộ nhớ [r7] (i: n)


bgeq thoát1 ; đi đến lối ra1 nếu r6 mem [r7] (i≥n)
Lưu ý rằng cmpl đặt mã điều kiện để sử dụng theo hướng dẫn nhánh có điều
kiện bgeq.
Phần dưới của vòng lặp chỉ nhảy trở lại bài kiểm tra vòng lặp :

brb for1tst; chi nhánh để kiểm tra vòng ngoài


lối ra1 :

Mã bộ xương đầu tiên cho vòng lặp là sau đó

clrl r6 ;i=0
for1tst: cmpl r6, (r7) ; so sánh r6 và bộ nhớ [r7] (i: n)
bgeqexit1 ; đi đến lối ra1 nếu r6 mem [r7] (i n)
...
(cơ thể đầu tiên cho vòng lặp)
...
bao gồm r6 ;i=i+1
brb for1tst ; nhánh để kiểm tra vòng lặp bên ngoài
lối ra1 :

Vòng trong
Thứ hai cho vòng lặp là

cho (j = i - 1; j> = 0 && v [j]> v [j + 1]; j = j - 1) {


Phần khởi tạo của vòng lặp này lại là một hướng dẫn :
subl3 r4, r6, # 1 ; j = i sâu 1
Sự suy giảm của j cũng là một hướng dẫn :
giảm r4 ;j=j1
Các bài kiểm tra vòng lặp có hai phần. Chúng tôi thoát khỏi vòng lặp nếu một
trong hai điều kiện không thành công, vì vậy thử nghiệm đầu tiên phải thoát khỏi
vòng lặp nếu nó không thành công (j <0):
for2tst: blss lối ra2 ; đi đến exit2 nếu r4 <0 (j <0)
Lưu ý rằng không có so sánh rõ ràng. Việc thiếu so sánh là một lợi ích của mã
điều kiện, với các điều kiện được đặt làm tác dụng phụ của hướng dẫn trước. Chi
nhánh này bỏ qua bài kiểm tra điều kiện thứ hai.
Bài kiểm tra thứ hai thoát ra nếu v [j]> v [j + 1] là sai, hoặc thoát nếu v [j] v [j +
1].
Đầu tiên chúng tôi tải v và đặt j + 1 vào các thanh ghi :
di chuyển r3, (r5) ; r3 = Bộ nhớ [r5] (r3 = v)
addl3 r2, r4, # 1 ; r2 = r4 + 1 (r2 = j+ 1)
D.4 Kiến trúc VAX D-63

Đăng ký địa chỉ gián tiếp được sử dụng để có được toán hạng được chỉ ra bởi r5.
Một lần nữa, chế độ địa chỉ chỉ mục có nghĩa là chúng ta có thể sử dụng các
chỉ mục mà không cần chuyển đổi sang địa chỉ byte, vì vậy hai hướng dẫn cho v
[j] v [j + 1] là

cmpl (r3) [r4], (r3) [r2]; v [r4]: v [r2] (v [j]: v [j + 1])


thoát bleq2 ; đi đến exit2 nếu v [j] v [j + 1]
Phần dưới của vòng lặp nhảy trở lại bài kiểm tra vòng lặp đầy đủ :
brb cho 2tst # nhảy để kiểm tra vòng lặp bên trong
Kết hợp các mảnh, vòng thứ hai cho vòng lặp trông như thế này :
subl3 r4, r6, # 1 ;j=i-1
for2tst: blss exit2 ; đi đến exit2 nếu r4 <0 (j <0)
Movl r3, (r5) ; r3 = Bộ nhớ [r5] (r3 = v)
addl3 r2, r4, # 1 ; r2 = r4 + 1 (r2 = j + 1)
cmpl (r3) [r4], (r3) [r2]; v [r4]: v [r2]
thoát bleq2 ; đi đến exit2 nếu v [j] ð [j + 1]
...
(cơ thể thứ hai cho vòng lặp)...
giảm r4 ;j=j-1
brb for2tst ; nhảy để kiểm tra thoát vòng lặp bên trong2 :

Lưu ý rằng hướng dẫn blss (ở đầu vòng lặp) đang kiểm tra mã điều kiện dựa
trên giá trị mới của r4 (j) , đặt bởi subl3 trước khi vào vòng lặp hoặc bởi giảm ở
dưới cùng của vòng lặp.

Cuộc gọi thủ tục


Bước tiếp theo là phần thân của vòng lặp thứ hai :

hoán đổi (v, j);


Gọi hoán đổi là đủ dễ dàng :
các cuộc gọi # 2, hoán đổi
Hằng số 2 cho biết số lượng tham số được đẩy trên ngăn xếp.

Thông số vượt qua


Trình biên dịch C vượt qua các biến trên ngăn xếp, vì vậy chúng tôi chuyển các
tham số để trao đổi với hai hướng dẫn sau :
đẩy (r5) ; tham số hoán đổi đầu tiên là v
đẩy r4 ; tham số hoán đổi thứ hai là j
Đăng ký địa chỉ gián tiếp được sử dụng để có được toán hạng của hướng dẫn đầu tiên.
D-64 Phụ lục D Khảo sát các kiến trúc tập lệnh

Bảo quản Đăng ký trên thủ tục Gọi sắp xếp


Mã duy nhất còn lại là lưu và khôi phục các thanh ghi bằng cách sử dụng quy
ước lưu callee. Thủ tục này sử dụng các thanh ghi r2 thông qua r7, vì vậy chúng
tôi thêm một mặt nạ với các bit được đặt :
.word ˆm <r2, r3, r4, r5, r6, r7>; đặt mặt nạ cho thanh ghi 2-7
Vì ret sẽ hoàn tác tất cả các hoạt động, chúng tôi chỉ giải quyết nó vào cuối thủ tục.

Các loại thủ tục đầy đủ


Bây giờ chúng tôi đặt tất cả các mảnh lại với nhau Hình D.56Để làm cho mã dễ
theo dõi hơn, một lần nữa chúng tôi xác định từng khối mã với mục đích của nó
trong quy trình và liệt kê mã MIPS và VAX cạnh nhau. Trong ví dụ này, 11 dòng
của quy trình sắp xếp trong C trở thành 44 dòng trong ngôn ngữ lắp ráp MIPS và
20 dòng trong ngôn ngữ lắp ráp VAX. Những lợi thế lớn nhất của VAX là tiết
kiệm đăng ký và khôi phục và lập chỉ mục địa chỉ.

Ngụy biện và Cạm bẫy


Khả năng đơn giản hóa có nghĩa là loại bỏ những thứ không cần thiết để có thể nói.
Hans Hoffman
Tìm kiếm Real (1967)
Ngụy biện Có thể thiết kế một kiến trúc hoàn hảo.
Tất cả các thiết kế kiến trúc liên quan đến sự đánh đổi được thực hiện trong bối
cảnh của một bộ công nghệ phần cứng và phần mềm. Theo thời gian, những công
nghệ đó có khả năng thay đổi và những quyết định có thể đúng một lúc sau đó trông
giống như những sai lầm. Ví dụ, vào năm 1975, các nhà thiết kế VAX đã nhấn mạnh
tầm quan trọng của hiệu quả kích thước mã và đánh giá thấp mức độ dễ dàng giải mã
và đường ống quan trọng sẽ là 10 năm sau đó. Và, hầu như tất cả các kiến trúc cuối
cùng đều chịu thua việc thiếu không gian địa chỉ. Tuy nhiên, tránh những vấn đề này
trong thời gian dài có lẽ có nghĩa là làm tổn hại đến hiệu quả của kiến trúc trong thời
gian ngắn.
Ngụy biện Một kiến trúc với sai sót không thể thành công.
IBM 360 thường bị chỉ trích trong tài liệu, các chi nhánh không liên quan đến PC và
địa chỉ quá nhỏ trong địa chỉ dịch chuyển. Tuy nhiên, máy đã thành công rực rỡ vì nó xử
lý chính xác một số vấn đề mới. Đầu tiên, kiến trúc có một lượng lớn không gian địa chỉ.
Thứ hai, nó được giải quyết byte và xử lý tốt byte. Thứ ba, nó là một máy đăng ký đa năng.
Cuối cùng, nó đủ đơn giản để được thực hiện hiệu quả trên phạm vi hiệu suất và chi phí
rộng.
Intel 8086 cung cấp một ví dụ thậm chí còn ấn tượng hơn. Kiến trúc 8086 là
kiến trúc phổ biến duy nhất tồn tại ngày nay không thực sự là một máy đăng ký
mục đích chung. Hơn nữa, không gian địa chỉ được phân đoạn của 8086 gây ra
vấn đề lớn cho cả lập trình viên và người viết trình biên dịch. Tuy nhiên, kiến
trúc 8086, do được chọn là bộ vi xử lý trong IBM PC, đã rất thành công.
Ngụy biện Kiến trúc thực hiện ít hướng dẫn hơn là nhanh hơn.
D.4 Kiến trúc VAX D-65

MIPS so với VAX

Lưu đăng ký jr $ 31
sắp xếp: addi $ 29, $ 29, Số 36
sw $ 15, 0 ($ 29)
sw $ 16, 4 ($ 29)
sw $ 17, 8 ($ 29)
sw $ 18,12 ($ 29)
sw $ 19,16 ($ 29)
sw $ 20,20 ($ 29)
sw $ 24,24 ($ 29)
sw $ 25,28 ($ 29)
sw $ 31,32 ($ 29)
Thủ tục cơ quan
di
Di chuyển các chuyể
tham số n $ 18, $ 4
di
chuyể
Vòng ngoài n $ 20, $ 5
thêm $ 19, $ 0, $ 0
for1tst: slt $ 8, $ 19, $ 20
beq $ 8, $ 0, thoát1

for2tst: slti $ 8, $ 17, 0


Vòng lặp bên
bne $ 8, $ 0, thoát2
trong muli $ 15, $ 17, 4
thêm $ 16, $ 18, $ 15
lw $ 24, 0 ($ 16)
lw $ 25, 4 ($ 16)
slt $ 8, $ 25, $ 24
beq $ 8, $ 0, thoát2
Truyền tham số di
và gọi chuyể
n $ 4, $ 18
Vòng lặp bên di
trong chuyể
n $ 5, $ 17
Vòng ngoài jal hoán đổi
addi $ 17, $ 17, Mạnh1
j for2tst
lối ra2 : addi $ 19, $ 19, 1
j for1tst
Khôi phục sổ đăng ký
lối ra1 : lw $ 15,0 ($ 29)
lw $ 16, 4 ($ 29)
lw $ 17, 8 ($ 29)
lw $ 18,12 ($ 29)
lw $ 19,16 ($ 29)
lw $ 20,20 ($ 29)
lw $ 24,24 ($ 29)
lw $ 25,28 ($ 29)
lw $ 31,32 ($ 29)
addi $ 29, $ 29, 36
Thủ tục trả lại
for1tst : cmpl r6, (r7) bao
bgeq lối ra1 lối ra2 : gồm r6
sắp xếp: .word ^ m subl3 r4, r6, # 1 brb for1tst
<r2, r3, r4, r5, r6, r7>
blss lối ra2
di
chuyển r3, (r5)

addl3 r2, r4, # 1


cmpl (r3) [r4], (r3) [r2]
bleq lối ra2
đẩy (r5)
đẩy r4
di các
chuyển r7,8 (ap) cuộc
di gọi # 2, hoán đổi lối ra1 : ret
chuyển r5,4 (ap) giảm r4
clrl r6 brb for2tst

HÌNH D.56 MIPS32 so với phiên bản lắp ráp VAX của quy trình sắp xếp Hình D.55 trên trang D-61.
D-66 Phụ lục D Khảo sát các kiến trúc tập lệnh

Các nhà thiết kế máy VAX đã thực hiện so sánh định lượng VAX và MIPS để
triển khai với các tổ chức tương đương, VAX 8700 và MIPS M2000. Hình D.57
cho thấy tỷ lệ của số lượng hướng dẫn được thực hiện và tỷ lệ hiệu suất được đo
trong các chu kỳ đồng hồ. MIPS thực hiện khoảng gấp đôi số hướng dẫn so với
VAX trong khi MIPS M2000 có hiệu suất gần gấp ba lần so với VAX 8700.

Kết luận
Địa chỉ ảo eXtension của kiến trúc PDP-11 ... cung cấp địa chỉ ảo khoảng 4,3
gigabyte, thậm chí còn được cải tiến nhanh chóng về công nghệ bộ nhớ, sẽ đủ xa
trong tương lai.
William Strecker
Phần mềm 11-780 Phần mở rộng địa chỉ ảo cho gia đình PDP-
11, trực tiếp AFIPS Proc., Hội nghị máy tính quốc gia (1978)
Chúng tôi đã thấy rằng các bộ hướng dẫn có thể thay đổi khá lớn, cả về cách
chúng truy cập các toán hạng và trong các thao tác có thể được thực hiện bởi một
lệnh duy nhất. Hình D.58 so sánh việc sử dụng hướng dẫn cho cả hai kiến trúc
cho hai chương trình; thậm chí các kiến trúc rất khác nhau hoạt động tương tự
trong việc sử dụng các lớp hướng dẫn.
Một sản phẩm của thời đại của nó, VAX nhấn mạnh vào mật độ mã và các thao
tác phức tạp và các chế độ địa chỉ mâu thuẫn với sự nhấn mạnh hiện tại về giải
mã dễ dàng, các thao tác đơn giản và các chế độ địa chỉ và hiệu suất đường ống.

3.5
Hướng dẫn thực hiện Hiệu suất
3

2.5
MIPS / VAX

1.5

0,5

0 tinh
gia vị ma trận nasa7 fpppp tomcatv ranh espresso eqntott li
Số bit dịch chuyển

HÌNH D.57 Tỷ lệ MIPS M2000 đến VAX 8700 trong các hướng dẫn được thực hiện và hiệu
suất trong các chu kỳ đồng hồ sử dụng các chương trình Spec89. Trung bình, MIPS thực
hiện gấp đôi số lượng hướng dẫn là VAX, nhưng CPI cho VAX gần gấp sáu lần CPI MIPS, mang lại lợi
thế hiệu suất gần gấp ba lần. Dựa trên dữ liệu từ Hiệu suất của Kiến trúc từ Kiến trúc: So sánh RISC và
CISC với Tổ chức phần cứng tương tự, bởi D. Bhandarkar và D. Clark, ở Proc. Symp. Hỗ trợ kiến trúc
cho các ngôn ngữ lập trình và hệ điều hành IV, 1991.
D.4 Kiến trúc VAX D-67

Với hơn 600.000 được bán ra, kiến trúc VAX đã có một hoạt động rất thành
công. Năm 1991, DEC đã thực hiện quá trình chuyển đổi từ VAX sang Alpha.
Chỉnh hình là chìa khóa cho kiến trúc VAX; opcode độc lập với các chế độ địa chỉ,
độc lập với các loại dữ liệu và thậm chí số lượng toán hạng duy nhất. Do đó, một vài trăm
thao tác mở rộng đến hàng trăm ngàn hướng dẫn khi tính toán các loại dữ liệu, số lượng
toán hạng và chế độ địa chỉ.

Bài tập
D.1 [3] <D.4> Các lệnh VAX sau đây làm giảm vị trí được chỉ ra được đăng ký
r5 :
giảm (r5)
Lệnh MIPS đơn là gì hoặc nếu nó không thể được biểu diễn trong một lệnh
duy nhất, chuỗi hướng dẫn MIPS ngắn nhất, thực hiện cùng một thao tác? Độ dài
của các hướng dẫn trên mỗi máy là gì?
D.2 [5] <D.4> Bài tập này giống như Bài tập D.1, ngoại trừ VAX này hướng dẫn
xóa một vị trí bằng cách sử dụng địa chỉ trả chậm tự động :
clrl @ (vr5) +
D.3 [5] <D.4> Bài tập này giống như Bài tập D.1, ngoại trừ VAX này hướng dẫn
thêm 1 để đăng ký r5, đặt tổng trở lại trong thanh ghi r5, so sánh tổng với thanh
ghi r6, sau đó các nhánh với L1 nếu r5 <r6 :
aoblss r6, r5, L1 # r5 = r5 + 1; nếu (r5 <r6)
đi đến L1.
D.4 [5] <D.4> Hiển thị hướng dẫn VAX duy nhất hoặc trình tự tối thiểu hướng
dẫn, cho tuyên bố C này :
a = b + 100;
Giả sử a tương ứng với đăng ký r3 và b tương ứng với đăng ký r4.
D.5 [10] <D.4> Hiển thị hướng dẫn VAX duy nhất hoặc trình tự tối thiểu hướng
dẫn, cho tuyên bố C này :
x [i + 1] = x [i] + c;
Giả sử c tương ứng với đăng ký r3, i để đăng ký r4 và x là một mảng các từ 32
bit bắt đầu tại vị trí bộ nhớ 4.000.000mười.

Số học / Dữ liệu Nổi


Chương chuyển Tổng
trình Máy móc Chi nhánh logic nhượng điểm cộng
gcc VAX 30% 40% 19% 89%
MIP S 24% 35% 27% 86%
gia vị VAX 18% 23% 15% 23% 79%
MIPS 4% 29% 35% 15% 83%

HÌNH D.58 Tần suất phân phối lệnh cho hai chương trình trên VAX và MIPS .
D-68 Phụ lục D Khảo sát các kiến trúc tập lệnh

D.5 Kiến trúc IBM 360/370 cho


Máy tính máy tính lớn

Giới thiệu
Thuật ngữ kiến trúc máy tính của người Viking được IBM đặt ra vào năm 1964 để sử
dụng với IBM
360. Amdahl, Blaauw và Brooks [1964] đã sử dụng thuật ngữ này để chỉ phần lập
trình viên có thể nhìn thấy trong tập lệnh. Họ tin rằng một gia đình máy móc có cùng
kiến trúc sẽ có thể chạy cùng một phần mềm. Mặc dù ý tưởng này có vẻ hiển nhiên
đối với chúng ta ngày nay, nhưng nó khá mới lạ vào thời điểm đó. IBM, mặc dù là
công ty hàng đầu trong ngành, có năm kiến trúc khác nhau trước 360. Do đó, khái
niệm về một công ty tiêu chuẩn hóa trên một kiến trúc duy nhất là một kiến trúc cấp
tiến. 360 nhà thiết kế hy vọng rằng sáu bộ phận khác nhau của IBM có thể được kết
hợp với nhau bằng cách xác định một điểm chung kiến trúc Định nghĩa của họ về.
kiến trúc đã

… cấu trúc của một máy tính mà một lập trình viên ngôn ngữ máy phải hiểu
để viết một chương trình chính xác (độc lập về thời gian) cho máy đó.
Thuật ngữ lập trình viên ngôn ngữ máy có nghĩa là khả năng tương thích sẽ
giữ, ngay cả trong ngôn ngữ lắp ráp, trong khi thời gian độc lập cho phép thực
hiện khác nhau.
IBM 360 được giới thiệu vào năm 1964 với sáu mẫu và tỷ lệ hiệu suất 25: 1.
Amdahl, Blaauw và Brooks [1964] đã thảo luận về kiến trúc của IBM 360 và
khái niệm cho phép nhiều triển khai tương thích mã đối tượng. Khái niệm về một
kiến trúc tập lệnh như chúng ta hiểu ngày nay là khía cạnh quan trọng nhất của
360. Các kiến trúc cũng giới thiệu một số đổi mới quan trọng, hiện đang được sử
dụng rộng rãi :
1. Kiến trúc 32 bit
2. Bộ nhớ có thể định địa chỉ byte với byte 8 bit
3. Kích thước dữ liệu 8-, 16-, 32- và 64 bit
4. Dữ liệu dấu phẩy động chính xác đơn 32 bit và độ chính xác kép 64 bit
Năm 1971, IBM đã xuất xưởng System / 370 (model 155 và 165) đầu tiên, bao
gồm một số phần mở rộng quan trọng của 360, như được thảo luận bởi Case và
Padegs [1978], người cũng đã thảo luận về lịch sử ban đầu của System / 360. Sự bổ
sung quan trọng nhất là bộ nhớ ảo, mặc dù bộ nhớ ảo 370 giây không xuất xưởng cho
đến năm 1972, khi một hệ điều hành bộ nhớ ảo đã sẵn sàng. Đến năm 1978, chiếc
370 cao cấp nhanh hơn vài trăm lần so với chiếc 360 cấp thấp được vận chuyển 10
năm trước đó. Năm 1984, mô hình địa chỉ 24 bit được tích hợp trong IBM 360 cần
phải được từ bỏ và 370-XA (Kiến trúc eXtends) đã được giới thiệu. Mặc dù các
chương trình 24 bit cũ có thể được hỗ trợ mà không thay đổi, một số hướng dẫn
không thể hoạt động giống nhau
D.5 Kiến trúc IBM 360/370 cho Máy tính Mainframe D-69

cách thức khi được mở rộng sang mô hình địa chỉ 32 bit (được hỗ trợ địa chỉ 31 bit)
vì chúng sẽ không tạo ra địa chỉ 31 bit. Chuyển đổi hệ điều hành, được viết chủ yếu
bằng ngôn ngữ lắp ráp, không nghi ngờ gì là nhiệm vụ lớn nhất.
Một số nghiên cứu về IBM 360 và đo lường hướng dẫn đã được thực hiện.
Luận án Shustek sườn [1978] là nghiên cứu nổi tiếng và đầy đủ nhất về kiến trúc
360/370. Ông đã thực hiện một số quan sát về độ phức tạp của tập lệnh không
được đánh giá đầy đủ cho đến một số năm sau đó. Một nghiên cứu quan trọng
khác về 360 là nghiên cứu Toronto của Alexander và Wortman [1975] được thực
hiện trên IBM 360 bằng cách sử dụng 19 chương trình XPL.

Bộ hướng dẫn hệ thống / 360


Tập lệnh 360 được hiển thị trong các bảng sau, được sắp xếp theo loại lệnh và
định dạng. Hệ thống / 370 chứa 15 hướng dẫn sử dụng bổ sung.
Hướng dẫn R-R số nguyên / logic và nổi
Các ∗ chỉ ra lệnh là dấu phẩy động và có thể là D (độ chính xác kép) hoặc E
(độ chính xác đơn).

Hướng dẫn Sự miêu tả


ALR Thêm đăng ký logic
AR Thêm đăng ký
A∗R Bổ sung FP
CLR So sánh đăng ký logic
CR So sánh đăng ký
C∗R So sánh FP

DR Chia đăng ký
D∗R Phân chia FP
H∗R FP giảm một nửa

LCR Tải đăng ký bổ sung

LC∗R Tải bổ sung

LNR Tải đăng ký âm


LN∗R Tải âm

LPR Tải đăng ký tích cực


LP∗R Tải tích cực

LR Tải đăng ký
L∗R Tải đăng ký FP

LTR Tải và đăng ký thử nghiệm

LT∗R Tải và kiểm tra đăng ký FP

ÔNG Đăng ký nhân

M∗R FP nhân lên

NR Và đăng ký

HOẶC LÀ Hoặc đăng ký


D-70 Phụ lục D Khảo sát các kiến trúc tập lệnh

Hướng dẫn Sự miêu tả


Máy ảnh DSLR Trừ đăng ký logic

SR Trừ đăng ký
S∗ R Phép trừ FP
XR Độc quyền hoặc đăng ký

Chi nhánh và cài đặt trạng thái Hướng dẫn R-R


Đây là các hướng dẫn định dạng R-R mà chi nhánh hoặc đặt một số trạng thái
hệ thống; một số trong số họ là đặc quyền và pháp lý chỉ trong chế độ giám sát.

Hướng dẫn Sự miêu tả


BALR Chi nhánh và liên kết
BCTR Chi nhánh đếm
BCR Chi nhánh / điều kiện
ISK Chèn khóa
SPM Đặt mặt nạ chương trình

SSK Đặt khóa lưu trữ

SVC Giám sát gọi

Chi nhánh / Hướng dẫn logic và nổi-Điểm Định dạng RX


Đây là tất cả các hướng dẫn định dạng RX. Ký hiệu + + có nghĩa là một từ
hoạt động (và sau đó là không có gì) hoặc H (có nghĩa là một nửa từ); ví dụ, A +
là viết tắt của hai opcodes A và AH. Các"∗VÒNG đại diện cho D hoặc E, đứng
cho điểm nổi chính xác kép hoặc đơn.

Hướng dẫn Sự miêu tả


A+ Thêm vào
A∗ Thêm FP
AL Thêm logic
C+ So sánh
C∗ So sánh FP
CL So sánh logic

D Chia
D∗ Phân chia FP

L+ Tải
L∗ Tải đăng ký FP

M+ Nhân lên
M∗ FP nhân lên

N Và

Ôi Hoặc là

S+ Trừ
D.5 Kiến trúc IBM 360/370 cho Máy tính Mainframe D-71

Hướng dẫn Sự miêu tả


S∗ Trừ FP
SL Trừ logic
ST + Cửa hàng
ST∗ Lưu trữ đăng ký FP

X Độc quyền hay

Chi nhánh và tải trọng đặc biệt và cửa hàng Định dạng RX

Hướng dẫn Sự miêu tả


BAL Chi nhánh và liên kết
BC Điều kiện chi nhánh

BCT Chi nhánh đếm

CVB Chuyển đổi nhị phân


CVD Chuyển đổi thập phân

EX Thực hiện
IC Chèn ký tự

LA Địa chỉ tải

STC Lưu trữ nhân vật

Hướng dẫn định dạng RS và SI


Đây là các hướng dẫn định dạng RS và SI. Biểu tượng∗Có thể là A (số học)
hoặc L (logic).

Hướng dẫn Sự miêu tả


BXH Chi nhánh / cao
BXLE Chi nhánh / thấp bằng nhau
CLI So sánh logic ngay lập tức

HIO Dừng I / O
LPSW Tải PSW
LM Tải nhiều
MVI Di chuyển ngay lập tức

NI Và ngay lập tức

Ôi Hoặc ngay lập tức

RDD Đọc trực tiếp

SIO Bắt đầu I / O


SL∗ Chuyển sang trái A / L
SLD∗ Chuyển sang trái đôi A / L
SR∗ Chuyển sang phải A / L

SRD∗ Chuyển sang phải gấp đôi A / L


D-72 Phụ lục D Khảo sát các kiến trúc tập lệnh

Hướng dẫn Sự miêu tả


SSM Đặt mặt nạ hệ thống
STM Lưu trữ nhiều
TCH Kênh thử nghiệm
TIO Kiểm tra I / O
TM Kiểm tra dưới mặt nạ
TS Kiểm tra và thiết lập
WRD Viết trực tiếp
XI Độc quyền hoặc ngay lập tức

Hướng dẫn định dạng SS


Đây là thêm hướng dẫn thập phân hoặc chuỗi.

Hướng dẫn Sự miêu tả


AP Thêm đóng gói
CLC So sánh các ký tự logic
CP So sánh đóng gói
DP Chia gói
ED Chỉnh sửa
EDMK Chỉnh sửa và đánh dấu
MP Nhân lên

MVC Di chuyển nhân vật

MVN Di chuyển số

MVO Di chuyển với bù

MVZ Di chuyển khu vực

NC Và nhân vật

OC Hoặc nhân vật

GÓI Gói (Nhân vật → số thập phân)

SP Trừ đóng gói

TR Dịch

TRT Dịch và kiểm tra

UNPK Giải nén

XC Độc quyền hoặc nhân vật

ZAP Không và thêm đóng gói


Hướng dẫn NH FORTGO VÒI COBOLGO Trung bình
ỰA
Điều khiển 32% 13% 5% 16% 16%
BC, BCR 28% 13% 5% 14% 15%
BAL, BALR 3% 2% 1%
Số học / logic 29% 35% 29% 9% 26%
A, AR 3% 17% 21% 10%
SR 3% 7% 3%
SLL 6% 3% 2%
LA 8% 1% 1% 2%
CLI 7% 2%
NI 7% 2%
C 5% 4% 4% 0% 3%
TM 3% 1% 3% 2%
MH 2% 1%
Truyền dữ liệu 17% 40% 56% 20% 33%
L, LR 7% 23% 28% 19% 19%
MVI 2% 16% 1% 5%
ST 3% 7% 3%
LD 7% 2% 2%
STD 7% 2% 2%
LPDR 3% 1%
LH 3% 1%
IC 2% 1%
LTR 1% 0%
Điểm nổi 7% 2%
QUẢNG CÁO 3% 1%
MDR 3% 1%
Số thập phân, chuỗi 4% 40% 11%
MVC 4% 7% 3%
AP 11% 3%
ZAP 9% 2%
CVD 5% 1%
MP 3% 1%
CLC 3% 1%
CP 2% 1%
ED 1% 0%

Tổng cộng 82% 95% 90% 85% 88%

HÌNH D.59 Phân phối tần số thực hiện lệnh cho bốn chương trình 360. Tất cả các hướng dẫn có tần
suất thực hiện lớn hơn 1,5% được bao gồm. Các hướng dẫn tức thời, chỉ hoạt động trên một byte đơn, được bao
gồm trong phần đặc trưng cho hoạt động của chúng, thay vì với các phiên bản chuỗi ký tự dài của cùng một hoạt
động. Để so sánh, tần số trung bình cho các lớp lệnh chính của VAX là 23% (điều khiển), 28% (số học), 29%
(chuyển dữ liệu), 7% (điểm nổi) và 9% (số thập phân). Một lần nữa, mục nhập 1% trong cột trung bình có thể xảy
ra do các mục trong các cột cấu thành. Các chương trình này là trình biên dịch cho ngôn ngữ lập trình PL-I và hệ
thống thời gian chạy cho các ngôn ngữ lập trình FORTRAN, PL / I và Cobol.
D-74 Phụ lục D Khảo sát các kiến trúc tập lệnh

360 phép đo chi tiết


Hình D.59 hiển thị tần suất sử dụng lệnh cho bốn chương trình IBM 360.

D.6 Quan điểm lịch sử và tài liệu tham khảo

Mục L.4 của Kiến trúc máy tính: Cách tiếp cận định lượng, Phiên bản thứ 6 (có
sẵn trực tuyến) có một cuộc thảo luận về sự phát triển của các bộ hướng dẫn và
bao gồm các tài liệu tham khảo để đọc thêm và khám phá các chủ đề liên quan.

Lời cảm ơn
Chúng tôi xin cảm ơn những người sau đây đã nhận xét về dự thảo của cuộc khảo
sát này: Giáo sư Steven B. Furber, Đại học Manchester; Tiến sĩ. Dileep
Bhandarkar, Tập đoàn Intel; Tiến sĩ. Earl Killian, Đồ họa Silicon / MIPS; và Tiến
sĩ. Hiokazu Takata, Tập đoàn điện tử Mitsubishi.

Đọc thêm
Alexander, W.G., Wortman, D.B., 1975. Đặc điểm tĩnh và động của các chương trình XPL. Máy tính IEEE.
8 (11), 41 trận46.
Amdahl, G.M., Blaauw, G.A., Brooks Jr., F.P., 1964. Kiến trúc của Hệ thống IBM 360.IBM J. Res. Dev. 8
(2), 87 bóng101.
Bhandarkar, D.P., Clark, D.W., 1991. Hiệu suất từ kiến trúc: so sánh RISC và CISC với các tổ chức phần
cứng tương tự. Trong: Kỷ yếu của Hội nghị quốc tế lần thứ tư về Hỗ trợ kiến trúc cho các ngôn ngữ lập
trình và hệ điều hành (ASPLOS), ngày 8 tháng 41111, 1991, Palo Alto, CA, pp. 310 con319.
Trường hợp, R.P., Padegs, A., 1978. Kiến trúc của Hệ thống IBM / 370. Cộng đồng. ACM 21 (1), 73
bóng96. Cũng xuất hiện trong Siewiorek, D.P., Bell, C.G., Newell, A., 1982. Cấu trúc máy tính: Nguyên
tắc và ví dụ. McGraw-Hill, New York, trang. 830 bóng855.
Shustek, L.J., 1978. Phân tích và Hiệu suất của Bộ Hướng dẫn Máy tính (Luận án Tiến sĩ). Đại học
Stanford, Palo Alto, CA .
Kẻ hủy diệt, W.D., 1978. VAX-11/780: phần mở rộng địa chỉ ảo của họ PDP-11. Trong: Kỷ yếu của Hội
nghị máy tính quốc gia AFIPS, ngày 5 tháng 6 năm8, 1978, Anaheim, CA. tập. 47, trang. 967 bóng980.
Taylor, G., Hilfinger, P., Larus, J., Patterson, D., Zorn, B., 1986. Đánh giá kiến trúc SPUR LISP. Trong:
Kỷ yếu Hội thảo quốc tế thường niên lần thứ 13 về Kiến trúc máy tính (ISCA), ngày 2 tháng 6 năm5, 1986,
Tokyo.
Ungar, D., Blau, R., Foley, P., Samples, D., Patterson, D., 1984. Kiến trúc của SOAR: Smalltalk trên RISC.
Trong: Kỷ yếu Hội thảo quốc tế thường niên lần thứ 11 về Kiến trúc máy tính (ISCA), ngày 5 tháng 6
năm7, 1984, Ann Arbor, MI, pp. 188 bóng197.
Câu trả lời để kiểm tra chính mình
Chương 1
§1.1, trang 10: Câu hỏi thảo luận: nhiều câu trả lời được chấp nhận.
§1.4, trang 24: Bộ nhớ DRAM: không ổn định, thời gian truy cập ngắn từ 50 đến 70
nano giây và chi phí cho mỗi GB là 5 đến 10 đô la. Bộ nhớ đĩa: không biến động,
thời gian truy cập chậm hơn 100.000 đến 400.000 lần so với DRAM và chi phí cho
mỗi GB rẻ hơn 100 lần so với DRAM. Bộ nhớ flash: không biến động, thời gian truy
cập chậm hơn 100 đến 1000 lần so với DRAM và chi phí cho mỗi GB rẻ hơn 7 đến
10 lần so với DRAM ...
§1.5, trang 28: 1, 3 và 4 là những lý do hợp lệ. Trả lời 5 có thể đúng vì khối
lượng lớn có thể giúp đầu tư thêm để giảm kích thước chết bằng cách, 10% là
một quyết định kinh tế tốt, nhưng điều đó không phải là sự thật.
§1.6, trang 33: 1. a: cả hai; b: độ trễ; c: không. 7 giây.
§1.6, trang 40: b.
§1.11, trang 53: a. Máy tính A có xếp hạng MIPS cao hơn. b. Máy tính B nhanh hơn.

Chương 2
§2.2, trang 72: RISC-V, C, Java.
§2.3, trang 79: 2) Rất chậm.
§2.4, trang 86: Câu hỏi đầu tiên: −8mười:
Câu hỏi thứ hai: 4) 18.466.744.073.709.551.608mười
§2.5, trang 95: 3) phụ x11, x10, x9
§2.6, trang 98: Cả hai. VÀ với mẫu mặt nạ 1s sẽ để lại 0s ở mọi nơi trừ trường
mong muốn. Chuyển sang trái theo số lượng chính xác sẽ loại bỏ các bit từ bên
trái của trường. Chuyển sang phải theo số lượng thích hợp sẽ đặt trường vào các
bit ngoài cùng bên phải của ô kép, với 0s trong phần còn lại của ô kép. Lưu ý rằng
AND rời khỏi trường nơi ban đầu và cặp dịch chuyển di chuyển trường vào phần
ngoài cùng bên phải của ô kép.
§2.7, trang 103: I. Tất cả đều đúng. II. 1).
§2.8, trang 114: Cả hai đều đúng.
§2.9, trang 119: I. 1) và 2); II. 3).
§2.10, trang 128: I. 4) ± 4 K; II. 4) ± 1 M .
§2.11, trang 131: Cả hai đều đúng.
§2.12, trang 140: 4) Máy độc lập.

Chương 3
§3.2, trang 193: 2.
§3.5, trang 232: 3.
e-2 Câu trả lời để kiểm tra chính mình

Chương 4
§4.1, trang 258: 3 trên 5: Kiểm soát, Datapath, Ký ức. Đầu vào và đầu ra bị thiếu.
§4.2, trang 261: sai. Các yếu tố trạng thái kích hoạt cạnh làm cho việc đọc và viết
đồng thời cả có thể và không mơ hồ.
§4.3, trang 268: I. a; II. c.
§4.4, trang 282: Có, Chi nhánh và ALUOp0 giống hệt nhau. Ngoài ra, bạn có thể sử
dụng tính linh hoạt của các bit chăm sóc don don để kết hợp các tín hiệu khác với
nhau. ALUSrc và MemtoReg có thể được tạo giống nhau bằng cách đặt hai bit chăm
sóc don don của MemtoReg thành 1 và 0. ALUOp1 và MemtoReg có thể được tạo
thành đảo ngược của nhau bằng cách đặt bit chăm sóc don don của MemtoReg thành
1. Bạn không cần một biến tần; chỉ cần sử dụng tín hiệu khác và lật thứ tự của các
đầu vào vào bộ ghép kênh MemtoReg!
§4.6, trang 295: 1. Gian hàng do nguy cơ dữ liệu sử dụng tải của lw kết quả. 2.
Tránh bị đình trệ trong hướng dẫn thứ ba về nguy cơ dữ liệu đọc sau khi ghi x11
bằng cách chuyển tiếp thêm kết quả. 3. Nó không cần phải bị đình trệ, thậm chí
không chuyển tiếp.
§4.7, trang 309: Tuyên bố 2 và 4 là chính xác; phần còn lại không chính xác.
§4.9, trang 332: 1. Dự đoán không được thực hiện. 2. Dự đoán. 3. Dự đoán động.
§4.10, trang 339: Hướng dẫn đầu tiên, vì nó được thực thi một cách hợp lý trước các
hướng dẫn khác.
§4.11, trang 353: 1. Cả hai. 2. Cả hai. 3. Phần mềm. 4. Phần cứng. 5. Phần cứng.
6. Phần cứng. 7. Cả hai. số 8. Phần cứng. 9. Cả hai.
§4.13, trang 365: Hai cái đầu tiên là sai và hai cái cuối cùng là đúng.

Chương 5
§5.1, trang 391: 1 và 4. (3 là sai vì chi phí phân cấp bộ nhớ thay đổi trên mỗi máy
tính, nhưng năm 2016, chi phí cao nhất thường là DRAM.)
§5.3, trang 412: 1 và 4: Hình phạt bỏ lỡ thấp hơn có thể cho phép các khối nhỏ
hơn, vì bạn không có độ trễ lớn để khấu hao, nhưng băng thông bộ nhớ cao hơn
thường dẫn đến các khối lớn hơn, vì hình phạt bỏ lỡ chỉ lớn hơn một chút .
§5.4, trang 430: 1.
§5.8, trang 470: 2. (Cả kích thước khối lớn và tiền xử lý có thể làm giảm các lần
bỏ lỡ bắt buộc, vì vậy 1 là sai.)

Chương 6
§6.1, trang 522: Sai. Song song cấp độ tác vụ có thể giúp các ứng dụng tuần tự và
các ứng dụng tuần tự có thể được thực hiện để chạy trên phần cứng song song,
mặc dù nó khó khăn hơn.
§6.2, trang 527: Sai. Yếu tỷ lệ có thể bù cho một phần nối tiếp của chương trình
có thể hạn chế khả năng mở rộng, nhưng không phải như vậy đối với tỷ lệ mạnh.
§6.3, trang 533: Đúng, nhưng chúng thiếu các tính năng vector hữu ích như các thanh
ghi tập hợp và phân tán vector giúp cải thiện hiệu quả của kiến trúc vector.
Câu trả lời để kiểm tra chính mình e-3

(Như một chi tiết trong phần này đề cập, các phần mở rộng SIMD AVX2 cung
cấp các tải được lập chỉ mục thông qua một thao tác thu thập nhưng không phải
phân tán cho các cửa hàng được lập chỉ mục. Bộ vi xử lý Haswell thế hệ x86 là
người đầu tiên hỗ trợ AVX2.)
§6.4, trang 537: 1. Thật. 2. Thật.
§6.5, trang 541: Sai. Vì địa chỉ được chia sẻ là a thể chất địa chỉ, nhiều nhiệm
vụ mỗi trong riêng của họ ảo không gian địa chỉ có thể chạy tốt trên bộ đa xử lý
bộ nhớ dùng chung.
§6.6, trang 549: Sai. Chip DRAM đồ họa được đánh giá cao cho băng thông cao hơn của họ.
§6.7, trang 552: Sai. GPU và CPU bao gồm các tính năng dự phòng để tăng năng
suất chết, kết hợp với khối lượng lớn của chúng làm cho các khuôn lớn có giá cả
phải chăng, không giống như trường hợp của DSA. Các ưu điểm của DSA bao
gồm loại bỏ các tính năng của CPU và GPU không cần thiết cho tên miền và sử
dụng lại các tài nguyên đó cho nhiều đơn vị số học và bộ nhớ lớn trên chip, cả
hai đều phù hợp với miền vấn đề.
§6.8, trang 557: 1. Sai. Gửi và nhận tin nhắn là một sự đồng bộ hóa ngầm, cũng
như một cách để chia sẻ dữ liệu. 2. Thật.
§6.9, trang 560: Đúng.
§6.11, trang 571: Đúng. Chúng tôi có thể cần sự đổi mới ở tất cả các cấp độ của
phần cứng và phần mềm để tính toán song song để thành công.
TRANG NÀY TUYỆT VỜI TRÁI CÂY

?? ?? ??
Thuật ngữ

địa chỉ tuyệt đối Một biến số hoặc một VÀ Một hoạt động bit-by-bit hợp lý với
thói quen địa chỉ thực tế trong bộ nhớ. hai toán hạng chỉ tính 1 nếu có 1 in cả hai
trừu tượng Một mô hình mà làm lại chi toán hạng.
tiết cấp thấp hơn của các hệ thống máy chống độc Cũng được gọi tên sự phụ
tính tạm thời vô hình để tạo điều kiện cho thuộcMột đơn đặt hàng bị ép buộc bởi.
việc thiết kế các hệ thống tinh vi. sử dụng lại tên, thường là một thanh ghi,
truy cập bit Cũng được gọi sử dụng bit hoặc thay vì phụ thuộc thực sự mang một giá
là tài liệu tham khảo bitMột trường được đặt trị giữa hai hướng dẫn.
bất cứ khi nào một trang. truy cập và được sử thuốc chống nấm Một cấu trúc trong một
dụng để thực hiện LRU hoặc các chương trình mạch tích hợp rằng khi được lập trình tạo
thay thế khác. ra một kết nối vĩnh viễn giữa hai dây.
từ viết tắt Một từ được xây dựng bằng giao diện nhị phân ứng dụng (ABI)
cách lấy các chữ cái đầu tiên của một Các phần người dùng của tập lệnh
chuỗi các từ. Ví dụ: RAM là từ viết tắt của cộng với các giao diện hệ điều hành
Bộ nhớ truy cập ngẫu nhiên; và CPU là từ được sử dụng bởi các lập trình viên
viết tắt của Đơn vị xử lý trung tâm. ứng dụng. Nó xác định một tiêu chuẩn
hiển thị ma trận hoạt động Một tinh thể lỏng cho tính di động nhị phân trên các máy
hiển thị bằng bóng bán dẫn để điều khiển việc tính.
truyền ánh sáng ở từng pixel riêng lẻ. đăng ký kiến trúc Hướng dẫn bộ thanh
Địa chỉ Một giá trị được sử dụng để ghi hiển thị của bộ xử lý; ví dụ, trong
phân định vị trí của một thành phần dữ RISC-V, đây là 32 thanh ghi số nguyên
liệu cụ thể trong một mảng bộ nhớ. và 32 điểm nổi.
dịch địa chỉ Cũng được gọi Địa chỉ cường độ số học Tỷ lệ các phép toán dấu
lập bản đồQuá trình mà một ảo. địa phẩy động trong một chương trình với số
chỉ được ánh xạ tới một địa chỉ được byte dữ liệu được truy cập bởi một
sử dụng để truy cập bộ nhớ. chương trình từ bộ nhớ chính.
chế độ địa chỉ Một trong số đó giải quyết đơn vị logic số học (ALU) Phần cứng đó thực
các chế độ được phân định bởi việc sử hiện phép cộng, phép trừ và thường là các thao
dụng đa dạng các toán hạng và / hoặc địa tác logic như AND và OR .
chỉ của họ. lắp ráp Một chương trình dịch a
bí danh Một tình huống trong đó hai địa chỉ phiên bản tượng trưng của hướng dẫn
truy cập cùng một đối tượng; nó có thể xảy ra vào phiên bản nhị phân.
trong bộ nhớ ảo khi có hai địa chỉ ảo cho cùng chỉ thị lắp ráp Một hoạt động mà nói
một trang vật lý. nhà lắp ráp cách dịch chương trình nhưng
hạn chế căn chỉnh Một yêu cầu dữ liệu không tạo ra hướng dẫn máy; luôn luôn
đó được căn chỉnh trong bộ nhớ trên các bắt đầu với một khoảng thời gian.
ranh giới tự nhiên. ngôn ngữ lắp ráp Một ngôn ngữ tượng
Luật Amdahl Một quy tắc nêu rõ rằng trưng có thể được dịch sang ngôn ngữ
tăng cường hiệu suất có thể với một cải máy nhị phân.
tiến nhất định bị giới hạn bởi số lượng khẳng định Tín hiệu cao hoặc đúng.
mà tính năng cải tiến được sử dụng. Nó khẳng định tín hiệu Một tín hiệu đó là
là một phiên bản định lượng của định (về mặt logic) đúng, hoặc 1.
luật lợi nhuận giảm dần.
G-2 Thuật ngữ

backpatching Một phương pháp để dịch từ dự đoán chi nhánh Một phương pháp
ngôn ngữ lắp ráp đến hướng dẫn máy trong đó giải quyết a rủi ro chi nhánh giả định một
trình biên dịch xây dựng biểu diễn nhị phân (có kết quả nhất định cho chi nhánh có điều
thể không đầy đủ) của mọi lệnh trong một lần kiện và tiến hành từ giả định đó thay vì
vượt qua một chương trình và sau đó quay lại chờ đợi để xác định kết quả thực tế.
để điền vào bộ đệm dự đoán nhánh Cũng được gọi bảng
nhãn chưa xác định trước đó. lịch sử chi nhánhMột ký ức nhỏ. được lập chỉ
khối cơ bản Một chuỗi các hướng dẫn mục bởi phần dưới của địa chỉ của lệnh nhánh
không có nhánh (trừ khi có thể ở cuối) và và có chứa một hoặc nhiều bit cho biết liệu
không có mục tiêu nhánh hoặc nhãn nhánh nhánh đó có được lấy gần đây hay không.
(trừ khi có thể ở đầu). chi nhánh lấy Một chi nhánh nơi chi nhánh
đặc điểm kỹ thuật hành vi Mô tả làm thế điều kiện được thỏa mãn và bộ đếm chương
nào a hệ thống kỹ thuật số hoạt động chức trình (PC) trở thành mục tiêu chi nhánh. Tất cả
năng. các nhánh vô điều kiện được lấy chi nhánh.
điểm chuẩn Một chương trình được địa chỉ mục tiêu chi nhánh Địa chỉ được
chọn để sử dụng trong so sánh hiệu suất chỉ định trong một nhánh, trở thành bộ đếm
chương trình mới (PC) nếu nhánh được lấy.
máy tính.
Trong kiến trúc RISC-V, mục tiêu nhánh
ký hiệu thiên vị Một ký hiệu đại diện giá
được đưa ra bằng tổng của trường tức thời
trị âm nhất bằng 00 ... 000hai và giá trị
của hướng dẫn và địa chỉ của nhánh.
dương nhất bằng 11 ... 11hai, với 0 thường
đệm mục tiêu nhánh Một cấu trúc
có giá trị 10 ... 00hai, do đó làm sai lệch số
mà lưu trữ PC đích hoặc hướng dẫn
sao cho số cộng với độ lệch có biểu diễn
đích cho một nhánh. Nó thường được
không âm.
tổ chức dưới dạng bộ đệm với các thẻ,
chữ số nhị phân Cũng được gọi bit nhị
làm cho nó tốn kém hơn bộ đệm dự
phânMột trong. hai số trong cơ sở 2, 0 đoán đơn giản.
hoặc 1, đó là các thành phần của thông tin.
xe buýt Trong thiết kế logic, một bộ sưu
băng thông bisection Băng thông giữa tập các dòng dữ liệu được coi với nhau
hai phần bằng nhau của bộ nhân. Biện như một tín hiệu logic duy nhất; Ngoài ra,
pháp này là cho sự phân chia trường hợp một bộ sưu tập các dòng được chia sẻ với
xấu nhất của bộ đa xử lý. nhiều nguồn và sử dụng.
khối (hoặc dòng) Đơn vị tối thiểu của bộ nhớ cache Một bộ nhớ nhỏ, nhanh mà
thông tin có thể có hoặc không có trong bộ hoạt động như một bộ đệm cho bộ nhớ chậm
đệm. hơn, lớn hơn.
chặn chuyển nhượng Trong Verilog, một
bộ nhớ cache bỏ lỡ Một yêu cầu cho dữ
nhiệm vụ hoàn thành trước khi
thực hiện các tuyên bố tiếp theo. liệu từ bộ đệm không thể điền được vì dữ
liệu không có trong bộ đệm.
bảng địa chỉ chi nhánh Cũng được gọi
callee Một thủ tục thực hiện một loạt
chi nhánh bànMột bảng địa chỉ thay
của các hướng dẫn được lưu trữ dựa trên
thế. trình tự hướng dẫn.
các tham số được cung cấp bởi người gọi
hướng dẫn chi nhánh và liên kết An và sau đó trả về quyền kiểm soát cho
hướng dẫn phân nhánh đến một địa chỉ và người gọi.
đồng thời lưu địa chỉ của hướng dẫn sau
đăng ký cứu callee Một đăng ký được lưu
trong một thanh ghi (thường là x1 trong
RISC-V). bởi thường xuyên thực hiện một cuộc gọi
chi nhánh không lấy hoặc (nhánh chưa thủ tục.
lấy) A nhánh nơi điều kiện nhánh là sai người gọi Chương trình xúi giục a
và bộ đếm chương trình (PC) trở thành thủ tục và cung cấp các giá trị tham
địa chỉ của lệnh theo tuần tự sau nhánh. số cần thiết.
đăng ký người gọi Một đăng ký được lưu
bởi thói quen được gọi.
Thuật ngữ G-3

năng lực bỏ lỡ Một bộ nhớ cache bỏ lỡ đơn vị cam kết Các đơn vị trong một
điều đó xảy ra vì bộ đệm, ngay cả với động hoặc đường ống thực hiện ngoài trật
tính liên kết đầy đủ, không thể chứa tất tự quyết định khi nào an toàn để giải
cả các khối cần thiết để đáp ứng yêu cầu. phóng kết quả của một hoạt động cho các
đơn vị xử lý trung tâm (CPU) Cũng thanh ghi và bộ nhớ hiển thị của lập trình
được gọi bộ xử lý trung tâm hoặc bộ xử lý. viên.
Phần hoạt động của máy tính, chứa trình biên dịch Một chương trình dịch
datapath và điều khiển và thêm số, kiểm các tuyên bố ngôn ngữ cấp cao thành
tra số, tín hiệu thiết bị I / O để kích hoạt, các tuyên bố ngôn ngữ lắp ráp.
v.v. bắt buộc bỏ lỡ Cũng được gọi khởi
chu kỳ đồng hồ Cũng được gọi đánh động lạnh bỏ lỡMột bộ nhớ cache gây
dấu, đồng hồ tích tắc, thời gian đồng ra bởi đầu tiên. truy cập vào một khối
hồ, đồng hồ, hoặc là chu kỳThời gian chưa bao giờ có trong bộ đệm.
cho. một khoảng thời gian đồng hồ, chi nhánh có điều kiện Một hướng dẫn mà
thường là của đồng hồ bộ xử lý. kiểm tra một giá trị và điều đó cho phép
chu kỳ đồng hồ trên mỗi hướng dẫn (CPI) chuyển giao quyền kiểm soát tiếp theo sang
Trung bình số chu kỳ đồng hồ trên mỗi hướng một địa chỉ mới trong chương trình dựa trên
dẫn cho một đoạn chương trình hoặc chương kết quả của bài kiểm tra.
trình.
bỏ lỡ xung đột Cũng được gọi va chạm
thời gian đồng hồ Chiều dài của bỏ lỡA. bỏ lỡ bộ nhớ cache xảy ra trong
mỗi chiếc đồng hồ chu kỳ. bộ đệm tập hợp hoặc ánh xạ trực tiếp khi
xiên đồng hồ Sự khác biệt trong thời nhiều khối cạnh tranh cho cùng một bộ và
gian tuyệt đối giữa những lúc hai yếu tố được loại bỏ trong bộ đệm liên kết đầy đủ
trạng thái nhìn thấy cạnh đồng hồ. có cùng kích thước.
phương pháp đồng hồ Cách tiếp cận chuyển đổi bối cảnh Một sự thay đổi
được sử dụng để xác định khi dữ liệu hợp của nội bộ trạng thái của bộ xử lý để cho
lệ và ổn định so với đồng hồ. phép một quy trình khác sử dụng bộ xử
Điện toán đám mây đề cập đến lớn bộ lý bao gồm lưu trạng thái cần thiết để trở
sưu tập các máy chủ cung cấp dịch vụ về quy trình thực thi hiện tại.
qua Internet; một số nhà cung cấp thuê điều khiển Thành phần của bộ xử lý ra
số lượng máy chủ thay đổi linh hoạt như lệnh cho các thiết bị dữ liệu, bộ nhớ và I /
một tiện ích. O theo hướng dẫn của chương trình.
cụm Một bộ máy tính được kết nối qua kiểm soát nguy cơ Cũng được gọi nguy hiểm
một mạng cục bộ có chức năng như một chi nhánh. Phát sinh khi hướng dẫn thích hợp
bộ đa xử lý lớn duy nhất. không thể thực hiện trong chu trình đồng hồ
cụm Bộ sưu tập máy tính được kết nối đường ống thích hợp vì hướng dẫn được tìm
qua I / O qua các công tắc mạng tiêu nạp không phải là hướng dẫn cần thiết; nghĩa
chuẩn để tạo thành bộ đa xử lý thông là, luồng địa chỉ lệnh không phải là những gì
báo. đường ống mong đợi.
đa luồng hạt thô Một phiên bản đa tín hiệu điều khiển Một tín hiệu được sử dụng
luồng phần cứng ngụ ý chuyển đổi giữa cho bộ ghép kênh lựa chọn hoặc chỉ đạo hoạt
các luồng chỉ sau các sự kiện quan trọng, động của một đơn vị chức năng; tương phản với
chẳng hạn như bỏ lỡ bộ đệm cấp cuối. a tín hiệu dữ liệu, trong đó có chứa thông tin
yếu tố kết hợp Một hoạt động phần tử, được vận hành bởi một đơn vị chức năng.
chẳng hạn như cổng AND hoặc ALU . dự đoán tương quan Một dự báo chi
logic kết hợp Một hệ thống logic có các nhánh kết hợp hành vi địa phương của một
khối không chứa bộ nhớ và do đó tính chi nhánh cụ thể và thông tin toàn cầu về
toán cùng một đầu ra cho cùng một đầu hành vi của một số chi nhánh được thực
vào. hiện gần đây.
G-4 Thuật ngữ
chi nhánh bị
trì hoãn
Thời gian thực hiện CPU Cũng được gọi Một loại chi
Thời gian CPU. Thời gian thực tế CPU nhánh ở đâu
dành tính toán cho một nhiệm vụ cụ thể. hướng dẫn
mạng lưới thanh ngang Một mạng cho
ngay sau
phép bất kỳ nút nào để giao tiếp với bất kỳ
nút nào khác trong một lần đi qua mạng.
D lật Một flip-flop với một đầu vào dữ
liệu lưu trữ giá trị của tín hiệu đầu vào đó
trong bộ nhớ trong khi xảy ra cạnh đồng
hồ.
nguy hiểm dữ liệu Cũng được gọi là a
dữ liệu đường ống nguy hiểmKhi một
hướng dẫn theo kế hoạch. không thể thực
thi trong chu kỳ đồng hồ thích hợp vì dữ
liệu cần thiết để thực hiện lệnh chưa có
sẵn.
cuộc đua dữ liệu Hai bộ nhớ truy cập tạo
thành a cuộc đua dữ liệu nếu chúng là từ
các luồng khác nhau đến cùng một vị trí, ít
nhất một là ghi và chúng xảy ra lần lượt.
phân khúc dữ liệu Phân khúc của UNIX
đối tượng hoặc tệp thực thi có chứa biểu
diễn nhị phân của dữ liệu đã khởi tạo
được sử dụng bởi chương trình.
hướng dẫn truyền dữ liệu Một mệnh lệnh mà
di chuyển dữ liệu giữa bộ nhớ và thanh ghi.
song song cấp dữ liệu Song song đạt
được bằng cách thực hiện cùng một hoạt
động trên dữ liệu độc lập.
datapath Thành phần của bộ xử lý thực hiện
các phép toán số học.
yếu tố datapath Một đơn vị được sử dụng
để hoạt động trên hoặc giữ dữ liệu trong bộ
xử lý. Trong triển khai RISC-V, các thành
phần datapath bao gồm các bộ nhớ hướng
dẫn và dữ liệu, tệp đăng ký, ALU và các bộ
bổ sung.

bị coi thường Tín hiệu thấp về mặt


logic hoặc sai.
tín hiệu khử Một tín hiệu đó là (về mặt logic)
sai, hoặc 0.
bộ giải mã Một khối logic có một n-bit đầu
vào và 2n đầu ra, trong đó chỉ có một đầu ra
được khẳng định cho mỗi kết hợp đầu vào.
khiếm khuyết Một lỗ hổng siêu nhỏ
trong một wafer hoặc trong các bước tạo
mẫu có thể dẫn đến sự thất bại của khuôn
chứa khuyết điểm đó.
nhánh luôn được thực thi, không phụ thuộc vào điều kiện nhánh là
đúng hay sai.
chết Các phần hình chữ nhật cá nhân mà được cắt từ một wafer, được
biết đến nhiều hơn như là khoai tây chiên.
bộ nhớ cache được ánh xạ trực tiếp Một cấu trúc bộ đệm trong mà mỗi vị
trí bộ nhớ được ánh xạ tới chính xác một vị trí trong bộ đệm.
cổ tức Một số được chia.
chia rẽ Một con số mà cổ tức là chia cho.
thời hạn chăm sóc don don Một yếu tố của logic hàm trong đó đầu ra
không phụ thuộc vào giá trị của tất cả các đầu vào. Các điều khoản
chăm sóc Don Don có thể được chỉ định theo những cách khác nhau.
độ chính xác gấp đôi Một giá trị dấu phẩy động đại diện trong một từ kép
64 bit.
từ khóa Một đơn vị tự nhiên khác của truy cập trong một máy tính,
thường là một nhóm 64 bit; tương ứng với kích thước của một thanh
ghi trong kiến trúc RISC-V.
dự đoán nhánh động Dự đoán của các chi nhánh tại thời gian
chạy bằng cách sử dụng thông tin thời gian chạy.
vấn đề động nhiều Một cách tiếp cận triển khai bộ xử lý nhiều vấn đề
trong đó nhiều quyết định được đưa ra trong quá trình thực hiện bởi bộ xử
lý.
lập kế hoạch đường ống động Phần cứng hỗ trợ sắp xếp lại thứ tự thực
hiện lệnh để tránh các quầy hàng.
bộ nhớ truy cập ngẫu nhiên động (DRAM) Bộ nhớ được xây
dựng như một tích hợp mạch; nó cung cấp quyền truy cập ngẫu
nhiên vào bất kỳ vị trí. Thời gian truy cập là 50 nano giây và chi phí
cho mỗi gigabyte trong năm 2012 là $ 5 đến $ 10.
thư viện liên kết động
(DLL) Các thói quen thư viện được liên kết với a chương trình trong
khi thực hiện.
đồng hồ kích hoạt cạnh Một sơ đồ đồng hồ trong mà tất cả các thay đổi trạng
thái xảy ra trên một cạnh đồng hồ.
máy tính nhúng Một máy tính bên trong một thiết bị khác được sử
dụng để chạy một ứng dụng được xác định trước hoặc bộ sưu tập
phần mềm.
Thuật ngữ G-5

EOR Một hoạt động bit-by-bit hợp lý với chuyển đổi giữa các chủ đề sau mỗi
hai toán hạng tính toán OR độc quyền của chỉ dẫn.
hai toán hạng. Nghĩa là, nó chỉ tính 1 nếu máy trạng thái hữu hạn Một logic tuần
các giá trị khác nhau trong hai toán hạng. tự hàm bao gồm một tập hợp các đầu vào
mã phát hiện lỗi Một mã cho phép phát và đầu ra, hàm trạng thái tiếp theo ánh xạ
hiện lỗi trong dữ liệu, nhưng không phải trạng thái hiện tại và các đầu vào sang
là vị trí chính xác và do đó, sửa lỗi. trạng thái mới và hàm đầu ra ánh xạ trạng
ngoại lệ Cũng được gọi là an ngắt lờiAn. thái hiện tại và có thể là các đầu vào cho
sự kiện đột xuất làm gián đoạn việc thực một tập hợp các đầu ra được khẳng định.
hiện chương trình; được sử dụng để phát bộ nhớ flash Một chất bán dẫn không bay hơi
hiện tràn. ký ức. Nó rẻ hơn và chậm hơn DRAM nhưng
ngoại lệ cho phép Cũng được gọi là đắt hơn mỗi bit và nhanh hơn đĩa từ. Thời gian
ngắt kích hoạt. Tín hiệu hoặc hành động truy cập khoảng 5 đến 50 micro giây và chi phí
kiểm soát xem quá trình có phản ứng cho mỗi gigabyte trong năm 2012 là 0,75 đô la
với ngoại lệ hay không; cần thiết để đến 1 đô la.
ngăn chặn sự xuất hiện của các ngoại lệ lật Một yếu tố bộ nhớ mà đầu ra bằng với giá
trong các khoảng thời gian trước khi bộ trị của trạng thái được lưu trữ bên trong phần tử
xử lý lưu an toàn trạng thái cần thiết để và trạng thái bên trong chỉ được thay đổi trên
khởi động lại. cạnh đồng hồ.
tập tin thực thi Một chương trình chức điểm nổi Số học máy tính mà đại diện
năng trong định dạng của một tệp đối cho các số trong đó điểm nhị phân
tượng không chứa các tham chiếu chưa không cố định.
được giải quyết. Nó có thể chứa các bảng tuôn ra Để loại bỏ các hướng dẫn trong một
biểu tượng và thông tin gỡ lỗi.
Một tập tin thực thi tước tước không chứa đường ống , thường là do một sự kiện bất ngờ.
thông tin đó. Thông tin di dời có thể được thông số chính thức Một biến đó là đối
bao gồm cho bộ tải. số cho một thủ tục hoặc macro; được thay
số mũ Trong biểu diễn số hệ thống số học thế bằng đối số đó một khi macro được
dấu phẩy động , mở rộng.
giá trị được đặt trong trường số mũ. tham khảo chuyển tiếp Một nhãn
nhãn bên ngoài Cũng được gọi nhãn được sử dụng trước khi nó được xác
hiệu toàn cầu; một nhãn đề cập đến một định.
đối tượng có thể được tham chiếu từ các chuyển tiếp Cũng được gọi bỏ qua; a
tệp khác với đối tượng được xác định. phương pháp giải quyết mối nguy dữ liệu
chia sẻ sai Khi hai người không liên quan chia bằng cách truy xuất phần tử dữ liệu bị
sẻ các biến được đặt trong cùng một khối bộ thiếu từ bộ đệm bên trong thay vì chờ nó
đệm và toàn bộ khối được trao đổi giữa các bộ đến từ các thanh ghi hoặc bộ nhớ hiển thị
xử lý mặc dù các bộ xử lý đang truy cập các của lập trình viên.
biến khác nhau. phân số Giá trị, thường nằm trong
thiết bị lập trình trường (FPD) An mạch tích khoảng từ 0 đến 1, được đặt trong trường
hợp chứa logic tổ hợp và có thể là các thiết bị phân số.
bộ nhớ, có thể được cấu hình bởi người dùng con trỏ khung Một giá trị biểu thị vị
cuối. trí của các thanh ghi đã lưu và các
mảng cổng lập trình trường (FPGA) A biến cục bộ cho một thủ tục nhất định.
mạch tích hợp có thể định cấu hình có bộ nhớ cache liên kết đầy đủ Một cấu
chứa cả khối logic tổ hợp và dép xỏ ngón. trúc bộ đệm trong mà một khối có thể
đa luồng hạt mịn Một phiên bản đa luồng
được đặt ở bất kỳ vị trí nào trong bộ đệm.
phần cứng ngụ ý mạng kết nối đầy đủ Một mạng lưới
mà kết nối các nút bộ nhớ bộ xử lý bằng
cách cung cấp một liên kết giao tiếp
chuyên dụng giữa mọi nút.
G-6 Thuật ngữ
thực hiện
Phần cứng
hợp nhất nhân thêm Một điểm nổi tuân theo
hướng dẫn thực hiện cả phép nhân và trừu tượng
phép cộng, nhưng chỉ làm tròn một lần kiến trúc.
sau khi thêm.
cổng Một thiết bị thực hiện logic cơ
bản các hàm, chẳng hạn như VÀ hoặc
HOẶC .
tỷ lệ bỏ lỡ toàn cầu Các phần của tài liệu
tham khảo bỏ lỡ trong tất cả các cấp của bộ
đệm đa cấp.
con trỏ toàn cầu Các đăng ký được bảo
lưu để chỉ vào khu vực tĩnh.
bảo vệ Đầu tiên của hai bit thêm được
giữ trên quyền trong quá trình tính toán
trung gian của số dấu phẩy động; được sử
dụng để cải thiện độ chính xác làm tròn.
xử lý Tên của một thói quen phần mềm
được gọi để xử lý một ngoại lệ hoặc
ngắt lời.
ngôn ngữ mô tả phần cứng A ngôn
ngữ lập trình để mô tả phần cứng, được
sử dụng để tạo mô phỏng của thiết kế
phần cứng và cũng là đầu vào cho các
công cụ tổng hợp có thể tạo ra phần
cứng thực tế.
đa luồng phần cứng Tăng sử dụng bộ xử lý
bằng cách chuyển sang một luồng khác khi
một luồng bị đình trệ.
công cụ tổng hợp phần cứng Hỗ trợ máy
tính phần mềm thiết kế có thể tạo ra một
thiết kế cấp cổng dựa trên các mô tả hành
vi của một hệ thống kỹ thuật số.
thập lục phân Số trong cơ sở 16.
ngôn ngữ lập trình cấp cao A ngôn ngữ di
động như C, C ++, Java hoặc Visual Basic bao
gồm các từ và ký hiệu đại số có thể được dịch
bởi trình biên dịch sang ngôn ngữ lắp ráp.
tỷ lệ trúng Phần truy cập bộ nhớ tìm thấy
trong một cấp độ của hệ thống phân cấp bộ
nhớ.
đánh thời gian Thời gian cần thiết để
truy cập một cấp độ của hệ thống phân cấp
bộ nhớ, bao gồm cả thời gian cần thiết để
xác định xem quyền truy cập là một cú
đánh hay bỏ lỡ.
giữ thời gian Thời gian tối thiểu trong
thời gian mà đầu vào phải hợp lệ sau cạnh
đồng hồ.
ngắt chính xác Cũng được gọi không chính xác ngoại lệ; gián đoạn hoặc
ngoại lệ trong máy tính có đường ống không được liên kết với hướng dẫn
chính xác là nguyên nhân của sự gián đoạn hoặc ngoại lệ.
cam kết theo thứ tự Một cam kết trong đó kết quả thực hiện đường ống
được ghi vào trạng thái hiển thị của lập trình viên theo cùng thứ tự mà các
hướng dẫn được tìm nạp.
thiết bị đầu vào Một cơ chế thông qua đó máy tính được cung cấp
thông tin, chẳng hạn như micrô.
chỉ dẫn Một lệnh mà máy tính phần cứng hiểu và vâng lời.
số lượng hướng dẫn Số lượng hướng dẫn thực hiện bởi chương trình.
định dạng hướng dẫn Một hình thức đại diện của một hướng dẫn
bao gồm các trường số nhị phân.
độ trễ hướng dẫn Việc thực hiện vốn có thời gian cho một hướng
dẫn.
song song cấp độ hướng dẫn Các song song giữa các hướng dẫn.
hướng dẫn trộn Một thước đo của động lực tần suất hướng dẫn trên
một hoặc nhiều chương trình.
hướng dẫn đặt kiến trúc Cũng được gọi kiến trúcMột giao diện
trừu tượng giữa. phần cứng và phần mềm cấp thấp nhất bao gồm tất
cả thông tin cần thiết để viết chương trình ngôn ngữ máy sẽ chạy
chính xác, bao gồm hướng dẫn, thanh ghi, truy cập bộ nhớ, I / O, v.v.
mạch tích hợp Cũng được gọi là a con chipA. thiết bị kết hợp
hàng chục đến hàng triệu bóng bán dẫn.
ngắt lời Một ngoại lệ xuất phát từ bên ngoài bộ xử lý. (Một số kiến trúc sử
dụng thuật ngữ này ngắt lời cho tất cả các trường hợp ngoại lệ.)
xử lý ngắt Một đoạn mã đó được chạy như là kết quả của một
ngoại lệ hoặc một ngắt.
phát hành gói Các bộ hướng dẫn mà các vấn đề cùng nhau trong một
chu kỳ đồng hồ; gói có thể được xác định tĩnh bởi trình biên dịch hoặc
động bởi bộ xử lý.
Thuật ngữ G-7
máy xúc lật Một chương trình hệ thống đặt an chương trình đối
tượng trong bộ nhớ chính để nó sẵn sàng thực thi.
phát hành khe Các vị trí từ đó hướng dẫn có
thể phát hành trong một chu kỳ đồng hồ nhất
định; bằng cách tương tự, chúng tương ứng
với các vị trí tại các khối bắt đầu cho một lần
chạy nước rút.
Mã byte Java Hướng dẫn từ một tập
lệnh được thiết kế để giải thích các
chương trình Java.
Trình biên dịch chỉ trong thời gian (JIT)
Tên thường được trao cho một trình biên
dịch hoạt động trong thời gian chạy, dịch
các phân đoạn mã được giải thích thành
mã gốc của máy tính.
chốt Một yếu tố bộ nhớ trong đó đầu ra
bằng với giá trị của trạng thái được lưu
trữ bên trong phần tử và trạng thái được
thay đổi bất cứ khi nào đầu vào thích
hợp thay đổi và đồng hồ được khẳng
định.
độ trễ (đường ống) Số lượng các giai đoạn
trong một đường ống hoặc số lượng các giai
đoạn giữa hai hướng dẫn trong khi thực hiện.
ít được sử dụng gần đây (LRU) Một
sự thay thế sơ đồ trong đó khối được
thay thế là khối đã được sử dụng trong
thời gian dài nhất.
ít quan trọng nhất Bit ngoài cùng bên
phải trong a Hai từ RISC-V.
đồng hồ nhạy cảm cấp độ Một thời gian
phương pháp trong đó thay đổi trạng thái
xảy ra ở mức đồng hồ cao hoặc thấp
nhưng không phải là tức thời, vì những
thay đổi đó là trong các thiết kế kích hoạt
cạnh.
liên kết Cũng được gọi biên tập viên
liên kếtMột hệ thống. chương trình kết
hợp các chương trình ngôn ngữ máy
được lắp ráp độc lập và giải quyết tất cả
các nhãn không xác định thành một tệp
thực thi.
màn hình tinh thể lỏng Một công nghệ hiển
thị sử dụng một lớp mỏng các polyme lỏng có
thể được sử dụng để truyền hoặc chặn ánh sáng
tùy theo việc sử dụng điện tích.
nguy hiểm dữ liệu sử dụng tải Một
hình thức cụ thể của nguy cơ dữ liệu
trong đó dữ liệu được tải bởi một lệnh tải
chưa có sẵn khi chúng cần bởi một
hướng dẫn khác.
được nhiều hơn hiệu suất từ các vòng lặp truy
cập mảng, trong đó nhiều bản sao của thân
vòng lặp được tạo và các hướng dẫn từ các
mạng cục bộ (LAN) Một mạng lưới lần lặp khác nhau được lên lịch cùng nhau.
được thiết kế để mang dữ liệu trong a
khu vực giới hạn địa lý, thường ngôn ngữ máy móc Đại diện nhị phân
trong một tòa nhà duy nhất. được sử dụng để liên lạc trong một hệ
thống máy tính.
nhãn địa
vĩ mô Một mẫu phù hợp và cơ sở thay
phương
thế cung cấp một cơ chế đơn giản để đặt
Một nhãn
tên cho một chuỗi các hướng dẫn được
đề cập đến
sử dụng thường xuyên.
một đối đĩa từ Cũng được gọi đĩa cứngA. dạng bộ nhớ
tượng chỉ thứ cấp không bay hơi bao gồm các đĩa xoay
có thể được phủ bằng vật liệu ghi từ tính. Bởi vì chúng
được sử là các thiết bị cơ khí quay, thời gian truy cập
dụng trong khoảng 5 đến 20 mili giây và chi phí cho mỗi
tệp được gigabyte trong năm 2012 là 0,05 đến 0,10 đô la.
xác định. bộ nhớ chính Cũng được gọi chính ký
tỷ lệ bỏ lỡ ứcBộ nhớ được sử dụng để tổ chức các
địa chương trình. trong khi họ đang chạy;
phương thường bao gồm DRAM trong các máy
Các phần tính ngày nay.
của tài liệu ký ức Khu vực lưu trữ trong đó các
tham khảo chương trình được lưu giữ khi chúng
đến một đang chạy và chứa dữ liệu cần thiết cho
cấp độ của các chương trình đang chạy.
bộ đệm bị hệ thống phân cấp bộ nhớ Một cấu trúc sử
bỏ lỡ; được dụng nhiều cấp độ của ký ức; khi khoảng cách
sử dụng từ bộ xử lý tăng lên, kích thước của bộ nhớ và
trong phân thời gian truy cập đều tăng.
cấp đa cấp.
khóa Một
thiết bị đồng
bộ hóa cho
phép truy
cập dữ liệu
vào chỉ một
bộ xử lý tại
một thời
điểm.
bảng tra cứu
(LUT) Trong
một lĩnh vực
thiết bị lập
trình, tên được
đặt cho các ô
vì chúng bao
gồm một
lượng nhỏ
logic và RAM .
vòng lặp
không kiểm
soát Một kỹ
thuật để có
G-8 Thuật ngữ

tin nhắn qua Giao tiếp giữa nhiều bộ xử bộ vi xử lý Một hệ thống máy tính với ít nhất
lý bằng cách gửi và nhận thông tin rõ ràng. hai bộ xử lý. Máy tính này trái ngược với bộ
di căn Một tình huống xảy ra nếu a tín giải mã, có một, và ngày càng khó tìm thấy
hiệu được lấy mẫu khi nó không ổn định ngày nay.
trong thời gian thiết lập và giữ yêu cầu, mạng lưới đa tầng Một mạng lưới mà
có thể khiến giá trị được lấy mẫu rơi vào cung cấp một công tắc nhỏ tại mỗi nút.
vùng không xác định giữa giá trị cao và Cổng NAND Một cổng ngược và cổng.
thấp. băng thông mạng Không chính thức, đỉnh
kiến trúc vi mô Tổ chức của bộ xử lý, bao cao tốc độ truyền của một mạng; có thể tham
gồm các đơn vị chức năng chính, kết nối và khảo tốc độ của một liên kết đơn hoặc tốc độ
điều khiển của chúng. truyền tập thể của tất cả các liên kết trong
triệu hướng dẫn mỗi giây (MIPS) Một mạng.
phép đo tốc độ thực hiện chương trình chức năng trạng thái tiếp theo Một tổ
dựa trên số lượng hàng triệu hướng dẫn. hợp chức năng, với các đầu vào và trạng
MIPS được tính là số lệnh chia cho sản thái hiện tại, xác định trạng thái tiếp theo
phẩm của thời gian thực hiện và 106. của máy trạng thái hữu hạn.
MIMD hoặc Nhiều luồng hướng dẫn , phân công không chặn Một nhiệm vụ
Nhiều luồng dữ liệu. Một bộ xử lý. tiếp tục sau khi đánh giá phía bên tay
minterms Cũng được gọi điều khoản sản phải, chỉ gán phía bên trái giá trị sau khi
phẩmMột bộ. của đầu vào logic được nối tất cả các bên tay phải được đánh giá.
bởi kết hợp (hoạt động AND); các thuật bộ nhớ cache không chặn Một bộ đệm cho
ngữ sản phẩm tạo thành giai đoạn logic phép bộ xử lý để tạo tham chiếu đến bộ đệm
đầu tiên của mảng logic lập trình (PLA). trong khi bộ đệm đang xử lý lỗi trước đó.
bỏ lỡ hình phạt Thời gian cần thiết để lấy a truy cập bộ nhớ không đồng nhất (NUMA)
chặn thành một cấp độ của hệ thống phân cấp A loại bộ xử lý không gian địa chỉ đơn trong
bộ nhớ từ cấp thấp hơn, bao gồm cả thời gian đó một số truy cập bộ nhớ nhanh hơn nhiều so
để truy cập khối, truyền nó từ cấp này sang với các loại khác tùy thuộc vào bộ xử lý nào
cấp khác, chèn nó vào cấp độ đã bỏ lỡ và sau yêu cầu từ nào.
đó chuyển khối cho người yêu cầu. bộ nhớ không bay hơi Một dạng bộ nhớ mà
tỷ lệ bỏ lỡ Phần truy cập bộ nhớ không giữ lại dữ liệu ngay cả khi không có nguồn điện
tìm thấy trong một cấp độ của hệ thống và được sử dụng để lưu trữ các chương trình
phân cấp bộ nhớ. giữa các lần chạy. Một đĩa DVD không bay hơi.
bit quan trọng nhất Các bit ngoài không Một hướng dẫn không có hoạt
cùng bên trái trong a Hai từ RISC-V. động thay đổi trạng thái.
vi xử lý đa lõi A bộ vi xử lý chứa nhiều bộ BÌNH THƯỜNG Một hoạt động bit-by-bit
xử lý (môi lõi) trong một mạch tích hợp duy hợp lý với hai toán hạng tính toán KHÔNG
nhất. Hầu như tất cả các bộ vi xử lý ngày nay phải của OR của hai toán hạng. Đó là, nó chỉ
trong máy tính để bàn và máy chủ đều là đa tính 1 nếu có 0 in cả hai toán hạng.
lõi. Cổng NOR Một cổng OR ngược.
bộ nhớ cache đa cấp Một hệ thống phân bình thường hóa Một số trong dấu
cấp bộ nhớ với nhiều cấp độ bộ nhớ cache, phẩy động ký hiệu không có số 0 đứng
thay vì chỉ bộ nhớ cache và bộ nhớ chính. đầu.
nhiều vấn đề Một sơ đồ theo đó nhiều hướng KHÔNG PHẢI Một hoạt động bit-by-bit hợp
dẫn được đưa ra trong một chu kỳ đồng hồ. lý với một toán hạng đảo ngược các bit; nghĩa là,
nó thay thế mỗi 1 bằng 0 và mỗi 0 bằng 1.
ngôn ngữ hướng đối tượng Một chương
trình ngôn ngữ được định hướng xung quanh
các đối tượng thay vì hành động hoặc dữ liệu
so với logic.
Thuật ngữ G-9

một bổ sung Một ký hiệu đại diện giá trị âm thiết bị di động cá nhân (PMD) Nhỏ
nhất bằng 10 ... 000hai và giá trị dương nhất thiết bị không dây để kết nối Internet; họ
bằng 01 ... 11hai, để lại một số lượng âm bản và dựa vào pin để lấy năng lượng và phần
dương bằng nhau nhưng kết thúc bằng hai số mềm được cài đặt bằng cách tải xuống
không, một số dương ứng dụng. Ví dụ thông thường là điện
(00 ... 00hai) và một tiêu cực (11 ... 11hai). thoại thông minh và máy tính bảng.
Thuật ngữ này cũng được sử dụng để chỉ đảo địa chỉ vật lý Một địa chỉ chính
ngược của mọi bit trong một mẫu: 0 đến 1 và ký ức.
1 đến 0. bộ nhớ cache giải quyết vật lý Một bộ
opcode Các lĩnh vực biểu thị hoạt động đệm đó là được giải quyết bằng một địa
và định dạng của một hướng dẫn. chỉ vật lý.
OpenMP Một API cho bộ nhớ dùng gian hàng đường ống Cũng được gọi
chung đa xử lý trong C, C ++ hoặc bong bóngMột gian hàng. bắt đầu để giải
Fortran chạy trên nền tảng UNIX và quyết một mối nguy hiểm.
Microsoft. Nó bao gồm các chỉ thị biên đường ống Một kỹ thuật thực hiện trong trong
dịch, thư viện và chỉ thị thời gian chạy. đó nhiều hướng dẫn được chồng chéo trong
HOẶC LÀ Một hoạt động bit-by-bit hợp thực thi, giống như một dây chuyền lắp ráp.
lý với hai toán hạng tính toán 1 nếu có 1
pixel Hình ảnh cá nhân nhỏ nhất thành
in hoặc toán hạng. phần. Màn hình bao gồm hàng trăm ngàn
thực hiện ngoài trật tự Một tình huống đến hàng triệu pixel, được sắp xếp theo
trong thực thi đường ống khi một lệnh bị ma trận.
chặn thực thi không khiến các hướng dẫn bật lên Xóa phần tử khỏi ngăn xếp.
sau phải chờ.
ngắt chính xác Cũng được gọi chính xác
thiết bị đầu ra Một cơ chế truyền tải ngoại lệMột ngắt hoặc ngoại lệ. luôn được
kết quả của một tính toán, chẳng hạn như một
màn hình , liên kết với hướng dẫn chính xác trong các
cho người dùng hoặc máy tính khác. máy tính được đặt ống.
tràn Khi kết quả của một hoạt động tiền chế Một kỹ thuật trong đó dữ liệu
lớn hơn có thể được đại diện trong một đăng ký. các khối cần thiết trong tương lai được
đưa vào bộ đệm sớm bằng cách sử dụng
lỗi trang Một sự kiện xảy ra khi một trang truy
các hướng dẫn đặc biệt chỉ định địa chỉ
cập không có trong bộ nhớ chính. của khối.
bảng trang Bảng chứa ảo để dịch địa chỉ thủ tục Một chương trình con được lưu trữ mà
vật lý trong một hệ thống bộ nhớ ảo. thực hiện một nhiệm vụ cụ thể dựa trên
Bảng, được lưu trong bộ nhớ, thường các tham số mà nó được cung cấp.
được lập chỉ mục theo số trang ảo; mỗi thủ tục gọi khung Một khối bộ nhớ
mục trong bảng chứa số trang vật lý cho
được sử dụng để giữ các giá trị được
trang ảo đó nếu trang hiện đang ở trong
truyền cho một thủ tục dưới dạng đối số,
bộ nhớ.
để lưu các thanh ghi mà một thủ tục có
chương trình xử lý song song Một thể sửa đổi nhưng người gọi thủ tục
đơn chương trình chạy trên nhiều bộ xử không muốn thay đổi và để cung cấp
lý cùng một lúc. không gian cho các biến cục bộ cho một
Địa chỉ tương đối PC Một địa chỉ chế độ thủ tục.
trong đó địa chỉ là tổng của bộ đếm khung thủ tục Cũng được gọi kích hoạt
chương trình (PC) và một hằng số trong ghi lạiCác phân đoạn của ngăn xếp chứa.
hướng dẫn. một thủ tục lưu các thanh ghi và các biến
máy tính cá nhân (PC) Một cái máy tính cục bộ.
được thiết kế để sử dụng bởi một cá nhân, quá trình Bao gồm một hoặc nhiều chủ
thường kết hợp màn hình đồ họa, bàn phím đề, các không gian địa chỉ, và trạng thái
và chuột. hệ điều hành. Do đó, một công tắc xử lý
thường gọi
hệ điều hành,
nhưng không
phải là một
công tắc
luồng.
G-10 Thuật ngữ

bộ đếm chương trình (PC) Sổ đăng ký các thuật ngữ trong logic có chức năng là
chứa địa chỉ của lệnh trong chương trình đầu vào địa chỉ và đầu ra dưới dạng bit
đang được thực thi. trong mỗi từ của bộ nhớ.
logic mảng lập trình (PAL) Chứa một nhận tin nhắn thường xuyên Một thói
máy bay và lập trình theo sau là một máy quen được sử dụng bởi một bộ xử lý trong
bay cố định. các máy có bộ nhớ riêng để chấp nhận tin
mảng logic lập trình (PLA) A phần tử nhắn từ bộ xử lý khác.
logic có cấu trúc bao gồm một tập hợp các thủ tục đệ quy Thủ tục mà tự gọi mình
đầu vào và các bổ sung đầu vào tương ứng trực tiếp hoặc gián tiếp thông qua một
và hai giai đoạn logic, các thuật ngữ sản chuỗi các cuộc gọi.
phẩm tạo đầu tiên của các đầu vào và bổ giảm Một chức năng xử lý dữ liệu cấu
sung đầu vào và các thuật ngữ tổng tạo
trúc và trả về một giá trị duy nhất.
thứ hai của các thuật ngữ sản phẩm. Do đó,
bit tham khảo Cũng được gọi sử dụng bit
PLA thực hiện các chức năng logic như
hoặc là truy cập bitMột trường được đặt bất
một tổng của sản phẩm.
cứ khi nào một trang. truy cập và được sử dụng
thiết bị logic lập trình (PLD) An mạch
để thực hiện LRU hoặc các chương trình thay
tích hợp chứa logic tổ hợp có chức năng
thế khác.
được cấu hình bởi người dùng cuối.
ROM lập trình (PROM) Một hình thức bộ reg Trong Verilog, một đăng ký.
nhớ chỉ đọc có thể được lập trình khi một nhà đăng ký tập tin Một yếu tố nhà nước bao
thiết kế biết nội dung của nó. gồm của một tập hợp các thanh ghi có thể
thời gian nhân giống Thời gian cần được đọc và viết bằng cách cung cấp số
thiết cho một đầu vào cho một flip-flop đăng ký sẽ được truy cập.
để truyền đến các đầu ra của flip-flop. đăng ký đổi tên Việc đổi tên đăng
sự bảo vệ Một bộ cơ chế cho đảm bảo rằng ký bởi trình biên dịch hoặc phần cứng
nhiều quy trình chia sẻ bộ xử lý, bộ nhớ hoặc để loại bỏ các phần mềm chống lại.
thiết bị I / O không thể can thiệp, cố ý hoặc vô đăng ký sử dụng quy ước Cũng được
ý, với nhau bằng cách đọc hoặc viết dữ liệu của gọi thủ tục gọi hội nghịMột phần mềm.
nhau. Các cơ chế này cũng cách ly hệ điều giao thức quản lý việc sử dụng các
hành khỏi quy trình người dùng. thanh ghi theo thủ tục.
giả hành Một biến thể phổ biến của hướng dẫn thông tin di dời Phân khúc của a Tệp
ngôn ngữ lắp ráp thường được coi như thể đó là đối tượng UNIX xác định các hướng dẫn
một hướng dẫn theo đúng nghĩa của nó. và từ dữ liệu phụ thuộc vào địa chỉ tuyệt
Chủ đề API UNIX để tạo và thao tác đối.
các chủ đề. Nó được cấu trúc như một phần còn lại Kết quả thứ cấp của a chia;
thư viện. một số mà khi thêm vào sản phẩm của
đẩy Thêm phần tử vào ngăn xếp. thương số và ước số tạo ra cổ tức.
thương số Kết quả chính của một bộ đặt hàng lại bộ đệm Bộ đệm giữ kết quả
phận; a số mà khi nhân với ước số và trong bộ xử lý được lên lịch động cho đến
thêm vào phần còn lại sẽ tạo ra cổ tức. khi an toàn để lưu kết quả vào bộ nhớ
bộ nhớ chỉ đọc (ROM) Một ký ức có nội hoặc thanh ghi.
dung được chỉ định tại thời điểm tạo, sau đó trạm đặt phòng Một bộ đệm trong a
nội dung chỉ có thể được đọc. ROM được sử đơn vị chức năng giữ các toán hạng và
dụng làm logic cấu trúc để thực hiện một tập hoạt động.
hợp các hàm logic bằng cách sử dụng thời gian đáp ứng Cũng được gọi thời gian
thực hiện. Tổng thời gian cần thiết để máy
tính hoàn thành một tác vụ, bao gồm truy cập
đĩa, truy cập bộ nhớ, hoạt động I / O, hoạt
động
Thuật ngữ G-11

chi phí hệ thống, thời gian thực hiện CPU, gửi tin nhắn thường xuyên Một
v.v. thói quen được sử dụng bởi một bộ
hướng dẫn có thể khởi động lại Một hướng xử lý trong các máy có bộ nhớ riêng
dẫn mà có thể tiếp tục thực hiện sau khi một để chuyển tin nhắn đến bộ xử lý khác.
ngoại lệ được giải quyết mà không có ngoại lệ danh sách nhạy cảm Danh sách các
ảnh hưởng đến kết quả của hướng dẫn. tín hiệu đó chỉ định khi một khối luôn
địa chỉ trả lại Một liên kết đến các trang luôn được đánh giá lại.
web gọi đó cho phép một thủ tục để trở về biên soạn riêng Chia một chương trình
địa chỉ thích hợp; trong RISC-V, nó trên nhiều tệp, mỗi tệp có thể được biên
thường được lưu trữ trong thanh ghi x1. dịch mà không có kiến thức về những gì
độ trễ quay Cũng được gọi quay trì trong các tệp khác.
hoãnThời gian cần thiết cho mong logic tuần tự Một nhóm các yếu tố logic
muốn. khu vực của đĩa để xoay dưới chứa bộ nhớ và do đó giá trị của nó phụ
đầu đọc / ghi; thường được coi là một thuộc vào đầu vào cũng như nội dung hiện
nửa thời gian quay. tại của bộ nhớ.
vòng Phương pháp để làm cho trung gian kết máy chủ Một máy tính được sử dụng để
quả dấu phẩy động phù hợp với định dạng dấu chạy các chương trình lớn hơn cho nhiều
phẩy động; mục tiêu thường là tìm số gần nhất người dùng, thường đồng thời và thường
có thể được biểu diễn ở định dạng. Nó cũng là chỉ được truy cập qua mạng.
tên của thứ hai trong hai bit phụ được giữ ở bộ đệm tập hợp Một bộ đệm có a số
bên phải trong các tính toán dấu phẩy động lượng vị trí cố định (ít nhất hai) trong đó
trung gian, giúp cải thiện độ chính xác làm mỗi khối có thể được đặt.
tròn. thời gian thiết lập Thời gian tối
ký hiệu khoa học Một ký hiệu mà tái thiểu mà đầu vào cho một thiết bị bộ
hiện các số có một chữ số ở bên trái dấu nhớ phải hợp lệ trước cạnh đồng hồ.
thập phân. bộ đa xử lý bộ nhớ dùng chung (SMP)
bộ nhớ thứ cấp Bộ nhớ không bay hơi được A bộ xử lý song song với một không
sử dụng để lưu trữ các chương trình và dữ gian địa chỉ vật lý duy nhất.
liệu giữa các lần chạy; thường bao gồm bộ gia hạn ký tên Tăng kích thước của một
nhớ flash trong PMD và đĩa từ trong máy mục dữ liệu bằng cách sao chép bit ký hiệu
chủ. thứ tự cao của mục dữ liệu gốc trong các
ngành Một trong những phân khúc tạo bit thứ tự cao của mục dữ liệu đích lớn hơn.
nên một bản nhạc trên đĩa từ tính; một silicon Một yếu tố tự nhiên đó là một
khu vực là lượng thông tin nhỏ nhất được chất bán dẫn.
đọc hoặc ghi trên đĩa. phôi tinh thể silicon Một thanh bao gồm
tìm kiếm Quá trình định vị đọc / ghi đi qua một tinh thể silicon có đường kính từ 8
đường đua thích hợp trên một đĩa. đến 12 inch và dài khoảng 12 đến 24 inch.
phân khúc Một địa chỉ kích thước thay ĐƠN GIẢN hoặc luồng hướng dẫn đơn ,
đổi sơ đồ ánh xạ trong đó một địa chỉ bao Nhiều luồng dữ liệu. Hướng dẫn tương tự
gồm hai phần: một số phân đoạn, được ánh được áp dụng cho nhiều luồng dữ liệu,
xạ tới một địa chỉ vật lý và phần bù phân như trong bộ xử lý vector.
đoạn. thiết bị logic lập trình đơn giản (SPLD)
giá trị bộ chọn Cũng được gọi kiểm soát giá Thiết bị logic lập trình, thường chứa một PAL
trị. Tín hiệu điều khiển được sử dụng để chọn hoặc PLA duy nhất .
một trong các giá trị đầu vào của bộ ghép đa luồng đồng thời (SMT) A
kênh làm đầu ra của bộ ghép kênh. phiên bản đa luồng mà hạ thấp
chất bán dẫn Một chất không dẫn điện
tốt.
G-12 Thuật ngữ
phân khúc
ngăn xếp Phần
chi phí đa luồng bằng cách sử dụng các tài bộ nhớ được sử
nguyên cần thiết cho nhiều vấn đề, kiến trúc dụng bởi một
vi mô theo lịch trình động. chương trình để
độ chính xác duy nhất Một giá trị
giữ các khung
dấu phẩy động đại diện trong một từ
cuộc gọi thủ tục.
32 bit.
thực hiện một chu kỳ Cũng được gọi thực
hiện một chu kỳ đồng hồAn. thực hiện trong
đó một lệnh được thực hiện trong một chu kỳ
đồng hồ. Mặc dù dễ hiểu, nó quá chậm để
thực tế.
SISD hoặc luồng Hướng dẫn đơn, Đơn
Luồng dữ liệu. Một bộ giải mã.
Phần mềm dưới dạng dịch vụ (SaaS) giao
hàng phần mềm và dữ liệu dưới dạng dịch vụ
qua Internet, thường thông qua một chương
trình mỏng, chẳng hạn như trình duyệt chạy trên
các thiết bị máy khách cục bộ, thay vì mã nhị
phân phải được cài đặt và chạy hoàn toàn trên
thiết bị đó. Ví dụ bao gồm tìm kiếm web và
mạng xã hội.
ngôn ngữ nguồn Ngôn ngữ cấp cao trong
mà một chương trình ban đầu được viết.
địa phương không gian Nguyên tắc địa
phương nói rằng nếu một vị trí dữ liệu được
tham chiếu, các vị trí dữ liệu với các địa chỉ
gần đó sẽ có xu hướng được tham chiếu sớm.
đầu cơ Một cách tiếp cận theo đó trình biên
dịch hoặc bộ xử lý đoán kết quả của một lệnh
để loại bỏ nó như là một sự phụ thuộc trong
việc thực hiện các hướng dẫn khác.
chia bộ nhớ cache Một sơ đồ trong đó một
cấp độ của hệ thống phân cấp bộ nhớ bao gồm
hai bộ nhớ độc lập hoạt động song song với
nhau, với một hướng dẫn xử lý và một dữ liệu
xử lý.
SPMD Chương trình đơn, Nhiều dữ liệu
suối. Mô hình lập trình MIMD thông
thường, trong đó một chương trình duy
nhất chạy trên tất cả các bộ xử lý.
chồng Một cấu trúc dữ liệu cho các thanh ghi
tràn được tổ chức như một hàng đợi cuối cùng
trong đầu tiên.
xếp con trỏ Một giá trị biểu thị nhiều nhất
địa chỉ được phân bổ gần đây trong một
ngăn xếp cho thấy nơi đăng ký sẽ bị đổ
hoặc nơi có thể tìm thấy các giá trị đăng ký
cũ. Trong RISC-V, nó là đăng ký x2, còn
được gọi là sp.
yếu tố nhà nước Một yếu tố bộ nhớ, chẳng hạn như a đăng ký hoặc
một bộ nhớ.
dữ liệu tĩnh Phần của bộ nhớ đó chứa dữ liệu có kích thước được biết
đến với trình biên dịch và tuổi thọ của chương trình là toàn bộ thực thi.
vấn đề tĩnh nhiều Một cách tiếp cận triển khai bộ xử lý nhiều vấn đề
trong đó nhiều quyết định được đưa ra bởi trình biên dịch trước khi thực
hiện.
bộ nhớ truy cập ngẫu nhiên tĩnh (SRAM) A bộ nhớ nơi dữ liệu được lưu
trữ tĩnh (như trong dép xỏ ngón) chứ không phải động (như trong DRAM).
SRAM nhanh hơn DRAM, nhưng ít dày đặc hơn và đắt hơn mỗi bit.
dính một chút Một chút được sử dụng trong làm tròn trong ngoài
bảo vệ và vòng được đặt bất cứ khi nào có các bit khác không ở bên
phải của bit tròn.
khái niệm chương trình lưu trữ Ý tưởng đó hướng dẫn và dữ liệu
của nhiều loại có thể được lưu trữ trong bộ nhớ dưới dạng số và do
đó dễ thay đổi, dẫn đến máy tính chương trình được lưu trữ.
quy mô mạnh mẽ Tăng tốc đạt được trên a bộ xử lý mà không làm
tăng kích thước của vấn đề.
nguy cơ cấu trúc Khi một kế hoạch lệnh không thể thực thi trong chu
kỳ đồng hồ thích hợp vì phần cứng không hỗ trợ kết hợp các hướng
dẫn được đặt để thực thi.
đặc điểm kỹ thuật cấu trúc Mô tả làm thế nào một hệ thống kỹ thuật số
được tổ chức theo kết nối phân cấp của các yếu tố.
tổng số sản phẩm Một hình thức logic đại diện sử dụng tổng hợp
lý (OR) của sản phẩm (các điều khoản được nối bằng toán tử AND).
siêu máy tính Một lớp máy tính với hiệu suất và chi phí cao nhất; chúng
được cấu hình như các máy chủ và thường có giá hàng chục đến hàng trăm
triệu đô la.
siêu âm Một đường ống tiên tiến kỹ thuật cho phép bộ xử lý thực hiện nhiều
hơn một lệnh cho mỗi chu kỳ đồng hồ bằng cách chọn chúng trong khi thực
hiện.
Thuật ngữ G-13
terabyte (TB) Ban đầu 1.099.511.627.776 (240) byte, mặc dù thông tin liên
lạc và
chế độ giám sát viên Cũng được gọi chế
độ hạt nhân. Một chế độ chỉ ra rằng một
quá trình chạy là một quy trình hệ điều
hành.
không gian trao đổi Không gian trên
đĩa dành riêng cho không gian bộ nhớ ảo
đầy đủ của một quá trình.
bảng biểu tượng Một bảng phù hợp với
tên của nhãn đến địa chỉ của các từ bộ nhớ
mà hướng dẫn chiếm.
đồng bộ hóa Quá trình của phối hợp
hành vi của hai hoặc nhiều quy trình, có
thể đang chạy trên các bộ xử lý khác
nhau.
lỗi đồng bộ hóa Một tình huống trong đó a
flip-flop đi vào trạng thái có thể di chuyển và
trong đó một số khối logic đọc đầu ra của flip-
flop nhìn thấy 0 trong khi những khối khác nhìn
thấy 1.
hệ thống đồng bộ Một hệ thống bộ nhớ
sử dụng đồng hồ và nơi tín hiệu dữ liệu
chỉ được đọc khi đồng hồ chỉ ra rằng các
giá trị tín hiệu ổn định.
gọi hệ thống Một hướng dẫn đặc biệt mà
chuyển điều khiển từ chế độ người dùng
sang một vị trí chuyên dụng trong không
gian mã giám sát viên, gọi cơ chế ngoại lệ
trong quy trình.
thời gian CPU hệ thống Thời gian
CPU dành cho hệ điều hành thực hiện
các nhiệm vụ thay mặt cho chương trình.
phần mềm hệ thống Phần mềm cung cấp
các dịch vụ thường hữu ích, bao gồm hệ
điều hành, trình biên dịch, bộ tải và trình
biên dịch.
thẻ Một trường trong một bảng được sử
dụng cho một bộ nhớ hệ thống phân cấp
chứa thông tin địa chỉ cần thiết để xác định
xem khối liên kết trong hệ thống phân cấp
có tương ứng với một từ được yêu cầu hay
không.
song song cấp nhiệm vụ hoặc song
song cấp quá trình Sử dụng nhiều bộ
xử lý bằng cách chạy các chương trình
độc lập đồng thời.
địa phương tạm thời Nguyên tắc nêu rõ
rằng nếu một vị trí dữ liệu được tham
chiếu, thì nó sẽ có xu hướng được tham
chiếu lại sớm.
hình bộ đệm trong đó tất cả bỏ lỡ bộ nhớ
cache được phân loại thành một trong ba
các nhà phát
loại: bỏ lỡ bắt buộc, bỏ lỡ năng lực và bỏ
triển hệ thống lỡ xung đột.
lưu trữ thứ cấp thông lượng Cũng được gọi băng thông.
bắt đầu sử dụng Một thước đo khác về hiệu suất, đó là số
thuật ngữ này có lượng nhiệm vụ hoàn thành trên mỗi đơn vị
nghĩa là thời gian.
1.000.000.000.0 dự báo chi nhánh giải đấu Một chi
00 (1012) byte. nhánh dự đoán với nhiều dự đoán cho
Để giảm nhầm từng nhánh và cơ chế lựa chọn chọn dự
lẫn, bây giờ đoán nào sẽ cho phép một nhánh nhất
chúng tôi sử định.
dụng thuật ngữ theo dõi Một trong hàng ngàn đồng tâm
này tebibyte vòng tròn tạo nên bề mặt của a
(TiB) cho 240 đĩa từ.
byte, xác định bóng bán dẫn Một công tắc bật / tắt
terabyte (TB) có được điều khiển bởi một tín hiệu điện.
nghĩa là 1012
bộ đệm dịch-lookaside (TLB) A bộ
byte. (Hình 1.1
nhớ cache theo dõi các ánh xạ địa chỉ
hiển thị đầy đủ
được sử dụng gần đây để cố gắng tránh
các giá trị và tên
truy cập vào bảng trang.
thập phân và nhị
bảng thật Từ logic, một đại diện của một
phân.)
hoạt động hợp lý bằng cách liệt kê tất cả các
phân đoạn văn
giá trị của các đầu vào và sau đó trong mỗi
bản Phân đoạn
trường hợp cho thấy các đầu ra kết quả sẽ là gì.
của một đối
tượng UNIX tệp tràn (điểm nổi) Một tình huống trong
chứa mã ngôn
đó một số mũ âm trở nên quá lớn để phù
ngữ máy cho các
hợp với trường số mũ.
truy cập bộ nhớ thống nhất (UMA) A bộ xử
thói quen trong
lý trong đó độ trễ của bất kỳ từ nào trong bộ
tệp nguồn.
nhớ chính là như nhau cho dù bộ xử lý nào yêu
chỉ Một
cầu quyền truy cập.
chủ đề bao
gồm
chương
trình bộ
đếm, trạng
thái đăng ký
và ngăn xếp.
Đó là một
quá trình
nhẹ; trong
khi các chủ
đề thường
chia sẻ một
không gian
địa chỉ duy
nhất, các
quy trình
don don.
mô hình ba
Cs Một mô
G-14 Thuật ngữ

đơn vị ở nơi cuối cùng (ulp) Số lượng các bit máy ảo Một máy tính ảo mà dường
bị lỗi trong các bit có ý nghĩa nhỏ nhất của ý như có các nhánh và tải không được
nghĩa giữa số thực tế và số có thể được biểu cung cấp và một bộ hướng dẫn phong
diễn. phú hơn phần cứng thực tế.
chưa lập bản đồ Một phần của không bộ nhớ ảo Một kỹ thuật sử dụng bộ
gian địa chỉ không thể có lỗi trang. nhớ chính như một bộ nhớ cache của
tài liệu tham khảo chưa được giải bộ nhớ cache cho bộ nhớ thứ cấp.
quyết Một tài liệu tham khảo đó yêu cầu bộ nhớ cache hầu như được giải quyết
thêm thông tin từ một nguồn bên ngoài Một bộ đệm đó là truy cập bằng một địa
để được hoàn thành. chỉ ảo chứ không phải là một địa chỉ vật
sử dụng bit Cũng được gọi bit tham khảo lý.
hoặc là truy cập bitMột trường được đặt bất bộ nhớ dễ bay hơi Lưu trữ, chẳng hạn như
cứ khi nào một trang. truy cập và được sử dụng DRAM , chỉ giữ lại dữ liệu nếu nó nhận được
để thực hiện LRU hoặc các chương trình thay điện.
thế khác. wafer Một lát từ một thỏi silicon không còn
sử dụng độ trễ Số chu kỳ đồng hồ giữa nữa dày hơn 0,1 inch, được sử dụng để tạo
một hướng dẫn tải và một hướng dẫn có chip.
thể sử dụng kết quả của tải mà không bị tỷ lệ yếu Tăng tốc đạt được trên a bộ xử
đình trệ đường ống. lý trong khi mở rộng kích thước của vấn
thời gian CPU người dùng Thời gian đề tỷ lệ thuận với sự gia tăng số lượng
CPU dành cho a chương trình chính nó. bộ xử lý.
bit hợp lệ Một trường trong các bảng của bộ mạng diện rộng (WAN) Một mạng
nhớ thứ bậc chỉ ra rằng khối liên kết trong thứ lưới mở rộng hơn hàng trăm km có thể
bậc chứa dữ liệu hợp lệ. trải dài trên một lục địa.
làn vector Một hoặc nhiều chức năng dây Trong Verilog, chỉ định một tổ hợp
vector đơn vị và một phần của tập tin đăng tín hiệu.
ký vector. Lấy cảm hứng từ các làn đường từ Các đơn vị tự nhiên của truy cập
trên đường cao tốc làm tăng tốc độ giao trong a máy tính, thường là một nhóm
thông, nhiều làn đường thực hiện các hoạt
32 bit.
động vectơ cùng một lúc.
can thiệp Một ngắt cho mà địa chỉ mà kiểm khối lượng công việc Một bộ chương trình
chạy trên a máy tính là bộ sưu tập ứng dụng
soát được chuyển được xác định bởi nguyên
thực tế do người dùng điều hành hoặc được
nhân của ngoại lệ.
xây dựng từ các chương trình thực để ước tính
Verilog Một trong hai phổ biến nhất
một hỗn hợp như vậy. Một khối lượng công
ngôn ngữ mô tả phần cứng. việc điển hình chỉ định cả chương trình và tần
mạch tích hợp (VLSI) quy mô rất số tương đối.
lớn Một thiết bị chứa hàng trăm hàng viết đệm Một hàng đợi giữ dữ liệu
ngàn đến hàng triệu bóng bán dẫn. trong khi dữ liệu đang chờ để được ghi
từ hướng dẫn rất dài (VLIW) A kiểu kiến vào bộ nhớ.
trúc tập lệnh khởi chạy nhiều thao tác được xác viết lại Một kế hoạch xử lý viết bằng
định là độc lập trong một lệnh rộng duy nhất, cách cập nhật các giá trị chỉ vào khối
thường có nhiều trường opcode riêng biệt. trong bộ đệm, sau đó viết khối đã sửa
VHDL Một trong hai phổ biến nhất đổi xuống cấp thấp hơn của hệ thống
ngôn ngữ mô tả phần cứng. phân cấp khi khối được thay thế.
địa chỉ ảo Một địa chỉ mà tương ứng với một viết qua Một kế hoạch trong đó viết
vị trí trong không gian ảo và được dịch bằng luôn cập nhật cả bộ đệm và cấp thấp
cách ánh xạ địa chỉ đến một địa chỉ vật lý khi hơn tiếp theo của hệ thống phân cấp bộ
bộ nhớ được truy cập.
nhớ, đảm bảo dữ liệu luôn nhất quán giữa hai bộ đệm.
năng suất Tỷ lệ phần trăm tốt chết từ tổng số người chết trên wafer.
Đọc thêm
Chương 1
Barroso, L. và U. Hölzle [2007]. Trường hợp cho điện toán tỷ lệ năng lượng, trực
tiếp Máy tính IEEE, Tháng 12.
Một lời biện hộ để thay đổi bản chất của các thành phần máy tính để chúng sử
dụng ít năng lượng hơn khi sử dụng nhẹ.
Chuông, C. G. [1996]. Tiên phong máy tính và máy tính tiên phong, ACM và
Bảo tàng Máy tính, băng video.
Hai băng video về lịch sử điện toán, được sản xuất bởi Gordon và Gwen Bell,
bao gồm các máy sau và nhà phát minh của họ: Harvard Mark-I, ENIAC,
EDSAC, máy IAS và nhiều máy khác.
Burks, A. W., H. H. Goldstine và J. von Neumann [1946]. Thảo luận sơ bộ về
thiết kế logic của một công cụ điện toán điện tử, trực tiếp Báo cáo với Hoa Kỳ .
Cục Quân đội, tr. 1; cũng xuất hiện trong Giấy tờ của John von Neumann, W .
Aspray và A. Burks (Eds.), Nhà xuất bản MIT, Nhà xuất bản Cambridge, MA và
Tomash, Los Angeles, 1987, 97 Tiết146.
Một bài báo kinh điển giải thích phần cứng và phần mềm máy tính trước khi máy
tính chương trình lưu trữ đầu tiên được chế tạo. Chúng tôi trích dẫn rộng rãi từ
nó trong Chương 3. Nó đồng thời giải thích các máy tính với thế giới và là một
nguồn gây tranh cãi vì bản dự thảo đầu tiên không cung cấp tín dụng cho Eckert
và Mauchly.
Campbell-Kelly, M. và W. Aspray [1996]. Máy tính: Lịch sử thông tin Máy móc,
Sách cơ bản, New York.
Hai nhà sử học ghi lại câu chuyện kịch tính. Các Thời báo New York gọi nó là
văn bản và có thẩm quyền.
Ceruzzi, P. F. [1998]. Lịch sử điện toán hiện đại, Báo chí MIT, Cambridge, MA .
Chứa một mô tả hay về lịch sử điện toán sau này: mạch tích hợp và tác động của
nó, máy tính cá nhân, UNIX và Internet.
Curnow, H. J. và B. A. Doesmann [1976]. Một điểm chuẩn tổng hợp, trực tiếp Máy tính
J. 19 (1): 80.
Mô tả điểm chuẩn tổng hợp chính đầu tiên, Whetstone và cách nó được tạo ra.

Flemming, P. J. và J. J. Wallace [1986]. Cách làm thế nào để không nói dối với số
liệu thống kê: Cách chính xác để tóm tắt kết quả điểm chuẩn, Cộng đồng. ACM 29 (3
(tháng 3)), 218 Từ221.
Mô tả một số nguyên tắc cơ bản trong việc sử dụng các phương tiện khác nhau
để tóm tắt kết quả hiệu suất.
FR-2 Đọc thêm

Goldstine, H. H. [1972]. Máy tính: Từ Pascal đến von Neumann, Nhà xuất bản
Đại học Princeton, Princeton, NJ .
Một quan điểm cá nhân về điện toán của một trong những người tiên phong đã làm
việc với von Neumann.

Hayes, B. [2007]. Máy tính trong một vũ trụ song song, trực tiếp Nhà khoa học
người Mỹ, Tập.
95 (Tháng 11, tháng 12), 476 Từ480.
Tổng quan về thử thách điện toán song song được viết cho giáo dân.
Hennessy, J. L. và D. A. Patterson [2012]. Chương 1 của Kiến trúc máy tính: A
Phương pháp định lượng, ấn bản thứ năm, Nhà xuất bản Morgan Kaufmann, Waltham,
MA .
Mục 1.5 đi sâu vào chi tiết hơn về sức mạnh, Phần 1.6 chứa nhiều chi tiết hơn về chi
phí của các mạch tích hợp và giải thích lý do cho sự khác biệt giữa giá và chi phí và
Phần 1.8 cung cấp thêm chi tiết về đánh giá hiệu suất.
Lampson, B. W. [1986]. Điện toán phân tán cá nhân; Phần mềm Alto và Ethernet.Hội
thảo ACM về Lịch sử máy trạm cá nhân (tháng 1).
Thacker, C. R. [1986]. Điện toán phân tán cá nhân: Phần cứng Alto và Ethernet, Hội
nghị ACM về Lịch sử máy trạm cá nhân (tháng 1).
Hai bài báo này mô tả phần mềm và phần cứng của cột mốc Alto .

Đô thị, N., J. Howlett và G.-C. Rota (Eds.) [1980]. Lịch sử tính toán trong Thế kỷ
XX, Nhà xuất bản Học thuật, New York.
Một tập hợp các bài tiểu luận mô tả con người, phần mềm, máy tính và phòng thí
nghiệm liên quan đến các máy tính thử nghiệm và thương mại đầu tiên. Hầu hết
các tác giả đã tham gia vào các dự án. Một thư mục tuyệt vời của các báo cáo
sớm kết thúc cuốn sách thú vị này.
Hệ thống phát thanh công cộng [1992]. Cỗ máy đã thay đổi thế giới, băng video.
Năm chương trình kéo dài 1 giờ này bao gồm các cảnh quay hiếm hoi và các
cuộc phỏng vấn với những người tiên phong của ngành công nghiệp máy tính.
Slater, R. [1987]. Chân dung ở Silicon, Báo chí MIT, Cambridge, MA .
Tiểu sử ngắn của 31 nhà tiên phong máy tính.
Stern, N. [1980]. Ai đã phát minh ra máy tính kỹ thuật số điện tử đầu tiên?Giáo
dục Biên niên sử của Lịch sử tính toán 2: 4 (Tháng Mười), 375 Từ376.
Một quan điểm của nhà sử học về Atanasoff so với Eckert và Mauchly.
Wilkes, M. V. [1985]. Hồi ức của một tiên phong máy tính, Báo chí MIT, Cambridge,
MA .
Một quan điểm cá nhân về điện toán của một trong những người tiên phong.
Đọc thêm FR-3

Chương 2
Bayko, J. [1996]. Bộ vi xử lý tuyệt vời của quá khứ và hiện tại, tìm kiếm nó trên
http://www.cpushack.com/CPU/cpu.html.
Một cái nhìn cá nhân về lịch sử của cả bộ vi xử lý đại diện và bộ vi xử lý bất
thường, từ Intel 4004 đến Patriot Science ShBoom!
Kane, G. và J. Heinrich [1992]. Kiến trúc MIPS RISC, Hội trường Prentice, Vách
đá Englewood, NJ .
Cuốn sách này mô tả kiến trúc MIPS chi tiết hơn Phụ lục A.

Levy, H. và R. Eckhouse [1989]. Lập trình và kiến trúc máy tính: The VAX, Báo
chí kỹ thuật số, Boston.
Cuốn sách này tập trung vào VAX, nhưng cũng bao gồm các mô tả về Intel 8086,
IBM 360 và CDC 6600.
Morse, S., B. Ravenal, S. Mazor và W. Pohlman [1980]. Bộ vi xử lý Intel Intel
8080 đến 8086 , Máy vi tính 13:10 (tháng 10).
Lịch sử kiến trúc của Intel từ năm 4004 đến 8086, theo những người tham gia
thiết kế.
Wakerly, J. [1989]. Kiến trúc và lập trình máy vi tính, Wiley, New York.
Motorola 6800 là trọng tâm chính của cuốn sách, nhưng nó bao gồm Intel 8086,
Motorola 6809, TI 9900 và Zilog Z8000.
Waterman, A. Y. Lee, D. Patterson và K. Asanović [2016]. Hướng dẫn sử dụng
tập lệnh RISC-V, Tập I: ISA cấp độ người dùng, Phiên bản 2.1.
Hướng dẫn tham khảo chính tắc cho kiến trúc tập lệnh RISC-V, báo cáo kỹ thuật
này thảo luận về lý do đằng sau vô số sự đánh đổi trong thiết kế của ISA. Tải về
từ http://riscv.org/specifying/.

Chương 3
Nếu bạn quan tâm đến việc tìm hiểu thêm về các điểm nổi, hai ấn phẩm của
David Goldberg [1991, 2002] là điểm khởi đầu tốt; chúng có rất nhiều con trỏ để
đọc thêm. Một số câu chuyện được kể trong phần này đến từ Kahan [1972, 1983].
Từ mới nhất về trạng thái của nghệ thuật trong số học máy tính thường được tìm
thấy trong Thủ tục tố tụng của Hội nghị chuyên đề mới nhất do IEEE tài trợ về số
học máy tính, được tổ chức 2 năm một lần; lần thứ 16 được tổ chức vào năm
2003.
FR-4 Đọc thêm

Burks, A. W., H. H. Goldstine và J. von Neumann [1946]. Thảo luận sơ bộ về


thiết kế logic của một công cụ điện toán điện tử, trực tiếp Báo cáo với Hoa Kỳ .
Phòng quân sự, tr. 1; cũng trong. Giấy tờ của John von Neumann, W. Aspray và
A . Burks (Eds.), Nhà xuất bản MIT, Cambridge, MA; và Nhà xuất bản Tomash,
Los Angeles, 1987, 97 trừ146.
Bài viết cổ điển này bao gồm các đối số chống lại phần cứng dấu phẩy động.

Goldberg, D. [2002]. Số học máy tính của người Viking. Phụ lục J của Kiến trúc
máy tính : Một cách tiếp cận định lượng, phiên bản thứ năm, J. L. Hennessy và D.
A. Patterson, Morgan Nhà xuất bản Kaufmann, Waltham, MA .
Giới thiệu nâng cao hơn về số nguyên và số học dấu phẩy động, với trọng tâm là
phần cứng. Nó bao gồm Phần 3.4 .3.6 của cuốn sách này chỉ trong 10 trang, để
lại 45 trang khác cho các chủ đề nâng cao.
Goldberg, D. [1991]. Những gì mọi nhà khoa học máy tính nên biết về số học
dấu phẩy động , Khảo sát điện toán ACM 23 (1), 5 trận48.
Một giới thiệu tốt khác về số học dấu phẩy động của cùng một tác giả, lần này
nhấn mạnh vào phần mềm .
Kahan, W. [1972]. Một cuộc khảo sát về phân tích lỗi. Thông tin. Xử lý 71 (Proc.
IFIP Đại hội 71 tại Ljubljana), Tập. 2, Nhà xuất bản Bắc Hà Lan, Amsterdam,
1214 1239
Khảo sát này là một nguồn câu chuyện về tầm quan trọng của số học chính xác.

Kahan, W. [1983]. Toán học viết bằng cát cát , Proc. Amer. Thống kê. PGS. Liên
kết Các cuộc họp mùa hè năm 1983, Phần tính toán thống kê, 12 trận26.
Tiêu đề đề cập đến silicon và là một nguồn truyện khác minh họa tầm quan trọng
của số học chính xác.
Kahan, W. [1990]. Về lợi thế của ngăn xếp 8087, ghi chú khóa học chưa được
công bố , Phòng Khoa học Máy tính, Đại học California, Berkeley.
Những gì kiến trúc điểm nổi 8087 có thể có được.

Kahan, W. [1997]. Có sẵn tại http://www.cims.nyu.edu/~dbindel/group/ cs279 /


87stack.pdf.
Một bộ sưu tập các bản ghi nhớ liên quan đến điểm nổi, bao gồm cả những con
số quái thú (một lỗi Pentium ít nổi tiếng khác) Ghi chú trên số học dấu phẩy
động của IEEE (bao gồm các ý kiến về cách một số tính năng đang gây khó chịu)
và các hiệu ứng kỳ quái của tính toán điểm chuẩn (về mối bận tâm không lành
mạnh về tốc độ so với tính chính xác, độ chính xác, dễ sử dụng, linh hoạt, ...).
Koren, I. [2002]. Thuật toán số học máy tính, phiên bản thứ hai, A. K. Peters,
Natick, MA .
Đọc thêm FR-5

Một cuốn sách giáo khoa nhắm vào người cao niên và sinh viên tốt nghiệp năm
thứ nhất giải thích các nguyên tắc cơ bản của số học cơ bản, cũng như các hoạt
động phức tạp như các hàm logarit và lượng giác.
Wilkes, M. V. [1985]. Hồi ức của một tiên phong máy tính, Báo chí MIT, Cambridge, MA .
Hồi ức tiên phong trên máy tính này bao gồm việc tạo ra phần cứng tiêu chuẩn
để nhân và chia được phát triển bởi von Neumann.

Chương 4
Bhandarkar, D. và D. W. Clark [1991]. Hiệu suất của kiến trúc: So sánh RISC và
CISC với các tổ chức phần cứng tương tự, Proc. Thứ tư Conf. về Hỗ trợ kiến trúc
cho các ngôn ngữ lập trình và hệ điều hành, IEEE / ACM (Tháng 4), Palo Alto,
CA, 310 Từ319.
Một so sánh định lượng của RISC và CISC được viết bởi các học giả đã tranh
luận về CISC cũng như xây dựng chúng; họ kết luận rằng MIPS nhanh hơn từ 2
đến 4 lần so với VAX được chế tạo với công nghệ tương tự, với giá trị trung bình
là 2,7.
Fisher, J. A. và B. R. Rau [1993]. Tạp chí siêu máy tính (tháng 1), Kluwer.
Toàn bộ vấn đề này được dành cho chủ đề khai thác ILP. Nó chứa các bài viết về cả
kiến trúc và phần mềm và là một nguồn tuyệt vời để tham khảo thêm .

Hennessy, J. L. và D. A. Patterson [2012]. Kiến trúc máy tính: Một định lượng
Cách tiếp cận, phiên bản thứ năm, Morgan Kaufmann, Waltham, MA .
Chương 3 và Phụ lục C đi sâu vào chi tiết hơn đáng kể về bộ xử lý đường ống
(gần 200 trang), bao gồm bộ xử lý siêu âm và bộ xử lý VLIW. Phụ lục G mô tả
Itanium.

Jouppi, N. P. và D. W. Wall [1989]. Có sẵn song song cấp độ hướng dẫn cho bộ
xử lý siêu âm và siêu đường, Proc. Thứ ba Conf. về kiến trúc Hỗ trợ cho các
ngôn ngữ lập trình và hệ điều hành, IEEE / ACM (Tháng 4) , Boston, 272
bóng82.
Một so sánh của các hệ thống đường ống sâu (còn gọi là superpipeled) và superscalar.

Kogge, P. M. [1981]. Kiến trúc của máy tính đường ống, McGraw-Hill, New
York.
Một văn bản chính thức về kiểm soát đường ống, nhấn mạnh vào các nguyên tắc cơ bản.

Russell, R. M. [1978]. Hệ thống máy tính CRAY-1 , Cộng đồng. ACM 21: 1
(tháng 1), 63 trận72.
Một bản tóm tắt ngắn về một máy tính cổ điển sử dụng các vectơ hoạt động để
loại bỏ các quầy hàng đường ống.
FR-6 Đọc thêm

Smith, A. và J. Lee [1984]. Chiến lược dự đoán chi nhánh và thiết kế bộ đệm
mục tiêu chi nhánh , Máy vi tính 17: 1 (tháng 1), 6 trận22.
Một cuộc khảo sát sớm về dự đoán chi nhánh.

Smith, J. E. và A. R. Plezkun [1988]. Thực hiện các ngắt chính xác trong bộ xử
lý đường ống IEEE Trans. trên máy tính 37: 5 (tháng 5), 562 bóng573.
Bao gồm những khó khăn trong việc làm gián đoạn máy tính đường ống.

Thornton, J. E. [1970]. Thiết kế máy tính: Dữ liệu điều khiển 6600, Scott,
Foresman, Glenview, IL .
Một cuốn sách cổ điển mô tả một máy tính cổ điển, được coi là siêu máy tính đầu
tiên.

Chương 5
Cantin, J. F. và M. D. Hill [2001]. Hiệu suất bộ đệm của bộ nhớ cache cho các điểm
chuẩn SPEC CPU2000 được chọn , SIGARCH Tin tức kiến trúc máy tính 29: 4 (Tháng 9),
13 trận18.
Một tài liệu tham khảo về tỷ lệ bỏ lỡ bộ nhớ cache cho nhiều kích thước bộ đệm
cho điểm chuẩn SPEC2000.
Conti, C, D. H. Gibson và S. H. Pitowsky [1968]. Các khía cạnh cấu trúc của hệ
thống / 360 Model 85, phần I: Tổ chức chung , Hệ thống IBM J . 7: 1, 2 trận14.
Một bài báo cổ điển mô tả máy tính thương mại đầu tiên sử dụng bộ đệm và hiệu
suất kết quả của nó.
Hennessy, J. và D. Patterson [2012]. Chương 2 và Phụ lục B trong Máy tính Kiến
trúc: Cách tiếp cận định lượng, ấn bản thứ năm, Nhà xuất bản Morgan Kaufmann ,
Waltham, MA .
Để biết thêm về phạm vi chuyên sâu của nhiều chủ đề bao gồm bảo vệ, hiệu suất
bộ đệm của bộ xử lý ngoài thứ tự, bộ nhớ cache hầu như được xử lý, bộ nhớ
cache đa cấp, tối ưu hóa trình biên dịch, cơ chế dung sai độ trễ bổ sung và kết
hợp bộ đệm.
Kilburn, T., D. B. G. Edwards, M. J. Lanigan và F. H. Sumner [1962]. Hệ thống lưu
trữ một cấp độ, trực tiếp Giao dịch IRE trên máy tính điện tử EC-11 (tháng 4), 223
trận
35. Cũng xuất hiện trong D. P. Siewiorek, C G Bell và A. Newell [1982] , Máy vi
tính Cấu trúc: Nguyên tắc và ví dụ, McGraw-Hill, New York, 135 trận48.
Bài báo cổ điển này là đề xuất đầu tiên cho bộ nhớ ảo.

LaMarca, A. và R. E. Ladner [1996]. Ảnh hưởng của bộ nhớ cache đến hiệu suất
của đống, trực tiếp ACM J. của Thuật toán thực nghiệm, Tập. 1.
Bài viết này cho thấy sự khác biệt giữa phân tích độ phức tạp của thuật toán,
hiệu suất đếm lệnh và phân cấp bộ nhớ cho bốn thuật toán sắp xếp.
Đọc thêm FR-7

McCalpin, J. D. [1995]. ĐƯỜNG ĐƯỜNG: Băng thông bộ nhớ bền vững trong
máy tính hiệu suất cao, trực tiếp https://www.cs.virginia.edu/stream/.
Một microbenchmark được sử dụng rộng rãi để đo hiệu suất của hệ thống bộ
nhớ phía sau bộ nhớ cache.
Przybylski, S. A. [1990]. Thiết kế phân cấp bộ nhớ và bộ nhớ: Cách tiếp cận
theo hướng hiệu suất, Nhà xuất bản Morgan Kaufmann, San Francisco.
Một khám phá kỹ lưỡng về hệ thống phân cấp bộ nhớ đa cấp và hiệu suất của chúng.

Ritchie, D. [1984]. Sự phát triển của hệ thống chia sẻ thời gian UNIX Chuông
AT & T Phòng thí nghiệm Tạp chí kỹ thuật, 1984: 1577 Từ1593.
Lịch sử của UNIX từ một trong những nhà phát minh của nó.
Ritchie, D. M. và K. Thompson [1978]. Hệ thống chia sẻ thời gian UNIX
Chuông Tạp chí kỹ thuật hệ thống (Tháng 8), 1991 19912019.
Một bài báo mô tả hệ điều hành thanh lịch nhất từng được phát minh.
Silberschatz, A., P. Galvin và G. Grange [2003]. Khái niệm hệ điều hành, phiên
bản thứ sáu, Addison-Wesley, Reading, MA .
Một cuốn sách giáo khoa hệ điều hành với một cuộc thảo luận kỹ lưỡng về các
quy trình bộ nhớ ảo và quản lý quy trình và các vấn đề bảo vệ.
Smith, A. J. [1982]. Bộ nhớ cache của bộ nhớ cache Khảo sát tính toán 14: 3
(Tháng 9), 473 bóng530.
Các bài khảo sát cổ điển về bộ nhớ cache. Bài viết này định nghĩa thuật ngữ cho
lĩnh vực này và đã phục vụ như một tài liệu tham khảo cho nhiều nhà thiết kế
máy tính.
Smith, D. K. và R. C. Alexander [1988]. dò dẫm tương lai: Xerox đã phát minh
ra như thế nào , Sau đó bỏ qua, máy tính cá nhân đầu tiên, Morrow, New York.
Một cuốn sách nổi tiếng giải thích vai trò của Xerox PARC trong việc đặt nền
tảng cho điện toán ngày nay, nhưng Xerox không được hưởng lợi đáng kể từ đó.
Tanenbaum, A. [2001]. Hệ điều hành hiện đại, phiên bản thứ hai, Thượng Yên
sông: Hội trường Prentice, NJ .
Một cuốn sách giáo khoa hệ điều hành với một cuộc thảo luận tốt về bộ nhớ ảo.
Waterman, A. Y. Lee, D. Patterson và K. Asanović [2016]. Hướng dẫn sử dụng
tập lệnh RISC-V, Tập II: Kiến trúc đặc quyền, Phiên bản 1.9.1.
Hướng dẫn Kiến trúc Đặc quyền RISC-V thảo luận chi tiết hơn về thiết kế chế độ
đặc quyền lớp và các sơ đồ dịch thuật và bảo vệ địa chỉ bộ nhớ được mô tả trong
Chương 5.
Wilkes, M. [1965]. Bộ nhớ nô lệ và phân bổ lưu trữ động IEEE Trans.
Máy tính điện tử EC 14 (2 (tháng 4)), 270 bóng271.
Các giấy cổ điển đầu tiên trên bộ nhớ cache.
FR-8 Đọc thêm

Chương 6
Agrawal P. và W. J. Dally [1990]. Một hệ thống mô phỏng logic phần cứng , Các giao
dịch của IEEE trên thiết kế hỗ trợ máy tính của các mạch và hệ thống tích hợp 9 (1): 19
bóng29.
Almasi, G. S. và A. Gottlieb [1989]. Tính toán song song cao, Benjamin /
Cummings, Thành phố Redwood, CA .
Một cuốn sách giáo khoa bao gồm các máy tính song song.

Amdahl, G. M. [1967]. Hiệu lực của phương pháp xử lý đơn để đạt được khả
năng tính toán quy mô lớn, trực tiếp Proc. Máy tính chung mùa xuân AFIPS Conf,
Thành phố Atlantic, NJ (Tháng Tư), 483 Từ85.
Được viết để đáp lại những tuyên bố của Illiac IV, bài viết dài ba trang này mô
tả luật Amdahl và đưa ra câu trả lời cổ điển cho các lập luận về việc từ bỏ hình
thức điện toán hiện tại.
Andrew, G. R. [1991]. Lập trình đồng thời: Nguyên tắc và thực hành, Benjamin /
Cummings, Redwood City, CA .
Một văn bản đưa ra các nguyên tắc lập trình song song.

Archibald, J. và J.-L. Baer [1986]. Các giao thức kết hợp bộ đệm của bộ đệm:
Đánh giá bằng mô hình mô phỏng đa bộ xử lý, , ACM Trans. trên hệ thống máy
tính 4: 4 (tháng 11), 273 bóng98.
Tài liệu khảo sát cổ điển về các giao thức kết hợp bộ đệm bus chia sẻ.
Arpaci-Dusseau, A., R. Arpaci-Dusseau, D. Culler, J. Hellerstein và D. Patterson
[1997]. Sắp xếp hiệu suất cao trên mạng của máy trạm, trực tiếp Proc. ACM SIG Hội
nghị MOD / PODS về quản lý dữ liệu, Tucson, AZ (tháng 5), 12 trận15.
Cách sắp xếp kỷ lục thế giới được thực hiện trên một cụm, bao gồm phê bình
kiến trúc của máy trạm và giao diện mạng. Đến ngày 1 tháng 4 năm 1997, họ đã
đẩy kỷ lục lên 8.6 GB trong 1 phút và 2,2 giây để sắp xếp 100 MB.
Asanović, K. [2002]. Lập trình thần kinh. Trong Arbib MA, (Eds.), Các Cẩm nang về lý
thuyết não và mạng lưới thần kinh, Phiên bản thứ hai, Cambridge, MA MIT Báo chí
(tháng 11). https://people.eecs.ber siêu. edu /∼krste / giấy / máy tính thần kinh.pdf.
Asanović, K, J. Beck, Johnson, J. Wawrzynek, B. Kingsbury và N. Morgan
[1998]. [Tháng 11 năm 1998]. Đào tạo Mạng lưới thần kinh với Spert-II. Ở
Sundararajan, N, Saratchandran, P, (Eds.), Chương 11 song song Kiến trúc cho
mạng nhân tạo: Nghịch lý và triển khai, IEEE Báo chí xã hội máy tính (tháng 11).
SỐ 0-8186-8399-6 https://people
.eecs.ber siêu.edu /∼krste / giấy tờ / năm.pdf.
Asanovic, K., R. Bodik, B. C. Catanzaro, J. J. Gebis, P. Chồng, K. Keutzer, D. A. Patterson, W.
L. Plishker, J. Shalf, S. W. Williams và K. A. Yelick [2006]. Cảnh quan của nghiên cứu điện
toán song song: Một góc nhìn từ Berkeley.Giáo dục Công nghệ. Đại diện. UCB / EECS-2006-
183, Khoa EECS, Đại học California, Berkeley (ngày 18 tháng 12).
Đọc thêm FR-9

Biệt danh là Chế độ xem Berkeley Berkeley, báo cáo này đưa ra bối cảnh của thử
thách đa lõi.
Bailey, D. H., E. Barszcz, J. T. Barton, D. S. Browning, R. L. Carter, L. Dagum,
R. A. Fatoohi, P. O. Frederickson, T. A. Lasinski, R. S. Schreiber, H. D. Simon,
V. Venkatakrishnan và S. K. Weeratunga. [1991]. Các điểm chuẩn song song của
NAS Tóm tắt và kết quả sơ bộ, trực tiếp Thủ tục tố tụng của Hội nghị ACM /
IEEE năm 1991 trên siêu máy tính (Tháng Tám).
Mô tả các điểm chuẩn song song NAS.

Chuông, C. G. [1985]. Đa số: Một lớp máy tính đa xử lý mới , Khoa học 228
(ngày 26 tháng 4), 462 bóng467.
Phân biệt địa chỉ được chia sẻ và bộ nhân địa chỉ không được chia sẻ dựa trên
bộ vi xử lý.
Bienia, C., S. Kumar, J. P. Singh và K. Li [2008]. Bộ tiêu chuẩn PARSEC: đặc
trưng và ý nghĩa kiến trúc, Báo cáo kỹ thuật của Đại học Princeton Princeton TR-
81 1-008 (tháng 1).
Mô tả các điểm chuẩn song song PARSEC. Cũng xem http://parsec.cs.princeton.edu/.

Chen Y, T. Chen, Z. Xu, N. Sun và O. Teman [2016]. Gia đình DianNao: Máy
gia tốc phần cứng tiết kiệm năng lượng cho học máy , Cộng đồng. ACM 59:11,
(tháng 11), 105 trận112.
Cooper, B. F., A. Silberstein, E. Tam, R. Ramakrishnan, R. Sears [2010]. Điểm
chuẩn hệ thống phục vụ đám mây với YCSB, In : Thủ tục tố tụng của ACM thứ
nhất Hội thảo chuyên đề về điện toán đám mây, Indianapolis, Indiana, Hoa Kỳ .
http://dx.doi. org / 10.1145 / 1807128.1807152 (Tháng 6).
Trình bày về Yahoo! Khung phục vụ đám mây (YCSB), với mục tiêu tạo điều kiện so sánh hiệu
suất của thế hệ hệ hệ thống phục vụ dữ liệu đám mây mới.

Culler, D. E., J. P. Singh và A. Gupta [1998]. Kiến trúc máy tính song song,
Morgan Kaufmann, San Francisco.
Một cuốn sách giáo khoa về máy tính song song.
Dongarra, J. J., J. R. Bunch, G. B. Moler và G. W. Stewart [1979]. Người dùng
LINPACK Hướng dẫn, Hội Toán học công nghiệp.
Tài liệu gốc mô tả Linpack, đã trở thành một chuẩn mực song song được sử dụng
rộng rãi.
Falk, H. [1976]. Tiếp cận với gigaflop, trực tiếp Phổ biến IEEE 13:10 (tháng 10),
65 trận70.
Biên niên sử câu chuyện buồn về Illiac IV: bốn lần chi phí và ít hơn một phần
mười hiệu suất của các mục tiêu ban đầu.
FR-10 Đọc thêm

Flynn, M. J. [1966]. Hệ thống máy tính tốc độ cao rất cao, trực tiếp Proc. IEEE
54:12 (tháng 12), 1901 Từ09.
Bài viết cổ điển hiển thị phân loại SISD / SIMD / MISD / MIMD.

Hammerstrom D [1990]. Một kiến trúc VLSI cho học tập hiệu suất cao, chi phí
thấp, trên chip. Trong Kỷ yếu của Hội nghị chung quốc tế về thần kinh Mạng,
San Diego, CA, Báo chí IEEE (tháng 6), 17 trận21.
Hennessy, J. và D. Patterson [2012]. Chương 5 và các phụ lục F và I. Trong Kiến
trúc máy tính: Cách tiếp cận định lượng, phiên bản thứ năm, Morgan Kaufmann
Nhà xuất bản, Waltham, MA .
Một phạm vi bảo hiểm sâu hơn về một loạt các chủ đề đa bộ xử lý và cụm, bao
gồm các chương trình và phép đo.
Henning, J. L. [2007]. Tăng trưởng bộ CPU SPEC: một viễn cảnh lịch sử, trực
tiếp Máy vi tính Tin tức kiến trúc, Tập. 35, không. 1 (Tháng 3).
Cung cấp lịch sử của Spec, bao gồm việc sử dụng Specrate để đo lường hiệu suất
đối với các công việc độc lập, đang được sử dụng làm chuẩn mực song song.
Hord, R. M. [1982]. Illiac-IV, siêu máy tính đầu tiên, Nhà xuất bản Khoa học
Máy tính, Rockville, MD .
Một kế toán lịch sử của dự án Illiac IV.

Hwang, K. [1993]. Kiến trúc máy tính tiên tiến với lập trình song song, McGraw-
Hill, New York.
Một cuốn sách giáo khoa khác bao gồm các máy tính song song.
Ienne P, Cornu T, Kuhn G. [1996]. Phần cứng kỹ thuật số chuyên dùng cho
mạng thần kinh: Một khảo sát kiến trúc , Tạp chí của Hệ thống xử lý tín hiệu
VLSI cho Công nghệ tín hiệu, hình ảnh và video 13: 1, 5 trận25.
Jouppi N [2018] Google siêu nạp các tác vụ học máy với tùy chỉnh TPU con chip
(16 tháng 5). https://cloud.google.com/blog/products/gcp/google-supercharges-
machine-learning-t Nhiệm vụ-with-custom-chip.
Kozyrakis, C. và D. Patterson [2003]. Bộ xử lý vector có thể mở rộng cho các hệ
thống nhúng , IEEE Micro 23: 6 (Tháng 11, tháng 12), 36 trận45.
Kiểm tra kiến trúc vectơ cho tập lệnh MIPS trong phương tiện và xử lý tín hiệu.
Laprie, J.-C. [1985]. Điện toán đáng tin cậy và khả năng chịu lỗi: Khái niệm và
thuật ngữ, trực tiếp Hội nghị chuyên đề Int Intl thường niên lần thứ 15 về tính
toán chịu lỗi FTCS 15, Digest of Papers, Ann Arbor, MI (19 tháng 62121) 2
trận11.
Bài viết giới thiệu các định nghĩa tiêu chuẩn về độ tin cậy, độ tin cậy và tính sẵn
có.
Đọc thêm FR-11

Menabrea, L. F. [1842]. Phác thảo của động cơ phân tích được phát minh bởi
Charles Babbage ', Bibliothèque Universelle de Genève (Tháng Mười).
Chắc chắn là tài liệu tham khảo sớm nhất về bộ đa xử lý, nhà toán học này đã
đưa ra nhận xét này trong khi dịch các bài báo trên máy tính cơ Babbage.
Patterson, D., G. Gibson và R. Katz [1988]. Một trường hợp cho các mảng dư
thừa của các đĩa rẻ tiền (RAID), Hội nghị SIGMOD, 109 bóng16.
Pfister, G. F. [1998]. Trong Tìm kiếm các cụm: Trận chiến sắp tới ở song song
thấp Máy tính, phiên bản thứ hai, Hội trường Prentice, Thượng Yên River, NJ .
Một cuốn sách giải trí ủng hộ các cụm và chỉ trích các bộ xử lý đa năng của NUMA.

Putnam A, et al. [2016] Một loại vải có thể cấu hình lại để tăng tốc các dịch vụ
trung tâm dữ liệu quy mô lớn , Cộng đồng. ACM 59 (tháng 11), 114 Từ122.
Regnier, G., S. Makineni, R. Illikkal, R. Iyer, D. Minturn, R. Huggahalli, D.
Newell, L. Cline và A. Foong [2004]. TCP đang tải cho các máy chủ trung tâm
dữ liệu. Máy tính IEEE, 37 (11), 48 bóng58.
Mô tả công việc của các nhà nghiên cứu tại Intel Labs, những người đã thử
nghiệm các giải pháp thay thế cải thiện khả năng xử lý các gói TCP / IP của máy
chủ một cách hiệu quả và ở mức rất cao.
Seitz, C. [1985]. Khối lập phương vũ trụ, trực tiếp Thông tin. ACM 28: 1 (tháng 1), 22 trận31.
Một bài viết hướng dẫn về một bộ xử lý song song được kết nối thông qua một
hypertree. Cosmic Cube là tổ tiên của siêu máy tính Intel.
Slotnick, D. L. [1982]. Quan niệm và phát triển bộ xử lý song song Một cuốn hồi ký
cá nhân , Biên niên sử của lịch sử điện toán 4: 1 (tháng 1), 20 trận30.
Hồi ức về sự khởi đầu của quá trình xử lý song song của kiến trúc sư của Illiac IV.

Williams, S., A. Waterman và D. Patterson [2009]. Đường dây mái: Một mô hình
hiệu suất hình ảnh sâu sắc cho kiến trúc đa lõi , Truyền thông của ACM, 52: 4
(Tháng 4), 65 trận76.
Williams, S., J. Carter, L. Oliker, J. Shalf và K. Yelick [2008]. Tối ưu hóa mô
phỏng của Lattice Boltzmann trên các nền tảng đa lõi hàng đầu, trực tiếp Song
song quốc tế & Hội thảo chuyên đề xử lý phân tán (IPDPS).
Giấy chứa kết quả của bốn đa số cho LBMHD.

Williams, S., L. Oliker, R. Vuduc, J. Shalf, K. Yelick và J. Demmel [2007]. Tối


ưu hóa phép nhân vectơ ma trận thưa thớt trên các nền tảng đa lõi mới nổi Siêu
máy tính (SC)
Giấy chứa kết quả của bốn đa số cho SPmV.
Williams, S. [2008]. Hiệu suất tự động của máy tính đa lõi, Bằng tiến sĩ .
Luận án, U.C. Berkeley.
FR-12 Đọc thêm

Luận án có chứa mô hình mái nhà.

Woo, S.C., M. Ohara, E. Torrie, J.P. Singh và A. Gupta. Các chương trình SPLASH-2:
đặc tính và cân nhắc phương pháp, trực tiếp Thủ tục tố tụng ngày 22 Hội thảo quốc tế
hàng năm về kiến trúc máy tính (ISCA, 95), Tháng 5, 24 trận36.
Bài viết mô tả phiên bản thứ hai của các tiêu chuẩn song song Stanford.

Phụ lục A
Có một số văn bản tốt về thiết kế logic. Dưới đây là một số bạn có thể muốn xem
xét.
Ashenden, P. [2007]. Thiết kế kỹ thuật số: Cách tiếp cận hệ thống nhúng bằng VHDL
/
Verilog, Waltham, MA: Morgan Kaufmann.

Ciletti, M. D. [2002]. Thiết kế kỹ thuật số tiên tiến với Verilog HDL, Englewood
Cliff s, NJ: Hội trường Prentice.
Một cuốn sách kỹ lưỡng về thiết kế logic sử dụng Verilog.
Harris, D. và S. Harris [2012]. Thiết kế kỹ thuật số và kiến trúc máy tính,
Waltham, MA: Morgan Kaufmann.
Một cách tiếp cận độc đáo và hiện đại để thiết kế kỹ thuật số sử dụng VHDL và
SystemVerilog.

Katz, R. H. [2004]. Thiết kế logic hiện đại, Tái bản lần 2., Đọc, MA: Addison-
Wesley.
Một văn bản chung về thiết kế logic.
Wakerly, J. F. [2000]. Thiết kế kỹ thuật số: Nguyên tắc và thực tiễn, Tái bản lần 3.,
Tiếng Anh
Cliff s, NJ: Hội trường Prentice.
Một văn bản chung về thiết kế logic.

Phụ lục B
Akeley, K. và T. Jermoluk [1988]. Kết xuất đa giác hiệu suất cao, trực tiếp Proc.
SIGGRAPH 1988 (Tháng 8), 239 bóng46.
Akeley, K. [1993]. Đồ họa RealityEngine, đồ họa Proc. SIGGRAPH 1993
(Tháng 8), 109 trận16.
Blelloch, G. B. [1990]. Tổng hợp Prefix và các ứng dụng của họ.Trong John H. Reif
(Ed.), Tổng hợp các thuật toán song song, Nhà xuất bản Morgan Kaufmann, San
Francisco.
Blythe, D. [2006]. Hệ thống Direct3D 10, trực tiếp ACM Trans. Đồ họa Tập. 25
không. 3, (tháng 7), 724 Từ734.
Đọc thêm FR-13

Buck, I., T. Foley, D. Horn, J. Sugerman, K. Fatahlian, M. Houston và P. Hanrahan


[2004]. Brook Brook cho GPU: Tính toán luồng trên phần cứng đồ họa.Giáo dục
Proc. SIGGRAPH 2004, 777 bóng86, tháng 8.
http://doi.acm.org/10.1145/1186562.1015800.
Anh Cả, G. [2002] Điên 9700.Hội thảo về đồ họa / SIGGRAPH về phần cứng đồ họa,
phiên Hot3D. www.graphicshardware.org/preingly/www_2002/ thuyết trình /
Hot3D-RADEON9700.ppt.
Fernando, R. và M. J. Kilgard [2003]. Hướng dẫn Cg: Hướng dẫn dứt khoát Đồ
họa thời gian thực có thể lập trình, Addison-Wesley, Đọc, MA .
Fernando, R. (Ed.), [2004]. GPU Gems: Kỹ thuật lập trình, mẹo và thủ thuật cho
đồ họa thời gian thực, Addison-Wesley, Đọc, MA . https://developer.nvidia. com
/ gpugems / GPUGems / gpugems_pref01.html.
Foley, J., A. van Dam, S. Feiner và J. Hughes [1995]. Đồ họa máy tính: Nguyên
tắc và Thực hành, phiên bản thứ hai trong C, Addison- Wesley, Reading, MA .
Hillis, W. D. và G. L. Steele [1986]. Các thuật toán song song dữ liệu, dữ liệu
Cộng đồng, ACM 29:12 (Tháng 12.), 1170 bóng83.
http://doi.acm.org/10.1145/7902.7903.
Nhóm làm việc của IEEE 754R [2006]. Tiêu chuẩn DRAFT cho số học điểm nổi
P754. www.validlab.com/754R/draft/archive/2006-10-04.pdf.
Ánh sáng công nghiệp và ma thuật [2003]. OpenEXR, www.openexr.com.
Tập đoàn Intel [2007]. Tham chiếu tối ưu hóa kiến trúc Intel 64 và IA-32 Hướng
dẫn sử dụngTháng 11. Số thứ tự: 248966-016. Cũng thế:. http://www.intel.com/
nội dung / dam / www / public / us / en / documents / manuals 64-ia-32-arch
architecture-optimization-manual.pdf.
Kessenich, J. [2006]. Ngôn ngữ tạo bóng OpenGL, Phiên bản ngôn ngữ 1.20, tháng 9.
2006. www.opengl.org/documentation/specs/.
Kirk, D. và D. Voorhies [1990]. Kiến trúc kết xuất của DN10000VS Proc.
SIGGRAPH 1990 (Tháng 8), 299 Từ307.
Lindholm E., M.J Kilgard và H. Moreton [2001]. Một động cơ Vertex lập trình
người dùng.Giáo dục Proc. SIGGRAPH 2001 (Tháng 8), 149 bóng58.
Lindholm, E., J. Nickolls, S. Oberman và J. Montrym [2008]. NVIDIA Tesla:
Kiến trúc đồ họa và tính toán thống nhất , IEEE Micro Tập. 28, không. 2 (Tháng
Ba Tháng Tư), 39 Hàng55.
Microsoft Tổng công ty. Microsoft Đặc điểm kỹ thuật DirectX, https://msdn.microsoft.
com / en-us / thư viện / cửa sổ / ứng dụng / hh452744.aspx.
Tập đoàn Microsoft. [2003]. Microsoft Đường ống,
Microsoft Press, Redmond, WA .
Đồ họa lập trình DirectX 9
FR-14 Đọc thêm

Montrym, J., D. Baum, D. Dignam và C. Migdal [1997]. InfiniteReality: Một hệ


thống đồ họa thời gian thực.Giáo dục Proc. SIGGRAPH 1997 (Tháng 8), 293
bóng301.
Montrym, J. và H. Moreton [2005]. GeForce 6800, trực tiếp IEEE Micro Tập. 25,
không. 2 (Tháng Ba Tháng Tư), 41 trận51.
Moore, G. E. [1965]. Cấm nhồi nhét nhiều thành phần hơn vào các mạch tích
hợp Điện tử, Tập. 38, không. 8 (19 tháng 4).
Nguyễn, H. ed. [2008]. GPU Gems 3, Addison-Wesley, Đọc, MA .
Nickolls, J., I. Buck, M. Garland và K. Skadron [2008]. Lập trình song song có
thể mở rộng với CUDA ', Hàng đợi ACM, Tập. 6, không. 2 (Tháng Ba Tháng
Tư), 40 trận53.
NVIDIA [2007]. Khu CUDA. http://www.nvidia.com/object/cuda_home_new.
html.
NVIDIA [2007]. Hướng dẫn lập trình CUDA 1.1.https://developer.nvidia.com/
hướng dẫn lập trình nvidia-gpu.
NVIDIA [2007]. PTX: Thực hiện chủ đề song song ISA phiên bản
1.1.www.nvidia.com/ đối tượng / i_1195170102263.html.
Nyland, L., M. Harris và J. Prins [2007]. Mô phỏng cơ thể N nhanh với CUDA.
Trong GPU Gems 3, H. Nguyễn (Ed.), Addison-Wesley, Đọc, MA .
Oberman, S. F. và M. Y. Siu [2005]. Một bộ nội suy đa chức năng hiệu suất cao
khu vực hiệu quả cao, trực tiếp Proc. Symp thứ mười bảy. Số học máy tính, 272
bóng79.
Pharr, M. (Ed.), [2005]. GPU Gems 2: Kỹ thuật lập trình cho hiệu suất cao Đồ họa và
tính toán mục đích chung, Addison-Wesley, Đọc, MA .
Satish, N., M. Harris và M. Garland [2008]. Thiết kế các thuật toán sắp xếp hiệu
quả cho các GPU nhiều lõi, Báo cáo kỹ thuật của NV NVIA NVR-2008-001.
Segal, M. và K. Akeley [2006]. Hệ thống đồ họa OpenGL: Một đặc điểm kỹ
thuật , Phiên bản 2.1, tháng 12. 1, 2006. www.opengl.org/documentation/specs/.
Sengupta, S., M. Harris, Y. Zhang và J.D. Owens [2007]. Nguyên thủy quét quét
cho tính toán GPU."Trong Proc. của phần cứng đồ họa 2007 (Tháng 8), 97
bóng106.
Volkov, V. và J. Demmel [2008]. Các yếu tố LU, QR và Cholesky sử dụng khả
năng Vector của GPU, Báo cáo kỹ thuật số. UCB / EECS-2008-49, 1 trận11.
http://www.eecs.ber siêu.edu/Pub/TechRpts/2008/EECS-2008-49.pdf.
Williams, S., L. Oliker, R. Vuduc, J. Shalf, K. Yelick và J. Demmel [2007]. Tối
ưu hóa phép nhân vectơ ma trận thưa thớt trên các nền tảng đa lõi mới nổi, In In
Proc. Siêu máy tính 2007, Tháng 11.
Đọc thêm FR-15

Phụ lục D
Bhandarkar, D. P. [1995]. Kiến trúc và triển khai Alpha, Newton, MA :
Báo chí kỹ thuật số.
Darcy, J. D. và D. Gay [1996]. FLECKmark: Đo hiệu suất điểm nổi bằng cách sử
dụng điểm chuẩn số học tuân thủ, dự án lớp CS CS 252, U.C Berkeley (xem
www.sonic.net/~jddarcy/Research/fleckmrk.pdf)).
Chất bán dẫn kỹ thuật số. [1996]. Cẩm nang kiến trúc Alpha, Phiên bản 3, Báo
chí kỹ thuật số, Maynard, MA. Số thứ tự EC-QD2KB-TE (tháng 10).
Furber, S. B. [1996]. Kiến trúc hệ thống ARM, Addison-Wesley, Harlow, Anh. (Xem
http://www.pearsonhighhered.com/pearsonhighheredus/educator/product/products_ chi
tiết.page?isbn = 9780201675191 & forced_logout = forced_loggedDef # sthash.
QX4WfErc).
Hewlett-Packard [1994]. Hướng dẫn tham khảo kiến trúc PA-RISC 2.0, Tái bản lần 3.
Hitachi [1997]. Hướng dẫn lập trình sê-ri SuperH RISC Engine SH7700 (Xem.
http://am.renesas.com/products/mpumcu/superh/sh7700/Documentation.jsp).
IBM. [1994]. Kiến trúc PowerPC, San Francisco: Morgan Kaufmann.
Kane, G. [1996]. Kiến trúc PA-RISC 2.0, Thượng Yên River, NJ: Prentice Hall PTR .
Kane, G. và J. Heinrich [1992]. Kiến trúc MIPS RISC, Vách đá Englewood , NJ :

Hội trường Prentice.


Kissell, K. D. [1997]. MIPS16: Mật độ cao cho thị trường nhúng.

Magenheimer, D. J., L. Peters, K. W. Pettis và D. Zuras [1988]. Phép nhân và


phân chia số nguyên trên kiến trúc chính xác HP HP , IEEE Trans. trên Máy tính
37 (8), 980 Từ990.
MIPS [1997]. Mô tả sản phẩm mở rộng cụ thể của ứng dụng MIPS16.
Mitsubishi [1996]. Mitsubishi 32-bit Máy vi tính đơn Chip M32R Họ Hướng dẫn
sử dụng phần mềm (Tháng Chín).
Nhiều người, S. S. [1988]. Tối ưu hóa trình biên dịch cho SPARC ', Công nghệ
mặt trời 1: 3 (Mùa hè), 64 trận77.
Con dấu, D . Hướng dẫn tham khảo kiến trúc cánh tay, Tái bản lần 2, Morgan Kaufmann, 2000.
Đồ họa Silicon [1996]. Bộ hướng dẫn MIPS V.
Các trang web, R. L. và R. Witek (Eds.) [1995]. Hướng dẫn tham khảo kiến trúc
Alpha, Tái bản lần 2., Newton, MA: Máy in kỹ thuật số.
FR-16 Đọc thêm

Sloss, A. N., D. Symes và C. Wright , Hướng dẫn dành cho nhà phát triển hệ thống ARM,
San Francisco :
Elsevier Morgan Kaufmann, 2004.
Sun microsystems [1989]. Cẩm nang kiến trúc SPARC, Phiên bản 8, Phần số.
800-1399-09, ngày 25 tháng 8.
Người yêu, D . Xem MIPS Run, Tái bản lần 2, Morgan Kaufmann, 2006.

Taylor, G., P. Hilfinger, J. Larus, D. Patterson và B. Zorn [1986]. Đánh giá của
kiến trúc SPUR LISP, trực tiếp Proc. Hội thảo chuyên đề lần thứ 13 về Kiến trúc
máy tính (Tháng 6), Tokyo.
Ungar, D., R. Blau, P. Foley, D. Samples và D. Patterson [1984]. Kiến trúc của
SOAR: Smalltalk trên RISC, trực tiếp Proc. Hội thảo chuyên đề lần thứ 11 về
Kiến trúc máy tính (Tháng 6), Ann Arbor, MI, 188 Từ97.
Weaver, D. L. và T. Germond [1994]. Cẩm nang kiến trúc SPARC, Phiên bản 9,
Hội trường Prentice, Vách đá Englewood, NJ .
Weiss, S. và J. E. Smith [1994]. Sức mạnh và PowerPC, San Francisco: Morgan
Kaufmann.

You might also like