KIEÁN TRUÙC MAÙY TÍNH TIEÂN TIEÁN

Size: px
Start display at page:

Download "KIEÁN TRUÙC MAÙY TÍNH TIEÂN TIEÁN"

Transcription

1

2 KIEÁN TRUÙC MAÙY TÍNH TIEÂN TIEÁN

3 HOÏC VIEÄN COÂNG NGHEÄ BÖU CHÍNH VIEÃN THOÂNG TS. TRAÀN COÂNG HUØNG KIEÁN TRUÙC MAÙY TÍNH TIEÂN TIEÁN NHAØ XUAÁT BAÛN THOÂNG TIN VAØ TRUYEÀN THOÂNG

4 LÔØI NOÙI ÑAÀU Máy tính, còn gọi là máy vi tính hay điện toán, là những thiết bị hay hệ thống dùng để tính toán hay kiểm soát các hoạt động mà có thể biểu diễn dưới dạng số hay quy luật logic. Máy tính điện tử ra đời vào năm 1946 tại Hoa Kỳ từ đó đã phát triển rất mạnh và đến nay đã trải qua các thế hệ máy. - Thế hệ 1 (thập niên 50): Dùng bóng điện tử chân không, tiêu thụ năng lượng rất nhiều. Kích thước máy rất lớn (khoảng 250 m 2 ) nhưng tốc độ xử lý lại rất chậm chỉ đạt khoảng vài ngàn phép tính trên giây và giá thành lại rất cao. - Thế hệ 2 (thập niên 60): Các bóng điện tử đã được thay bằng các bóng làm bằng chất bán dẫn nên năng lượng tiêu thụ giảm, kích thước nhỏ hơn nhưng vẫn rất lớn (50 m 2 ), tốc độ xử lý đạt khoảng vài chục ngàn phép tính trên giây. - Thế hệ 3 (thập niên 70): Thời gian này đánh dấu sự ra đời và phát triển của công nghệ vi mạch tích hợp IC. Máy tính có kích thước nhỏ gọn hơn và tiêu thụ năng lượng ít hơn, tốc độ xử lý đạt khoảng vài trăm ngàn phép tính trên giây. - Thế hệ 4 (thập niên 80): Dùng công nghệ vi mạch tích hợp IC nhưng nhỏ gọn hơn mà tốc độ tính toán lại cao hơn nhờ các công nghệ ép vi mạch tiên tiến. Có nhiều loại máy để phục vụ cho nhiều mục đích sử dụng, trong đó chia ra làm 3 loại chính: main frame computer, mini computer, micro computer. - Thế hệ 5: là thế hệ máy tính hiện nay, được tập trung phát triển về nhiều mặt nhằm nâng cao tốc độ xử lý và tạo thêm nhiều tính năng cho máy. Các máy tính hiện nay có thể xử lý hàng chục tỷ phép tính trên giây. Trong quyển sách này, chúng ta sẽ nghiên cứu và khảo sát về tổ chức, hoạt động của máy tính gọi là tiên tiến vào thời điểm hiện nay. Nội dung cuốn sách gồm 6 chương: Chương 1: Giới thiệu chung. Chương 2: Khối xử lý song song ở mức lệnh máy. Chương 3: Các hạn chế khi thực hiện lệnh song song. Chương 4: Các kiến trúc đa xử lý. Chương 5: Các vi xử lý thực tế. Chương 6: Kiến trúc bộ nhớ tiên tiến.

5 Hy vọng quyển sách sẽ thực sự hữu ích đối với các sinh viên và giảng viên nhóm ngành kỹ thuật điện tử - máy tính, có thể sử dụng quyển sách này làm giáo trình giảng dạy và học tập cho môn học cấu trúc máy tính. Ngoài ra, quyển sách cũng là tài liệu tham khảo để phục vụ cho các kỹ sư và nghiên cứu sinh trong công tác chuyên môn. Trong quá trình biên soạn, mặc dù đã có nhiều cố gắng nhưng khó tránh khỏi những thiếu sót, rất mong nhận được sự cảm thông và ý kiến đóng góp của quý vị độc giả để lần tái bản sẽ bổ sung hoàn chỉnh hơn. Mọi ý kiến đóng góp xin gửi qua conghung@ptithcm.edu.vn. Tác giả

6 MUÏC LUÏC Lời nói đầu...5 Thuật ngữ viết tắt...11 Chöông 1: GIÔÙI THIEÄU CHUNG Giới thiệu Nhu cầu tính toán hiện tại và phân loại máy tính Máy tính để bàn Máy chủ Máy tính nhúng (Embedded computer) Định nghĩa kiến trúc máy tính Kiến trúc tập lệnh Các xu hướng công nghệ Các xu hướng về hiệu suất: Băng thông trên độ trễ Tỉ lệ của hiệu suất bán dẫn và dây Xu hướng năng lượng trên các mạch tích hợp Sơ lược về một số kiến trúc máy tính hiện đại Ưu điểm của tính song song Nguyên tắc của vùng Tập trung vào các trường hợp chung Luật Amdahl Phương trình hiệu suất của bộ vi xử lý Nghiên cứu trường hợp 1: Chi phí chế tạo Chip Nghiên cứu trường hợp 2: Điện năng tiêu thụ trong hệ thống máy tính Nghiên cứu trường hợp 3: Chi phí cho các máy chủ web Nghiên cứu trường hợp 4: Hiệu suất...46 Chöông 2: KHOÁI XÖÛ LYÙ SONG SONG ÔÛ MÖÙC LEÄNH MAÙY Kỹ thuật đường ống và xử lý song song ở mức lệnh máy Kỹ thuật đường ống là gì? Và cách triển khai kỹ thuật đường ống Các khó khăn khi sử dụng đường ống và cách khắc phục...52

7 8 Kiến trúc máy tính tiên tiến 2.2. Kết hợp xử lý song song ở mức lệnh máy và giải pháp phần mềm về ILP Chương trình dịch và kỹ thuật đường ống Hỗ trợ phần cứng đối với chương trình dịch Lưu trữ dựa trên phần cứng Khai thác ILP sử dụng đa phát và lập lịch tĩnh Triển khai ILP dùng lập lịch động, đa phát và sự lưu trữ Các kỹ thuật nâng cao cho việc phân phối lệnh và sự lưu trữ Tăng băng thông lấy lệnh Bộ đệm nhánh mục tiêu Trả về các địa chỉ dự báo Chöông 3: CAÙC HAÏN CHEÁ KHI THÖÏC HIEÄN LEÄNH SONG SONG Giới thiệu Nghiên cứu hạn chế của ILP Mô hình phần cứng Những hạn chế trên kích thước cửa sổ và đếm phát cực đại Những ảnh hưởng của nhánh thực và các bước dự báo Những ảnh hưởng của các thanh ghi hữu hạn Những ảnh hưởng của sự phân tích alias không hoàn hảo Hạn chế ILP đối với bộ vi xử lý Những hạn chế phát sinh Xử lý song song ở mức luồng (thread) Hiệu suất và hiệu quả trong bộ vi xử lý tiên tiến Khả năng thực hiện lệnh song song và sự phụ thuộc Kết luận Chöông 4: CAÙC KIEÁN TRUÙC ÑA XÖÛ LYÙ Giới thiệu về đa xử lý đa nhân Phân loại các kiến trúc song song Các kiến trúc chia sẻ bộ nhớ Các kiến trúc chia sẻ bộ nhớ đối xứng Các kiến trúc chia sẻ bộ nhớ phân tán Bộ nhớ chia sẻ phân tán và liên kết dựa trên thư mục Các giao thức liên kết cache dựa vào thư mục Ví dụ về Directory Protocol...187

8 Mục lục Khái niệm cơ bản về đồng bộ hóa Các Primitive phần cứng cơ bản Thực hiện khóa (lock) sử dụng gắn kết (coherence) Giới thiệu tính thống nhất mô hình bộ nhớ Quan niệm của Lập trình viên (Programmer) Các khái niệm cơ bản về mô hình nghỉ ngơi nhất quán Nhận xét về các mô hình nhất quán Các vấn đề xuyên suốt (Crosscutting issue) Tối ưu hóa, trình biên dịch và mô hình nhất quán Sử dụng dự đoán ẩn trễ trong các mô hình nhất quán nghiêm ngặt Kết luận và sự thực thi của nó Kiến trúc đa xử lý cụ thể Sun T Hiệu suất T Hiệu suất toàn phần Hiệu suất của những bộ xử lý đa lõi trên chuẩn SPEC Những vấn đề cần lưu ý Lưu ý Lưu ý Lưu ý Lưu ý Lưu ý Kết luận Chöông 5: CAÙC VI XÖÛ LYÙ THÖÏC TEÁ Very-Long Instruction Word (VLIW) Giới thiệu Khả năng thực hiện lệnh song song (ILP) VLIW Tổ chức của VLIW processor Ưu, khuyết điểm của bộ xử lý VLIW Tóm tắt Kiến trúc máy chủ Sun Sparc MX000 - M Giới thiệu về dòng máy chủ doanh nghiệp MX Kiến trúc chung của máy chủ M

9 10 Kiến trúc máy tính tiên tiến Bộ nhớ Kiến trúc Bus của hệ thống Bộ xử lý SPARC64 VII Lõi (Core) Hệ thống Cache Kiến trúc I/O Công nghệ Centrino trong các CPU Lịch sử phát triển Centrino Centrino thế hệ đầu tiên Centrino thế hệ thứ hai: Sonoma Centrino thế hệ thứ ba: Napa Centrino hế hệ thứ tư: Santa Rosa Những công nghệ ứng dụng trên nền tảng Intel Centrino Bộ vi xử lý Intel Core 2 Duo Họ chipset Mobile Intel 965 Express Hệ thống kết nối Intel WiFi Link 5000 Series Hệ thống kết nối mạng Intel Gigabit Chuyển đổi giữa đồ họa tích hợp và đồ họa rời Công nghệ bộ nhớ Intel Turbo Memory Kết luận Chöông 6: KIEÁN TRUÙC BOÄ NHÔÙ TIEÂN TIEÁN Một số kiểu tổ chức bộ nhớ tốc độ cao Các loại bộ nhớ Các cấp bộ nhớ Các công nghệ bộ nhớ tiên tiến Bộ nhớ Cache tiên tiến Vận hành của Cache Hiệu quả của Cache Cache duy nhất hay Cache riêng lẻ Các mức Cache Bộ nhớ trong Hỗ trợ bộ nhớ ảo Bảo vệ các tiến trình bằng cách dùng bộ nhớ ảo...259

10 THUAÄT NGÖÕ VIEÁT TAÉT BTB CDB COD CPI DLP DSM DSS FP FPSQR HPF IC ID ILP IPC ISA LLP MIMD MIPS MISD Branch Target Buffer Common Data Bus Computer Organization and Design Clock cycles Per Instruction Data-Level Parallelism Distributed Shared Memory Decision Support System Floating Point FP Square Root High Performance Fortran Instruction Count Instruction Decode Instruction-Level Parallelism Instructions Per Clock Instruction Set Architecture Loop-Level Parallelism Multiple Instruction stream, Multiple Data stream Million Instructions Per Second Multiple Instruction stream, Single Data stream

11 12 Kiến trúc máy tính tiên tiến NUMA OLTP RAW ROB SIMD SISD SMP SPECJBB ST TLP UMA VLIW WAR WAW Non-Uniform Memory Access OnLine Transaction Processing Read After Write Reorder Buffer Single Instruction stream, Multiple Data stream Single Instruction stream, Single Data stream Symmetric Multi-Processing the SPEC Java Business Benchmark Single-Thread Thread-Level Parallelism Uniform Memory Access Very-Long Instruction Word Write After Read Write After Write

12 Chương 1 GIÔÙI THIEÄU CHUNG 1.1. Giới thiệu Công nghệ máy tính đã có tiến bộ đáng kinh ngạc trong khoảng 60 năm trở lại đây kể từ khi chiếc máy tính điện tử vì mục đích chung đầu tiên ra đời. Ngày nay, ít hơn 500 đô la, bạn cũng sẽ sở hữu một chiếc máy tính cá nhân với nhiều chức năng hơn, bộ nhớ nhiều hơn và dung lượng đĩa lớn hơn một máy tính được mua với giá đô la Mỹ trong năm Điều này đã cải thiện nhanh chóng từ những tiến bộ trong công nghệ sử dụng để xây dựng máy tính và trong sự đổi mới thiết kế máy tính. Mặc dù những cải tiến công nghệ đã khá ổn định, nhưng cấu trúc arising từ những kiến trúc tốt hơn lại ít tương thích hơn. Suốt 25 năm đầu phát triển của máy tính điện tử, cả 2 lực lượng này đã có đóng góp quan trọng, cải thiện hiệu suất khoảng 25% một năm. Và cuối năm 1970 chứng kiến sự xuất hiện của bộ vi xử lý này. Khả năng của bộ vi xử lý đã góp phần cải tiến trong công nghệ mạch tích hợp làm cho tính tương thích cao hơn - tăng khoảng 35% một năm trong việc cải thiện hiệu suất. Với tốc độ tăng trưởng này, kết hợp với những lợi ích trong chi phí sản xuất hàng loạt vi xử lý, dẫn đến có ngày càng nhiều các công ty kinh doanh máy tính dựa trên những bộ vi xử lý này. Ngoài ra, hai thay đổi đáng kể trong thị trường máy tính đã làm cho nó dễ dàng hơn bao giờ hết (trước đó đã thương mại hóa thành công một công nghệ mới). Đầu tiên, việc loại bỏ thực sự hợp ngữ đã giảm sự cần thiết trong tính tương thích của mã đối tượng. Thứ hai, việc tạo ra các chuẩn hóa, độc lập cung cấp các hệ điều hành, chẳng hạn như UNIX và nhân bản của nó, Linux, đã hạ thấp cả chi phí và lẫn nguy cơ lệch ra khỏi một kiến trúc mới. Những thay đổi này đã làm cho nó có thể phát triển thành công một tập hợp các kiến trúc mới với các tập lệnh đơn giản, được gọi là những kiến trúc RISC (Reduced Instruction Set Computer) vào đầu những năm Các máy dựa trên RISC tập trung sự chú ý của những nhà thiết kế trên hai kỹ thuật quan trọng, thứ nhất là khai thác thuật toán xử lý song song (ban đầu thông qua đường ống (pipelining) lệnh và sau đó thông qua nhiều tác vụ) và thứ hai là sử dụng cache (ban đầu trong các hình thức đơn giản và sau đó sử dụng theo nhiều cách thức tinh vi hơn và được tối ưu hóa). Các máy tính nền tảng RISC nâng thanh chắn thực hiện, buộc

13 14 Kiến trúc máy tính tiên tiến những kiến trúc trước phải theo kịp hoặc biến mất. Thiết bị số Vax đã không thể đứng vững, tất yếu nó được thay thế bởi một kiến trúc RISC. Intel đã nổi lên như một thách thức, trước tiên là việc chuyển đổi các lệnh x86 (hay IA-32) sang các lệnh như của RISC, cho phép nó chấp nhận nhiều đổi mới trong việc đi đầu thiết kế RISC. Cùng với sự tăng vọt của những bộ đếm trazito vào cuối thập niên 90, chi phí phần cứng cho việc chuyển đổi sang nền tảng x86 phức tạp hơn đã trở nên không đáng ngại. Hình 1.1 cho thấy sự kết hợp giữa kiến trúc và cải tiến kết cấu đã dẫn tới 16 năm tăng trưởng bền vững trong hoạt động, với tỉ lệ hằng năm trên 50%, một con số chưa từng có trong nền công nghiệp máy tính. Hiệu quả của tốc độ tăng trưởng ấn tượng này trong thế kỷ 20 đã được nhân lên gấp bội. Đầu tiên, nó đã nâng cao đáng kể khả năng sẵn có của những người sử dụng máy vi tính. Đối với nhiều ứng dụng, các bộ vi xử lý hiệu suất cao nhất hiện tại tốt hơn các siêu máy tính của không ít hơn 10 năm trước. Hình 1.1: Sự cải thiện trong hiệu suất vi xử lý từ giữa thập niên 1980 đến nay. Biểu đồ này thể hiện tương đối so với VAX 11/780 được đo bởi tiêu chuẩn SPECint. Chưa đến giữa những năm 1980, sự tăng trưởng về hiệu năng bộ xử lý của phần lớn công nghệ đã được thể hiện và trung bình khoảng 25% mỗi năm. Tốc độ tăng trưởng lên khoảng 52% tiếp sau đó, là do những ý tưởng về kiến trúc và tổ chức được nâng cao hơn. Đến năm 2002, tăng trưởng này đã có một sự khác biệt trong hiệu suất vì có một đơn vị thực thi thứ bảy. Hiệu suất tính toán theo hướng dấu chấm động tăng lên thậm chí là nhanh hơn. Từ năm 2002, giới hạn về công suất nguồn, các thuật toán xử lý song song sẵn có và độ trễ

14 Chương 1: Giới thiệu chung 15 của bộ nhớ đã làm các đơn xử lý chạy chậm lại trong gần đây, xuống còn 20% một năm. Một khi SPEC đã thay đổi trong nhiều năm, hiệu suất của những chiếc máy mới hơn được đánh giá qua một hệ số tỉ lệ xích mà có sự liên hệ hiệu suất cho hai phiên bản SPEC khác (ví dụ, SPEC92, SPEC95 và SPEC2000). Thứ hai, cải thiện đến tỉ lệ như mơ này đã dẫn tới sự thống trị của máy tính dựa trên bộ vi xử lý với phạm vi là toàn bộ ngành thiết kế máy tính. Những chiếc PC và những máy trạm chiếm lĩnh toàn bộ thị trường trong ngành công nghiệp máy tính. Những máy tính mini, theo truyền thống làm từ những ngăn (shelf) luận lý với những dãy cổng logic đã được thay thế bởi những máy chủ sử dụng vi xử lý. Những máy tính lớn gần như hoàn toàn được thay thế bằng đa xử lý bao gồm nhiều vi xử lý. Ngay cả những siêu máy tính cũng đang được xây dựng bằng tập hợp các bộ vi xử lý. Những đổi mới này đã tạo ra một sự phục hưng trong thiết kế máy tính, trong đó đề cao sự đổi mới cả hai kiến trúc và sử dụng hiệu quả những cải tiến công nghệ. Điều này tạo ra một sự tăng trưởng kép cho đến năm 2002, hiệu suất cao của các vi xử lý nhanh hơn cỡ 7 lần những gì đã thu được bằng việc chỉ dựa vào công nghệ, đã bao gồm cải thiện mạch thiết kế. Tuy nhiên, sự phục hưng này chỉ tồn tại trong vòng 16 năm mà thôi. Từ năm 2002, việc cải tiến hiệu suất bộ vi xử lý đã giảm xuống còn 20% một năm, do 3 trở ngại lớn sau: sự tiêu hao của công suất cực đại qua làm mát, còn ít các thuật toán xử lý song song để tận dụng và gần như không cải thiện độ trễ bộ nhớ. Chính vì vậy, trong năm 2004 Intel đã hủy bỏ dự án nâng cao hiệu suất các đơn vị xử lý của mình, gia nhập IBM và SUN trong một tuyên bố rằng con đường để nâng cao hiệu suất là phải có đa xử lý trên mỗi chip hơn là đơn xử lý. Điều này đã báo hiệu một sư chuyển đổi có tính chất lịch sử từ thuật toán xử lý song song, sang trạng thái Khả năng thực hiện luồng song song (TLP) và trạng thái Khả năng thực hiện dữ liệu song song (DLP), được đặc trưng trong phần này của quyển sách. Trong khi các trình biên dịch và các phần cứng khai thác ILP mà hoàn toàn không cần lập trình tác động vào, thì DLP và TLP là song song tách biệt nhau, đòi hỏi lập trình viên phải viết mã xử lý song song để cải thiện hiệu suất. Phần này nói về những ý tưởng về kiến trúc và những cải tiến trình biên dịch đi kèm để đạt được những tốc độ như thế trong thế kỷ qua, nguyên nhân của sự thay đổi đáng kể đó và những thách thức cũng như phương pháp tiếp cận độc đáo ban đầu nhằm đạt đến các ý tưởng về kiến trúc và trình biên dịch trong thế kỷ 21. Cốt lõi của vấn đề đó là cần định lượng vấn đề cần đạt đến khi thiết kế, sau đó phân tích có sử dụng các quan sát thực nghiệm, chạy thử nghiệm, đặc biệt mô phỏng các công cụ liên quan của nó. Đây là phong cách và phương pháp tiếp cận để thiết kế mạch trong quyển sách này. Chúng ta tin rằng phương pháp tiếp cận này sẽ cho ra những máy tính song song rõ ràng trong tương lai như những máy tính hoàn toàn song song trong quá khứ.

15 16 Kiến trúc máy tính tiên tiến 1.2. Nhu cầu tính toán hiện tại và phân loại máy tính Trong thập niên 60, hình thức tính toán được thực hiện trên những máy tính cỡ lớn, với giá hàng triệu đô la được đặt trong những phòng máy với nhiều khai thác viên giám sát hỗ trợ. Ứng dụng tiêu biểu là xử lý các dữ liệu kinh doanh và tính toán trên quy mô lớn. Những năm 1970 chứng kiến sự ra đời của máy tính mini, một máy tính có kích thước nhỏ hơn, bước đầu được ứng dụng trong các phòng thí nghiệm khoa học, nhưng nhanh chóng được chia sẻ phổ biến, nhiều người sử dụng chia sẻ trên một máy tính tương tác thông qua các thiết bị đầu cuối độc lập. Thập kỷ này cũng chứng kiến sự xuất hiện của các siêu máy tính, với hiệu suất xử lý cao phục vụ cho tính toán khoa học. Mặc dù ít về số lượng, nhưng đây là sự kiện có tính chất lịch sử quan trọng, bởi họ đã đi tiên phong trong đổi mới mà sau này hình thành các lớp máy tính ít tốn kém hơn. Thập niên 80 chứng kiến sự trỗi dậy của máy tính để bàn dựa trên các bộ vi xử lý, dưới cả 2 hình thức máy tính cá nhân và máy trạm. Các máy tính để bàn cá nhân thay thế việc sử dụng đồng thời, làm cho các máy chủ-trạm gia tăng, cung cấp dịch vụ trên quy mô lớn hơn: đáng tin cậy, lâu dài, lưu trữ và truy cập các tập tin, bộ nhớ lớn hơn và thể hiện sức mạnh của khả năng tính toán. Những năm 1990 Internet nổi lên và World Wide Web ra đời, chứng kiến những thành công đầu tiên của các thiết bị cầm tay (các thiết bị cá nhân hỗ trợ kỹ thuật số hay PDAs). Đặc điểm Desktop Server Hệ thống nhúng Giá của hệ thống 500 USD USD USD USD 10 USD USD (bao gồm cả bộ định tuyến mạng cao cấp) Giá của module vi xử lý 50 USD 500 USD (trên mỗi bộ vi xử lý) 200 USD USD 0,01 USD 100 USD (trên mỗi bộ vi xử lý) (trên mỗi bộ vi xử lý) Thiết kế hệ thống các vấn đề quan trọng Giá-hiệu suất, hiệu năng đồ họa Thông lượng, tính sẵn có, khả năng mở rộng Giá, mức tiêu thụ điện năng, hiệu năng đối với từng ứng dụng cụ thể Bảng 1.1: Tóm tắt 3 loại máy tính chính thống và những đặc điểm của nó. Lưu ý phạm vi giá hệ thống các máy chủ và hệ thống nhúng. Đối với các máy chủ, phạm vi này xuất phát từ sự cần thiết phải có hệ thống đa xử lý quy mô lớn cho các tiến trình giao dịch cấp cao và những ứng dụng máy chủ Web. Tổng số vi xử lý nhúng đã bán trong năm 2005 được ước tính là trên 3 tỉ, chỉ bao gồm các vi xử lý 8-bit và 16-bit. Khoảng chừng 200 triệu máy để bàn và 10 triệu máy chủ đã được bán trong năm Và sự xuất hiện của các đồ dùng điện tử kỹ thuật số hiệu năng cao, từ trò chơi video đến các bộ giải mã (set-top box). Điện thoại di động cũng trở nên phổ biến từ năm 2000, với những cải tiến từ chức năng đến giá cả, vượt xa những chiếc máy

16 Chương 1: Giới thiệu chung 17 tính. Những ứng dụng gần đây sử dụng hệ thống nhúng, máy tính được tích hợp trong các thiết bị khác, nhưng sự xuất hiện của chúng không rõ ràng. Những xu hướng này đã tạo ra một tiền đề cho một sự thay đổi mạnh mẽ về tầm nhìn của máy tính, các ứng dụng trên máy tính và thị trường máy tính trong một thời kỳ mới. Không phải chỉ đơn thuần sản xuất ra một máy tính cá nhân mạnh hơn 20 năm trước đây, mà chúng ta cần phải thấy rằng những thay đổi đáng kể đó là do bởi cách thức mà máy tính xuất hiện và cách thức mà người ta sử dụng nó. Những thay đổi trong việc sử dụng máy tính đã dẫn đến hình thành 3 thị trường máy tính khác nhau, mỗi đặc trưng tương ứng với những ứng dụng, yêu cầu và những công nghệ khác nhau. Bảng 1.1 tóm tắt các loại máy tính chủ đạo trong thị trường máy tính và những đặc điểm quan trọng của mỗi loại Máy tính để bàn Những chiếc máy tính để bàn được nâng cấp từ cấp thấp đến cấp cao chỉ với 500 USD và nhiều máy trạm được cấu hình phức tạp chỉ với USD. Trong thời gian này thị trường máy tính đã có sự cân bằng theo hướng giá cả phù hợp với hiệu năng. Điều này kết hợp giữa hiệu suất (được tính toán theo hiệu suất của máy và hiệu năng đồ họa) và giá của hệ thống tương ứng đó nhằm đáp ứng nhu cầu khách hàng và phát triển thiết kế. Và kết quả là, bộ vi xử lý mới nhất, hiệu suất cao nhất và cả giá cạnh tranh nhất đã xuất hiện trong hệ thống của máy để bàn. Máy tính để bàn cũng có những xu hướng phát triển riêng và có các ứng dụng đặc trưng theo một chuẩn nhất định, mặc dù có ngày càng nhiều các trung tâm mạng, thường xuyên chạy các ứng dụng mới để đánh giá hiệu năng Máy chủ Trong quá trình chuyển dịch sang máy tính để bàn, vai trò của các máy chủ phải có quy mô và độ tin cậy hơn để đáp ứng một khối dữ liệu lớn và tăng tốc dịch vụ. WWW có xu hướng phát triển sâu rộng do nhu cầu phát triển và sự bùng nổ các dịch vụ trên Web. Và các máy chủ như vậy đã trở thành xương sống của doanh nghiệp phục vụ tính toán trên quy mô lớn, thay thế cho các máy tính lớn truyền thống. Đối với những máy chủ, có những đặc điểm khác nhau quan trọng. Thứ nhất, độ tin cậy là hàng đầu. Khảo sát các server của Google, nhận đơn đặt hàng cho Cisco, hoặc hệ thống đấu giá Ebay. Lỗi hệ thống máy chủ là điều cực kỳ tệ hại hơn rất nhiều so với lỗi một máy cá nhân thông thường, bởi server hoạt động nguyên ngày, nguyên tuần, không ngơi nghỉ. Bảng 1.2 đánh giá doanh thu bị mất vì thời gian chết trong năm Amazon đã mất ước chừng 2,98 tỉ đô la trong quý đầu năm Nếu như có khoảng giờ trong quý đó thì ước chừng doanh thu mỗi giờ là đô la. Nếu là giờ cao điểm trong dịp Giáng sinh thì con số này cao hơn nhiều.

17 18 Kiến trúc máy tính tiên tiến Như vậy, chi phí ước tính bị mất sẽ cao, như bảng 1.2 và các con số của Amazon là hoàn toàn bị mất doanh thu, không kể đến năng suất của người làm bị mất và cả những phiền toái của khách hàng. Một tính năng quan trọng thứ hai đó là hệ thống máy chủ phải có khả năng mở rộng. Phát triển của các máy chủ thường để đáp ứng những nhu cầu ngày càng tăng của các dịch vụ mà nó hỗ trợ hoặc yêu cầu tăng lên về chức năng. Bởi vậy, khả năng tăng lên về công suất, bộ nhớ, khả năng lưu trữ và các băng thông I/O của server là rất quan trọng. Cuối cùng, các máy chủ phải được thiết kế sao cho đạt hiệu quả nhất về thông lượng. Tức là, xét về hiệu quả tổng thể của mỗi máy chủ, chẳng hạn như số giao dịch thực hiện trong một phút hay số trang phục vụ được cùng một lúc. Tổn thất hàng năm trong thời gian chết của hệ thống Ứng dụng Chi phí trên mỗi giờ 1% 0,5% 0,1% ($ = đô la) (87,6 giờ/năm) (43,8 giờ/năm) (8,8 giờ/năm) Hoạt động môi giới $6.450 $565 $283 $56,5 Giao dịch bằng thẻ tín dụng $2.600 $228 $114 $22,8 Dịch vụ vận chuyển $150 $13 $6,6 $1,3 Kênh mua sắm tại nhà $113 $9,9 $4,9 $1,0 Trung tâm mua bán $90 $7,9 $3,9 $0,8 Đặt vé máy bay $89 $7,9 $3,9 $0,8 Dịch vụ di động $41 $3,6 $1,8 $0,4 Phí tổn mạng trực tuyến $25 $2,2 $1,1 $0,2 Phí tổn dịch vụ ATM $14 $1,2 $0,6 $0,1 Bảng 1.2: Chi phí của một hệ thống bị lỗi được đưa ra bằng cách phân tích thời gian chết (về doanh số bị mất tính ngay từ thời điểm đó), giả sử có 3 mức khác nhau và thời gian chết được phân phối đều. Những dữ liệu này từ Kembel [2000] và được thu thập, phân tích bởi Phòng kế hoạch & nghiên cứu sự kiện. Đáp ứng yêu cầu vẫn là điều quan trọng, nhưng xét tổng thể hiệu quả và chi phí sinh lời, được xác định bằng việc xem xét có bao nhiêu yêu cầu được xử lý trong một đơn vị thời gian, là những số liệu quan trọng hơn cho hầu hết các máy chủ. Một vấn đề liên quan là những siêu máy tính. Chúng là những chiếc máy tính đắt nhất, trị giá hàng chục triệu đô la và được nhấn mạnh ở hiệu suất.

18 Chương 1: Giới thiệu chung Máy tính nhúng (Embedded computer) Máy tính nhúng là phần phát triển nhanh nhất của thị trường máy tính. Các thiết bị này là bao gồm các máy móc hằng ngày, từ các lò vi sóng, máy giặt, máy in, những bộ chuyển mạch mạng và tất cả các xe có gắn các vi xử lý nhúng đơn giản, đến các thiết bị cầm tay kỹ thuật số, như điện thoại di động, thẻ thông minh, rồi các trò chơi điện tử và cả những bộ giả mã số. Máy tính nhúng phát triển chóng mặt cả về sức mạnh xử lý lẫn chi phí. Chúng bao gồm những vi xử lý 8-bit và 16-bit mà chi phí chỉ hơn nhau 1 xu, những vi xử lý 32-bit thì có thể thực hiện 100 triệu lệnh trong 1 giây và giá chỉ dưới 5 đô la và những vi xử lý cấp cao cho các trò chơi điện tử mới nhất hay các bộ chuyển mạch mạng cũng chỉ có giá 100 đô la mà thôi, chúng thực thi 1 tỉ lệnh trong 1 giây. Mặc dù khả năng của máy tính trong thị trường máy tính nhúng là rất lớn, nhưng giá cả là một yếu tố then chốt trong việc thiết kế máy tính cho không gian này. Hiệu suất có còn tồn tại?, vẫn còn, nhưng mục tiêu chính là đáp ứng liên tục nhu cầu thực hiện ở một mức giá tối thiểu hơn là phải đạt hiệu suất cao hơn ở một mức giá ngất ngưởng. Thông thường, yêu cầu thực hiện trong một ứng dụng nhúng là thời gian thực thi. Một yêu cầu có hiệu suất thời gian thực là khi một phân đoạn ứng dụng có thời gian tối đa để thực hiện tuyệt đối. Ví dụ, trong một bộ giải mã kỹ thuật số, thời gian để xử lý mỗi khung hình là có hạn, bộ xử lý phải chấp nhận và xử lý kết cấu tiếp theo trong thời gian ngắn lại. Trong một số ứng dụng, có nhiều sắc thái yêu cầu cùng tồn tại, thời gian trung bình cho một công việc cụ thể bị hạn chế cũng như số lượng các trường hợp khi một vài thời gian tối đa bị vượt quá. Như vậy, phương pháp tiếp cận, đôi khi được gọi là làm mềm thời gian thực (soft real-time), phát sinh khi người ta đôi khi có thể bỏ qua các hạn chế về thời gian trên một sự kiện, miễn sao không có quá nhiều người bỏ qua. Hiệu suất thời gian thực có xu hướng đánh giá cao các ứng dụng phụ thuộc. Hai đặc điểm quan trọng khác tồn tại trong nhiều ứng dụng nhúng: sự cần thiết giảm thiểu bộ nhớ và giảm thiểu điện năng. Trong nhiều ứng dụng nhúng, bộ nhớ là một phần đáng kể ảnh hưởng đến chi phí, điều quan trọng là cần tối ưu hóa kích thước bộ nhớ trong nhiều trường hợp cụ thể khác nhau. Đôi khi ứng dụng được dự kiến sẽ phù hợp hoàn toàn trong bộ nhớ trên chip xử lý, hay ứng dụng cần phải phù hợp với chip đóng gói có bộ nhớ nhỏ. Trong bất kỳ trường hợp nào, điều quan trọng của kích thước bộ nhớ là chuyển tương thích với kích thước mã, vì kích thước dữ liệu được quyết định bởi các ứng dụng. Bộ nhớ lớn hơn đồng nghĩa với sức mạnh được cải thiện và khả năng tối ưu hóa thường được coi trọng. Mặc dù được nhấn mạnh nếu năng lượng thấp thì xài pin, nhưng việc sử dụng nhựa tổng hợp rẻ hơn dùng gốm, việc không có quạt giải nhiệt cũng làm tiêu hao phần nào hiệu suất.

19 20 Kiến trúc máy tính tiên tiến Quyển sách này áp dụng cho các thiết kế hiệu suất của bộ xử lý nhúng, bất kể là các vi xử lý được đóng gói hay là các lõi của vi xử lý, mà sẽ được lắp ráp với các phần cứng chuyên dụng khác Định nghĩa kiến trúc máy tính Nhiệm vụ thiết kế máy tính phải đối mặt với một phức tạp là: Xác định những thuộc tính quan trọng cho một máy tính mới, sau đó thiết kế một máy tính để tối đa hóa hiệu suất trong phạm vi chi phí, năng lượng và ràng buộc sẵn có. Nhiệm vụ này có nhiều khía cạnh, bao gồm thiết kế tập lệnh, tổ chức hàm, thiết kế logic và thực hiện. Việc thực hiện có thể bao gồm tích hợp nhiều công việc như: thiết kế mạch, đóng gói, hiệu năng và làm mát. Tối ưu hóa việc thiết kế đòi hỏi phải có hiểu biết với một phạm vi rất rộng các công nghệ, từ các trình biên dịch và hệ điều hành đến thiết kế logic và đóng gói. Trong quá khứ, thuật ngữ kiến trúc máy tính chỉ thường để gọi việc thiết kế lập ra tập lệnh. Ở một khía cạnh khác, thiết kế máy tính được gọi là thực thi, thường được nói bóng gió là thực hiện những công việc kém thú vị hoặc ít thách thức. Chúng ta tin rằng quan điểm này là không chính xác. Các kiến trúc sư hay công việc thiết kế có được nhiều hơn việc thiết kế tập lệnh, cũng như các rào cản kỹ thuật trong các khía cạnh khác của dự án làm gặp nhiều thách thức hơn so với những gì gặp phải trong thiết kế tập lệnh. Chúng ta sẽ nhanh chóng xem xét lại kiến trúc tập lệnh trước khi mô tả những thách thức lớn hơn cho các kiến trúc sư máy tính Kiến trúc tập lệnh Chúng ta sử dụng thuật ngữ kiến trúc tập lệnh (ISA-Instruction Set Architecture) để đưa ra các cách lập trình tập lệnh - mà có thể nhìn thấy trong quyển sách này. ISA phục vụ như là ranh giới giữa phần mềm và phần cứng. Điều xem xét nhanh chóng này của ISA sẽ sử dụng các ví dụ từ MIPS và 80x86 để minh họa cho 7 kích thước của một ISA. 1. Loại ISA: Gần như tất cả ISA ngày hôm nay được phân loại như là kiến trúc thanh ghi chung, nơi mà các toán hạng hoặc là lưu trữ ở thanh ghi hoặc là bộ nhớ. Các 80x86 có 16 thanh ghi sử dụng chung và 16 thanh ghi này có thể chứa dữ liệu chấm động (floating-point), trong khi MIPS có 32 thanh ghi chung và 32 thanh ghi chấm động (xem bảng 1.3). Hai phiên bản phổ biến của loại này là những ISA thanh ghi-bộ nhớ như 80x86, có thể truy cập bộ nhớ như là một phần của nhiều tập lệnh và những ISA lưu-tải như MIPS, có thể truy cập bộ nhớ chỉ với hoặc tải hoặc lưu trữ các lệnh. Tất cả ISA gần đây đều lưu-tải (load-store).

20 Chương 1: Giới thiệu chung Địa chỉ ô nhớ: Hầu như tất cả các máy tính để bàn và máy chủ, bao gồm cả 80x86 và MIPS, đều sử dụng byte địa chỉ để truy cập ô nhớ toán hạng. Một số kiến trúc, giống như MIPS, yêu cầu các đối tượng phải được liên kết. Một truy cập vào một đối tượng có kích thước s byte tại byte địa chỉ A được liên kết nếu A mod s=0. 80x86 không đòi hỏi, nhưng nói chung là truy cập nhanh hơn nếu toán hạng được liên kết. 3. Chế độ địa chỉ: Ngoài các quy định cụ thể về thanh ghi và các hằng, chế độ địa chỉ xác định địa chỉ cụ thể của một đối tượng trong ô nhớ. Chế độ địa chỉ của MIPS là thanh ghi, trực tiếp (cho hằng) và sự chuyển dời, vị trí mà độ dời (offset) của hằng có thể thêm vào trên thanh ghi để tạo thành địa chỉ ô nhớ. 80x86 hỗ trợ 3 cộng với 3 biến dịch chuyển: không có thanh ghi (tuyệt đối), 2 thanh ghi (theo thứ tự dịch), 2 thanh ghi mà 1 trong nó được nhân với kích thước các toán hạng trên byte (dựa vào chỉ số và sự dịch). Tên Số Sử dụng Lưu giữ trên mỗi lần gọi $zero 0 Hằng có giá trị bằng 0 Không $at 1 Hợp dịch tạm Không $v0 $v1 2 3 Giá trị kết quả hàm và đánh giá biểu thức Không $a0 $a3 4 7 Đối số Không $t0 $t Biến tạm Không $s0 $s Lưu tạm Có $t8 $t Tạm thời Không $k0 $k Dành cho kernel OS Không $gp 28 Con trỏ toàn cục Có $sp 29 Con trỏ ngăn xếp Có $fp 30 Con trỏ khung Có $ra 31 Địa chỉ trả về Có Bảng 1.3: Các thanh ghi MIPS và các quy ước sử dụng. Ngoài 32 thanh ghi sử dụng với mục đích chung (R0-R31), MIPS có 32 thanh ghi điểm động (F0-F31), có thể lưu trữ hoặc một con số chính xác đơn 32-bit hoặc là số có độ chính xác kép với 64-bit. 4. Loại và kích thước các toán tử: Giống như hầu hết các ISA, MIPS và 80x86 hỗ trợ toán tử có kích thước 8-bit (ký tự ASCII), 16-bit (ký tự Unicode hoặc ½ từ), 32-bit (số nguyên hoặc từ), 64-bit (từ kép hoặc số nguyên dài) và dấu chấm động IEEE 754 trong 32-bit (độ chính xác đơn) và 64-bit (độ chính xác kép). 80x86 cũng hỗ trợ 80-bit cho dấu chấm động (mở rộng độ chính xác kép).

21 22 Kiến trúc máy tính tiên tiến 5. Hoạt động: Các loại hoạt động chung như truyền dữ liệu, số học luận lý, điều khiển và dấu chấm động. MIPS là một cấu trúc đường ống lệnh đơn giản và gọn nhẹ, đại diện tiêu biểu của kiến trúc RISC sử dụng trong năm Bảng 1.4 tóm tắt các ISA MIPS. Các 80x86 có sự đa dạng hơn và thiết lập nhiều hoạt động hơn. 6. Kiểm soát dòng lệnh: Hầu như tất cả các ISA, bao gồm cả 80x86 và MIPS, hỗ trợ các nhánh có điều kiện, các lệnh nhảy không điều kiện, các lời gọi thủ tục và giá trị trả về. Cả hai đều sử dụng địa chỉ tương đối của máy tính, nơi mà các địa chỉ nhánh được thiết lập theo một trường địa chỉ được thêm vào PC. Tất nhiên, sẽ có một vài khác biệt nhỏ. Những nhánh điều kiện MIPS (BE, BNE, v.v ) kiểm tra nội dung những thanh ghi, trong đó nhánh 80x86 (JE, JNE, v.v ) kiểm tra những bit mã điều kiện được thiết lập như tác dụng ngoài của bộ xử lý số học/luận lý. Thủ tục MIPS gọi (JAL) nơi trả về địa chỉ trên một thanh ghi, trong khi lời gọi của 80x86 (CALLF) nơi các địa chỉ trả về nằm trên các ngăn xếp trong bộ nhớ. 7. Mã hóa ISA: Có hai lựa chọn cơ bản để mã hóa: chiều dài cố định và chiều dài thay đổi. Tất cả các cấu trúc lệnh MIPS đều có độ dài 32 bit, làm đơn giản hóa việc giải mã. Hình 1.2 hiển thị các định dạng về cấu trúc lệnh của MIPS. 80x86 mã hóa bằng cách biến đổi chiều dài, lần lượt từ 1 đến 18 byte. Chiều dài được biến đổi làm ít chiếm dụng bộ nhớ hơn việc cố định chiều dài lệnh, do đó, một chương trình biên dịch cho 80x86 thường nhỏ hơn cùng một chương trình biên dịch trên MIPS. Lưu ý rằng việc lựa chọn nêu trên sẽ ảnh hưởng đến cách các cấu trúc lệnh được mã hóa thành mã nhị phân tương ứng. Ví dụ, số lượng các thanh ghi và số lượng các chế độ địa chỉ đều có một ảnh hưởng đáng kể đến kích thước của các dòng lệnh, như các trường trên thanh ghi và các trường trong chế độ địa chỉ có thể xuất hiện nhiều lần trong một lần gọi lệnh. Chúng ta sử dụng một bảng con của MIPS64 như là một ví dụ về ISA trong quyển sách này. Loại lệnh/mã thao tác (opcode) Truyền dữ liệu LB, LBU, SB LH, LHU, SH Ý nghĩa lệnh Di chuyển dữ liệu từ thanh ghi và bộ nhớ, hoặc giữa các hàm chức năng với số nguyên hoặc các thanh ghi đặc biệt; chỉ ô nhớ của chế độ địa chỉ là 16 bit dịch chuyển + nội dung của một bộ định vị (GPR) Tải byte, tải byte không dấu, lưu trữ byte (đi/đến các thanh ghi số nguyên) Tải ½ từ, tải ½ từ không dấu, lưu trữ ½ từ (đi/đến các thanh ghi số nguyên)

22 Chương 1: Giới thiệu chung 23 Loại lệnh/mã thao tác (opcode) LW, LWU, SW LD, SD L.S, L.D, S.S, S.D MFC0, MTC0 MOV.S, MOV.D MFC1, MTC1 Arithmetic/logical Ý nghĩa lệnh Tải từ, từ không dấu, lưu trữ từ (đi/đến các thanh ghi số nguyên) Tải từ kép, lưu trữ từ kép (đi/đến các thanh ghi số nguyên) Tải SP nổi, tải DP nổi, lưu SP nổi, lưu DP nổi Sao chép từ/đến GPR đến/từ 1 thanh ghi đặc biệt Sao chép 1 thanh ghi SP hoặc DP FP đến 1 thanh ghi FP khác. Sao chép 32 bit đến/từ thanh ghi FP (đi/đến các thanh ghi số nguyên) Phép toán trên dữ liệu số nguyên hoặc logic trong những bộ định vị (GPRs) DADD, DADDI, DADDU, DADDIU Cộng, cộng trực tiếp (tất cả quy thành 16 bit); có dấu và không dấu DSUB, DSUBU DMUL, DMULU, DDIV, DDIVU, MADD AND, ANDI OR, ORI, XOR, XORI LUI DSLL, DSRL, DSRA, DSLLV, DSRLV, DSRAV SLT, SLTI, SLTU, SLTIU Control Trừ; có dấu và không dấu Nhân và chia, có dấu và không dấu; nhân-cộng; tất cả phép toán đều là giá trị 64 bit And, and trực tiếp Or, or trực tiếp, or loại trừ, or loại trừ trực tiếp Tải dấu mũ trực tiếp; tải trực tiếp bit 32 đến 47 lên thanh ghi, sau đó là các dấu mở rộng Dịch trái: cả trực tiếp (DS ) và thay đổi dạng (DS V); dịch có s là phép dịch trái Dịch phải luận lý và dịch phải số học Đặt chỉ số dưới, đặt chỉ số dưới trực tiếp; có dấu và không dấu Nhánh điều kiện và bước nhảy; thanh ghi liên quan hoặc thông qua PC BEQZ, BNEZ Nhánh GPRs bằng /không bằng 0; 16-bit bù từ PC + 4 BEQ, BNE Nhánh GPR bằng /không bằng; 16-bit độ dời từ PC + 4 BC1T, BC1F MOVN, MOVZ Thử nghiệm so sánh bit trong thanh ghi về tình trạng FP và nhánh; 16-bit độ dời từ PC + 4 Sao chép GPR đến GPR khác nếu GPR thứ ba là âm, bằng 0 J, JR Nhảy: 26-bit độ dời từ PC + 4 (J) hay đích trên thanh ghi (JR) JAL, JALR Bước nhảy và liên kết: lưu PC + 4 trong R31, mục tiêu là giao tiếp PC (JAL) hoặc một thanh ghi (JALR)

23 24 Kiến trúc máy tính tiên tiến Loại lệnh/mã thao tác (opcode) TRAP ERET Dấu chấm động ADD.D, ADD.S, ADD.PS SUB.D, SUB.S, SUB.PS MUL.D, MUL.S, MUL.PS MADD.D, MADD.S, MADD.PS DIV.D, DIV.S, DIV.PS CVT._._ C..D, C..S Ý nghĩa lệnh Chuyển giao cho hệ điều hành tại một địa chỉ thuộc vectơ Trả về mã người sử dụng do một ngoại lệ; khôi phục chế độ người dùng Các toán tử của FP trên những định dạng của DP và SP Thêm số DP, SP và các cặp số SP Trừ số DP, SP và cặp số SP Nhân DP, SP có dấu chấm động và những cặp SP Nhân-cộng những số DP, SP và những cặp số SP Chia DP, SP có dấu chấm động và những cặp số SP Chuyển đổi lệnh: CVT.x.y chuyển loại x thành loại y, trong đó x và y là L (số nguyên 64-bit), W (số nguyên 32-bit), D (DP), hoặc S (SP). Cả 2 toán hạng là những FPR DP và SP so sánh: = LT,GT,LE,GE,EQ,NE; bộ bit trong thanh ghi tình trạng FP Bảng 1.4: Các lệnh trong MIPS64. SP = độ chính xác đơn (single precision); DP= độ chính xác kép (double precision). Basic instruction formats R opcode rs rt rd shamt funct I opcode rs rt immediate J opcode address Floating-point instruction formats FR opcode fmt ft fs fd funct FI opcode fmt ft immediate Hình 1.2: Các định dạng thiết lập kiến trúc lệnh MIPS64. Tất cả các lệnh đều có độ dài 32 bit. Các định dạng R là dành cho các toán tử số nguyên từ thanh ghi đến thanh ghi, chẳng hạn như DADDU, DSUBU và hơn thế nữa. Các định dạng I là dành cho việc truyền dữ liệu, phân nhánh và các lệnh trực tiếp, chẳng hạn như LD, SD, BEQZ và DADDIs. Các định dạng J là cho bước nhảy, định dạng FR cho các thực thi dấu chấm động và FI định dạng cho các nhánh dấu chấm động. Phần còn lại của kiến trúc máy tính: Thiết kế, tổ chức phần cứng để đáp ứng các mục tiêu và đòi hỏi về chức năng.

24 Chương 1: Giới thiệu chung 25 Cài đặt một máy tính có 2 thành phần: Tổ chức và phần cứng. Thuật ngữ tổ chức bao gồm các khía cạnh cấp cao của việc thiết kế máy tính, chẳng hạn như hệ thống bộ nhớ, liên kết bộ nhớ và thiết kế bộ vi xử lý nội bộ hoặc CPU (đơn vị xử lý trung tâm - nơi số học, phép toán logic, phân nhánh và luân chuyển dữ liệu được thực hiện). Ví dụ, hai bộ xử lý với kiến trúc tập lệnh tương tự, nhưng khác nhau về tổ chức là AMD Opteron 64 và Intel Pentium 4. Cả hai bộ vi xử lý thực hiện các tập lệnh x86, nhưng chúng có đường ống lệnh (pipeline) rất khác nhau và các tổ chức cache. Phần cứng là các chi tiết cụ thể của một máy tính, bao gồm cả việc thiết kế và đóng gói công nghệ. Thường thì một dòng máy tính chứa các máy tính có thiết lập giống hệt nhau, kiến trúc tập lệnh và tổ chức chúng gần như nhau, nhưng chúng khác nhau trong việc thiết kế chi tiết phần cứng. Ví dụ, Pentium 4 và Pentium 4 Mobile dòng di động gần như giống hệt nhau, nhưng tốc độ xung nhịp xử lý khác nhau và hệ thống bộ nhớ khác nhau, làm cho Pentium 4 Mobile hiệu quả hơn cho các máy tính cấp thấp. Trong quyển sách này, khái niệm kiến trúc bao gồm tất cả ba khía cạnh của kiến trúc máy tính: kiến trúc tập lệnh, tổ chức và phần cứng. Những kiến trúc máy tính phải đáp ứng những yêu cầu chức năng cũng như giá cả, sức mạnh, hiệu suất và các mục tiêu sẵn có. Bảng 1.5 tóm tắt những yêu cầu cần xem xét trong việc thiết kế một máy tính mới. Thông thường, những kiến trúc sư cũng phải tự xác định được các yêu cầu chức năng, đặc biệt là một chức năng chính nào đó. Các yêu cầu về tính năng cụ thể có thể lấy cảm hứng từ thị trường. Phần mềm ứng dụng thường điều khiển một số chức năng chính được quyết định bởi người sử dụng. Nếu phần thân lớn của một phần mềm tồn tại cho một kiến trúc tập lệnh nhất định, thì các kiến trúc sư có thể quyết định rằng một máy tính mới phải thực hiện tập lệnh hiện tại đó. Sự nổi lên của một thị trường lớn cho một lớp các ứng dụng đặc biệt có thể khuyến khích các nhà thiết kế kết hợp các yêu cầu đó lại và sẽ làm tăng sự cạnh tranh trên thị trường đó. Nhiều trong số các yêu cầu và tính năng sẽ được đào sâu ở các chương sau. Kiến trúc sư cũng phải thích ứng nhanh với các xu hướng quan trọng trong công nghệ và việc sử dụng máy tính, như vậy xu hướng này không chỉ ảnh hưởng đến chi phí trong tương lai, mà còn quyết định sự tồn tại lâu dài của một cấu trúc. Nếu một thân của phần mềm tồn tại đối với một kiến trúc tập lệnh chắc chắn, các kiến trúc sư có thể quyết định rằng một máy tính mới nên thực hiện một tập lệnh hiện tại. Sự hiện diện của một thị trường lớn cho một lớp học đặc biệt của ứng dụng có thể khuyến khích các nhà thiết kế để kết hợp các yêu cầu đó sẽ làm cho máy tính cạnh tranh trong thị trường đó.

25 26 Kiến trúc máy tính tiên tiến Chức năng yêu cầu + Phạm vi sử dụng - Mục đích chung máy tính để bàn - Kiến thức về máy tính để bàn và máy chủ - Các máy chủ thương mại - Máy tính nhúng + Mức độ tương thích phần mềm - Ở ngôn ngữ lập trình - Mã đối tượng hay nhị phân tương thích + Hệ điều hành yêu cầu - Kích thước của không gian địa chỉ - Quản lý bộ nhớ - Chế độ bảo vệ + Tiêu chuẩn - Dấu chấm động - Giao diện I/O - Hệ điều hành - Các mạng - Ngôn ngữ lập trình Đặc điểm nổi bật không thể thiếu hoặc hỗ trợ + Trong phạm vi máy tính - Ổn định hiệu suất cho một loạt các nhiệm vụ, bao gồm cả hoạt động tương tác cho đồ họa, video và âm thanh. - Hiệu suất cao dấu chấm động và đồ họa. - Hỗ trợ cho cơ sở dữ liệu và xử lý giao dịch; cải tiến cho độ tin cậy và sẵn có; hỗ trợ cho khả năng mở rộng. - Thông thường hỗ trợ cho đồ họa hoặc video (hoặc các ứng dụng mở rộng cụ thể); hạn chế và kiểm soát các chức năng yêu cầu. + Xác định số lượng phần mềm có sẵn trong máy tính - Hầu hết linh hoạt cho các nhà thiết kế; cần trình biên dịch mới. - Hướng dẫn thiết lập kiến trúc là hoàn toàn xác định - ít linh hoạt, nhưng không có sự đầu tư cần thiết trong các chương trình phần mềm hoặc cổng chương trình. + Các tính năng cần thiết để hỗ trợ lựa chọn hệ điều hành - Đặc trưng rất quan trọng; có thể giới hạn các ứng dụng. - Cần thiết cho hệ điều hành hiện đại, có thể chia thành từng trang, hoặc phân đoạn. - Sự khác nhau về những nhu cầu của hệ điều hành và ứng dụng, trang so với đoạn, máy ảo. + Một số tiêu chuẩn có thể được thị trường yêu cầu - Định dạng và số học: tiêu chuẩn IEEE 754, đặc biệt số học cho đồ họa và xử lý tín hiệu. - Đối với thiết bị I/O: Serial ATA, Serial Attach SCSI, PCI Express. - UNIX, Windows, Linux, CISCO IOS. - Hỗ trợ tốt cho các mạng khác nhau như: Ethernet, Infiniband - Ngôn ngữ (ANSI C, C++, Java, FORTRAN), ảnh hưởng tập lệnh. Bảng 1.5: Tóm tắt 1 số chức năng yêu cầu quan trọng nhất mà người kiến trúc sư phải đối mặt. Cột bên trái mô tả các lớp yêu cầu, trong khi cột bên phải đưa ra các ví dụ cụ thể. Cột bên phải đồng thời cũng tham chiếu đến số chương, phần để giải quyết các vấn đề cụ thể Các xu hướng công nghệ Nếu một kiến trúc tập lệnh được thiết lập có thể thành công, nó phải được thiết kế để theo kịp sự thay đổi nhanh chóng của công nghệ máy tính. Tóm lại, một

26 Chương 1: Giới thiệu chung 27 tập lệnh mới tác động đến kiến trúc có thể hướng tới một thành công sau nhiều thập kỷ qua, ví dụ, cốt lõi của bộ khung IBM đã được sử dụng hơn 40 năm qua. Một kiến trúc sư phải có kế hoạch cho sự thay đổi công nghệ để có thể tăng tuổi thọ của một máy tính tốt. Kế hoạch cho sự phát triển của máy tính, người thiết kế phải ý thức được sự thay đổi nhanh chóng của sự phát triển công nghệ. Bốn sự bổ sung công nghệ, cùng với sự thay đổi ấn tượng, chúng rất quan trọng để thực hiện sự hiện đại hóa. Mạch tích hợp công nghệ logic: Mật độ transistor tăng khoảng 35% trên một năm, tăng 4 lần trong vòng 4 năm. Tăng kích thước chết ít và chậm hơn dự đoán, từ 10% đến 20% trên một năm. Hiệu quả kết hợp trong transistor trên một chip tăng trưởng khoảng 40% đến 55% trên một năm. Thiết bị quy mô tốc độ chậm hơn, chúng ta sẽ thảo luận thêm dưới đây. Bán dẫn DRAM (Bộ nhớ truy cập ngẫu nhiên động): Công suất tăng 40% trên một năm, tăng gấp đôi sau 2 năm. Công nghệ đĩa từ: Trước năm 1990, mật độ tăng lên khoảng 30% trên một năm, tăng gấp đôi trong ba năm. Nó tăng đến 60% ở năm sau đó và tăng lên 100% vào năm Từ năm 2004, nó giảm còn 30% trên một năm. Công nghệ mạng: Mạng lưới hoạt động phụ thuộc cả về hiệu suất của thiết bị chuyển mạch và về hiệu suất của hệ thống truyền tải. Những công nghệ này nhanh chóng thay đổi hình dạng thiết kế của một máy tính, với tốc độ của sự cải tiến công nghệ, có thể có một tuổi thọ 5 năm hoặc nhiều hơn. Cần rất nhiều thời gian để làm ra một sản phẩm duy nhất cho một hệ thống máy tính (2 năm thiết kế, 2-3 năm sản xuất). Công nghệ trọng điểm như thay đổi DRAM mức vừa đủ và người thiết kế phải lập kế hoạch cho những thay đổi này. Thật vậy, nhà thiết kế thường thiết kế cho những công nghệ tiếp theo, biết rằng khi một sản phẩm bắt đầu vận chuyển khối lượng mà công nghệ tiếp theo có thể là hầu hết các chi phí hiệu quả hoặc có thể có lợi thế thực hiện. Theo truyền thống, chi phí đã giảm ở mức mà tại đó mật độ tăng. Mặc dù công nghệ cải thiện liên tục, tác động của những cải thiện, các tuyên bố có thể được thông báo trong các khoảng cách rời rạc, như là một ngưỡng cho phép một khả năng mới đạt được. Ví dụ, khi công nghệ MOS đạt đến một điểm đầu những năm 1980, nơi giữa và transistor có thể phù hợp trên một chip duy nhất, nó trở thành có thể xây dựng một bộ vi xử lý, đơn chip 32-bit. Vào cuối những năm 1980, lần đầu tiên cấp bộ nhớ đệm có thể gắn trên chip. Thiết kế này chỉ đơn giản khả thi cho đến khi công nghệ đạt đến một điểm nhất định. Ngưỡng công nghệ như vậy không phải là hiếm và có tác động đáng kể đến một loạt các quyết định thiết kế.

27 28 Kiến trúc máy tính tiên tiến Các xu hướng về hiệu suất: Băng thông trên độ trễ Như chúng ta sẽ thấy trong mục 1.8, băng thông hoặc thông lượng là tổng số lượng công việc thực hiện trong một thời gian nhất định, chẳng hạn như MB trên một giây cho một đĩa truyền. Ngược lại, độ trễ hay thời gian đáp ứng là thời gian giữa thời điểm bắt đầu và kết thúc của một tác động, chẳng hạn như mili giây cho một truy cập đĩa. Hình 1.3 mô tả sự cải tiến tương đối băng thông và độ trễ cho các mốc công nghệ đối với các bộ vi xử lý, bộ nhớ, mạng và đĩa. Bảng 1.6 trình bày các ví dụ và các mốc cụ thể chi tiết hơn. Rõ ràng, băng thông cải thiện rất nhanh so với độ trễ. Hình 1.3: Bản vẽ băng thông và độ trễ. Lưu ý rằng độ trễ được cải thiện ở 10X trong khi băng thông được cải thiện từ 100X đến 1000X Tỉ lệ của hiệu suất bán dẫn và dây Các quy trình tích hợp mạch được đặc trưng bởi kích thước tính năng, mà là kích cỡ tối thiểu của một bóng bán dẫn hoặc dây trong, hoặc kích thước x, hoặc kích thước y. Tính năng có kích thước giảm từ 10 micron trong năm 1971 đến 0,09 micron trong năm Trong thực tế, chúng ta đã chuyển các đơn vị, do đó, sản xuất trong năm 2006 được gọi là "90 nm" và chip 65 nm đang được triển khai. Kể từ khi số bóng bán dẫn trên mỗi mm 2 của silicon được xác định bởi diện tích bề mặt của một bóng bán dẫn, mật độ bóng bán dẫn tăng bình phương với một sự giảm kích thước tuyến tính.

28 Chương 1: Giới thiệu chung 29 Microprocessor 16-bit address/bus, microcoded 32-bit address/bus, microcoded 5-stage pipe line, onchip I&D caches, FPU 2-way superscalar, 64-bit bus Out-of-order 3-way superscalar Out-of-order superpipelined, on-chip 1.2 cache Product Intel Intel Intel Intel Pentium Intel Pentium Pro Intel Pentium 4 Year Die size (mm 2 ) Transistors Pins Latency (clocks) Bus width (bits) Clock rate (MHz) 12, Bandwidth (MIPS) Latency (ns) Memory Module DRAM Page mode DRAM Fast page mode DRAM Fast page mode DRAM Synchronous DRAM Double data rate SDRAM Module width (bits) Year Mbits/DRAM chip 0,06 0, Die size (mm 2 ) Pins/DRAM chip Bandwidth (Mbit/s) Latency (ns) Local area network Ethernet Fast Ethernet Gigabit Ethernet 10 Gigabit Ethernet IEEE standard u 802.3ab 802.3ac Year Bandwidth (Mbit/s) Latency (µs) Hard disk RPM RPM RPM RPM RPM Product CDC WrenI Seagate ST41600 Seagate ST15150 Seagate ST39102 Seagate ST Year Capacity (GB) 0,03 1,4 4,3 9,1 73,4 Disk form factor 5,25 inch 5,25 inch 3,5 inch 3,5 inch 3,5 inch Media diameter 5,25 inch 5,25 inch 3,5 inch 3,0 inch 2,5 inch Interface ST-412 SCSI SCSI SCSI SCSI Bandwidth (Mbit/s) 0, Latency (ms) 48,3 17,1 12,7 8,8 5,7 Bảng 1.6: Hiệu suất mốc trên năm đối với bộ vi xử lý, bộ nhớ, mạng và đĩa. Các sự kiện quan trọng là 6 thế hệ bộ vi xử lý của bộ vi xử lý IA-32, đi từ 16-bit Bus, đến các vi mã cho 64-bit Bus, siêu vô hướng, siêu luồng Pentium 4. Module bộ nhớ sự kiện quan trọng đi từ 16-bit rộng, DRAM 64-bit, rộng gấp đôi dữ liệu DRAM đồng bộ. Ethernet tiên tiến từ 10 Mb/s đến 10 Gb/s. Mốc đĩa dựa trên tốc độ luân chuyển, nâng cao từ RPM đến RPM. Mỗi trường hợp tốt nhất với băng thông và độ trễ là thời gian cho một hoạt động đơn giản giả định không có sự cạnh tranh. Việc tăng hiệu suất bóng bán dẫn, tuy nhiên, là khá phức tạp. Theo tính năng thu nhỏ kích thước, thiết bị thu nhỏ bình phương trong chiều ngang và cũng thu nhỏ trong chiều dọc. Việc thu nhỏ trong chiều dọc đòi hỏi phải giảm điện áp hoạt động để duy trì hoạt động chính xác và độ tin cậy của các bóng bán dẫn. Sự kết hợp của

29 30 Kiến trúc máy tính tiên tiến các yếu tố rộng dẫn đến một hệ thống tương quan phức tạp giữa hiệu suất và kích thước bóng bán dẫn. Thực tế là bóng bán dẫn cải thiện tính bình phương với một cải thiện tuyến tính, các lĩnh vực hoạt động bóng bán dẫn là cả những thách thức và cơ hội mà kiến trúc sư máy tính đã được tạo ra. Trong những ngày đầu của bộ vi xử lý, tỉ lệ cải thiện mật độ đã được nâng cấp nhanh chóng từ 4-bit, đến 8-bit, 16-bit và bộ vi xử lý 32-bit. Gần đây, mật độ cải thiện, các tuyên bố có hỗ trợ việc giới thiệu các bộ vi xử lý 64-bit cũng như nhiều đổi mới trong đường ống và các cache. Mặc dù bóng bán dẫn nói chung là cải thiện hiệu suất và giảm kích thước, dây điện trong một mạch tích hợp thì chưa làm được. Đặc biệt, sự chậm trễ tín hiệu cho một dây tăng tương ứng với sản phẩm của điện trở và điện dung của nó. Tất nhiên, như tính năng thu nhỏ kích thước, dây được ngắn hơn, nhưng điện trở và điện dung trên một đơn vị tồi tệ hơn. Mối quan hệ này là phức tạp, kể từ khi cả điện trở và điện dung phụ thuộc vào các khía cạnh chi tiết của quá trình, dạng ngoài của dây dẫn, các tải trên dây và thậm chí phụ cận các cấu trúc khác. Có những cải tiến quá trình thường xuyên, trong đó cung cấp các cải tiến trong thời gian chậm trễ do dây. Nhìn chung, dây chậm trễ so với hiệu suất bóng bán dẫn, tạo ra những thách thức cần thiết kế bổ sung. Trong vài năm qua, sự chậm trễ của dây đã trở thành một giới hạn thiết kế chính cho các mạch tích hợp lớn và thường quan trọng hơn so với bóng bán dẫn chuyển mạch chậm trễ. Trong năm 2001, Pentium 4 đã ra mắt mới bằng cách bố trí 2 tầng của đường ống dẫn 20 + tầng của nó chỉ dành cho truyền các tín hiệu trên chip Xu hướng năng lượng trên các mạch tích hợp Năng lượng cũng cung cấp những thách thức như các thiết bị được thu nhỏ. Thứ nhất, năng lượng phải được đưa vào và phân phối trên chip và các bộ vi xử lý hiện đại sử dụng hàng trăm chân và kết nối nhiều lớp. Thứ hai, năng lượng hao phí như là nhiệt phải được loại bỏ. Đối với chip CMOS, các truyền thống chi phối năng lượng tiêu thụ đã được chuyển sang bóng bán dẫn, còn gọi là năng lượng động. Các năng lượng cần cho mỗi bóng bán dẫn là tỉ lệ thuận với sản phẩm của điện dung tải của bóng bán dẫn, các bậc hai của điện áp và tần số của chuyển đổi, với đơn vị tính bằng Watt: Power dynamic = 1/2 x Capacitive load x Voltage 2 x Frequency switched Do đó năng lượng là thước đo thích hợp, được đo bằng joules: Energy dynamic = Capacitive load x Voltage 2

30 Chương 1: Giới thiệu chung 31 Do đó, năng lượng động, sức mạnh năng lượng được giảm đi đáng kể bằng cách giảm điện áp, điện áp do đó đã giảm từ 5V để chỉ hơn 1V trong 20 năm. Các tải dung là một chức năng của số lượng bóng bán dẫn kết nối với một đầu ra và công nghệ, mà quyết định các điện dung của dây và các bóng bán dẫn. Đối với một công việc cố định, tốc độ đồng hồ chậm lại làm giảm điện năng, nhưng không giảm năng lượng. Ví dụ: Một số bộ vi xử lý ngày nay được thiết kế để có thể điều chỉnh điện áp, do đó khi 15% giảm điện áp có thể làm giảm 15% tần số. Những gì sẽ ảnh hưởng đến sức mạnh năng lượng động? Trả lời: Kể từ khi điện dung không thay đổi, thì câu trả lời là tỉ lệ của điện áp và tần số. Power Power (Voltagex0,85) x(frequencyswitchedx0,85) = =0,85 =0,61 2 new 3 2 old Voltage xfrequencyswitched Do đó làm giảm 60% năng lượng ban đầu. Như chúng ta chuyển từ một quá trình để tăng tiếp theo, trong số lượng các bóng bán dẫn chuyển đổi và tần số mà nó chuyển đổi, chi phối giảm tải điện dung và điện áp, dẫn đến tăng trưởng chung trong tiêu thụ năng lượng. Các bộ vi xử lý đầu tiên tiêu thụ 1/10 của Watt, trong khi một chip Pentium 4 3,2 GHz tiêu thụ 135 Watt. Cho rằng sức nóng này phải được làm tiêu tan từ một chip đó là khoảng 1 cm trên mặt, do đó cần phải được làm mát bằng không khí. Một số bộ vi xử lý Intel có điốt để giảm nhiệt độ hoạt động tự động nếu chip quá nóng. Ví dụ, họ có thể làm giảm điện áp và tần số đồng hồ. Phân phối năng lượng, loại bỏ nhiệt và ngăn chặn các điểm nóng đã trở nên ngày càng thách thức khó khăn. Công suất hiện nay là hạn chế lớn trong việc sử dụng bóng bán dẫn, trong quá khứ nó là một hàng silicon. Đó là hạn chế, hầu hết các bộ vi xử lý ngày hôm nay tắt đồng hồ của các mô-đun không hoạt động để tiết kiệm năng lượng và điện năng động. Ví dụ, nếu không có lệnh dấu chấm động được thực hiện, đồng hồ của khối dấu chấm động bị vô hiệu hóa. Mặc dù điện năng động là nguồn gốc chính của năng lượng trong CMOS, tĩnh điện đang trở thành một vấn đề quan trọng bởi vì dòng chảy rò rỉ hiện nay ngay cả khi bóng bán dẫn đang tắt: Power static = Current static x Voltage Vì vậy, tăng số lượng các bóng bán dẫn tăng sức mạnh ngay cả khi nó đang bị tắt và làm tăng sự rò rỉ hiện nay trong bộ vi xử lý với các kích thước bóng bán dẫn nhỏ hơn. Kết quả là, hệ thống năng lượng rất thấp thậm chí còn chọn điện áp cho

31 32 Kiến trúc máy tính tiên tiến các mô-đun không hoạt động để kiểm soát tổn thất do rò rỉ. Trong năm 2006, mục tiêu cho rò rỉ là 25% của tổng số điện năng tiêu thụ, với sự rò rỉ trong các thiết kế hiệu năng cao đôi khi vượt xa mục tiêu đó. Các giới hạn của không khí lạnh đã dẫn đến nhiều bộ xử lý trên một chip chạy ở điện áp và tốc độ xung đồng hồ thấp hơn Sơ lược về một số kiến trúc máy tính hiện đại Bây giờ chúng ta đã thấy được bằng cách nào để định nghĩa, đo lường, và tổng quát hoá quá trình thực hiện, độ tin cậy, sức mạnh, chúng ta có thể khám phá ra các ống dẫn và nguyên tắc hữu ích trong thiết kế và phân tích máy tính. Phần này giới thiệu những cái nhìn quan trọng về thiết kế, cũng như hai phương trình để đánh giá giữa hai sự lựa chọn Ưu điểm của tính song song Tận dụng tính song song là một trong những phương pháp quan trọng nhất để tăng hiệu năng. Mỗi chương trong quyển sách này đều có một ví dụ để biết cách làm thế nào để tăng cường quá trình thực hiện thông qua việc tận dụng tính song song. Chúng ta sẽ đưa ba ví dụ ngắn gọn, nó sẽ được giải thích rõ ràng ở những chương sau. Ví dụ đầu tiên là sử dụng tính song song ở mức độ hệ thống. Để cải thiện hiệu suất thông qua một máy chủ chuẩn điển hình, như là SPECWeb hoặc TCP-C, nhiều bộ vi xử lý và nhiều ổ đĩa có thể được sử dụng. Khối lượng công việc xử lý những yêu cầu sau đó có thể trải ra giữa bộ vi xử lý và ổ đĩa, kết quả là đã cải thiện thông lượng. Có khả năng mở rộng bộ nhớ và số lượng các bộ vi xử lý và đĩa được gọi là khả năng mở rộng, và nó là tài sản có giá trị của các máy chủ. Ở cấp độ của một bộ vi xử lý cá nhân, tận dụng tính song song giữa các lệnh là rất quan trọng để đạt được hiệu suất cao. Một trong những cách đơn giản nhất để làm điều này là thông qua sự tạo ống dẫn. Ý tưởng cơ bản đằng sau sự tạo ống dẫn, được giải thích chi tiết hơn trong chương 2, là để chồng lấp việc thực thi các lệnh để làm giảm thời gian hoàn thành một trình tự lệnh. Một nhận thức chính cho phép sự tạo ống dẫn làm việc là không phụ thuộc lệnh trên phần tử ngay trước đó, và do đó, các chỉ lệnh có thể thực hiện một cách hoàn toàn hoặc chỉ một phần. Tính song song cũng được khai thác ở mức độ thiết kế kỹ thuật số chi tiết. Ví dụ, bộ nhớ đệm liên hợp vùng sử dụng nhiều khối nhớ được tìm kiếm điển hình song song để tìm một phần tử như mong muốn. Hệ thống ALU hiện đại sử dụng tìm kiếm xa, trong đó sử dụng tính song song để tăng tốc quá trình tính toán tổng từ tuyến tính cho đến logarit trong số bit trên một toán hạng.

32 Chương 1: Giới thiệu chung Nguyên tắc của vùng Những quan sát cơ bản quan trọng đến từ những thuộc tính của chương trình. Đặc tính quan trọng nhất của chương trình mà chúng ta thường xuyên khai thác là nguyên tắc của vùng: Chương trình có xu hướng sử dụng lại dữ liệu và các lệnh được sử dụng gần đây. Một nguyên tắc ngón tay cái được tổ chức rộng rãi là một chương trình tiêu tốn 90% thời gian thực thi của nó chỉ với 10% các mã. Một ý nghĩa của vùng là chúng ta có thể dự đoán mức độ chính xác hợp lý những gì các lệnh và dữ liệu một chương trình sẽ sử dụng trong tương lai gần dựa trên những truy cập của nó trong quá khứ gần đây. Nguyên tắc của vùng cũng được áp dụng cho truy cập dữ liệu, mặc dù không mạnh mẽ như truy cập các mã. Hai loại khác biệt của vùng đã được chú ý. Vị trí vùng thời gian mà những phần tử được truy cập gần đây thì có thể được truy cập trong tương lai gần. Vùng không gian nói lên những phần tử mà những địa chỉ gần nhau có xu hướng tham chiếu cùng nhau đúng thời gian. Chúng ta sẽ thấy những nguyên tắc này được áp dụng trong chương Tập trung vào các trường hợp chung Có lẽ nguyên tắc quan trọng và phổ biến nhất của thiết kế máy tính là tập trung vào những trường hợp chung: Trong việc làm một thiết kế cân bằng, thiên về những trường hợp thường xuyên hơn những trường hợp không thường xuyên. Nguyên tắc này áp dụng khi xác định bằng cách nào để chi tiêu nguồn tài nguyên, kể từ khi tác động việc cải tiến nó cao hơn nếu việc xảy ra là thường xuyên. Tập trung vào trường hợp chung làm việc với nguồn năng lượng cũng như phân bổ nguồn tài nguyên và hiệu suất. Những lệnh được lấy và giãi mã đơn vị của một bộ vi xử lý có thể được sử dụng thường xuyên hơn nhiều so với một bộ nhân để tối ưu nó trước tiên. Nó hoạt động với độ tin cậy cao. Nếu cơ sở dữ liệu của một máy chủ có 50 ổ đĩa cho mỗi bộ vi xử lý, cũng như trong phần tiếp theo, độ tin cậy lưu trữ sẽ nổi trội hơn độ tin cậy của hệ thống. Ngoài ra, các trường hợp thường xuyên thì đơn giản hơn, có thể hoàn thành nhanh hơn những trường hợp không thường xuyên. Ví dụ, khi thêm hai số vào bộ vi xử lý chúng ta có thể hy vọng tràn bộ nhớ để có hoàn cảnh hiếm và vì thế có thể cải thiện hiệu suất bằng cách tối ưu các trường hợp thông thường không tràn bộ nhớ. Trong việc áp dụng nguyên tắc đơn giản này, chúng ta phải quyết định những trường hợp nào là thường xuyên và hiệu suất có thể được cải thiện bao nhiêu bằng cách làm cho trường hợp đó nhanh hơn. Một luật cơ bản được gọi là luật của Amdahl có thể được sử dụng để định lượng cho nguyên tắc này.

33 34 Kiến trúc máy tính tiên tiến Luật Amdahl Tăng tốc hiệu suất có thể đạt được bằng cách cải thiện một số của một máy tính có thể tính toán dựa vào sử dụng luật Amdahl. Luật Amdahl phát biểu rằng, cải thiện hiệu suất để có được độ lợi từ việc sử dụng một số chế độ thực hiện nhanh hơn là bị giới hạn bởi tỷ lệ thời gian chế độ làm việc nhanh hơn có thể được sử dụng. Luật Amdahl định nghĩa sự tăng tốc (speedup) có thể đạt được bằng cách sử dụng một tính năng đặc biệt. Vậy sự tăng tốc là gì? Giả sử rằng chúng ta có thể làm tăng cường cho một máy tính mà sẽ được cải thiện hiệu suất khi sử dụng nó. Sự tăng tốc là tỉ số: Speedup = Ngoài ra, Speedup = Hiệu suất cho toàn bộ công việc sử dụng việc tăng cường khi có thể Hiệu suất cho toàn bộ công việc không sử dụng việc tăng cường Thời gian thực thi toàn bộ công việc không sử dụng việc tăng cường Thời gian thực thi toàn bộ công việc sử dụng tăng cường khi có thể Sự tăng tốc nói cho chúng ta biết được một máy tính có sử dụng việc tăng cường nhanh hơn như thế nào so với một máy tính ban đầu. Luật Amdahl đưa cho chúng ta một phương pháp nhanh chóng để tìm thấy việc nâng cao sự tăng tốc, nó phụ thuộc vào hai yếu tố sau: 1. Tỷ lệ thời gian tính toán trong máy tính ban đầu có thể được chuyển đổi tận dụng lợi thế của việc tăng cường. Ví dụ, nếu 20s là thời gian thực thi của một chương trình có sử dụng việc tăng cường trong tổng số là 60s thì tỷ lệ đó là 20/60. Giá trị này chúng ta sẽ gọi là hệ số tăng cường (HSTC), nó luôn luôn có giá trị nhỏ hơn hoặc bằng Việc cải thiện đạt được bằng chế độ thực thi tăng cường, đó là một nhiệm vụ sẽ chạy nhanh hơn như thế nào nếu chế độ tăng cường được sử dụng trong toàn bộ chương trình. Nếu chế độ tăng cường mất 2s cho một phần của chương trình trong khi ở chế độ ban đầu là 5s, thì sự cải thiện là 5/2. Chúng ta gọi giá trị này là mức tăng cường (MTC), nó luôn luôn lớn hơn 1. Thời gian thực thi mà sử dụng máy tính ban đầu với chế độ tăng cường sẽ là thời gian đã tiêu tốn để sử dụng cho phần không được tăng cường cộng với thời gian tiếu tốn cho việc tăng cường: Thời gian thực thi (mới) = Thời gian thực thi (cũ) x ((1 - Hệ số tăng cường) + HSTC/MTC)

34 Chương 1: Giới thiệu chung 35 Tăng tốc toàn bộ là tỷ số thời gian thực thi: Thời gian thực thi (cũ) Tăng tốc toàn bộ = = Thời gian thực thi (mới) 1 (1 - HSTC) + HSTC/MTC Ví dụ 1: Giả sử rằng chúng ta muốn tăng cường bộ vi xử lý được sử dụng phục vụ cho Web. Bộ vi xử lý mới thì tính toán nhanh hơn gấp 10 lần so với bộ vi xử lý ban đầu trong các ứng dụng phục vụ cho Web. Giả định rằng bộ vi xử lý ban đầu sử dụng thời gian tính toán 40% và đợi I/O là 60%. Việc tăng tốc toàn bộ đạt được cái gì bằng việc kết hợp sự tăng cường? Trả lời: Hệ số tăng cường = 0,4; Mức tăng cường = 10; Tăng tốc toàn bộ = 1 / (0,6 + 0,4 / 10) = 1 / 0,64 = 1,56 Luật Amdahl diễn đạt nguyên lý giảm bớt trở lại: Sự gia tăng trong việc cải thiện tăng tốc đạt được bởi sự cải tiến chỉ một phần tính toán như việc cải thiện được thêm vào. Một hệ quả quan trọng của luật Amdahl là nếu sự tăng cường có thể được sử dụng cho một phần nhỏ của một công việc thì chúng ta không thể tăng tốc công việc nhiều hơn nghịch đảo của phân số âm đó. Một lỗi chung trong việc sử dụng luật Amdahl là để làm lẫn lộn giữa phân số thời gian được chuyển đổi để sử dụng một sự tăng cường và phân số thời gian sau khi tăng cường trong sử dụng. Nếu, thay vì đo thời gian mà chúng ta có thể sử dụng sự tăng cường trong tính toán thì chúng ta đo thời gian sau khi sự tăng cường trong sử dụng, kết quả sẽ không đúng. Luật Amdahl có thể phục vụ như là một hướng dẫn để biết một sự tăng cường sẽ cải thiện được bao nhiêu và bằng cách nào phân phối nguồn tài nguyên để cải thiện chi phí hiệu suất. Luật Amdahl thì đặc biệt hữu ích cho so sánh toàn bộ hiệu suất hệ thống của hai sự lựa chọn, nhưng nó cũng có thể được áp dụng để so sánh kết cấu của hai bộ vi xử lý khác nhau, xem ví dụ sau đây. Ví dụ 2: Phép biến đổi chung yêu cầu trong những bộ vi xử lý đồ họa là vuông góc. Khai triển căn bậc hai các dấu chấm động (FP: Floating Point) khác nhau đáng kể về hiệu suất, đặc biệt là giữa những bộ vi xử lý thiết kế cho đồ họa. Giả sử căn bậc hai FP (FPSQR) chịu trách nhiệm cho 20% của thời gian thực thi của một điểm chuẩn đồ họa quan trọng. Một đề nghị là để tăng cường phần cứng FPSQR và tăng tốc vận hành này bằng một hệ số của 10. Những sự lựa chọn khác nhau thì chỉ để cố gắng làm tất cả những lệnh FP trong những bộ vi xử lý đồ họa chạy nhanh hơn bởi một hệ số là 1,6; lệnh FT chịu trách nhiệm cho nửa thời gian cho ứng dụng. Đội thiết kế tin rằng họ có thể làm tất cả lệnh FP chạy nhanh hơn 1,6 lần với lực tương tự khi yêu cầu cho căn bậc hai nhanh chóng. So sánh hai sự lựa chọn thiết kế.

35 36 Kiến trúc máy tính tiên tiến Trả lời: Chúng ta có thể so sánh hai lựa chọn bằng cách so sánh sự tăng tốc: 1 1 Speedup FPSQR = = =1,22 0,2 0,82 (1-0,2) Speedup FP = = =1,23 0,5 0,8125 (1-0,5)+ 1,6 Cải thiện hiệu suất của toàn bộ quá trình FP thì tốt hơn không đáng kể bởi vì tần suất cao hơn. Luật Amdahl có thể được thực hiện ngoài hiệu suất. Chúng ta hãy làm lại ví dụ đáng tin cậy sau khi cải thiện độ tin cậy của việc cung cấp nguồn điện thông qua sự dư thừa từ giờ đến giờ MTTF, hoặc lớn hơn 4150X. Ví dụ 3: Tính toán tỷ lệ lỗi của hệ thống đĩa phụ là: Tỉ lệ lỗi (system) =10x = = hours hours Vì vậy, phân số của tỷ lệ lỗi có thể được cải tiến là 5 phần triệu giờ trong số 23 cho toàn hệ thống hoặc 0,22. Trả lời: Sự cải thiện đáng tin cậy sẽ là: Cải thiện (Cấp điện đôi) 1 1 = = =1,28 0,22 0,78 (1-0,22) Mặc dù sự cải tiến ấn tượng 4150X trong độ tin cậy của một môđun, từ quan điểm hệ thống, sự thay đổi là lợi ích có thể đo lường được nhưng mà nhỏ. Trong ví dụ trên, chúng ta cần phân số được dùng bởi phiên bản mới và được cải tiến; thường thì thật là khó để đo được thời gian một cách trực tiếp. Trong phần tiếp theo, chúng ta sẽ nhìn thấy phương pháp khác để so sánh dựa trên sử dụng một phương trình phân tích thời gian thực thi của CPU thành ba phần riêng biệt. Nếu chúng ta biết bằng cách nào một sự lựa chọn ảnh hưởng đến ba thành phần, chúng ta có thể xác định toàn bộ hiệu năng của nó. Hơn nữa, luôn luôn có thể xây dựng trình giả lập đo những bộ phận trước khi phần cứng thực sự được thiết kế.

36 Chương 1: Giới thiệu chung Phương trình hiệu suất của bộ vi xử lý Về cơ bản thì tất cả máy tính được cấu tạo sử dụng một xung đồng hồ chạy với tốc độ không đổi. Những biến cố thời gian rời rạc được gọi là dấu kiểm (tick), đồng hồ đánh dấu (clock tick), thời chu kỳ xung đồng hồ, xung đồng hồ, chu kỳ hoặc chu kỳ xung đồng hồ. Những người thiết kế máy tính tham khảo chu kỳ xung đồng hồ bằng khoảng thời gian của nó (1 ns) hoặc bằng tần số của nó (1 GHz). Thời gian CPU cho một chương trình có thể được diễn tả theo hai cách: Thời gian CPU = Chu kỳ xung đồng hồ CPU cho 1 chương trình x Thời gian chu kỳ xung đồng hồ Hoặc: Thời gian CPU = Chu kỳ xung đồng hồ CPU cho 1 chương trình Tốc độ xung đồng hồ Ngoài số lượng xung đồng hồ cần để thực thi một chương trình, chúng ta cũng có thể đếm được số lệnh được thực thi độ dài đường lệnh hoặc tính toán số lệnh (IC - Instruction Count). Nếu chúng ta biết được số chu kỳ xung đồng hồ và tính toán số lệnh, chúng ta có thể tính toán được trung bình số chu kỳ xung đồng hồ trên lệnh (CPI - Clock cycles Per Instruction). Bởi vì nó dễ dàng hơn để làm việc và bởi vì chúng ta sẽ giải quyết với những bộ vi xử lý đơn giản trong chương này nên chúng ta sử dụng CPI. Những nhà thiết kế thỉnh thoảng cũng sử dụng chỉ lệnh trên xung đồng hồ (IPC - Instructions Per Clock), là nghịch đảo của CPI. CPI được tính toán như sau: CPI = Chu kỳ xung đồng hồ cho 1 chương trình Số lệnh Ưu điểm của con số bộ vi xử lý này cung cấp nhận thức sâu sắc về những phong cách khác nhau của những thiết lập lệnh và thi hành, chúng ta sẽ sử dụng nó rộng rãi trong bốn chương tiếp theo. Bằng cách hoán vị số chỉ lệnh trong công thức trên, chu kỳ xung đồng hồ có thể được định nghĩa như IC x CPI. Điều này cho phép chúng ta sử dụng CPI trong công thức tính thời gian thực thi: Thời gian CPU = Số chỉ lệnh x Số chu kỳ trên chỉ lệnh x Thời gian chu kỳ Mở rộng công thức đầu tiên thành đơn vị đo lường cho thấy những phần thích hợp với nhau như thế nào:

37 38 Kiến trúc máy tính tiên tiến Instructions Clockcycles Seconds Seconds x x = =CPU time Program Instruction Clockcycle Program Như công thức này chứng tỏ, hiệu suất bộ vi xử lý phụ thuộc vào ba đặc điểm: chu kỳ xung đồng hồ (hay tốc độ), số chu kỳ xung đồng hồ trên chỉ lệnh, và số lượng chỉ lệnh. Hơn nữa, thời gian CPU cũng phụ thuộc vào ba đặc điểm: 10% của một cải thiện trong số đó dẫn đến sự cải thiện 10% thời gian CPU. Không may, thật khó để thay đổi một thông số trong sự cách ly hoàn toàn từ những cái khác bởi vì những công nghệ cơ bản mà bao gồm trong thay đổi mỗi đặc điểm thì phụ thuộc vào: Thời gian xung đồng hồ Công nghệ phần cứng và sự cấu tạo. CPI Sự cấu tạo và xây dựng thiết lập chỉ lệnh. Tính toán số chỉ lệnh Xây dựng thiết lập chỉ lệnh và biên dịch công nghệ. May mắn thay, nhiều tiềm năng cải thiện hiệu suất kỹ thuật chủ yếu cải tiến một trong những thành phần của hiệu suất bộ vi xử lý với sự va chạm nhỏ hoặc có thể đoán được trên hai cái khác. Đôi khi thật hữu dụng trong thiết kế bộ vi xử lý để tính toán tổng số chu kỳ xung nhịp đồng hồ của bộ vi xử lý như sau: Chu kỳ xung đồng hồ CPU = n i=1 IC i x CPI i IC i đại diện cho số lần chỉ lệnh i được thực thi trong một chương trình và CPI i đại diện cho giá trị trung bình cho số xung đồng hồ trên chỉ lệnh i. Thời gian CPU = n IC x CPI x thời gian chu kỳ xung đồng hồ i=1 Và tổng CPI như sau: n ICi x CPIi i=1 CPI = = Instruction count i n i=1 i ICi Instruction count x CPI Các hình thức sau của của việc tính toán CPI sử dụng mỗi CPI i riêng biệt và phân số của sự cố của chỉ lệnh đó trong một chương trình (nghĩa là IC i /tính số chỉ lệnh). CPI i nên được đo và không chỉ được tính toán từ một bảng biểu ở tài liệu tham khảo hướng dẫn sử dụng vì nó bao gồm những hiệu ứng đường ống, thất thoát bộ nhớ đệm cache và bất kỳ bộ nhớ hệ thống không có hiệu quả khác. i

38 Chương 1: Giới thiệu chung 39 Xem như ví dụ hiệu suất của chúng ta ở đây được thay đổi để sử dụng đo tần số chỉ lệnh và giá trị chỉ lệnh CPI, cái mà trong thực tế thu được bằng mô phỏng hay thiết bị đo đạc phần cứng. Ví dụ: Giả sử rằng chúng ta đã làm những số liệu đo lường sau: Tần số vận hành FP = 25% Trung bình vận hành CPI của FP = 4,0 Trung bình CPI của những chỉ lệnh khác = 1,33 Tần số của FPSQR = 2% CPI của FPSQR = 20 Để giảm CPI của FPSQR xuống 2 hoặc giảm trung bình CPI của toàn bộ vận hành FP xuống 2,5. So sánh hai sự lựa chọn thiết kế thay thế sử dụng phương trình hiệu suất bộ vi xử lý. Trả lời: Trước tiên, quan sát rằng chỉ có giá trị CPI thay đổi; mức xung nhịp đồng hồ và đếm số chỉ lệnh giống hệt nhau. Chúng ta bắt đầu tìm giá trị CPI gốc với việc không tăng cường: CPI gốc = n i =1 CPI i ICi x Instruction count = (4 x 25%) + (1,33 x 75%) = 2,0 Chúng ta có thể tính toán CPI cho tăng cường FPSQR bằng các chu kỳ được lưu từ CPI gốc: CPI với FPSQR mới = CPI gốc 2% x (CPI với FPSQR cũ CPI của chỉ số FPSQR mới) = 2,0-2% x (20-2) = 1,64 Chúng ta có thể tính toán CPI cho sự tăng cường của tất cả chỉ lệnh FP theo cách tương tự hoặc tổng hợp FP và hệ thống CPI không FP. Dùng đẳng thức sau cho chúng ta: CPI với FP mới = (75%x1,33) + (25%x2,5) = 1,62 Vì CPI của tất cả sự tăng cường FP nhỏ hơn không đáng kể, hiệu suất của nó sẽ tốt hơn. Đặc biệt, sự tăng tốc cho toàn bộ quá trình tăng cường FP là: Speedup new FP CPU time = CPU time original new FP IC x Clock cycle x CPI = IC x Clock cycle x CPI original new FP

39 40 Kiến trúc máy tính tiên tiến CPI = CPI original new FP = 2 1,625 = 1,23 Thật là may mắn, chúng ta đạt được sự tăng tốc tương tự sử dụng luật Amdahl. Thường có thể đo được những phần cấu thành của phương trình hiệu suất của bộ vi xử lý. Điều này là một lợi thế chính của việc sử dụng phương trình hiệu suất của vi xử lý so với luật Amdahl trong ví dụ trước. Đặc biệt, có lẽ khó để đo được những thứ như là tỷ số thời gian thực thi cho những chỉ lệnh của một thiết lập có trách nhiệm. Trong thực tế, điều này có lẽ được tính toán bằng tổng số chỉ lệnh đếm được của sản phẩm và CPI cho mỗi chỉ lệnh trong thiết lập. Vì khởi điểm thường là đếm số chỉ lệnh cá nhân và đo đạc CPI nên phương trình hiệu suất vi xử lý hữu ích đáng kinh ngạc. Để sử dụng phương trình hiệu suất vi xử lý như là một công cụ thiết kế, chúng ta cần đế có thể đo những yếu tố khác nhau. Cho một bộ vi xử lý có sẵn, thật dễ để đạt được thời gian thực thi bằng việc đo lường và tốc độ xung đồng hồ được biết. Những sự thách thức trong việc khám phá chỉ lệnh đếm được hoặc CPI. Hầu hết những con vi xử lý mới bao gồm cả bộ đếm cho cả hai chỉ lệnh thực thi và cho chu kỳ xung đồng hồ. Bằng cách định kỳ giám sát các bộ đếm này nó cũng có thể đính kèm thời gian thực thi và số chỉ lệnh đếm được để phân đoạn mã mà có thể giúp ích cho các lập trình viên cố gắng hiểu và điểu chỉnh hiệu suất của một ứng dụng. Thường thì một nhà thiết kế hay một lập trình viên sẽ muốn hiểu hiệu suất tại nhiều cấp độ nhỏ hơn cái là đã có sẵn từ những bộ đếm phần cứng. Trong những trường hợp này, công nghệ mô phỏng giống như những thứ được sử dụng cho các bộ xử lý được thiết kế đã sử dụng Nghiên cứu trường hợp 1: Chi phí chế tạo Chip Khái niệm minh họa trường hợp nghiên cứu này: Chi phí chế tạo Năng suất chế tạo Dung sai lỗi thông qua sự dư thừa Có nhiều yếu tố liên quan đến giá trị của chip máy tính. Mới, công nghệ nhỏ hơn cho việc tăng hiệu suất và thả trong khu vực chip được yêu cầu. Ở công nghệ nhỏ hơn, nó có thể giữ phần nhỏ hoặc thay thế phần cứng hơn trên chip để có được nhiều tính năng. Trong trường hợp nghiên cứu này, chúng tôi khám phá ra nhiều thiết kế khác nhau liên quan đến công nghệ chế tạo, diện tích và sự dư thừa ảnh hưởng đến chi phí sản xuất chip.

40 Chương 1: Giới thiệu chung Bảng 1.7 cung cấp các số liệu thống kê của chip liên quan đến ảnh hưởng của chi phí chip hiện nay. Trong các bài tập tiếp theo, bạn sẽ được tìm hiểu mối liên quan giữa AMD Opteron, chip xử lý đơn và Sun Niagara, chip 8 lõi. a. Sản lượng chip AMD Opteron? b. Sản lượng cho chip xử lý 8 lõi Sun Niagara? c. Tại sao chip Sun Niagara có sản lượng thấp hơn chip AMD Opteron, mặc dù chúng có cùng tỉ lệ khiếm khuyết? 1.2. Bạn đang cố hình dung có nên xây dựng cách chế tạo mới cho chip IBM Power5 hay không. Chi phí khoảng 1 tỉ USD để xây dựng cách chế tạo mới. Lợi ích của phương pháp sản xuất mới là bạn có thể bán giá đắt hơn 2 đến 3 lần giá của chip cũ. Chip mới có diện tích 186 mm 2, với tỉ lệ 0,7 lỗi/1 cm 2. Giả sử tấm wafer có đường kính 300 mm. Giả sử chi phí sản xuất tấm wafer trong những công nghệ khác là 500 USD. Trước đây bạn bán chip hơn 40% giá trị của chúng. Chip Kích cỡ tối đa (mm 2 ) Tỉ lệ lỗi dự kiến (/cm 2 ) Kích cỡ sản xuất (nm) Bóng bán dẫn (triệu) IBM Power , Sun Niagara 380 0, AMD Opteron 199 0, Bảng 1.7: Yếu tố chi phí sản xuất cho bộ xử lý hiện đại α=4. a. Chi phí của chip Power5 cũ? b. Chi phí của chip Power5 mới? c. Lợi nhuận trên mỗi chip Power5 cũ? d. Lợi nhuận trên mỗi chip Power5 mới? e. Nếu bạn bán được chip Power5 cũ mỗi tháng, bao lâu để bù đắp chi phí sản xuất mới? 1.3. Đồng nghiệp của bạn tại Sun đề nghị rằng, vì năng suất như vậy là quá nghèo nàn, nó giúp bán cả hai bộ chip, một là 6 bộ xử lý làm việc và một với 8 bộ xử lý làm việc. Chúng ta sẽ giải quyết vấn đề này bằng cách xem năng suất như là một xác suất không có lỗi xảy ra trong những khu vực nhất định cho những tỉ lệ khiếm khuyết. Đối với Niagara, tính toán xác suất dựa trên một lõi Niagara riêng biệt (Điều này có thể không hoàn toàn chính xác, vì phương trình dựa trên năng suất bằng thực nghiệm chứ không phải là một phép tính toán học có liên quan đến xác suất tìm lỗi trong mỗi lõi chip).

41 42 Kiến trúc máy tính tiên tiến a. Sử dụng phương trình năng suất cho tỉ lệ khuyết tật ở trên, xác suất mà mỗi lỗi xảy ra trên mỗi lõi Niagara duy nhất (Giả định các chip được chia đồng đều giữa các lõi) trong một chip 8 lõi? b. Xác suất mà mỗi lỗi sẽ xảy ra trên 1 hoặc 2 lõi (không nhiều hơn thế)? c. Xác suất mà lỗi không xảy ra trên lõi nào? d. Đưa ra câu trả lời của bạn cho phần (b) và (c), số lượng của chip 6 lõi bạn sẽ bán đối với mỗi chip 8 lõi? e. Nếu bán mỗi chip 8 lõi là 150 USD, mỗi chip 6 lõi là 100 USD, chip hỏng gây thất thu 80 USD, ngân sách nghiên cứu và phát triển của bạn là 200 triệu USD, chi phí thử nghiệm là 1,5 USD/1 chip, bạn phải bán bao nhiêu bộ xử lý để bù đắp chi phí? Nghiên cứu trường hợp 2: Điện năng tiêu thụ trong hệ thống máy tính Khái niệm minh họa trường hợp này: Luật Amdahl Dư thừa MTTF Điện năng tiêu thụ Điện năng tiêu thụ trong các hệ thống hiện đại phụ thuộc vào nhiều yếu tố, bao gồm các tần số xung nhịp chip, hiệu quả, tốc độ ổ đĩa, sử dụng ổ cứng và DRAM. Bài tập sau đây đề cập đến những tác động đến năng lượng, mà đưa ra thiết kế khác nhau và/hoặc sử dụng kịch bản sẵn có. Kiểu thành phần Sản phẩm Hiệu suất Năng lượng tiêu thụ Bộ xử lý Sun Niagara 8 lõi 1,2 GHz W peak Intel Pentium 4 2 GHz 48,9-66 W DRAM Kingston X64C3AD2 1 GB 184-pin 3,7 W Kingston D2N3 1 GB 240-pin 2,3 W Ổ cứng DiamondMax rpm 7,0 W read/seek, 2,9 W idle DiamondMax Plus rpm 7,9 W read/seek, 4,0 W idle Bảng 1.8: Điện năng tiêu thụ của một số linh kiện máy tính Bảng 1.8 trình bày điện năng tiêu thụ của một số thành phần trong hệ thống máy tính. Trong bài tập này, chúng ta sẽ tìm hiểu ảnh hưởng của ổ đĩa cứng tới điện năng tiêu thụ của hệ thống.

42 Chương 1: Giới thiệu chung 43 a. Giả sử tải tối đa cho mỗi thành phần, cung cấp năng lượng hiệu quả 70%, lượng điện năng mà trạm cung cấp điện cung cấp cho hệ thống với chip Sun Niagara 8 lõi, 2 GB 184-pin Kingston DRAM và hai ổ cứng rpm? b. Bao nhiêu điện năng mà ổ đĩa rpm tiêu thụ nếu nó có thời gian nghỉ chiếm 40%? c. Giả sử tốc độ quay của một ổ đĩa là yếu tố duy nhất mà ổ đĩa không nghỉ (đó là sự đơn giản hiệu suất của hiệu suất ổ đĩa). Nói cách khác, giả sử cùng những yêu cầu giống nhau, một ổ đĩa có tốc độ rpm sẽ đòi hỏi gấp đôi thời gian để đọc dữ liệu giống như ổ đĩa có tốc độ rpm. Tỉ lệ thời gian mà ổ đĩa có tốc độ rpm không làm việc để hiệu suất giao dịch tương đương phần (b)? 1.5. Một yếu tố quan trọng trong năng lượng của một cụm máy chủ là làm mát. Nếu nhiệt độ không được giảm bớt hiệu quả, quạt sẽ thổi khí nóng vào lại trong máy tính, không khí không được làm mát. Chúng ta sẽ xem xét làm thế nào đưa ra những quyết định làm mát cần thiết và giá cả của một hệ thống. Sử dụng bảng 1.8 cho tính toán năng lượng của bạn. a. Cửa sổ làm mát cho 1 rack giá khoảng USD và tiêu thụ 14 KW (trong phòng, chi phí cần thiết để đưa ra khỏi phòng). Bao nhiêu máy chủ với chip Sun Niagara 8 lõi, 1 GB 240-pin DRAM và 1 ổ đĩa đơn rpm mà bạn có thể làm mát với 1 cửa làm mát? b. Bạn đang xem xét việc cung cấp khắc phục lỗi cho ổ đĩa cứng của bạn. Số lượng đĩa gấp đôi RAID. Bây giờ có bao nhiêu hệ thống mà bạn có thể đặt trên một rack đơn với một hệ thống làm mát đơn. c. Trong mỗi rack đơn, chỉ số MTTF của mỗi bộ xử lý là giờ, của ổ cứng là 9 triệu giờ và của nguồn cung cấp là giờ. Cho mỗi rack với 8 bộ xử lý, chỉ số MTTF của rack là gì? Sun fire T2000 IBMx346 Nguồn (watt) SPECjbb (op/s) Nguồn (watt) SPECWeb (composite) Bảng 1.9: Điện năng/hiệu năng của Sun Bảng 1.9 đưa ra một so sánh về sức mạnh và hiệu suất cho một số tiêu chuẩn so sánh hai máy chủ: Sun Fire T2000 (trong đó sử dụng Niagara) và IBM x346 (sử dụng bộ vi xử lý Intel Xeon).

43 44 Kiến trúc máy tính tiên tiến a. Tính toán tỉ lệ hiệu suất/điện năng cho mỗi bộ vi xử lý trên mỗi tiêu chuẩn. b. Nếu năng lượng là mối quan tâm chính của bạn, bạn sẽ chọn cái gì? c. Đối với các tiêu chuẩn về cơ sở dữ liệu, các hệ thống rẻ hơn, chi phí thấp cho mỗi cơ sở dữ liệu hoạt động của hệ thống hiện có. Đây là phản trực: các hệ thống lớn hơn có thông lượng hơn, do đó, người ta có thể nghĩ rằng mua một hệ thống tuyệt đối lớn hơn về chi phí, nhưng chi phí thấp hơn cho mỗi hoạt động. Do đây là sự thật, tại sao bất kỳ cụm máy chủ lớn mua máy chủ đắt tiền? (Gợi ý: xem bài tập 1.4) Nghiên cứu nội bộ của công ty bạn cho thấy một hệ thống lõi đơn là đủ cho nhu cầu xử lý của bạn. Bạn đang khám phá, tuy nhiên, bạn có thể tiết kiệm điện bằng cách sử dụng lõi kép. a. Giả sử ứng dụng của bạn 100% có khả năng tương đương. Bạn có thể giảm tần số bao nhiêu để nhận được cùng một hiệu suất? b. Giả sử rằng điện áp có thể giảm tương ứng với tần số. Sử dụng phương trình trong mục 1.5. Có bao nhiêu năng lượng linh hoạt cho hệ thống lõi kép so với hệ thống lõi đơn? c. Bây giờ giả sử điện áp không thể giảm dưới 30% so với điện áp ban đầu. Điện áp này được gọi là điện áp sàn, bất kỳ điện áp thấp hơn sẽ mất khả năng tác động. Tỉ lệ tương đương cung cấp cho bạn một điện áp sàn? d. Sử dụng phương trình trong mục 1.5. Bao nhiêu năng lượng linh hoạt cho hệ thống lõi kép yêu cầu ở phần (a) so với hệ thống lõi đơn khi tính đến điện áp sàn? Nghiên cứu trường hợp 3: Chi phí cho các máy chủ web Khái niệm cơ bản cho trường hợp nghiên cứu này: TPCC Máy chủ web đáng tin cậy MTTF Tập hợp các bài tập về chi phí máy chủ web không đáng tin cậy. Dữ liệu có trong 2 phần: một cho các thống kê khác nhau đối với Gap.com. Một là Amazon.com, nhưng có số liệu thống kê tốt hơn trong những ngày doanh số bán ra cao Ngày 24/8/2005, 3 website quản lý bởi Gap-Gap.com, OldNavy.com và BananaRepublic.com đã được dừng tạm thời để nâng cấp. Những trang web này đã gần như không thể truy cập trong 2 tuần tiếp theo. Sử dụng các số liệu thống kê trong bảng 1.10, trả lời câu hỏi dưới đây, cái gì dựa trên một phần của các giả thuyết giả định?

44 Chương 1: Giới thiệu chung 45 a. Trong quý III năm 2005, doanh thu của Gap đạt 3,9 tỷ USD. Các trang web được đưa vào hoạt động trở lại vào ngày 07/9/2005. Giả sử tổng doanh thu bán hàng trực tuyến mỗi ngày là 1,4 triệu USD, mọi thứ khác vẫn không đổi. Doanh thu ước tính của Gap trong quý III năm 2005? b. Nếu thời gian dừng tạm thời xảy ra trong quý IV, bạn ước tính chi phí thời gian dừng là bao nhiêu? Công ty Khoảng thời gian Doanh thu Kiểu Gap Quý III năm tỷ USD Sales Quý IV năm ,9 tỷ USD Sales Quý III năm ,9 tỷ USD Sales Quý IV năm ,8 tỷ USD Sales Quý III năm triệu USD Online Sales Quý III năm triệu USD Online Sales Amazon Quý III năm ,86 tỷ USD Sales Quý IV năm ,98 tỷ USD Sales Quý IV năm triệu USD Items sold 12 tháng 12 năm ,6 triệu USD Items sold Bảng 1.10: Thống kê về doanh số bán hàng cho Gap và Amazon. c. Khi trang web được đưa vào hoạt động trở lại, số lượng người dùng truy cập vào cùng lúc đã được hạn chế. Tưởng tượng rằng số lượng người dùng muốn truy cập vào đã được giới hạn đến 50%. Giả sử chi phí mua và cài đặt máy chủ là USD. Có bao nhiêu máy chủ họ có thể mua và cài đặt với số tiền bị thất thu? d. Gap.com đã có 2,6 triệu người truy cập vào tháng 7 năm 2004, trung bình 1 người dùng xem 8,4 trang/ngày ở Gap.com. Giả sử máy chủ cao cấp ở Gap.com chạy trên SQL server, với một tiêu chuẩn TPCC ước tính chi phí 5,38 USD trên một giao dịch. Chi phí bao nhiêu để họ hỗ trợ mua bán trực tuyến ở Gap.com? 1.9. Chỉ số MTTF là biện pháp đáng tin cậy. Bây giờ chúng ta sẽ xem xét các hệ thống khác nhau và cách đưa ra các quyết định cho sự tin cậy của họ. Tham khảo bảng 1.10 cho thống kê của công ty. a. Chúng ta có một bộ xử lý đơn với 1 FIT khoảng 100. Chỉ số MTTF của hệ thống? b. Nếu mất 1 ngày để chạy lại hệ thống, hệ thống sẵn sàng khi nào?

45 46 Kiến trúc máy tính tiên tiến Tưởng tượng rằng chính phủ cắt giảm chi phí, sẽ xây dựng 1 siêu máy tính với một bộ xử lý giả rẻ trong bài tập 1.9 cho một hệ thống với mục đích đáng tin cậy. Chỉ số MTTF của hệ thống bộ xử lý là gì? Giả sử rằng chỉ cần một lỗi, cả hệ thống sẽ bị lỗi? Trong 1 cụm máy chủ sử dụng cho Amazon hay Gap, 1 lỗi duy nhất không làm sập hệ thống. Thay vào đó, nó sẽ giảm request trong một thời điểm. a. Nếu một công ty có máy tính, nó chỉ xảy ra sự cố nghiêm trọng khi 1/3 số máy chủ bị hỏng, chỉ số MTTF của hệ thống là gì? b. Nếu chi phí phụ là USD, trên mỗi máy tính, để tăng gấp đôi chỉ số MTTF, liệu đây có phải là một hướng kinh doanh tốt? Chỉ ra công việc của bạn Nghiên cứu trường hợp 4: Hiệu suất Khái niệm cơ bản cho trường hợp này: Ý nghĩa số học Ý nghĩa hình học Trạng thái tương đương Luật Amdahl Trọng lượng trung bình Trong phần bài tập này, ta sẽ tìm hiểu bảng 1.11, trình bày về hiệu suất của bộ xử lý được chọn và một là được hư cấu (bộ xử lý X), được báo cáo bởi Mỗi hệ thống, hai tiêu chuẩn được sử dụng. Một tiêu chuẩn được sử dụng cho hệ thống phân cấp bộ nhớ, cho trạng thái tốc độ của bộ nhớ. Một tiêu chuẩn khác, Dhrystone, là một tiêu chuẩn chuyên sâu cho CPU, không sử dụng cho hệ thống bộ nhớ. Cả hai tiêu chuẩn được chọn lọc để đưa ra những chỉ thị cho hiệu suất của bộ nhớ và CPU Thực hiện các tính toán trên các dữ liệu thô để tìm hiểu phương pháp màu sắc mà các kết luận có thể đạt được. a. Tạo một bảng thể hiện như bảng 1.11, ngoại trừ thể hiện kết quả như bình thường hóa với Pentium D cho mỗi tiêu chuẩn. b. Tính toán trung bình cộng hiệu suất của mỗi bộ xử lý. Sử dụng cả tính toán hiệu suất trung bình và hiệu suất bình thường trong phần (a). c. Trả lời cho phần (b), bạn có thể rút ra kết luận về tính mâu thuẫn của hiệu suất tương đối của các bộ xử lý khác nhau không?

46 Chương 1: Giới thiệu chung 47 d. Tính toán ý nghĩa hình học của hiệu suất thông thường của bộ xử lý kép và ý nghĩa hình học của hiệu suất thông thường của bộ xử lý đơn theo tiêu chuẩn Dhrystone. e. Đồ thị 2D phân tán với trục x là tiêu chuẩn bộ nhớ Dhrystone và trục y là bộ nhớ chuẩn. f. Ý tưởng của bạn trong phần (e), trong điều kiện nào, bộ vi xử lý kép đạt được hiệu suất. Giải thích, kiến thức của bạn về kiến trúc và xử lý song song. Tại sao có kết quả này? Tưởng tượng rằng công ty bạn đang xem xét việc sử dụng hệ thống xử lý đơn xử lý kép. Bảng 1.11 cho biết hiệu suất trên 2 bộ tiêu chuẩn - một tiêu chuẩn bộ nhớ và một tiêu chuẩn bộ xử lý. Bạn biết rằng ứng dụng của bạn mất 40% thời gian để tính toán bộ nhớ trung tâm và 60% thời gian cho tính toán của bộ xử lý trung tâm. a. Tính toán thời gian thực hiện của tiêu chuẩn. Chip lõi Tần số xung nhịp (MHz) Hiệu suất bộ nhớ Hiệu suất Dhrystone Athlon 64 X Pentium EE Pentium D Athlon 64 X Pentium Athlon Pentium Processor X Bảng 1.11: Hiệu suất của bộ xử lý nói chung trên hai tiêu chuẩn. b. Tốc độ sẽ tăng bao nhiêu nếu bạn chuyển từ sử dụng Pentium sang Athlon 64 X trong một bộ ứng dụng chuyên sâu cho CPU. c. Tỉ lệ dung lượng bộ nhớ cho tính toán hiệu suất của bộ xử lý để hiệu suất của Pentium tương đương với Pentium D 820? Công ty của bạn vừa mới mua 1 bộ xử lý Pentium kép. Bạn được giao nhiệm vụ tối ưu hóa phần mềm cho bộ xử lý. Bạn sẽ chạy 2 ứng dụng trên bộ xử lý Pentium kép này, nhưng tài nguyên được yêu cầu không bằng nhau. Ứng dụng đầu tiên tiêu thụ 80% tài nguyên, ứng dụng thứ hai tiêu thụ 20 % tài nguyên.

47 48 Kiến trúc máy tính tiên tiến a. 40% ứng dụng đầu tiên là có tính tương đương, tốc độ sẽ tăng được bao nhiêu nếu chạy độc lập? b. 99% ứng dụng thứ hai là trạng thái tương đương, tốc độ tăng bao nhiêu nếu ứng dụng chạy độc lập? c. 40% ứng dụng đầu tiên là có trạng thái tương đương, tốc độ tổng thể tăng được bao nhiêu nếu bạn tương đương hóa nó? d. 99% ứng dụng thứ hai là trạng thái tương đương, tốc độ tổng thể tăng được bao nhiêu?

48 Chương 2 KHOÁI XÖÛ LYÙ SONG SONG ÔÛ MÖÙC LEÄNH MAÙY 2.1. Kỹ thuật đường ống và xử lý song song ở mức lệnh máy Kỹ thuật đường ống là gì? Và cách triển khai kỹ thuật đường ống Tất cả bộ xử lý kể từ năm 1985 đều sử dụng kỹ thuật đường ống chồng lớp thực hiện những lệnh và để cải thiện tốc độ thực hiện. Khả năng chồng lớp giữa những lệnh này được gọi là khả năng thực hiện lệnh song song (ILP), từ đó các lệnh có thể được đánh giá song song như nhau. Chúng ta sẽ bắt đầu chương này bằng việc xem xét sự hạn chế được áp đặt bởi dữ liệu và việc kiểm soát những rủi ro, sau đó chuyển sang chủ đề về việc tăng khả năng hoạt động của trình biên dịch và bộ xử lý để khai thác về vấn đề song song. Những phần này giới thiệu một số lớn những khái niệm trong suốt chương này và chương kế tiếp. Đôi khi một vài khái niệm cơ bản hơn trong chương này có thể hiểu mà không cần tất cả những khái niệm trong hai phần đầu, những khái niệm cơ bản này thì quan trọng cho những phần sau của chương này cũng như chương 3. Có thể phân chia ra hai phương pháp lớn để tìm hiểu về ILP: một cách là dựa vào phần cứng để tìm ra và khai thác vấn đề song song theo trạng thái động, còn một cách là dựa vào kỹ thuật phần mềm để tìm ra song song, dựa vào thời gian biên dịch tĩnh. Những bộ xử lý sử dụng động, dựa vào phương pháp phần cứng, bao gồm dòng Intel Pentium, chiếm ưu thế trên thị trường; những dòng sử dụng phương pháp tĩnh, bao gồm Intel Itanium, thì được sử dụng hạn chế hơn trong khoa học hoặc trong những môi trường ứng dụng cụ thể. Trong một vài năm qua, nhiều kỹ thuật phát triển cho một cách tiếp cận đã được khai thác trong phạm vi một mẫu thiết kế dựa chủ yếu vào cái khác. Chương này giới thiệu về những khái niệm cơ bản và cả hai phương pháp nêu trên. Chương kế sẽ tập trung vào những vấn đề then chốt của những hạn chế trong việc khai thác ILP. Trong phần này, chúng ta sẽ thảo luận về những điểm đặc trưng của các chương trình và bộ xử lý, giới hạn số lượng song song có thể được lợi dụng trong những lệnh, cũng như những bản vẽ quan trọng giữa cấu trúc chương trình và cấu trúc phần cứng, đó là chìa khóa để hiểu rằng liệu một thuộc tính chương trình có thực sự bị giới hạn hoạt động hay không và dưới hoàn cảnh nào.

49 50 Kiến trúc máy tính tiên tiến Giá trị của chỉ số CPI (chu kỳ trên lệnh) cho một bộ xử lý đường ống là tổng của chỉ số CPI cơ bản với tất cả những yếu tố góp phần khác từ những trì hoãn: Chỉ số đường ống CPI = chỉ số đường ống CPI lý tưởng + những trì hoãn về cấu trúc + những trì hoãn về rủi ro dữ liệu + những trì hoãn điều khiển. Chỉ số đường ống CPI lý tưởng là thước đo hiệu suất tối đa có thể đạt được bằng việc thi hành. Bằng cách giảm mỗi số hạng bên phải, chúng ta có thể tối thiểu được chỉ số đường ống CPI một cách tổng thể hoặc tăng chỉ chỉ số IPC (số lệnh trên xung đồng hồ). Phương trình trên cho phép chúng ta mô tả những kỹ thuật khác nhau bằng cách giảm thành phần nào đó trong chỉ số CPI tổng thể. Kỹ thuật Chuyển tiếp và bỏ qua (bypassing) Những nhánh làm trễ và lập lịch nhánh đơn giản Lập lịch động cơ bản (bảng ghi hoạt động) Lập lịch động bằng việc đổi tên Sự dự báo nhánh Đưa ra nhiều chỉ lệnh mỗi chu kỳ Sự đầu cơ phần cứng Sự định hướng bộ nhớ động Mở rộng vòng lặp Lập lịch đường ống biên dịch cơ bản Phân tích sự phụ thuộc trình biên dịch, đường ống phần mềm, theo dõi lập lịch Hỗ trợ phần cứng cho trình biên dịch Giảm Những trì hoãn rủi ro dữ liệu tiềm ẩn Những trì hoãn rủi ro về điều khiển Những trì hoãn dữ liệu rủi ro từ những phụ thuộc thực Những trì hoãn rủi ro dữ liệu và những trì hoãn từ sự phi phụ thuộc và các phụ thuộc đầu ra Những trì hoãn điều khiển Chỉ số CPI lý tưởng Những trì hoãn rủi ro dữ liệu và rủi ro điều khiển Những trì hoãn rủi ro dữ liệu với bộ nhớ Những trì hoãn rủi ro điều khiển Những trì hoãn rủi ro dữ liệu Chỉ số CPI lí tưởng, những trì hoãn rủi ro dữ liệu Chỉ số CPI lý tưởng, những trì hoãn rủi ro dữ liệu, những trì hoãn rủi ro nhánh. Bảng 2.1: Những kỹ thuật chủ yếu với các thành phần trong phương trình CPI mà những kỹ thuật này ảnh hưởng đến. Bảng 2.1 chỉ ra những kỹ thuật mà chúng ta phân tích trong chương này. Trong chương này chúng ta sẽ hiểu những kỹ thuật mà chúng ta giới thiệu là để làm giảm chỉ số đường ống lý tưởng CPI, điều đó có thể làm tăng tầm quan trọng của việc giải quyết những rủi ro.

50 Chương 2: Khối xử lý song song ở mức lệnh máy 51 Khả năng thực hiện lệnh song song là gì? Tất cả các kỹ thuật trong chương này khai thác khả năng thực hiện song song giữa các lệnh. Các số lượng song song có sẵn trong vòng một khối cơ bản - một dãy mã đi theo đường thẳng không có nhánh vào ngoại trừ một lối vào và không có nhánh ra ngoại trừ lối ra - khá nhỏ. Đối với các chương trình điển hình MIPS, trung bình tần suất số nhánh động thường vào khoảng giữa 15% và 25%, nghĩa là giữa ba và sáu lệnh thì thực hiện giữa một cặp nhánh. Vì những lệnh này có thể phụ thuộc lẫn nhau, nên số lượng chồng lớp chúng ta khai thác trong một khối cơ bản có thể ít hơn kích thước trung bình khối cơ bản. Để có được hiệu suất cải tiến đáng kể, chúng ta phải khai thác ILP giữa nhiều khối cơ bản. Cách đơn giản và phổ biến nhất để tăng ILP là khai thác song song giữa các lần lặp của một vòng lặp. Loại hình song song này thường được gọi là khả năng lặp song song. Đây là một ví dụ đơn giản của một vòng lặp, vòng lặp gồm 2 mảng chứa phần tử, đây là cấu trúc song song hoàn chỉnh: For (i=1; i<=1000; i=i+1) x[i] = x[i] + y[i]; Mỗi lần lặp của vòng lặp có thể trùng với bất kỳ lần lặp nào khác, mặc dù mỗi lần lặp có ít hoặc không có cơ hội để chồng lên nhau. Có một số kỹ thuật chúng ta sẽ xem xét để chuyển đổi từ loop-level parallelism thành instruction-level parallelism. Về cơ bản, chẳng hạn như kỹ thuật hoạt động bằng cách mở rộng vòng lặp hoặc bằng trình biên dịch tĩnh (như trong phần tiếp theo) hoặc bằng phần cứng theo phương pháp động (như trong mục 2.5 và 2.6). Một phương pháp thay thế quan trọng cho việc khai thác khả năng lặp song song là sử dụng những chỉ lệnh vectơ. Một chỉ lệnh vectơ khai thác cấp dữ liệu song song bằng cách làm các phép toán trên các mục dữ liệu song song. Ví dụ, đoạn mã ở trên có thể thực hiện 4 chỉ lệnh trên một số bộ vi xử lý vectơ: hai chỉ lệnh để nạp các vectơ x và y từ bộ nhớ, một chỉ lệnh thì thêm vào hai vectơ và một chỉ lệnh để lưu trữ lại kết quả vectơ. Tất nhiên, những chỉ lệnh sẽ được truyền đi trên ống và có thời gian chờ tương đối dài, nhưng những độ trễ này có thể được chồng chéo. Mặc dù sự phát triển của các ý tưởng vectơ đi trước rất nhiều các kỹ thuật khai thác ILP, những bộ xử lý khai thác ILP đã gần như hoàn toàn thay thế các bộ vi xử lý dựa trên vectơ trong thị trường bộ xử lý đa mục đích. Tuy nhiên, những bộ lệnh vectơ đã cho thấy một sự phục hưng, ít nhất cho mục đích đồ họa, xử lý tín hiệu kỹ thuật số và các ứng dụng đa phương tiện.

51 52 Kiến trúc máy tính tiên tiến Các khó khăn khi sử dụng đường ống và cách khắc phục Những phụ thuộc và những rủi ro về dữ liệu Việc xác định một lệnh phụ thuộc vào một lệnh khác như thế nào thì rất quan trọng để xác định có bao nhiêu sự song song tồn tại trong một chương trình và làm thế nào mà sự song song đó có thể được khai thác. Đặc biệt, để khai thác khả năng thực hiện lệnh song song chúng ta phải xác định những lệnh nào có thể được thực hiện song song. Nếu có hai lệnh là song song, chúng có thể thực hiện đồng thời trong một đường ống với độ sâu tùy ý mà không gây ra bất kỳ ảnh hưởng nào, giả sử các đường ống này có đủ nguồn lực (và do đó không tồn tại những nguy cơ cấu trúc). Nếu là hai lệnh phụ thuộc, thì chúng không song song và phải được thực hiện trong trật tự, mặc dù chúng thường có thể được chồng chéo từng phần. Điều quan trọng trong cả hai trường hợp là để xác định xem liệu một lệnh có phụ thuộc vào lệnh khác hay không. Những sự phụ thuộc dữ liệu Có ba loại phụ thuộc khác nhau: phụ thuộc dữ liệu (còn gọi là phụ thuộc dữ liệu thực), phụ thuộc tên và phụ thuộc điều khiển. Một lệnh j là dữ liệu phụ thuộc vào lệnh i nếu chứa một trong hai điều sau đây: Lệnh i tạo ra một kết quả có thể được sử dụng bởi lệnh j, hoặc Lệnh j là dữ liệu phụ thuộc vào lệnh k và lệnh k là dữ liệu phụ thuộc vào lệnh i. Điều kiện thứ hai chỉ đơn giản nói rằng một lệnh phụ thuộc vào lệnh khác nếu tồn tại một chuỗi các phụ thuộc của loại đầu tiên giữa hai lệnh. Chuỗi phụ thuôc này có thể chỉ cần là toàn bộ chương trình. Lưu ý rằng một sự phụ thuộc trong vòng một chỉ dẫn duy nhất (chẳng hạn như ADDD R1, R1, R1) không được coi là một phụ thuộc. Ví dụ, hãy xem xét đoạn mã MIPS sau đây nói về việc tăng các giá trị của vectơ trong bộ nhớ (bắt đầu từ 0(R1) và với phần tử cuối cùng 8(R2)), bằng một đại lượng vô hướng trong thanh ghi F2. (Để đơn giản, trong suốt chương này, những ví dụ của chúng ta bỏ qua những tác động của các nhánh trễ). Loop: L.D F0,0(R1) ;F0 = phần tử mảng ADD.D F4,F0,F2 ;thêm đại lượng vô hướng vào F2 S.D F4,0(R1) ;lưu trữ kết quả DADDUI R1,R1,#-8 ;độ giảm con trỏ 8 bytes BNE R1,R2,Loop ;nhánh R1!=R2 Các phụ thuộc dữ liệu trong đoạn mã này liên quan đến hai dấu chấm động:

52 Chương 2: Khối xử lý song song ở mức lệnh máy 53 Loop: L.D F0,0(R1) ;F0= phần tử mảng và dữ liệu số nguyên: ADD.D F4, F0,F2 ;thêm đại lượng vô hướng vào F2 S.D F4,0(R1) ;lưu trữ kết quả DADDIU R1,R1,-8 ;độ giảm con trỏ ;8 bytes (per DW) BNE R1,R2,Loop ;nhánh R1!=R2 Cả hai chuỗi phụ thuộc ở trên, được thể hiện bởi các mũi tên, có mỗi lệnh phụ thuộc vào lệnh trước đó. Những mũi tên ở đây trong những ví dụ thể hiện thứ tự phải được bảo đảm cho việc thi hành đúng. Mũi tên chỉ từ một lệnh phải đi trước một lệnh khác, mà đầu mũi tên đó chỉ tới. Nếu hai lệnh là dữ liệu phụ thuộc, thì chúng không thể thực hiện đồng thời hoặc được chồng lấp hoàn toàn. Những sự phụ thuộc hàm ý rằng sẽ có một chuỗi một hoặc nhiều những rủi ro về dữ liệu giữa hai lệnh. Việc thực hiện các lệnh đồng thời sẽ tạo ra những khóa trong đường ống lệnh của bộ xử lý (và chiều sâu một đường ống dài hơn khoảng cách giữa các lệnh trong chu kỳ) để phát hiện rủi ro và sự chậm trễ, do đó làm giảm hoặc loại bỏ sự chồng chéo. Trong một bộ xử lý mà không có những khóa dựa vào việc lập lịch của trình biên dịch, thì trình biên dịch không thể lập lịch những lệnh phụ thuộc theo cách mà chúng hoàn toàn chồng chéo lên nhau, vì thế chương trình sẽ không thực hiện đúng. Sự hiện diện của một sự phụ thuộc dữ liệu trong một dãy lệnh phản ánh một sự phụ thuộc dữ liệu trong mã nguồn từ đó dãy lệnh được tạo ra. Hiệu quả của sự phụ thuộc dữ liệu ban đầu phải được bảo đảm. Những sự phụ thuộc là một đặc tính của chương trình. Liệu những kết quả của một sự phụ thuộc được đưa ra trong một rủi ro thực sự có bị phát hiện hay không và liệu rủi ro thực sự đó gây ra một sự ngưng trì hoãn có phải là đặc tính của tổ chức đường ống hay không. Sự khác biệt này là rất quan trọng để hiểu làm thế nào mà khả năng thực hiện lệnh song song được khai thác. Một sự phụ thuộc dữ liệu truyền tải ba điều: (1) khả năng của một rủi ro, (2) những kết quả phải được tính toán theo thứ tự và (3) mức giới hạn bao nhiêu song song có thể được khai thác. Những giới hạn như vậy sẽ được khám phá trong Chương 3. Vì một sự phụ thuộc dữ liệu có thể giới hạn số lượng khả năng thực hiện lệnh song song chúng ta có thể khai thác, nên tập trung chủ yếu của chương này là khắc phục những hạn chế đó. Một sự phụ thuộc có thể được khắc phục theo hai cách

53 54 Kiến trúc máy tính tiên tiến khác nhau: duy trì sự phụ thuộc nhưng tránh gây nguy hiểm và loại trừ một sự phụ thuộc bằng cách biến đổi mã. Lập lịch một đoạn mã là phương pháp chính được sử dụng để tránh gây rủi ro mà không thay đổi một sự phụ thuộc và việc lập lịch như vậy có thể được thực hiện bởi trình biên dịch và phần cứng. Giá trị dữ liệu có thể bắt nguồn giữa các lệnh hoặc thông qua các thanh ghi hoặc thông qua vị trí bộ nhớ. Khi dòng dữ liệu xảy ra trong một thanh ghi, việc phát hiện sự phụ thuộc là đơn giản vì các tên thanh ghi được ấn định trong các lệnh, mặc dù nó sẽ phức tạp hơn khi có những nhánh can thiệp và sự chính xác thì liên quan đến sức mạnh trình biên dịch hoặc phần cứng có được bảo toàn. Những phụ thuộc bắt nguồn thông qua vị trí bộ nhớ thì có nhiều khó khăn để phát hiện, vì hai địa chỉ có thể là cùng một vị trí nhưng nhìn khác nhau: Ví dụ, 100 (R4) và 20 (R6) có thể là những địa chỉ bộ nhớ giống hệt nhau. Ngoài ra, những địa chỉ thực trong việc nạp và lưu trữ có thể thay đổi từ một sự thi hành lệnh này đến một sự thi hành lệnh khác, việc phát hiện một phụ thuộc sẽ phức tạp hơn. Trong chương này, chúng tôi kiểm tra phần cứng để phát hiện những phụ thuộc dữ liệu liên quan đến vị trí bộ nhớ, nhưng chúng ta sẽ thấy rằng những kỹ thuật này cũng có những hạn chế. Các kỹ thuật biên dịch để phát hiện những phụ thuộc đó thì quan trọng trong việc phát hiện ra vòng lặp cấp song song. Những phụ thuộc tên Loại thứ hai của sự phụ thuộc là phụ thuộc tên. Một phụ thuộc tên xảy ra khi hai lệnh sử dụng cùng một thanh ghi hoặc vị trí bộ nhớ, được gọi là một tên, nhưng không bắt nguồn từ dữ liệu giữa các chỉ lệnh 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 chỉ lệnh j theo tuần tự chương trình: 1. Sự không phụ thuộc giữa chỉ lệnh i và j xảy ra khi chỉ lệnh j ghi vào thanh ghi hoặc vị trí bộ nhớ đó cái mà chỉ lệnh i sẽ đọc. Các trật tự ban đầu phải được bảo đảm để chắc rằng i đọc đúng giá trị. Trong ví dụ trước, có một sự không phụ thuộc giữa S.D và DADDIU trong thanh ghi R1. 2. Sự phụ thuộc vào việc xuất dữ liệu xảy ra khi lệnh i và j ghi vào cùng một thanh ghi hoặc vị trí bộ nhớ. Trật tự giữa các lệnh phải được bảo đảm để chắc rằng giá trị cuối cùng được ghi ra tương ứng với lệnh j. Sự không phụ thuộc và phụ thuộc đầu ra đều là những phụ thuộc tên, đối lập với những phụ thuộc dữ liệu thực, vì không có giá trị được gửi đi giữa các lệnh. Vì một phụ thuộc tên không phải là một sự phụ thuộc thật, nên những lệnh liên quan vào sự phụ thuộc tên có thể thực thi đồng thời hoặc được sắp xếp lại, nếu tên (số thanh ghi hoặc vị trí bộ nhớ) đã sử dụng trong các lệnh được thay đổi thì những lệnh này sẽ không xung đột với nhau.

54 Chương 2: Khối xử lý song song ở mức lệnh máy 55 Việc đổi tên này có thể được thực hiện dễ dàng hơn với các toán hạng về thanh ghi, nó được gọi là sự đổi tên thanh ghi. Sự đổi tên thanh ghi có thể được thực hiện bằng phương pháp tĩnh bởi trình biên dịch hoặc động bởi phần cứng. Trước khi miêu tả sự phụ thuộc phát sinh từ các nhánh, chúng ta hãy xem xét mối quan hệ giữa những sự phụ thuộc và những rủi ro dữ liệu trong đường ống Những rủi ro dữ liệu Một nguy hiểm được tạo ra bất cứ khi nào có một sự phụ thuộc giữa các lệnh và chúng thì gần như đủ để sự chồng chéo trong quá trình thực hiện sẽ thay đổi thứ tự tiếp cận với các toán hạng tham gia vào sự phụ thuộc. Do sự phụ thuộc, chúng ta phải đảm bảo được điều gọi là trật tự chương trình, có nghĩa là, những chỉ lệnh sẽ thực hiện theo thứ tự nếu chúng đã thực hiện một cách liên tục một lần tại một thời điểm xác định bởi chương trình nguồn ban đầu. Mục tiêu của những kỹ thuật phần mềm và phần cứng là để khai thác song song bằng cách bảo đảm trật tự chương trình nơi mà nó ảnh hưởng đến kết quả của chương trình. Phát hiện và tránh những rủi ro đảm bảo rằng trật tự cần thiết của chương trình được bảo toàn. Những rủi ro dữ liệu, có thể được phân thành một trong ba loại, tùy theo thứ tự của những truy xuất đọc và ghi trong những lệnh. Theo quy ước, các rủi ro được đặt tên theo thứ tự trong chương trình mà phải được bảo toàn bằng các đường ống. Hãy xem xét hai chỉ lệnh i và j, với i trước j theo thứ tự chương trình. Các rũi ro dữ liệu có thể là: RAW (Đọc sau khi ghi) - j cố gắng để đọc từ một nguồn trước khi i ghi vào nó, vì vậy j lấy giá trị cũ không chính xác. Rủi ro này là loại phổ biến nhất và tương ứng với một sự phụ thuộc dữ liệu thật. Trật tự chương trình phải được bảo toàn để đảm bảo j nhận được giá trị từ i. WAW (ghi sau khi ghi) - j cố gắng để ghi một toán hạng trước khi nó được ghi bởi i. Việc ghi kết thúc được thực hiện theo thứ tự sai, để lại các giá trị được ghi bởi i hơn là giá trị được ghi bởi j ở đích đến. Rủi ro này tương ứng với một sự phụ thuộc đầu ra. Rủi ro WAW chỉ có mặt trong những đường ống mà việc ghi nhiều nhiều hơn mức độ một đường ống hoặc cho phép một lệnh để tiến hành ngay cả khi một chỉ dẫn trước đó bị ngừng lại. WAR (ghi sau khi đọc) - j cố gắng ghi tới một điểm đến trước khi nó được đọc bởi i, vì vậy i lấy giá trị mới không đúng. Rủi ro này phát sinh từ một không phụ thuộc. Những rủi ro WAR không thể xảy ra ở hầu hết các vấn đề đường ống tĩnh - thậm chí những đường sâu hơn hay những đường ống dấu chấm động - bởi vì tất cả việc đọc diễn ra sớm (trong ID) và tất cả việc ghi diễn ra trễ (trong WB). Một rủi ro WAR xảy ra hoặc khi có một số lệnh ghi

55 56 Kiến trúc máy tính tiên tiến kết quả sớm vào đường ống lệnh và các lệnh khác thì đọc từ nguồn trễ trong đường ống hoặc những lệnh được sắp xếp lại, như chúng ta sẽ thấy trong chương này. Lưu ý rằng RAR (đọc sau khi đọc) thì không rủi ro Những phụ thuộc điều khiển Loại cuối cùng của sự phụ thuộc là sự phụ thuộc điều khiển. Một phụ thuộc điều khiển quyết định trật tự của một lệnh, i, đối với một nhánh lệnh thì lệnh i được thực hiện theo trật tự chương trình đúng và chỉ khi nó cần. Mọi lệnh, ngoại trừ những lệnh trong khối cơ bản đầu tiên của chương trình, là phụ thuộc điều khiển vào một số tập nhánh và, nói chung, những phụ thuộc điều khiển này phải được bảo toàn để đảm bảo trật tự chương trình. Một trong những ví dụ đơn giản nhất về một sự phụ thuộc điều khiển là sự phụ thuộc của những câu lệnh trong phần then của câu lệnh if trong nhánh. Ví dụ, trong đoạn mã sau đây: If p1 { S1; }; If p2 { S2; } S1 là điều khiển phụ thuộc vào p1 và S2 là điều khiển phụ thuộc vào p2 nhưng không phải p1. Nói chung, có hai điều kiện ràng buộc được áp đặt bởi những phụ thuộc điều khiển: 1. Một lệnh là điều khiển phụ thuộc vào một nhánh không thể di chuyển trước nhánh để việc thi hành nó không còn được điều khiển bởi nhánh. Ví dụ, chúng ta không thể lấy một lệnh từ phần then của một câu lệnh if và di chuyển nó trước câu lệnh if. 2. Một lệnh không phải là điều khiển phụ thuộc vào một nhánh không thể di chuyển sau nhánh để việc thi hành của nó được điều khiển bởi nhánh. Ví dụ, chúng tôi không thể lấy một câu lệnh trước câu lệnh if và di chuyển nó vào phần then. Khi những bộ xử lý đảm bảo trật tự chương trình nghiêm ngặt, chúng đảm bảo những phụ thuộc điều khiển cũng được bảo toàn. Chúng ta có thể thực hiện các lệnh không nên được thực hiện, tuy nhiên, cách đó vi phạm các phụ thuộc điều khiển, nếu chúng ta có thể làm như vậy mà không ảnh hưởng đến tính đúng đắn của chương trình. Phụ thuộc điều khiển không phải là đặc tính quan trọng mà phải được bảo đảm. Thay vào đó, hai đặc tính quan trọng đối với sự đúng đắn của chương trình - và thường được đảm bảo bằng việc duy trì sự phụ thuộc dữ liệu và điều khiển - là những trạng thái ngoại lệ và là dòng dữ liệu.

56 Chương 2: Khối xử lý song song ở mức lệnh máy 57 Việc bảo đảm các trạng thái ngoại lệ có nghĩa là bất kỳ thay đổi trong trật tự của việc thi hành lệnh cũng không làm thay đổi những ngoại lệ được nêu lên trong chương trình. Một cách dễ hiểu điều này nghĩa là việc sắp xếp lại thứ tự thi hành lệnh không gây ra bất kỳ trường hợp ngoại lệ mới trong chương trình. Một ví dụ đơn giản cho thấy cách duy trì những phụ thuộc điều khiển và dữ liệu có thể ngăn ngừa những tình huống như vậy. Hãy xem xét đoạn mã này: L1: DADDU BEQZ LW R2, R3, R4 R2, L1 R1, 0 (R2) Trong trường hợp này, dễ thấy rằng nếu chúng ta không duy trì sự phụ thuộc dữ liệu liên quan đến R2, chúng ta có thể thay đổi kết quả của chương trình. Chỉ lệnh nạp vào này có thể gây ra một ngoại lệ bảo vệ bộ nhớ. Chú ý rằng không có sự phụ thuộc dữ liệu nào ngăn cản chúng ta khỏi việc hoán đổi giữa BEQZ và LW, chỉ có sự phụ thuộc điều khiển. Để cho phép chúng ta sắp xếp lại các lệnh này (và vẫn bảo toàn được sự phụ thuộc dữ liệu), chúng ta chỉ cần bỏ qua những trường hợp ngoại lệ khi nhánh được thực hiện. Trong mục 2.6, chúng ta sẽ xem xét một kỹ thuật phần cứng, sự tích lũy, cho phép chúng ta khắc phục vấn đề ngoại lệ này. Thuộc tính thứ hai được bảo toàn bằng cách duy trì phụ thuộc dữ liệu và phụ thuộc điều khiển là dòng dữ liệu. Dòng dữ liệu là lưu lượng thực tế của những giá trị dữ liệu trong số các lệnh dùng để đưa ra các kết quả và sử dụng chúng. Những nhánh tạo ra dòng dữ liệu động, vì chúng cho phép nguồn dữ liệu cho một chỉ lệnh được đưa ra đến từ nhiều điểm. Nói cách khác, nó không đủ để duy trì sự phụ thuộc dữ liệu vì một lệnh có thể là dữ liệu phụ thuộc vào nhiều hơn một sự việc xảy ra trước. Trật tự chương trình thì quyết định biến cố trước đó sẽ thực sự mang lại một giá trị dữ liệu nào đó cho một lệnh. Trật tự chương trình được đảm bảo bằng việc duy trì những phụ thuộc điều khiển. Ví dụ, hãy xem xét các đoạn mã sau: DADDU BEQZ DSUBU L:... OR R1, R2, R3 R4, L R1, R5, R6 R7, R1, R8 Trong ví dụ này, giá trị của R1 được sử dụng bởi lệnh OR phụ thuộc vào việc liệu nhánh này có được thực hiện hay không. Một mình phụ thuộc dữ liệu là không đủ để bảo toàn được tính đúng đắn. Lệnh OR ở đây là dữ liệu phụ thuộc

57 58 Kiến trúc máy tính tiên tiến vào cả lệnh DADDU và DSUBU, nhưng bảo đảm một mình trật tự là không đủ cho việc thực hiện đúng. Thay vào đó, khi những chỉ lệnh thực hiện, dòng dữ liệu phải được bảo toàn: Nếu nhánh là không thực hiện, thì giá trị của R1 được tính toán bởi DSUBU sẽ được sử dụng bởi OR và nếu nhánh được thực hiện, thì giá trị của R1 được tính toán bởi DADDU sẽ được sử dụng bởi OR. Bằng cách đảm bảo sự phụ thuộc điều khiển của OR trên nhánh, chúng ta sẽ ngăn chặn sự thay đổi bất hợp pháp đến dòng chảy dữ liệu. Vì những lý do tương tự, lệnh DSUBU không thể di chuyển lên trên nhánh. Sự tích lũy cũng sẽ cho phép chúng ta giảm bớt ảnh hưởng của sự phụ thuộc điều khiển, trong khi vẫn duy trì dòng dữ liệu, như chúng ta sẽ thấy trong mục 2.6. Đôi khi chúng ta có thể xác định rằng sự vi phạm phụ thuộc điều khiển thì không thể ảnh hưởng đến trạng thái ngoại lệ hoặc dòng dữ liệu. Xét đoạn mã sau: DADDU BEQZ DSUBU DADDU R1, R2, R3 R12, skip R4, R5, R6 R5, R4, R9 skip: OR R7, R8, R9 Giả sử chúng ta biết rằng đích đến thanh ghi của lệnh DSUBU (R4) không được sử dụng sau lệnh được gán skip (thuộc tính của việc liệu một giá trị sẽ được sử dụng bởi một chỉ lệnh sắp tới hay không được gọi là liveness). Nếu R4 không sử dụng, thì việc thay đổi giá trị của R4 ngay trước nhánh sẽ không ảnh hưởng đến dòng dữ liệu vì R4 sẽ biến mất (chứ không tồn tại) trong vùng mã sau skip. Vì vậy, nếu R4 biến mất và lệnh DSUBU tồn tại không thể tạo ra một ngoại lệ (khác với những gì mà bộ xử lý tiếp tục cùng một tiến trình từ nó), chúng ta có thể di chuyển lệnh DSUBU trước nhánh, vì dòng dữ liệu không thể bị ảnh hưởng bởi thay đổi này. Nếu nhánh này được thực hiện, lệnh DSUBU sẽ thực hiện và sẽ vô dụng, nhưng nó sẽ không ảnh hưởng đến kết quả chương trình. Loại mã lập lịch cũng là một hình thức tích lũy, thường được gọi là phần mềm tích lũy, vì trình biên dịch sẽ đánh giá hiệu quả nhánh; trong trường hợp này, việc đánh giá này nghĩa là nhánh này thường không được thực hiện. Thông thường, nó sẽ rõ ràng khi chúng ta nói rằng cơ chế của sự tích lũy là cơ chế phần cứng hay phần mềm; khi nó không rõ ràng, tốt nhất là nói "tích lũy phần cứng" hoặc "tích lũy phần mềm". Sự phụ thuộc điều khiển được đảm bảo bằng cách thực hiện việc kiểm tra rủi ro điều khiển mà gây ra những trì hoãn điều khiển. Những trì hoãn điều khiển có thể được loại bỏ hoặc giảm bớt bằng những kỹ thuật phần cứng và phần mềm khác nhau, chúng ta sẽ kiểm tra tại mục 2.3.

58 Chương 2: Khối xử lý song song ở mức lệnh máy Kết hợp xử lý song song ở mức lệnh máy và giải pháp phần mềm về ILP Phần này xem xét việc sử dụng kỹ thuật biên dịch đơn giản để nâng cao hoạt động của bộ xử lý nhằm khai thác ILP. Đây là những kỹ thuật chủ yếu cho các bộ xử lý sử dụng vấn đề tĩnh hoặc lập lịch tĩnh. Được trang bị kỹ thuật biên dịch này, chúng ta sẽ phân tích ngắn gọn việc thiết kế và thực hiện của bộ xử lý sử dụng vấn đề tĩnh Chương trình dịch và kỹ thuật đường ống Sự lập lịch đường ống cơ bản và tháo bỏ vòng lặp Để giữ cho một đường ống đầy, trạng thái song song giữa các lệnh phải được khai thác bằng cách tìm ra những trình tự của các lệnh không liên quan mà có thể được chồng chéo trong các đường ống. Để tránh việc trì hoãn đường ống, một lệnh phụ thuộc phải được tách ra từ lệnh nguồn bởi một khoảng cách trong các chu kỳ xung nhịp tương đương với độ trễ đường ống của lệnh nguồn. Khả năng của một trình biên dịch để thực hiện việc lập lịch này phụ thuộc vào lượng ILP sẵn trong chương trình và vào những thời gian chờ của các đơn vị chức năng trong đường ống. Bảng 2.2 cho thấy các thời gian chờ của đơn vị lập trình chức năng mà chúng ta sẽ giả định trong chương này, trừ khi những thời gian khác nhau được quy định rõ ràng. Chúng ta giả định chuẩn năm giai đoạn của đường ống số nguyên, để những nhánh có sự trì hoãn của 1 chu kỳ đồng hồ. Chúng ta giả định rằng các đơn vị chức năng được truyền đi đầy đủ hoặc được sao chép lại (nhiều lần như độ sâu đường ống), để một hoạt động của bất kỳ loại nào có thể được ban hành trên mọi chu kỳ xung nhịp và không có những rủi ro cấu trúc. Trong mục nhỏ này, chúng ta tìm hiểu cách mà trình biên dịch có thể tăng số lượng ILP sẵn có bằng cách biến đổi vòng lặp. Ví dụ này minh họa cho một kỹ thuật quan trọng cũng như để thúc đẩy những biến đổi chương trình mạnh mẽ hơn. Chúng ta sẽ dựa vào đoạn mã sau đây, có thêm một phần tử vô hướng vào một vectơ: For (i = 1000; i> 0; i = i-1) x [i] = x [i] + s; Chúng ta có thể thấy rằng vòng lặp này là song song do nhận thấy rằng thành phần của mỗi lần lặp là độc lập. Trước tiên, hãy xem xét việc thực hiện của vòng lặp này, nó hiển thị cách mà chúng ta có thể sử dụng song song để cải thiện hiệu suất của nó cho một đường ống MIPS với những thời gian chờ được chỉ ra ở trên.

59 60 Kiến trúc máy tính tiên tiến Lệnh đưa ra kết quả Lệnh sử dụng kết quả Thời gian chờ trong chu kỳ xung đồng hồ FP ALU thao tác FP ALU khác thao tác 3 FP ALU thao tác Lưu trữ kép 2 Nạp kép FP ALU thao tác 1 Nạp kép Lưu trữ kép 0 Bảng 2.2: Thời gian chờ của các bộ hoạt động FP được sử dụng trong chương này. Cột cuối cùng là số chu kỳ xung đồng hồ can thiệp cần thiết để tránh sự trì hoãn. Những con số này cũng tương tự như thời gian trễ trung bình chúng ta sẽ thấy trên một đơn vị FP. Thời gian chờ của một việc nạp dấu chấm động đến nơi lưu trữ là 0, do đó kết quả của việc nạp có thể được bỏ qua mà không trì hoãn việc lữu trữ. Chúng ta sẽ tiếp tục giả định độ trễ của việc nạp một số nguyên là 1 và việc thực hiện một số nguyên của ALU là 0. Bước đầu tiên là dịch đoạn mã trên về hợp ngữ MIPS. Trong đoạn mã sau, ban đầu R1 là địa chỉ của phần tử trong mảng với địa chỉ cao nhất và F2 có giá trị vô hướng. Thanh ghi R2 được tính toán trước, để 8 (R2) là địa chỉ của phần tử cuối cùng làm việc trên đó. Mã MIPS đơn giản, không được đưa vào chương trình cho các đường ống, xem đoạn mã sau: Loop: L.D F0,0(R1) ;F0= phần tử mảng ADD.D F4,F0,F2 ;thêm phần tử vô hướng vào F2 S.D F4,0(R1) ;lưu trữ kết quả DADDUI R1,R1,#-8 ;con trỏ giảm ;8 bytes (per DW) BNE R1,R2,Loop ;nhánh R1! =R2 Hãy bắt đầu bằng cách xem vòng lặp này sẽ chạy như thế nào khi nó được đưa vào chương trình trên một đường ống đơn giản cho MIPS với thời gian chờ trong bảng 2.2. Ví dụ: Xem vòng lặp này sẽ sẽ nhìn thấy MIPS, cả khi được và không được lập lịch, bao gồm một vài trì hoãn hoặc chu kỳ xung đồng hồ rỗi. Hãy lập lịch những trì hoãn từ những phép toán dấu chấm động, nhưng hãy nhớ rằng chúng ta đang bỏ qua các nhánh đã trì hoãn. Trả lời: Nếu không lập lịch, vòng lặp sẽ thực hiện như sau, thực hiện 9 chu kỳ: Chu kỳ xung nhịp được đưa ra Loop: L.D F0,0(R1) 1 stall 2 ADD.D F4,F0,F2 3

60 Chương 2: Khối xử lý song song ở mức lệnh máy 61 stall 4 stall 5 S.D F4,0(R1) 6 DADDUI R1,R1,#-8 7 stall 8 BNE R1,R2,Loop 9 Chúng ta có thể lập lịch vòng lặp chỉ chứa 2 trì hoãn và giảm thời gian còn 7 chu kỳ: Loop: L.D F0,0(R1) DADDUI ADD.D stall stall S.D BNE R1,R1,#-8 F4,F0,F2 F4,8(R1) R1,R2,Loop Những trì hoãn sau ADD.D được dùng bởi S.D. Trong ví dụ trước, chúng ta hoàn thành một lần lặp và lưu trở lại vào một phần tử mảng mỗi 7 chu kỳ xung nhịp, nhưng công việc thực sự của việc thao tác trên phần tử mảng chỉ mất 3 chu kỳ (nạp, cộng và lưu trữ) trong số 7 chu kỳ xung đồng hồ. 4 chu kỳ xung đồng hồ còn lại bao gồm thủ tục bổ sung vòng lặp - DADDUI và BNE và hai sự trì hoãn. Để loại bỏ 4 chu kỳ đồng hồ chúng ta cần phải làm nhiều phép toán hơn liên quan đến số lượng các lệnh đầu. Đề xuất đơn giản để tăng số lượng các lệnh liên quan đến nhánh và các lệnh đầu là mở vòng lặp. Việc mở vòng lặp chỉ đơn giản là sao chép thân vòng lặp lại nhiều lần, điều chỉnh mã kết thúc vòng lặp. Mở vòng lặp cũng có thể được sử dụng để cải thiện việc lập lịch. Bởi vì nó giúp loại bỏ nhánh, nên nó cho phép các lệnh từ những lần lặp khác nhau được đưa vào lập lịch cùng nhau. Trong trường hợp này, chúng ta có thể loại bỏ các trì hoãn sử dụng dữ liệu bằng cách tạo thêm các lệnh độc lập xung quanh thân vòng lặp. Nếu chúng ta sao chép một cách đơn giản các lệnh khi chúng ta mở vòng lặp, thì việc sử dụng kết quả của những thanh ghi giống nhau có thể ngăn cản chúng ta khỏi việc lập lịch vòng lặp có hiệu quả. Vì vậy, chúng ta sẽ sử dụng những thanh ghi khác nhau cho mỗi lần lặp, tăng số lượng thanh ghi được yêu cầu. Ví dụ: Hãy xem việc vòng lặp được mở để có bốn bản sao của thân vòng lặp, giả sử R1 - R2 (kích thước của mảng) ban đầu là bội số của 32, nghĩa là số lần lặp là bội của 4. Hãy loại bỏ những tính toán dư thừa và không sử dụng lại bất kỳ thanh ghi nào.

61 62 Kiến trúc máy tính tiên tiến Trả lời: Đây là kết quả sau việc hợp các lệnh DADDUI lại và giảm các phép toán BNE không cần thiết mà được nhân đôi trong suốt quá trình mở rộng vòng lặp. Lưu ý rằng R2 phải được thiết lập để 32(R2) là địa chỉ bắt đầu của 4 phần tử cuối. Loop: L.D F0,0(R1) ADD.D F4,F0,F2 S.D F4,0(R1) ;giảm DADDUI & BNE L.D ADD.D F6,-8(R1) F8,F6,F2 S.D F8,-8(R1) ;giảm DADDUI & BNE L.D ADD.D F10,-16(R1) F12,F10,F2 S.D F12,-16(R1) ;giảm DADDUI & BNE L.D ADD.D S.D DADDUI BNE F14,-24(R1) F16,F14,F2 F16,-24(R1) R1,R1,#-32 R1,R2,Loop Chúng ta đã loại bỏ ba nhánh và giảm ba bậc của R1. Các địa chỉ trong việc nạp và lưu trữ đã được hoàn trả để cho phép các lệnh DADDUI trên R1 được kết hợp. Việc tối ưu này có vẻ tầm thường, nhưng không phải vậy, nó đòi hỏi việc thay thế ký hiệu và sự rút gọn. Sự thay thế ký hiệu và sự đơn giản sẽ sắp xếp lại các biểu thức để cho phép các hằng số được thu bớt lại, cho phép một biểu thức như ((i + 1) + 1) được viết lại thành (i + (1 + 1)) và sau đó đơn giản thành (i + 2). Chúng ta sẽ thấy những dạng tổng quát hơn của những tối ưu này việc mà dùng loại những phép tính phụ thuộc. Nếu không lập lịch, mọi hoạt động trong vòng lặp đã mở rộng được theo sau bởi một phép tính phụ thuộc và vì thế sẽ gây ra sự trì hoãn. Vòng lặp sẽ chạy trong vòng 27 chu kỳ xung đồng hồ - mỗi LD có 1 trì hoãn, mỗi ADDD 2, DADDUI 1, cộng với 14 chu kỳ liên quan đến vấn đề lệnh - hay 6,75 chu kỳ xung đồng hồ cho mỗi 4 phần tử, nhưng nó có thể được đưa vào lập lịch để cải thiện hiệu suất đáng kể. Mở rộng vòng lặp được thực hiện sớm trong quá trình biên dịch, để những tính toán dư thừa có thể được phơi bày và loại bỏ bởi việc tối ưu. Trong những chương trình thực chúng ta thường không biết cận trên của vòng lặp. Giả sử đó là n và chúng ta muốn mở rộng vòng lặp để làm k bản sao thân vòng lặp. Thay vì một vòng lặp được mở rộng duy nhất, chúng ta tạo ra một cặp vòng lặp liên tiếp. Đầu tiên thực hiện (n mod k) lần và có một thân vòng lặp đó là vòng lặp ban đầu. Thứ hai là thân vòng lặp được mở rộng bao quanh bởi một vòng lặp bên

62 Chương 2: Khối xử lý song song ở mức lệnh máy 63 ngoài mà lặp (n/k) lần. Đối với những giá trị lớn của n, hầu hết thời gian thực hiện sẽ được dùng trong thân vòng lặp được mở rộng. Trong ví dụ trước, việc mở rộng cải thiện việc thực hiện của vòng lặp này bằng cách loại bỏ các lệnh đầu, mặc dù nó làm tăng kích thước đoạn mã một cách đáng kể. Vòng lặp được mở rộng sẽ thực hiện như thế nào khi nó được lập lịch cho đường ống được mô tả trước đó? Ví dụ: Hãy xem vòng lặp được mở rộng trong ví dụ trước sau khi nó được lập lịch cho đường ống với thời gian chờ xem trong bảng 2.2. Trả lời: Loop: L.D F0,0(R1) L.D L.D L.D ADD.D ADD.D ADD.D ADD.D S.D S.D DADDUI S.D S.D BNE F6,-8(R1) F10,-16(R1) F14,-24(R1) F4,F0,F2 F8,F6,F2 F12,F10,F2 F16,F14,F2 F4,0(R1) F8,-8(R1) R1,R1,#-32 F12,16(R1) F16,8(R1) R1,R2,Loop Thời gian thực hiện của vòng lặp mở rộng đã giảm xuống tổng cộng 14 chu kỳ xung đồng hồ, hoặc 3,5 chu kỳ mỗi phần tử, so với 9 chu kỳ mỗi phần tử trước khi mở rộng hoặc đưa vào lập lịch và 7 chu kỳ khi lập lịch nhưng không mở rộng. Lợi ích từ lập lịch trên vòng lặp mở rộng thậm chí lớn hơn so với trên vòng lặp gốc. Sự gia tăng này xuất hiện vì vòng lặp mở rộng thể hiện nhiều tính toán hơn mà có thể được lập lịch để tối thiểu các trì hoãn, mã ở trên không có các trì hoãn. Việc lập lịch vòng lặp trong kiểu này cần phải nhận thấy rằng việc tải và lưu trữ phải độc lập và có thể được luân phiên Tóm tắt vòng lặp mở rộng và lập lịch Trong suốt chương này, chúng ta sẽ xem xét nhiều kỹ thuật phần cứng và phần mềm mà cho phép chúng ta tận dụng lợi thế của khả năng thực hiện lệnh song song để sử dụng đầy đủ các tiềm năng của các đơn vị chức năng trong một bộ xử lý. Chìa khóa của hầu hết những kỹ thuật này là biết khi nào và làm thế nào thứ tự các lệnh có thể được thay đổi. Trong ví dụ này, chúng ta thực hiện nhiều thay đổi như vậy.

63 64 Kiến trúc máy tính tiên tiến Trong thực tế, quá trình này phải được thực hiện một cách có phương pháp, hoặc bởi một trình biên dịch hoặc bằng phần cứng. Để có được những mã mở rộng cuối cùng, chúng ta đã làm nhiều quyết định và biến đổi sau: Xác định rằng mở rộng vòng lặp sẽ hữu ích bằng cách tìm bước lặp vòng lặp độc lập, trừ các mã bảo trì vòng lặp. Sử dụng các thanh ghi khác nhau để tránh những ràng buộc không cần thiết mà có thể buộc phải sử dụng cùng một thanh ghi cho các tính toán khác nhau. Loại bỏ các thử nghiệm thêm và các nhánh lệnh, điều chỉnh việc chấm dứt vòng lặp và mã lặp. Xác định rằng việc tải và lưu trữ trong vòng lặp bị gỡ bỏ có thể được đổi chỗ lẫn nhau bằng cách giám sát việc tải và lưu trữ từ các bước lặp độc lập khác nhau. Sự chuyển đổi này đòi hỏi phải phân tích các địa chỉ bộ nhớ và thấy rằng chúng không tham chiếu đến cùng một địa chỉ. Lập lịch một mã, lưu trữ bất kỳ sự phụ thuộc nào cần thiết để mang lại kết quả giống như mã gốc. Yêu cầu chính cơ bản tất cả các biến đổi là một sự hiểu biết về cách thức một lệnh phụ thuộc vào nhau và làm thế nào các lệnh có thể được thay đổi hoặc sắp xếp lại những phụ thuộc cho trước. Có ba loại khác nhau của các giới hạn cho các lợi ích có thể đạt được bằng việc mở rộng vòng lặp: giảm số lượng trên tiêu đề dần với từng mã mở rộng, giới hạn kích thước mã và hạn chế trình biên dịch. Hãy xem xét các câu hỏi của lệnh lặp tiêu đề trước. Khi chúng ta mở rộng vòng lặp bốn lần, nó phát sinh ra đủ trạng thái song song giữa các lệnh để vòng lặp có thể được lập lịch với các chu kỳ không ngưng. Trên thực tế, trong 14 chu kỳ đồng hồ, chỉ có 2 chu kỳ là lệnh lặp tiêu đề: chu kỳ DADDUI, trong đó duy trì giá trị chỉ số và chu kỳ BNE, trong đó chấm dứt vòng lặp. Nếu mở rộng vòng lặp 8 lần, sẽ giảm từ ½ đến ¼ mỗi chu kỳ gốc. Một giới hạn thứ hai khi mở rộng là sự tăng trưởng trong kích thước mã kết quả. Đối với vòng lặp lớn hơn, sự tăng trưởng kích thước mã có thể là một mối quan tâm đặc biệt nếu nó gây ra sự gia tăng lệnh trong bộ nhớ đệm mất tốc độ. Một yếu tố khác thường quan trọng hơn kích thước mã là sự thiếu hụt tiềm năng trong thanh ghi đó mà được tạo ra bởi sự mở rộng linh hoạt và sự lập lịch. Hiệu ứng thứ cấp mà những kết quả từ lệnh lập lịch trong những đoạn mã lớn được gọi là áp lực thanh ghi. Nó xuất hiện bởi vì mã lập lịch để tăng ILP gây ra số lượng những giá trị thực tăng. Sau khi lập lịch lệnh tích cực, nó có thể không thể phân bổ tất cả các giá trị sống đến thanh ghi. Mã chuyển đổi, trong khi về mặt lý thuyết nhanh hơn, có thể mất một số hoặc tất cả các lợi thế của nó, vì nó sẽ tạo ra sự thiếu hụt của thanh ghi.

64 Chương 2: Khối xử lý song song ở mức lệnh máy 65 Mở rộng vòng lặp một phương pháp đơn giản mà hữu ích để tăng kích thước những đoạn mã đường thẳng mà có thể được lập lịch hiệu quả. Sự chuyển đổi này rất hữu ích trong một loạt các bộ vi xử lý, từ những đường ống đơn giản như chúng tôi đã kiểm tra cho đến nay với nhiều những siêu vô hướng và VLIWs sẽ nghiên cứu sau trong chương này Hỗ trợ phần cứng đối với chương trình dịch Giảm bớt những chi phí nhánh với sự dự đoán Do sự cần thiết kiểm soát thực thi thông qua các mối nguy hiểm nhánh và trì hoãn, các nhánh sẽ làm giảm hiệu suất đường ống. Việc mở rộng vòng lặp là một cách để giảm bớt số lượng những mối nguy hiểm nhánh; chúng ta còn có thể giảm tổn thất hiệu suất của nhánh bằng cách dự đoán chúng sẽ vận hành như thế nào. Hành vi của nhánh có thể được dự đoán cả tĩnh tại thời gian biên dịch lẫn động của các phần cứng tại thời gian thực hiện. Dự đoán nhánh tĩnh đôi khi được sử dụng trong bộ xử lý nơi mà hành vi của nhánh dự đoán rất cao tại thời điểm biên dịch, dự đoán tĩnh cũng có thể được sử dụng để giúp dự đoán động. a. Dự đoán nhánh tĩnh Chúng ta thảo luận về một tính năng hỗ trợ kiến trúc dự đoán nhánh tĩnh, cụ thể là, sự trễ nhánh. Dự đoán chính xác một nhánh tại thời điểm biên dịch cũng có ích cho nguy cơ về lập lịch dữ liệu. Mở rộng vòng lặp là một ví dụ của kỹ thuật để cải thiện mã lập lịch tùy thuộc vào nhánh dự đoán. Để sắp xếp lại mã trên nhánh để nó chạy nhanh hơn, chúng ta cần phải dự đoán nhánh tĩnh khi chúng ta biên dịch chương trình. Có một số phương pháp khác nhau để dự đoán hành vi nhánh tĩnh. Phương án đơn giản nhất là dự đoán một nhánh như thực hiện. Phương án này có tỉ lệ dự đoán không đúng trung bình bằng với tần số nhánh không thực hiện được, mà cho các chương trình SPEC là 34%. Thật không may, tỉ lệ dự đoán không đúng cho các chương trình SPEC khoảng từ không quá chính xác (59%) cho đến độ chính xác cao (9%). Một kỹ thuật chính xác hơn để dự đoán nhánh trên cơ sở các thông tin hồ sơ thu thập được từ lần chạy trước đó. Các theo dõi quan trọng làm cho điều này đáng giá là hành động của nhánh thường là hai mô thái phân tán; có nghĩa là, một nhánh riêng lẻ thường thiên về thực hiện hoặc không thực hiện. Hình 2.1 cho thấy sự thành công của nhánh dự báo bằng cách sử dụng phương án này. Các dữ liệu đầu vào cùng được sử dụng cho chạy và thu thập thông tin; các nghiên cứu khác đã chỉ ra rằng việc thay đổi các đầu vào để thông tin chạy một cách khác nhau dẫn đến chỉ một thay đổi trong tính chính xác của dự đoán dựa trên hồ sơ (profile).

65 66 Kiến trúc máy tính tiên tiến Hiệu quả của bất kỳ chương trình dự đoán nhánh phụ thuộc vào độ chính xác của chương trình và tần suất của các nhánh có điều kiện, mà thay đổi trong SPEC từ 3% đến 24%. Thực tế là tỉ lệ dự đoán không đúng cho các chương trình số nguyên là cao hơn và các chương trình như vậy thường có một tần số nhánh cao hơn là một hạn chế lớn đối với ngành dự đoán tĩnh. Trong phần tiếp theo, chúng ta xem xét dự đoán nhánh động, mà bộ vi xử lý gần đây có thể làm. Benchmark Misprecdition rate 25% 20% 15% 10% 5% 12% 22% 18% 11% 12% 5% 6% 9% 10% 15% 0% Hình 2.1: Tỉ lệ dự đoán không đúng trên SPEC92 cho một dự đoán dựa trên thông tin rất khác nhau nhưng nói chung là tốt hơn cho các chương trình FP, trong đó có một tỉ lệ dự đoán không đúng trung bình là 9% với một độ lệch chuẩn của 4%, so với các chương trình số nguyên, trong đó có một tỉ lệ dự đoán không đúng trung bình 15% với độ lệch chuẩn của 5%. Việc thực hiện thực tế phụ thuộc vào độ chính xác cả dự đoán và tần số chi nhánh, mà thay đổi từ 3% đến 24%. b. Dự đoán nhánh động và những bộ đệm dự đoán nhánh động Phương án dự báo nhánh động đơn giản nhất là một bộ đệm dự đoán nhánh hoặc bảng lịch sử nhánh. Một bộ đệm dự đoán nhánh là một bộ nhớ nhỏ lập chỉ mục của các vùng thấp của địa chỉ của những lệnh nhánh. Bộ nhớ chứa một đơn vị thông tin mà cho dù nhánh được thực hiện gần đây hay không. Phương án này là phân loại đơn giản nhất của bộ đệm, nó không có thẻ và chỉ có ích để giảm sự trễ nhánh khi nó dài hơn thời gian để tính toán mà các máy tính đích có thể thực hiện. Với bộ đệm như vậy, chúng ta không biết, trên thực tế, nếu dự đoán là chính xác, nó có thể đã được đặt ở đó bởi một nhánh khác mà có cùng địa chỉ bit thấp. Nhưng điều này không quan trọng. Dự đoán là một gợi ý rằng được giả định là đúng và bắt đầu truy xuất theo hướng dự đoán. Nếu gợi ý lần lượt đưa ra bị sai lầm, các bit dự đoán được đảo và lưu trữ lại. Bộ đệm có hiệu quả là một bộ nhớ cache, nơi mỗi lần truy cập là một xung và như chúng ta sẽ thấy, hiệu suất của bộ đệm phụ thuộc vào cả vào dự đoán thường

66 Chương 2: Khối xử lý song song ở mức lệnh máy 67 dành cho các nhánh quan tâm và làm thế nào dự đoán chính xác khi nó phù hợp. Trước khi chúng ta phân tích hiệu quả hoạt động, nó rất hữu ích để thực hiện một ít, nhưng quan trọng, cải thiện tính chính xác của phương án dự báo nhánh. Phương án dự đoán 1 bit đơn giản có một thiếu sót thực hiện: Ngay cả khi nhánh gần như luôn thực hiện được, chúng ta sẽ có khả năng dự đoán không chính xác hai lần, hơn là một lần, khi nó không thực hiện được, vì dự đoán không đúng gây ra các bit dự đoán bị lật ngược. Để khắc phục điểm yếu này, phương án dự đoán 2 bit thường được sử dụng. Trong một phương án 2 bit, một dự đoán phải bỏ lỡ hai lần trước khi nó được thay đổi. Hình 2.2 cho thấy các trạng thái hữu hạn của bộ xử lý cho một chương trình dự đoán 2 bit. Một bộ đệm dự đoán nhánh có thể được thực hiện như một bộ nhớ cache nhỏ đặc biệt truy cập bằng địa chỉ lệnh trong giai đoạn ống IF, hoặc là một cặp bit gắn liền với mỗi khối trong bộ nhớ cache lệnh và truy cập với lệnh này. Nếu lệnh được giải mã là một nhánh và nếu nhánh được dự đoán thực hiện được, truy cập bắt đầu từ đối tượng ngay sau khi máy tính nhận được. Nếu không, tuần tự truy cập và thực hiện tiếp tục. Theo hình 2.2 cho thấy, nếu dự đoán các biến ra là sai, các bit dự đoán bị thay đổi. Những loại chính xác nào có thể được mong đợi từ một bộ đệm dự đoán nhánh bằng cách sử dụng 2 bit cho mỗi mục nhập vào ứng dụng thực tế? Hình 2.3 cho thấy rằng đối với các tiêu chí chuẩn SPEC89 một bộ đệm dự đoán nhánh với kết quả các mục trong một dự đoán chính xác khác nhau, từ trên 99% đến 82%, hoặc tỉ lệ một dự đoán không đúng từ 1% đến 18%. Một bộ đệm nhập 4K, như thế được sử dụng cho các kết quả này, được xem là nhỏ ở tiêu chuẩn năm 2005 và một vùng đệm lớn hơn có thể tạo ra kết quả tốt hơn. Khi chúng ta cố gắng khai thác thêm ILP, tính chính xác của dự đoán nhánh của chúng ta sẽ trở thành quan trọng. Như chúng ta có thể thấy trong hình 2.3, tính chính xác của dự đoán cho các chương trình số nguyên, mà cũng thường có tần số nhánh cao hơn, là thấp hơn cho các chương trình khoa học có cường độ lặp lớn. Chúng ta có thể giải quyết vấn đề này theo hai cách: bằng cách tăng kích thước của bộ đệm và bằng cách tăng tính chính xác của chương trình chúng ta sử dụng cho từng dự đoán. Một bộ đệm với 4K mục nhập, tuy nhiên, như hình 2.4 cho thấy, thực hiện tương đối dễ để có một vùng đệm vô hạn, ít nhất là cho các tiêu chí chuẩn như những tiêu chí trong SPEC. Dữ liệu trong hình 2.4 làm cho nó rõ ràng rằng tỉ lệ gợi ý của bộ đệm không phải là yếu tố hạn chế chính. Như chúng ta đề cập ở trên, chỉ cần tăng số bit cho mỗi dự đoán mà không thay đổi cơ cấu dự đoán cũng có tác động rất ít. Thay vào đó, chúng ta cần phải xem làm thế nào có thể tăng độ chính xác của mỗi dự đoán.

67 68 Kiến trúc máy tính tiên tiến Taken Predict taken 11 Taken Predict not taken 01 Not taken Taken Not taken Taken Not taken Predict taken 10 Predict not taken 00 Not taken Hình 2.2: Các tình trạng trong một chương trình dự đoán 2-bit. Bằng cách sử dụng 2-bit thay vì 1 bit, một nhánh mà thiên mạnh về thực hiện hoặc không thực hiện - như nhiều nhánh thực hiện - sẽ bị ít dự đoán nhầm hơn so với một dự đoán 1-bit. 2-bit được sử dụng để mã hóa bốn tình trạng trong hệ thống. Phương án 2-bit thực sự là một sự đặc biệt hóa của một chương trình tổng quát hơn là có một bộ đếm n-bit bão hòa cho mỗi mục trong bộ đệm dự đoán. Với một bộ đếm n-bit, các bộ đếm có thể lấy trên các giá trị giữa 0 và 2n - 1: Khi bộ đếm lớn hơn hoặc bằng một nửa giá trị tối đa của nó (2n - 1), nhánh được dự đoán là thực hiện được, nếu không, đó là dự đoán không thực hiện được. Các nghiên cứu về dự đoán n-bit đã chỉ ra rằng các dự đoán 2-bit hầu như là làm tốt và do đó hầu hết hệ thống dựa vào các yếu tố tiên đoán nhánh 2-bit thay vì dự đoán n-bit tổng quát hơn. c. So sánh các dự báo nhánh Các phương án dự đoán 2-bit chỉ sử dụng cho các hành vi gần đây của một nhánh duy nhất để dự đoán hành vi tương lai của nhánh đó. Có thể cải thiện độ chính xác dự đoán nếu chúng ta cũng xem xét các hành vi gần đây của các nhánh khác hơn là nhánh mà chúng ta đang cố gắng dự đoán. Hãy xem xét một đoạn mã nhỏ từ đánh giá eqntott, một khâu của dãy đánh giá SPEC khởi tạo, là hiển thị đặc biệt hành vi dự đoán nhánh xấu: if (aa==2) if (bb==2) aa=0; bb=0; if (aa!==bb) {

68 Chương 2: Khối xử lý song song ở mức lệnh máy 69 Tần suất của dự đoán không đúng nasa7 matrix300 tomcatv doduc spice fpppp gcc epresso qntott li 0% 1% 1% 5% 5% 9% 9% 10% 12% 18% 0% 2% 4% 6% 8% 10% 12% 14% 16% 18% 20% Hình 2.3: Dự đoán chính xác của 4096 mục nhập 2-bit bộ đệm dự đoán cho các tiêu chí chuẩn SPEC89. Tỉ lệ dự đoán không đúng cho các tiêu chí chuẩn về số nguyên (gcc, espresso, eqntott và li) là cao hơn đáng kể (trung bình là 11%) so với các chương trình FP (trung bình là 4%). Bỏ qua bộ phận chính của FP (nasa7, matrix300 và tomcatv) vẫn còn hiệu suất độ chính xác cao hơn cho các tiêu chí chuẩn FP so với các tiêu chí chuẩn về số nguyên. Những dữ liệu này, cũng như phần còn lại của dữ liệu trong phần này, được lấy từ một nghiên cứu dự đoán nhánh thực hiện bằng cách sử dụng kiến trúc IBM Power và tối ưu hóa mã cho hệ thống đó. Xem Pan, So và Rameh [1992]. Mặc dù dữ liệu này là dành cho một phiên bản cũ hơn của một nhóm các tiêu chí chuẩn SPEC, các tiêu chuẩn mới hơn thì lớn hơn và sẽ hiển thị hành vi hơi tệ hơn, nhất là đối với các tiêu chí chuẩn về số nguyên. Dưới đây là mã MIPS mà chúng ta thường sẽ tạo ra cho đoạn mã này giả định rằng aa và bb được gán cho các thanh ghi R1 và R2: DADDIU R3,R1,#-2 BNEZ R3,L1 ;branch b1 (aa!=2) DADD R1,R0,R0 ;aa=0 L1: DADDIU R3,R2,#-2 BNEZ R3,L2 ;branch b2 (bb!=2) DADD R2,R0,R0 ;bb=0 L2: DSUBU R3,R1,R2 ;R3=aa-bb BNEZ R3,L3 ;branch b3 (aa==bb)

69 70 Kiến trúc máy tính tiên tiến Chúng ta hãy gắn nhãn các nhánh b1, b2 và b3. Các quan sát chính là hành vi của nhánh b3 tương quan với các hành vi của nhánh b1 và b2. Rõ ràng, nếu nhánh b1 và b2 mà cả hai không được thực hiện, sau đó b3 sẽ thực hiện, vì aa và bb rõ ràng là bằng nhau. Một dự đoán rằng chỉ sử dụng hành vi của một nhánh duy nhất để dự đoán kết quả của nhánh mà không bao giờ có thể thu nạp hành vi này. Hình 2.4: Dự đoán chính xác của 4096 mục nhập 2-bit bộ đệm dự đoán so với một bộ đệm vô hạn cho các tiêu chí chuẩn SPEC89. Mặc dù dữ liệu này là dành cho một phiên bản cũ hơn của một tập hợp các tiêu chí chuẩn SPEC, kết quả sẽ được so sánh với các phiên bản mới hơn có lẽ nhiều như 8K các mục nhập cần thiết để phù hợp với một yếu tố dự báo 2-bit vô hạn. Các dự đoán nhánh là việc sử dụng các hành vi của các nhánh khác để thực hiện một dự đoán được gọi là tương ứng dự đoán hoặc dự đoán hai cấp. Dự đoán hiện tại tương ứng thêm thông tin về hành vi của các nhánh mới nhất để quyết định làm thế nào để dự đoán một nhánh nhất định. Ví dụ, một dự đoán (1,2) sử dụng các hành vi của nhánh cuối để lựa chọn giữa một cặp dự đoán nhánh 2-bit trong việc dự đoán một nhánh cụ thể. Trong trường hợp chung một dự đoán (m,n) sử dụng hành vi của các nhánh m cuối cùng để chọn từ 2m dự đoán nhánh, mỗi trong số đó là một yếu tố dự báo n-bit cho một nhánh duy nhất. Sự hấp dẫn của loại hình này tương ứng ngành dự báo là nó có thể mang lại mức dự đoán cao hơn phương án 2-bit và chỉ đòi hỏi một số lượng không đáng kể phần cứng bổ sung.

70 Chương 2: Khối xử lý song song ở mức lệnh máy 71 Sự đơn giản của phần cứng xuất hiện từ một quan sát đơn giản: Các tiền sử chung của các nhánh m gần đây nhất có thể được ghi trong thanh ghi dịch m-bit, nơi mà mỗi bản ghi bit cho dù nhánh đã được thực hiện hoặc không thực hiện. Các bộ đệm dự đoán nhánh sau đó có thể được lập chỉ mục bằng cách sử dụng sự trùng khớp của các bit thấp để từ địa chỉ nhánh với tiền sử chung của m-bit. Ví dụ, trong một bộ đệm (2,2) với tổng số 64 mục, 4 bit địa chỉ thấp thứ tự của nhánh (từ địa chỉ) và 2 bit chung đại diện cho hành vi của hai nhánh thực hiện gần đây nhất là hình thành một chỉ số 6-bit có thể được sử dụng để lập chỉ số cho 64 bộ đếm. Làm thế nào tốt hơn công việc dự đoán nhánh tương ứng khi so sánh với phương án 2-bit tiêu chuẩn? Để so sánh chúng một cách công bằng, chúng ta phải so sánh dự đoán là việc sử dụng cùng chế độ bit. Số bit trong một (m,n) dự báo là: 2m x n x Số lượng các mục dự đoán được lựa chọn bởi các địa chỉ nhánh Một dự đoán 2-bit mà không có tiền sử chung chỉ đơn giản là một yếu tố dự báo (0,2). Ví dụ: Làm thế nào bit nhiều trong nhánh dự báo (0,2) với mục 4K? Làm thế nào nhiều mục trong một dự đoán (2,2) với cùng số bit? Trả lời: Các dự báo với 4K mục có: 2 0 x 2 x 4K = 8K bit Làm thế nào các mục được lựa chọn nhiều nhánh đang ở trong một dự đoán (2,2) có tổng số là 8K bit trong bộ đệm dự đoán? Chúng ta biết rằng 2 2 x 2 x số mục dự đoán được chọn bởi 1 nhánh = 8K Do đó, số lượng các mục dự đoán được lựa chọn bởi nhánh = 1K. Hình 2.5 so sánh mức giá tỉ lệ dự đoán không đúng của dự đoán trước đó (0,2) với 4K mục và dự báo một dự đoán (2,2) với 1K mục. Như bạn thấy, điều này dự báo tương ứng không chỉ nhanh hơn so với một dự báo 2-bit đơn giản với tổng số các bit cùng một tình trạng, nó thường nhanh hơn so với một dự báo 2-bit với một số không giới hạn các mục. d. Dự đoán Tournament: Kết hợp thích ứng dự đoán nội bộ và toàn cầu Các động lực chính cho nhánh tương ứng dự đoán xuất hiện từ sự quan sát cho rằng các tiêu chuẩn dự đoán 2-bit chỉ sử dụng thông tin nội bộ không thành công trên một số nhánh quan trọng và điều đó, bằng cách thêm thông tin chung, hiệu suất có thể được cải thiện. Dự đoán Tournament có cái nhìn sâu sắc đến cấp độ tiếp theo, bằng cách sử dụng nhiều dự đoán, thường là một dựa trên những thông tin toàn cầu và một dựa trên thông tin cục bộ và kết hợp chúng với một lựa chọn. Dự đoán Tournament có thể đạt được cả độ chính xác tốt hơn với kích thước trung bình (8K-32K bit) và cũng có thể tận dụng các con số rất lớn của các bit dự đoán hiệu quả. Dự đoán hiện tại sử dụng một bộ đếm bão hòa 2-bit một nhánh để lựa chọn

71 72 Kiến trúc máy tính tiên tiến giữa hai yếu tố tiên đoán khác nhau trên cơ sở đó dự đoán (cục bộ, toàn cầu, hoặc thậm chí một số kết hợp) là hiệu quả nhất trong các dự đoán gần đây. Như trong một dự đoán 2-bit đơn giản, các yêu cầu bộ đếm bão hòa hai dự đoán không đúng trước khi thay đổi sự đồng nhất của các yếu tố dự đoán ưu tiên. Tần suất của dự đoán không đúng 4096 mục: 2 bit một mục Không giới hạn mục nhập: 2 bit một mục 1024 mục nhập: (2,2) nasa7 0% 1% 1% matrix300 0% 0% 0% Tiêu chuẩn SPEC89 tomcatv doduc spice fpppp gcc epresso 0% 1% 1% 4% 5% 5% 5% 5% 5% 5% 5% 9% 9% 9% 9% 11% 11% 12% qntott 6% 18% 18% li 5% 10% 10% 0% 5% 10% 15% 20% Hình 2.5: So sánh các yếu tố tiên đoán 2-bit. Một dự báo không tương ứng cho bit là lần đầu tiên, theo sau là một yếu tố dự đoán không tương ứng 2-bit với mục nhập không giới hạn và dự báo một dự đoán 2-bit với 2 bit của tiền sử toàn cầu và tổng số mục. Mặc dù dữ liệu này là dành cho một phiên bản cũ của SPEC, dữ liệu tiêu chuẩn SPEC gần đây sẽ cho thấy sự khác biệt tương tự chính xác. Lợi thế của một dự đoán Tournament là khả năng để lựa chọn dự đoán đúng cho một nhánh cụ thể, trong đó đặc biệt quan trọng đối với các tiêu chuẩn về số nguyên. Một dự đoán Tournament tiêu biểu sẽ lựa chọn các dự đoán toàn cầu gần như 40% thời gian cho các tiêu chí chuẩn về số nguyên SPEC và ít hơn 15% thời gian cho FP tiêu chí chuẩn SPEC. Hình 2.6 nhìn vào hiệu suất của ba yếu tố tiên đoán khác nhau cho các số khác nhau của các bit bằng cách sử dụng như là tiêu chuẩn các SPEC89. Như chúng ta đã thấy trước đó, khả năng dự đoán của các yếu tố dự đoán nội bộ không cải thiện vượt quá một kích thước nhất định. Các dự đoán tương ứng cho thấy một cải tiến đáng kể và các yếu tố dự đoán cuộc đấu tạo ra hiệu suất tốt hơn một chút. Để có thêm phiên

72 Chương 2: Khối xử lý song song ở mức lệnh máy 73 bản gần đây của SPEC, kết quả sẽ được tương tự, nhưng các hành vi tiệm cận sẽ không đạt được dự đoán cho đến khi dự đoán có kích thước lớn hơn. Conditional branch misprediction rate Hình 2.6: Tỉ lệ dự đoán không đúng trong ba yếu tố tiên đoán khác nhau về SPEC89 là tổng số bit được tăng lên. Các dự đoán là một dự đoán cục bộ 2-bit, một yếu tố dự đoán tương ứng, đó là cấu trúc tối ưu trong việc sử dụng thông tin toàn cầu và cục bộ tại mỗi điểm trong biểu đồ và một yếu tố dự đoán Tournament. Mặc dù dữ liệu này được cho là một phiên bản cũ của SPEC, dữ liệu cho tiêu chuẩn SPEC gần đây sẽ cho thấy hành vi tương tự, có lẽ hội tụ tiệm cận đến giới hạn ở kích thước hơi lớn hơn dự báo. Năm 2005, dự đoán về cuộc đấu (tournament) bằng cách sử dụng 30K bit là các tiêu chuẩn trong bộ vi xử lý như Power5 và Pentium 4. Các tiên tiến nhất trong số này đã được dự đoán trên Alpha, mặc dù cả hai Pentium 4 và dự đoán Power5 là tương tự. Các dự báo K sử dụng 2-bit đếm lập chỉ mục của các địa chỉ nhánh cục bộ để lựa chọn giữa một yếu tố dự báo toàn cầu và dự báo cục bộ. Các dự báo toàn cầu cũng có 4K mục và lập chỉ mục của lịch sử của 12 nhánh mới, mỗi mục trong dự báo toàn cầu là một yếu tố dự báo tiêu chuẩn 2-bit. Các dự báo cục bộ bao gồm một dự báo cấp hai. Cấp cao nhất là một bảng tiền sử cục bộ bao gồm mục 10-bit; mỗi mục nhập 10-bit tương ứng với kết quả gần đây nhất 10 của nhánh cho các mục. Tức là, nếu các nhánh đã được thực hiện 10 hoặc nhiều lần trong một hàng, các mục nhập trong bảng lịch sử cục bộ sẽ là tất cả các số 1. Nếu nhánh được luân phiên thực hiện và không thực hiện được, các mục nhập lịch sử bao gồm xen kẽ số 0 và số bit lịch sử này cho phép các mô

73 74 Kiến trúc máy tính tiên tiến hình lên tới 10 nhánh được phát hiện và dự đoán. Các mục được lựa chọn từ bảng lịch sử cục bộ được sử dụng để đánh chỉ số một bảng 1K mục bao gồm 3-bit đếm bão hòa, trong đó cung cấp các dự đoán cục bộ. Sự kết hợp, sử dụng tổng cộng 29K bit, dẫn đến độ chính xác cao trong dự báo nhánh. Để kiểm tra các ảnh hưởng về hiệu suất, chúng ta cần phải biết chính xác dự đoán cũng như tần số nhánh, vì tầm quan trọng của dự báo chính xác là lớn hơn trong các chương trình với tần số nhánh cao hơn. Ví dụ, chương trình số nguyên trong các bộ nhánh SPEC có tần số cao hơn so với dự đoán một cách dễ dàng hơn các chương trình FP. Đối với những dự báo của , các tiêu chí chuẩn SPECfp95 có ít hơn 1 dự đoán không đúng trên lệnh hoàn thành và cho SPECint95, có khoảng 11,5 dự đoán không đúng trên lệnh hoàn thành. Điều này tương ứng với tỷ giá dự đoán không đúng ít hơn 0,5% cho các chương trình dấu chấm động và khoảng 14% cho các chương trình số nguyên. Các phiên bản sau của SPEC có chứa các chương trình với bộ dữ liệu lớn hơn và mã lớn hơn, kết quả cao hơn mức giá bỏ lỡ. Vì vậy, tầm quan trọng của nhánh dự đoán đã tăng. Trong mục 2.11, chúng tôi sẽ xem xét việc thực hiện các dự báo nhánh Pentium 4 trên các chương trình trong bộ phần mềm SPEC2000 và thấy rằng, mặc dù dự đoán nhánh tích cực hơn, tỉ lệ dự báo nhánh không chính xác với các chương trình số nguyên vẫn còn đáng kể Khắc phục những sự cố dữ liệu với lập lịch động Một đường ống lập lịch tĩnh đơn giản dự kiến truy nhập và ban hành các lệnh, trừ khi có một sự phụ thuộc dữ liệu giữa một lệnh đã có trong đường ống và các lệnh tải về mà không thể được ẩn với bỏ qua hoặc chuyển tiếp (chuyển tiếp logic làm giảm độ trễ đường ống có hiệu quả để các độc lập nhất định không gây nguy hại). Nếu đó là một sự phụ thuộc dữ liệu mà không thể được ẩn, sau đó phát hiện mối nguy hiểm phần cứng làm trì hoãn các đường ống bắt đầu với các lệnh sử dụng kết quả. Không có lệnh mới được lấy hoặc ban hành cho đến khi sự phụ thuộc bị xóa. Trong phần này, chúng ta khảo sát lập lịch động, trong đó phần cứng lệnh thực hiện sắp xếp lại để giảm trì hoãn trong khi duy trì đường dữ liệu và hành vi ngoại lệ. Lập lịch động cung cấp một số ưu điểm: Nó cho phép xử lý một số trường hợp khi sự phụ thuộc là chưa biết tại thời điểm biên dịch (bởi vì họ có thể bao gồm một tham chiếu bộ nhớ) và nó đơn giản hóa các trình biên dịch. Có lẽ quan trọng nhất, nó cho phép bộ xử lý chịu đựng sự chậm trễ không thể đoán trước như cache nhớ, bằng cách thực hiện mã khác trong khi chờ đợi cho bỏ lỡ để giải quyết. Gần như là quan trọng, lập lịch động cho phép mã đã được biên dịch với một đường ống trong tâm để chạy hiệu quả trên một đường ống khác. Trong mục 2.6, chúng ta khảo sát sự tích lũy phần cứng, một kỹ thuật có lợi thế về hiệu suất đáng kể, xây dựng

74 Chương 2: Khối xử lý song song ở mức lệnh máy 75 trên lập lịch động. Như chúng ta sẽ thấy, những lợi thế của lập lịch động được lợi ích từ sự gia tăng đáng kể chi phí về độ phức tạp của phần cứng. Mặc dù một bộ xử lý lập lịch động không thể thay đổi dòng dữ liệu, nó sẽ cố gắng để tránh trì hoãn khi có mặt sự phụ thuộc. Ngược lại, lập lịch đường ống tĩnh bởi trình biên dịch (được trình bày tại mục 2.2) sẽ cố gắng để giảm thiểu sự trì hoãn bằng cách tách biệt phụ thuộc lệnh để chúng sẽ không dẫn đến mối nguy hiểm. Tất nhiên, trình biên dịch lập lịch đường ống cũng có thể được sử dụng trên mã lệnh để chạy trên bộ xử lý với một đường ống lập lịch động. a. Ý tưởng lập lịch động Một hạn chế lớn của các kỹ thuật đường ống đơn giản là chúng sử dụng trong các vấn đề lệnh được phát ra và thực hiện: Các lệnh được phát ra trong các cấp chương trình và nếu một lệnh ngừng trong các đường ống, không có lệnh sau đó có thể tiến hành. Vì vậy, nếu có một sự lệ thuộc giữa hai khoảng cách chặt chẽ các lệnh trong các đường ống, điều này sẽ dẫn đến nguy hiểm và một luồng sẽ cho kết quả. Nếu có nhiều đơn vị chức năng, các đơn vị này có thể nằm nhàn rỗi. Nếu lệnh j phụ thuộc vào một lệnh thực hiện dài i, thực hiện hiện tại trong các đường ống, sau đó tất cả các lệnh sau j phải được ngừng lại cho đến khi i xong và j có thể thực thi. Ví dụ, hãy xem xét mã này: DIV.D ADD.D SUB.D F0,F2,F4 F10,F0,F8 F12,F8,F14 Các lệnh SUB.D không thể thực hiện vì sự phụ thuộc của ADD.D trên DIV.D làm cho đường ống đến chậm trễ; nhưng SUB.D dữ liệu không phụ thuộc vào bất cứ điều gì trong các đường ống. Nguy hiểm này tạo ra một giới hạn hiệu suất có thể được loại bỏ bằng cách không có lệnh để thực hiện chương trình theo thứ tự. Trong các đường ống năm giai đoạn cổ điển, cả cấu trúc và các mối nguy cơ dữ liệu có thể được kiểm tra trong quá trình giải mã lệnh (ID - Instruction Decode): Khi một lệnh có thể thực hiện mà không có mối nguy hiểm, nó đã được phát từ ID biết rằng tất cả các mối nguy cơ dữ liệu đã được giải quyết. Để cho phép chúng ta bắt đầu thực hiện các lệnh SUB.D trong ví dụ trên, chúng ta phải tách biệt quá trình phát thành hai phần: kiểm tra các mối nguy hiểm cho bất kỳ cấu trúc và chờ đợi cho sự vắng mặt của một mối nguy hiểm dữ liệu. Vì vậy, chúng ta vẫn còn sử dụng phát lệnh trật tự (tức là, lệnh đã phát trong cấp lệnh chương trình), nhưng chúng ta muốn một lệnh bắt đầu thực hiện ngay sau khi toán hạng dữ liệu của nó có sẵn. Như một đường ống không trật tự thực hiện, trong đó ngụ ý không trật tự hoàn thành.

75 76 Kiến trúc máy tính tiên tiến Không trật tự thực hiện lệnh một khả năng của nguy cơ WAR và WAW, mà không tồn tại trong các đường ống số nguyên năm giai đoạn và nó mở rộng hợp lý cho một đường ống dấu chấm động trong trật tự. Hãy xem xét mã dấu chấm động MIPS trong trình tự sau đây: DIV.D ADD.D SUB.D MUL.D F0,F2,F4 F6,F0,F8 F8,F10,F14 F6,F10,F8 Có một sự không phụ thuộc giữa ADD.D và SUB.D và nếu đường ống thực hiện các đường ống SUB.D trước ADD.D (mà là chờ đợi cho DIV.D), nó sẽ vi phạm các sự vi phạm không phụ thuộc, hiệu suất gây nguy hiểm WAR. Tương tự như vậy, để tránh vi phạm phụ thuộc xuất, chẳng hạn như viết F6 bởi MUL.D, nguy cơ WAW phải được xử lý. Như chúng ta sẽ thấy, cả hai mối nguy hiểm đều được tránh bằng cách sử dụng thanh ghi đổi tên. Không thật tự hoàn thành cũng tạo ra các biến chứng lớn trong việc xử lý ngoại lệ. Lập lịch động với không trật tự hoàn thành phải bảo quản hành vi ngoại lệ trong ý nghĩa là chính xác những trường hợp ngoại lệ có thể sẽ phát sinh nếu chương trình được thực hiện trong chương trình nghiêm ngặt để thực sự làm phát sinh. Lập lịch động xử lý bảo quản hành vi ngoại lệ bằng cách bảo đảm rằng không có lệnh có thể tạo ra một ngoại lệ cho đến khi các bộ xử lý biết rằng các lệnh nâng cao ngoại lệ sẽ được thực hiện, chúng ta sẽ thấy ngay cách sở hữu này có thể được bảo đảm. Mặc dù hành vi ngoại lệ được ngăn ngừa, bộ xử lý lập lịch động sẽ phát sinh những ngoại lệ không chính xác. Một ngoại lệ sẽ không chính xác nếu bộ xử lý rõ khi một ngoại lệ được phát sinh không có cái nhìn chính xác như thể là đường dẫn bị xử lý một cách liên tiếp trong chương trình ra lệnh chính xác. Những ngoại lệ không chính xác có thể xảy ra vì hai khả năng sau: 1. Đường ống có lẽ đã được hoàn tất các kết nối sau đó trong chương trình ra lệnh hơn là đường dẫn trong ngoại lệ. 2. Đường ống có lẽ chưa hoàn tất một vài lệnh trong chương trình ra lệnh sớm hơn là đường dẫn trong ngoại lệ. Ngoại lệ không chính xác làm nó khó khăn trong việc khởi động lại sự xử lý sau khi một ngoại lệ. Hơn là những vấn đề địa chỉ trong phần này, chúng ta sẽ thảo luận một giải pháp theo đó đưa ra những ngoại lệ chính xác trong hoàn cảnh của một bộ xử lý với sự nghiên cứu trong mục 2.6. Trong dấu chấm động ngoại lệ, những giải pháp khác đã được sử dụng.

76 Chương 2: Khối xử lý song song ở mức lệnh máy 77 Để cho phép hủy lệnh thi hành, chúng ta phân rẽ về bản chất 5 giai đoạn đặt đường ống đơn giản của chúng ta thành hai giai đoạn: 1. Đưa ra các lệnh giải mã, kiểm tra nguy cơ tạo thành. 2. Đọc toán hạng chờ cho đến khi không có dữ liệu nguy hại sau đó mới đọc toán hạng. Một lệnh truy cập các gian đoạn đi trước và có thể truy cập cả hai thành lệnh thanh ghi hay thành một hàng những lệnh trì hoãn; lệnh sau khi được cấp phát từ thanh ghi hay hàng. Giai đoạn EX là giai đoạn đọc toán hạng như là 5 giai đoạn trong đường ống. Thi hành lệnh có thể mất nhiều chu trình, dựa vào quá trình hoạt động. Chúng ta nhận định sự khác nhau khi một lệnh bắt đầu thi hành và khi nó thực hiện hoàn tất; giữa hai lần, lệnh đang trong quá trình thi hành. Đường ống của chúng ta cho phép nhiều lệnh cùng thực hiện cùng thời gian, không có khả năng này, những thuận lợi chính là lập lịch động biến mất. Việc có nhiều lệnh thực hiện ngay lập tức yêu cầu những đơn vị chức năng, đơn vị chức năng đường ống, hoặc cả hai. Từ hai khả năng này đơn vị chức năng đường ống và những đơn vị chức năng thì tương đương cho những mục đích của điều khiển đường ống, chúng ta sẽ giả thiết bộ xử lý có nhiều đơn vị chức năng. Trong một đường ống lập lịch dộng, tất cả lệnh thông qua vấn đề biểu đạt trong mệnh lệnh; tuy nhiên, chúng có thể bị hư hoặc đi lòng vòng trong giai đoạn hai (đọc toán hạng) và như vậy thực hiện lệnh thoát. Scoreboarding là một kỹ thuật cho phép những lệnh không thi hành lệnh khi có những tài nguyên đủ và không có dữ liệu phụ thuộc; đó là CDC 6600 và có tên scoreboard, với sự phát triển khả năng này. Tại đây chúng tôi tập trung vào một kỹ thuật phức tạp hơn, gọi là giải thuật Tomasulo và là sự nâng cao chính cho scoreboarding. b. Lập lịch động sử dụng tiếp cận TOMASULO Đơn vị dấu chấm động IBM 360/91 đang sử dụng là một hệ thống phức tạp để cho phép ngưng thi hành lệnh. Hệ thống này, phát minh bởi Robert Tomasulo, những đường đi khi toán hạng cho các lệnh sẵn có, để giảm thiểu nguy hại RAW, giới thiệu việc đổi thanh ghi, giảm thiểu nguy hại cho WAW và WAR. Có nhiều sự biến đổi trên sơ đồ này trong bộ xử lý hiện đại, mặc dù khái niệm chìa khóa của đường dẫn phụ thuộc cho phép thi hành lệnh ngay khi toán hạng có sẵn và đổi tên thanh ghi để tránh nguy hại cho WAR và WAW là những đặc trưng chung. Mục đích của IBM là đạt được biểu hiện dấu chấm động cao và đến từ thiết lập đường dẫn và từ những bộ biên dịch thiết kế cho họ máy tính 360, hơn là chuyên môn hóa từ những bộ biên dịnh đặc biệt cho những bộ xử lý cấp cao. Kiến trúc 360 chỉ có 4 bộ thanh ghi dấu chấm động chính xác kép, với giới hạn ảnh

77 78 Kiến trúc máy tính tiên tiến hưởng của bộ lập lịch biên dịch; thực tế đây là cách khác để tiếp cận Tomasulo. Ngoài ra, IBM 360/91 có những sự truy cập bộ nhớ những sự trì hoãn dấu chấm động dài, giải thuật Tomasulo được thiết kế ra để giải quyết nó. Ở cuối phần này, chúng ta sẽ thấy giải thuật Tomaluso hỗ trợ sự trùng lắp thực thi những sự lặp đi lặp lại của một vòng. Chúng ta giải thích giải thuật, tập trung vào đơn vị dấu chấm động và đơn vị lưu trữ, trong ngữ cảnh thiết lập đường dẫn MIPS. Sự khác biệt cơ bản giữa MIPS và 360 là sự có mặt của các lệnh bộ nhớ thanh ghi trong kiến trúc mới. Vì những giải thuật của Tomasulo sử dụng đơn vị chức năng tải, không có sự thay đổi có ý nghĩa cần để thêm vào các mẫu địa chỉ bộ nhớ thanh ghi. IBM 360/91 đã có cả đơn vị chức năng đường ống, hơn là những đơn vị nhiều chức năng, nhưng chúng ta mô tả thuật toán như thể là có những đơn vị nhiều chức năng. Đó là những khái niệm mở rộng đơn giản tới đường ống những đơn vị chức năng. Như chúng ta sẽ thấy, những mối nguy hại cho RAW sẽ tránh được bởi việc thực hiện các lệnh khi những toán hạng của nó sẵn có. Các nguy hại WAR và WAW, xuất hiện từ những sự phụ thuộc tên, sẽ bị loại bỏ bởi thanh ghi đổi tên. Thanh ghi đổi tên loại bỏ những mối nguy hại bằng việc thay đổi các thanh ghi đến, bao gồm tất cả với việc trì hoãn việc đọc hay ghi cho những lệnh quá sớm, vì thế việc không được phép ghi không ảnh hưởng đến bất kỳ lệnh nào mà phụ thuộc vào giá trị trước đó của một toán hạng. Để hiểu sâu hơn về việc thanh ghi đổi tên giới hạn được các mối nguy hại WAR và WAW, xem xét chuỗi mã các ví dụ sau bao gồm cả các mối nguy hại tiềm tàng đối với WAR và WAW: DIV.D ADD.D S.D SUB.D MUL.D F0,F2,F4 F6,F0,F8 F6,0(R1) F8,F10,F14 F6,F10,F8 Có một sự không phụ thuộc giữa ADD.D và SUB.D và sự phụ thuộc đầu ra giữa ADD.D và MUL.D dẫn đến 2 mối nguy hại có thể xảy ra: mối nguy hại cho WAR việc sử dụng F8 bởi ADD.D và một mối nguy hại cho WAW kể từ khi ADD.D có thể kết thúc trễ hơn MUL.D. Có cả 3 sự phụ thuộc dữ liệu đúng; giữa DIV.D và ADD.D, giữa SUB.D và MUL.D, giữa ADD.D và S.D. Có 2 sự phụ thuộc tên có thể cả hai bị giới hạn bởi thanh ghi đổi tên. Tính đơn giản, giả thiết sự tồn tại của 2 thanh ghi tạm, S và T. Sử dụng S và T, chuỗi có được viết lại hay không cần sự phụ thuộc của:

78 Chương 2: Khối xử lý song song ở mức lệnh máy 79 DIV.D ADD.D S.D SUB.D MUL.D F0,F2,F4 S,F0,F8 S,0(R1) T,F10,F14 F6,F10,T Ngoài ra, bất kỳ sự sử dụng kế tiếp của F8 phải được thay thế bởi thanh ghi T. Trong đoạn mã này, việc đổi tên quá trình có thể được thực hiện tĩnh bởi bộ biên dịch. Việc tìm thấy sự sử dụng bất kỳ F8 nào sau đó trong mã yêu cầu hoặc sự phân tích bộ biên dịch phức tạp hoặc hỗ trợ phần cứng, kể từ khi có thể can thiệp vào những nhánh giữa trên đoạn mã này và sự sử dụng F8 sau. Giải thuật Tomasulo có thể được xử lý đổi tên ngang qua những nhánh. Ở sơ đồ Tomaluso, thanh ghi đổi tên được cung cấp bởi những trạm dự trữ (reservation station), bộ đệm của những toán hạng của lệnh đang đợi để phát. Ý tưởng cơ bản là trạm dự trữ đem về và những bộ đệm ngay khi nó có, loại trừ nhu cầu nhận toán hạng từ thanh ghi. Ngoài ra, những lệnh đang xem xét chỉ định trạm dự trữ mà sẽ cung cấp đầu vào của nó. Cuối cùng, khi những lệnh ghi liên tiếp tới thanh ghi chồng lên nhau thực hiện, chỉ một lệnh cuối cùng thật sự được dùng để cập nhật thanh ghi. Như những lệnh đã được phát, thanh ghi chỉ rõ những toán hạng đang xem xét được đổi tên tới những tên của trạm dự trữ, mà đã cung cấp thanh ghi đổi tên. Kể từ khi có nhiều trạm dự trữ hơn những thanh ghi thực sự, kỹ thuật đó có thể loại trừ những mối nguy hại được nảy sinh từ tên những sự phụ thuộc mà đã không thể được loại trừ bởi một bộ biên dịch. Trong khi chúng ta khám phá những thành phần sơ đồ Tomasulo, chúng ta sẽ trở lại đề tài thanh ghi đổi tên và thấy chính xác đổi tên xuất hiện như thế nào và làm sao nó loại trừ mối nguy hại cho WAR và WAW. Sự sử dụng những trạm dự trữ, hơn tập tin thanh ghi tập trung, dẫn tới hai thuộc tính quan trọng khác. Đầu tiên, phát hiện mối nguy hại và điều khiển thực thi là phân tán: thông tin giữ trong trạm dự trữ tại mỗi đơn vị chức năng xác định khi một lệnh có thể bắt đầu thực thi tại đơn vị kia. Thứ hai, những kết quả được đi trực tiếp qua tới những đơn vị chức năng từ những trạm dự trữ nơi có bộ đệm, hơn là việc đi qua thanh ghi. Việc đi vòng đó được làm với một kết quả chung đường dẫn mà cho phép tất cả các đơn vị đợi một toán hạng để tương thích. Trong những đường ống với nhiều đơn vị thực hiện và phát hành nhiều lệnh trên mỗi xung đồng hồ, nhiều hơn một kết quả đường dẫn cần thiết. Hình 2.7 cho thấy cấu trúc cơ bản của bộ xử lý cơ bản Tomasulo, bao gồm cả đơn vị dấu chấm động lẫn đơn vị lưu trữ tải; không ai trong số những bảng điều khiển thực hiện được chỉ ra. Mỗi trạm dự trữ giữ một lệnh mà đã được đưa ra và đợi

79 80 Kiến trúc máy tính tiên tiến sự thực hiện tại một đơn vị chức năng và mọi giá trị toán hạng cho lệnh đó, nếu chúng đã có tính toán, hay là những tên của những trạm dự trữ sẽ cung cấp những giá trị toán hạng. Những bộ đệm tải và những bộ đệm lưu trữ dữ liệu hay những địa chỉ đến và đi đến bộ nhớ và xử lý gần như chính xác giống những trạm dự trữ, vì vậy chúng ta chỉ phân loại chỉ khi cần thiết. Những bộ ghi dấu chấm động được nối bởi một cặp đường dẫn tới những đơn vị chức năng và bởi đường dẫn đơn tới những bộ đệm lưu trữ. Hình 2.7: Cấu trúc cơ bản của một đơn vị dấu chấm động MIPS đang sử dụng giải thuật Tomasulo. Những lệnh được gửi từ đơn vị lệnh vào trong hàng lệnh từ đó chúng được đưa vào trong lệnh FIFO. Những trạm dự trữ bao gồm những toán hạng và toán hạng thực, cũng như thông tin tốt được sử dụng cho sự phát hiện và giải quyết những mối nguy hiểm. Những bộ đệm tải có ba chức năng: giữ lại những địa chỉ hiệu quả cho đến khi nó được tính toán, theo dõi những sự nạp trên địa chỉ bộ nhớ và giữ lại kết quả của những lần tải được bổ sung đang đợi trên CDB. Tương tự, bộ đệm lưu trữ có ba chức năng: giữ những địa chỉ hiệu quả cho đến khi nó được tính toán, giữ những địa chỉ bộ nhớ đến những phần lưu trữ còn lại mà đang đợi giá trị dữ liệu cất giữ và giữ địa chỉ và giá trị để lưu trữ đến bộ nhớ có sẵn. Tất cả những kết quả từ những đơn vị FP hoặc đơn vị tải được mang trên CDB, mà đi đến thanh ghi tập tin FP cũng như tới trạm dự trữ và bộ đệm lưu trữ. Những địa chỉ FP thực hiện cộng và trừ, những bộ nhân FP làm nhân và chia kết quả từ những đơn vị chức năng và từ bộ nhớ được gửi đến tuyến dữ liệu chung, đi khắp nơi trừ bộ đệm tải.

80 Chương 2: Khối xử lý song song ở mức lệnh máy 81 Trước đây chúng ta mô tả những chi tiết của trạm riêng và giải thuật, chúng ta hãy cùng quan sát lại những bước một lệnh xuyên qua. Chỉ có ba bước: 1. Phát ra - Nhận lấy lệnh kế tiếp từ đầu của hàng đợi lệnh, mà được bảo trì ở FIFO ra lệnh bảo đảm sự bảo trì của luồng dữ liệu đúng. Nếu có một trạm dự trữ tương thích rỗng, hãy phát lệnh đến trạm với những giá trị toán hạng, nếu chúng hiện hành trong những thanh ghi. Nếu không có trạm dự trữ rỗng, sau đó có một cấu trúc nguy hại và các độ trì hoãn lệnh cho đến trạm hay bộ đệm được giải phóng. Nếu những toán hạng không trong những thanh ghi, giữ lại dấu vết của những đơn vị chức năng cho đến khi sản xuất những toán hạng. Bước này đổi tên các thanh ghi, loại trừ mối nguy hại cho WAR và WAW. (Giai đoạn này đôi khi được gọi là sự chuyển đi (dispatch) trong một bộ xử lý lập lịch động). 2. Thực hiện lệnh - Nếu một hoặc nhiều trong số những toán hạng chưa sẵn sàng, giám sát tuyến dữ liệu chung trong khi đợi được xử lý. Khi một toán hạng sẵn sàng, nó sẽ được đặt vào trong bất kỳ trạm dự trữ nào đợi nó. Khi tất cả những toán hạng đều sẵn sàng, các thao tác có thể được thực hiện tại đơn vị chức năng tương ứng. Bởi việc trễ thực hiện lệnh cho đến những toán hạng sẵn sàng, những mối nguy hại cho RAW được tránh. (Một số bộ xử lý lập lịch động được gọi ở bước này phát ra, nhưng chúng ta sử dụng tên thực hiện lệnh, được dùng trong bộ xử lý lập lịch động đầu tiên, CDC 6600). Chú ý rằng một vài lệnh có thể trở nên sẵn sàng trong cùng chu kỳ xung đồng hồ giống như đơn vị chức năng. Mặc dù những đơn vị chức năng độc lập đã có thể bắt đầu thực hiện trong cùng chu kỳ xung đồng hồ cho những lệnh khác biệt, nếu nhiều hơn 1 lệnh sẵn sàng cho một đơn vị chức năng đơn, đơn vị sẽ phải chọn trong số chúng. Cho những trạm dự trữ dấu chấm động, sự lựa chọn này có thể làm tùy ý, tải và lưu trữ. Tải và lưu trữ đòi hòi 2 bước xử lý thi hành lệnh. Bước đầu tiên tính toán địa chỉ có hiệu lực khi thanh ghi cơ sở sẵn sàng và địa chỉ có hiệu lực là bộ đệm khi thay thế trong tải hay lưu trữ. Bộ đệm tải và lưu trữ thực hiện ngay khi đơn vị bộ nhớ sẵn sàng. Lưu trữ trong bộ đệm lưu trữ đợi cho giá trị lưu trữ trước được gửi tới đơn vị bộ nhớ. Tải và lưu trữ được bảo trì trong chương trình ra lệnh thông qua sự tính toán của địa chỉ có hiệu lực, mà sẽ giúp ngăn ngừa các mối nguy hại thông qua bộ nhớ. Để ngăn ngừa những hành vi ngoại lệ, không có lệnh nào được cho phép để bắt đầu thi hành lệnh cho đến tất cả các nhánh đó đi trước 1 lệnh trong chương trình ra lệnh được hoàn thành. Những hạn chế này đảm bảo rằng lệnh đó gây ra một ngoại lệ trong thời gian thực hiện lệnh thực sự đã được thực hiện. Trong một bộ xử lý sử dụng sự dự báo nhánh (như tất cả các bộ xử lý lập lịch động đã làm), có nghĩa

81 82 Kiến trúc máy tính tiên tiến là những bộ xử lý này phải biết sự dự báo nhánh đúng trước khi việc cho phép một lệnh sau khi nhánh bắt đầu thực hiện lệnh. Nếu những bộ xử lý ghi nhận biến cố ngoại lệ, nhưng không thật sự tiến triển, một lệnh có thể bắt đầu thực hiện nhưng không làm chậm cho đến khi nó được nhập vào kết quả ghi. Sự lưu trữ cung cấp một phương pháp linh hoạt và đầy đủ hơn để xử lý những ngoại lệ, vì vậy chúng ta sẽ hoãn việc nâng cấp chúng và chỉ ra là sự lưu trữ xử lý vấn đề này sau đó như thế nào. 3. Kết quả ghi - Khi kết quả sẵn sàng, ghi nó trên CDB và từ đó vào trong những thanh ghi và vào trong bất kỳ trạm dự trữ nào (bao gồm những bộ đệm lưu trữ) đợi kết quả này. Lưu trữ và được đệm trong bộ đệm lưu trữ cho đến khi cả giá trị sẽ được lưu trữ lẫn địa chỉ sẵn sàng, rồi kết quả được ghi ngay khi đơn vị bộ nhớ trống. Những cấu trúc dữ liệu mà phát hiện và loại trừ những mối nguy hại được gán cho những trạm dự trữ, tới tập tin thanh ghi, tới các bộ đệm tải và lưu trữ với thông tin hơi khác nhau được gán tới những đối tượng khác nhau. Những thẻ này thực chất là những tên tập mở rộng của những thanh ghi ảo được dùng cho đổi tên. Trong ví dụ của chúng ta, trường thẻ bao gồm 4 bit mà biểu thị 1 trong 5 trạm dự trữ hay 1 trong 5 bộ đệm tải. Như chúng ta khảo sát, sản phẩm này tương đương 10 thanh ghi mà có thể được chỉ định như thanh ghi kết quả. Trong một bộ xử lý với nhiều thanh ghi thực sự hơn, chúng ta muốn đổi tên để cung cấp một tập hợp thậm chí còn lớn hơn những thanh ghi ảo. Trường thẻ định rõ tính chất trạm dự trữ nào chứa đựng lệnh mà sẽ sản xuất một kết quả cần như một toán hạng gốc. Một lần một lệnh được phát và đợi một toán hạng gốc, nó tham chiếu tới toán hạng bởi số trạm dự trữ nơi mà lệnh sẽ ghi lên thanh ghi được gán. Những giá trị không sử dụng, như chữ số không, chỉ báo rằng toán hạng đã sẵn sàng trong những thanh ghi. Vì có nhiều trạm dự trữ hơn những thanh ghi thực tế, mối nguy hại cho WAW và WAR được loại trừ bởi việc đổi tên những kết quả sử dụng những trạm dự trữ. Mặc dù ở sơ đồ Tomasulo trạm dự trữ vào vị trí được sử dụng như những thanh ghi ảo được mở rộng, những cách tiếp cận khác có thể sử dụng một tập hợp thanh ghi với những thanh ghi bổ sung hay một cấu trúc như bộ đệm ghi, mà chúng ta sẽ nhìn thấy trong mục 2.6. Trong sơ đồ Tomasulo, cũng như những phương pháp kế tiếp chúng ta quan sát để hỗ trợ sự lưu trữ, những kết quả được lan truyền trên một tuyến (CDB), mà được theo dõi bởi trạm dự trữ. Sự kết hợp của tuyến kết quả chung và sự lấy lại những kết quả từ tuyến bởi những trạm dự trữ thực hiện. Các cơ chế chuyển tiếp và đi vòng được dùng trong đường ống lập lịch tĩnh. Trong lúc thực hiện, tuy nhiên, một sơ đồ lập lịch động giới thiệu một chu trình của sự tiềm ẩn giữa nguồn và kết quả, từ sự thích ứng của một kết quả và việc sử dụng của nó không thể được thực

82 Chương 2: Khối xử lý song song ở mức lệnh máy 83 hiện cho đến giai đoạn kết quả ghi. Như vậy, trong một đường ống lập lịch động, sự tiềm ẩn có hiệu quả giữa một lệnh sản sinh và một lệnh chi phối ít nhất một chu trình dài hơn so với sự trễ của đơn vị chức năng kết quả. Trong việc mô tả thao tác của sơ đồ này, chúng ta sử dụng một thuật ngữ được lấy từ sơ đồ CDC scoreboard hơn so với giới thiệu thuật ngữ mới, cho thấy thuật ngữ được dùng bởi IBM 360/91 trước đó. Nó quan trọng để nhớ mà các thẻ trong sơ đồ Tomasulo tham chiếu tới bộ đệm hay đơn vị mà sẽ sản xuất một kết quả; những thanh ghi được bỏ khi một lệnh phát ra tới một trạm dự trữ. Mỗi trạm dự trữ có 7 trường: Op - Thao tác để thực hiện trên những toán hạng gốc S1 và S2. Qj, Qk - Những trạm dự trữ mà sẽ sản xuất toán hạng gốc tương ứng; một giá trị của chữ số không chỉ báo toán hạng gốc đã có sẵn ở Vj hay Vk, hoặc là không cần thiết (IBM 360/91 gọi là đơn vị SINK và đơn vị SOURCE). Vj, Vk - Giá trị của những toán hạng gốc. Lưu ý rằng chỉ một trường V hoặc trường Q thì hợp lệ cho mỗi toán hạng. Để tải, trường Vk được dùng để giữ trường offset (Những trường này được gọi là SINK và SOURCE trên IBM 360/91). A - Được dùng để giữ thông tin cho tính toán địa chỉ bộ nhớ cho việc tải hay lưu trữ. Thoạt đầu, trường tức thời của lệnh được cất giữ ở đây; sau việc tính toán địa chỉ, địa chỉ có hiệu lực được cất giữ ở đây. Busy - Chỉ ra rằng trạm dự trữ này và các đơn vị chức năng kèm theo này bị chiếm giữ. Tập tin thanh ghi có một trường, Qi: Qi - Số của trạm dự trữ chứa thao tác mà kết quả của nó cần phải được lưu trữ vào trong thanh ghi này. Nếu giá trị của Qi rỗng (hay 0), không có lệnh tích cực hiện thời là tính toán kết quả dành cho thanh ghi này, có nghĩa giá trị kia đơn giản là nội dung thanh ghi. Trong mục kế tiếp, chúng ta sẽ đầu tiên xem xét một số ví dụ mà chỉ ra những cơ chế này làm việc như thế nào và sau đó khảo sát giải thuật chi tiết Những ví dụ và giải thuật của lập lịch động Trước đây chúng ta khảo sát giải thuật Tomasulo chi tiết, hãy cùng xem một vài ví dụ, mà sẽ giúp chúng ta minh họa giải thuật làm việc như thế nào. Ví dụ: Hãy trình bày những bảng thông tin giống như chuỗi mã sau đây, khi chỉ với tải đầu tiên được hoàn thành và ghi lại kết quả của nó:

83 84 Kiến trúc máy tính tiên tiến 1. L.D F6, 32 (R2) 2. L.D F2, 44 (R3) 3. MUL.D F0, F2, F4 4. SUB.D F8, F2, F6 5. DIV.D F10, F0, F6 6. ADD.D F6, F8, F2 Trả lời: Hình 2.8 cho thấy kết quả trong ba bảng. Những số được bổ sung vào những tên add, mult và load thay thế cho thẻ đối với trạm dự trữ đó - Add1 là thẻ cho kết quả đến từ đơn vị add đầu tiên. Trong đó có bao gồm một bảng trạng trạng thái lệnh. Bảng này chỉ giúp bạn hiểu giải thuật; đó không thật sự là một phần của phần cứng. Thay vào đó, trạm dự trữ giữ ở trạng thái mỗi phép toán được phát ra. Sơ đồ Tomasulo cung cấp hai lợi thế chính là sớm và đơn giản hơn những sơ đồ: (1) phân bố dò tìm mối nguy hiểm luận lý, và (2) sự loại bỏ những luồng nguy hại cho WAW và WAR. Lợi thế đầu tiên xuất hiện từ những trạm dự trữ phân tán và sử dụng tuyến dữ liệu chung (CDB). Nếu nhiều lệnh đang đợi một kết quả đơn và mỗi lệnh sẵn sàng có toán hạng khác, rồi các lệnh có thể được kết thúc đồng thời bởi quảng bá kết quả trên CDB. Nếu một tập tin thanh ghi tập trung được sử dụng, những đơn vị phải đọc những kết quả của nó từ những thanh ghi khi các tuyến thanh ghi đã sẵn sàng. Lợi thế thứ hai, sự giới hạn nguy hại của WAW và WAR, được hoàn thành bởi việc đổi tên những thanh ghi sử dụng những trạm dự trữ và bởi quá trình của lưu trữ những toán hạng vào trong trạm dự trữ ngay khi chúng sẵn sàng. Ví dụ, chuỗi mã trong hình 2.8 đưa ra cả hai DIV.D và ADD.D, mặc dù có một mối nguy hại WAR liên quan đến F6. Mối nguy hại được loại trừ bởi một trong hai cách. Đầu tiên, nếu lệnh cung cấp giá trị cho DIV.D được hoàn thành, sau đó Vk sẽ lưu trữ kết quả, cho phép DIV.D để thực hiện độc lập so với ADD.D (đây là trường hợp được xét). Mặt khác, nếu L.D không được hoàn thành, sau đó Qk sẽ trỏ tới trạm dự trữ Load1 và lệnh DIV.D sẽ thực hiện độc lập so với ADD.D. Như vậy, trong mọi trường hợp, ADD.D có thể sinh ra và bắt đầu thực hiện. Mọi sự sử dụng kết quả của DIV.D dẫn tới trạm dự trữ, cho phép ADD.D để hoàn thành và lưu trữ giá trị của nó vào trong những thanh ghi không có ảnh hưởng DIV.D. Chúng ta sẽ thấy một ví dụ của sự loại bỏ mối nguy hại WAW không lâu nữa. Nhưng đầu tiên chúng ta quan sát ví dụ trước đó của chúng ta tiếp tục thực hiện như thế nào. Trong ví dụ này và tiếp theo sau trong chương này, giả thiết những sự tiềm ẩn sau đây: tải là 1 chu kỳ xung đồng hồ, thêm 2 chu kỳ xung đồng hồ, nhân lên 6 chu kỳ xung đồng hồ và chia 12 chu kỳ xung đồng hồ.

84 Chương 2: Khối xử lý song song ở mức lệnh máy 85 Hình 2.8: Những trạm dự trữ (Reservation station) và các thẻ thanh ghi cho thấy khi tất cả các lệnh được phát ra, nhưng chỉ có lệnh tải đầu tiên được hoàn thành và ghi nhận kết quả của nó tới CDB. Tải thứ 2 được hoàn thành ảnh hưởng đến sự tính toán địa chỉ, nhưng đang đợi trên đơn vị bộ nhớ. Chúng ta sử dụng mảng Regs[ ] để tham chiếu tới tập tin thanh ghi và mảng Mem[ ] để tham chiếu tới bộ nhớ. Nhớ rằng một toán hạng được chỉ rõ bởi cả trường Q hay trường V vào bất kỳ thời gian nào. Chú ý rằng lệnh ADD.D, mà có một mối nguy hại đến WAR tại bậc WB, được sinh ra và có thể hoàn thành trước khi DIV.D khởi tạo. Ví dụ: Sử dụng cùng một mã giống nhau như trong ví dụ trước, cho thấy những bảng tình trạng giống như vậy khi MUL.D sẵn sàng để ghi kết quả của nó. Trả lời: Kết quả được chỉ ra trong ba bảng trong hình 2.9. Chú ý rằng ADD.D được hoàn thành từ lúc những toán hạng của DIV.D được sao chép, do đó vượt qua mối nguy hại WAR. Chú ý, dù tải F6 bị trì hoãn, thêm vào trong F6 có thể được thực hiện mà không cần sự gây nguy hại WAW Chi tiết thuật toán tomasulo Hình 2.10 chỉ ra những sự kiểm tra và những bước mà mỗi lệnh phải đi xuyên qua. Như đã đề cập trước đây, tải và lưu trữ đi thông qua một đơn vị chức năng cho

85 86 Kiến trúc máy tính tiên tiến tính toán địa chỉ có hiệu quả trước khi tới tải độc lập hay các bộ đệm lưu trữ. Tải là bước thực hiện thứ hai tới bộ nhớ truy nhập và sau đó đi đến kết quả ghi và gửi giá trị bộ nhớ đến tập tin thanh ghi và/hoặc bất kỳ trạm dự trữ nào. Lưu trữ hoàn thành sự thực hiện của chúng trong giai đoạn kết quả ghi. Chú ý, tất cả bản ghi trong thanh ghi kết quả, đích đến là thanh ghi hay bộ nhớ. Sự hạn chế này đơn giản hóa giải thuật Tomasulo và có tính quyết định tới hoạt động mở rộng của nó với sự lưu trữ trong mục 2.6. Hình 2.9: Nhân và chia chỉ là các lệnh chưa hoàn tất. Giải thuật Tomasulo: Ví dụ trên nền tảng vòng lặp Để hiểu toàn phần về loại bỏ nguy hại WAW và WAR thông qua sự đổi tên động những thanh ghi, chúng ta phải quan sát vòng lặp. Xem xét chuỗi đơn giản sau đây để nhân những phần tử của một mảng bởi một vô hướng trong F2: Loop: L.D F0,0(R1) MUL.D F4,F0,F2

86 Chương 2: Khối xử lý song song ở mức lệnh máy 87 S.D F4,0(R1) DADDIU R1,R1,#-8 BNE R1,R2,Loop; branches if R1 R2 Hình 2.10: Bước vào giải thuật và những điều được yêu cầu cho mỗi bước. Cho phát lệnh, rd là đích đến, rs và rt là số thanh ghi gốc, imm là dấu hiệu mở rộng khu vực tức thời và r là trạm dự trữ hay bộ đệm mà có lệnh được gán tới. RS là trạm dự trữ cấu trúc dữ liệu. Giá trị được trả về bởi một đơn vị FP hay bởi đơn vị tải được gọi là kết quả. RegisterStat là trạng thái thanh ghi cấu trúc dữ liệu. Khi một lệnh được phát ra, thanh ghi đích đến có trường Qi của nó được thiết lập đến số của bộ đệm hay trạm dự trữ mà lệnh được phát ra. Nếu những toán hạng sẵn sàng trong những thanh ghi, chúng được cất giữ trong trường V. Cách khác, trường Q được đặt ra để báo tới trạm dự trữ nơi sẽ sản xuất những giá trị cần như những toán hạng gốc. Một lệnh đợi ở trạm dự trữ cho đến khi cả hai toán hạng của nó tồn tại, chỉ thị bởi số không trong trường Q. Trường Q thì được cài đặt đến chữ số không hoặc khi lệnh này được phát ra, hay khi một lệnh mà trên đó lệnh này phụ thuộc hoàn thành và được viết lại. Khi một lệnh hoàn tất thực hiện và CDB sẵn sàng, nó có thể được viết lại. Tất cả những bộ đệm, những thanh ghi và trạm dự trữ mà giá trị của Qj hay Qk thì giống như là hoàn thành trạm dự trữ cập nhật những giá trị của nó từ CDB và đánh dấu trường Q để chỉ báo những giá trị đã được nhận. Sau đó, CDB có thể quảng bá kết quả của nó tới nhiều đích đến trong một chu kỳ xung đơn và nếu những lệnh đang đợi có những toán hạng của chúng, chúng có thể bắt đầu thực hiện tất

87 88 Kiến trúc máy tính tiên tiến cả trên chu kỳ xung kế tiếp. Lưu ý rằng đó là hành vi ngăn ngừa ngoại lệ, những lệnh không được cho phép để thực hiện nếu một nhánh làm sớm hơn trong chương trình thứ tự chưa được hoàn thành. Vì bất kỳ khái niệm nào của chương trình ra lệnh không được đề cập sau giai đoạn phát, sự hạn chế này thông thường được thực hiện bởi ngăn ngừa bất kỳ lệnh nào rời bỏ bước phát, nếu có một nhánh đang xem xét đã trong đường ống. Nếu chúng ta dự đoán những nhánh được lấy, sử dụng trạm dự trữ sẽ cho phép nhiều thực hiện của vòng lặp này để tiến hành ngay lập tức. Ưu điểm này là được độ lợi mà không thay đổi mã - trong hiệu ứng, vòng đang được mở ra động bởi phần cứng sử dụng trạm dự trữ đạt được bởi đổi tên để hành động như thanh ghi bổ sung. Chúng ta hãy cùng giả sử phát tất cả các lệnh trong hai vòng lặp, nhưng không gì của dấu chấm động tải - lưu trữ hay thao tác được hoàn thành. Hình 2.11 cho thấy trạm dự trữ, những bảng tình trạng thanh ghi và bộ đệm tải và lưu trữ tại điểm này. (Thao tác ALU số nguyên được bỏ qua và nó được giả thiết nhánh dự đoán như được lấy). Một lần hệ thống đạt đến trạng thái này, hai sự sao chép của vòng đã có thể duy trì với một CPI gần đến 1, được cung cấp những nhân có thể hoàn thành trong 4 chu kỳ xung đồng hồ. Với một sự tiềm ẩn của 6 chu trình, bổ sung những sự lặp sẽ cần để xử lý trước khi trạng thái ổn định có thể đạt được. Khi mở rộng với nhiều lệnh được phát ra, cách tiếp cận Tomasulo có thể chịu đựng nhiều hơn một lệnh mỗi xung. Nạp và lưu trữ có thể an toàn được làm không cần lệnh, cung cấp cho chúng địa chỉ truy nhập khác nhau. Nếu truy nhập nạp và lưu trữ cùng địa chỉ, sau đó: Nạp thì trước lưu trữ trong chương trình ra lệnh và trao đổi các kết quả của chúng trong một nguy hại WAR, hay Lưu trữ thì trước nạp trong chương trình ra lệnh và trao đổi các kết quả của chúng trong một mối nguy hại RAW. Tương tự, trao đổi hai lưu trữ đến cùng địa chỉ kết quả tại mối nguy hiểm WAW. Từ đây, xác định phải chăng nạp có thể được thực hiện vào một thời gian đã cho, bộ xử lý có thể kiểm tra liệu có phải bất kỳ lưu trữ chưa đầy đủ nào mà khởi đầu nạp chương trình ra lệnh chia sẻ cùng địa chỉ bộ nhớ dữ liệu như là tải. Tương tự, một lưu trữ phải đợi cho đến khi không thi hành nạp hay lưu trữ mà trước đó trong chương trình ra lệnh và chia sẻ cùng địa chỉ bộ nhớ dữ liệu. Chúng ta cho rằng một phương pháp là loại trừ sự hạn chế này trong mục 2.9. Để phát hiện ra những mối nguy hiểm như vậy, bộ xử lý phải có tính toán địa chỉ bộ nhớ dữ liệu liên quan đến bất kỳ thao tác bộ nhớ ban đầu nào. Đơn giản, nhưng không tất yếu tối ưu, cách để đảm bảo rằng bộ xử lý có tất cả các địa chỉ như vậy thì thực hiện tính toán địa chỉ hiệu quả trong chương trình.

88 Chương 2: Khối xử lý song song ở mức lệnh máy 89 Hình 2.11: Hai hoạt động lặp lại của vòng lặp không có lệnh chưa được hoàn thành. Những mục nhập trong nhiều trạm dự trữ cho thấy rằng các tải nổi bật là các nguồn. Các trạm dự trữ lưu trữ cho thấy rằng các đích là nguồn của giá trị để lưu trữ. Hãy xem xét trạng thái tải đầu tiên. Nếu chúng ta thực hiện tính toán địa chỉ hiệu quả theo thứ tự chương trình, sau đó khi nạp một địa chỉ hiệu quả đã hoàn thành, chúng ta có thể kiểm tra xem liệu có một cuộc xung đột địa chỉ nào không bằng cách kiểm tra trường A của tất cả các bộ đệm lưu trữ hoạt động. Nếu địa chỉ tải khớp với địa chỉ của bất kỳ mục hoạt động nào trong vùng đệm lưu trữ, mà lệnh tải không được gửi đến bộ đệm tải cho đến khi hoàn thành xung đột ở lưu trữ. Việc lưu trữ cũng hoạt động tương tự, ngoại trừ bộ xử lý phải kiểm tra xem có xung đột ở cả các vùng đệm tải và các bộ đệm lưu trữ, khi đó những lưu trữ xung đột không thể được sắp xếp lại với quá trình tải hoặc lưu trữ. Một đường ống lập lịch động có thể mang lại hiệu suất rất cao, cung cấp các nhánh chính xác như đã dự đoán - một vấn đề chúng ta đã đề cập trong phần trước. Hạn chế lớn của phương pháp này là sự phức tạp của biểu đồ Tomasulo, đòi hỏi một

89 90 Kiến trúc máy tính tiên tiến lượng lớn phần cứng. Đặc biệt, mỗi trạm dự trữ phải có một bộ đệm kết hợp, phải chạy ở tốc độ cao, cũng như điều khiển logic phức tạp. Hiệu suất cũng vì thế mà bị giới hạn bởi các CDB đơn. Mặc dù các CDB có thể được bổ sung thêm, nhưng mỗi CDB phải tương tác với mỗi trạm dự trữ và phần cứng phối hợp sẽ cần phải được nhân đôi ở mỗi trạm cho mỗi CDB. Trong biểu đồ Tomasulo có hai kỹ thuật khác nhau được kết hợp: việc đổi tên trong những kiến trúc thanh ghi cho một tập lớn hơn của những thanh ghi và bộ đệm của toán hạng nguồn từ các tập tin thanh ghi. Nguồn toán hạng đệm WAR giải quyết những mối nguy hiểm phát sinh khi các toán hạng có sẵn trong thanh ghi. Nó cũng có thể để loại trừ các rủi ro của WAR bằng cách đổi tên thanh ghi đi kèm với đệm kết quả cho đến khi không có tham chiếu nổi bật với phiên bản trước đó của thanh ghi còn lại. Cách tiếp cận này sẽ được sử dụng khi chúng ta thảo luận về dự trữ phần cứng. Biểu đồ của Tomasulo không phổ biến trong vài năm sau đó, nhưng đã được chấp nhận rộng rãi trong việc xử lý nhiều vấn đề bắt đầu vào những năm 1990 vì nhiều lý do: 1. Nó có thể đạt được hiệu suất cao mà không đòi hỏi người biên dịch có mã đích vào một cấu trúc đường ống cụ thể, tính chất quý báu trong thời đại của phần mềm thu nhỏ trong lòng thị trường đại chúng. 2. Mặc dù thuật toán của Tomasulo được thiết kế trước cache, nhưng sự hiện diện của cache, với sự chậm trễ vốn dĩ không thể đoán trước, đã trở thành một trong những động lực chính cho lập lịch động. Trật tự thực hiện cho phép bộ vi xử lý được tiếp tục thực hiện các lệnh trong khi chờ đợi hoàn thành một bộ nhớ cache bị trễ, do đó ẩn tất cả hay một phần của bộ nhớ cache trễ bị lỗi. 3. Như bộ vi xử lý trở thành tích cực hơn trong vấn đề khả năng của mình và nhà thiết kế liên quan đến việc tối ưu các đoạn mã ở các biểu đồ khó lập (như hầu hết mã nonnumeric), các kỹ thuật chẳng hạn như đổi tên thanh ghi và lập lịch động trở nên quan trọng hơn. 4. Bởi vì lập lịch động là một thành phần quan trọng của sự nghiên cứu, nên nó đã được thông qua cùng với sự nghiên cứu phần cứng vào những năm giữa của thập niên Lưu trữ dựa trên phần cứng Khi chúng ta cố gắng khai thác thêm khả năng thực hiện lệnh song song, thì sự duy trì việc phụ thuộc vào điều khiển trở thành một gánh nặng ngày càng tăng. Sự dự đoán các nhánh sẽ hạn chế sự ngừng hoạt động trực tiếp có thể ảnh hưởng

90 Chương 2: Khối xử lý song song ở mức lệnh máy 91 đến các nhánh, nhưng đối với một bộ xử lý đang chạy nhiều lệnh trong mỗi xung đồng hồ, chỉ cần các nhánh dự đoán chính xác có thể không đủ để tạo ra các yêu cầu khả năng thực hiện lệnh song song. Một bộ xử lý vấn đề lớn có thể cần phải thực hiện một nhánh mỗi chu kỳ xung đồng hồ để duy trì hiệu suất tối đa. Do đó, việc khai thác nhiều lệnh song song hơn đòi hỏi chúng ta vượt qua những giới hạn của sự phụ thuộc điều khiển. Quá trình khắc phục sự phụ thuộc điều khiển được thực hiện bằng cách lưu trữ về kết quả của các nhánh và thi hành các chương trình, xem như những dự đoán của chúng ta là đúng. Cơ chế này thể hiện một tinh tế, nhưng quan trọng, nó mở rộng đối với sự dự đoán nhánh với lập lịch động. Đặc biệt, với lưu trữ mà chúng ta đặt ra và thực hiện các lệnh, xem như những dự đoán của chúng ta là đúng, lập lịch động chỉ lấy và đưa ra các lệnh đó. Tất nhiên, chúng ta cần cơ chế để xử lý những trạng thái mà sự lưu trữ không chính xác. Trong phần này, chúng ta khám phá sự lưu trữ phần cứng, mở ra những ý tưởng về lập lịch động. Lưu trữ dựa trên phần cứng kết hợp ba ý tưởng chính: dự đoán nhánh động để chọn lệnh thi hành, lưu trữ để cho phép thi hành lệnh trước khi phụ thuộc điều khiển được giải quyết (với khả năng không làm ảnh hưởng của một chuỗi lưu trữ không chính xác) và lập lịch động để giải quyết sự liệt kê các hệ thống khác nhau của các khối cơ bản. (Trong khi đó, lập lịch động mà không có lưu trữ chỉ có một phần trùng lặp các khối cơ bản vì nó đòi hỏi một nhánh được giải quyết trước khi thực sự thực hiện bất kỳ lệnh trong khối thiết kế cơ bản). Phần cứng dựa trên lưu trữ tùy theo lưu lượng đã dự báo của các giá trị dữ liệu để lựa chọn khi thực hiện lệnh. Phương pháp của chương trình thực thi này bản chất là một dòng dữ liệu thực thi: lệnh thi hành ngay sau khi toán hạng của nó tồn tại. Khi mở rộng của thuật toán Tomasulo để hỗ trợ lưu trữ, chúng ta phải tách bỏ các kết quả giữa các lệnh, đó là điều cần thiết để thực hiện một lệnh lưu trữ, từ sự hoàn thành thực của một lệnh. Bằng cách tách này, chúng ta có thể cho phép một lệnh được thực hiện và bỏ qua kết quả đó để đến lệnh khác, mà không cho phép các lệnh thực hiện bất kỳ cập nhật chưa hoàn thành, cho đến khi chúng ta biết rằng chỉ thị không còn là lưu trữ. Sử dụng giá trị đã lược bỏ cũng giống như thực hiện việc đọc một thanh ghi lưu trữ, vì chúng ta không biết liệu chương trình cung cấp giá trị thanh ghi gốc thì có cung cấp kết quả chính xác cho đến khi lệnh không còn lưu trữ hay không. Khi một chương trình không còn lưu trữ, chúng ta cho phép nó cập nhật các tập tin thanh ghi hoặc bộ nhớ, chúng ta gọi đây là bước bổ sung này trong chuỗi thực thi lệnh là chuỗi lệnh chuyển giao (instruction commit).

91 92 Kiến trúc máy tính tiên tiến Ý tưởng chính đằng sau việc thực thi lưu trữ là cho phép các lệnh chạy không theo trật tự nhưng bắt buộc chúng phải chuyển giao theo thứ tự và ngăn chặn mọi hành động không thể thay đổi (chẳng hạn như cập nhật trạng thái hoặc thực thi một ngoại lệ) cho đến khi một lệnh chuyển giao. Do đó, khi chúng ta thêm sự lưu trữ, chúng ta cần phải tách biệt quá trình thực thi kết thúc từ lệnh chuyển giao, khi các lệnh có thể hoàn thành một cách đáng kể trước khi chúng sẵn sàng chuyển giao. Thêm vào giai đoạn chuyển giao này, chuỗi thực thi lệnh yêu cầu một thiết lập phụ của bộ đệm phần cứng để giữ kết quả của các lệnh mà đã thực thi hoàn tất nhưng chưa chuyển giao. Bộ đệm phần cứng này, phần mà chúng ta gọi là bộ đệm sắp xếp lại, cũng được sử dụng để thông qua kết quả giữa các lệnh có thể lưu trữ. Bộ đệm sắp xếp lại ROB (Reorder Buffer) cung cấp những thanh ghi bổ sung trong cùng một cách như các trạm dự trữ trong thuật toán của Tomasulo để mở rộng tập thanh ghi. ROB nắm giữ kết quả của một lệnh cùng với số lần hệ điều hành kết hợp với lệnh hoàn tất và số lần lệnh chuyển giao. Do đó, ROB là nguồn gốc của toán hạng cho các lệnh, cũng giống như các trạm dự trữ cung cấp toán hạng trong thuật toán Tomasulo. Sự khác biệt chính là trong thuật toán của Tomasulo, một khi lệnh ghi một kết quả của nó, mọi lệnh phát ra sau đó sẽ thấy kết quả trong file thanh ghi. Với lưu trữ, các tập tin thanh ghi không được cập nhật cho đến khi lệnh chuyển giao (và chúng ta biết chắc chắn rằng các lệnh cần thực hiện); vì thế, các toán hạng cung cấp ROB trong khoảng giữa sự kết thúc của quá trình lệnh thực thi và lệnh chuyển giao. ROB tương tự như bộ đệm lưu trữ trong thuật toán của Tomasulo và chúng ta có thể tích hợp các chức năng của bộ đệm lưu trữ vào ROB một cách đơn giản. Mỗi mục trong ROB chứa bốn trường: các loại lệnh, các trường đích, trường giá trị và trường sẵn sàng. Trường các kiểu lệnh cho biết liệu lệnh này là một nhánh (và không có kết quả đích), một bộ lưu trữ (trong đó có một địa chỉ bộ nhớ đích), hoặc một thao tác thanh ghi (hoạt động ALU hoặc tải, trong đó có các thanh ghi đích). Trường đích cung cấp số thanh ghi (để tải và hoạt động ALU) hoặc địa chỉ bộ nhớ (để lưu trữ), nơi các kết quả lệnh đã được ghi. Trường giá trị được sử dụng để giữ giá trị kết quả lệnh cho đến khi lệnh chuyển giao. Chúng ta sẽ xem một ví dụ về mục ROB một cách ngắn gọn. Cuối cùng, miền sẵn sàng cho thấy rằng các lệnh đã thực hiện xong và giá trị đã sẵn sàng. Hình 2.12 cho thấy cấu trúc phần cứng của bộ xử lý bao gồm các ROB. Các ROB gộp vào các bộ đệm lưu trữ. Sự lưu trữ vẫn thực hiện theo hai bước, nhưng bước thứ hai được thực hiện theo lệnh chuyển giao. Mặc dù chức năng đổi tên của các trạm lưu trữ được thay thế bởi ROB, chúng ta vẫn cần một nơi để đệm hoạt động (và các toán hạng) giữa số lần chúng đưa ra và thời điểm chúng bắt đầu thực hiện. Chức năng này vẫn được cung cấp bởi các trạm dự trữ. Từ mỗi lệnh đều có một vị trí trong ROB cho đến khi nó chuyển giao, chúng ta có thẻ là một kết quả

92 Chương 2: Khối xử lý song song ở mức lệnh máy 93 bằng cách sử dụng số lượng mục ROB hơn là sử dụng số trạm dự trữ. Thẻ này đòi hỏi các ROB được giao cho một lệnh phải được theo dõi tại trạm dự trữ. Sau đó trong phần này, chúng ta sẽ tìm hiểu một thực hiện thay thế sử dụng thanh ghi ngoài để đổi tên và bổ sung cho các ROB chỉ để theo dõi khi các lệnh có thể chuyển giao. Hình 2.12: Cấu trúc cơ bản của một đơn vị FP sử dụng thuật toán của Tomasulo và mở rộng để xử lý dự trữ. So sánh với hình 2.7, trong đó thực hiện thuật toán Tomasulo, sự thay đổi chính là sự bổ sung của ROB và xóa bỏ các bộ đệm lưu trữ, có chức năng được tích hợp vào ROB. Dưới đây là bốn bước liên quan đến thực hiện lệnh: 1. Phát (issue) - Nhận được một lệnh từ các hàng đợi lệnh. Phát lệnh nếu có một trạm dự trữ trống rỗng và khe cắm trống trong ROB, gửi các toán hạng cho các trạm dự trữ nếu chúng có sẵn trong hoặc các thanh ghi hoặc ROB. Cập nhật các mục điều khiển để chỉ ra các vùng đệm được sử dụng. Số lượng các mục nhập ROB phân bổ cho kết quả là cũng được gửi tới các trạm dự trữ, do đó, con số có thể được

93 94 Kiến trúc máy tính tiên tiến sử dụng để khóa các kết quả khi nó được đặt trên CDB. Nếu một trong tất cả các dự trữ đầy đủ hoặc ROB là đầy đủ, sau đó lệnh phát ra thì ngừng cho đến khi cả hai mục sẵn sàng. 2. Thực hiện (Execute) - Nếu có một hay nhiều toán hạng là chưa có sẵn, theo dõi CDB trong khi chờ đợi cho thanh ghi được tính. Bước này kiểm tra các mối nguy hiểm RAW. Khi cả hai toán hạng có sẵn tại một trạm dự trữ, thực hiện các hoạt động. Lệnh có thể mất nhiều chu kỳ đồng hồ trong giai đoạn này và tải vẫn còn yêu cầu hai bước trong giai đoạn này. Lưu trữ chỉ cần có các thanh ghi cơ bản tại bước này, kể từ khi thực hiện cho một lưu trữ vào thời điểm này chỉ là tính toán địa chỉ hiệu quả. 3. Ghi kết quả (Write result) - Khi kết quả là có sẵn, hãy ghi nó trên CDB (với các thẻ ROB gửi khi các lệnh đã phát) và từ các CDB vào ROB, cũng như với bất kỳ trạm dự trữ chờ đợi kết quả này. Đánh dấu trạm dự trữ là có sẵn, hành động đặc biệt cần thiết cho lưu trữ các lệnh. Nếu giá trị phải được lưu trữ có sẵn, nó được ghi vào trường giá trị của mục nhập ROB cho lưu trữ. Nếu giá trị phải được lưu trữ không có sẵn nào được nêu ra, các CDB phải được theo dõi cho đến khi giá trị đó được phát quảng bá, lúc đó miền giá trị gia tăng của mục nhập ROB của các lưu trữ được cập nhật. Để đơn giản chúng ta giả định rằng điều này xảy ra trong giai đoạn ghi kết quả của một lưu trữ, chúng ta thảo luận về yêu cầu này sau. 4. Chuyển giao (Commit) - Đây là giai đoạn cuối cùng hoàn thành một lệnh, sau đó kết quả của nó chỉ còn lại. (Một số bộ xử lý gọi đây là giai đoạn chuyển giao hoàn thành hoặc tốt nghiệp ). Có ba trình tự khác nhau của các hành động ở phạm vi tùy thuộc vào việc lệnh thực hiện một nhánh với một dự đoán không chính xác, một lưu trữ, hoặc lệnh nào khác (chuyển giao bình thường). Các trường hợp bình thường xảy ra khi lệnh chuyển giao đến phần chính của ROB và kết quả của nó có trong bộ đệm; vào thời điểm này, các bản cập nhật bộ xử lý thanh ghi đi kèm kết quả và loại bỏ các lệnh từ ROB. Khi một nhánh với dự đoán không chính xác đến phần chính của ROB, nó chỉ ra rằng dự trữ đã sai. Các ROB bị xóa và thực hiện khởi động lại tại đúng nhánh. Nếu nhánh đã được tiên đoán chính xác, nhánh kết thúc. Khi một lệnh chuyển giao, mục của nó trong ROB được cải tạo và thanh ghi hoặc bộ nhớ đích được cập nhật, loại bỏ sự cần thiết cho các mục nhập ROB. Nếu ROB đầy, chúng ta chỉ đơn giản dừng phát lệnh cho đến khi mục được thực hiện giải phóng. Bây giờ, hãy xem xét làm thế nào biểu đồ này sẽ làm việc với các ví dụ mà chúng ta đã sử dụng cho các thuật toán của Tomasulo. Ví dụ: Giả sử cùng độ trễ những hàm đơn vị dấu chấm động như trong ví dụ trước: thêm vào 2 chu kỳ xung đồng hồ, nhân là 6 chu kỳ đồng hồ và chia là 12 chu kỳ đồng hồ. Sử dụng đoạn mã dưới đây, cùng một cách mà chúng ta đã sử dụng để

94 Chương 2: Khối xử lý song song ở mức lệnh máy 95 tạo hình 2.9, cho thấy những gì mà bảng trạng thái giống như khi MUL.D đã sẵn sàng để đi đến chuyển giao. L.D L.D MUL.D SUB.D DIV.D ADD.D F6,32(R2) F2,44(R3) F0,F2,F4 F8,F6,F2 F10,F0,F6 F6,F8,F2 Trả lời: Hình 2.13 hiển thị kết quả trong ba bảng. Chú ý rằng mặc dù các lệnh SUB.D đã hoàn thành thực hiện, nó không chuyển giao cho đến khi MUL.D chuyển giao. Các trạm dự trữ và trường trạng thái thanh ghi chứa cùng một thông tin cơ bản mà chúng đã làm cho thuật toán của Tomasulo. Các khác biệt là số trạm dự trữ được thay thế với số lượng mục ROB trong trường Qj và Qk, cũng như trong các trường trạng thái thanh ghi và chúng ta đã thêm trường đích đến các trạm dự trữ. Trường đích có chỉ định mục ROB đó là đích cho kết quả sản xuất bởi mục trạm dự trữ. Ví dụ trên minh họa sự khác biệt chính quan trọng giữa bộ xử lý với một bộ xử lý dự trữ và lập lịch động. So sánh nội dung của hình 2.13 với hình 2.9, trong đó cho thấy trình tự cùng một mã hoạt động trên một bộ xử lý với các thuật toán của Tomasulo. Sự khác biệt chính là, trong ví dụ trên, không có lệnh sau khi chỉ lệnh đầu tiên dở dang (MUL.D ở trên) được cho phép để hoàn thành. Ngược lại, trong hình 2.9 các SUB.D và ADD.D lệnh cũng đã hoàn thành. Một ý nghĩa của sự khác biệt này là bộ xử lý với ROB động có thể thực thi mã trong khi duy trì một mô hình chính xác bị gián đoạn. Ví dụ, nếu lệnh MUL.D gây ra một ngắt, chúng ta chỉ đơn giản có thể chờ đợi cho đến khi nó đạt đến phần đầu ROB và chịu ngắt đột ngột bất kỳ lệnh khác đang chờ từ ROB. Bởi vì lệnh chuyển giao sẽ xảy ra theo trình tự, điều này mang lại một ngoại lệ chính xác. Ngược lại, trong ví dụ bằng cách sử dụng thuật toán của Tomasulo, các lệnh SUB.D và ADD.D có thể đồng thời hoàn thành trước khi đưa ra các MUL.D ngoại lệ. Kết quả là các thanh ghi F8 và F6 (đích của lệnh SUB.D và ADD.D) có thể được ghi đè và sự gián đoạn sẽ là không chính xác. Một số người dùng và các kiến trúc sư đã quyết định rằng các ngoại lệ không chính xác dấu chấm động được chấp nhận trong bộ vi xử lý hiệu suất cao, kể từ khi chương trình có khả năng sẽ chấm dứt. Các loại trường hợp ngoại lệ, chẳng hạn như lỗi trang, có nhiều khó khăn hơn để điều chỉnh nếu chúng không chính xác, vì chương trình minh bạch phải tiếp tục thực hiện sau khi xử lý như một ngoại lệ. Việc sử dụng một ROB với lệnh chuyển giao thứ tự cung cấp ngoại lệ đặc biệt, ngoài việc hỗ trợ thực hiện dự trữ, như ví dụ tiếp theo cho thấy.

95 96 Kiến trúc máy tính tiên tiến Ví dụ: Hãy xem xét mã ví dụ được sử dụng trước đó cho thuật toán Tomasulo và hiển thị trong hình 2.11 thực hiện: Loop: L.D F0,0(R1) MUL.D S.D DADDIU F4,F0,F2 F4,0(R1) R1,R1,#-8 BNE R1,R2,Loop; branches if R1 R2 Giả sử rằng chúng ta đã phát tất cả các lệnh trong vòng hai lần. Chúng ta hãy cũng giả định rằng L.D và MUL.D từ phiên đầu tiên đã chuyển giao và tất cả các lệnh khác đã hoàn thành. Thông thường, các lưu trữ sẽ chờ đợi trong ROB cho cả địa chỉ toán hạng có hiệu quả (R1 trong ví dụ này) và giá trị (F4 trong ví dụ này). Vì chúng ta chỉ xem xét các đường dẫn dấu chấm động, giả sử địa chỉ hiệu quả cho các lưu trữ được tính bằng thời gian lệnh được phát. Hình 2.13: Vào thời điểm đó MUL.D đã sẵn sàng chuyển giao, chỉ có hai lệnh LD đã chuyển giao, mặc dù một số lệnh khác đã hoàn thành. MUL.D là ở phần đầu của ROB và

96 Chương 2: Khối xử lý song song ở mức lệnh máy 97 hai lệnh LD dễ hiểu. Các lệnh SUB.D và ADD.D sẽ không chuyển giao cho đến khi lệnh MUL.D chuyển giao, mặc dù các kết quả của các lệnh có sẵn và có thể được sử dụng như là nguồn để được lệnh khác. DIV.D đang thực hiện, nhưng chưa hoàn tất do độ trễ của nó hơn MUL.D. Các cột giá trị gia tăng cho thấy giá trị được tổ chức, các định dạng # X được dùng để chỉ một trường giá trị của ROB nhập X. Sắp xếp lại bộ đệm 1 và 2 đang thực sự hoàn thành, nhưng được hiển thị cho mục đích thông tin. Chúng ta không trình bày chỉ mục cho các hàng đợi tải-lưu trữ, nhưng những mục này được lưu giữ theo thứ tự. Trả lời: Hình 2.14 hiển thị kết quả. Hình 2.14: Chỉ có lệnh L.D và MUL.D đã chuyển giao, mặc dù tất cả những lệnh khác đã hoàn thành. Do đó, không có trạm dự trữ đang bận rộn và không được hiển thị. Các lệnh còn lại sẽ được chuyển giao càng nhanh càng tốt. Hai bộ đệm sắp xếp lại đầu tiên thì rỗng, nhưng được hiển thị cho đầy đủ. Bởi vì không phải các giá trị thanh ghi và cũng không nhớ bất cứ giá trị thực sự cho đến khi có một lệnh chuyển giao, bộ vi xử lý có thể dễ dàng hoàn thành hành động dự trữ của mình khi nhánh được tìm thấy là không được đoán trước. Giả sử rằng các nhánh BNE không làm được lần đầu tiên trong hình Các lệnh ưu tiên nhánh chỉ đơn giản là sẽ chuyển giao mỗi khi đạt đến phần đầu của ROB, khi nhánh đạt đến phần đầu của bộ đệm. Bộ đệm chỉ đơn giản là xóa và xử lý bắt đầu lấy lệnh từ các con đường khác. Phục hồi có thể được thực hiện bằng cách bù trừ các ROB cho tất cả các mục xuất hiện sau nhánh không dự đoán, cho phép những việc đó trước khi các nhánh

97 98 Kiến trúc máy tính tiên tiến trong ROB tiếp tục và khởi động nạp lại tại nhánh chính xác. Trong bộ vi xử lý dự trữ, hiệu suất là nhạy cảm hơn với các dự báo nhánh, vì tác động của một không dự đoán sẽ cao hơn. Vì vậy, tất cả các khía cạnh của việc xử lý các nhánh - dự đoán chính xác, độ trễ của không dự đoán phát hiện và thời gian phục hồi không dự đoán - gia tăng tầm quan trọng. Trường hợp ngoại lệ được xử lý bằng cách không công nhận ngoại lệ cho đến khi nó đã sẵn sàng chuyển giao. Nếu một lệnh đoán tăng một ngoại lệ, ngoại lệ được ghi trong ROB. Nếu một không dự đoán nhánh phát sinh và chỉ thị không cần phải thực hiện, trường hợp ngoại lệ là đột ngột cùng với các lệnh khi ROB xóa. Nếu lệnh đạt đến phần đầu ROB, sau đó chúng ta biết nó không còn dự trữ và các ngoại lệ thực sự cần được thực hiện. Chúng ta cũng có thể thử để xử lý các trường hợp ngoại lệ ngay khi phát sinh và tất cả các nhánh trước đó được giải quyết, nhưng đây là thách thức hơn trong trường hợp ngoại lệ so với các nhánh không đoán trước và bởi vì nó xảy ra ít thường xuyên hơn, không phải là quan trọng. Hình 2.15 cho thấy các bước thực hiện để được một lệnh, cũng như các điều kiện đó phải được thỏa mãn để tiến hành từng bước và các hoạt động. Chúng ta thấy các trường hợp nhánh không dự đoán không giải quyết cho đến khi chuyển giao. Mặc dù lưu trữ có vẻ như là một bổ sung đơn giản để lập lịch động, một so sánh các hình 2.15 với con số tương đương cho thuật toán của Tomasulo trong hình 2.10 cho thấy rằng dự trữ cho biết thêm biến chứng quan trọng để điều khiển. Ngoài ra, hãy nhớ rằng nhánh không dự đoán hơi phức tạp hơn. Có một sự khác biệt quan trọng trong các lưu trữ được xử lý như thế nào trong một bộ xử lý dự trữ so với trong thuật toán của Tomasulo. Trong thuật toán của Tomasulo, một lưu trữ có thể cập nhật bộ nhớ khi nó đạt đến kết quả ghi (đảm bảo rằng địa chỉ hiệu quả đã được tính toán) và giá trị dữ liệu để lưu trữ có sẵn. Trong một bộ xử lý dự trữ, một bộ nhớ lưu trữ thông tin cập nhật chỉ khi nó đạt đến phần đầu ROB. Sự khác biệt này đảm bảo rằng bộ nhớ không được cập nhật cho đến khi một lệnh là không còn lưu trữ. Hình 2.15 không chỉ có một sự đơn giản hóa đáng kể cho các lưu trữ, mà còn cần thiết trong thực tế. Hình 2.15 yêu cầu lưu trữ phải chờ đợi trong giai đoạn kết quả ghi cho nguồn thanh ghi có giá trị toán hạng được lưu trữ, giá trị sau đó được chuyển từ trường Vk của trạm dự trữ của lưu trữ đến trường giá trị gia tăng của mục ROB của lưu trữ. Trong thực tế, tuy nhiên, giá trị sẽ được lưu cho đến khi không cần phải đến ngay trước khi lưu trữ các chuyển giao và có thể được đặt trực tiếp vào mục ROB bởi các lưu trữ theo lệnh tìm nguồn cung ứng. Điều này được thực hiện bằng cách theo dõi phần cứng khi nguồn giá trị được lưu trữ có sẵn trong mục ROB của lưu trữ và tìm kiếm các ROB trên mọi lệnh hoàn thành để tìm lưu trữ phụ thuộc.

98 Chương 2: Khối xử lý song song ở mức lệnh máy 99 Việc bổ sung này không phải là phức tạp, nhưng thêm nó có hai tác dụng. Chúng ta sẽ cần phải thêm một trường vào ROB. Mặc dù hình 2.15 làm đơn giản, trong ví dụ, chúng ta sẽ cho phép các lưu trữ vượt qua giai đoạn ghi kết quả và chỉ cần chờ cho giá trị sẵn sàng khi chuyển giao. Hình 2.15: Những bước trong thuật toán và những gì là cần thiết cho mỗi bước. Đối với các lệnh phát, rd là đích đến, rs và rt là nguồn, r là các trạm dự trữ, b là mục ROB được gán và h là đầu mục của ROB. RS là cấu trúc dữ liệu trạm dự trữ. Giá trị trả về bởi một trạm dự trữ được gọi là kết quả. RegisterStat là cấu trúc dữ liệu thanh ghi, Regs đại diện thanh ghi thực và ROB là cấu trúc dữ liệu bộ đệm sắp xếp lại.

99 100 Kiến trúc máy tính tiên tiến Cũng giống như thuật toán của Tomasulo, chúng ta phải tránh những mối nguy hiểm thông qua bộ nhớ. Mối nguy hiểm WAW và WAR thông qua bộ nhớ được loại bỏ với lưu trữ bởi vì các cập nhật thực tế của bộ nhớ xảy ra trong trật tự, khi một lưu trữ là ở phần đầu của ROB, do đó, không có tải trước đó hoặc các lưu trữ vẫn có thể chưa giải quyết. Mối nguy hiểm RAW thông qua bộ nhớ được duy trì bởi hai hạn chế: 1. Không cho phép tải để bắt đầu bước thực hiện thứ hai của nó, nếu có mục ROB hoạt động bị chiếm bởi một lưu trữ có một trường đích mà giá trị của trường A tải, và 2. Duy trì trật tự chương trình cho các tính toán của một địa chỉ có hiệu lực tải đối với tất cả các lưu trữ trước đó. Cùng nhau, hai hạn chế này đảm bảo rằng bất kỳ tải truy cập một vị trí bộ nhớ được ghi bởi một lưu trữ trước đây không thể thực hiện việc truy cập bộ nhớ cho đến khi các lưu trữ đã ghi dữ liệu. Một số bộ vi xử lý dự trữ sẽ thực sự bỏ qua giá trị từ các lưu trữ để nạp trực tiếp, khi đó xảy ra gây nguy hiểm RAW. Cách tiếp cận khác là để dự đoán va chạm tiềm năng bằng cách sử dụng một hình thức dự đoán giá trị, chúng ta xem xét việc này tại mục 2.9. Mặc dù điều này giải thích thực hiện dự trữ đã tập trung vào dấu chấm động, các kỹ thuật dễ dàng mở rộng đến các bản ghi số nguyên và các đơn vị chức năng. Dự trữ có thể hữu ích hơn trong các chương trình số nguyên, vì chương trình như vậy có xu hướng có mã mà hoạt động của nhánh là ít dự đoán được. Ngoài ra, những kỹ thuật này có thể được mở rộng để làm việc trong một bộ xử lý đa vấn đề bằng cách cho phép nhiều lệnh phát và chuyển giao mỗi xung đồng hồ. Trong thực tế, lưu trữ có lẽ là thú vị nhất trong bộ vi xử lý như vậy, vì ít khi tham vọng kỹ thuật có thể khai thác đầy đủ ILP trong khối cơ bản khi sự hỗ trợ bởi một bộ biên dịch Khai thác ILP sử dụng đa phát và lập lịch tĩnh Các kỹ thuật của các phần trước có thể được sử dụng để loại bỏ dữ liệu và trạm điều khiển, đạt được một chỉ số CPI lý tưởng bằng 1. Để cải thiện hiệu suất hơn nữa chúng ta phải giảm chỉ số CPI nhỏ hơn 1. Nhưng chỉ số CPI không thể giảm xuống dưới 1 nếu chúng ta chỉ có một lệnh mỗi chu kỳ xung đồng hồ. Mục đích của những bộ vi xử lý đa phát, được thảo luận trong phần tiếp theo sau, là để cho phép nhiều lệnh phát trong một chu kỳ xung đồng hồ. Các bộ xử lý đa phát có ba điểm đặc trưng chính: 1. Bộ xử lý superscalar lập lịch tĩnh,

100 Chương 2: Khối xử lý song song ở mức lệnh máy Bộ xử lý VLIW (very long instruction word) và 3. Bộ xử lý superscalar lập lịch động. Hai loại vi xử lý superscalar khác nhau đưa ra số lệnh cho mỗi xung đồng hồ và sử dụng theo thứ tự lệnh nếu chúng là lập lịch tĩnh hoặc không theo thứ tự thực hiện nếu chúng là lập lịch động. Bộ vi xử lý VLIW, ngược lại, đưa ra một số cố định của các lệnh được định dạng hoặc là một lệnh lớn hoặc như là một gói lệnh cố định với các lệnh song song rõ ràng chỉ ra bởi một lệnh. Bộ vi xử lý VLIW vốn là lập lịch tĩnh của trình biên dịch. Khi Intel và HP tạo ra kiến trúc IA-64, họ cũng giới thiệu tên EPIC - một lệnh máy tính song song rõ ràng cho kiểu kiến trúc này. Tên thường gặp Cấu trúc phát Phát hiện rủi ro Lập lịch Đặc tính phân biệt Các ví dụ Superscalar (tĩnh) Superscalar (động) Động Phần cứng Tĩnh Thực hiện theo thứ tự Động Phần cứng Động Một số thực hiện ngoài trật tự mà không có sự lưu trữ Hầu hết trong không gian nhúng: MIPS và ARM Không có thực Superscalar (lưu trữ) Động Phần cứng Động với quá trình lưu trữ Thực hiện ngoài trật tự có lưu trữ Pentium 4, MIPS R12K, IBM Power5 VLIW/LIW Tĩnh Phần mềm chính Tĩnh Tất cả các rủi ro được xác định và được chỉ định bằng trình biên dịch (thường là mặc nhiên) Hầu hết các ví dụ trong không gian nhúng, như T1 C6x EPIC Tĩnh là chính Phần mềm chính Chủ yếu là tĩnh Tất cả các rủi ro được xác định và được chỉ định một cách rõ ràng bằng trình biên dịch Itanium Bảng 2.3: Năm phương pháp tiếp cận chính sử dụng cho các bộ xử lý đa phát và các đặc điểm chính để phân biệt chúng. Chương này đã tập trung vào các kỹ thuật phần cứng chuyên sâu, chúng là một số hình thái của superscalar. Cách tiếp cận EPIC, như được thể hiện trong kiến trúc IA-64, mở rộng cho nhiều khái niệm của phương pháp tiếp cận VLIW trước đó, cung cấp một sự phối hợp của các phương pháp tĩnh và động.

101 102 Kiến trúc máy tính tiên tiến Mặc dù theo lập lịch tĩnh các superscalar phát ra khác nhau chứ không phải là cố định số lệnh cho mỗi xung đồng hồ, thực sự chúng dễ hiểu hơn trong khái niệm VLIW, kể từ khi cả hai phương pháp tiếp cận dựa vào bộ biên dịch để lập lịch mã cho các bộ xử lý. Vì trong những ưu điểm đang giảm dần của một superscalar được lập lịch tĩnh là vấn đề phát triển chiều rộng, superscalar được lập lịch tĩnh sử dụng chủ yếu cho độ rộng vấn đề hẹp, thông thường chỉ cần hai lệnh. Ngoài độ rộng, hầu hết các nhà thiết kế lựa chọn thực hiện một VLIW hoặc một superscalar được lập lịch động. Vì những tương đồng trong phần cứng và yêu cầu công nghệ trình biên dịch, chúng ta tập trung vào VLIWs trong phần này. Những hiểu biết sâu sắc về phần này sẽ dễ dàng suy luận được với một superscalar được lập lịch tĩnh. Bảng 2.3 tóm tắt phương pháp cơ bản tiếp cận đến đa phát, đặc điểm phân biệt của chúng và thể hiện các bộ vi xử lý sử dụng từng phương pháp tiếp cận. Phương pháp tiếp cận VLIW cơ bản VLIW sử dụng bội số, các đơn vị độc lập chức năng. Thay vì thử phát ra bội số, các lệnh độc lập đến các đơn vị, một VLIW các gói thao tác trên bội số vào một lệnh rất dài, hoặc yêu cầu các lệnh trong gói dữ liệu đáp ứng các vấn đề cùng một ràng buộc. Vì không có sự khác biệt cơ bản trong hai cách tiếp cận, chúng ta chỉ sẽ ra rằng đa thao tác được đặt kèm trong một lệnh, như trong cách tiếp cận VLIW gốc. Ưu điểm này của VLIW tăng tỉ lệ tối đa mức độ phát triển vấn đề, chúng ta tập trung vào một bộ vi xử lý rộng hơn. Thật vậy, đối với bộ vi xử lý hai vấn đề đơn giản, những phần đầu của superscalar có lẽ là tối thiểu. Nhiều nhà thiết kế có lẽ sẽ tranh luận rằng một bộ xử lý bốn phát có quản lý tiêu đề, nhưng chúng ta sẽ thấy trong chương kế tiếp, sự tăng trưởng ở phần đầu (overhead) là một yếu tố chính hạn chế các bộ vi xử lý phát rộng. Hãy cân nhắc một bộ xử lý VLIW với các lệnh có chứa năm quá trình hoạt động, trong đó có một hoạt động số nguyên (mà cũng có thể là một nhánh), hai hoạt động dấu chấm động và hai tham chiếu bộ nhớ. Các lệnh sẽ có các trường cho từng đơn vị chức năng có lẽ bit trên mỗi đơn vị, tính mềm dẻo của một lệnh có chiều dài giữa 80 và 120 bit. Bằng cách so sánh, Intel Itanium 1 và 2 có 6 hoạt động cho mỗi gói lệnh. Để giữ cho các đơn vị chức năng luôn hoạt động, phải có đủ tính song song trong một chuỗi mã để điền vào các khe hoạt động có sẵn. Các tính song song này được mở ra bởi vòng mở và lập lịch các mã trong vòng lặp đơn lớn hơn. Nếu vòng mở tạo ra mã theo đường thẳng, sau đó các kỹ thuật lập lịch cục bộ, hoạt động trên một khối cơ bản duy nhất, có thể được sử dụng. Nếu việc tìm kiếm và khai thác song song đòi hỏi mã lập lịch xuyên qua các nhánh, thực chất một thuật toán lập

102 Chương 2: Khối xử lý song song ở mức lệnh máy 103 lịch toàn cầu phức tạp hơn phải được sử dụng. Thuật toán lập lịch toàn cầu không chỉ phức tạp hơn trong cấu trúc, mà chúng còn phải đối phó với quá trình thương mại giảm một cách đáng kể trong việc tối ưu hóa, khi việc di chuyển mã qua các nhánh là tốn kém. Ví dụ: Giả sử chúng ta có một VLIW phát ra hai bộ nhớ tham chiếu, hai quá trình hoạt động FP và một hoạt động số nguyên hoặc nhánh tại mỗi chu kỳ xung đồng hồ. Thể hiện một phiên bản của vòng lặp x [i] = x [i] + s cho một bộ vi xử lý như vậy. Mở vòng nhiều lần nếu cần thiết để loại bỏ trì hoãn. Bỏ qua độ trễ nhánh. Trả lời: Bảng 2.4, vòng lặp đã được thực hiện để tạo ra 7 bản sao của thân chương trình, giúp loại trừ tất cả các trì hoãn (ví dụ, xung phát ra hoàn toàn trống rỗng) và chạy trong 9 chu kỳ. Số lượng mã với tốc độ chạy của bảy kết quả trong 9 chu kỳ, hoặc 1,29 chu kỳ cho mỗi kết quả, nhanh gần bằng hai lần như các superscalar hai vấn đề của mục 2.2 từng được mở ra và mã lập lịch. Tham chiếu bộ nhớ 1 Tham chiếu bộ nhớ 2 Hoạt động FP 1 Hoạt động FP 2 Hoạt động số nguyên/nhánh L.D F0,0(R1) L.D F6,-8(R1) L.D F10,-16(R1) L.D F14,-24(R1) L.D F18,-32(R1) L.D F22,-40(R1) ADD.D F4,F0,F2 ADD.D F8,F6,F2 L.D F26,-48(R1) ADD.D F12,F10,F2 ADD.D F16,F14,F2 ADD.D F20,F18,F2 ADD.D F24,F22,F2 S.D F4,0(R1) S.D F8,-8(R1) ADD.D F28,F26,F2 S.D F12,-16(R1) S.D F16,-24(R1) DADDIU R1,R1,#-56 S.D F20,24(R1) S.D F28,8(R1) S.D F24,16(R1) BNE R1,R2,Loop Bảng 2.4: Các lệnh VLIW chiếm vòng lặp bên trong và thay thế chuỗi vòng lặp mở rộng. Mã này có 9 chu kỳ đang giả định không có nhánh trì hoãn, thông thường nhánh trì hoãn cũng sẽ cần phải được lập lịch. Tỉ lệ phát ra là 23 hoạt động trong 9 chu kỳ xung, hoặc 2,5 hoạt động trên mỗi chu kỳ xung. Hiệu quả, tỉ lệ khe cắm sẵn có chứa một hoạt động, khoảng 60%. Để đạt được tỉ lệ này đòi hỏi một số thanh ghi lớn hơn MIPS sử dụng bình thường trong vòng lặp này. Trình tự mã VLIW trên cần ít nhất tám thanh ghi FP, trong khi cùng chuỗi mã cho các bộ xử lý MIPS cơ sở có thể sử dụng ít như hai thanh ghi FP hoặc nhiều như 5 khi được vòng lặp mở và được lập lịch. Đối với mô hình VLIW gốc, đã có cả các vấn đề kỹ thuật và logic làm cho cách tiếp cận kém hiệu quả hơn. Các vấn đề kỹ thuật là tăng kích thước mã và những hạn chế của hoạt động bước khóa. Hai yếu tố khác nhau kết hợp để tăng kích thước mã đáng kể cho một VLIW. Đầu tiên, tạo ra các hoạt động đủ trong một đoạn mã thẳng đòi hỏi vòng lặp mở rộng phải có tham vọng (như trong ví dụ trước), do

103 104 Kiến trúc máy tính tiên tiến đó tăng kích thước mã. Thứ hai, bất cứ khi nào lệnh không đầy đủ, các đơn vị chức năng chưa được sử dụng sẽ làm lãng phí dịch bit trong mã hóa lệnh. Để chống lại việc làm tăng kích thước mã, mã hóa thông minh đôi khi được sử dụng. Ví dụ, có thể chỉ có một trường rộng lớn ngay lập tức để sử dụng bởi bất kỳ đơn vị chức năng. Kỹ thuật khác là nén các lệnh trong bộ nhớ chính và mở rộng chúng khi chúng được đọc vào bộ nhớ cache hoặc được giải mã. VLIW trước đó hoạt động trong bước khóa, không có phát hiện phần cứng rủi ro. Cấu trúc này ra lệnh rằng một trì hoãn trong bất kỳ đường ống đơn vị chức năng phải đưa toàn bộ vi xử lý vào trì hoãn, vì tất cả các đơn vị chức năng phải được giữ đồng bộ. Mặc dù một trình biên dịch có thể lập lịch các đơn vị chức năng xác định để ngăn chặn trì hoãn, dự đoán đó truy cập dữ liệu sẽ gặp phải một trì hoãn nhớ cache và lập lịch cho chúng thì rất khó khăn. Do đó, các bộ lưu trữ cache cần thiết để được ngăn chặn và là nguyên nhân đưa tất cả các đơn vị chức năng vào trì hoãn. Theo tỉ lệ phát ra và số tham chiếu bộ nhớ sẽ trở nên lớn, hạn chế đồng bộ hóa sẽ không thể chấp nhận. Trong nhiều bộ xử lý gần đây, các đơn vị chức năng hoạt động độc lập hơn và bộ biên dịch được sử dụng để tránh những mối nguy hiểm tại thời điểm phát ra, trong khi kiểm tra phần cứng thực hiện không đồng bộ một khi các lệnh được phát ra. Mã nhị phân tương thích cũng có một vấn đề logic lớn cho VLIW. Trong một cách tiếp cận VLIW nghiêm ngặt, chuỗi mã này sử dụng cả các lệnh thiết lập định nghĩa và cấu trúc đường ống dẫn chi tiết, bao gồm cả các đơn vị chức năng và khả năng tiềm ẩn của chúng. Như vậy, số các đơn vị chức năng khác nhau và khả năng tiềm tàng của đơn vị yêu cầu các phiên bản khác nhau của mã này. Yêu cầu này tạo ra sự di chuyển giữa các lần thực hiện kế tiếp, hoặc giữa các quá trình thực hiện với độ rộng phát ra khác nhau, khó khăn hơn khi nó là một thiết kế superscalar. Tất nhiên, có được cải thiện hiệu suất từ một thiết kế superscalar mới có thể yêu cầu biên dịch lại. Tuy nhiên, khả năng chạy các tập tin nhị phân cũ là một lợi thế thực tế cho cách tiếp cận superscalar. Cách tiếp cận EPIC, trong đó kiến trúc IA-64 là ví dụ chính cung cấp giải pháp nhiều vấn đề gặp phải trong các thiết kế VLIW trước đó, bao gồm cả phần mở rộng để lưu trữ thêm phần mềm và các phương pháp để vượt qua giới hạn của sự phụ thuộc phần cứng trong khi vẫn giữ khả năng tương thích nhị phân. Thách thức lớn cho tất cả các bộ xử lý đa cấp là cố gắng để khai thác số lượng lớn ILP. Khi tính song song đến từ vòng lặp mở rộng đơn giản trong chương trình FP, vòng lặp ban đầu có lẽ đã có thể chạy hiệu quả trên một bộ xử lý vectơ. Nó không rõ ràng rằng một bộ xử lý đa cấp được ưu tiên hơn một bộ xử lý vectơ cho các ứng dụng đó; các hao phí này là tương tự và bộ vi xử lý vectơ thường là cùng một tốc độ hoặc nhanh hơn. Những lợi thế tiềm năng của một bộ xử lý đa phát so

104 Chương 2: Khối xử lý song song ở mức lệnh máy 105 với một bộ xử lý vectơ là khả năng trích xuất một số tính song song từ dưới cấu trúc mã và khả năng của chúng lưu trữ dễ dàng tất cả các dạng dữ liệu. Đối với những lý do này phương pháp tiếp cận đa phát đã trở thành phương pháp chính cho việc sử dụng ưu điểm của khả năng thực hiện lệnh song song và các vectơ đã trở thành chủ yếu là một phần mở rộng cho các bộ xử lý này Triển khai ILP dùng lập lịch động, đa phát và sự lưu trữ Cho đến nay, chúng ta đã thấy các máy tính cá nhân lập lịch động, đa phát và lưu trữ trong công việc. Trong phần này, chúng ta xem cả ba như nhau, mà số lượng một vi kiến trúc khá giống với bộ vi xử lý hiện đại. Để đơn giản, chúng ta xem xét chỉ một tỉ lệ phát ra hai lệnh cho mỗi xung, nhưng không có khái niệm khác nhau từ các bộ xử lý hiện đại mà phát ra ba hoặc nhiều lệnh mỗi xung. Giả sử chúng ta muốn mở rộng thuật toán của Tomasulo để hỗ trợ đường ống dẫn superscalar phát đôi với một số nguyên riêng biệt và đơn vị dấu chấm động, mỗi trong số đó có thể bắt đầu hoạt động trên mỗi xung. Chúng ta không muốn phát lệnh đến các trạm dự trữ theo số thứ tự, điều này có thể dẫn đến một sự vi phạm ngữ nghĩa của chương trình. Để thu được các ưu điểm của lập lịch động một cách đầy đủ, chúng ta sẽ cho phép đường ống phát ra bất kỳ sự kết hợp nào của 2 lệnh trong 1 xung, bằng cách sử dụng phần cứng lập lịch để thực sự gán các toán hạng đến số nguyên và đơn vị dấu chấm động. Bởi vì sự tương tác của các lệnh số nguyên và dấu chấm động là rất quan trọng, chúng ta cũng mở rộng chương trình của Tomasulo để phân phối số nguyên, các đơn vị dấu chấm động chức năng và các thanh ghi, cũng như kết hợp thực hiện lưu trữ. Hai phương pháp tiếp cận khác nhau đã được sử dụng để phát ra nhiều lệnh cho mỗi xung trong một bộ xử lý lập lịch động và quan sát cả hai đều thấy chìa khóa là một trạm dự trữ và cập nhật các bảng kiểm soát đường ống dẫn. Một cách tiếp cận là thực hiện bước này trong một nửa chu kỳ xung, vì thế mà hai lệnh có thể được xử lý trong một chu kỳ xung. Các tiếp cận thứ hai là xây dựng các logic cần thiết để xử lý hai lệnh cùng một lúc, bao gồm bất kỳ sự hướng dẫn nào có thể có giữa các lệnh. Các bộ vi xử lý superscalar hiện đại phát ra 4 hoặc nhiều hơn các lệnh mỗi xung và thường bao gồm cả hai phương pháp tiếp cận: chúng bao gồm hai đường ống và mở rộng các vấn đề logic. Đặt lập lịch động lưu trữ cùng với nhau với đa phát cần khắc phục một trong những thách thức bổ sung ở cuối đường ống: chúng ta phải có khả năng hoàn thiện và ủy thác nhiều lệnh cho mỗi xung. Cũng giống như các thách thức trong việc phát ra nhiều lệnh, những khái niệm rất đơn giản, mặc dù việc thực hiện có thể được thử thách theo cách tương tự như việc phát ra và quá trình đổi tên thanh ghi. Chúng ta có thể hiển thị những khái niệm phù hợp với nhau như thế nào với một ví dụ.

105 106 Kiến trúc máy tính tiên tiến Ví dụ: Hãy xem xét việc thực hiện vòng lặp sau, trong đó tăng mỗi phần tử của một mảng số nguyên, trên một bộ vi xử lý phát đôi, một lần không có sự suy đoán và một lần có sự suy đoán: Loop: LD R2,0(R1) ;R2 = phần tử mảng DADDIU R2,R2,#1 ;tăng R2 tử cuối cùng SD R2,0(R1) ;kết quả lưu trữ DADDIU R1,R1,#8 ;con trỏ tăng BNE R2,R3,loop ;nhánh nếu không phải là phần Giả sử rằng có các đơn vị số nguyên với chức năng riêng biệt để tính địa chỉ có hiệu quả, cho các hoạt động ALU và để đánh giá điều kiện nhánh. Tạo một bảng trong ba lần lặp lại đầu tiên của vòng lặp này cho cả hai bộ xử lý. Giả sử rằng có đến hai lệnh của bất kỳ loại nào có thể chuyển cho mỗi xung Trả lời: Bảng 2.5 và 2.6 cho thấy hiệu suất cho một bộ vi xử lý lập lịch động phát đôi, không có và có lưu trữ. Trong trường hợp này, nơi một nhánh có thể là một giới hạn hiệu suất quan trọng. Số vòng lặp Lệnh Phát ra tại chu kỳ xung Thực hiện tại chu kỳ xung Truy cập bộ nhớ tại chu kỳ xung Ghi CDB tại chu kỳ xung Chú thích 1 LD R2,0(R1) Phát ra đầu tiên 1 DADDIU R2,R2,# Chờ LW 1 SD R2,0(R1) Chờ DADDIU 1 DADDIU R1,R1,# Thực hiện trực tiếp 1 BNE R2,R3,LOOP 3 7 Chờ DADDIU 2 LD R2,0(R1) Chờ BNE 2 DADDIU R2,R2,# Chờ LW 2 SD R2,0(R1) Chờ DADDIU 2 DADDIU R1,R1,# Chờ BNE 2 BNE R2,R3,LOOP 6 13 Chờ DADDIU 3 LD R2,0(R1) Chờ BNE 3 DADDIU R2,R2,# Chờ LW 3 SD R2,0(R1) Chờ DADDIU 3 DADDIU R1,R1,# Chờ BNE 3 BNE R2,R3,LOOP 9 19 Chờ DADDIU Bảng 2.5: Thời điểm phát ra, thực hiện và ghi kết quả đối với phiên bản dual-issue của đường ống của chúng ta mà không có sự suy xét. Lưu ý rằng LD theo sau BNE không thể bắt đầu thực hiện trước đó bởi vì nó phải chờ cho đến khi kết quả nhánh được xác

106 Chương 2: Khối xử lý song song ở mức lệnh máy 107 định. Kiểu chương trình này, với các nhánh phụ thuộc vào dữ liệu mà không thể được giải quyết trước đó, cho thấy sức mạnh của việc lưu trữ. Các đơn vị có chức năng riêng biệt cho việc tính toán địa chỉ, hoạt động của ALU và giá trị trạng thái của nhánh cho phép các lệnh thực hiện trong cùng một chu kỳ. Bảng 2.6 trình bày ví dụ có sự lưu trữ. Bộ vi xử lý lưu trữ thực hiện trong chu kỳ xung 13, trong khi nó thực hiện ở chu kỳ xung 19 trên các đường ống dẫn không có sự lưu trữ. Bởi vì mức độ hoàn thành trên đường ống không có sự lưu trữ sẽ giảm nhanh sau mức độ phát ra, đường ống không có sự lưu trữ sẽ trì hoãn khi một vài vòng lặp được phát ra. Hiệu suất của bộ vi xử lý không có sự lưu trữ có thể được cải thiện bằng cách cho phép chạy các lệnh để hoàn thành việc tính toán địa chỉ một cách hiệu quả trước khi một nhánh được quyết định, nhưng nếu truy cập bộ nhớ lưu trữ được cho phép, sự cải tiến này sẽ thu được duy nhất một vòng lặp ở mỗi xung. Ví dụ này rõ ràng cho thấy cách sự lưu trữ rất có lợi khi có nhánh phụ thuộc vào dữ liệu, mặt khác sẽ giới hạn hiệu suất. Lợi thế này phụ thuộc, tuy nhiên, với sự dự đoán nhánh chính xác. Lưu trư không chính xác sẽ không cải thiện hiệu suất, nhưng trên thực tế, thông thường hiệu suất có hại. Số vòng lặp Lệnh Phát ra tại chu kỳ xung Thực hiện tại chu kỳ xung Đọc bộ nhớ tại chu kỳ xung Ghi CDB tại chu kỳ xung Chuyển tại số xung Chú thích 1 LD R2,0(R1) Phát ra đầu tiên 1 DADDIU R2,R2,# Chờ LW 1 SD R2,0(R1) Chờ DADDIU 1 DADDIU R1,R1,# Chuyển theo thứ tự 1 BNE R2,R3,LOOP Chờ DADDIU 2 LD R2,0(R1) Cấm trễ thực hiện 2 DADDIU R2,R2,# Chờ LW 2 SD R2,0(R1) Chờ DADDIU 2 DADDIU R1,R1,# Chuyển theo thứ tự 2 BNE R2,R3,LOOP Chờ DADDIU 3 LD R2,0(R1) Sớm nhất có thể 3 DADDIU R2,R2,# Chờ LW 3 SD R2,0(R1) Chờ DADDIU 3 DADDIU R1,R1,# Thực hiện sớm hơn 3 BNE R2,R3,LOOP Chờ DADDIU Bảng 2.6: Thời điểm phát ra, thực hiện và viết kết quả cho phiên bản dual-issue của đường ống của chúng ta có sự lưu trữ. Lưu ý rằng LD theo sau BNE có thể bắt đầu thực hiện trước đó vì nó được lưu trữ.

107 108 Kiến trúc máy tính tiên tiến 2.6. Các kỹ thuật nâng cao cho việc phân phối lệnh và sự lưu trữ Trong một đường ống có hiệu suất cao, một điểm đặc biệt với nhiều giải pháp, dự đoán các nhánh cũng là không đủ, thực sự chúng ta phải thành thạo để cung cấp một dòng lệnh có băng thông cao. Trong các bộ xử lý đa phát gần đây, điều này có nghĩa là phân phối 4-8 lệnh mỗi chu kỳ xung. Chúng ta xem xét các phương pháp để tăng lệnh phân phối băng thông đầu tiên. Sau đó chúng tôi chuyển sang một tập hợp các vấn đề chính trong việc thực hiện các kỹ thuật lưu trữ tiên tiến, bao gồm cả việc sử dụng thanh ghi đổi tên nhằm chống việc sắp xếp lại các bộ đệm, tính chất quan trọng của sự lưu trữ và kỹ thuật được gọi là giá trị dự đoán, mà hơn nữa có thể tăng cường ILP Tăng băng thông lấy lệnh Một bộ xử lý đa phát sẽ yêu cầu rằng số lượng trung bình các lệnh được lấy ở mỗi chu kỳ xung ít nhất là phải lớn bằng trung bình thông lượng dữ liệu đưa vào. Tất nhiên, việc lấy các lệnh này yêu cầu đường dẫn rộng vừa đủ cho nơi lưu trữ lệnh (cache), nhưng việc khó nhất là xử lý các nhánh. Trong chương này chúng ta xem xét hai phương pháp để phân phối các nhánh và sau đó thảo luận về cách xử lý hiện đại, bao gồm việc suy đoán lệnh và chức năng lấy lệnh (prefetch) Bộ đệm nhánh mục tiêu Để giảm sự rủi ro cho các nhánh cho năm giai đoạn đơn giản của chúng ta, cũng như cho các đường ống dẫn sâu hơn, chúng ta phải biết khi nào lệnh chưa được đọc là nhánh và nếu như vậy, những gì các máy tính kế tiếp nên có. Nếu lệnh là một nhánh và chúng ta biết rằng các máy tính kế tiếp nên có gì, chúng ta có thể có một mức rủi ro ở nhánh bằng 0. Một nơi lưu trữ nhánh lưu địa chỉ được chỉ dẫn cho lệnh kế tiếp sau một nhánh được gọi là một bộ đệm nhánh mục tiêu hoặc nơi lưu trữ các nhánh mục tiêu. Hình 2.16 cho thấy một bộ đệm nhánh mục tiêu. Bởi vì một bộ đệm nhánh mục tiêu dự báo các địa chỉ lệnh kế tiếp và sẽ gửi nó đi trước khi giải mã lệnh, chúng ta phải biết có hay không các lệnh đã lấy được chỉ dẫn như một nhánh được thực hiện. Nếu PC của lệnh đã lấy phù hợp với một máy tính trong bộ đệm chỉ dẫn, thì sau đó các PC đã chỉ dẫn tương ứng được sử dụng như các PC tiếp theo. Phần cứng cho bộ đệm nhánh mục tiêu mà cơ bản là giống với phần cứng cho một bộ nhớ lưu trữ (cache). Nếu một mục phù hợp được tìm thấy trong bộ đệm nhánh mục tiêu, bắt đầu lấy lệnh ngay lập tức tại các máy tính được dự báo. Lưu ý rằng không giống như một bộ đệm nhánh, các mục được dự báo phải phù hợp với các lệnh này bởi vì các PC được dự báo sẽ được gửi đi trước khi nó được biết đến cho dù lệnh này là một

108 Chương 2: Khối xử lý song song ở mức lệnh máy 109 nhánh. Nếu bộ xử lý không kiểm tra xem mục này có phù hợp với PC hay không, sau đó các PC sai sẽ được gửi đi cho các lệnh không phải nhánh, dẫn đến một bộ xử lý chậm hơn. Chúng ta chỉ cần lưu trữ các nhánh được dự báo trong bộ đệm nhánh mục tiêu, kể từ khi một nhánh không được dự báo được lấy lệnh một cách đơn giản các lệnh tuần tự kế tiếp, như thể nó không phải là một nhánh. Hình 2.16: Một bộ đệm nhánh mục tiêu. PC của lệnh được lấy phù hợp với tập các địa chỉ lệnh được lưu trong cột đầu tiên, đại diện các địa chỉ của nhánh đã được biết đến. Nếu PC phù hợp với một trong những mục này, thì sau đó lệnh được lấy là nhánh thực hiện và trường thứ hai, PC đã dự báo, bao gồm các dự báo cho các PC tiếp theo sau các nhánh. Lấy chúng ngay lập tức tại địa chỉ. Ở trường thứ ba, đó là tùy chọn, có thể được sử dụng cho việc dự báo các bit thêm vào. Hình 2.17 cho thấy các bước chi tiết khi sử dụng một bộ đệm nhánh mục tiêu cho một đường ống dẫn năm giai đoạn đơn giản. Từ điều này chúng ta có thể thấy rằng sẽ không có sự trì hoãn nhánh nếu một mục nhánh dự báo được tìm thấy trong bộ đệm và dự đoán là chính xác. Nếu không, sẽ có một sự rủi ro ít nhất là 2 chu kỳ xung. Việc phân phối các dự báo nhầm và bị nhầm là một thách thức đáng kể, vì chúng ta thường sẽ phải ngừng lấy lệnh trong khi chúng ta viết lại các mục đệm (buffer entry). Vì vậy, chúng tôi muốn tạo ra quá trình xử lý nhanh để giảm thiểu tối đa sự rủi ro.

109 110 Kiến trúc máy tính tiên tiến Hình 2.17: các bước bao gồm điều khiển 1 lệnh với 1 bộ đệm nhánh mục tiêu. Để đánh giá một bộ đệm nhánh mục tiêu hoạt động như thế nào, đầu tiên chúng ta phải xác định các rủi ro trong mọi trường hợp có thể. Bảng 2.7 bao gồm thông tin cho các đường ống dẫn năm giai đoạn đơn giản. Ví dụ: Xác định các nhánh không an toàn cho một bộ đệm nhánh mục tiêu giả định các chu kỳ không an toàn cho các dự đoán nhầm trong bảng 2.7. Tạo ra các giả định sau đây về tính chính xác của dự báo và tỉ lệ đúng: + Dự báo chính xác 90% (cho các lệnh trong bộ đệm) + Mức độ tác động trong bộ đệm là 90% (cho các nhánh đã nhận được dự báo) Trả lời: Chúng tôi tính toán các hình phạt bằng cách nhìn vào xác suất của hai sự kiện: nhánh được dự báo là lấy nhưng kết thúc là không được lấy và nhánh được thực hiện nhưng không tìm thấy trong bộ đệm. Cả hai đều mang một hình phạt của 2 chu kỳ. Hình phạt (nhánh trong bộ đệm, nhưng không được lấy) = phần trăm độ tác động bộ đệm x phần trăm dự báo không chính xác = 90% x 10% = 0,09

110 Chương 2: Khối xử lý song song ở mức lệnh máy 111 Hình phạt (nhánh không ở trong bộ đệm, nhưng được lấy) = 10% Nhánh bị phạt = (0,09 + 0,10) x 2 = 0,38 Hình phạt này so sánh với một hình phạt nhánh cho các nhánh bị trì hoãn, chu kỳ khoảng 0,5 xung cho mỗi nhánh. Hãy nhớ rằng, mặc dù việc cải tiến từ dự báo nhánh động lớn như độ dài các đường ống, và do đó, sự chậm trễ phát triển nhánh; ngoài ra, sẽ tốt hơn dự báo năng suất thực hiện một lợi thế lớn hơn về hiệu suất. Lệnh trong bộ đệm Dự báo Nhánh thực Các chu kỳ phạt Có Nhận Nhận 0 Có Nhận Không nhận 2 Không Nhận 2 Không Không nhận 0 Bảng 2.7: Các rủi ro cho tất cả các kết hợp có thể có của nhánh cho dù là trong bộ đệm và thực sự là nó đã có, giả sử chúng ta lưu trữ các nhánh chỉ lấy trong bộ đệm. Không có nhánh rủi ro nếu mọi thứ đều được dự báo chính xác và nhánh được tìm thấy trong bộ đệm mục tiêu. Nếu nhánh không được dự báo đúng, mức rủi ro bằng 1 chu kỳ xung để cập nhật bộ đệm với các thông tin chính xác (trong đó một lệnh không thể lấy) và 1 chu kỳ xung, nếu cần, phải khởi động lại việc lấy lệnh chính xác tiếp theo cho nhánh. Nếu nhánh không được tìm thấy và lấy ra, một rủi ro 2 chu kỳ là không thể tránh, trong thời gian bộ đệm được cập nhật. Một biến thể của bộ đệm nhánh mục tiêu là để lưu trữ một hoặc nhiều lệnh mục tiêu thay vì, hoặc thêm vào, địa chỉ mục tiêu dự báo. Biến thể này có hai lợi thế nên được khám phá. Trước tiên, nó cho phép bộ đệm nhánh mục tiêu truy cập vào để mất nhiều thời gian hơn thời gian giữa việc lấy các lệnh thành công, có thể cho phép một bộ đệm nhánh mục tiêu lớn hơn. Thứ hai, đệm chỉ dẫn mục tiêu thực tế cho phép chúng ta thực hiện một tối ưu hóa được gọi là nhánh gấp lại được. Nhánh gấp lại được sử dụng để có được 0 chu kỳ nhánh không điều kiện và đôi khi 0 chu kỳ nhánh có điều kiện. Xem xét một bộ đệm nhánh mục tiêu làm đệm cho các lệnh từ các đường dự báo và được truy cập bằng địa chỉ của một nhánh không điều kiện. Chức năng duy nhất của nhánh không điều kiện là thay đổi PC. Do đó, khi bộ đệm nhánh mục tiêu báo hiệu một tác động và chỉ ra rằng đó là nhánh không điều kiện, các đường ống có thể thay thế một cách đơn giản các lệnh từ bộ đệm nhánh mục tiêu thay cho các lệnh được trả về từ bộ nhớ lưu trữ (cache) (đó là các nhánh không điều kiện). Nếu bộ xử lý phát ra nhiều lệnh trên mỗi chu kỳ, sau đó các bộ đệm sẽ cần phải cung cấp nhiều lệnh để có được những lợi ích tối đa. Trong một số trường hợp, nó có thể được loại bỏ giá trị của nhánh điều kiện khi các mã điều kiện được thiết lập.

111 112 Kiến trúc máy tính tiên tiến Trả về các địa chỉ dự báo Khi chúng ta cố gắng để tăng cơ hội và tính chính xác của sự lưu trữ, chúng ta phải đối mặt với thách thức trong việc dự báo các bước nhảy gián tiếp, nghĩa là, bước nhảy mà địa chỉ đích của chúng khác nhau ở thời gian thực hiện. Mặc dù ngôn ngữ lập trình cấp cao sẽ tạo ra các bước nhảy vọt cho các lần gọi thủ tục gián tiếp, phần lớn các bước nhảy gián tiếp đến từ thủ tục trả về. Ví dụ, đối với các tiêu chí chuẩn SPEC95, thủ tục trả về chiếm trên 15% của các nhánh và phần lớn các bước nhảy gián tiếp trên trung bình. Đối với các ngôn ngữ hướng đối tượng như C++ và Java, thủ tục trả về thậm chí còn thường xuyên hơn. Do đó, tập trung vào thủ tục trả về dường như thích hợp. Mặc dù thủ tục trả về có thể được dự báo với một bộ đệm nhánh mục tiêu, tính chính xác của kỹ thuật dự báo như vậy có thể thấp nếu thủ tục được gọi là từ nhiều nơi và các cuộc gọi từ một trong những nơi không được tập hợp lại trong một thời gian. Ví dụ, trong SPEC CPU95, một nhánh dự báo tích cực đạt được độ chính xác thấp hơn 60% đối với các nhánh trả về như vậy. Để khắc phục vấn đề này, một số mẫu thiết kế sử dụng một bộ đệm nhỏ của địa chỉ trả về hoạt động như một stack. Cấu trúc này lưu trữ các địa chỉ trả về gần đây nhất: đẩy một địa chỉ trả về vào stack tại một lần gọi và bỏ một địa chỉ tại một lần trả về. Nếu bộ nhớ lưu trữ đủ lớn (tức là lớn bằng chiều sâu gọi tối đa), nó sẽ dự báo sự trả về một cách hoàn hảo. Hình 2.18 cho thấy hiệu suất của bộ đệm trả về với 0-16 yếu tố cho một số các tiêu chí chuẩn SPEC CPU95. Chúng ta sẽ sử dụng một dự báo trả về tương tự như khi chúng ta xem xét các nghiên cứu của ILP tại mục 3.2. Hình 2.18: Dự báo chính xác cho một địa chỉ bộ đệm trả về đã hoạt động như một stack dựa vào tiêu chuẩn SPEC CPU95. Chính xác là một phần của địa chỉ trả về đã được

112 Chương 2: Khối xử lý song song ở mức lệnh máy 113 dự báo một cách chính xác. Một bộ đệm của mục 0 ngụ ý rằng các dự báo là tiêu chuẩn nhánh được sử dụng. Từ độ sâu của việc gọi thường không lớn, với một số ngoại lệ, một bộ đệm khiêm tốn hoạt động tốt. Các đơn vị lệnh trả về tích hợp Để đáp ứng nhu cầu của nhiều bộ xử lý đa cấp, nhiều nhà thiết kế gần đây có lựa chọn thực hiện một chu kỳ lấy lệnh tích hợp, như là một đơn vị tự trị riêng biệt để cung cấp các lệnh cho phần còn lại của đường ống. Về cơ bản, số lượng này dùng để nhận ra rằng việc lấy các lệnh đặc trưng như là một giai đoạn đơn giản cho đường ống đa phát phức tạp không còn giá trị. Thay vào đó, thiết kế gần đây đã sử dụng một chu kỳ lệnh tích hợp hợp thành một vài chức năng: 1. Tích hợp nhánh dự báo - Các nhánh dự báo sẽ trở thành một phần của đơn vị lấy lệnh và luôn dự đoán, nhánh, để điều khiển đường ống. 2. Lệnh prefetch - Để cung cấp nhiều lệnh cho mỗi xung, các đơn vị lấy lệnh có khả năng sẽ cần phải tìm nạp trước. Các đơn vị tự quản lý việc tìm nạp trước các lệnh, tích hợp nó với nhánh dự đoán.

113 Chương 3 CAÙC HAÏN CHEÁ KHI THÖÏC HIEÄN LEÄNH SONG SONG 3.1. Giới thiệu Khai thác ILP là trọng tâm chính của việc thiết kế bộ vi xử lý trong khoảng 20 năm bắt đầu từ giữa thập niên Trong 15 năm đầu tiên, chúng ta đã thấy một sự tiến triển của nhiều sơ đồ phức tạp hơn cho cấu trúc đường ống đa phát, lập lịch động và dự báo. Từ năm 2000, các nhà thiết kế đã tập trung chủ yếu vào việc tối ưu hóa thiết kế hoặc cố gắng để đạt được tốc độ xung cao hơn mà không làm tăng giá của sản phẩm. Trong chương này, chúng ta bắt đầu bằng cách kiểm tra những hạn chế về cơ cấu ILP từ cấu trúc chương trình, từ các giả định thực tế về ngân sách phần cứng và từ tính chính xác của kỹ thuật quan trọng để nghiên cứu cũng như dự đoán được hướng phát triển. Trong mục 3.5, chúng ta xem xét việc sử dụng các luồng song song như là một cách thay thế hoặc bổ sung khả năng thực hiện lệnh song song. Cuối cùng, chúng ta kết luận chương bằng cách so sánh một bộ vi xử lý gần đây ở cả hiệu suất và các biện pháp hiệu quả cho mỗi bóng bán dẫn và trên mỗi watt Nghiên cứu hạn chế của ILP Khai thác ILP để tăng hiệu suất bắt đầu với bộ vi xử lý đường ống đầu tiên trong thập niên Trong những năm 1980 và 1990, các kỹ thuật này là chìa khóa để đạt được hiệu suất cải tiến nhanh chóng. Câu hỏi bao nhiêu ILP tồn tại đã được tới hạn đối với khả năng dài hạn của chúng ta để nâng cao hiệu suất tại một tốc độ vượt quá tốc độ gia tăng trong tốc độ của công nghệ mạch tích hợp cơ bản. Trên một quy mô ngắn hơn, câu hỏi quan trọng những gì là cần thiết để khai thác thêm ILP là rất quan trọng cho cả các nhà thiết kế máy tính và các nhà biên dịch. Các dữ liệu trong phần này cũng cung cấp cho chúng ta cách thức để kiểm tra sự hữu dụng của những ý tưởng mà đã được giới thiệu trong chương cuối cùng, bao gồm bộ nhớ định hướng, đổi tên đăng ký và dự báo. Trong phần này, chúng ta xem xét một trong những nghiên cứu thực hiện của các yêu cầu này. Phần mô tả một số nghiên cứu, bao gồm cả các nguồn dữ liệu

114 Chương 3: Các hạn chế khi thực hiện lệnh song song 115 trong phần này (nghiên cứu năm 1993 của Wall). Tất cả những nghiên cứu về hoạt động của hệ thống song song bằng cách làm ra một tập hợp các giả định và xem xét có bao nhiêu hệ song song có hiệu lực theo những giả định đó. Các dữ liệu chúng ta xem xét ở đây là từ một nghiên cứu mà làm cho các giả thiết đó là ít nhất, trong thực tế, mô hình phần cứng cuối cùng có lẽ là không thể làm. Tuy nhiên, tất cả các nghiên cứu như vậy đều giả thiết một mức nhất định của công nghệ trình biên dịch và một số các giả định này có thể ảnh hưởng đến kết quả, bất chấp việc sử dụng các phần cứng nào. Trong tương lai, những tiến bộ trong công nghệ trình biên dịch cùng với các kỹ thuật phần cứng mới và khác nhau đáng kể có thể khắc phục một số hạn chế giả định trong những nghiên cứu này, tuy nhiên, không chắc những tiến bộ đó khi kết hợp với phần cứng thực tế sẽ vượt qua những giới hạn này trong tương lai gần. Ví dụ, giá trị dự báo, mà chúng ta kiểm tra trong chương cuối, có thể loại bỏ giới hạn dữ liệu phụ thuộc. Đối với dự đoán giá trị để có một tác động đáng kể về hiệu suất, tuy nhiên, những dự đoán sẽ cần phải đạt được độ chính xác cao hơn nữa trong dự đoán những thông báo từ rất lâu trước đó. Thật vậy vì lý do chúng ta thảo luận trong mục 3.6, chúng ta có khả năng đạt đến giới hạn của bao nhiêu ILP có thể khai thác hiệu quả Mô hình phần cứng Để xem những gì là hạn chế của ILP, trước tiên chúng ta cần định nghĩa một bộ xử lý lý tưởng. Một bộ xử lý lý tưởng là một trong những nơi mà tất cả các ràng buộc về ILP được loại bỏ. Các hạn chế chỉ trên ILP trong bộ xử lý như vậy là những áp đặt bởi các dữ liệu thực tế, các luồng đi qua thanh ghi hoặc bộ nhớ. Các giả định thực hiện cho một bộ xử lý lý tưởng hay hoàn hảo như sau: 1. Đăng ký đổi tên: có vô số đăng ký ảo có sẵn và do đó tất cả các WAW và WAR tránh được mối nguy hiểm và không giới hạn số lượng các hướng dẫn có thể bắt đầu thực hiện đồng thời. 2. Nhánh dự báo: nhánh dự báo là hoàn hảo. Tất cả các nhánh điều kiện được dự báo chính xác. 3. Dự báo nhảy: tất cả bước nhảy (bao gồm đăng ký nhảy sử dụng để trả về các lệnh và các nhảy của máy tính) thì hoàn toàn được dự báo. Khi kết hợp với nhánh dự báo hoàn hảo, điều này tương đương với việc có một bộ xử lý với những dự báo hoàn hảo và một vùng đệm không giới hạn của các lệnh có sẵn để thực hiện. 4. Phân tích alias địa chỉ bộ nhớ: tất cả các địa chỉ bộ nhớ được biết là chính xác và thao tác tải có thể được di chuyển đến trước một bộ lưu trữ với điều kiện là những địa chỉ không giống nhau. Lưu ý rằng điều này thực hiện phân tích địa chỉ alias hoàn hảo.

115 116 Kiến trúc máy tính tiên tiến 5. Những bộ đệm cache hoàn hảo: Mọi sự truy nhập bộ nhớ cần lấy 1 chu kỳ xung nhịp. Trong thực tế, những bộ xử lý siêu hướng (superscalar) sẽ tiêu thụ một lượng lớn bộ nhớ cache ẩn ILP. Những sự giả thiết 2 và 3 loại trừ mọi sự phụ thuộc điều khiển. Giống như vậy, những giả thiết 1 và 4 loại trừ tất cả những sự phụ thuộc dữ liệu thật sự. Cùng với nhau, bốn giả thiết này có nghĩa rằng bất kỳ lệnh nào trong sự thực hiện chương trình cũng có thể được lập lịch trên 1 chu kỳ ngay lập tức theo sau sự thực hiện của lệnh đi trước mà nó phụ thuộc. Thậm chí với các giả thiết này, vì cuối cùng trong chương trình sẽ được lập lịch trên chu kỳ đầu tiên. Như vậy, chiều hướng này của những giả định gộp vào cả điều khiển lẫn sự suy đoán địa chỉ và thực hiện chúng nếu chúng được hoàn thành. Ban đầu, chúng ta kiểm tra một bộ xử lý có thể phát không giới hạn số lệnh cùng một lúc vượt xa trong tính toán. Đối với tất cả các mô hình xử lý chúng ta kiểm tra, không có hạn chế về những loại lệnh có thể thực thi trong 1 chu kỳ. Đối với trường hợp không giới hạn vấn đề, điều này có nghĩa có thể có một số lượng không hạn chế tải hoặc các lưu trữ trong 1 chu kỳ xung. Ngoài ra, tất cả các đơn vị chức năng tiềm ẩn được giả định là 1 chu kỳ, do đó, bất kỳ chuỗi các lệnh phụ thuộc có thể phát ra trên 1 chu kỳ kế tiếp. Chức năng tiềm tàng dài hơn 1 chu kỳ sẽ giảm số lượng các vấn đề trên mỗi chu kỳ, mặc dù không phải là số của những lệnh dưới sự thực hiện tại bất kỳ điểm nào. (Những lệnh trong sự thực hiện tại bất kỳ điểm nào thường được tham chiếu tới như trong thời gian chạy). Tất nhiên, bộ xử lý này trên bờ vực của sự không thực hiện được. Chẳng hạn, IBM Power5 là một trong số nhiều bộ xử lý siêu hướng tiên tiến nhất được công bố cho đến nay. Power5 phát ra bốn lệnh trên mỗi xung và bắt đầu sự thực hiện lên tới sáu (với những sự hạn chế quan trọng trên kiểu lệnh, nghĩa là, nhiều nhất là tải và lưu lại hỗ trợ một số lượng lớn cách đổi tên đăng ký (88 số nguyên và 88 dấu chấm động, cho phép hơn 200 lệnh trong thực hiện, trong đó lên đến 32 có thể được tải và 32 có thể được lưu trữ), sử dụng yếu tố dự báo nhánh lớn mạnh và sử dụng làm rõ bộ nhớ động. Sau khi quan sát tính song song sẵn sàng cho bộ xử lý hoàn hảo, chúng ta sẽ khảo sát tác động của việc hạn chế những đặc tính khác nhau. Để đo các cấp song song có sẵn, một bộ các chương trình đã được biên dịch và tối ưu hóa với các tiêu chuẩn tối ưu hóa các trình biên dịch MIPS. Các chương trình đã thành các công cụ và thực hiện để đưa ra 1 số lệnh và tham chiếu dữ liệu. Tất cả các lệnh trong các quỹ đạo sau đó được dự kiến sớm nhất có thể, giới hạn bởi các sự phụ thuộc vào dữ liệu. Với những cơ chế, lệnh có thể được sắp xếp sớm hơn nhiều, di chuyển qua số lượng lớn các lệnh trên mà chúng không phải là dữ liệu phụ thuộc, bao gồm các nhánh, kể từ khi các nhánh là hoàn toàn dự báo.

116 Chương 3: Các hạn chế khi thực hiện lệnh song song 117 Hình 3.1 cho thấy số lượng trung bình của cấp song song có sẵn cho sáu trong số các tiêu chí chuẩn SPEC92. Trong suốt phần này, các lý thuyết song song được đo bởi tỉ lệ trung bình vấn đề được hướng dẫn. Hãy nhớ rằng tất cả các lệnh đều có một độ trễ 1 chu kỳ, một độ trễ dài hơn sẽ làm giảm số lượng trung bình lệnh cho mỗi xung nhịp. Ba trong số các tiêu chí chuẩn (fpppp, doduc và tomcatv) là điểm động chiều sâu và cái khác là các chương trình số nguyên. Hai trong số các tiêu chí chuẩn về điểm ảo (fpppp và tomcatv) có tính song song rộng lớn, có thể bị khai thác bởi một máy tính trung gian có hướng hoặc bằng một bộ đa xử lý (cấu trúc trong fpppp là khá lộn xộn, tuy nhiên, vì một số biến đổi khi có bàn tay con người chúng đã được thực hiện trên các mã). Chương trình doduc có tính song song rộng lớn, nhưng tính song song không xảy ra trong vòng đơn giản song song giống như trong fpppp và tomcatv. Các chương trình là một thông dịch viên LISP có sự tin tưởng ngắn. Trong các phần tiếp theo, chúng ta hạn chế khía cạnh khác nhau của bộ vi xử lý này để hiển thị những gì ảnh hưởng của các giả định khác nhau được trước khi thấy một số bộ vi xử lý đầy tham vọng được thực hiện Những hạn chế trên kích thước cửa sổ và đếm phát cực đại Để xây dựng một bộ xử lý tiến gần đến dự báo nhánh hoàn hảo và phân tích alias hoàn toàn yêu cầu cần phải mở rộng phân tích động, vì thời gian biên dịch tĩnh lập sơ đồ không thể hoàn thành. Tất nhiên, thực tế là sơ đồ động phối hợp sẽ không được hoàn hảo, nhưng việc sử dụng các sơ đồ động như vậy sẽ cung cấp khả năng phát hiện ra tính song song mà không thể được phân tích bằng trình biên dịch tĩnh phân tích thời gian. Do đó, một bộ xử lý động, có thể phù hợp chặt chẽ hơn số lượng tính song song phát hiện bởi bộ xử lý lý tưởng của chúng ta. Làm thế nào có thể lập lịch động thực, bộ vi xử lý dự báo tiến đến bộ xử lý lý tưởng? Để có được câu trả lời, hãy xem xét những gì các bộ xử lý hoàn hảo phải làm: 1. Nhìn xa để tìm một tập hợp các lệnh để thực thi, dự báo tất cả các nhánh hoàn hảo. 2. Đổi tên đăng ký đối với WAR và WAW để tránh mối nguy hiểm. 3. Xác định xem có bất kỳ phụ thuộc dữ liệu giữa các hướng dẫn trong gói sản phẩm, nếu có, đổi tên cho phù hợp. 4. Xác định nếu có tồn tại trong bộ nhớ phụ thuộc các lệnh phát và xử lý thích hợp. 5. Cung cấp rộng rãi cho các đơn vị chức năng để cho phép tất cả các lệnh sẵn sàng phát.

117 118 Kiến trúc máy tính tiên tiến Hình 3.1: ILP có sẵn trong một bộ xử lý hoàn hảo cho sáu các tiêu chí chuẩn SPEC92. Các chương trình dấu chấm động là các vòng lặp sâu và có số lượng lớn vòng lặp cấp song song. Rõ ràng, phân tích này là khá phức tạp. Ví dụ, để xác định xem n lệnh phát có bất kỳ phụ thuộc đăng ký nào trong số đó, giả sử tất cả các lệnh đã được đăng ký là không giới hạn, đòi hỏi so sánh. n 2n 2 + 2n = 2 1 i = i =1 ( n-1) n 2 = n 2 - n 2 Vì vậy, phát hiện phụ thuộc giữa lệnh tiếp theo kích thước mặc định chúng ta giả định trong một vài số liệu, đòi hỏi gần so sánh! Thậm chí chỉ đưa ra 50 lệnh đòi hỏi so sánh. Chi phí này rõ ràng là giới hạn số lượng các lệnh có thể được xem xét vấn đề cùng một lúc. Trong các bộ xử lý hiện tại và tương lai gần, các chi phí không phải là khá cao như vậy, vì chúng ta chỉ cần phát hiện cặp phụ thuộc và số lượng giới hạn của số đăng ký cho phép các giải pháp khác nhau. Hơn nữa, trong một bộ xử lý thực tế, vấn đề xảy ra trong trật tự và hướng dẫn phụ thuộc được xử lý bởi một quá trình đổi tên đó là sự điều khiển đổi tên dựa vào 1 xung nhịp. Sau khi các lệnh được phát, các phát hiện phụ thuộc được xử lý theo kiểu được phân phối bởi các trạm dự trữ hoặc bảng điểm. Tập hợp các lệnh đó là để kiểm tra thực hiện đồng thời được gọi là cửa sổ. Mỗi lệnh trong cửa sổ phải được lưu giữ trong bộ xử lý và số lượng yêu cầu mỗi xung so sánh bằng với tỉ lệ hoàn thành tối đa năm lần số lượng các toán hạng trên 1 lệnh (ngày nay lên đến 6 x 200 x 2 = 2.400), bởi vì mỗi lệnh đang chờ giải quyết phải xem xét tất cả các lệnh hoàn thành cho một trong hai toán hạng của nó. Như vậy, tổng số kích thước cửa sổ được giới hạn của các yêu cầu lưu trữ, so sánh và tốc độ phát hạn chế, mà làm cho một cửa sổ lớn hơn ít hữu ích. Hãy nhớ rằng mặc dù

118 Chương 3: Các hạn chế khi thực hiện lệnh song song 119 bộ xử lý hiện tại cho phép hàng trăm lệnh để được thực hiện, bởi vì chúng không thể phát hành và đổi tên nhiều hơn trong bất kỳ chu kỳ xung nào, tối đa trong suốt thời gian đó có khả năng được giới hạn bởi tốc độ phát. Ví dụ, nếu dòng lệnh có chứa các lệnh độc lập hoàn toàn mà tất cả đặt trong bộ nhớ cache, một cửa sổ lớn sẽ chỉ đơn giản là không bao giờ bị lấp đầy. Giá trị của việc có một cửa sổ lớn hơn tốc độ phát khi đó có những phụ thuộc hoặc cache nhớ trong dòng lệnh. Các kích thước cửa sổ trực tiếp giới hạn số lượng lệnh bắt đầu thực hiện trong một chu kỳ nhất định. Trong thực tế, bộ xử lý thực sự sẽ có một số hạn chế của các đơn vị chức năng (ví dụ, không có bộ xử lý siêu hướng đã xử lý nhiều hơn hai bộ nhớ tham khảo cho xung nhịp), cũng như số lượng giới hạn của bus và thanh ghi truy cập các cổng, mà phục vụ như là những giới hạn về số lượng các lệnh bắt đầu cho mỗi xung đồng hồ. Như vậy, số lượng tối đa của các lệnh có thể phát, bắt đầu thực hiện, hoặc thực hiện trong cùng một chu kỳ xung thường là nhỏ hơn nhiều so với kích thước cửa sổ. Rõ ràng, số lượng ràng buộc có thể thực hiện trong một bộ xử lý đa phát lớn, bao gồm cả phát cho mỗi xung, đơn vị chức năng và độ trễ của đơn vị đó, thanh ghi file các cổng, các hàng đơn vị chức năng (có thể được ít hơn các đơn vị), vấn đề giới hạn cho các nhánh và các giới hạn về lệnh thực thi. Mỗi hành vi như là một ràng buộc trên ILP. Thay vì cố gắng để hiểu nhau của những hiệu ứng này, tuy nhiên, chúng ta sẽ tập trung vào giới hạn kích thước của cửa sổ, với sự hiểu biết rằng tất cả các hạn chế khác sẽ tiếp tục giảm số lượng tính song song có thể được khai thác. Hình 3.2 cho thấy những ảnh hưởng của hạn chế kích thước của cửa sổ mà từ đó có thể thực thi một lệnh. Như chúng ta có thể thấy trong hình 3.2, số lượng tính song song giảm mạnh kích thước cửa sổ. Năm 2005, bộ vi xử lý tiên tiến nhất có kích thước cửa sổ trong khoảng , nhưng các kích thước cửa sổ không đúng so sánh với những thể hiện trong hình 3.2 vì hai lý do. Đầu tiên, nhiều đơn vị chức năng có độ trễ nhiều chu kỳ, làm giảm kích thước cửa sổ có hiệu quả so với các trường hợp tất cả các đơn vị có độ trễ đơn chu kỳ. Thứ hai, bộ vi xử lý thực của cửa sổ cũng phải giữ bất kỳ tài liệu tham khảo bộ nhớ cache nhỏ, mà không được xem xét trong mô hình này, vì nó giả định một truy cập, hoàn hảo đơn chu kỳ trong bộ nhớ cache. Như chúng ta có thể thấy trong hình 3.2, các chương trình số nguyên không chứa tính song nhiều như các chương trình dấu chấm động. Kết quả này được mong đợi. Nhìn vào cách tính song song bị giảm sút. Hình 3.2 làm cho nó rõ ràng rằng các lý thuyết song song trong các trường hợp dấu chấm động đến từ khả năng thực hiện vòng lặp song song. Thực tế là số lượng song song với kích thước cửa sổ thấp mà không phải là khác nhau trong những dấu chấm động và các chương trình số nguyên ngụ ý một cấu trúc, nơi có sự phụ thuộc thân vòng lặp, nhưng vài sự phụ

119 120 Kiến trúc máy tính tiên tiến thuộc giữa các vòng trong chương trình như tomcatv. Tại cửa sổ kích thước nhỏ, bộ xử lý đơn giản là không thể xem xét các lệnh trong vòng lặp tiếp theo có thể được phát song song với lệnh từ phiên hiện hành. Trường hợp này là một ví dụ về công nghệ trình biên dịch tốt hơn có thể phát hiện ra số lượng cao hơn ILP, vì nó có thể tìm thấy các cấp vòng lặp song song và lập lịch mã để có thể tận dụng lợi thế của nó, ngay cả với kích thước cửa sổ nhỏ. Hình 3.2: Ảnh hưởng của kích thước cửa sổ hiển thị của mỗi ứng dụng bằng cách vẽ những con số trung bình của các lệnh phát trong mỗi chu kỳ. Chúng ta biết rằng kích thước cửa sổ rất lớn là không thực tế và không hiệu quả, các dữ liệu trong hình 3.2 cho chúng ta biết thông qua các lệnh sẽ bị giảm đáng kể với việc triển khai thực tế. Vì vậy, chúng tôi sẽ giả định một kích thước cơ sở của Windows 2K, khoảng 10 lần lớn như thực hiện trong năm 2005 và một khả năng tối đa của 64 lệnh cho mỗi xung, cũng có 10 lần các bộ xử lý vấn đề lớn nhất trong năm 2005, cho phần còn lại của phân tích này. Như chúng ta sẽ thấy trong các phần tiếp theo, khi phần còn lại của bộ xử lý không phải là hoàn hảo, một Windows 2K và một vấn đề 64 - hạn chế không cưỡng ép số lượng của ILP bộ xử lý có thể sử dụng.

120 Chương 3: Các hạn chế khi thực hiện lệnh song song Những ảnh hưởng của nhánh thực và các bước dự báo Bộ xử lý lý tưởng của chúng ta giả định rằng nhánh có thể được hoàn toàn dự báo: Các kết quả của bất cứ nhánh trong chương trình được biết đến trước khi lệnh đầu tiên được thực thi. Tất nhiên, không có bộ xử lý thực có thể đạt được điều này. Hình 3.3 cho thấy những ảnh hưởng của đề án dự báo thực tế hơn trong hai định dạng khác nhau. Dữ liệu của chúng ta được sử dụng cho một số nhánh khác nhau sơ đồ dự báo, thay đổi từ hoàn hảo để dự báo không có. Chúng ta giả định một dự báo riêng biệt được sử dụng để làm bước đệm. Bước dự báo là quan trọng chủ yếu với các dự báo nhánh chính xác nhất, kể từ khi công nghệ tần số cao và độ chính xác của dự báo nhánh chiếm ưu thế. Hình 3.3: Hiệu quả của nhánh dự báo các sơ đồ sắp xếp theo ứng dụng. Biểu đồ này cho thấy ảnh hưởng của một mô hình hoàn hảo của nhánh dự báo (tất cả các nhánh dự báo một cách chính xác tùy tiện vượt xa); để dự báo khác nhau động (có chọn lọc và 2-bit); thời gian biên dịch, hồ sơ dựa trên dự báo; và cuối cùng để sử dụng không có yếu tố dự báo. Các dự báo này được mô tả chính xác bằng văn bản của đồ thị này nêu bật sự khác biệt giữa các chương trình với các cấp vòng song song (tomcatv và fpppp) và những chương trình không có (các chương trình số nguyên và doduc).

121 122 Kiến trúc máy tính tiên tiến Năm cấp của nhánh dự báo được hiển thị trong con số này là: 1. Hoàn toàn (Perfect) - Tất cả các nhánh và bước nhảy là hoàn toàn dự đoán vào khi bắt đầu thực hiện. 2. Dự báo nhánh dựa vào Tournament (Tournament-based branch predictor) Sơ đồ dự đoán sử dụng một yếu tố dự báo 2-bit tương quan và một yếu tố dự báo 2- bit không tương quan cùng với một số lựa chọn, mà chọn các dự báo tốt nhất cho từng nhánh. Các bộ đệm chứa 213 dự đoán (8K) mục, mỗi nhóm gồm ba trường 2- bit, hai trong số đó là dự đoán và trường thứ ba là chọn. Các dự báo tương quan là lập chỉ mục bằng cách sử dụng độc quyền địa chỉ nhánh và lịch sử nhánh toàn cầu. Dự báo không tương quan là yếu tố dự báo tiêu chuẩn 2-bit lập chỉ mục của các địa chỉ nhánh. Bảng chọn cũng lập chỉ mục của các địa chỉ nhánh và quy định cụ thể tương quan hay không tương quan (noncorrelating) dự báo nên được sử dụng. Chọn là tăng lên hay giảm đi cũng như chúng ta sẽ cho một tiêu chuẩn 2-bit dự báo. Điều này dự báo, trong đó sử dụng tổng cộng 48K bit, đạt tốc độ dự báo nhầm (misprediction) trung bình là 3% đối với các tiêu chí chuẩn SPEC92 và có thể so sánh trong chiến lược và quy mô các yếu tố tiên đoán tốt nhất để sử dụng vào năm Bước dự đoán được thực hiện với một cặp dự đoán 2K, một trong những tổ chức như một bộ đệm vòng để dự đoán lợi nhuận và một tổ chức như một yếu tố dự báo chuẩn và được sử dụng cho máy tính nhảy (computed jumps) (như trong trường hợp câu lệnh hoặc máy tính gotos). Những dự đoán nhảy này gần như hoàn hảo. 3. Thiết bị dự báo 2-bit chuẩn (Standard 2-bit predictor) với 512 mục 2-bit. Ngoài ra, chúng ta giả thiết một bộ đệm 16 mục vào để dự đoán những sự trở lại. 4. Dựa trên hồ sơ (Profile-based) - Dự báo tĩnh sử dụng lịch sử hồ sơ về chương trình và dự đoán rằng nhánh luôn luôn thực hiện hoặc không thực hiện dựa trên hồ sơ cá nhân. 5. Không (None) - Không có dự đoán nhánh được sử dụng, mặc dù sự nhảy vẫn còn dự đoán. Song song phần lớn là giới hạn trong vòng một khối cơ bản. Vì chúng ta không tính chu kỳ bổ sung cho một nhánh dự báo nhầm, hiệu quả duy nhất của nhánh khác nhau của dự đoán là để thay đổi số lượng song song có thể được khai thác qua các khối cơ bản của sự dự báo. Hình 3.4 cho thấy tính chính xác của ba yếu tố tiên đoán thực tế cho các nhánh có điều kiện cho các tập con của chúng tôi bao gồm các tiêu chí chuẩn SPEC92 ở đây. Hình 3.3 cho thấy rằng hành vi của hai nhánh của các chương trình dấu chấm động là đơn giản hơn nhiều so với các chương trình khác, chủ yếu vì hai chương trình có nhiều nhánh và các nhánh ít hơn số tồn tại có nhiều dự đoán được. Tài sản này cho phép một lượng đáng kể cấp song song được khai thác với phương án dự báo thực tế. Ngược lại, cho tất cả các chương trình số nguyên và cho doduc, chuẩn

122 Chương 3: Các hạn chế khi thực hiện lệnh song song 123 FP song song với cấp vòng ít nhất, thậm chí cả sự khác biệt giữa dự báo nhánh hoàn hảo và đầy tham vọng có chọn lọc các dự báo là kịch tính. Cũng giống như các dữ liệu kích thước cửa sổ, những số liệu này cho chúng ta biết rằng để đạt được một lượng đáng kể song song trong các chương trình số nguyên, bộ xử lý phải lựa chọn và thực hiện các lệnh là cách xa nhau. Hình 3.4: Tốc độ nhánh dự báo trong tập con SPEC92. Dự báo không chính xác cao, các nhánh dự báo nhầm trở thành một rào cản đối với việc tìm kiếm song song này. Như chúng ta đã thấy, nhánh dự báo là rất quan trọng, đặc biệt là với một kích thước cửa sổ của 2K các lệnh và giới hạn phát của 64. Đối với phần còn lại của mục này, ngoài cửa sổ và giới hạn phát, chúng tôi giả định là căn cứ nhiều tham vọng tournament hơn dự báo rằng sử dụng hai mức dự báo và tổng số 8K mục. Bộ dự báo này, đòi hỏi nhiều hơn 150K bit lưu trữ (khoảng bốn lần so với dự báo lớn nhất cho đến nay), hơi nhanh hơn so với dự báo chọn lọc mô tả ở trên (khoảng 0,5-1%). Chúng ta cũng giả sử một cặp jump 2K và dự báo trả lại, như mô tả ở trên Những ảnh hưởng của các thanh ghi hữu hạn Bộ xử lý lý tưởng của chúng ta loại bỏ tất cả các sự phụ thuộc giữa các tài liệu tham khảo thanh ghi sử dụng một tập vô hạn các thanh ghi ảo. Đến nay, Power5 IBM

123 124 Kiến trúc máy tính tiên tiến đã cung cấp số lượng lớn của sổ thanh ghi ảo: thêm 88 điểm ảo và 88 ghi số nguyên bổ sung, ngoài 64 thanh ghi có sẵn trong kiến trúc cơ bản. Tất cả 240 thanh ghi được chia sẻ bởi hai luồng khi thực hiện chế độ đa luồng (xem mục 3.5) và tất cả có sẵn cho một luồng duy nhất khi ở chế độ đơn luồng. Hình 3.5 cho thấy tác dụng của việc giảm số lượng thanh ghi có sẵn để đặt tên lại, các thanh ghi FP và GP đang tăng số lượng thanh ghi thể hiện trong lý thuyết. Hình 3.5: Việc giảm cấp song song có sẵn là đáng kể khi ít hơn một số lượng vô hạn của các thanh ghi đổi tên là có thể dùng được. Cả 2 số lượng thanh ghi FP và số lượng thanh ghi GP là tăng số lượng hiển thị trên trục x. Vì vậy, các mục nhập tương ứng với "128 FP+ 128 số nguyên" có tổng cộng = 320 thanh ghi (128 để đổi tên số nguyên, 128 cho FP đổi tên, 64 số nguyên và các thanh ghi FP hiện nay trong kiến trúc MIPS). Các hiệu quả là ấn tượng nhất về các chương trình FP, mặc dù chỉ có 32 số nguyên và 32 thanh ghi FP phụ có một tác động đáng kể trên tất cả các chương trình. Đối với các chương trình số nguyên, các tác động có nhiều hơn 64 thanh ghi bổ sung là không

124 Chương 3: Các hạn chế khi thực hiện lệnh song song 125 thấy ở đây. Để sử dụng nhiều hơn 64 thanh ghi yêu cầu phát hiện ra rất nhiều xử lý song song, trong đó có các chương trình số nguyên đòi hỏi về cơ bản dự báo nhánh hoàn hảo. Các kết quả trong hình này có vẻ hơi ngạc nhiên: Bạn có thể mong đợi rằng sự tùy thuộc tên giảm tính song song có sẵn. Hãy nhớ rằng mặc dù khai thác số lượng lớn tính song song đòi hỏi phải đánh giá thực hiện nhiều đường có thể. Vì vậy, nhiều thanh ghi là cần thiết để giữ các biến trực tiếp từ các luồng. Hình 3.5 cho thấy tác động của chỉ có một số hữu hạn thanh ghi là đáng kể nếu mở rộng song song tồn tại. Mặc dù đồ thị này cho thấy một tác động lớn trên các chương trình điểm ảo, tác động vào các chương trình số nguyên là nhỏ chủ yếu là do những hạn chế trong kích thước cửa sổ và dự báo nhánh đã hạn chế đáng kể ILP, làm cho đổi tên ít có giá trị. Ngoài ra, thông báo rằng việc giảm song song có sẵn quan trọng ngay cả khi 64 số nguyên và bổ sung thêm 64 thanh ghi FP có sẵn để đặt tên, được so sánh với số lượng thanh ghi thêm có trên các bộ xử lý hiện tại là năm Mặc dù đổi tên thanh ghi rõ ràng là quan trọng để thực hiện, vô số thanh ghi không thực tế. Vì thế, cho phần tiếp theo, chúng ta giả định rằng có 256 số nguyên và 256 thanh ghi FP sẵn để đổi tên - xa hơn nữa với bất kỳ vi xử lý nào có kể từ năm Những ảnh hưởng của sự phân tích alias không hoàn hảo Mô hình tối ưu của chúng ta giả định rằng nó hoàn toàn có thể phân tích tất cả các những sự phụ thuộc bộ nhớ, cũng như loại bỏ tất cả những thanh ghi phụ thuộc. Tất nhiên, phân tích alias là không thể hoàn hảo trong thực tế: các phân tích có thể không được hoàn hảo tại thời gian biên dịch và nó đòi hỏi một số có khả năng vô hạn của so sánh ở thời gian chạy (kể từ khi số lượng các chuẩn đồng thời là bộ nhớ không bị giới hạn). Hình 3.6 cho thấy tác động của ba mô hình phân tích alias khác của bộ nhớ, ngoài việc phân tích hoàn hảo. Ba mô hình: 1. Toàn cầu/hoàn hảo - Mô hình này hoàn thiện những sự dự đoán cho những sự tham khảo toàn cầu, chuẩn stack và giả thiết mọi xung đột những chuẩn đống (heap) thích hợp hơn. Gần đây người ta liên tục nghiên cứu về phân tích alias (bí danh) cho con trỏ cần cải thiện việc xử lý các con trỏ rất nhiều trong tương lai. 2. Kiểm tra - Mô hình này xem xét các truy cập để xem nó có thể được xác định không can thiệp vào thời gian biên dịch. Ví dụ, nếu truy cập dùng R10 như là một thanh ghi cơ sở với một giả định độ dời là 20, sau đó truy cập khác sử dụng R10 như là một thanh ghi cơ sở với một độ dời là 100 không thể can thiệp, R10 không thể thay đổi. Ngoài ra, địa chỉ dựa trên sổ thanh ghi trỏ đến các khu vực phân bổ

125 126 Kiến trúc máy tính tiên tiến khác nhau (chẳng hạn như khu vực toàn cầu và nhiều khu vực khác) được giả định là không bao giờ để tên alias. Phân tích này cũng tương tự như thực hiện bởi rất nhiều bộ biên dịch, mặc dù các bộ biên dịch mới hơn có thể làm tốt hơn, ít nhất là cho các chương trình định hướng vòng lặp. Hình 3.6: Hiệu quả của việc thay đổi mức độ phân tích alias về các chương trình cá nhân. 3. Không - Tất cả các tham chiếu bộ nhớ được giả định xung đột. Như bạn có thể mong đợi, cho các chương trình FORTRAN (nơi không có tài liệu tham khảo tồn tại), không có sự khác biệt giữa hoàn hảo và toàn cầu nhiều phân tích hoàn hảo. Toàn cầu nhiều phân tích hoàn hảo là tối ưu, vì bộ biên dịch không bao giờ có thể tìm thấy tất cả sự tùy thuộc mảng chính xác. Thực tế là phân tích hoàn hảo của toàn cầu và ngăn xếp tài liệu tham khảo vẫn là một yếu tố tốt hơn so với kiểm tra cho thấy phân tích biên dịch hoặc phân tích động hoặc phân tích hoạt động sẽ được yêu cầu để có được tính song song nhiều. Trong thực tế, bộ vi xử lý lập lịch động theo lịch trình định hướng dựa vào bộ nhớ động. Để thực hiện định hướng động hoàn hảo cho một tải cho sẵn, ta phải biết các địa chỉ nhớ của tất cả các bộ lưu trữ trước đó chưa được cam kết, kể từ khi một tải có thể có một sự phụ thuộc qua bộ nhớ trên một bộ lưu trữ. Như chúng ta sẽ đề cập trong chương cuối, sự dự báo địa chỉ bộ nhớ có thể được sử dụng để vượt qua giới hạn này.

126 Chương 3: Các hạn chế khi thực hiện lệnh song song Hạn chế ILP đối với bộ vi xử lý Trong phần này chúng ta nhìn vào hiệu suất của bộ vi xử lý với mức độ tham vọng của hỗ trợ phần cứng bằng hoặc tốt hơn so với những gì có sẵn trong năm 2006 hoặc có khả năng sẽ có sẵn trong vài năm tới. Đặc biệt chúng ta giả định các thuộc tính cố định sau đây: 1. Lên đến 64 lệnh phát cho mỗi xung đồng hồ mà không có hạn chế phát, hoặc khoảng 10 lần chiều rộng tổng số phát của bộ vi xử lý rộng nhất trong Một dự báo tournament với mục IK và trả về một dự báo 16-mục. Dự báo này là khá tương đương với dự đoán tốt nhất trong năm Hoàn toàn định hướng của các tham chiếu bộ nhớ này được thực hiện động, đầy tham vọng nhưng có lẽ nó đạt được kích cỡ cửa sổ nhỏ (và do đó tốc độ phát nhỏ và bộ đệm tải-lưu) hoặc thông qua một dự báo phụ thuộc vào bộ nhớ. 4. Đăng ký đổi tên với số nguyên thêm 64 và 64 thanh ghi FP bổ sung, đó là khoảng so sánh với IBM. Hình 3.7 cho thấy kết quả cho cấu hình này khi chúng ta thay đổi kích thước cửa sổ. Cấu hình này là phức tạp hơn và đắt hơn bất kỳ triển khai hiện có, đặc biệt là trong thuật ngữ của số lệnh phát. Tuy nhiên, nó sẽ cho một kết hợp hữu ích về những gì có thể triển khai trong tương lai. Mặc dù có rất ít thanh ghi thay đổi tên hơn kích thước cửa sổ, thực tế là tất cả các hoạt động có độ trễ bằng không và số lượng các thanh ghi đổi tên bằng với chiều rộng phát, cho phép bộ vi xử lý khai thác song song trong toàn bộ cửa sổ. Ngoài ra, hãy nhớ rằng trong phiên dịch các kết quả này, bộ nhớ cache là đơn vị những tiềm ẩn chưa được đưa vào tài khoản và cả những hiệu ứng này sẽ có tác động đáng kể năng suất. TBE dữ liệu trong những số liệu này có thể sẽ là rất lạc quan vì lý do khác. Không có giới hạn phát trong số 64 lệnh: nó đều có thể được tham chiếu bộ nhớ. Không một ai, ngay cả sẽ chiêm ngưỡng khả năng này trong một bộ vi xử lý trong tương lai gần. Thật không may, nó thì khá khó khăn để ràng buộc thực hiện một bộ xử lý với những hạn chế phát hợp lý, không chỉ là không gian của những khả năng khá lớn, nhưng sự tồn tại của những hạn chế phát đòi hỏi sự được đánh giá song song với một bộ lập lịch lệnh chính xác, làm cho chi phí nghiên cứu xử lý với số lượng lớn các phát rất tốn kém. Do khó khăn của việc tăng tốc độ lệnh với thiết kế phần cứng thực tế, các nhà thiết kế phải đối mặt với một thách thức trong việc quyết định cách tốt nhất để sử dụng các nguồn lực hạn chế có sẵn trên một mạch tích hợp. Ví dụ sau minh họa những thách thức.

127 128 Kiến trúc máy tính tiên tiến Hình 3.7: Lượng song song có sẵn so với kích thước cửa sổ cho một loạt các số nguyên và các chương trình dấu chấm động lên đến 64 tùy ý, lệnh phát trên một xung đồng hồ. Hình 3.7 là bộ xử lý với các khó khăn thực tế nêu trên, hiệu quả của các kích thước cửa sổ cho các chương trình số nguyên không phải là nghiêm trọng như đối với các chương trình FP. Các điểm kết quả này để TBE khác biệt chính giữa hai loại chương trình. Tính sẵn có của vòng lặp cấp hai song song của chương trình FP có nghĩa là số ILP có thể khai thác được cao hơn, nhưng điều đó cho các chương trình số nguyên tố khác, chẳng hạn như dự đoán nhánh, thanh ghi đổi tên và ít song song để bắt đầu tất cả các hạn chế quan trọng. Quan sát này là rất quan trọng vì sự nhấn mạnh tăng trên hiệu suất nguyên trong vài năm qua. Thật vậy, hầu hết các thị trường tăng trưởng trong việc xử lý giao dịch cuối thập kỷ, các máy chủ web và giống như phụ thuộc vào hiệu quả số nguyên, thay vì dấu chấm động. Như chúng ta sẽ thấy trong phần kế tiếp, cho một bộ xử lý thực tế trong năm 2005, thực tế mức hiệu suất rất thấp so với những thể hiện trong hình 3.7.

128 Chương 3: Các hạn chế khi thực hiện lệnh song song 129 Ví dụ: Hãy xem xét ba giả thuyết như ví dụ sau đây, nhưng không phải điển hình, bộ vi xử lý, mà chúng ta chạy với chuẩn gcc SPEC: 1. Một MIPS đơn giản hai phát thực hiện đường ống tĩnh ở tốc độ xung 4 GHz và đạt được một chỉ số CPI đường ống là 0,8. Bộ xử lý này có một hệ thống cache 0,005 sự nhầm lẫn trong một lệnh. 2. Một phiên bản đường ống dẫn sâu của một bộ xử lý MIPS hai phát với cache hơi nhỏ hơn và tốc độ xung 5 GHz. Chỉ số CPI đường ống dẫn của bộ xử lý là 1,0 và lưu trữ nhỏ hơn sản lượng 0,0055 sự nhầm lẫn trên 1 lệnh trung bình. 3. Một suy đoán siêu hướng với một cửa sổ 64-mục. Nó đạt được một nửa của tốc độ phát lý tưởng cho việc đo kích thước cửa sổ (sử dụng dữ liệu trong hình 3.7). Bộ vi xử lý này có cache dung lượng nhỏ nhất, dẫn đến 0,01 sự nhầm lẫn trong một lệnh, nhưng nó ẩn đến 25% giá trị cho mỗi lần sai bằng lập lịch động, tốc độ của bộ vi xử lý này là 2,5 GHz. Giả sử rằng thời gian để bộ nhớ chính (mà nó cho ra kết quả sai) là 50ns, là khả năng thi hành tương đối của những bộ vi xử lý này. Trả lời: Trước hết, chúng ta sử dụng lỗi nhầm lẫn và tỉ lệ thông tin nhầm đến máy tính đóng góp đến CPI từ lỗi cache cho mỗi cấu hình. Chúng ta làm điều này bằng cách vận dụng công thức sau: Cache CPI = Độ sai lệch mỗi lệnh x Độ sai (Cache CPI = Misses per instruction x Miss penalty) Kết quả chúng ta cần từ máy tính để tính kết quả sai lệch từ mỗi hệ thống: Kết quả sai lệch = Thời gian truy cập bộ nhớ / Chu kỳ xung đồng hồ ( Miss Memory access time penalty = ) Clock cycle Thời gian chu kỳ xung đồng hồ cho các bộ vi xử lý là 200ps, 250ps và 400ps, theo như mong đợi, kết quả sai là: Miss penalty 1 = Miss penalty 2 = Miss penalty 3 = 50 ns 250 ps 50 ns 200 ps 0,75 x 50 ns 400 ps = 200 cycles = 250 cycles = 94 cycles

129 130 Kiến trúc máy tính tiên tiến áp dụng công thức này cho mỗi cache: Cache CPI 1 = 0,005 x 200 = 1,0 Cache CPI 2 = 0,0055 x 250 = 1,4 Cache CPI 3 = 0,01 x 94 = 0,94 Chúng ta biết đường ống CPI phục vụ cho mọi thứ bộ vi xử lý 3 đường ống CPI của nó được tính bởi: Pipeline CPI 3 = 1 Issue rate = 1 9 x 0,5 = 1 4,5 = 0,22 Bây giờ chúng ta có thể tìm CPI cho mỗi bộ vi xử lý bằng cách thêm đường ống và cache CPI: CPI 1 = 0,8 + 1,0 = 1,8 CPI 2 = 1,0 + 1,4 = 2,4 CPI 3 = 0,22 + 0,94 = 1,16 Do đây là kiến trúc tương tự, chúng ta có thể so sánh tốc độ thực hiện lệnh trong hàng triệu lệnh trong một giây (MIPS - Millions of Instructions Per Second) để xác định hiệu suất tương đối: CR Instruction execution rate = CPI Instruction execution rate 1 = Instruction execution rate 2 = Instruction execution rate 3 = 4000 MHz 1, MHz 2, MHz 1,16 = 2222 MIPS = 2083 MIPS = 2155 MIPS Trong ví dụ này, hai phát tĩnh siêu hướng đơn giản trông tốt nhất. Trong thực tế, hiệu quả phụ thuộc vào cả hai chỉ số CPI và những giả định tốc độ xung Những hạn chế phát sinh Giống như bất kỳ giới hạn nghiên cứu, nghiên cứu của chúng ta đã kiểm tra trong phần này có những hạn chế riêng của mình. Chúng ta chia thành hai loại: hạn chế phát sinh ngay cả đối với bộ vi xử lý dự báo hoàn hảo và hạn chế phát sinh cho một hoặc nhiều mô hình thực tế. Tất nhiên, tất cả những hạn chế trong các loại đầu

130 Chương 3: Các hạn chế khi thực hiện lệnh song song 131 tiên áp dụng cho các lần thứ hai. Những hạn chế quan trọng nhất mà áp dụng ngay cả với mô hình hoàn hảo: 1. Các nguy hiểm WAW và WAR thông qua bộ nhớ: Nghiên cứu loại bỏ các mối nguy hiểm WAW và WAR thông qua đổi tên thanh ghi, nhưng không sử dụng bộ nhớ. Mặc dù ở cái nhìn đầu tiên nó có thể xuất hiện rằng trường hợp như vậy rất hiếm (đặc biệt là các mối nguy hiểm WAW), nó phát sinh do sự phân bổ của các khung chồng (stack frame). Một thủ tục được gọi là những sử dụng lại các vị trí bộ nhớ của một thủ tục trước đây về stack và điều này có thể dẫn đến mối nguy hiểm WAW và WAR mà không cần thiết hạn chế. 2. Các phụ thuộc không cần thiết: Những sự phụ thuộc với số lượng vô hạn của các thanh ghi, tất cả, nhưng đăng ký dữ liệu thật sự những sự phụ thuộc được loại bỏ. Tuy nhiên, những sự phụ thuộc phát sinh, hoặc tái phát, hoặc hội nghị giới thiệu thế hệ mới mà không cần thiết dữ liệu thật sự những sự phụ thuộc. Một ví dụ trong số này là sự phụ thuộc vào biến điều khiển trong một vòng lặp đơn giản. Kể từ khi biến điều khiển được tăng lên mọi sự lặp lại, vòng lặp có chứa ít nhất một sự phụ thuộc. Nghiên cứu của Wall bao gồm một số lượng giới hạn tối ưu như vậy, nhưng áp dụng chúng tích cực hơn có thể dẫn đến tăng số tiền của ILP. Ngoài ra, một số mã quy ước thế hệ những sự phụ thuộc giới thiệu không cần thiết, đặc biệt là việc sử dụng địa chỉ các thanh ghi trở lại và đăng ký cho lớp con trỏ được tăng lên và giảm đi trong các cuộc gọi / chuỗi trả lại. Wall loại bỏ hiệu lực của thanh ghi địa chỉ trả về, nhưng sự sử dụng một con trỏ ngăn xếp trong quy ước kết nối có thể gây ra những sự phụ thuộc không cần thiết. 3. Khắc phục những hạn chế luồng dữ liệu: Nếu giá trị dự đoán đã làm việc với độ chính xác cao, nó có thể vượt qua giới hạn lưu lượng dữ liệu. Chủ đề này đã đạt được một nâng cao đáng kể trong ILP khi sử dụng một chương trình dự đoán thực tế. Rõ ràng, hoàn thiện dữ liệu giá trị dự đoán sẽ dẫn tới hiệu quả vô hạn, vì mỗi giá trị của tất cả các lệnh có thể được dự đoán ưu tiên. Đối với một bộ xử lý ít hoàn hảo hơn, một số ý tưởng đã được đề xuất mà có thể phơi bày thêm ILP. Một ví dụ là để suy đoán theo đa đường. Ý tưởng này đã được thảo luận bởi Lam và Wilson 1992 và khám phá trong nghiên cứu bao gồm trong phần này. Bằng cách dự đoán trên các đường, chi phí phục hồi không chính xác là giảm và tính song song nhiều hơn có thể được phát hiện. Nó chỉ có ý nghĩa để đánh giá kế hoạch này cho một số lượng hạn chế của các nhánh, vì các tài nguyên phần cứng yêu cầu phát triển theo cấp số nhân. Wall 1993 cung cấp dữ liệu cho dự báo theo cả hai hướng trên lên đến tám nhánh. Do chi phí của việc theo đuổi cả hai con đường, biết rằng ta sẽ vứt bỏ (và số lượng ngày càng tăng của tính vô dụng như là quá trình như vậy được làm theo đa nhánh), mỗi thiết kế thương mại đã dành phần cứng thay vì bổ sung để suy đoán tốt hơn trên con đường chính xác.

131 132 Kiến trúc máy tính tiên tiến Để hiểu rằng không có giới hạn trong phần này là cơ bản trong việc khắc phục chúng đòi hỏi một sự thay đổi trong quy luật vật lý. Thay vào đó, nó là những hạn chế thực hành có bao hàm sự tồn tại của một số rào cản ghê gớm để khai thác thêm ILP. Những hạn chế này, cho dù là kích thước cửa sổ, phát hiện bí danh (alias), hoặc dự báo nhánh là những thách thức để các nhà thiết kế và các nhà nghiên cứu vượt qua! Khi chúng ta thảo luận trong mục 3.6, các tác động của hạn chế ILP và các chi phí thực hiện các phát rộng hơn dường như đã tạo ra những hạn chế có hiệu quả trên khai thác ILP Xử lý song song ở mức luồng (thread) Một câu hỏi được đặt ra là: có bao nhiêu khả năng có thể thực hiện trên SMT? Khi câu hỏi này được công khai vào năm , các nhà nghiên cứu cho rằng các siêu đa hướng động (dynamic superscalar) sẽ được sử dụng rộng hơn nhiều trong 5 năm tới. Hỗ trợ 6 đến 8 phát trên xung đồng hồ với dự báo lập trình động, cho nhiều tải và lưu trữ đồng thời, các cache chính lớn và 4 đến 8 ngữ cảnh với lệnh lấy về đồng thời từ các ngữ cảnh. Vì nhiều lý do, nó sẽ trở nên sáng sủa hơn trong các phần sau, bộ xử lý không có khả năng này đã được chế tạo có thể được xây dựng ở trong tương lai gần. Do vậy, các kết quả nghiên cứu mô phỏng đó cho thấy các độ lợi cho các tải làm việc đa chương trình của hai lần trở lên thì không thực. Trong thực tế, tồn tại các thực hiệncủa SMT đưa ra 2 ngữ cảnh với lệnh lấy về duy nhất, cũng như các khả năng phát khiêm tốn hơn, kết quả thu được là độ lợi từ SMT cũng là khiêm tốn hơn. Ví dụ, ở dòng Pentium 4, trong một cuộc khảo nghiệm ở dòng máy HP- Compaq, sử dụng SMT mang lại cải tiến hiệu năng là 1,01 khi chạy SPECintRate chuẩn và khoảng 1,07 khi chạy SPECfpRate chuẩn. Trong những nghiên cứu khác nhau, Tuck and Tullsen 2003 phát hiện rằng chạy trộn của từng 26 SPEC chuẩn cặp với SPEC chuẩn khác (đó là, chạy 26 2, nếu chuẩn cũng là chạy ngược lại chính nó) dẫn đến tăng tốc độ từ 0,90 đến 1,58, với tốc độ tăng trung bình là 1,20 (Lưu ý là đo lường này khác với SPECRate, đòi hỏi mỗi chuẩn SPEC được chạy dựa vào nhà cung cấp - số đã chọn của bản sao cùng chuẩn). Các chuẩn song song SPLASH, nó báo cáo tăng tốc đa luồng (multithreaded speedup) trải từ 1,02 tới 1,67, với tốc độ tăng trung bình khoảng 1,22. IBM Power5 hăng hái triển khai SMT kể từ năm 2005 và có bổ sung mở rộng để hỗ trợ SMT, đã được mô tả trong nhiều mục trước đây. So sánh sự thực hiện trực tiếp của Power5 ở chế độ SMT, kéo dài hai bản sao của ứng dụng trên một vi xử lý, đối với Power5 trong kiểu luồng đơn - chuỗi, với một tiến trình mỗi lõi (core) chỉ ra rằng tăng tốc độ qua nhiều chuẩn giữa 0,89 (hiệu suất tổn thất) là 1,41. Hầu hết các ứng dụng cho thấy ít nhất một số độ lợi từ SMT, các ứng dụng dấu chấm động chuyên sâu, mà phải chịu những cuộc xung đột bộ nhớ cache, cho độ lợi ít nhất.

132 Chương 3: Các hạn chế khi thực hiện lệnh song song 133 Hình 3.8 cho thấy sự tăng tốc cho một Power5 tám bộ xử lý, đa xử lý và không có SMT cho các chuẩn SPECRate2000, như mô tả trong chú thích. Trung bình, SPECintRate nhanh hơn 1,23 lần, trong khi SPECfpRate nhanh hơn 1,16 lần. Lưu ý rằng một vài chuẩn dấu chấm động về kinh nghiệm làm giảm nhẹ hiệu suất trong chế độ SMT, với việc giảm tối đa 0,93 lần tăng tốc. Hình 3.8: So sánh SMT và luồng đơn (ST - Single Thread) thực hiện trên IBM eserver P5 575 tám bộ vi xử lý. Lưu ý rằng trục tọa độ y bắt đầu tại một tăng tốc lên 0,9, một sự mất hiệu năng. Chỉ có một bộ xử lý trong mỗi lõi Power5 là hoạt động, mà cần cải thiện các kết quả từ SMT bằng cách giảm sự can thiệp phá hoại trong hệ thống bộ nhớ. Các kết quả SMT đạt được bằng cách tạo ra 16 luồng người sử dụng, trong khi các kết quả ST chỉ sử dụng 8 luồng. Với chỉ một luồng (thread) trên mỗi bộ vi xử lý,

133 134 Kiến trúc máy tính tiên tiến Power5 là chuyển mạch sang kiểu luồng đơn của hệ điều hành. Các kết quả này đã được thu thập bởi John McCalpin của IBM. Như chúng ta có thể thấy từ các dữ liệu, độ lệch tiêu chuẩn của các kết quả cho các SPECfpRate thì cao hơn SPECintRate (0,13 so với 0,07), chỉ ra rằng sự cải thiện SMT cho các chương trình FP có thể sẽ rất khác nhau. Các kết quả này hoàn toàn chỉ rõ được lợi ích của SMT như là một bộ vi xử lý dự báo linh hoạt với sự hỗ trợ rộng rãi từ SMT. Do chi phí và lợi nhuận giảm dần, hơn nữa, lại có nhiều siêu vô hướng (superscalar) bổ sung rộng rãi khác hoàn toàn linh hoạt hơn những phiên bản của SMT, nên nhiều nhà thiết kế đã chọn cách bổ sung nhiều bộ lõi CPU trong một trình đơn với ít sự hỗ trợ tích cực hơn từ những vấn đề đa luồng. Chúng ta sẽ trở lại chủ đề này trong chương tiếp theo Hiệu suất và hiệu quả trong bộ vi xử lý tiên tiến Trong phần này, chúng ta sẽ thảo luận một số những đặc điểm hiện thời của vấn đề xử lý đa luồng và kiểm tra hiệu suất và hiệu quả của chúng trong việc sử dụng silicon, bán dẫn và năng lượng. Sau đó chúng ta sẽ trở lại thảo luận về những hạn chế thực tế của siêu vô hướng (superscalar) và tương lai của bộ vi xử lý hiệu suất cao. Bảng 3.1 sẽ chỉ cho chúng ta thấy những đặc điểm của bốn bộ vi xử lý hiệu suất mạnh nhất hiện nay. Chúng khác biệt nhau rất lớn về tổ chức, tốc độ phát, khả năng đơn vị chức năng, tốc độ xung đồng hồ, điểm chết, bộ đếm bán dẫn và nguồn điện. Như các hình 3.9 và 3.10, không có một vật dẫn tổng quát rõ ràng nào về hiệu suất. Như Itanium 2 và Power5, nó hoạt động như trong SPECfp, hoàn toàn vượt trội Athlon và Pentium 4 về tiêu chuẩn. AMD Athlon dẫn đầu hiệu suất của SPECint theo sau là Pentium 4, Itanium 2 và Power5. Câu hỏi được đặt ra là hiệu quả trong thuật ngữ vùng silicon và bộ nguồn thì ngang bằng tới hạn. Như chúng ta đã đề cập ở chương 1, bộ nguồn đã trở thành một khó khăn lớn trong các bộ xử lý hiện đại. Hình 3.11 chỉ ra cách mà những bộ xử lý này được so sánh với nhau về hiệu suất, biểu đồ SPECint và hiệu năng SPECfp với bộ đếm bán dẫn, vùng silicon và bộ nguồn. Kết quả này cung cấp một sự tương phản thú vị giữa những kết quả được thực thi. Itanium 2 là bộ xử lý hiệu quả nhất cả về dấu chấm động và bộ nguồn tổng thể cho tất cả trong một sự đo (SPECfp/watt). Athlon và Pentium 4 đều sử dụng tốt bán dẫn và phân vùng để tạo hiệu quả tốt, trong khi IBM power5 lại hoạt động hiệu quả trong việc sử dụng nguồn năng lượng SPECfp và chủ yếu gắn liền với SPECint. Thực tế là không có một bộ vi xử lý nào cung cấp vượt quá những tiện ích bằng nhiều phương pháp đo lường, đã dẫn cho chúng ta thấy rằng không có một sự cung cấp gần đúng nào silver bullet sẽ cho phép khai thác ILP để sắp xếp dễ dàng và hiệu quả trong những vị trí tạm.

134 Chương 3: Các hạn chế khi thực hiện lệnh song song 135 Processor Microarchitecture Fetch/issue/ execute Func. units Clock rate (GHz) Transistor and die size Power Intel Pentium 4 Extreme Speculative dynamically scheduled; deeply pipelined; SMT 3/3/4 7 int. 1 FP 3,8 125M 122 mm W AMD Athlon Speculative 64 FX-57 dynamically scheduled 3/3/4 6 int. 3 FP 2,8 114M 115 mm W IBM Power5 1 processor Speculative dynamically scheduled; SMT; two CPU cores/chip 8/4/8 6 int. 2 FP 1,9 200M 300 mm 2 (estimated) 80 W (estimated) Intel Itanium 2 EPIC style; primarily statically scheduled 6/5/11 9 int. 2 FP 1,6 592M 423 mm W Bảng 3.1: Bốn đặc tính của bộ vi xử lý đa luồng: Power5 bao gồm 2 lõi CPU, mặc dù chúng ta chỉ xem xét sự thi hành lệnh của một lõi CPU trong chương này mà thôi. Bộ đếm bán dẫn, khu vực và năng lượng tiêu thụ của Power5 đã được tính toán cho 1 lõi xử lý dựa trên phép đo của bộ đếm 2 lõi 276M, 389 mm 2 và 125 W, theo một thứ tự đã định sẵn. Những điểm chết lớn hơn và bộ đếm bán dẫn cho Itanium 2 phần nào được chạy bởi một khối nhớ cache 9MB trong con chip. Cả AMD opteron và Athlon đều chạy trên cùng một lõi vi kiến trúc. Athlon chỉ được dành cho máy tính để bàn và không cung cấp được cho bộ đa xử lý. Opteron thì dành cho máy chủ. Điều này giống với sự khác biệt giữa Pentium và Xeon trong các dòng sản phẩm của Intel. Hình 3.9: So sánh hiệu suất của 4 vi xử lý đa phát tiên tiến được trình bày trong bảng 3.1 đối với các chuẩn SPECint2000. P

135 136 Kiến trúc máy tính tiên tiến Hình 3.10: So sánh hiệu suất của 4 vi xử lý đa phát tiên tiến được trình bày trong bảng 3.1 đối với các chuẩn SPECfp2000. Hình 3.11: Các đo lường sự ảnh hưởng đối với bốn vi xử lý đa phát. Trong trường hợp của Power5, bao gồm 2 vi xử lý lõi, vì thế chúng ta ước tính được metric lõi đơn như công suất = 80 W, vùng = 290 mm 2 và số bán dẫn = 200 M.

136 Chương 3: Các hạn chế khi thực hiện lệnh song song 137 Điều gì được giới hạn trong các xử lý đa phát Những giới hạn được triển khai trong phần 3.1 và 3.3 được coi như là một chướng ngại trong việc khai thác triệt để ILP được nhiều hơn, nhưng chúng không phải là những chướng ngại duy nhất. Ví dụ, để tăng gấp đôi tốc độ phát của 3-6 lệnh trên mỗi xung đồng hồ, hay 6-12 lệnh, thì cần một bộ xử lý cho 3 hay 4 phát truy cập bộ nhớ dữ liệu trong mỗi chu kỳ, giải quyết 2 hay 3 nhánh trên mỗi chu kỳ, đặt lại tên và truy cập nhiều hơn 20 thanh ghi trong mỗi chu kỳ và nạp lệnh trên mỗi chu kỳ. Tính phức tạp của việc thực thi công việc này có khả năng không có lợi cho tốc độ xung đồng hồ tối đa. Ví dụ, bộ xử lý phát rộng nhất trong hình 3.9 là Itanium 2, nhưng nó cũng đồng thời có tốc độ xung đồng hồ chậm nhất, mặc dù trên thực tế nó phải dùng hầu hết năng lượng nguồn. Hiện nay việc giới hạn nguồn được chấp nhận tương đối rộng rãi đối với các bộ vi xử lý hiện đại. Bộ nguồn có cả chức năng nguồn tĩnh, có thể làm tăng tỉ lệ tương xứng của bộ đếm bán dẫn (có hay không bán dẫn đang dùng để chuyển mạch) và nguồn động, tương ứng với số lượng sản phẩm trong chuyển mạch bán dẫn và chuyển mạch tốc độ. Mặc dù nguồn tĩnh được quan tâm trong thiết kế, khi hoạt động, nguồn động thường tiêu thụ năng lượng vượt trội hơn. Một bộ vi xử lý luôn hoạt động cả CPI thấp và CR cao và phải chuyển mạch nhiều bán dẫn khiến chúng nhanh hơn, tăng sức tiêu thụ nguồn như là một kết quả tất yếu. Dĩ nhiên, hầu hết các kỹ thuật cho việc thực thi tăng lên, bao gồm đa lõi và đa luồng, sẽ làm tăng sức tiêu thụ nguồn. Mấu chốt của câu hỏi là hiệu quả năng lượng sử dụng: có phải việc làm tăng sức tiêu thụ của nguồn nhanh hơn là việc nó có thể thực hiện không? May mắn là những công nghệ hiện thời của chúng ta phải đẩy mạnh việc thực hiện tất cả những vấn đề của bộ xử lý đa phát, nhưng không hiệu quả nhiều, chỉ làm nảy sinh từ 2 đặc điểm chính: Đầu tiên, việc cấp phát nhiều lệnh phải gánh chịu một vài sự vượt quá trong việc tăng nhanh hơn về tốc độ phát. Lý luận này đáp ứng cho việc phân tích đa lệnh, bao gồm việc phụ thuộc vào kiểm tra, đăng ký đổi tên và những chức năng tương tự. Sự kết hợp các kết quả này, mà không có sự giảm bớt điện thế để làm giảm nguồn, CPIs thấp hơn giống với tỉ lệ thấp hơn của việc chạy máy mỗi Watt, đơn giản là vì nó vượt quá. Thứ hai và quan trọng hơn, là sự tăng trưởng giữa tốc độ phát và duy trì thực hiện. Kể từ số lượng bán chuyển mạch sẽ cân xứng với tốc độ phát đỉnh và việc thực thi tỉ lệ để duy trì tốc độ, tăng trưởng hiệu suất giữa đỉnh và duy trì thực thi biến đổi sang sự tăng năng lượng mỗi đơn vị thực hiện. Không may, chính sự tăng này xuất hiện hoàn toàn cơ bản và nâng lên từ nhiều vấn đề mà chúng ta đã thảo luận ở mục 3.2 và 3.3. Ví dụ, nếu chúng ta muốn duy trì 4 lệnh trên mỗi xung, chúng ta phải lấy lệnh nhiều hơn, vấn đề nhiều hơn và thi hành ban đầu nhiều hơn 4 lệnh. Nguồn sẽ

137 138 Kiến trúc máy tính tiên tiến cân xứng với tốc độ cao, nhưng việc thực thi lại duy trì tốc độ này. (Trong nhiều bộ xử lý hiện nay, sự cung cấp đã làm giảm mức tiêu thụ nguồn bằng cách tắt đi một phần nguồn không hoạt động của bộ xử lý, bao gồm tắt nguồn đồng hồ để chia phần của con chip. Như một số công nghệ, trong khi sử dụng, không thể chặn việc giảm dài hạn trong hiệu suất nguồn). Hơn nữa, công nghệ quan trọng nhất của thế kỷ trước là việc tăng cường khai thác ILP, cụ thể là việc dự báo, vốn đã không hiệu quả. Tại sao? vì nó không bao giờ là hoàn hảo, vốn đã có một sự lãng phí trong việc điều hành máy tính trước khi chúng ta biết được ích lợi của chương trình. Néu việc dự báo hoàn hảo, nó có thể tiết kiệm nguồn và giảm thời gian thực thi và tiết kiệm nguồn tĩnh, trong khi thêm vào 1 vài tính năng bổ sung. Khi dự báo không tốt, năng lượng sẽ nhanh chóng trở nên không hiệu quả. Từ khi nó đòi hỏi nhiều nguồn động cho cả sự dự báo chưa đúng và cho việc khởi động lại hệ thống xử lý. Vì sự vượt quá của những dự báo bổ sung - đăng ký đổi tên, sắp xếp lại bộ đệm, nhiều thanh ghi hơn Nó thì không giống với bất kỳ vi xử lý nào có thể tiết kiệm năng lượng cho một số phần quan trọng khác của chương trình thực tế. Để tập trung vào việc cải tiến tốc độ xung đồng hồ thì cần gì? không may là một câu hỏi hóc búa được đặt ra để cố gắng làm tăng tốc độ xung đồng hồ: làm tăng tốc độ xung đồng hồ sẽ làm tăng tần số chuyển mạch bán dẫn và trực tiếp làm tăng sức tiêu thụ ở nguồn. Để đạt được tốc độ xung đồng hồ nhanh hơn, chúng ta cần tăng chiều dài đường ống, đường ống dẫn càng dài thì sẽ làm tăng sức chịu đựng làm cho tốc độ chuyển mạch càng cao. Dẫn chứng tốt nhất cho hiện tượng này là sự so sánh giữa Pentium III và Pentium IV. Pentium 4 có một đường ống dẫn tương đối dài so với cấu trúc thiết kế của Pentium 3. Trong cùng một quá trình thực hiện giống nhau, nó tiêu thụ tương đối nhiều hơn về nguồn tiêu thụ và tốc độ xung đồng hồ. Không may, sự thi hành của nó lại ít hơn tỉ lệ của tốc độ đồng hồ: bởi vì nó vượt quá giới hạn của ILP Khả năng thực hiện lệnh song song và sự phụ thuộc Mục đích của việc nghiên cứu là chứng minh tính tương tác giữa các yếu tố phần cứng và phần mềm trong việc thực thi khả năng thực hiện lệnh song song. Nghiên cứu này giới thiệu ngắn gọn đoạn mã dựa trên sự minh họa chính xác nhiều giới hạn trong khả năng thực hiện lệnh song song. Bằng cách làm việc này, bạn sẽ thu lợi trong việc biết được làm cách nào những nhân tố tương tác giữa phần cứng và phần mềm để định nghĩa được sự điều hành thời gian của một đoạn mã riêng biệt trong hệ thống đã cho.

138 Chương 3: Các hạn chế khi thực hiện lệnh song song 139 Bảng băm (hash table) là một cấu trúc dữ liệu phổ biến trong việc tổ chức một lượng lớn các dữ liệu để một người có thể nhanh chóng trả lời các câu hỏi như có phải một yếu tố có giá trị 100 tồn tại trong bảng kết hợp?. Điều này được thực thi bằng cách phân công các yếu tố dữ liệu của một lượng lớn các bucket dựa vào hàm băm từ giá trị của các dữ liệu đã thiết lập. Dữ liệu trong mỗi bucket là tổ chức điển hình như một liên kết liệt kê các phần dựa vào trật tự thiết lập đã cho. Một sự tìm kiếm bảng băm bắt đầu bằng xác định bucket phản ứng lại giá trị dữ liệu. Nó sau đó được duyệt qua các phần tử dữ liệu trong bucket và được kiểm tra nếu có bất kỳ một yếu tố nào trong danh sách có giá trị về câu hỏi. Mã nguồn C trong hình 3.12 chèn một lượng lớn các phần tử (N_ELEMENT) trong bảng băm, có bucket được nối kết theo một trật tự tăng dần dựa vào giá trị của các phần tử. Một mảng element[] chứa các phần tử được chèn, phân bổ trong một nhóm (heap). Mỗi lần lặp lại bên ngoài vòng lặp, tại dòng thứ 6, đưa thêm một phần tử vào bảng băm. Dòng 9 trong hình 3.12 tính toán hash-index, chức năng băm giá trị, giá trị dữ liệu được lưu trữ trong element[i]. Chức năng băm được sử dụng tương đối đơn giản. 1 typedef struct _Element { 2 int value; 3 struct _Element *next; 4 } Element; 5 Element element[n_elements], *bucket[1024]; /* The array element is initialized with the items to be inserted; the pointers in the array bucket are initialized to NULL */ 6 for (i = 0; i < N_ELEMENTS; i++) { 7 Element *ptrcurr, **ptrupdate; 8 int hash_index; /* Find the location at which the new element is to be inserted */ 9 hash_index = element[i].value & 1023; 10 ptrupdate = &bucket[hash_index]; 11 ptrcurr = bucket[hash_index]; /* Find the place in the chain to insert the new element */ 12 while (ptrcurr && 13 ptrcurr->value <= element[i].value) 14 { 15 ptrupdate = &ptrcurr->next;

139 140 Kiến trúc máy tính tiên tiến 16 ptrcurr = ptrcurr->next; } /* Update pointers to insert the new element into the chain */ 17 element[i].next = *ptrupdate; 18 *ptrupdate = &element[i]; } Hình 3.12: Ví dụ về mã bảng băm. Nó bao gồm ít nhất 10 bit có ý nghĩa trong một giá trị dữ liệu thành phần. Điều này được thực thi bởi máy tính qua cổng logic AND của giá trị dữ liệu phần tử và hệ bit nhị phân mask (1.023 trong hệ thập phân). Hình 3.13 minh họa một bảng băm cấu trúc dữ liệu đã được sử dụng trong lập trình C. Mảng bucket phía bên trái trong hình 3.13 là một bảng băm. Mỗi mục nhập của mảng bucket chứa một con trỏ kết nối danh sách các dữ liệu phần tử đã được lưu trữ trong bucket. Nếu bucket i hiện tại trống, mục nhập bucket[i] chứa một con trỏ NULL. Trong hình 3.13, ba bucket đầu tiên chứa từng dữ liệu một và các bucket khác thì trống. Biến ptrcurr chứa 1 con trỏ dùng để kiểm tra các phần tử trong liên kết của 1 bucket. Tại dòng 11 của hình 3.12, ptrcurr được thiết lập 1 điểm đến phần tử đầu tiên của danh sách liên kết lưu trữ được đưa vào bucket của bảng băm. Nếu bucket chọn bởi hash-index trống, mảng bucket đáp ứng lại mục nhập ma trận chứa con trỏ NULL. Khi vòng lặp bắt đầu tại dòng 12, nó kiểm tra xem có bất kỳ các phần tử dữ liệu nào nhiều hơn bằng cách kiểm tra nội dung biến ptrcurr. Dòng 13 tới 16 sẽ bỏ qua nếu không có một phần tử nào bị giám sát, cho dù bucket trống, hoặc cho dù tất cả phần tử dữ liệu được liên kết trong danh sách đã được kiểm tra bởi những phép lặp trước của vòng lặp while. Trong trường hợp đầu, phần tử dữ liệu mới sẽ chèn vào như là phần tử đầu tiên trong bucket. Trong trường hợp thứ hai, một phần tử mới sẽ được chèn vào như là phần tử cuối cùng của danh sách liên kết. Trong trường hợp vẫn còn nhiều phần tử cần được kiểm tra, dòng 13 sẽ kiểm tra nếu danh sách liên kết phần tử hiện hành chứa một giá trị nhỏ hơn hay tương xứng với các phần tử dữ liệu được chèn vào bảng băm. Nếu điều kiện là đúng, vòng lặp while sẽ tiếp tục chuyển sang phần tử kế tiếp trong danh sách liên kết, dòng 15 và 16 tới phần tử dữ liệu kế tiếp được liệt kê bằng cách di chuyển ptrcurr đến phần tử kế trong danh sách liên kết. Mặt khác, nó đã tìm được vị trí trong danh sách liên kết nơi nhiều phần tử dữ liệu mới nên được chèn vào, vòng lặp while sẽ kết thúc và một phần tử dữ liệu mới sẽ được chèn đúng vào trước khi phần tử trỏ bởi ptrcurr.

140 Chương 3: Các hạn chế khi thực hiện lệnh song song 141 Bucket value next element [0] element [1] element [2] Hình 3.13: Cấu trúc dữ liệu bảng băm. Biến ptrupdate nhận dạng con trỏ bằng cách phải cập nhật để chèn phần tử dữ liệu mới vào bucket. Nó được thiết lập ở dòng thứ 10 để chỉ mục nhập bucket. Nếu bucket trống, vòng lặp while sẽ bỏ qua và phần tử dữ liệu mới sẽ được chèn vào bằng cách thay đổi con trỏ trong bucket[hash_index] từ NULL tới địa chỉ của phần tử dữ liệu mới bằng dòng 18. Sau khi vòng lặp while, ptrupdate chỉ tới con trỏ phải được cập nhât một phần tử mới để được chèn vào trong bucket thích hợp. Sau khi việc quản lý thoát khỏi vòng lặp while, dòng 17 và 18 kết thúc công việc bằng cách chèn vào phần tử dữ liệu mới vào trong danh sách liên kết. Trong trường hợp bucket trống, ptrupdate sẽ trỏ đến bucket[hash_index], chứa một con trỏ NULL. Dòng 17 sau đó sẽ gán cho con trỏ NULL tới con trỏ kế trong phần tử dữ liệu mới. Dòng 18 thay bucket[hash_table] để trỏ tới phần tử số liệu mới. Trong trường hợp phần tử dữ liệu mới nhỏ hơn tất cả dữ liệu liên kết trong danh sách, ptrupdate cũng sẽ trỏ tới bucket[hash_table], trỏ tới phần tử đầu tiên trong danh sách liên kết. Trong trường hợp này, dòng 17 sẽ gán cho con trỏ phần tử đầu tiên trong danh sách tới con trỏ kế của cấu trúc dữ liệu mới. Trong trường hợp phần tử dữ liệu mới lớn hơn tất cả dữ liệu liên kết trong danh sách nhưng lại nhỏ hơn một số khác, ptrupdate sẽ trỏ tới con trỏ kế của phần tử sau khi phần tử mới được chèn vào. Trong trường hợp này, dòng 17 khiến phần tử dữ liệu mới trỏ tới phần tử dữ liệu ngay sau điểm gán. Dòng 18 khiến phần tử dữ liệu ban đầu đứng trước điểm gán tới con trỏ dữ liệu mới người đọc sẽ thông suốt cách làm việc của đoạn mã một cách chính xác, khi phần tử dữ liệu mới được gán vào phần kết thúc của danh sách liên kết.

141 142 Kiến trúc máy tính tiên tiến Bây giờ chúng ta đã có một sự thông hiểu tốt về đoạn mã lập trình C, chúng ta sẽ tiến hành phân tích một khối lượng của khả năng thực hiện lệnh song song trong mỗi đoạn mã Phần này trong nghiên cứu sẽ tập trung vào khối lượng sẵn có của khả năng thực hiện lệnh song song để thực hiện lập lịch phần cứng dưới sự kiểm soát của một kịch bản thuận lợi nhất (sau đó, chúng ta sẽ quan tâm ít hơn đến ý tưởng kịch bản cho thực hiện lập lịch phần cứng như là khối lượng song song tới một bộ lập lịch biên dịch). Cho ý tưởng kịch bản, giả sử rằng bảng băm thì ban đầu hoàn toàn trống. Giả sử chúng có 1024 phần tử dữ liệu mới, thiếp lập một số lượng giá trị từ để chúng hoàn toàn tự chủ bucket (việc suy giảm này là một vấn đề trong việc cập nhật lại vị trí mảng đã biết). Hình 3.13 chỉ rằng nội dung bảng băm sau khi 3 phần tử đầu tiên được chèn, điều này như trường hợp lý tưởng. Giá trị của phần tử thứ i thì đơn giản i trong trường hợp lý tưởng này, mỗi phần tử được tự nó chèn vào bucket của nó. Trong những mục đích của việc nghiên cứu, giả định rằng mỗi dòng của đoạn mã trong hình 3.12 kiểm soát một chu kỳ (nó dựa vào độ cao 1) và cho mục đích của tính toán ILP lấy 1 lệnh. Điều này giả sử là không thực, để đơn giản hóa chúng ta giải quyết các vấn đề bằng các bài tập sau. Chú ý rằng câu lệnh for và while chạy trong mỗi phần lặp của vòng lặp để kiểm tra lại nếu tiếp tục vòng lặp. Trong trường hợp lý tưởng, sự phụ thuộc trong chuỗi mã hóa được giảm nhẹ và một mức cao ILP thì luôn sẵn sàng. Chúng ta sẽ kiểm tra trường hợp tổng quát sau, thực sự phụ thuộc vào các đoạn mã phân đoạn giảm số lượng cấu trúc song song sẵn có. Hơn nữa giả sử rằng đoạn mã chạy được trên một bộ vi xử lý lý tưởng với sự phát chiều rộng vô hạn, đổi tên không giới hạn, mọi sự thông suốt (omniscient) bộ nhớ truy cập vào có ý nghĩa, sự dự báo nhánh và sự thực hiện các lệnh được giới hạn bởi sự phụ thuộc vào dữ liệu. Xem xét đến nội dung sau: a. Mô tả dữ liệu (đúng, nghịch và xuất) và kiểm soát sự phụ thuộc trong điều hành của phân đoạn mã song song, được xem bởi thời gian thực thi lập lịch phần cứng. Chỉ dẫn này thực tế phụ thuộc (nghĩa là, lờ đi sự phụ thuộc giữa lưu trữ và tải những truy cập vào những địa chỉ khác nhau, ngay cả bộ biên dịch hay bộ xử lý cũng thực sự không quyết định điều này). Phác thảo phụ thuộc biểu đồ động cho 6 phần lặp liên tiếp của vòng lặp ngoài (cho chèn 6 phần tử), dưới điều kiện lý tưởng. Chú ý rằng trong biểu đồ động này, chúng ta phải nhận ra được sự phụ thuộc dữ liệu giữa trường hợp động của câu lệnh: mỗi lệnh tĩnh trong chương trình nguồn gây nhiều hơn trường hợp động do vòng lặp thi hành. Ẩn: định nghĩa trước đó có thể giúp bạn tìm thấy sự phụ thuộc liên quan đến mỗi câu lệnh:

142 Chương 3: Các hạn chế khi thực hiện lệnh song song Dữ liệu phụ thuộc đúng: kết quả của những câu lệnh trước đó có phụ thuộc mỗi câu lệnh ngay lập tức không? - Dữ liệu không phụ thuộc: câu lệnh nào theo sau mà đọc được các hướng dẫn? - Kiểm soát sự phụ thuộc: trong những quyết định trước, có phải bạn đã chạy một lệnh phụ thuộc riêng biệt (trong trường hợp nó sẽ được đạt đến)? b. Giả sử trường hợp lý tưởng được mô tả và việc sử dụng những đồ thị phụ thuộc động bạn vừa dựng lên, có bao nhiêu câu lệnh được chạy và bao nhiêu chu kỳ? c. Cấp độ trung bình của ILP trong suốt việc chạy vòng lặp for là gì? d. Làm cách nào mà một bộ biên dịch có thể tăng các mức song song sẵn có, cho là trình biên dịch đó được biết chỉ để giải quyết trong những trường hợp lý tưởng. Ẩn: ràng buộc chính để ngăn chặn việc thực thi nhiều phép lặp tại một thời điểm trong điều kiện lý tưởng. Làm cách nào vòng lặp được sắp xếp lại để giảm nhẹ những ràng buộc? e. Để dễ dàng, việc cho rằng chỉ có biến i, hash_index, ptrcurr và ptrupdate cần để đăng ký. Việc đổi tên nói chung, có bao nhiêu thanh ghi cần để có thể đạt được mức tối đa song song trong phần (b)? f. Giả sử rằng trong câu trả lời của bạn trong phần (a) có tất cả 7 lệnh trong mỗi phần lặp. Bây giờ, việc sắp xếp trạng thái lập lịch ổn định của các lệnh trong ví dụ và một tốc độ phát 3 lệnh mỗi chu kỳ, có bao nhiêu thời gian thi hành bị ảnh hưởng? g. Cuối cùng, việc tính toán kích thước cửa sổ lệnh tối thiểu cần phải đạt được mức độ tối đa trong song song Chúng ta biết mối quan tâm hiện giờ ít thuận lợi hơn kịch bản cho khả năng thực hiện lệnh song song trong mã bảng băm hình 3.12 (trường hợp tổng quát). Giả sử rằng không có sự đảm bảo mỗi bucket sẽ nhận chính xác một mục. Các vòng lặp ngoài, trái lại, hoàn toàn song song. Khi 2 phần tử của các vòng lặp ngoài được băm thành các bucket khác nhau, nó có thể đi vào song song. Ngay cả khi chúng được băm trong cùng một bucket, chúng cũng vẫn còn song song cả về loại bộ nhớ và việc lưu trữ mỗi phần tử. Chú ý rằng trong thực tế, các giá trị phần tử dữ liệu sẽ hoàn toàn ngẫu nhiên. Mặc dù chúng cung cấp cho người đọc một cái nhìn tổng quát thực tế hơn về việc thi hành các kịch bản định sẵn. a. Phác thảo một đồ thị động cho bảng băm trong hình 3.12 khi giá trị của 1024 phần tử dữ liệu được chèn là 0, 1, 1024, 1025, 2048, 2049, 3072, 3073 mô tả những vòng lặp mới này trong vòng lặp for khi vòng lặp while lặp lại một hoặc nhiều lần. Tập trung chú ý đặc biệt đến trường hợp các vòng lặp while ở trong có

143 144 Kiến trúc máy tính tiên tiến thể lặp lại một hoặc nhiều lần. Số lượng các câu lệnh trong vòng lặp for bên ngoài sẽ tương ứng với các giá trị khác nhau mà nó lặp. Để định rõ được sự phụ thuộc giữa tải và lưu trữ, một bộ nhớ động có thể không giải quyết được sự phụ thuộc giữa hai bộ nhớ mà việc truy cập dựa trên sự khác nhau cơ bản của các thanh ghi con trỏ. Ví dụ, thời gian chạy phần cứng không thể chỉ căn cứ vào sự lưu trữ dựa trên ptrupdate và tải dựa trên ptrcurr. b. Giả định dựa vào biểu đồ phụ thuộc động được duyệt trong phần (a), câu hỏi được đặt ra là bao nhiêu lệnh sẽ được thực thi? c. Giả định dựa vào biểu đồ phụ thuộc động được duyệt trong phần (a) và một khối lượng các nguồn phần cứng không giới hạn, bao nhiêu chu kỳ sẽ chạy tất cả những câu lệnh được tính đến ở phần (b)? d. Có bao nhiêu khả năng thực hiện lệnh song song có hiệu lực với biểu đồ phụ thuộc động được duyệt trong phần (a)? e. Sử dụng cùng một số lượng trong bộ nhớ thời gian thực thi cơ chế như ở phần (a), nhận dạng một chuỗi các phần tử dữ liệu sẽ gây ra một kịch bản xấu nhất ảnh hưởng đến nhiều cấp độ có hiệu lực giống nhau. f. Giả định rằng những trường hợp xấu nhất đã được sử dụng ở phần (e), giải thích hiệu quả của bộ nhớ thời gian một cách hoàn hảo định hướng (nghĩa là, một hệ thống nổi bật lưu trữ và cho phép tất cả những phần không xung đột có thể tiến hành). Xuất phát từ một số các chu kỳ đòi hỏi việc thực thi tất cả các lệnh trong một biểu đồ động. g. Tiếp tục một số giả thuyết trong phần (f) và tính toán việc thực thi một số lệnh. h. Tiếp tục một số giả thuyết trong phần (f) và tính toán các khả năng thực hiện lệnh song song có sẵn cho thời gian chạy phần cứng. i. Trong phần (h), điều gì có ảnh hưởng đến các lệnh giới hạn của khả năng thực hiện lệnh song song? j. Tiếp tục khảo sát giải pháp của bạn ở phần (h), mô tả nguyên do của việc bỏ lỡ dự đoán nhánh và hiệu quả của mỗi dự đoán nhánh trong khả năng thực hiện lệnh song song sẵn có. Cái giá tiềm năng và lợi ích của việc thi hành nhiều lệnh suy đoán (nghĩa là, bắt đầu việc thi hành nhiều lệnh mà sau đó bị ép bởi phát hiện dự báo nhầm nhánh)? Gợi ý: nghĩ về hiệu quả của việc thi hành theo sau việc chèn một số dự báo nhầm số phần tử trước khi chèn. k. Có liên quan đến việc chấp nhận biểu đồ phụ thuộc tĩnh để giữ được tất cả những trường hợp xấu nhất cho mục đích hạn chế trình biên dịch ràng buộc và tối ưu hóa. Vẽ đồ thị phụ thuộc tĩnh cho đoạn mã bảng băm được chỉ dẫn trong hình 3.12.

144 Chương 3: Các hạn chế khi thực hiện lệnh song song 145 So sánh biểu đồ phụ thuộc tĩnh với các biểu đồ phụ thuộc động khác trước kia. Phản ánh trong 1 hoặc 2 đoạn này, so sánh với phát hiện về động và tĩnh trong khả năng thực hiện lệnh song song trong ví dụ về đoạn mã bảng băm. Đặc biệt là làm thế nào thì bộ biên dịch bị ràng buộc Kết luận Chất lượng tương đối của các phần mềm và phần cứng chuyên sâu đang triển khai ILP tiếp tục được tranh luận, mặc dù cuộc tranh luận đã được đưa ra cách đây 5 năm. Ban đầu, các phần mềm và phần cứng chuyên sâu này hoàn toàn khác nhau và khả năng quản lý độ phức tạp của các phần mềm chuyên sâu này vẫn còn bị nghi ngờ. Sự phát triển của một vài bộ vi xử lý dự báo động hiệu suất cao đã làm tăng tốc độ xung đồng hồ, làm giảm bớt mối quan tâm này. Độ phức tạp của kiến trúc IA-64 và thiết kế Itanium đã gây lưu tâm cho nhiều thiết kế những phần mềm chuyên sâu tiếp cận với bộ xử lý làm chúng nhanh hơn (đặc biệt trong bộ mã số nguyên), nhỏ hơn (trong bộ đếm bán dẫn hay điểm chết), đơn giản hơn, hay nhiều sức mạnh hiệu quả hơn. Nó hoàn toàn rõ ràng 5 năm trước rằng kiến trúc IA-64 không đại diện cho sự đánh dấu một bước đột phá trong ILP hay trong việc tránh những vấn đề phức tạp và mức tiêu thụ nguồn trong những bộ xử lý hiệu suất cao. Giới hạn của việc giảm bớt sự quay trở lại của những vấn đề rộng hơn này có thể chỉ mang ý nghĩa hạn chế sử dụng đồng thời đa luồng. Nó đơn giản chỉ là xây dựng một bộ vi xử lý phát rộng hơn có thể canh đều những công cụ bổ sung linh hoạt của SMT. Vì lý do này, những thiết kế chỉ sử dụng những gì khiêm tốn nhất, hai nội dung của phiên bản SMT hay đa luồng đơn với hai ngữ cảnh, nó đánh giá cao sự lựa chọn đơn giản 1 hoặc 2 bộ xử lý. Thay vì đuổi theo nhiều ILP hơn, các kiến trúc máy tính tăng sự tập trung vào TLP với một con chip đơn đa xử lý, sẽ được khám phá ở chương tiếp theo. Trong năm 2000, IBM loan báo con chip đơn thương mại đầu tiên, mục đích tổng quát cho bộ đa xử lý, Power 4, chứa đựng bộ xử lý Power 3 và sự tích hợp cache 2 mức. Kể từ lúc đó, Sun Microsystems, AMD và Intel đã chuyển mạch tập trung trong một con chip đơn trong bộ vi đa xử lý thì linh hoạt hơn bộ đơn xử lý. Câu hỏi chính xác về sự cân bằng của ILP và TLP vẫn còn bỏ ngỏ năm 2005 và các nhà thiết kế khám phá ra hoàn toàn đầy đủ các lựa chọn, từ các đường ống với nhiều bộ xử lý hơn mỗi chip, đến những ILP và SMT linh hoạt tuy ít hơn về bộ xử lý. Nó hoàn toàn tốt nếu có sự lựa chọn đúng trong thị trường máy chủ, có thể gây nên sự bùng nổ nhiều hơn về TLP, nó khác so với desktop.

145 Chương 4 CAÙC KIEÁN TRUÙC ÑA XÖÛ LYÙ 4.1. Giới thiệu về đa xử lý đa nhân Như là một lời trích dẫn mở ra lời diễn thuyết cho chương này, quan điểm cho rằng tiến bộ trong kiến trúc bộ đơn xử lý đang gần kết thúc được tổ chức bởi một số nhà nghiên cứu trong nhiều năm. Rõ ràng những quan điểm hơi vội vàng, trong thực tế, trong khoảng thời gian , hiệu suất của bộ đơn xử lý tăng trưởng, được điều khiển bởi bộ vi xử lý này, ở mức cao nhất kể từ các máy tính bán dẫn đầu tiên tốc độ rất cao trong cuối thập niên 1950 và đầu năm Tuy nhiên, tầm quan trọng của bộ đa xử lý được phát triển trong suốt năm 1990 như là nhà thiết kế đã tìm kiếm một cách để xây dựng các máy chủ và siêu máy tính (supercomputer) đạt được hiệu suất cao hơn so với bộ vi xử lý duy nhất, trong khi khai thác chi phí - hiệu quả to lớn lợi thế của bộ vi xử lý. Như chúng ta thảo luận trong chương 1 và 3, suy thoái ở bộ đơn xử lý hiệu suất phát sinh từ lợi nhuận giảm dần khai thác ILP, kết hợp với phát triển dính líu tới bộ nguồn, dẫn đến một kỷ nguyên mới trong thời kỳ kiến trúc máy tính-thời kỳ bộ đa xử lý đóng một vai trò quan trọng. Xu hướng này đối với sự phụ thuộc trong bộ đa xử lý được củng cố bằng nhiều yếu tố: - Tăng trưởng sự quan tâm về máy chủ và năng suất máy chủ. - Tăng trưởng trong ứng dụng cần nhiều dữ liệu. - Sự thấu hiểu rằng hiệu suất tăng trên máy tính để bàn là ít quan trọng (bên cạnh đồ họa). - Một sự hiểu biết cải tiến về cách sử dụng bộ đa xử lý có hiệu quả, đặc biệt trong môi trường máy chủ, nơi có ý nghĩa tự nhiên về khả năng thực hiện luồng song song. - Tận dụng lợi thế của một đầu tư thiết kế bởi nhân rộng hơn thiết kế độc đáo, tất cả các mẫu thiết kế đa xử lý cung cấp đòn bẩy như vậy. Điều đó nói rằng, chúng ta đang đi trái với hai vấn đề. Trước tiên, kiến trúc đa xử lý là một lĩnh vực rộng lớn và đa dạng và nhiều lĩnh vực trong thời ban đầu của nó, với những ý tưởng sắp tới và cho đến rất gần đây, kiến trúc thất bại nhiều hơn là

146 Chương 4: Các kiến trúc đa xử lý 147 thành công. Toàn vùng phủ sóng của không gian thiết kế đa xử lý và sự cân bằng sẽ yêu cầu khối lượng khác. Thứ hai, phạm vi rộng lớn cần thiết để kéo theo những phương pháp thảo luận mà có thể không cần kiểm tra về một cái gì đó đôi khi chúng ta phần lớn đã tránh đến điểm này. Đối với những lý do này, chúng ta đã lựa chọn để tập trung vào dòng chính của thiết kế bộ đa xử lý: các bộ đa xử lý với số lượng vừa và nhỏ của bộ vi xử lý (4 đến 32). Chúng ta sẽ trả tiền chỉ một chút để chú ý đến không gian thiết kế bộ đa xử lý cỡ lớn (larger-scale) (32 hoặc nhiều bộ vi xử lý) Phân loại các kiến trúc song song Chúng ta bắt đầu chương này với một phân loại để bạn có thể đánh giá cao cả về bề rộng của thiết kế lựa chọn thay thế cho bộ đa xử lý và bối cảnh đã dẫn đến sự phát triển của hình thức chi phối của bộ đa xử lý. Chúng ta mô tả vắn tắt các lựa chọn thay thế và lý do đằng sau chúng. Ý tưởng sử dụng bộ đa xử lý để tăng hiệu suất và nâng cao tính sẵn có ngày trở lại sớm nhất các máy tính điện tử. Thông tin về 40 năm trước, Flynn [1966] đề xuất một mô hình đơn giản của tất cả các loại máy tính mà vẫn còn hữu dụng ngày hôm nay. Nhìn các xử lý song song trong các luồng lệnh và dữ liệu được gọi bởi các lệnh ở phần hạn chế nhất của bộ đa xử lý và đặt tất cả các máy tính thành một trong bốn loại: 1. Dòng lệnh đơn, dòng dữ liệu đơn lẻ SISD (Single instruction stream, single data stream) - Thể loại này là bộ đơn xử lý. 2. Dòng lệnh đơn, đa dòng dữ liệu SIMD (Single instruction stream, multiple data streams) - Các lệnh giống nhau được thực hiện bởi nhiều bộ xử lý bằng cách sử dụng các dòng dữ liệu khác nhau. SIMD khai thác máy tính cấp dữ liệu song song bằng cách áp dụng cùng một hoạt động để có nhiều mục dữ liệu song song. Mỗi bộ vi xử lý có bộ nhớ dữ liệu riêng của nó (vì thế nhiều dữ liệu), nhưng có một bộ nhớ lệnh duy nhất và kiểm soát xử lý, mà chu kỳ lấy lệnh và chu kỳ phát lệnh. Đối với các ứng dụng hiển thị có ý nghĩa khả năng thực hiện dữ liệu song song, cách tiếp cận SIMD có thể rất hiệu quả. Phương pháp tiếp cận SIMD đã có kinh nghiệm cho một sự tái sinh trong vài năm qua với tầm quan trọng ngày càng tăng của chất lượng đồ họa, đặc biệt là đối với thị trường game. Phương pháp tiếp cận SIMD là những phương pháp ưu đãi để đạt được hiệu suất cao cần thiết để tạo ra không gian ba chiều, thời gian thực các môi trường ảo. 3. Đa dòng lệnh, đơn luồng dữ liệu MISD (Multiple instruction stream, single data stream) - Không bộ đa xử lý thương mại nào của loại này được xây dựng cho đến nay.

147 148 Kiến trúc máy tính tiên tiến 4. Đa dòng lệnh, đa luồng dữ liệu MIMD (Multiple instruction stream, multiple data stream) - Cứ mỗi bộ xử lý lấy lệnh riêng của mình và hoạt động trên dữ liệu riêng của nó. MIMD - máy tính khai thác khả năng thực hiện luồng song song khi đa luồng hoạt động song song. Nói chung, khả năng thực hiện luồng song song có nhiều linh động hơn cấp dữ liệu song song và do đó được áp dụng phổ biến. Đây là một mô hình thô, như một số bộ đa xử lý được lai của các loại này. Tuy nhiên, nó rất hữu ích để đặt một mô hình về không gian thiết kế. Mô hình MIMD có thể khai thác khả năng thực hiện luồng song song, nó là kiến trúc của sự lựa chọn cho mục đích chung của bộ đa xử lý. Hai yếu tố khác cũng góp phần vào sự trỗi dậy của bộ đa xử lý MIMD: 1. MIMD cung cấp linh động. Với các phần cứng chính xác và hỗ trợ phần mềm, MIMD có chức năng như bộ đa xử lý đơn người dùng tập trung cao vào việc thực hành cho một ứng dụng, như bộ đa xử lý thực hiện đa chương trình chạy nhiều nhiệm vụ cùng một lúc, hoặc như sự kết hợp cùng nhau của các chức năng này. 2. MIMD có thể xây dựng trên những lợi thế về chi phí thực hiện bộ xử lý có sẵn. Trong thực tế, gần như tất cả bộ đa xử lý được xây dựng ngày nay đều sử dụng cùng một bộ vi xử lý đã tìm thấy tại các máy trạm và các đơn vị xử lý máy chủ. Hơn nữa, đòn bẩy vi mạch nhiều lõi đầu tư thiết kế trong một lõi xử lý duy nhất của việc sao chép sang nó. Một lớp phổ biến của các máy tính MIMD là cluster, thường sử dụng những thành phần tiêu chuẩn và thường là công nghệ mạng tiêu chuẩn, cũng như thúc đẩy càng nhiều các mặt hàng công nghệ càng tốt. Chúng ta phân biệt hai loại nhóm (cluster) khác nhau: nhóm hàng hóa (commodity cluster), phụ thuộc hoàn toàn vào bộ vi xử lý thứ ba và công nghệ kết nối và nhóm tùy biến (custom cluster), trong đó một nhà thiết kế hoặc thiết kế thi công nút chi tiết hoặc kết nối các mạng, hoặc cả hai. Trong một nhóm hàng hóa, các nút trong một nhóm thường là blade hoặc được lắp trên giá gắn kết các máy chủ (bao gồm cả các máy chủ đa xử lý cỡ nhỏ). Ứng dụng tập trung vào thông qua và yêu cầu hầu như không có thông tin liên lạc giữa các luồng, chẳng hạn là phục vụ Web, đa lập trình và một số ứng dụng xử lý giao dịch, có thể được cung cấp giá rẻ trên một nhóm (cluster). Nhóm hàng hóa là loại thường được lắp ráp bởi người dùng hoặc giám đốc trung tâm máy tính, hơn là bởi các nhà cung cấp. Nhóm tùy biến thường tập trung vào các ứng dụng song song, có thể khai thác số lượng lớn song song về một vấn đề duy nhất. Như các ứng dụng đòi hỏi một

148 Chương 4: Các kiến trúc đa xử lý 149 lượng đáng kể các thông tin liên lạc trong thời gian tính toán, nút tùy biến và kết nối thiết kế làm cho thông tin liên lạc hiệu quả hơn trong một nhóm hàng hóa. Hiện nay, bộ đa xử lý lớn nhất và nhanh nhất tồn tại là nhóm tùy biến, chẳng hạn như IBM Blue Gene. Bắt đầu từ những năm 1990, năng lực ngày càng tăng của một chip duy nhất cho phép người thiết kế đặt nhiều bộ xử lý trên một khuôn duy nhất. Cách tiếp cận này, ban đầu gọi là chip đa xử lý hoặc được gọi là đa lõi, phát sinh từ việc sử dụng nhiều nhân (lõi) xử lý trên một khuôn duy nhất. Trong một thiết kế, các đa lõi thường chia sẻ một số tài nguyên, như là một cấp thứ hai hoặc thứ ba bộ nhớ cache hay bộ nhớ và các đường xuất-nhập. Bộ xử lý gần đây, bao gồm của IBM Power5, Sun T1 và Intel Pentium D và Xeon MP-, là đa lõi và đa luồng. Với một MIMD, mỗi bộ xử lý được thực hiện dòng lệnh riêng của mình. Trong nhiều trường hợp, xử lý từng thực hiện một quá trình khác nhau. Một quá trình là một phân đoạn các mã có thể sẽ được chạy độc lập, điều kiện của quá trình có tất cả các thông tin cần thiết để thực thi chương trình đó trên một bộ xử lý. Trong một môi trường đa lập trình, nơi mà các bộ vi xử lý có thể được chạy nhiệm vụ độc lập, mỗi quá trình thường độc lập với các quá trình khác. Nó cũng hữu ích để có thể có nhiều bộ xử lý thực hiện một chương trình đơn, chia sẻ mã và hầu hết không gian địa chỉ của nó. Khi nhiều phương pháp chia sẻ mã và dữ liệu theo cách này, nó thường được gọi là luồng. Ngày nay, thuật ngữ luồng thường được sử dụng trong một cách ngẫu nhiên để tham khảo nhiều địa điểm của sự thi hành mà có thể chạy trên bộ vi xử lý khác nhau, ngay cả khi chúng không chia sẻ một không gian địa chỉ. Ví dụ, một kiến trúc đa luồng thực sự cho phép đồng thời thực hiện nhiều quy trình, với các không gian địa chỉ có khả năng riêng biệt, cũng như nhiều luồng mà chia sẻ cùng một không gian địa chỉ. Để tận dụng lợi thế của một đa xử lý MIMD với n bộ vi xử lý, chúng ta phải thường có ít nhất n luồng hoặc các quy trình để thực thi. Các luồng độc lập trong vòng một quá trình đơn thường được xác định bởi người lập trình hay được tạo ra bởi bộ biên dịch. Các luồng có thể đến từ các bộ tích hợp cỡ lớn, quy trình độc lập theo lịch trình và chế tác bởi hệ điều hành. Ở mặt khác, một luồng có thể bao gồm vài chục lần lặp của chu kỳ, tạo ra bởi một bộ biên dịch song song, khai thác dữ liệu song song trong vòng lặp. Mặc dù số lượng của phép tính gán cho một luồng, được gọi là kích thước hạt (grain size), là rất quan trọng trong việc xem xét như thế nào khai thác khả năng thực hiện luồng song song hiệu quả, chất lượng khác biệt quan trọng từ khả năng thực hiện lệnh song song là khả năng thực hiện luồng song song được xác định tại một hệ cao cấp bởi hệ thống phần mềm và các luồng bao gồm hàng trăm đến triệu lệnh có thể được thực hiện song song.

149 150 Kiến trúc máy tính tiên tiến Luồng cũng có thể được sử dụng để khai thác khả năng thực hiện dữ liệu song song, mặc dù tiêu đề (over-head) có thể sẽ cao hơn sẽ được nhìn thấy trong một máy tính SIMD. Tiêu đề này có nghĩa là kích thước hạt phải được đủ lớn để khai thác song song hiệu quả. Ví dụ, mặc dù một bộ xử lý vectơ có thể được vận hành song song hiệu quả trong những vectơ ngắn, kết quả các kích thước hạt khi song song được phân chia giữa các luồng có thể quá nhỏ mà tiêu đề lớn làm cho việc khai thác song song tốn kém. Các bộ đa xử lý MIMD hiện tại thuộc hai lớp, tùy thuộc vào số lượng của bộ vi xử lý có liên quan. Chúng ta tham khảo các bộ đa xử lý bởi tổ chức bộ nhớ cache của họ vì những gì tạo một số lượng nhỏ hay lớn của bộ xử lý có khả năng thay đổi theo thời gian. Nhóm đầu tiên, cái mà chúng ta gọi là kiến trúc chia sẻ bộ nhớ tập trung như có nhiều nhất là một chip vi xử lý (và ít hơn 100 lõi) trong năm Đối với bộ đa xử lý với số lần xử lý nhỏ, có thể cho các bộ vi xử lý để chia sẻ bộ nhớ tập trung đơn. Với cache lớn, một bộ nhớ duy nhất, có thể với nhiều băng (bank), có thể đáp ứng nhu cầu bộ nhớ của một số ít bộ vi xử lý. Bằng cách sử dụng nhiều kết nối điểm-điểm (point-to-point), hay một chuyển mạch và bổ sung thêm các băng bộ nhớ, một sự thiết kế chia sẻ bộ nhớ tập trung có thể mở rộng đến vài chục bộ xử lý. Bộ vi xử lý Bộ vi xử lý Bộ vi xử lý Bộ vi xử lý một hoặc nhiều mức của bộ nhớ truy cập nhanh (cache) một hoặc nhiều mức của bộ nhớ truy cập nhanh (cache) một hoặc nhiều mức của bộ nhớ truy cập nhanh (cache) một hoặc nhiều mức của bộ nhớ truy cập nhanh (cache) Bộ nhớ chính Hệ thống nhập xuất Hình 4.1: Cấu trúc cơ bản của một đa xử lý chia sẻ bộ nhớ tập trung. Hệ thống phụ đa xử lý cache chia sẻ cùng bộ nhớ vật lý, thông thường nối với nhau bằng một hoặc nhiều đường hay một chuyển mạch. Các đặc tính kiến trúc chính là thời gian truy cập thống nhất cho tất cả các bộ nhớ từ tất cả các bộ vi xử lý.

150 Chương 4: Các kiến trúc đa xử lý 151 Bởi vì có một bộ nhớ chính duy nhất có một mối quan hệ đối xứng để tất cả các bộ xử lý và truy cập một thời gian thống nhất từ bộ xử lý bất kỳ. Các bộ đa xử lý thường được gọi là bộ đa xử lý đối xứng SMP (chia sẻ bộ nhớ) (Symmetric Multiprocessor) và dạng của kiến trúc này đôi khi được gọi là truy cập bộ nhớ thống nhất UMA (Uniform Memory Access), phát sinh từ thực tế là tất cả các bộ vi xử lý có một độ trễ thống nhất từ bộ nhớ, ngay cả khi bộ nhớ được tổ chức thành nhiều băng. Hình 4.1 cho thấy các bộ đa xử lý trông như thế nào. Kiểu kiến trúc bộ nhớ chia sẻ-đối xứng là ổn định bởi cách biệt các tổ chức phổ biến nhất. Bộ vi xử lý + bộ nhớ đệm (cache) Bộ vi xử lý + bộ nhớ đệm (cache) Bộ vi xử lý + bộ nhớ đệm (cache) Bộ vi xử lý + bộ nhớ đệm (cache) Bộ nhớ Nhập / xuất Bộ nhớ Nhập / xuất Bộ nhớ Nhập / xuất Bộ nhớ Nhập / xuất Liên Mạng Bộ nhớ Nhập / xuất Bộ nhớ Nhập / xuất Bộ nhớ Nhập / xuất Bộ nhớ Nhập / xuất Bộ vi xử lý + bộ nhớ đệm (cache) Bộ vi xử lý + bộ nhớ đệm (cache) Bộ vi xử lý + bộ nhớ đệm (cache) Bộ vi xử lý + bộ nhớ đệm (cache) Hình 4.2: Kiến trúc cơ bản của bộ đa xử lý phân phối - bộ nhớ bao gồm nút đơn chứa bộ xử lý, một số bộ nhớ, một số I/O và giao diện tới liên mạng kết nối tất cả nút. Nút đơn có thể chứa một vài bộ xử lý nhỏ, có thể là liên kết với nhau bằng bus nhỏ hoặc một công nghệ liên kết khác, là có khả năng kém hơn liên mạng toàn cầu. Nhóm thứ hai bao gồm bộ đa xử lý với phân phối bộ nhớ vật lý. Hình 4.2 trình bày các bộ đa xử lý. Để hỗ trợ số lần xử lý lớn hơn, bộ nhớ phải được phân phối giữa các bộ vi xử lý hơn là tập trung, mặt khác, hệ thống bộ nhớ nếu không sẽ không có khả năng hỗ trợ băng thông yêu cầu của một số lớn bộ xử lý mà không có độ trễ truy cập quá lâu. Với sự gia tăng nhanh chóng trong quá trình và gia tăng liên quan trong các yêu cầu băng thông bộ nhớ của bộ vi xử lý, kích thước của bộ đa xử lý đa mà phân phối bộ nhớ được ưa thích tiếp tục giảm. Số lượng lớn hơn của bộ xử lý cũng làm tăng nhu cầu cho một kết nối băng thông cao.

151 152 Kiến trúc máy tính tiên tiến Cả mạng trực tiếp (tức là, chuyển mạch) và mạng gián tiếp (tiêu biểu là mạng mắt lưới đa chiều) đã được sử dụng. Việc phân phối bộ nhớ giữa các nút có hai lợi ích lớn. Trước tiên, đó là một chi phí - hiệu quả để quy mô các băng thông bộ nhớ, nếu hầu hết các truy cập được đến bộ nhớ cục bộ trong nút này. Thứ hai, nó làm giảm độ trễ cho truy cập đến bộ nhớ cục bộ. Hai lợi thế làm cho bộ nhớ phân phối hấp dẫn tại số lần bộ vi xử lý nhỏ hơn như các bộ vi xử lý chưa khi nào nhanh hơn và đòi hỏi nhiều băng thông bộ nhớ và độ trễ thấp hơn. Điều bất lợi chính cho một kiến trúc bộ nhớ phân phối là dữ liệu giao tiếp giữa bộ xử lý trở nên phức tạp hơn và nó đòi hỏi phải nỗ lực nhiều hơn trong các phần mềm để được lợi thế của băng thông bộ nhớ tăng lên đã chịu tốn bằng nhiều bộ nhớ phân phối. Như chúng ta sẽ thấy ngay, việc sử dụng bộ nhớ phân phối cũng dẫn đến hai mô hình khác nhau cho liên lạc giữa các bộ vi xử lý Các kiến trúc chia sẻ bộ nhớ Như được thảo luận trước đó, bất kỳ bộ đa xử lý cỡ lớn phải sử dụng nhiều bộ nhớ có thể được phân phối vật lý cùng với các bộ vi xử lý. Có hai kiến trúc thay thế khác nhau trong cách tiếp cận phương pháp dùng để giao tiếp dữ liệu giữa các bộ vi xử lý. Trong phương pháp đầu tiên, giao tiếp xảy ra thông qua một không gian địa chỉ chia sẻ, như là nó làm việc trong một kiến trúc bộ nhớ chia sẻ-đối xứng. Việc tách các bộ nhớ bằng phương pháp vật lý có thể được giải quyết như là trong không gian địa chỉ chia sẻ luận lý, có nghĩa là một truy cập bộ nhớ có thể được thực hiện bởi bất kỳ bộ xử lý cho bất kỳ vị trí bộ nhớ, giả sử như là nó có quyền truy cập chính xác. Những bộ đa xử lý được gọi là kiến trúc phân phối chia sẻ bộ nhớ DSM (Distributed shared memory). Thuật ngữ bộ nhớ chia sẻ đề cập thực tế mà không gian địa chỉ được chia sẻ, đó là địa chỉ vật lý như nhau trên hai bộ vi xử lý đề cập đến cùng một vị trí trong bộ nhớ. Chia sẻ bộ nhớ không có nghĩa là có một bộ nhớ tập trung duy nhất. Ngược lại với bộ đa xử lý chia sẻ bộ nhớ đối xứng, cũng gọi là truy cập bộ nhớ hợp nhất UMA (Uniform memory access), các bộ đa xử lý DSM còn được gọi là truy cập bộ nhớ không hợp nhất NUMA (Nonuniform memory access), do thời gian truy cập phụ thuộc vào vị trí của một từ dữ liệu trong bộ nhớ. Ngoài ra, không gian địa chỉ có thể bao gồm nhiều không gian địa chỉ riêng được phân chia luận lý và không thể được giải quyết bởi một bộ vi xử lý từ xa. Trong bộ đa xử lý, địa chỉ vật lý như nhau trên hai bộ xử lý khác nhau đưa ra trên hai địa điểm khác nhau trong hai bộ nhớ khác nhau. Mỗi khối (module) bộ nhớ bộ vi xử lý là một máy tính riêng biệt. Ban đầu, máy vi tính như vậy đã được vây dựng với các xử lý các nút khác nhau và các kết nối liên mạng đặc biệt. Ngày nay, hầu hết các thiết kế của loại này thực sự là nhóm (cluster).

152 Chương 4: Các kiến trúc đa xử lý 153 Với mỗi một trong các tổ chức không gian địa chỉ, có một liên kết cơ chế truyền thông. Đối với một bộ đa xử lý với một không gian địa chỉ chia sẻ, mà không gian địa chỉ có thể được dùng để giao tiếp dữ liệu ngầm thông qua tải và lưu trữ hoạt động - vì thế mà có tên bộ nhớ chia sẻ cho bộ đa xử lý đó. Đối với một bộ đa xử lý với nhiều không gian địa chỉ, thông tin liên lạc của dữ liệu được thực hiện bằng một cách rõ ràng qua thông điệp giữa các bộ vi xử lý. Do đó, các bộ đa xử lý thường được gọi là bộ đa xử lý truyền thông điệp. Nhóm (Cluster) vốn đã sử dụng truyền thông điệp (message passing). Những thách thức của xử lý song song Việc áp dụng các bộ đa xử lý chạy các công việc độc lập với nhiệm vụ cơ bản không có giao tiếp để chạy các chương trình song song, nơi luồng phải giao tiếp để hoàn thành nhiệm vụ. Hai rào cản quan trọng, cả hai lý giải với Luật Amdahl, tạo ra sự thách thức xử lý song song. Mức độ mà các trở ngại này khó hoặc dễ dàng được xác định bởi cả hai ứng dụng và do kiến trúc. Một rào cản đầu tiên đã làm với các xử lý song song giới hạn có sẵn trong các chương trình và thứ hai phát sinh từ các chi phí tương đối cao của truyền thông. Sự hạn chế trong song song có sẵn làm cho nó khó khăn để đạt được tốc độ tốt trong bất kỳ bộ xử lý song song, như ví dụ dưới đây. Ví dụ: Giả sử bạn muốn đạt được một tăng tốc là 80 với 100 bộ xử lý. Phân số nào của việc tính toán ban đầu có thể được tuần tự? Trả lời: Luật Amdahl là Speedup= Fraction enhanced +(1-Fraction enhanced ) Speedupenhanced 1 Để đơn giản trong ví dụ này, giả định rằng chương trình hoạt động trong chỉ có hai chế độ: song song với tất cả các bộ vi xử lý sử dụng hết, đó là chế độ nâng cao, hoặc nối tiếp chỉ với một bộ xử lý sử dụng. Với đơn giản hóa này, tăng tốc trong hình thức tăng cường chỉ đơn giản là số lượng các bộ xử lý, trong khi phần nhỏ tăng cường chế độ là thời gian ở chế độ song song. Thay thế vào trước đó phương trình: 80= Fraction parallel +(1-Fraction parallel) 100 Đơn giản hóa phương trình này: 1

153 154 Kiến trúc máy tính tiên tiến 0,8 x Fraction parallel + 80 x (1 - Fraction parallel ) = ,2 x Fraction parallel = 1 Fraction parallel = ,2 Fraction parallel = 0,9975 Vì vậy, để đạt được một tăng tốc là 80 với 100 bộ xử lý, chỉ có 0,25% của bản gốc tính toán có thể được tính tuần tự. Tất nhiên, để đạt được tăng tốc tuyến tính (tăng tốc của n với n bộ vi xử lý), toàn bộ chương trình thường phải được song song với không nối tiếp. Trong thực tế, các chương trình không chỉ hoàn toàn hoạt động tại hình thức song song hoặc nối tiếp, nhưng thường sử dụng ít hơn so với bổ sung đầy đủ các bộ vi xử lý khi chạy trong chế độ song song. Thách thức lớn thứ hai trong tiến trình song song liên quan đến độ trễ lớn các truy cập từ xa trong một bộ xử lý song song. Trong hiện tại được chia sẻ bộ nhớ bộ đa xử lý, truyền dữ liệu giữa hai bộ vi xử lý có thể chi phí bất cứ nơi nào từ 50 chu kỳ đồng hồ (đối với đa lõi - multicores) đến hơn chu kỳ đồng hồ (đối với bộ đa xử lý cỡ lớn), tùy thuộc vào cơ chế giao tiếp, loại liên mạng và cỡ của các bộ đa xử lý. Hiệu quả của việc giao tiếp lâu dài rõ ràng là sự chậm trễ đáng kể. Chúng ta hãy xem xét một ví dụ đơn giản sau. Ví dụ: Giả sử chúng ta có một ứng dụng chạy trên một bộ đa xử lý 32-bộ vi xử lý, mà có 200 ns thời gian để xử lý tham chiếu đến một bộ nhớ từ xa. Đối với ứng dụng này, giả định rằng tất cả các điểm ngoại trừ những điểm liên quan đến thông tin gói trong hệ thống phân cấp bộ nhớ, đó là môi trường lạc quan. Xử lý được ngừng lại trên một yêu cầu từ xa và tốc độ xung đồng hồ của bộ xử lý là 2 GHz. Nếu chỉ số CPI cơ bản (giả định rằng tất cả các tham khảo trong bộ nhớ cache) là 0,5, làm thế nào nhanh hơn bộ đa xử lý nếu không có thông tin gói nếu so với 0,2% của các lệnh liên quan đến một tham chiếu truyền thông có sẵn từ xa? Trả lời: Thật đơn giản để tính toán đầu tiên chỉ số CPI. Chỉ số CPI đa hiệu quả với 0,2% là gói sẵn có từ xa. CPI = CPI cơ bản + Tốc độ yêu cầu từ xa x Chi phí yêu cầu từ xa = 0,5 + 2% x Chi phí yêu cầu từ xa Chi phí yêu cầu từ xa là: Chi phí truy cập từ xa Chu kỳ thời gian = 200 ns 0,5 ns = 400 chu kỳ Do đó, chúng ta có thể tính toán chỉ số CPI:

154 Chương 4: Các kiến trúc đa xử lý 155 CPI = 0,5 + 0,8 =1,3 Các bộ đa xử lý với tất cả các tham chiếu cục bộ là 1,3/0,5 = 2,6 lần nhanh hơn. Trong thực tiễn, phân tích hiệu suất phức tạp hơn nhiều, vì một số phần nhỏ của các truy cập không giao tiếp sẽ bỏ lỡ trong hệ thống phân cấp cục bộ và thời gian truy cập từ xa không có giá trị không đổi. Ví dụ, chi phí của một truy cập từ xa có thể khá tồi tệ hơn, khi cạnh tranh gây ra bởi nhiều truy cập cố gắng sử dụng kết nối toàn cầu có thể dẫn đến độ trễ tăng lên. Những vấn đề song song và độ trễ giao tiếp từ xa là hai thử thách lớn nhất trong việc sử dụng bộ đa xử lý. Vấn đề của ứng dụng song song thiếu sót phải được tấn công chủ yếu trong phần mềm với các thuật toán mới có thể có hiệu suất song song tốt hơn. Việc thu nhỏ tác động của độ trễ dài từ xa có thể bị tấn công bởi cả hai kiến trúc và các lập trình viên. Ví dụ, chúng ta có thể làm giảm tần số truy cập từ xa với cơ chế phần cứng, hoặc như bộ nhớ đếm chia sẻ dữ liệu, hoặc cơ chế phần mềm, như cơ cấu lại các dữ liệu để truy cập nhiều vùng. Chúng ta có thể chấp nhận được độ trễ bằng cách sử dụng đa luồng hoặc bằng cách sử dụng tìm nạp trước (prefetching). Phần lớn chương này tập trung vào các kỹ thuật để giảm thiểu tác động của độ trễ truyền tin từ xa. Ví dụ 4.2 và 4.3 thảo luận làm thế nào bộ nhớ đệm có thể được dùng để giảm tần số truy cập từ xa, trong khi duy trì sự theo dõi liên kết của bộ nhớ. Mục 4.5 thảo luận về đồng bộ hóa, vì nó vốn liên quan đến việc giao tiếp giữa các bộ vi xử lý và cũng có thể giới hạn song song, thì bị nghẽn cổ chai lớn. Mục 4.6 bao gồm kỹ thuật độ trễ và mô hình bộ nhớ thống nhất đối với chia sẻ bộ nhớ Các kiến trúc chia sẻ bộ nhớ đối xứng Để mở rộng sử dụng, về cơ bản bộ nhớ cache đa cấp độ có thể giảm bớt những yêu cầu băng thông bộ nhớ của bộ xử lý. Nếu những yêu cầu băng thông bộ nhớ chính của bộ xử lý đơn được giảm bớt, những bộ đa xử có khả năng chia sẻ chung bộ nhớ. Đầu năm 1980, với sự quan sát này, kết hợp với ưu thế nổi lên của bộ vi xử lý, thúc đẩy nhiều nhà thiết kế tạo ra những bộ đa xử lý, cỡ nhỏ mà một vài bộ xử lý đã chia sẻ bộ nhớ vật lý đơn được kết nối với nhau nhờ những đường bus chia sẻ. Nhờ kích thước nhỏ của những bộ đa xử lý và sự giảm bớt đáng kể những yêu cầu cho băng thông bus có được là nhờ bộ nhớ cache lớn, như vậy những bộ đa xử lý đối xứng thì tiết kiệm chi phí tối đa, đã cung cấp đủ số lượng băng thông bộ nhớ hiện có. Những thiết kế gần đây của bộ đa xử lý và hệ thống con của bộ nhớ cache trên một bảng mạch, được cắm theo những đường bus nằm trên bảng nối đa năng. Những phiên bản sau này của những thiết kế vào năm 1990 có thể đạt được mật độ cao hơn với hai đến bốn bộ xử lý trên một bảng mạch và thường dùng nhiều đường bus và bộ nhớ đan xen để hỗ trợ những bộ xử lý chạy nhanh hơn.

155 156 Kiến trúc máy tính tiên tiến IBM đã giới thiệu bộ vi mạch đa xử lý cho thị trường máy tính đa năng vào năm 2000, AMD và Intel đã theo sau với phiên bản 2 là lõi vi xử lý cho thị trường máy chủ vào năm 2005 và Sun đã giới thiệu T1, 8 lõi vi xử lý vào năm Mục 4.8 sẽ xem xét thiết kế và sự vận hành của T1. Hình 4.1 trình bày một biểu đồ đơn giản của một bộ đa xử lý. Gần đây hơn, những bộ vi xử lý vận hành cao hơn, những yêu cầu bộ nhớ lấy toàn bộ những đường bus hợp lý. Kết quả là, hầu hết những thiết kế gần đây sử dụng switch cỡ nhỏ hay là sử dụng mạng máy tính giới hạn điểm-điểm. Những bộ máy sử dụng bộ nhớ chia sẻ đối xứng luôn luôn hỗ trợ lưu trữ cả dữ liệu chia sẻ và dữ liệu cá nhân. Dữ liệu cá nhân được dùng bởi bộ xử lý đơn, trong khi dữ liệu chia sẻ được dùng bởi những bộ đa xử lý, về bản chất là cung cấp sự trao đổi giữa những bộ xử lý thông qua sự đọc và ghi dữ liệu chia sẻ. Khi một dữ liệu cá nhân được lưu trữ, nơi lưu trữ của nó được di chuyển vào bộ nhớ cache, làm giảm bớt thời gian truy cập trung bình cũng như yêu cầu về băng thông bộ nhớ. Khi không có bộ xử lý khác sử dụng dữ liệu, chương trình xử lý sẽ đồng nhất trong bộ xử lý đơn. Khi dữ liệu chia sẻ được lưu trữ, những phần được chia sẻ có thể được sao chép lại trong nhiều bộ nhớ cache. Ngoài sự giảm thời gian truy cập và yêu cầu về băng thông bộ nhớ, quá trình sao chép lại này cũng cung cấp sự giảm bớt những tranh chấp có thể tồn tại trên những phần dữ liệu được chia sẻ mà nó được đọc bởi những bộ xử lý một cách đồng thời. Sự lưu trữ của bộ nhớ chia sẻ, đưa ra một vấn đề mới: cache coherence Đa xử lý cache coherence là gì? Thật đáng tiếc, việc lưu trữ dữ liệu chia sẻ đưa ra một một vấn đề mới bởi vì xét thấy bộ nhớ được nắm giữ bởi hai bộ xử lý khác nhau thông qua những bộ nhớ cache riêng biệt của chúng, cái mà, không hề có bất kỳ sự đề phòng thêm nào, có thể sẽ nhìn thấy hai giá trị khác nhau. Bảng 4.1 minh họa vấn đề và trình bày cách hai bộ xử lý khác nhau có thể có hai giá trị khác nhau cho cùng một vị trí. Sự khó khăn này đề cập chung đến vấn đề cache coherence. Lần thứ Sự kiện Nội dung cache cho CPU A Nội dung cache cho CPU B Nội dung của bộ nhớ vị trí X CPU A đọc X CPU B đọc X CPU A lưu trữ 0 thành X Bảng 4.1: Vấn đề cache coherence cho một vị trí bộ nhớ đơn (X), được đọc và ghi bởi hai bộ xử lý (A và B).

156 Chương 4: Các kiến trúc đa xử lý 157 Ban đầu, chúng ta giả sử rằng không có bộ nhớ cache nào chứa biến và X mang giá trị 1. Chúng ta cũng giả sử ghi lên bộ nhớ cache, việc ghi lên lại bộ nhớ cache sẽ thêm một vài giá trị bổ sung phức tạp. Sau khi giá trị X được ghi lên bởi A, bộ nhớ cache của A và cả bộ nhớ đều chứa một giá trị mới, nhưng bộ nhớ cache của B thì không và nếu B đọc giá trị của X, nó sẽ nhận được giá trị 1. Thực ra, chúng ta có thể nói rằng một hệ thống thông tin bộ nhớ là tương quan (coherent) nếu bất kỳ việc đọc mục dữ liệu nào trả về việc ghi giá trị của mục dữ liệu đó gần đây nhất. Với định nghĩa này, mặc dù trực quan hấp dẫn, là mơ hồ và đơn giản, nhưng 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 cách xử lý của hệ thống bộ nhớ, cả hai đều quyết định để ghi chính xác lên chương trình bộ nhớ chia sẻ. Khía cạnh đầu tiên, được gọi là sự tương quan, xác định những giá trị nào có thể được trả lại bởi việc đọc. Khía cạnh thứ hai, được gọi là sự nhất quán (consistency), xác định khi một giá trị được ghi sẽ được trả lại bởi việc đọc. Chúng ta xem xét sự tương quan trước. Một hệ thống bộ nhớ là tương quan nếu: 1. Việc đọc bởi một bộ xử lý P đối với một vị trí X dẫn theo việc ghi lại X bởi bộ xử lý P, không có việc ghi X bởi một bộ xử lý khác xảy ra giữa việc ghi và đọc bởi bộ xử lý P, luôn luôn trả về giá trị được ghi bởi P. 2. Việc đọc bởi một bộ xử lý đối với vị trí X dẫn theo việc ghi bởi một bộ xử lý khác đối với X trả về giá trị được ghi nếu việc đọc và ghi được tách rời đúng lúc và không có việc ghi nào khác đối với X xảy ra giữa hai truy cập. 3. Việc ghi đối với cùng một vị trí được ghi tuần tự có nghĩa là hai lần ghi đối với cùng một vị trí bởi bất kỳ hai bộ xử lý nào được xem như cùng một thứ tự của tất cả các bộ xử lý. Ví dụ, nếu các giá trị 1 và sau đó 2 được ghi đối với một vị trí, những bộ xử lý không bao giờ đọc giá trị 2 và sau đó là 1. Thuộc tính đầu tiên chỉ đơn giản bảo vệ thứ tự chương trình chúng ta hy vọng thuộc tính này đúng ngay cả trong những bộ xử lý đơn. Thuộc tính thứ hai xác định khái niệm về những gì để có một cái nhìn nhất quán của bộ nhớ: Nếu một bộ xử lý có thể đọc liên tục một giá trị dữ liệu cũ, chúng ta có thể nói rõ ràng rằng bộ nhớ đó không nhất quán. Sự cần thiết cho việc ghi tuần tự là tinh tế hơn, nhưng tương đối quan trọng. Giả sử chúng ta không ghi tuần tự và bộ xử lý P1 ghi vị trí X theo sau là bộ xử lý P2 ghi vị trí X. Việc ghi tuần tự chắc chắn rằng mọi bộ xử lý sẽ thấy việc ghi xong bởi bộ xử lý P2 ở một vài thời điểm. Nếu chúng ta không ghi liên tục, nó có thể là trường hợp mà một vài bộ xử lý có thể thấy việc ghi của P2 trước và sau đó thấy việc ghi của P1, duy trì giá trị được ghi bởi P1 không thời hạn. Cách đơn giản nhất để tránh được những khó khăn này là làm chắc chắn rằng tất cả việc ghi đối với cùng một vị trí được xem như cùng một thứ tự, thuộc tính này được gọi là việc ghi tuần tự.

157 158 Kiến trúc máy tính tiên tiến Mặc dù ba tính chất vừa được mô tả đủ để đảm bảo tính tương quan, câu hỏi đặt ra là khi nào một giá trị được ghi sẽ được nhìn thấy cũng rất quan trọng. Để biết tại sao, quan sát rằng chúng ta không thể yêu cầu việc đọc X ngay lập tức nhìn thấy giá trị được ghi của X bởi một bộ xử lý khác. Ví dụ, việc ghi X trên một bộ xử lý đi trước việc đọc X trên một bộ xử lý khác với một thời gian rất ít, nó không thể đảm bảo rằng việc đọc sẽ trả về giá trị của dữ liệu đã được ghi, khi mà dữ liệu được ghi thậm chí không thể rời bỏ bộ xử lý vào thời điểm đó. Vấn đề chính xác là khi một giá trị được ghi phải được thấy bởi việc đọc được xác định bởi mô hình bộ nhớ nhất quán chủ đề này được thảo luận ở mục 4.6. Sự tương quan và sự nhất quán được bổ sung: Sự tương quan xác định cách xử lý của việc đọc và ghi đối với cùng một vị trí bộ nhớ, trong khi sự nhất quán xác định cách xử lý của việc đọc và ghi với những truy cập vào các vị trí bộ nhớ khác. Bây giờ, đặt ra hai giả thiết sau. Đầu tiên, việc ghi không hoàn thành (và cho phép việc ghi tiếp theo được xảy ra) cho đến khi tất cả các bộ xử lý thấy tác động của việc ghi đó. Thứ hai, bộ xử lý không thay đổi thứ tự của bất kỳ việc ghi nào đối với bất kỳ sự truy cập vào bộ nhớ khác. Hai điều kiện này có nghĩa là nếu một bộ xử lý ghi vị trí A sau đó là vị trí B, bất kỳ bộ xử lý nào thấy giá trị mới của B cũng phải thấy giá trị mới của A. Giới hạn này cho phép bộ xử lý sắp xếp lại việc đọc, nhưng cưỡng chế bộ xử lý để hoàn thành việc ghi theo thứ tự chương trình. Chúng ta sẽ dựa vào giả thiết này cho tới khi chúng ta tới mục 4.6, ở đây chúng ta sẽ thấy chính xác tác động của định nghĩa này, cũng như các lựa chọn thay thế Kế hoạch cơ bản về sự thi hành tính tương quan Vấn đề tương quan của bộ đa xử lý và xuất/nhập, mặc dù tương tự như nguồn gốc của nó, có những đặc trưng khác nhau ảnh hưởng đến các giải pháp thích hợp. Không giống như xuất/nhập một bản sao để tránh bất cứ khi nào có sự cố xảy ra một chương trình đang chạy trên bộ đa xử lý bình thường sẽ có nhiều bản sao chép dữ liệu trong các bộ nhớ cache. Trong một bộ đa xử lý nhất quán, bộ nhớ cache cung cấp cả sự di chuyển và sự sao chép các mục dữ liệu chia sẻ. Bộ nhớ tương quan cache cung cấp sự di chuyển, khi mà mục dữ liệu có thể được di chuyển đến bộ nhớ cache cục bộ và được sử dụng một cách hợp lý. Sự di chuyển này làm giảm bớt cả thời gian chờ để truy cập vào mục dữ liệu chia sẻ mà được phân bổ từ xa và cả yêu cầu băng thông trên bộ nhớ chia sẻ. Bộ nhớ cache cũng cung cấp sự sao chép cho dữ liệu chia sẻ mà đồng thời đang được đọc, khi mà bộ nhớ cache tạo ra một bản sao chép các mục dữ liệu trong bộ nhớ cache cục bộ. Sự sao chép làm giảm bớt cả thời gian chờ truy cập và cả sự tranh chấp việc đọc các mục dữ liệu chia sẻ. Hỗ trợ sự di chuyển và sự sao chép này là rất quan trọng để thực hiện trong việc truy cập dữ liệu chia sẻ. Vì vậy, thay vì cố

158 Chương 4: Các kiến trúc đa xử lý 159 gắng giải quyết vấn đề bằng cách tránh nó trong phần mềm, các bộ đa xử lý cỡ nhỏ chấp nhận giải pháp phần cứng bằng cách giới thiệu một giao thức để duy trì các bộ nhớ cache nhất quán. Các giao thức để duy trì tính tương quan cho bộ đa xử lý được gọi là các giao thức tương quan bộ nhớ cache. Chìa khóa để thực hiện giao thức tương quan bộ nhớ cache là theo dõi tình trạng của bất kỳ sự chia sẻ của khối dữ liệu nào. Có hai lớp giao thức, dùng các kỹ thuật khác nhau để theo dõi tình trạng chia sẻ, sử dụng: - Directory based Tình trạng chia sẻ của một khối bộ nhớ vật lý được giữ chỉ trong một vị trí, được gọi là thư mục; chúng ta tập trung vào cách tiếp cận này trong mục 4.4, khi chúng ta thảo luận về khả năng mở rộng những kiến trúc bộ nhớ chia sẻ. Tính tương quan directory - based thực hiện cao hơn so với snooping, nhưng nó có thể mở rộng các bộ đếm. Thiết kế T1 của Sun, chủ đề của mục 4.8, sử dụng các thư mục, dù với một bộ nhớ vật lý trung tâm. - Snooping Mỗi bộ nhớ cache đều có một bản sao chép dữ liệu, từ khối bộ nhớ vật lý cũng có một bản sao chép tình trạng chia sẻ của một khối, nhưng không có tình trạng tập trung được giữ lại. Tất cả các bộ nhớ cache đều có khả năng truy cập thông qua một vài phương tiện truyền đi (bus hay switch) và tất cả các bộ điều khiển bộ nhớ cache đều kiểm soát và theo dõi trên các thiết bị để xác định dù bất cứ thế nào chúng đều có một bản sao chép của một khối mà được yêu cầu thông qua sự truy cập bus hay switch. Chúng ta tập trung vào cách tiếp cận này trong mục này. Giao thức snooping trở nên phổ biến với các bộ đa xử lý sử dụng những vi xử lý và bộ nhớ cache gắn kèm với một bộ nhớ chia sẻ đơn bởi vì giao thức này có thể sử dụng kết nối vật lý tồn tại trước đó - đường bus đến bộ nhớ - để thăm dò tình trạng của bộ nhớ cache. Ở những mục sau, chúng ta giải thích tính tương quan bộ nhớ cache snoop-based như thực hiện với đường bus chia sẻ, nhưng bất kỳ thiết bị liên lạc nào truyền đi bộ nhớ cache đến tất cả các bộ xử lý có thể được dùng để thực hiện một hệ thống tương quan snooping-based. Sự truyền đi đến tất cả bộ nhớ cache là những gì tạo ra các giao thức snooping đơ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 Các giao thức Snooping Một phương pháp là để đảm bảo rằng bộ xử lý có quyền truy cập vào mục dữ liệu trước khi nó ghi mục dữ liệu đó. Cách này của giao thức được gọi là giao thức ghi không hợp lệ, bởi vì nó không hợp lệ các bản sao chép khác khi ghi. Nó là giao thức phổ biến nhất, cả cho hệ thống snooping và directory. Quyền truy cập đảm bảo rằng không tồn tại những bản sao chép có thể đọc hay ghi của một mục nào khác khi việc ghi xảy ra: Tất cả những bản sao chép khác đã lưu trữ của một mục dữ liệu là không hợp lệ.

159 160 Kiến trúc máy tính tiên tiến Bảng 4.2 trình bày một ví dụ về giao thức không hợp lệ cho đường bus snooping với việc ghi lại cache trong hành động. Để thấy cách thức giao thức này đảm bảo sự tương quan, hãy xem xét việc ghi theo sau là việc đọc bởi bộ xử lý khác: Khi mà việc ghi yêu cầu quyền truy cập, bất kỳ bản sao chép nào được nắm giữ bởi bộ xử lý đọc phải bị mất hiệu lực (vì thế mà có tên giao thức). Vì vậy, khi việc đọc xảy ra, nó bị bỏ lỡ trong bộ nhớ cache và nó bị bắt buộc phải lấy một bản sao chép dữ liệu mới. Còn việc ghi, chúng ta yêu cầu rằng bộ xử lý ghi có quyền truy cập, ngăn cản bất kỳ bộ xử lý nào khác có khả năng ghi cùng một lúc. Nếu hai bộ xử lý đều cố gắng ghi cùng một dữ liệu đồng thời, một trong chúng sẽ thắng cuộc tranh đua, làm cho bản sao chép của bộ xử lý khác bị không hợp lệ. Đối với bộ xử lý khác để hoàn thành việc ghi của nó, nó phải nhận được một bản sao chép dữ liệu mới, mà phải chứa giá trị mới cập nhật. Vì vậy, giao thức này bắt buộc việc ghi tuần tự. Việc thay thế đối với giao thức không hợp lệ là để cập nhật tất cả những bản sao chép đã lưu trữ của một mục dữ liệu khi mà mục dữ liệu đó được ghi. Kiểu giao thức này được gọi là giao thức ghi cập nhật hay là giao thức ghi quảng bá (write broadcast protocol). Bởi vì giao thức ghi cập nhật việc ghi phải quảng bá tất cả việc ghi đến những dòng bộ nhớ cache chia sẻ, nó có băng thông khá đáng kể. Vì lý do này, tất cả những bộ xử lý gần đây đã lựa chọn để thực hện giao thức ghi không hợp lệ và chúng ta sẽ chỉ tập trung vào những giao thức ghi không hợp lệ ở những phần còn lại của chương. Hành động của bộ xử lý Hành động của bus Nội dung của Nội dung cache Nội dung của bộ cache CPU A cho CPU B nhớ vị trí X CPU A đọc X Cache lỡ cho X 0 0 CPU B đọc X Cache lỡ cho X CPU A ghi 1 vào X Không hợp lệ cho X 1 0 CPU B đọc X Cache lỡ cho X Bảng 4.2: Một ví dụ về giao thức không hợp lệ làm việc trên một đường bus snooping cho một khối cache đơn (X) với cache ghi lại. Chúng ta giả định rằng không có bất kỳ bộ nhớ cache nào ban đầu giữ X và giá trị của X trong bộ nhớ là 0. Nội dung bộ xử lý trung tâm và bộ nhớ trình bày giá trị sau khi bộ xử lý và hành động của bus đều hoàn thành. Một khoảng trống cho biết không có hành động nào hoặc không có lưu trữ sao chép nào. Khi lần thứ hai bị lỡ bởi B xảy ra, bộ xử lý trung tâm A trả lời với sự hủy bỏ giá trị sự trả lời từ bộ nhớ. Ngoài ra, cả nội dung của bộ nhớ cache của B và bộ nhớ của X đều được cập nhật. Sự cập nhật này của bộ nhớ, xảy ra khi một khối trở thành chia sẻ, đơn giản hóa các giao thức, nhưng nó có thể theo dõi quyền sở hữu và bắt buộc việc ghi lại chỉ khi khối dữ liệu được thay thế. Điều này yêu cầu giới thiệu về tình trạng bổ sung được gọi là chủ nhân, cho biết một khối dữ liệu có thể được chia sẻ, nhưng bộ xử lý sở hữu chịu trách nhiệm cho việc cập nhật bất kỳ bộ xử lý và bộ nhớ nào khác khi nó thay đổi khối dữ liệu hay thay thế nó. 0

160 Chương 4: Các kiến trúc đa xử lý Những kỹ thuật thực hiện cơ bản Chìa khóa để thực hiện giao thức ghi không hợp lệ trong bộ đa xử lý cỡ nhỏ là sử dụng những đường bus, hoặc là những thiết bị quảng bá, để thực hiện sự không hợp lệ. Để thực hiện sự không hợp lệ, bộ xử lý đơn giản giành được quyền truy cập bus và quảng bá địa chỉ không hợp lệ trên đường bus. Tất cả các bộ xử lý tiếp tục theo dõi trên bus, xem các địa chỉ. Các bộ xử lý kiểm tra có địa chỉ nào trên bus ở trong bộ nhớ cache của chúng không. Nếu có, dữ liệu tương ứng trong bộ nhớ cache là không hợp lệ. Khi ghi vào một khối mà được chia sẻ xảy ra, bộ xử lý ghi phải giành được quyền truy cập bus để truyền đi sự không hợp lệ của nó. Nếu hai bộ xử lý cố gắng ghi những khối chia sẻ ở cùng một thời điểm, sự cố gắng của chúng để quảng bá hành động không hợp lệ sẽ bị tuần tự khi chúng phân chia đường bus. Bộ xử lý đầu tiên để nhận được quyền truy cập bus sẽ làm ra bất kỳ bản sao chép khác của khối dữ liệu đang ghi bị mất hiệu lực. Nếu các bộ xử lý cố gắng ghi cùng một khối, sự tuần tự bắt buộc bởi các đường bus cũng tuần tự việc ghi của chúng. Kéo theo hệ thống này là việc ghi đối với mục dữ liệu chia sẻ không thể thực sự hoàn thành cho đến khi nó nhận được quyền truy cập bus. Tất cả các hệ thống tương quan đều yêu cầu một vài phương pháp truy cập tuần tự đến cùng một khối cache, hoặc bằng cách truy cập tuần tự đến các thiết bị liên lạc hay là đến các cấu trúc chia sẻ khác. Ngoài ra, những bản sao chép đang tồn tại của khối bộ nhớ cache mà được ghi vào, chúng ta cũng cần xác định vị trí mục dữ liệu khi bộ nhớ cache bị lỡ các hành động xảy ra. Trong quá trình ghi vào bộ nhớ cache, nó dễ dàng tìm thấy giá trị hiện tại của mục dữ liệu, khi tất cả dữ liệu được ghi luôn luôn gửi đến bộ nhớ, từ đó giá trị gần đây nhất của mục dữ liệu luôn luôn được truy cập. (Bộ ghi đệm có thể dẫn đến một vài sự phức tạp thêm, vấn đề này được thảo luận ở chương tiếp theo). Trong thiết kế với băng thông bộ nhớ đủ để hỗ trợ lưu lượng ghi từ các bộ xử lý, quá trình ghi được đơn giản hóa thông qua việc thực hiện sự tương quan bộ nhớ cache. Về mặt bộ nhớ cache ghi lại, vấn đề tìm thấy giá trị dữ liệu gần đây nhất là khó khăn hơn, khi mà giá trị gần đây nhất của các mục dữ liệu có thể ở trong bộ nhớ cache hơn là trong bộ nhớ. Thật may mắn, những bộ nhớ cache ghi lại có thể sử dụng cùng một hệ thống snooping cả cho bộ nhớ cache bị lỡ và bộ nhớ cache ghi: mỗi bộ xử lý thăm dò mỗi địa chỉ đặt trên các bus. Nếu một bộ xử lý tìm thấy có một bản sao chép xấu do khối cache yêu cầu, nó sẽ cung cấp khối cache đáp ứng yêu cầu đọc và làm cho sự truy cập bộ nhớ bị hủy bỏ. Càng phức tạp hơn khi phải lấy khối cache từ bộ nhớ cache của bộ xử lý, mà có thể lâu hơn việc lấy nó từ các bộ nhớ chia sẻ nếu các bộ xử lý là các chip riêng biệt. Khi bộ nhớ cache ghi lại yêu cầu băng thông bộ nhớ ít, chúng có thể hỗ trợ một số lượng lớn các bộ xử lý nhanh hơn

161 162 Kiến trúc máy tính tiên tiến và là sự chọn lựa cách tiếp cận trong hầu hết các bộ đa xử lý, bất chấp mức độ phức tạp của sự duy trì tương quan. Vì vậy, chúng ta sẽ kiểm tra khả năng tương quan với những bộ nhớ cache ghi lại. Các thẻ bộ nhớ cache thông thường có thể được sử dụng để thực hiện quá trình xử lý của snooping và những bit hợp lệ của mỗi khối dễ dàng tạo ra sự mất hiệu lực để thực hiện. Về mặt đọc, cho dù được tạo ra bởi sự không hợp lệ hay bởi một vài sự kiện khác, thì cũng dễ hiểu khi chúng đơn giản dựa vào khả năng của snooping. Về mặt ghi, chúng tôi biết rằng cho dù bất kỳ bản sao chép nào khác của khối đều được lưu trữ, bởi vì nếu không có bản sao chép khác được lưu trữ, thì việc ghi không cần đặt trên bus trong bộ nhớ cache ghi lại. Không gửi đi việc ghi làm giảm cả thời gian ghi và thời gian yêu cầu băng thông. Để theo dõi có khối cache nào được chia sẻ không, chúng ta có thể bổ sung thêm một bit trạng thái gắn với mỗi khối cache, cũng như chúng ta có một bit hợp lệ và một bit xấu. Nhờ sự bổ sung thêm bit báo hiệu có khối nào được chia sẻ hay không, chúng ta có thể quyết định việc ghi có phải tạo ra một sự không hợp lệ hay không. Khi một việc ghi vào một khối trong tình trạng chia sẻ xảy ra, bộ nhớ cache tạo ra một sự không hợp lệ trên bus và đánh dấu khối đó là loại trừ (exclusive). Không có thêm sự không hợp lệ nào sẽ được gửi bởi bộ xử lý cho khối đó. Bộ xử lý với bản sao chép duy nhất của khối cache bình thường được gọi là chủ sở hữu của khối cache. Khi một sự không hợp lệ được gửi, trạng thái của khối cache của bộ xử lý sở hữu được thay đổi từ chia sẻ sang không chia sẻ (hay là loại trừ). Nếu bộ xử lý khác sau đó yêu cầu khối cache này, trạng thái phải được chia sẻ trở lại. Khi đó, bộ nhớ cache snooping của chúng ta cũng sẽ thấy bất kỳ sự lỡ nào, nó biết khi nào khối cache loại trừ được yêu cầu bởi bộ xử lý khác và trạng thái nên được chia sẻ. Mỗi sự chuyển tiếp bus phải kiểm tra những thẻ địa chỉ cache, có thể gây ra khả năng làm nhiễu với những sự truy cập bộ xử lý cache. Một cách để làm giảm sự nhiễu này là nhân đôi những thẻ lên. Sự nhiễu cũng có thể được làm giảm trong nhiều cấp độ bộ nhớ cache nhờ trực tiếp yêu cầu snoop đến cache L2, mà bộ xử lý chỉ sử dụng khi nó có một sự lỡ trong cache L1. Về mặt hệ thống để làm việc, mỗi mục vào trong cache L1 phải có mặt trong cache L2, một thuộc tính gọi là thuộc tính bao hàm (inclusion property). Nếu snoop lấy về một hit trong cache L2, sau đó nó phải phân xử cho cache L1 để cập nhật trạng thái và khả năng lấy dữ liệu, nó luôn luôn yêu cầu một sự chờ của bộ xử lý. Đôi khi nó có thể hữu ích khi nhân đôi các thẻ của cache thứ hai để làm giảm sự tranh chấp giữa bộ xử lý và các hành động của snooping. Chúng ta sẽ thảo luận thuộc tính bao hàm chi tiết hơn trong chương tiếp theo.

162 Chương 4: Các kiến trúc đa xử lý Giao thức mẫu Giao thức tương quan snooping luôn luôn được thực hiện bởi sự hợp nhất bộ điều khiển hữu hạn trong mỗi nút. Bộ điều khiển này đáp ứng những yêu cầu từ bộ xử lý và từ bus (hoặc từ những thiết bị quảng bá khác), sự thay đổi trạng thái của khối cache đã chọn, cũng như việc sử dụng bus để truy cập dữ liệu hoặc để làm không hợp lệ của nó. Đáng lý, bạn có thể nghĩ về một bộ điều khiển riêng biệt được kết hợp với mỗi khối, có nghĩa là, hoạt động của snooping hay là những yêu cầu của cache cho mỗi khối khác nhau có thể xử lý độc lập. Thực tế trong quá trình thực hiện, bộ điều khiển đơn cho phép nhiều hoạt động đối với các khối riêng biệt để xử lý theo kiểu đan xen (có nghĩa là, một hoạt động có thể được khởi tạo trước khi hoạt động khác đã hoàn thành, mặc dù chỉ duy nhất một sự truy cập cache hoặc là bus được cho phép ở một thời điểm). Ngoài ra, hãy nhớ rằng, mặc dù chúng ta tham chiếu đến bus trong những mô tả sau đây, bất kỳ liên mạng nào hỗ trợ một quảng bá đến tất cả các bộ điều khiển tương quan và đến bộ nhớ cache liên kết cũng có thể được sử dụng để thực hiện snooping. Giao thức đơn giản chúng ta xem xét có 3 trạng thái: không hợp lệ, chia sẻ và sửa đổi. Trạng thái chia sẻ báo cho ta biết rằng một khối có khả năng chia sẻ, trong khi trạng thái sửa đổi báo cho ta biết rằng khối đó vừa cập nhật trong bộ nhớ cache; chú ý rằng trạng thái sửa đổi sẽ ngụ ý khối đó là khối loại trừ. Bảng 4.3 trình bày những yêu cầu tạo ra bởi khối xử lý cache trong một nút (nửa đầu cả bảng) cũng như những yêu cầu đó đến từ bus (nửa dưới của bảng). Giao thức này là cho bộ nhớ cache ghi lại, nhưng dễ dàng bị thay đổi để làm việc cho bộ nhớ cache ghi vào nhờ sự biên dịch lại trạng thái sửa đổi thành trạng thái loại trừ và cập nhật bộ nhớ cache ghi ở chế độ bình thường cho cache ghi vào. Sự mở rộng phổ biến nhất của giao thức cơ bản là sự bổ sung của trạng thái loại trừ, mô tả một khối mà không sửa đổi nhưng được nắm giữ chỉ trong một bộ nhớ cache; chú thích của bảng 4.3 mô tả trạng thái này và sự mở rộng chi tiết của nó. Khi một sự không hợp lệ hay là một việc ghi bị lỡ được đặt trên bus, bất kỳ bộ xử lý nào với những bản sao chép của khối cache sẽ làm mất hiệu lực của nó. Về mặt cache ghi, dữ liệu cho việc ghi bị lỡ có thể luôn luôn bị lấy lại từ bộ nhớ. Về mặt ghi bị lỡ trong bộ nhớ cache ghi lại, nếu khối đó là loại trừ chỉ trong một bộ nhớ cache, bộ nhớ cache đó cũng ghi lại khối đó; mặt khác, dữ liệu có thể được đọc từ bộ nhớ. Hình 4.3 trình bày biểu đồ sự chuyển tiếp trạng thái hữu hạn cho một khối cache đơn sử dụng giao thức không hợp lệ ghi và một bộ nhớ cache ghi lại. Để đơn giản, ba trạng thái của giao thức được sao chép lại để biểu diễn những sự chuyển tiếp dựa trên những yêu cầu của bộ xử lý (bên trái, tương đương với nửa đầu của bảng trong bảng 4.3), đối lập với những chuyển tiếp dựa trên những yêu cầu bus

163 164 Kiến trúc máy tính tiên tiến (bên phải, tương đương với nửa dưới của bảng trong bảng 4.3). Những chữ in đậm được dùng để phân biệt những hành động của bus, đối lập với những điều kiện mà sự chuyển tiếp trạng thái phụ thuộc vào. Trạng thái trong mỗi nút biểu diễn trạng thái của khối cache đã được chọn được chỉ rõ nhờ bộ xử lý hay yêu cầu của bus. Tất cả các trạng thái trong giao thức bộ nhớ cache sẽ cần thiết trong bộ nhớ cache của bộ đơn xử lý, ở đây chúng tương đương với những trạng thái không hợp lệ, hợp lệ và xấu. Hầu hết sự thay đổi của các trạng thái được chỉ dẫn bởi những hình cung ở nửa bên trái của hình 4.3 sẽ là cần thiết trong bộ nhớ cache ghi lại của bộ đơn xử lý, với ngoại lệ là làm mất hiệu lực việc ghi hit vào một khối chia sẻ. Sự thay đổi trạng thái được biểu diễn bởi những hình cung ở nửa bên phải của hình 4.3 là chỉ cần thiết cho sự tương quan và sẽ không xuất hiện tất cả trong một bộ điều khiển cache trong bộ đơn xử lý. Như đã đề cập trước đó, chỉ có một bộ máy trạng thái hữu hạn trên mỗi bộ nhớ cache, với sự kích thích đến từ bộ xử lý hoặc là đến từ bus. Hình 4.4 trình bày cách thức sự chuyển tiếp trạng thái ở nửa bên phải của hình 4.3 được kết hợp với nửa bên trái của hình để tạo thành một biểu đồ trạng thái đơn cho mỗi khối cache. Để hiểu lý do tại sao giao thức này làm việc, quan sát thấy rằng bất kỳ khối cache hợp lệ nào hoặc là nằm trong trạng thái chia sẻ trong một hoặc nhiều bộ nhớ cache, hoặc là nằm trong trạng thái loại trừ trong đúng một bộ nhớ cache. Bất kỳ sự chuyển tiếp trạng thái loại trừ (nó được yêu cầu cho một bộ xử lý để ghi vào một khối) yêu cầu một sự không hợp lệ hay là việc ghi lỡ được đặt trên bus, gây ra tất cả các bộ cache tạo ra khối không hợp lệ. Ngoài ra, nếu một vài bộ nhớ cache khác có một khối trong trạng thái loại trừ, bộ nhớ cache đó tạo ra việc ghi lại, để cung cấp một khối chứa địa chỉ mong muốn. Cuối cùng, nếu việc đọc lỡ xảy ra trên bus đối với một khối trong trạng thái loại trừ, bộ nhớ cache với bản sao chép loại trừ thay đổi trạng thái của nó thành chia sẻ. Những hành động trong hình 4.4, điều khiển việc đọc và ghi lỡ trên bus, về bản chất là những thành phần snooping của giao thức. Một thuộc tính khác được bảo vệ trong giao thức này và trong hầu hết các giao thức khác, là bất kỳ khối nhớ nào trong trạng thái chia sẻ luôn luôn được cập nhật trong bộ nhớ, để đơn giản hóa việc thực hiện. Mặc dù giao thức cache đơn giản của chúng ta là đúng, nó bỏ qua một số lượng lớn sự phức tạp làm cho việc thực hiện rắc rối hơn nhiều. Sự quan trọng nhất là giao thức giả sử rằng hoạt động là các nguyên tử không thể phân chia - có nghĩa là, một hoạt động có thể xong bằng cách mà không có hoạt động xen vào có thể xảy ra. Ví dụ, giao thức mô tả giả sử rằng việc ghi lỡ có thể được nhận diện, có được bus và nhận sự trả lời như hoạt động của một nguyên tử đơn. Trong thực tế điều này không đúng. Một cách tương tự, nếu chúng ta dùng một switch, như tất cả các bộ đa xử lý gần đây làm, sau đó thậm chí việc ghi lỡ cũng sẽ không thể là một nguyên tử.

164 Chương 4: Các kiến trúc đa xử lý 165 Những hoạt động của phi nguyên tử giới thiệu khả năng mà giao thức có thể bế tắc (deadlock), có nghĩa là nó gần tới trạng thái mà nó không thể tiếp tục. Chúng ta sẽ tìm hiểu cách những giao thức này được thực hiện. Yêu cầu Đọc hit Nguồn Bộ xử lý Trạng thái địa chỉ của khối cache Chia sẻ hoặc sửa đổi Loại hành động của cache Normal hit Chức năng và giải thích Đọc dữ liệu trong bộ nhớ cache Đọc miss Bộ xử lý Không hợp lệ Normal miss Đặt việc đọc miss trên bus Đọc miss Bộ xử lý Chia sẻ Replacement Đọc miss Bộ xử lý Sửa đổi Replacement Miss xung đột địa chỉ: đặt việc đọc miss trên bus Miss xung đột địa chỉ: ghi lại khối, sau đó đặt việc đọc miss trên bus Ghi hit Bộ xử lý Sửa đổi Normal hit Ghi dữ liệu vào cache Ghi hit Bộ xử lý Chia sẻ Coherence Đặt sự mất hiệu lực trên bus. Sự hoạt động này thường được gọi là nâng cấp hay là quyền sở hữu miss, khi đó chúng không truy xuất dữ liệu nhưng chỉ thay đổi trạng thái Ghi miss Bộ xử lý Không hợp lệ Normal miss Đặt việc ghi lỡ trên bus Ghi miss Bộ xử lý Chia sẻ Replacement Ghi miss Bộ xử lý Sửa đổi Replacement Đọc miss Bus Chia sẻ Không hành động Đọc miss Bus Sửa đổi Tương quan Sự không hợp lệ Bus Chia sẻ Tương quan Ghi lỡ Bus Chia sẻ Tương quan Ghi lỡ Bus Sửa đổi Tương quan Miss xung đột địa chỉ: đặt việc ghi miss trên bus Miss xung đột địa chỉ: ghi lại khối, sau đó đặt việc ghi miss trên bus Cho phép bộ nhớ đối với dịch vụ đọc lỡ Cố gắng để chia sẻ dữ liệu: đặt khối cache trên bus và thay đổi trạng thái chia sẻ Cố gắng để ghi khối chia sẻ, không hợp lệ Cố gắng để ghi khối chia sẻ; không hợp lệ khối cache Cố gắng để ghi khối loại trừ nơi khác: ghi lại khối cache và làm trạng thái của nó không hợp lệ Bảng 4.3: Cơ chế tương quan bộ nhớ cache nhận những yêu cầu từ cả bộ xử lý và bus và trả lời lại chúng dựa trên loại yêu cầu, dù nó đạt được hay bị lỡ trong bộ nhớ cache và trạng thái của khối cache ghi rõ trong yêu cầu. Cột thứ tư mô tả các loại hành động của cache như hit bình thường hay là lỡ bình thường (giống như một bộ

165 166 Kiến trúc máy tính tiên tiến đơn xử lý sẽ nhìn thấy), sự thay thế (sự thay thế bộ nhớ cache của bộ đơn xử lý), hay là sự tương quan (được yêu cầu để duy trì bộ nhớ cache tương quan), một hành động bình thường hay thay thế có thể gây ra một hành động tương quan phụ thuộc vào trạng thái của khối trong những bộ nhớ cache khác. Về mặt đọc lỡ, ghi lỡ, hay là sự không hợp lệ được thăm dò từ bus, một hành động được yêu cầu chỉ khi những địa chỉ đọc hay ghi khớp với một khối trong bộ nhớ cache và khối đó là hợp lệ. Một vài giao thức cũng giới thiệu một trạng thái để chỉ định khi nào một khối trở thành loại trừ trong một bộ nhớ cache nhưng vẫn chưa được ghi. Trạng thái này có thể phát sinh nếu một sự truy cập cho việc ghi bị phân thành 2 mảnh: lấy khối loại trừ trong một bộ nhớ cache và sau đó cập nhật nó; trong giao thức trạng thái chưa sửa đổi chuyên dụng này là nhất thời, kết thúc ngay khi việc ghi hoàn thành. Những giao thức khác sử dụng và duy trì trạng thái loại trừ cho một khối chưa sửa đổi. Trong một giao thức snooping, trạng thái này có thể được đưa vào khi một bộ xử lý đọc một khối mà không thường trú trong bất kỳ một bộ nhớ cache nào khác. Bởi vì tất cả những truy cập về sau được thăm dò, nó có khả năng duy trì sự chính xác của trạng thái này. Đặc biệt, nếu một bộ xử lý khác tạo ra một việc đọc lỡ, trạng thái được thay đổi từ loại trừ thành chia sẻ. Lợi ích của việc bổ sung thêm trạng thái này là việc ghi ngay sau đó đối với một khối trong trạng thái loại trừ, bởi cùng một nhu cầu của bộ xử lý không có được sự truy cập bus hay là tạo ra một sự không hợp lệ khi một khối được biết là loại trừ trong bộ nhớ cache; bộ xử lý đơn thuần thay đổi trạng thái thành sửa đổi. Trạng thái này dễ dàng được bổ sung nhờ sử dụng bit mã hóa trạng thái tương quan thành trạng thái loại trừ và sử dụng bit xấu để cho biết rằng khối đó được sửa đổi. Giao thức MESI phổ biến, được đặt tên cho bốn trạng thái (bao gồm: sửa đổi, loại trừ, 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ở rộng khác: trạng thái sở hữu, được mô tả trong chú thích của bảng 4.2. Xây dựng cỡ nhỏ (hai đến bốn bộ vi xử lý) của bộ đa xử lý trở nên rất dễ dàng. Ví dụ, bộ xử lý Intel Pentium 4 Xeon và AMD Opteron được thiết kế để sử dụng những bộ đa xử lý tương quan cache và có một giao tiếp bên ngoài hỗ trợ snooping và cho phép hai đến bốn bộ xử lý được kết nối trực tiếp. Chúng cũng có bộ nhớ trên thanh chip lớn hơn để làm giảm sự sử dụng bus. Trong trường hợp những bộ xử lý Opteron, hỗ trợ cho sự nối kết của nhiều bộ xử lý được hợp nhất lại thành một chip xử lý, như là những giao tiếp bộ nhớ. Trong trường hợp thiết kế của Intel, hệ thống hai bộ xử lý có thể được xây dựng với chỉ thêm một ít chip bên ngoài để giao tiếp với hệ thống bộ nhớ và xuất/nhập. Mặc dù những thiết kế này không thể dễ dàng định tỉ lệ đối với bộ xử lý đếm lớn hơn, chúng đưa ra một giải pháp cực tiết kiệm chi phí cho hai đến bốn bộ xử lý. Mục tiếp theo sẽ kiểm tra sự vận hành của những giao thức cho những tải làm việc song song và nhiều chương trình của chúng ta, giá trị của những phần mở rộng đối với một giao thức cơ bản sẽ được xóa khi chúng ta kiểm tra sự vận hành. Trước khi làm điều đó, chúng ta hãy cùng nhìn lại sự giới hạn về cách sử dụng của cấu trúc bộ nhớ đối xứng và một hệ thống tương quan snooping.

166 Chương 4: Các kiến trúc đa xử lý 167 Hình 4.3: Một việc ghi không hợp lệ, giao thức bộ nhớ cache tương quan cho bộ nhớ cache ghi lại trình bày các trạng thái và sự chuyển tiếp của các trạng thái cho mỗi khối trong bộ nhớ cache. Trạng thái bộ nhớ cache được biểu diễn bằng những vòng cung, với bất kỳ truy cập được cho phép bởi bộ xử lý mà không có sự chuyển tiếp trạng thái được biểu diễn trong dấu ngoặc dưới tên của trạng thái. Sự kích thích gây ra sự thay đổi trạng thái được biểu diễn bằng những vòng cung chuyển tiếp trong kiểu thông thường và bất kỳ hoạt động nào của bus tạo ra một phần của trạng thái chuyển tiếp được biểu diễn bằng những vòng cung đậm. Những hành động kích thích áp dụng đối với một khối trong bộ nhớ cache, không phải đối với địa chỉ riêng biệt trong bộ nhớ cache. Do đó, việc đọc lỡ đối với một khối trong trạng thái chia sẻ là một việc lỡ cho khối cache đó nhưng cho một địa chỉ khác. Phía bên trái của biểu đồ trình bày sự chuyển tiếp trạng thái dựa trên những hành động của bộ xử lý liên kết với bộ nhớ cache này, phía bên phải biểu diễn sự chuyển tiếp dựa trên những hoạt động trên bus. Một việc đọc lỡ trong trạng thái chuyên dụng hay là chia sẻ và việc ghi lỡ trong trạng thái chuyên dụng xảy ra khi một địa chỉ được yêu cầu bởi bộ xử lý không khớp với địa chỉ trong khối cache. Như vậy bỏ lỡ là một sự bỏ lỡ thay thế cache chuẩn. Sự nỗ lực để ghi vào một khối trong trạng thái chia sẻ tạo ra một sự không hợp lệ. Bất cứ khi nào một sự chuyển tiếp bus xảy ra, tất cả các bộ nhớ cache chứa khối cache định rõ trong sự chuyển tiếp bus giữ hành động được ra lệnh bởi nửa bên phải của biểu đồ. Giao thức cho rằng bộ nhớ cung cấp dữ liệu trên việc đọc lỡ cho một khối được xóa sạch trong tất cả bộ nhớ cache. Trong quá trình thực hiện, hai khối của biểu đồ trạng thái này được liên kết với nhau. Trong thực tế, có nhiều sự khác biệt trong các giao thức không hợp lệ, bao gồm sự giới thiệu của trạng thái chưa sửa đổi loại trừ, cho dù là bộ xử lý hay là bộ nhớ cung cấp dữ liệu cho việc lỡ.

167 168 Kiến trúc máy tính tiên tiến Hình 4.4: Biểu đồ trạng thái tương quan bộ nhớ cache với sự chuyển tiếp trạng thái gây ra bởi bộ xử lý cục bộ biểu diễn bằng màu đen và bởi hoạt động của bus được biểu diễn bằng màu xám. Như trong hình 4.3, những hoạt động trong một sự chuyển tiếp được biểu diễn đậm Những giới hạn trong các bộ đa xử lý bộ nhớ chia sẻ đối xứng và các giao thức snooping Vì số lượng các bộ xử lý trong một bộ đa xử lý gia tăng, hay là những yêu cầu bộ nhớ của mỗi bộ xử lý gia tăng, bất kỳ những đòi hỏi tập trung tài nguyên trong hệ thống cũng có thể trở thành hiện tượng thắt nút cổ chai. Trong trường hợp đơn giản của bộ đa xử lý dựa theo bus, bus phải hỗ trợ cả lưu lượng tương quan cũng như lưu lượng bộ nhớ bình thường phát sinh từ các bộ nhớ cache. Cũng tương tự như vậy, nếu có một đơn vị bộ nhớ đơn, nó phải điều tiết tất cả các yêu cầu của bộ xử lý. Vì thế các bộ xử lý tăng tốc độ xử lý trong một vài năm gần đây, số lượng các bộ xử lý có thể hỗ trợ trên bus đơn hay là việc sử dụng đơn vị bộ nhớ vật lý đơn giảm dần. Làm thế nào để một nhà thiết kế làm tăng băng thông bộ nhớ để hỗ trợ các bộ đa xử lý hoặc là nhiều hơn hoặc là nhanh hơn? Để làm tăng băng thông liên lạc giữa các bộ xử lý và bộ nhớ, các nhà thiết kế sử dụng nhiều bus cũng như các mạng nối kết, như là các mạng ngang hàng hay là các mạng nhỏ điểm tới điểm. Trong những thiết kế này, hệ thống bộ nhớ có thể được cấu hình thành nhiều băng vật lý, cũng như để làm tăng băng thông bộ nhớ hiệu quả trong khi giữ lại thời gian truy cập không đổi đối với bộ nhớ.

168 Chương 4: Các kiến trúc đa xử lý 169 Hình 4.5: Biểu diễn sự tiếp cận này, biểu diễn trung điểm giữa hai sự tiếp cận chúng ta thảo luận trong phần đầu của chương: tập trung bộ nhớ chia sẻ và phân phối bộ nhớ chia sẻ. AMD Opteron trình bày điểm trung gian khác trong quang phổ giữa giao thức snoopy và directory. Bộ nhớ được kết nối trực tiếp đến chip xử lý lõi kép và lên đến bốn chip xử lý, tám lõi tổng cộng, có thể được kết nối với nhau. Opteron thực hiện giao thức tương quan của nó sử dụng những liên kết điểm tới điểm để quảng bá lên ba chip khác. Bởi vì những liên kết bộ xử lý nối kết không được chia sẻ, cách duy nhất bộ xử lý có thể biết khi một sự hoạt động không hợp lệ hoàn thành là bởi một sự nhận biết rõ ràng. Vì vậy, giao thức tương quan sử dụng một sự quảng bá để tìm thấy những bản sao chép có khả năng chia sẻ, giống như giao thức snoopy, nhưng sử dụng sự nhận biết để ra lệnh cho sự hoạt động, như giao thức directory. Thật thú vị, thời gian chờ bộ nhớ truy cập từ xa và bộ nhớ cục bộ không khác biệt đáng kể, cho phép hệ điều hành xử lý một bộ đa xử lý Opteron như có sự truy cập bộ nhớ không đổi. Giao thức sự tương quan cache thăm dò có thể được sử dụng nếu không có một bus tập trung, nhưng vẫn yêu cầu một sự quảng bá được làm xong để thăm dò những bộ nhớ cache riêng biệt trên mỗi sự lỡ đối với một khối cache có khả năng chia sẻ. Lưu lượng tương quan cache này tạo ra giới hạn khác về cỡ và tốc độ của các bộ xử lý. Bởi vì lưu lượng sự tương quan không ảnh hưởng bởi những bộ nhớ cache lớn hơn, các bộ xử lý nhanh hơn chắc hẳn sẽ chôn vùi mạng và khả năng của mỗi bộ nhớ cache để đáp ứng đối với những yêu cầu thăm dò từ tất cả các bộ nhớ

169 170 Kiến trúc máy tính tiên tiến cache khác. Trong mục 4.4, chúng ta sẽ kiểm tra giao thức dựa trên directory, bỏ đi những nhu cầu cho sự quảng bá đối với tất cả bộ nhớ cache cho một sự lỡ. Khi tốc độ xử lý và số lượng lõi trên bộ xử lý tăng, ngày càng nhiều nhà thiết kế thích chọn những giao thức này để tránh giới hạn quảng bá của giao thức snoopy Quá trình thực hiện sự tương quan cache thăm dò (Snoopy Cache Coherence) Các bước nhận biết việc ghi hay là nâng cấp sự lỡ, liên lạc với các bộ xử lý khác và bộ nhớ, lấy giá trị gần đây nhất cho việc ghi lỡ và đảm bảo rằng bất kỳ sự không hợp lệ nào đều được xử lý và cập nhật bộ nhớ cache không thể hoàn thành như thể chúng nắm giữ một chu kỳ đơn. Trong hệ thống bus đơn giản, những bước này có thể tạo ra sự không thể phân chia hiệu quả bởi sự phân xử bus trước tiên (trước khi thay đổi trạng thái bộ nhớ cache) và không nhả bus cho đến khi tất cả các hành động được hoàn thành. Làm thế nào bộ xử lý có thể biết tất cả các sự không hợp lệ được hoàn thành? Trong hầu hết các bộ đa xử lý dựa trên bus một đường đơn được sử dụng đối với tín hiệu khi tất cả các sự không hợp lệ cần thiết được nhận và được xử lý. Theo sau những tín hiệu đó, bộ xử lý tạo ra sự lỡ có thể nhả bus, điều đó cho biết bất kỳ hành động được yêu cầu nào sẽ được hoàn thành trước khi bất kỳ hành động nào liên quan tới sự lỡ tiếp theo. Bằng việc giữ những bus loại trừ trong suốt các bước này, bộ xử lý tạo ra các bước riêng lẻ hiệu quả. Trong một hệ thống mà không có bus, chúng ta phải tìm thấy một vài phương pháp khác của việc tạo ra các bước trong một sự không thể phân chia lỡ. Trong hệ thống snoopy đảm bảo rằng một cuộc đua chỉ có duy nhất một người thắng được đảm bảo bởi việc sử dụng sự quảng bá cho tất cả sự lỡ cũng như một vài thuộc tính cơ bản của mạng kết nối. Những thuộc tính này, cùng với những khả năng để khởi động lại sự bỏ lỡ điều khiển của người thua trong cuộc đua, là những chìa khóa để thực hiện tương quan cache thăm dò mà không có bus Các kiến trúc chia sẻ bộ nhớ phân tán Trong một hệ đa xử lý bằng cách sử dụng một giao thức dò tìm (snooping), một vài hiện tượng liên kết khác nhau xác định sự thực hiện. Đặc biệt, việc thực hiện bộ nhớ cache tổng thể là một sự kết hợp trạng thái của lưu lượng bộ đơn xử lý nhớ và lưu lượng ảnh hưởng tới việc truyền dữ liệu, dẫn tới sự không hợp lệ và cache nhớ tiếp theo. Thay đổi số lượng bộ xử lý, kích thước bộ nhớ cache và kích thước khối có thể ảnh hưởng đến hai thành phần của tỉ lệ nhớ trong những cách khác nhau, dẫn đến sự thực hiện của toàn bộ hệ thống đó là một sự kết hợp của hai hiệu ứng.

170 Chương 4: Các kiến trúc đa xử lý 171 Nguồn đầu tiên là sự phân chia bộ nhớ đúng phát sinh từ các giao tiếp dữ liệu thông qua bộ nhớ cache tương quan. Trong giao thức không hợp lệ này, sự ghi đầu tiên bởi bộ xử lý để phân chia khối bộ nhớ gây ra sự mất hiệu lực để thiết lập quyền sở hữu của khối này. Ảnh hưởng thứ hai, gọi là chia sẻ giả, phát sinh từ việc sử dụng một giải thuật tương quan không hợp lệ với một giá trị duy nhất cho mỗi khối bộ nhớ cache. Sự phân chia sai xảy ra khi một khối bộ nhớ không hợp lệ bởi vì vài thông tin trong khối, ngoài việc đọc thông tin nó còn được ghi vào. Nếu thông tin được ghi vào thực sự được dùng bởi bộ vi xử lý nhận không hợp lệ, sau đó tham chiếu sẽ là một sự phân chia đúng và có thể gây ra một sự nhớ độc lập của kích thước khối bộ nhớ. Tuy nhiên, nếu thông tin được ghi và đọc khác nhau và không hợp lệ không gây ra giá trị mới được giao tiếp nhưng chỉ gây ra thêm một cache nhớ, sau đó nó sẽ là một phân chia nhớ giả. Trong phân chia nhớ giả, khối bộ nhớ chung được phân chia, nhưng không có thông tin trong bộ nhớ cache được phân chia và sự nhớ sẽ không xảy ra nếu kích thước khối có một thông tin duy nhất. Ví dụ dưới đây là mô hình phân chia rõ ràng. Ví dụ: Giả thiết rằng x1 và x2 cùng một khối bộ nhớ cache, nằm cùng trạng thái trong bộ nhớ cache của cả P1 và P2. Giả thiết rằng trong lần tác động sau, mỗi định nghĩa nhớ như một sự phân chia nhớ thực hoặc một sự phân chia nhớ giả. Sự nhớ này sẽ xảy ra nếu kích thước khối được xác định là một sự phân chia nhớ đúng. Chu kỳ P1 P2 1 Ghi x1 2 Đọc x2 3 Ghi x1 4 Ghi x2 5 Đọc x2 Trả lời: Các bước của chu kỳ được phân loại như sau: 1. Lần tác động này là một sự phân chia nhớ thực, từ lúc x1 được đọc bởi P2 và cần bị vô hiệu từ P2. 2. Lần tác động này là một sự phân chia nhớ giả, kể từ lúc x2 bị vô hiệu bởi việc ghi của x1 trong P1, nhưng giá trị của x1 không được sử dụng trong P2. 3. Lần tác động này là một sự phân chia nhớ giả, kể từ lúc khối chứa x1 được đánh dấu dùng chung vì đọc trong P2 nhưng P2 không đọc x1. Khối bộ nhớ cache chứa x1 sẽ ở trong trạng thái phân chia sau khi đọc bởi P2; sự ghi

171 172 Kiến trúc máy tính tiên tiến nhớ đòi hỏi phải nhận được dữ liệu riêng đi tới khối. Trong vài giao thức khác sẽ được điều khiển như một yêu cầu nâng cấp khác, phát ra một đường bus không hoạt động, nhưng không chuyển tới khối bộ nhớ cache. 4. Lần tác động này một sự phân chia nhớ giả cùng nguyên nhân như ở bước Lần tác động này là một sự phân chia nhớ thực, kể từ lúc giá trị đang đọc được ghi bởi P2. Mặc dù chúng ta thấy ảnh hưởng của việc phân chia nhớ đúng hoặc sai (giả), không nhất quán là đáng kể hơn cho các ứng dụng ghép một cách chặt chẽ, quan trọng là số lượng dữ liệu người dùng Một thời lượng làm việc thương mại Trong mục này, chúng ta sẽ kiểm tra bộ nhớ làm việc của một bộ đa xử lý 4 bộ nhớ xử lý phân chia. Kết quả được tập hợp trên một AlphaServer 4100 hoặc dùng một hệ mô phỏng sau AlphaServer Mỗi bộ xử lý trong AlphaServer 4100 là 1 Alpha 21164, 4 lệnh mỗi xung và chạy 300 MHz. Mặc dù tốc độ xung nhịp của bộ xử lý Alpha trong hệ thống này được xét tới chậm hơn những bộ xử lý trong những hệ thống trước đây, cấu trúc căn bản của hệ thống, gồm có 1 bộ xử lý 4 phát và 1 bộ nhớ cache phân cấp 3 mức, có thể so sánh với những hệ thống trước đây. Nói cụ thể, mỗi bộ xử lý có một bộ nhớ cache 3 mức. L1: bao gồm một cặp 8KB cache ánh xạ trực tiếp trên chip, một cho lệnh và một cho dữ liệu. Kích thước khối là 32 byte và bộ nhớ cache dữ liệu ghi hoàn toàn tới L2, dùng ghi bộ đệm. L2: 96KB trên chip là một bộ liên kết cache thống nhất 3 đường với một kích thước khối 32 byte dùng để ghi ngược lại. L3: thuộc ngoài chip, nối cache ánh xạ trực tiếp 2MB với khối bộ nhớ 64 byte cũng dùng để ghi ngược lại. Độ trễ của một sự truy xuất tới L2 là 7 chu kỳ, tới L3 là 21 chu kỳ và tới memory chính là 80 chu kỳ clock (xung nhịp). Chuyển cache tới cache xảy ra sự thiếu hụt trên một khối bộ nhớ riêng được chứa trong bộ nhớ khác đòi hỏi 125 chu kỳ clock. Thời lượng làm việc dùng cho việc nghiên cứu này bao gồm 3 ứng dụng: 1. Một thời lượng xử lý giao dịch online (OLTP - OnLine Transaction Processing) sau TPC-B (tương tự cách xử lý memory, nó mới hơn họ TPC-C) và đang sử dụng Oracle như cơ sở dữ liệu cơ bản. Thời gian làm việc bao gồm một tập hợp các quy trình tạo ra các yêu cầu của khách hàng và một tập hợp các server điều khiển chúng. Sự xử lý server tiêu thụ 85% thời gian của người sử dụng,

172 Chương 4: Các kiến trúc đa xử lý 173 phần còn lại đi đến các khách hàng. Mặc dù độ trễ của hệ thống nhập/xuất (I/O) được giấu kỹ và những yêu cầu đủ để giữ CPU đang bận, điển hình của khối xử lý server cho I/O sau khoảng lệnh. 2. Thời lượng của một hệ thống hỗ trợ quyết định (DSS - Decision Support System) dựa trên TPC-D và cũng dùng Oracle như cơ sở dữ liệu cơ bản. Thời lượng làm việc chỉ bao gồm 6 trong 17 truy vấn đọc trong TPC-D, mặc dù 6 truy vấn kiểm tra trong dãy hoạt động vùng chuẩn. Để giấu độ trễ của I/O, khảo sát song song cả bên trong các truy vấn, được tìm song song trong xử lý truy vấn và qua các truy vấn. Sự nghẽn cuộc gọi ít dùng thường xuyên hơn trong chuẩn OLTP, 6 truy vấn trung bình về 1,5 triệu lệnh trước khi chặn. Chuẩn % thời gian của người sử dụng % thời gian kernel % thời gian nghỉ của CPU OLTP DSS Alta Vista > 98 < 1 <1 Bảng 4.4: Việc phân phối thời gian thực hiện trong thời lượng làm việc thương mại. Chuẩn OLTP là bộ phận lớn nhất của cả thời gian OS (Operating System) và thời gian nghỉ (thời gian chờ của I/O). Chuẩn DSS ít thời gian OS, từ lúc nó ít I/O, nhưng vẫn còn nhiều hơn 9% thời gian nghỉ. Điều chỉnh độ lớn của công cụ tìm kiếm Alta Vista rõ ràng trong các phép đo. Dữ liệu cho thời lượng làm việc này được thu thập bởi chuẩn Barroso el.at.1998 trên một AlphaServer 4100 bốn bộ xử lý. 3. Chuẩn của một số web tìm kiếm (Alta Vista) dựa trên một phiên bản tìm kiếm sơ đồ bộ nhớ của cơ sở dữ liệu Alta Vista (200 GB). Vòng lặp được tối ưu hóa nhiều lần. Vì cấu trúc tìm kiếm là tĩnh, đồng bộ hóa ít là việc cần thiết trong các luồng. Tỉ lệ phần trăm thời gian dùng của người sử dụng, trong kernel và trong vòng lặp được trình bày trong bảng 4.4. Tần số của I/O tăng cả thời gian kernel và thời gian nghỉ (xem mục OLTP, mà có phép tính tỉ lệ I/O tới lớn nhất). Alta Vista là bản đồ cơ sở dữ liệu tìm kiếm trọn vẹn vào bộ nhớ và được điều chỉnh rộng rãi, chỉ ra thời gian kernel ít nhất hoặc thời gian nghỉ Đo hiệu suất của thời lượng làm việc thương mại Chúng ta bắt đầu bằng cách nhìn tổng thể việc CPU thực hiện các tiêu chuẩn này trên hệ thống 4 bộ xử lý, như được thảo luận trên trang trước, tiêu chuẩn này bao gồm thời gian thực của I/O mà bị bỏ qua trong thời gian đo của CPU. Chúng ta nhóm 6 truy vấn DSS là 1 tiêu chuẩn duy nhất, báo cáo diễn biến làm việc trung bình. Chỉ số CPI có hiệu quả rất khác nhau cho các tiêu chuẩn này, từ một CPI 1,3

173 174 Kiến trúc máy tính tiên tiến cho việc tìm kiếm Web AltaVista, tới chuẩn trung bình CPI là 1,6 cho thời lượng làm việc DSS, đến 7,0 cho thời lượng làm việc của OLTP. Hình 4.6 trình bày thời gian thực hiện bị gián đoạn thành những lệnh thực hiện, bộ nhớ cache và bộ nhớ truy cập hệ thống thời gian. Mặc dù hiệu suất thời lượng làm việc của DSS và Alta Vista hợp lý, hiệu suất thời lượng làm việc của OLTP kém của hệ thống phân cấp bộ nhớ. Hình 4.6: Thời gian thực hiện lệnh bị thất bại của 3 chương trình (OLTP, DSS và Alta Vista) trong thời lượng làm việc thương mại. Những số DSS là tỉ lệ trung bình trên 6 truy vấn khác nhau. CPI khác nhau từ mức thấp 1,3 cho AltaVista, đến 1,6 cho các truy vấn DSS, đến 7,0 cho OLTP. (Các truy vấn DSS hiển thị một loạt các chỉ số CPI là 1,3-1,9). Kể từ khi thời lượng làm việc OLTP yêu cầu nhiều nhất từ hệ thống bộ nhớ với số lượng lớn L3 bị bỏ sót, chúng ta tập trung kiểm tra tác động của kích thước bộ nhớ cache L3, số bộ xử lý và khối kích thước trên chuẩn OLTP. Hình 4.7 cho thấy hiệu quả của tăng kích thước bộ nhớ cache, sử dụng hai cách thiết lập cache liên kết, làm giảm số lượng lớn các cuộc xung đột không đúng. Thời gian thực hiện cải tiến như việc phát triển bộ nhớ cache L3 do sự giảm L3 không đúng. Đáng ngạc nhiên, gần như tất cả sự tăng thêm sẽ xảy ra từ 1-2 MB, với sự tăng thêm ít hơn, dù thực tế là cache nhớ vẫn còn một nguyên nhân gây ra tổn thất hiệu suất đáng kể với 2 MB và 4 MB cache. Tại sao lại xảy ra điều đó?

174 Chương 4: Các kiến trúc đa xử lý 175 Hình 4.7: Việc thực hiện mối quan hệ của thời lượng công việc OLTP như kích thước của bộ nhớ cache L3, được thiết lập như là kết hợp hai chiều, phát triển từ 1 MB đến 8 MB. Thời gian nghỉ còn phát triển như kích thước bộ nhớ cache là tăng, giảm một số hiệu suất thực hiện. Sự tăng này xảy ra bởi vì, với ít bộ nhớ hệ thống khác, cần nhiều máy chủ hơn để dàn trải thời gian chờ của I/O. Thời lượng làm việc có thể được điều chỉnh lại để tăng thời gian tính toán/giao tiếp cho cân bằng, giữ thời gian nghỉ trong khi kiểm tra. Để hiểu rõ hơn câu trả lời cho câu hỏi này, chúng ta cần xác định những yếu tố góp phần vào tỉ lệ cache nhớ L3 và làm thế nào chúng thay đổi như tăng bộ nhớ cache L3. Hình 4.8 trình bày dữ liệu này, hiển thị số chu kỳ bộ nhớ truy cập đóng góp theo mỗi lệnh từ 5 nguồn. Hai nguồn lớn nhất của chu kỳ truy cập bộ nhớ L3 với 1 MB L3 là lệnh và khả năng/xung đột bỏ qua. Với một L3 lớn hơn hai nguồn thu nhỏ được đóng góp nhỏ. Không may, các phân chia giả bắt buộc và phân chia nhớ thực không bị ảnh hưởng bởi một L3 lớn hơn. Như vậy, tại 4 MB và 8 MB, sự phân chia nhớ thực sinh ra các hàm nhớ, việc thiếu sự thay đổi trong việc phân chia nhớ thực dẫn đến cắt giảm hạn chế trong tỉ lệ tổng thể nhớ khi tăng kích thước bộ nhớ cache L3 quá 2 MB. Tăng kích thước bộ nhớ cache loại bỏ hầu hết các bộ đơn xử lý nhỡ (miss), trong khi không đề cập tới bộ đa xử lý nhỡ. Làm thế nào để tăng số lượng bộ xử lý

175 176 Kiến trúc máy tính tiên tiến có ảnh hưởng đến các loại nhỡ? Hình 4.9 cho thấy dữ liệu này giả định một cấu hình cơ bản 2 MB, hai cách thiết lập bộ nhớ cache L3 kết hợp. Như chúng ta mong đợi, sự gia tăng trong tỉ lệ chia sẻ tốc độ nhỡ thực, mà không bù bằng cách giảm bộ đơn xử lý nhỡ, dẫn đến sự gia tăng tổng thể trong chu kỳ truy cập bộ nhớ mỗi lệnh. Hình 4.8: Sự đóng góp gây ra sự thay đổi chu kỳ truy cập bộ nhớ khi kích thước bộ nhớ cache được tăng lên. Bộ nhớ cache L3 là mô phỏng như thiết lập kết hợp 2 phương thức. Câu hỏi cuối cùng chúng ta xem xét là liệu ngày càng tăng kích thước khối, cái mà nên giảm lệnh trong giới hạn, làm giảm công suất/tỉ lệ nhỡ xung đột và tỉ lệ chia sẻ nhỡ thực là có ích cho thời lượng làm việc. Hình 4.10 cho thấy dung lượng nhỡ cho lệnh như kích thước khối được tăng từ 32 tới 256. Tăng kích thước khối từ 32 tới 256 ảnh hưởng tới bốn trong số các thành phần tỉ lệ nhỡ: Việc chia sẻ nhỡ thực giảm tỉ lệ hơn một trong 2 yếu tố, chứng tỏ rằng có một số vùng trong các mô hình chia sẻ đúng. Tỉ lệ nhỡ bắt buộc giảm đáng kể như ta trông chờ. Xung đột/công suất nhỡ chứng tỏ sự giảm nhỏ, chứng tỏ rằng vùng không gian không cao trong bộ đơn xử lý nhỡ xảy ra với cache L3 lớn hơn 2 MB. Việc chia sẻ tỉ lệ nhỡ sai mặc dù trong giới hạn tuyệt đối nhỏ gần như gấp đôi.

176 Chương 4: Các kiến trúc đa xử lý 177 Hình 4.9: Đóng góp vào chu kỳ truy cập bộ nhớ sẽ tăng lên khi số lượng bộ xử lý tăng chủ yếu là do chia sẻ thực tăng lên. Hình 4.10: Số lượng nhỡ cho lệnh giảm dần khi kích thước khối của bộ nhớ cache L3 tăng lên, trường hợp tốt đối với kích thước khối L3 ít nhất là 128 byte. Các bộ nhớ cache L3 là 2 MB, thiết lập 2 cách kết hợp.

177 178 Kiến trúc máy tính tiên tiến Sự thiếu này ảnh hưởng đáng kể tới tỉ lệ các lệnh bỏ lỡ là việc khởi động. Nếu có một bộ nhớ cache lệnh thì chỉ với diễn biến này, chúng ta sẽ kết luận rằng vùng không gian là rất nghèo. Trong trường hợp một bộ nhớ cache L2 hỗn hợp, ngoài các hiệu ứng khác như lệnh các cuộc xung đột dữ liệu cũng có thể đóng góp vào bộ nhớ cache lệnh tỉ lệ cao bỏ lỡ cho các khối lớn hơn. Các tài liệu nghiên cứu khác có vùng không gian thấp trong dòng lệnh của cơ sở dữ liệu lớn và thời lượng công việc OLTP, trong đó có nhiều khối cơ bản và công cụ đặc biệt sắp xếp dãy mã. Tuy nhiên, việc tăng kích thước khối của bộ nhớ cache thứ cấp đến 128 hoặc có thể 256 byte dường như thích hợp Đa lập trình và hệ điều hành thời lượng làm việc Nghiên cứu tiếp theo của chúng ta là thời lượng làm việc của một đa lập trình là bao gồm cả hoạt động của người sử dụng và hoạt động của hệ điều hành. Thời lượng công việc được sử dụng là hai bản sao độc lập của biên dịch các giai đoạn của tiêu chuẩn Andrew là mô phỏng một môi trường phát triển phần mềm. Các giai đoạn biên dịch bằng cách sử dụng song song 8 khối xử lý. Thời lượng làm việc là 5,24 giây trên 8 khối xử lý, tạo ra 203 quy trình và thực hiện 787 yêu cầu của đĩa trên ba hệ thống tập tin khác nhau. Thời lượng làm việc chạy 128 MB bộ nhớ và không có hoạt động phân trang nhớ diễn ra. Thời lượng làm việc này có ba giai đoạn khác biệt: biên dịch các chuẩn, trong đó liên quan đáng kể đến việc tính toán hoạt động; cài đặt các tập tin đối tượng trong thư viện; và loại bỏ các tập tin đối tượng. Giai đoạn cuối cùng là hoàn toàn chiếm ưu thế bởi I/O và chỉ có hai khối xử lý đang hoạt động (một cho mỗi lần chạy). Trong giai đoạn giữa, I/O cũng đóng một vai trò quan trọng và khối xử lý phần lớn là không làm việc. Thời lượng làm việc tổng thể là nhiều hơn hệ thống và I/O chuyên sâu điều chỉnh cao thời lượng làm việc thương mại. Đối với các phép đo thời lượng làm việc, chúng ta giả thiết bộ nhớ và các I/O sau: Level 1 instruction cache (bộ nhớ lệnh cấp 1): 32 KB, thiết lập 2 cách kết hợp với một khối dữ liệu 64 byte, một chu kỳ xung thời gian. Level 1 data cache (bộ nhớ dữ liệu cấp 1): 32 KB, thiết lập 2 cách kết hợp với một khối dữ liệu 32 byte, một chu kỳ xung thời gian. Chúng ta thay đổi bộ nhớ dữ liệu cache L1 để kiểm tra ảnh hưởng của nó về trạng thái cache. Level 2 cache (bộ nhớ cache cấp 2): 1 MB duy nhất, thiết lập 2 cách kết hợp với một khối dữ liệu 128 byte, thời gian 10 chu kỳ xung. Main memory (bộ nhớ chính): Bộ nhớ đơn trên bus với thời gian truy cập là 100 chu kỳ xung.

178 Chương 4: Các kiến trúc đa xử lý 179 Disk system (hệ thống đĩa): Độ trễ của truy cập cố định là 3 ms (ít hơn bình thường để giảm thời gian nghỉ). Bảng 4.5 cho thấy như thế nào thời gian chạy chương trình bị ngưng cho tám khối xử lý bằng cách sử dụng các thông số được liệt kê. Thời gian chạy chương trình bị ngắt được chia thành bốn phần: 1. Idle: chạy ở chế độ kernel vòng lặp không hoạt động. 2. User: thực hiện ở mã người sử dụng. 3. Synchronization (đồng bộ hóa): thực hiện hoặc chờ các biến đồng bộ hóa. 4. Kernel: Thực hiện trong hệ điều hành, không nhàn rỗi và cũng không truy cập đồng bộ. Người dùng thực hiện Kernel thực hiện Chờ đồng bộ hóa CPU rỗi (chờ I/O) % lệnh thực thi % thời gian thực thi Bảng 4.5: Việc phân phối thời gian thực hiện trong đa lập trình song song. Phần lớn của thời gian rỗi là do độ trễ của đĩa khi chỉ một trong tám bộ vi xử lý hoạt động. Những dữ liệu và các phép đo thời lượng làm việc này được thu thập bằng hệ thống SimOS [Rosenblum et al. 1995]. Thực tế thu thập dữ liệu được thực hiện bởi M.Rosenblum, S. Herrod và E. Bugnion của Đại học Stanford. Thời lượng làm việc đa chương trình có một mất mát đáng kể hiệu quả của bộ nhớ cache, ít nhất là cho hệ điều hành. Tỉ lệ không tìm thấy cache lệnh trong hệ điều hành cho một kích thước khối là 64 byte, bộ nhớ cache thiết lập kết hợp hai chiều dao động từ 1,7% đối với một bộ nhớ cache 32 KB tới 0,2% đối với một bộ nhớ cache 256 KB. Mức người dùng lệnh không tìm thấy trong cache khoảng một phần sáu tỉ lệ của hệ điều hành trên nhiều kích cỡ cache. Tính theo cách riêng thực tế mặc dù các mã người dùng thực hiện chín lần bằng nhiều lệnh chính, nhưng những lệnh này chỉ mất khoảng bốn lần miễn là số lượng lệnh thực thi bởi kernel Hiệu năng của đa chương trình và thời lượng làm việc của hệ điều hành Trong mục này, chúng ta kiểm tra việc thực hiện bộ nhớ cache của thời lượng làm việc đa chương trình vì kích thước cache và kích thước khối được thay đổi. Do sự khác biệt giữa trạng thái nhân và của người sử dụng bộ nhớ, chúng ta giữ hai thành phần này riêng biệt. Nhớ rằng, mặc dù người sử dụng bộ nhớ thực thi hơn tám

179 180 Kiến trúc máy tính tiên tiến lần lệnh, do đó tỉ lệ bỏ lỡ tổng thể được xác định chủ yếu bằng tỉ lệ bỏ lỡ trong mã người dùng, trong đó chúng ta sẽ thấy, thường là bằng 1/5 tỉ lệ bỏ lỡ nhân (kernel). Đầu tiên, nhân khởi tạo tất cả các trang trước khi phân bổ chúng cho người sử dụng, trong đó đáng kể là làm tăng thành phần bắt buộc tỉ lệ bỏ lỡ của nhân. Thứ hai, nhân thực chia sẻ dữ liệu và do đó có một sự gắn kết không bình thường bỏ lỡ. Ngược lại, người sử dụng bộ nhớ gây ra sự gắn kết nhỡ chỉ khi quá trình được lên kế hoạch trên một bộ xử lý khác nhau và tỉ lệ bỏ lỡ của thành phần này là nhỏ. Hình 4.11 cho thấy tỉ lệ nhớ dữ liệu so với kích thước bộ nhớ cache dữ liệu và kích thước khối với nhân và các thành phần người sử dụng. Tăng kích thước bộ nhớ cache dữ liệu ảnh hưởng đến tỉ lệ nhớ của người sử dụng nhiều hơn ảnh hưởng đến tỉ lệ nhân nhớ. Tăng kích thước khối tác động có lợi cho cả tỉ lệ nhớ, vì một bộ phận lớn hơn của phát sinh nhớ bắt buộc và khả năng của nó, cả hai đều có khả năng được cải tiến với kích thước khối lớn hơn. Để hiểu tại sao nhân và bộ xử lý người dùng vận hành khác nhau, chúng ta có thể nhìn vào cách vận hành của các kernel nhỡ. Hình 4.11: Tốc độ dữ liệu bị nhỡ cho người dùng và các thành phần nhân vận hành khác nhau để tăng kích thước bộ nhớ cache dữ liệu L1 (bên trái) so với sự tăng kích thước khối cache dữ liệu L1 (bên phải). Tăng bộ nhớ cache dữ liệu L1 từ 32 KB đến 256 KB (với một khối dữ liệu 32 byte) làm cho tỉ lệ người dùng nhớ để giảm tỉ lệ nhân nhớ: mức người dùng nhớ (giảm xuống gần 3), trong khi cấp nhân, tỉ lệ nhớ giảm chỉ theo hệ số 1,3. Tốc độ nhỡ của người dùng và thành phần nhân giảm đều đặn khi kích thước khối L1 được tăng lên (trong khi vẫn giữ bộ nhớ cache L1 32 KB). Ngược lại với những ảnh hưởng của tăng kích thước bộ nhớ cache, tăng kích thước khối cải tiến tỉ lệ hạt nhân nhỡ nhiều hơn đáng kể (khoảng dưới 4 cho tham chiếu cơ bản từ 16 byte đến các khối dữ liệu 128 byte so với hệ số dưới 3 của các tham chiếu người dùng).

180 Chương 4: Các kiến trúc đa xử lý 181 Hình 4.12 cho thấy sự thay đổi trong kernel nhỡ so với tăng kích thước bộ nhớ cache và trong kích thước khối. Sự nhỡ được chia làm ba lớp: bắt buộc nhỡ, bộ nhỡ tương quan (cả phân chia đúng và sai) và khả năng/xung đột nhỡ (trong đó bao gồm nhỡ được gây ra bởi sự chèn các hệ điều hành và những bộ xử lý của người sử dụng và giữa nhiều người sử dụng bộ xử lý). Hình 4.12 khẳng định rằng, đối với các truy xuất nhân, tăng kích thước bộ nhớ cache chỉ làm giảm tỉ lệ nhớ của bộ đơn xử lý. Ngược lại, tăng kích thước khối gây ra sự giảm trong tỉ lệ nhớ bắt buộc. Thiếu sự tăng lớn trong tỉ lệ bộ nhớ tương quan vì kích thước khối được tăng lên, có nghĩa là ảnh hưởng của phân chia sai có thể là không đáng kể, mặc dù có thể xê dịch sự tăng lên từ việc giảm sự phân chia nhớ thực. Hình 4.12: Các thành phần của dữ liệu nhân nhỡ thay đổi như kích thước bộ nhớ cache dữ liệu L1 được tăng từ 32 KB đến 256 KB, khi thời lượng làm việc đa chương trình là chạy trên tám khối xử lý. Các thành phần bắt buộc nhớ vẫn không đổi, vì nó không bị ảnh hưởng bởi kích thước bộ nhớ cache. Các thành phần công suất giảm hơn 2, trong khi các thành phần liên kết gần như tăng gấp đôi. Việc tăng bộ nhớ tương quan xảy ra vì tần suất của nhớ gây ra bởi sự mất hiệu lực tăng với kích thước bộ nhớ cache, vì đầu vào ít tăng do dung lượng. Như chúng ta mong chờ, sự tăng kích thước khối bộ nhớ cache dữ liệu L1 đáng kể làm giảm tỉ lệ nhớ bắt buộc trong những tham chiếu nhân. Nó cũng có một tác động đáng kể đến dung lượng tốc độ nhỡ, giảm theo hệ số 2,4 so với kích cỡ khối. Kích thước khối tăng có sự giảm bớt trong lưu lượng dữ liệu liên kết, xuất hiện ổn định ở 64 byte, không có sự thay đổi lưu lượng liên kết các nhớ tới đường dây 128-byte. Bởi vì không có sự giảm liên kết đáng kể trong các tỉ lệ nhớ như tăng kích thước khối, các bộ phận của tỉ lệ nhỡ do phát triển liên kết từ khoảng 7% đến khoảng 15%. Đối với thời lượng làm việc đa chương trình, hệ điều hành là một truy vấn người dùng của hệ thống bộ nhớ. Nếu có nhiều hệ điều hành hay hệ hoạt động giống như hệ điều hành được bao gồm trong thời lượng làm việc và diễn biến tương tự như những gì được đo cho thời lượng làm việc này, nó sẽ trở nên rất khó để xây dựng một hệ thống bộ nhớ có khả năng đầy đủ. Một đường truyền có thể cải thiện hiệu suất là làm cho hệ điều hành nhận biết nhiều cache hơn, thông qua những môi

181 182 Kiến trúc máy tính tiên tiến trường lập trình tốt hơn hoặc thông qua hỗ trợ lập trình. Ví dụ, hệ điều hành sử dụng lại bộ nhớ cho yêu cầu được phát sinh từ các cuộc gọi hệ thống khác nhau. Mặc dù thực tế là bộ nhớ sử dụng lại sẽ hoàn toàn được ghi đè, các phần cứng không nhận ra điều này sẽ thử duy trì liên kết và có thể vài đoạn của khối bộ nhớ cache có thể được đọc. IBM Power có hỗ trợ để cho phép trình biên dịch để chỉ ra diễn biến trên sự dẫn ra thủ tục. Khó mà phát hiện diễn biến này bằng hệ điều hành và làm như vậy có thể đòi hỏi những chương trình hỗ trợ nhưng việc thưởng phạt (pay-off) là có khả năng lớn hơn. Hình 4.13: Số lượng các byte cần thiết cho mỗi tham chiếu dữ liệu phát triển như kích thước khối được tăng lên cho cả nhân và các thành phần người sử dụng Bộ nhớ chia sẻ phân tán và liên kết dựa trên thư mục Như chúng ta đã thấy ở mục 4.2, một giao thức dò tìm (snooping) đòi hỏi phải giao tiếp với tất cả các cache trên mỗi cache nhớ, bao gồm cả khả năng ghi dữ liệu chia sẻ. Sự vắng mặt của bất kỳ cấu trúc dữ liệu tập trung ghi trạng thái của cache là thuận lợi cơ bản của một hệ thống dựa trên snooping, vì nó không tốn kém, giống như khi nói đến khả năng mở rộng. Ví dụ, với chỉ 16 bộ vi xử lý, một kích thước khối 64 byte và một bộ nhớ cache dữ liệu 512 KB, tổng số nhu cầu băng thông bus (bỏ qua các chu kỳ tạm dừng) cho bốn chương trình trong dao động từ khoảng 4 GB/giây đến khoảng 170GB/giây, giả định rằng một bộ xử lý duy trì một tham chiếu dữ liệu trên mỗi xung, mà cho một xung 4 GB là bốn dữ liệu tham chiếu cho mỗi nano giây. Trong khi đó, băng thông bộ nhớ của hiệu suất cao nhất tập trung chia sẻ bộ nhớ 16 phương thức đa xử lý trong năm 2006 là 2,4 GB/giây cho mỗi bộ xử lý. Trong năm

182 Chương 4: Các kiến trúc đa xử lý , những bộ đa xử lý với một mô hình bộ nhớ phân tán có thể sử dụng hơn 12 GB/giây đối với mỗi bộ xử lý tới bộ nhớ gần nhất. Chúng ta có thể làm tăng băng thông bộ nhớ và băng thông kết nối bởi cách phân tán bộ nhớ; ngay lập tức tách vùng bộ nhớ địa phương từ vùng bộ nhớ ở xa, làm giảm nhu cầu băng thông trên bộ nhớ hệ thống và trên mạng kết nối. Trừ khi loại bỏ sự cần thiết của giao thức gắn kết để phát quảng bá trên mỗi cache nhớ, phân tán bộ nhớ sẽ tăng thêm rất ít. Như chúng ta đã đề cập trước đó, thay thế cho một giao thức liên kết một snoop là một directory protocol. Thư mục A giữ trạng thái của mỗi khối bộ nhớ có thể được lưu trữ. Thông tin trong thư mục bao gồm các bản sao của khối bộ nhớ này. Giao thức thư mục cũng có thể được sử dụng để giảm các nhu cầu băng thông trong một máy bộ nhớ chia sẻ tập trung như kết cấu Sun T1 (xem mục 4.8). Chúng ta giải thích một giao thức thư mục như là nó được thực hiện với một bộ nhớ phân tán, nhưng kết cấu áp dụng cho một bộ nhớ tập trung tổ chức vào trong các khối. Các thư mục đơn giản nhất thực hiện liên kết một mục trong thư mục với mỗi khối bộ nhớ. Trong sự thực thi này, lượng thông tin tỉ lệ thuận với số lượng sản phẩm các khối bộ nhớ (nơi mà mỗi khối là cùng kích thước cấp 2 hoặc cấp 3 khối cache) và số lượng các bộ xử lý. Phí tổn này không phải là một vấn đề cho bộ đa xử lý với ít hơn khoảng 200 bộ xử lý, vì các thư mục trên với một kích thước khối hợp lý sẽ được cho phép. Đối với những bộ đa xử lý lớn hơn, chúng ta cần các phương pháp để cấp phát cấu trúc thư mục để định tỉ lệ hiệu quả. Những phương pháp đã được sử dụng hoặc là cố gắng giữ thông tin cho khối ít hơn, hoặc cố gắng giữ bit ít hơn cho mỗi mục bằng cách sử dụng bit riêng lẻ để đặt cho sự tập hợp nhỏ của bộ vi xử lý. Để ngăn chặn các thư mục trở thành đường tắc nghẽn, thư mục được phân tán cùng với bộ nhớ (hoặc với các ngân hàng bộ nhớ xen kẽ trong một SMP), để truy cập thư mục khác nhau có thể đi đến những thư mục khác nhau, cũng giống như bộ nhớ khác nhau yêu cầu đi đến những bộ nhớ khác nhau. Một thư mục phân tán vẫn giữ được đặc tính chia sẻ của một khối luôn ở trong vùng được biết đến duy nhất. Hình 4.14 cho thấy cách phân tán bộ đa xử lý nhớ với những thư mục được thêm vào mỗi nút Các giao thức liên kết cache dựa vào thư mục Cũng như với một giao thức dò tìm (snooping), có hai hoạt động chính mà một giao thức thư mục phải thực hiện: xử lý một bộ nhớ đọc và xử lý một bộ nhớ ghi để phân chia, làm sạch khối bộ nhớ cache. (Xử lý bộ nhớ ghi vào một khối mà hiện tại đang được chia sẻ là sự kết hợp đơn giản của hai cái này). Thực hiện các hoạt động này, một thư mục phải theo dõi trạng thái của mỗi khối cache. Trong một giao thức đơn giản, những trạng thái này có thể như sau:

183 184 Kiến trúc máy tính tiên tiến Shared: Một hay nhiều bộ xử lý có khối lưu trữ và giá trị trong bộ nhớ thì cập nhật (cũng như trong tất cả các cache). Uncached: Không bộ xử lý có một bản sao của khối cache. Modified: Chính xác là mỗi bộ xử lý có một bản sao của khối bộ nhớ cache và nó có thể viết khối bộ nhớ, do đó bản sao bộ nhớ bị quá hạn. Bộ xử lý được gọi là chủ của khối. Mỗi thư mục có trách nhiệm theo dõi việc chia sẻ địa chỉ bộ nhớ của các phần bộ nhớ trong nút này. Các thư mục có thể giao tiếp với bộ vi xử lý và bộ nhớ trên bus thông thường, hoặc nó có thể có một cổng riêng cho bộ nhớ, hoặc nó có thể là một phần của một nút điều khiển trung tâm thông qua tất cả các nút. Ngoài việc theo dõi tình trạng mỗi khối bộ nhớ chia sẻ, chúng ta phải theo dõi những bộ vi xử lý có bản sao của khối đó, từ những bản sao sẽ cần phải được vô hiệu trên cách ghi. Cách đơn giản để làm điều này là giữ một bit vectơ cho mỗi khối nhớ. Khi khối được chia sẻ, mỗi bit của vectơ chứng tỏ rằng mỗi bộ vi xử lý tương ứng có một bản sao của khối đó. Chúng ta cũng có thể sử dụng các bit vectơ để theo dõi các chủ của khối này khi khối trong tình trạng riêng. Vì lý do hiệu quả, chúng ta cũng theo dõi tình trạng của mỗi cache riêng lẻ. Hình 4.14: Một thư mục được thêm vào mỗi nút để thực hiện sự gắn kết trong một bộ nhớ phân tán đa xử lý.

184 Chương 4: Các kiến trúc đa xử lý 185 Các trạng thái và chuyển tiếp cho các máy trạng thái tại mỗi bộ nhớ cache là giống nhau như những gì chúng ta sử dụng cho cache snooping, mặc dù các hành động chuyển tiếp hơi khác nhau. Quá trình hủy bỏ hoặc bố trí một bản sao riêng biệt của một mục dữ liệu khác nhau, kể từ khi chúng đều liên quan đến thông tin giữa các nút và thư mục, giữa các thư mục và một hoặc nhiều các nút điều khiển từ xa. Trong một giao thức snooping, hai bước được kết hợp thông qua việc sử dụng phát quảng bá đến tất cả các nút. Trước khi chúng ta xem sơ đồ trạng thái, rất hữu ích để kiểm tra một thư mục các kiểu thông điệp có thể được gửi giữa các bộ xử lý và các thư mục dùng cho mục đích xử lý nhớ và duy trì liên kết nhớ. Bảng 4.6 cho thấy các kiểu thông điệp được gửi giữa các nút. Nút địa phương (local node) là nơi đòi hỏi một nút xuất phát, các nút nhà (home node) là nút nơi vị trí bộ nhớ và nhập các thư mục của địa chỉ lưu trú. Khoảng địa chỉ vật lý là phân tán tĩnh, do đó các nút có chứa bộ nhớ và thư mục xác định một địa chỉ vật lý được biết đến. Ví dụ, các bit cấp cao để có thể cung cấp số nút, trong khi các bit cấp thấp để cung cấp khoảng chừa trống trong bộ nhớ vào nút đó. Nút địa phương cũng có thể là nút nhà. Thư mục phải được truy cập khi các nút nhà là nút địa phương, từ các bản sao chép có thể có trong một nút thứ ba, được gọi là một nút ở xa (remote node). Loại thông điệp Nguồn Điểm đích Nội dung thông điệp Chức năng của thông điệp Read miss Local cache (cache địa phương) Home directory (thư mục gốc) P,A Bộ xử lý P được đọc tại địa chỉ A, yêu cầu dữ liệu và đọc phân chia P Write miss Local cache Home directory P,A Invalidate Local cache Home directory A Invalidate Home directory Remote cache A Fetch Home directory Remote cache A Bộ xử lý P được ghi tại địa chỉ A; yêu cầu dữ liệu và làm chủ sở hữu P Yêu cầu gửi sự mất hiệu lực của tất cả các cache từ xa có bộ nhớ đệm tại địa chỉ A Sự mất hiệu lực của một bản sao dữ liệu phân chia tại địa chỉ A Truy xuất khối tại địa chỉ A và gửi nó đến thư mục gốc, thay đổi trạng thái của A trong cache từ xa để phân chia

185 186 Kiến trúc máy tính tiên tiến Loại thông điệp Nguồn Điểm đích Nội dung thông điệp Chức năng của thông điệp Fetch/ Invalidate Data value reply Home directory Remote cache A Home directory Local cache D Truy xuất khối tại địa chỉ A và gửi nó đến thư mục gốc, mất hiệu lực trong khối cache Trả về giá trị dữ liệu từ bộ nhớ gốc Data write back Remote cache (cache ở xa) Home directory A,D Viết lại giá trị dữ liệu cho địa chỉ A Bảng 4.6: Các thông điệp có thể được gửi giữa các nút để duy trì sự liên kết, cùng với nút nguồn và nút đích, nội dung (P: yêu cầu số bộ xử lý, A: yêu cầu địa chỉ và D: dữ liệu nội dung) và chức năng thông điệp. Ba thông điệp đầu tiên được yêu cầu gửi bằng bộ nhớ cache của local (vùng địa phương) đến home. 4 tới 6 thông điệp được gửi tới một bộ nhớ cache từ xa bằng home khi home cần dữ liệu để đáp ứng sự đọc hay ghi nhớ yêu cầu. Giá trị dữ liệu được sử dụng để gửi một giá trị từ nút home trở lại nút yêu cầu. Dữ liệu được viết lại xảy ra vì hai lý do: khi một khối được thay thế trong một bộ nhớ cache và phải được viết lại đến home memory và truy xuất để lấy hoặc hủy bỏ hiệu lực các thông điệp từ home. Một remote node là nút mà có một bản sao của một khối bộ nhớ cache, cho dù là riêng rẻ (trong trường hợp nó chỉ là bản sao) hoặc phân chia. Một remote node có thể giống như local node hoặc home node. Trong trường hợp này, giao thức cơ bản không thay đổi, nhưng các thông điệp giữa bộ xử lý có thể được thay thế bằng các thông điệp trong bộ xử lý. Trong phần này, chúng ta giả định một mô hình đơn giản của bộ nhớ đồng nhất. Để giảm thiểu các kiểu thông điệp và sự phức tạp của giao thức, chúng ta làm cho một giả định rằng thông điệp sẽ được nhận và thực thi theo thứ tự chúng được gửi đi. Giả định này có thể không đúng trong thực tế và có thể có thêm phức tạp. Trong phần này, chúng ta dùng giả thiết này để đảm bảo rằng những cái bỏ đi được gửi bằng một bộ xử lý được thực hiện trước khi thông điệp mới được truyền đi, cũng giống như chúng ta giả định trong các thảo luận thực hiện các giao thức snooping. Như chúng ta đã làm trong trường hợp snooping, chúng ta bỏ qua một số chi tiết cần thiết để thực hiện các giao thức liên kết.

186 Chương 4: Các kiến trúc đa xử lý Ví dụ về Directory Protocol Trạng thái chủ yếu của một khối bộ nhớ cache trong một giao thức dựa trên thư mục (Directory-based Protocol) chính xác như trong giao thức snooping và các trạng thái trong thư mục cũng tương tự như cái chúng ta chỉ ra trước đó. Vì vậy chúng ta có thể xuất phát với sơ đồ trạng thái đơn giản mà hiển thị sơ đồ chuyển tiếp trạng thái cho một khối bộ nhớ cache riêng lẻ và sau đó kiểm tra sơ đồ trạng thái đối với mục tương ứng đến từng khối bộ nhớ. Như trong trường hợp snooping, các sơ đồ trạng thái chuyển tiếp này không biểu diễn tất cả các chi tiết của một giao thức gắn kết, tuy nhiên, bộ điều khiển thực tế phụ thuộc nhiều số chi tiết của bộ đa xử lý. Trong phần này chúng ta trình bày các sơ đồ trạng thái cơ bản. Những vấn đề khó khăn trong việc thực hiện các sơ đồ chuyển tiếp trạng thái. Hình 4.15 cho thấy các hoạt động giao thức mà một cache riêng lẻ đáp ứng. Chúng ta sử dụng các ký hiệu giống như trong mục cuối, với yêu cầu đến từ bên ngoài nút được tô màu xám và hành động được in đậm. Việc chuyển tiếp trạng thái đối với một bộ nhớ cache riêng lẻ là do sự đọc nhớ (read miss), viết nhớ (write miss), sự mất hiệu lực và lấy dữ liệu yêu cầu; các hoạt động này thể hiện trong hình Một cache riêng lẻ cũng tạo ra sự read miss, write miss và mất hiệu lực của các thông điệp được gửi đến các thư mục gốc. Read và write miss yêu cầu dữ liệu giá trị trả lời và chờ đợi những sự kiện trả lời trước khi thay đổi trạng thái. Nhận biết khi mất hiệu lực hoàn toàn là một vấn đề riêng biệt và được xử lý riêng biệt. Các hoạt động của sơ đồ chuyển tiếp trạng thái cho một khối bộ nhớ cache trong hình 4.15 căn bản giống trong các trường hợp snooping: Các trạng thái là giống hệt nhau và tác nhân kích thích là gần như giống hệt nhau. Các ghi nhớ hoạt động (write miss operation), được phát quảng bá trên bus (hoặc mạng khác) trong sơ đồ snooping, được thay thế bởi các dữ liệu lấy lệnh và những hoạt động mất hiệu lực được gửi chọn lọc bằng bộ điều khiển thư mục. Cũng giống như các giao thức snooping, bất kỳ khối cache phải có trạng thái riêng trong khi nó được viết và bất kỳ sự chia sẻ khối nào phải được cập nhật trong bộ nhớ. Trong một giao thức dựa trên thư mục, thư mục thực hiện khác một nửa giao thức liên kết. Một thông điệp gửi đến một thư mục gây ra hai loại hành động khác nhau: cập nhật trạng thái thư mục và gửi thông điệp bổ sung để đáp ứng các yêu cầu. Các trạng thái trong thư mục biểu diễn ba trạng thái chuẩn cho một khối, không giống như trong sơ đồ snoopy, tuy nhiên trạng thái thư mục cho biết trạng thái tất cả các bản sao cache của một khối bộ nhớ hơn là cho khối bộ nhớ cache đơn lẻ. Các khối nhớ có thể không được lưu trữ bằng bất kỳ nút nào, lưu trữ tại nhiều nút và có thể đọc được (chia sẻ), hoặc lưu trữ riêng và ghi trong nút một cách chính xác. Ngoài các trạng thái của mỗi khối, các thư mục phải theo dõi các bộ vi xử lý mà có một bản sao của một bộ, chúng ta dùng một bộ gọi là sharers để thực hiện

187 188 Kiến trúc máy tính tiên tiến chức năng này. Trong đa xử lý với ít nhất 64 nút (mỗi nút trong số đó có thể đại diện 2-4 lần như những bộ vi xử lý), việc thiết lập này thường được lưu trữ như một bit vectơ. Trong đa xử lý lớn, các kỹ thuật khác là cần thiết. Thư mục yêu cầu cần phải cập nhật để tạo sharers và cũng đọc bản ghi để sử dụng làm mất hiệu lực. Hình 4.15: Bộ chuyển trạng thái cho một bộ phận riêng lẻ của cache là một hệ thống dựa trên thư mục. Những yêu cầu của bộ xử lý cục bộ được in màu đen và từ thư mục home được in màu xám. Những trường hợp đồng nhất đối với trường hợp snooping và những giao dịch tương tự, với những thứ bỏ đi và trả lời lại những yêu cầu thay thế những write miss trước đây phát quảng bá trên bus. Như chúng ta làm cho snooping điều khiển, chúng ta giả thiết rằng một cố gắng viết một bộ nhớ cache phân chia là xử lý như một hệ thống thông tin. Trong ứng dụng, một giao dịch có thể xử lý một yêu cầu sở hữu hoặc yêu cầu nâng cấp và có thể chuyển quyền sở hữu không yêu cầu khối lấy lệnh bộ nhớ cache. Hình 4.16 cho thấy các hành động thực hiện tại thư mục để đáp ứng với các tin nhắn nhận được. Các thư mục nhận được ba yêu cầu khác nhau: đọc nhớ (read miss), ghi nhớ (write miss) và các dữ liệu ghi lại (data write back). Các tin nhắn được gửi phản ứng của thư mục được in đậm, trong khi việc cập nhật của bản sharers được in nghiêng đậm. Bởi vì tất cả thông điệp kích thích là bên ngoài, tất cả hoạt động này được in màu xám. Giả thiết đơn giản mà chúng ta giả định được là một số hoạt động là không thể phân chia, yêu cầu có giá trị và gửi nó cho một nút khác, thực tế khi thực hiện không thể sử dụng giả định này.

188 Chương 4: Các kiến trúc đa xử lý 189 Hình 4.16: Sơ đồ chuyển dịch trạng thái cho các thư mục có cùng trạng thái và cấu trúc như sơ đồ chuyển dịch cho một cache riêng lẻ. Tất cả các hoạt động là màu xám bởi vì chúng đều do bên ngoài gây ra. Mũi tên in đậm là hoạt động của thư mục đáp ứng yêu cầu. Để hiểu các thư mục hoạt động, hãy xem xét các yêu cầu được nhận và các trạng thái hoạt động. Khi một bộ phận ở trạng thái uncache, các bản sao trong bộ nhớ là giá trị hiện tại, do đó, chỉ yêu cầu có thể cho chặn được. Read miss - Bộ xử lý yêu cầu gửi dữ liệu từ bộ nhớ và yêu cầu chỉ phân chia nút. Trạng thái của khối bị phân chia. Write miss - Bộ xử lý yêu cầu gửi giá trị và phân chia nút. Khối được làm độc quyền để cho biết rằng các bản sao chỉ có giá trị được lưu lại. Sharers cho biết danh tính của chủ sở hữu. Khi khối trong tình trạng phân chia, giá trị bộ nhớ được cập nhật, vì vậy cả hai cùng yêu cầu có thể xảy ra: Read miss - Bộ xử lý yêu cầu gửi dữ liệu từ bộ nhớ và bộ xử lý được yêu cầu thêm vào việc phân chia. Write miss - Bộ xử lý gửi giá trị. Tất cả bộ xử lý trong sharers gửi tin nhắn không có giá trị và sharers chứa sự đồng nhất của bộ xử lý yêu cầu. Tình trạng của khối được làm loại trừ (exclusive).

189 190 Kiến trúc máy tính tiên tiến Khi khối ở trong tình trạng loại trừ, giá trị hiện tại của khối được tổ chức trong bộ nhớ cache của bộ xử lý được xác định bởi các sharers (sở hữu), do đó, có ba yêu cầu của thư mục có thể có: Read miss - Bộ xử lý chủ gửi một dữ liệu bảng tin tìm nạp, mà bởi tình trạng của khối trong chính bộ nhớ cache chuyển đổi phân chia ra và chính nó gửi dữ liệu vào các thư mục, nơi mà nó được ghi vào bộ nhớ và gửi trả lại cho bộ xử lý yêu cầu. Sự đồng nhất của các bộ xử lý yêu cầu được thêm vào sharers, trong đó vẫn còn chứa sự đồng nhất của các bộ xử lý đó là chủ sở hữu (kể từ khi nó vẫn còn có một bản sao có thể đọc được). Data write back - Chủ sở hữu vi xử lý là thay thế khối và do đó phải ghi nó trở lại. Điều này ghi lại bản sao cập nhật bộ nhớ (các thư mục cơ bản trở thành chủ sở hữu). Write miss - Block có một chủ sở hữu mới. Một thông báo được gửi đến chủ sở hữu cũ, gây mất hiệu lực bộ nhớ cache và gửi giá trị cho thư mục, từ đó nó gửi tới yêu cầu bộ xử lý, mà trở thành chủ sở hữu mới. Sharers là sự đồng nhất của chủ sở hữu mới và tình trạng của khối này vẫn còn loại trừ. Sơ đồ chuyển trạng thái trong hình 4.16 là một đơn giản hóa, giống như trong trường hợp cache snooping. Trong trường hợp của một thư mục, cũng như triển khai thực hiện một snooping với một mạng khác ngoài bus. Các giao thức được sử dụng trong thư mục chứa tối ưu đa xử lý. Đặc biệt, trong giao thức này khi read miss hoặc write miss xảy ra cho một khối đó cho sự loại trừ, đầu tiên khối này được gửi đến thư mục tại nút home. Từ đó nó được lưu trữ vào bộ nhớ nhà (home) và cũng được gửi sang nút yêu cầu ban đầu. Trong số các giao thức được sử dụng trong thương mại đa xử lý chuyển dữ liệu từ các nút chủ sở hữu sang nút yêu cầu trực tiếp (cũng như thực hiện ghi trở lại home). Tối ưu hóa như vậy thường phức tạp, tăng khả năng bế tắc và tăng các loại bản tin phải bị xử lý Khái niệm cơ bản về đồng bộ hóa Đồng bộ hóa các cơ chế thường được xây dựng với phần mềm dựa trên phần cứng cung cấp các lệnh đồng bộ hóa. Đối với bộ đa xử lý nhỏ hơn hoặc thấp, khả năng phần cứng chính là một lệnh ngắt đơn, hoặc khả năng lệnh trình tự. Phần mềm đồng bộ hóa các cơ chế sau đó được xây dựng bằng cách sử dụng khả năng này. Trong phần này chúng ta tập trung vào việc thực hiện các khóa và mở khóa các hoạt động đồng bộ hóa. Khóa và mở khóa có thể được dùng để tạo ra chuyển tiếp thẳng (straight forwardly) loại trừ lẫn nhau, cũng như để thực hiện đồng bộ hóa các cơ chế phức tạp hơn.

190 Chương 4: Các kiến trúc đa xử lý 191 Trong bộ xử lý đa năng quy mô lớn hơn hay tình huống cao, đồng bộ hóa có thể trở thành một nút nghẽn cổ chai vì sự cạnh tranh, thêm vào đó là độ trễ có tiềm năng lớn hơn trong bộ đa xử lý Các Primitive phần cứng cơ bản Để thực hiện đồng bộ trong một đa xử lý là một bộ nguyên thủy (primitive) phần cứng với khả năng đọc và nguyên thủy sửa đổi một vị trí bộ nhớ. Nếu không có khả năng như vậy, chi phí xây dựng đồng bộ hóa cơ bản nguyên thủy sẽ quá cao và sẽ tăng khi tăng số lượng bộ xử lý. Có một số công thức thay thế của phần cứng cơ bản nguyên thủy, tất cả đều cung cấp khả năng nguyên thủy đọc và sửa đổi một vị trí, cùng với một số cách để biết đọc và viết được thực hiện nguyên thủy. Những phần cứng nguyên thủy là những khối xây dựng cơ bản được sử dụng để xây dựng một loạt các hoạt động đồng bộ hóa mức người dùng, bao gồm những thứ như ổ khóa và các rào cản. Nhìn chung, kiến trúc sư không mong đợi người dùng sử dụng phần cứng cơ bản nguyên thủy, nhưng thay vì hy vọng rằng những nguyên thủy sẽ được sử dụng bởi các lập trình hệ thống để 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 phần cứng nguyên thủy và chỉ ra làm như thế nào nó có thể được dùng để xây dựng các hoạt động đồng bộ hóa một cách cơ bản. Một điển hình hoạt động để xây dựng các hoạt động đồng bộ hóa là việc trao đổi nguyên tử (atomic exchange), với chuyển giao một giá trị trong thanh ghi một giá trị trong bộ nhớ. Để xem làm thế nào sử dụng điều này để xây dựng một hoạt động đồng bộ hóa cơ bản, giả định rằng chúng ta muốn xây dựng một khóa đơn giản, nơi mà các giá trị 0 được sử dụng để cho biết rằng khóa là miễn phí và 1 được sử dụng để cho biết rằng khóa là không có. Một bộ xử lý sẽ cố gắng để thiết lập các khóa bằng cách thực hiện một cuộc trao đổi là 1 trong một thanh ghi, với bộ nhớ địa chỉ tương ứng với khóa. Giá trị trả về từ các lệnh trao đổi là 1 nếu một số vi xử lý khác đã tuyên bố quyền truy cập là 0 và ngược lại. Trong trường hợp thứ hai, giá trị cũng thay đổi thành 1, ngăn ngừa bất kỳ chuyển đổi cạnh tranh cũng lấy là 0. Ví dụ, hãy xem xét hai bộ xử lý mà mỗi việc chuyển đổi đồng thời: đường đi này bị phá vỡ kể từ khi chính xác một trong những bộ vi xử lý sẽ thực hiện việc trao đổi đầu tiên, trở về 0 và bộ vi xử lý thứ hai sẽ trở lại 1 khi nó trao đổi. Chìa khóa để sử dụng trao đổi (hoặc chuyển đổi - swap) nguyên thủy để thực hiện đồng bộ hóa trong hoạt động này là nguyên tử: chuyển đổi này là không chia tách được (atomic) và hai trao đổi đồng thời sẽ được yêu cầu của cơ chế viết nối tiếp (serialization). Điều đó là không thể đối với hai bộ xử lý cố gắng để đặt biến đồng bộ trong cách này cho cả hai nghĩ rằng họ có đồng thời đặt biến.

191 192 Kiến trúc máy tính tiên tiến Có một số nguyên tử của nguyên thủy (primitive) khác, có thể được sử dụng để thực hiện đồng bộ hóa. Tất cả đều quan trọng mà đọc và cập nhật một giá trị bộ nhớ theo cách như vậy hay không thực hiện hai hoạt động nguyên tử. Một hoạt động, hiện diện trong nhiều bộ đa xử lý cũ hơn, là kiểm tra và cài đặt (test-and-set), trong đó các bài kiểm tra một giá trị và đặt nó nếu giá trị vượt qua các thử nghiệm. Ví dụ, chúng ta có thể xác định một hoạt động mà được thử nghiệm cho 0 và thiết lập giá trị 1, có thể được sử dụng trong một cách thức tương tự như cách chúng ta sử dụng trao đổi nguyên tử. Đồng bộ hóa một nguyên tử nguyên thủy là chu kỳ lấy lệnh và tăng (fetch-and-increment): Nó trả về giá trị của một vị trí bộ nhớ tự động. Thực hiện một hoạt động bộ nhớ đơn nguyên tử đòi hỏi cả một bộ nhớ đọc và viết trong một lệnh đơn (Uninterruptible instruction). Yêu cầu này làm phức tạp việc thực hiện tính nhất quán, kể từ khi phần cứng không thể cho phép bất kỳ hoạt động khác giữa đọc và viết, nhưng không được tắc nghẽn. Một cách khác là để có một cặp lệnh nơi mà lệnh thứ hai trả về giá trị mà từ đó nó có thể được suy luận liệu các cặp lệnh được thực hiện như các lệnh đã được nguyên tử. Các cặp lệnh là có hiệu quả nguyên tử nếu nó xuất hiện như là tất cả các hoạt động khác thực hiện bởi bộ xử lý nào xảy ra trước hoặc sau một cặp. Vì vậy, khi một cặp lệnh là có hiệu quả nguyên tử, không có bộ xử lý khác có thể thay đổi giá trị giữa cặp lệnh. Các cặp lệnh bao gồm một tải đặc biệt gọi là một tải liên kết hoặc tải đã bị khóa và một bộ nhớ đặc biệt gọi là một bộ nhớ có điều kiện. Những lệnh này được sử dụng trong trình tự: nếu nội dung của các vị trí bộ nhớ xác định bởi các liên kết tải được thay đổi trước khi các bộ nhớ có điều kiện đến địa chỉ cùng xảy ra. Nếu bộ xử lý thực hiện chuyển đổi giữa hai lệnh, sau đó các bộ nhớ cũng không có điều kiện. Các bộ nhớ có điều kiện được xác định để trở về 1 nếu nó đã thành công và 0 là ngược lại. Kể từ khi liên kết tải trả về giá trị ban đầu và trở về bộ nhớ có điều kiện 1 chỉ nếu nó thành công, trình tự sau đây thực hiện một cuộc chuyển đổi nguyên tử vào vị trí bộ nhớ được chỉ định bởi các nội dung của R1: try: MOV R3, R4 ;Mov chuyển đổi giá trị LL R2, 0 (R1) ;Tải liên kết SC R3, 0 (R1) ;Bộ nhớ điều kiện BEQZ R3, try ;Nhánh lưu trữ lỗi MOV R4, R2 ;Đặt tải giá trị trong R4 Ở phần cuối của dãy này nội dung của R4 và vị trí bộ nhớ được chỉ định bởi R1 chuyển đổi có tính nguyên tử (bỏ qua bất kỳ hiệu lực từ các nhánh bị chậm).

192 Chương 4: Các kiến trúc đa xử lý 193 Bất cứ lúc nào xử lý xen vào và sửa đổi giá trị trong bộ nhớ giữa lệnh LL và SC, SC trả về 0 trong R3, gây ra các mã chuỗi ký tự để thử lại. Một sự thuận lợi của tải bộ nhớ có điều kiện là nó có thể được sử dụng để xây dựng đồng bộ hóa nguyên thủy khác. Ví dụ: try: LL R2, 0 (R1) ;Tải liên kết DADDUI R3, R2, # 1 ;Gia số SC R3,0(R1) ;Bộ nhớ có điều kiện BEQZ R3, try ;Nhánh không lưu trữ Các lệnh này thường được thực hiện bởi việc theo dõi địa chỉ các quy định trong lệnh LL trong một thanh ghi, thường được gọi là thanh ghi liên kết. Nếu một ngắt xảy ra, hoặc nếu khối cache kết hợp địa chỉ trong thanh ghi liên kết có hiệu lực (ví dụ, bởi một SC khác), thanh ghi liên kết được xóa. Các lệnh SC chỉ đơn giản là kiểm tra địa chỉ của nó phù hợp vào thanh ghi liên kết. Nếu vậy, SC thành công, nếu không, nó không hoàn tất. Kể từ khi bộ nhớ có điều kiện bị lỗi sau khi thử bộ nhớ khác để tải được địa chỉ liên kết hoặc sự ngoại lệ nào, phải được thực hiện trong việc lựa chọn những gì mà lệnh được chèn vào giữa hai lệnh. Đặc biệt, các lệnh thanh ghi đến thanh ghi có thể được phép; nếu không, nó có thể tạo ra các tình huống bế tắc, nơi xử lý không bao giờ có thể hoàn thành SC. Ngoài ra, số lượng các lệnh giữa tải liên kết và bộ nhớ có điều kiện nên thấp để giảm thiểu xác suất các yếu tố không liên quan hoặc một bộ xử lý cạnh tranh gây ra các bộ nhớ có điều kiện để không thường xuyên lỗi Thực hiện khóa (lock) sử dụng gắn kết (coherence) Việc thực hiện đơn giản nhất, mà chúng ta sẽ sử dụng nếu không có sự gắn kết bộ nhớ cache, sẽ giữ các biến khóa trong bộ nhớ. Một bộ xử lý liên tục có thể thử để có được khóa bằng cách sử dụng một hoạt động nguyên tử, quyết định, chuyển đổi và kiểm tra xem việc chuyển đổi trở lại của các khóa là tự do. Để giải phóng các khóa, các bộ xử lý đơn giản chỉ các bộ nhớ giá trị 0 để khóa. Sau đây là trình tự mã để khóa một khóa xoay vòng (spin locks) có địa chỉ ở R1 sử dụng trao đổi nguyên tử: DADDUI R2, R0, # 1 lockit: EXCH R2, 0 (R1) ;Trao đổi nguyên tử BNEZ R2, lockit ;Đã bị khóa Nếu đa xử lý của chúng ta hỗ trợ bộ nhớ cache gắn kết, chúng ta có thể khóa cache bằng cách sử dụng cơ chế gắn kết để duy trì giá trị khóa thuận lợi. Lưu trữ

193 194 Kiến trúc máy tính tiên tiến khóa có hai lợi thế. Trước tiên, nó cho phép một nơi thực hiện quá trình "quay" (cố gắng để thử nghiệm và thu được khóa chặt trong một vòng lặp) có thể được thực hiện trên một bản sao cache của nội vùng chứ không phải là đòi hỏi một bộ nhớ truy cập toàn cầu trên mỗi cố gắng để có được khóa. Ưu điểm thứ hai xuất phát từ quan sát rằng thường có nội vùng trong truy cập khóa. Trong trường hợp này, giá trị khóa có thể nằm trong bộ nhớ cache của bộ xử lý đó, giúp giảm thiểu thời gian để có được khóa. Lấy lợi thế đầu tiên có thể quay về một bản sao cache của nội vùng hơn là tạo ra một yêu cầu bộ nhớ cho từng cố gắng để có được các khóa. Mỗi nỗ lực để trao đổi trong vòng lặp trực tiếp trên đòi hỏi một hoạt động ghi. Nếu nhiều bộ xử lý đang cố gắng để có được khóa, sẽ tạo ra việc ghi. Hầu hết sẽ dẫn đến ghi vào bộ nhớ, vì mỗi bộ vi xử lý đang cố gắng để có được những biến khóa trong một chế độ loại trừ. Vì vậy, chúng ta nên chỉnh sửa thủ tục khóa spin để nó quay bằng cách thực hiện lần đọc trên một bản sao nội vùng của khóa hoàn tất cho đến khi nó thấy rằng khóa có sẵn. Sau đó, cố gắng để có được khóa bằng cách thực hiện một hoạt động chuyển đổi. Một bộ xử lý giữ đọc và thử nghiệm cho đến khi giá trị của đọc chỉ ra rằng khóa được mở khóa. Tất cả quá trình sử dụng một lệnh trao đổi mà đọc giá trị cũ và các lưu trữ 1 vào biến khóa. Thắng sẽ có giá trị 0 và thua sẽ lấy giá trị 1 (thua sẽ tiếp tục đặt biến với giá trị đã bị khóa, nhưng điều đó không quan trọng). Bộ xử lý trúng cuộc thực hiện đoạn mã sau khi khóa và khi kết thúc, lưu trữ 0 vào biến khóa để giải phóng các khóa, rồi bắt đầu cuộc tranh đua trở lại. Dưới đây là đoạn mã (code) để thực hiện các khóa spin này (nhớ là 0 được mở khóa và 1 bị khóa): lockit: LD R2, 0 (R1) ;Tải của khóa BNEZ R2, lockit ;Không có sẵn-spin DADDUI R2, R0, # 1 ;Giá trị tải đã bị khóa EXCH R2, 0 (R1) ;Trao đổi BNEZ R2, lockit ;Nhánh nếu khóa không là 0 Hãy kiểm tra như thế nào "spin lock" đề án sử dụng cơ chế gắn kết bộ nhớ cache. Bảng 4.7 cho thấy các bộ xử lý và bus hoặc nhiều thư mục hoạt động của quá trình cố gắng để khóa một biến bằng cách sử dụng một chuyển đổi nguyên tử. Một khi các bộ xử lý với các bộ nhớ một số 0 thành khóa, tất cả các cache khác là vô hiệu và phải lấy giá trị mới để cập nhật bản sao của chúng về khóa. Một trong những bộ nhớ cache có giá trị mở khóa (0) đầu tiên và thực hiện trao đổi. Khi bộ nhớ cache của bộ xử lý khác thỏa mãn, chúng thấy rằng biến đó đã được khóa, do đó chúng phải quay trở lại kiểm tra và quay vòng (test and spin).

194 Chương 4: Các kiến trúc đa xử lý 195 Bước hoạt động Bộ xử lý P0 Bộ xử lý P1 Bộ xử lý P2 Có khóa Thiết lập khóa thành 0 Quay, kiểm tra nếu khóa = 0 (Mất hiệu lực nhận) Quay, kiểm tra nếu khóa = 0 (Mất hiệu lực nhận) Cơ chế gắn kết của khóa Phân chia Loại trừ (P0) Bus/thư mục Không có Ghi vào biến sự mất hiệu lực của khóa từ P0 Cache miss Cache miss Shared Dịch vụ bus/directory P2 bộ nhớ cache, ghi lại từ P0 (Chờ khi bus/directory bận) Lock = 0 Thực hiện chuyển đổi, trở thành bộ nhớ cache Hoàn tất chuyển đổi và trả về 1 và thiết lập Lock =1 Quay lại, kiểm tra nếu lock = 0 Lock=0 Shared Bộ nhớ cache thỏa mãn P2 Thực hiện chuyển đổi, trở thành bộ nhớ cache Hoàn thành chuyển đổi, trả về 0 và thiết lập Lock = 1 Vào khu vực trọng điểm Shared Loại trừ (P2) Loại trừ (P1) Bộ nhớ cache thỏa mãn P1 Dịch vụ bus/directory P2 bộ nhớ cache, tạo ra sự mất hiệu lực Dịch vụ bus/thư mục P1 bộ nhớ cache, tạo ra việc ghi lại Không có Bảng 4.7: Các bước gắn kết cache và lưu lượng bus trong ba bộ vi xử lý, P0, P1 và P2. Hình này giả định mất hiệu lực gắn kết. P0 bắt đầu với các khóa (bước 1). P0 thoát và mở ra các khóa (bước 2). P1 và P2 tranh đua để xem những lần đọc giá trị mở khóa trong thời gian trao đổi (bước 3-5). P2 giành được và đi vào phần quan trọng (bước 6 và 7), trong khi sự cố gắng của P1 không để nó bắt đầu chờ quay (bước 7 và 8). Trong một hệ thống thực sự, những sự kiện này sẽ mất nhiều hơn 8 xung nhịp ngắn (tick), kể từ khi yêu cầu bus và trả lời mất nhiều thời gian nhỡ hơn. Ví dụ đưa ra một lợi thế của tải các liên kết có điều kiện nguyên thủy: đọc và ghi được một cách rõ ràng tách biệt nhau. Các liên kết tải không cần phải gây ra bất kỳ lưu lượng bus nào. Thực tế này cho phép mã trình tự sau đây đơn giản, trong đó có những đặc điểm tương tự như các phiên bản tối ưu hóa bằng cách sử dụng chuyển đổi (R1 có địa chỉ của khóa, các LL đã thay thế các LD và SC đã thay thế các EXCH):

195 196 Kiến trúc máy tính tiên tiến lockit: LL R2, 0 (R1) ;Tải liên kết BNEZ R2, lockit ;Không có sẵn-spin DADDUI R2, R0, # 1 ;Giá trị đã bị khóa SC R2, 0 (R1) ;Lưu trữ BEQZ R2, lockit ;Nhánh nếu có không bộ nhớ Các nhánh đầu tiên tạo thành vòng quay; các nhánh thứ hai giải quyết các cuộc đua khi hai bộ xử lý có cùng khóa. Mặc dù việc spin lock là đơn giản và thuyết phục, nó gặp khó khăn để xử lý các vi xử lý nhiều vì lưu lượng truyền tạo ra khi khóa được phân phát Giới thiệu tính thống nhất mô hình bộ nhớ Bằng cách "làm thế nào phù hợp" có nghĩa là, khi một bộ xử lý nhìn thấy một giá trị đã được cập nhật bởi bộ xử lý khác? Kể từ khi bộ xử lý giao tiếp thông qua các biến được phân chia (được sử dụng cả cho các giá trị dữ liệu và đồng bộ hóa), tóm lại câu hỏi này: có những gì để một bộ xử lý thực hiện các dữ liệu ghi về bộ xử lý khác? Vì cách duy nhất để "quan sát việc ghi vào bộ xử lý khác" là thông qua lần đọc, câu hỏi sẽ trở thành, những yêu cầu phải thực hành giữa đọc và ghi đến các địa điểm khác nhau của bộ vi xử lý khác nhau? Mặc dù các câu hỏi về cách thức phù hợp bộ nhớ có vẻ đơn giản, như chúng ta có thể thấy với một ví dụ đơn giản. Dưới đây là hai đoạn mã từ các quá trình P1 và P2: P1: A = 0; P2: B = 0; A = 1; B = 1; L1: if (B == 0)...L2: if (A == 0)... Giả sử rằng các quá trình đang chạy trên bộ vi xử lý khác nhau và địa điểm A và B được lưu trữ ban đầu của cả hai bộ xử lý với giá trị ban đầu là 0. Nếu ghi luôn có hiệu lực ngay lập tức và ngay lập tức nhìn thấy bởi các bộ xử lý khác, nó sẽ không thể cho cả hai nếu các báo cáo (có nhãn là L1 và L2) đánh giá điều kiện của chúng là đúng. Nhưng giả sử lại ghi là mất hiệu lực trì hoãn và bộ xử lý được phép tiếp tục trong thời gian chậm trễ này, sau đó nó có thể là cả P1 và P2 đã không thấy mất hiệu lực cho B và A (tương ứng) trước khi chúng cố gắng để đọc các giá trị. Mô hình đơn giản nhất để thống nhất được gọi là bộ nhớ tuần tự thống nhất. Tuần tự thống nhất yêu cầu kết quả thực hiện bất kỳ giống như khi truy cập bộ nhớ thực hiện bởi bộ xử lý từng được lưu giữ theo thứ tự và truy cập giữa các bộ vi xử lý khác nhau đã được tùy tiện xen kẽ. Tuần tự thống nhất loại bỏ khả năng của một

196 Chương 4: Các kiến trúc đa xử lý 197 số thực hiện không rõ ràng trong ví dụ trước đây vì nhiệm vụ phải hoàn thành trước, nếu báo cáo được bắt đầu. Cách đơn giản để thực hiện thống nhất theo trình tự là yêu cầu một bộ xử lý để trì hoãn việc hoàn thành của bất kỳ truy cập bộ nhớ cho đến khi tất cả mất hiệu lực gây ra bởi truy cập được hoàn thành. Tất nhiên, nó cũng không kém phần hiệu quả để trì hoãn việc truy cập bộ nhớ tiếp theo cho đến khi một trong những trang trước được hoàn tất. Hãy nhớ rằng bộ nhớ liên quan đến việc thống nhất hoạt động giữa các biến số khác nhau: hai truy cập phải được lệnh đang thực sự đến các địa điểm bộ nhớ khác nhau. Trong ví dụ, chúng ta phải trì hoãn việc đọc của A hoặc B (A = = 0 hoặc B = = 0) cho đến khi việc ghi trước đó đã hoàn thành (B = 1 hoặc A = 1). Mặc dù tuần tự thống nhất trình bày một mô hình lập trình đơn giản, nó làm giảm hiệu quả tiềm năng, đặc biệt là trong một đa xử lý với một số lượng lớn các bộ xử lý hoặc kết nối chậm trễ, như chúng ta có thể thấy trong ví dụ sau. Ví dụ: Bộ xử lý nơi một ghi nhớ có 50 chu kỳ thành lập quyền sở hữu, 10 chu kỳ cho từng vấn đề mất hiệu lực sau khi quyền sở hữu được thiết lập và 80 chu kỳ cho một mất hiệu lực để hoàn thành và được công nhận khi nó được phân phát. Giả sử bốn bộ vi xử lý khác phân chia một khối bộ nhớ cache, bao lâu một ghi nhớ ngừng chạy bộ xử lý văn bản nếu bộ xử lý được tuần tự phù hợp? Giả sử rằng mất hiệu lực được thừa nhận một cách rõ ràng trước khi bộ điều khiển gắn kết biết rằng chúng được hoàn thành. Giả sử có thể tiếp tục thực hiện sau khi có quyền sở hữu cho các ghi nhớ mà không cần chờ đợi cho mất hiệu lực, bao lâu sẽ ghi? Trả lời: Mỗi khi ghi mất tổng thời gian sở hữu cộng với thời gian để hoàn tất việc không hợp lệ. Kể từ khi không hợp lệ có thể chồng lên nhau, chúng ta chỉ cần xem xét về một điều cuối, mà bắt đầu = 40 chu kỳ sau khi việc sở hữu được thành lập. Do đó tổng thời gian cho ghi là = 170 chu kỳ. Trong so sánh, thời gian sở hữu chỉ 50 chu kỳ. Với việc triển khai thích hợp ghi đệm, nó thậm chí còn có thể tiếp tục trước khi sở hữu được thành lập. Để cung cấp hiệu suất tốt hơn, các nhà nghiên cứu và các kiến trúc sư đã khám phá theo hai con đường khác nhau. Đầu tiên, họ đã phát triển đầy tham vọng rằng việc triển khai tính thống nhất sử dụng tuần tự, nhưng độ trễ - ẩn kỹ thuật để giảm bớt điểm phạt, chúng ta sẽ thảo luận tại mục 4.7. Thứ hai, họ đã phát triển các mô hình bộ nhớ thống nhất cho phép cho phần cứng nhanh hơn. Mô hình này có thể ảnh hưởng đến cách lập trình trong đa xử lý, do đó, trước khi chúng ta thảo luận về các mô hình ít hạn chế hơn này, chúng ta hãy nhìn vào những gì lập trình được trông đợi.

197 198 Kiến trúc máy tính tiên tiến Quan niệm của Lập trình viên (Programmer) Từ quan điểm của lập trình nó có lợi thế là đơn giản. Thách thức là để phát triển một mô hình lập trình đơn giản để giải thích và chưa cho phép thực hiện hiệu suất cao. Một mô hình lập trình như vậy cho phép chúng ta thực hiện có hiệu quả hơn là cho rằng các chương trình được đồng bộ hóa. Một chương trình được đồng bộ khi tất cả truy cập dữ liệu được phân chia được lưu trữ bởi các hoạt động đồng bộ hóa. Một tham chiếu dữ liệu được sắp xếp theo một hoạt động đồng bộ hóa, nếu trong mỗi thực thể việc ghi vào của một biến bởi một bộ xử lý và truy cập vào (đọc hoặc ghi) của biến đó bằng cách xử lý khác được phân cách bởi một cặp hoạt động đồng bộ, một trong những thực thi sau khi ghi bằng bộ xử lý văn bản và một thực hiện trước khi truy cập bằng bộ xử lý thứ hai. Trường hợp các biến có thể được cập nhật mà không cần sắp thứ tự bằng cách đồng bộ hóa dữ liệu được gọi là tốc độ (data race) bởi vì kết quả thực hiện phụ thuộc vào tốc độ tương đối của các bộ vi xử lý và giống như các tốc độ (race) trong thiết kế phần cứng, kết quả là không thể đoán trước. Ví dụ đơn giản, hãy xem xét một biến được đọc và cập nhật bởi hai bộ xử lý khác nhau. Mỗi bộ vi xử lý đọc và cập nhật với một khóa và mở khóa. Rõ ràng, việc ghi vào là tách ra từ đọc bởi bộ xử lý khác của một cặp hoạt động đồng bộ hóa: một mở khóa (sau khi ghi) và một khóa (trước khi đọc). Tất nhiên, nếu hai bộ xử lý đang ghi một biến không có can thiệp đọc, sau đó ghi cũng phải được ngăn cách bởi các hoạt động đồng bộ. Ngay cả với tính thống nhất trình tự, lý luận về chương trình như vậy là rất khó khăn. Các lập trình viên có thể cố gắng để đảm bảo việc sắp thứ tự bằng việc xây dựng cơ chế đồng bộ hóa riêng của chúng, nhưng điều này là vô cùng khó khăn, có thể dẫn đến chương trình bị lỗi và có thể không được hỗ trợ kiến trúc, có nghĩa là chúng có thể không làm việc trong các thế hệ tương lai của bộ đa xử lý. Thay vào đó, hầu hết các lập trình viên sẽ chọn sử dụng đồng bộ hóa các thư viện, đó là chính xác và tối ưu hóa cho đa xử lý và phân loại đồng bộ hóa. Cuối cùng, việc sử dụng các tiêu chuẩn đồng bộ hóa nguyên thủy, đảm bảo rằng ngay cả khi kiến trúc thực hiện một mô hình thống nhất thoải mái hơn so với tuần tự thống nhất, một chương trình đồng bộ sẽ hành xử như thể nếu phần cứng thực hiện nhất quán tuần tự Các khái niệm cơ bản về mô hình nghỉ ngơi nhất quán Ý tưởng chính trong các mô hình nghỉ ngơi thống nhất là cho phép đọc và viết để hoàn tất ra khỏi trật tự, nhưng sử dụng hoạt động đồng bộ hóa để thực thi lệnh,

198 Chương 4: Các kiến trúc đa xử lý 199 do đó, một chương trình đồng bộ hóa vận hành, nếu như bộ xử lý đã được tuần tự phù hợp. Có rất nhiều mô hình nghỉ ngơi được phân loại theo những gì đọc và viết sắp thứ tự cho chúng nghỉ ngơi. Chúng ta xác định sắp thứ tự bởi một tập hợp các luật dạng X Y, có nghĩa là hoạt động X phải hoàn tất trước khi Y hoạt động được thực hiện. Tuần tự thống nhất đòi hỏi phải duy trì tất cả bốn thứ tự có thể có: R W, R R, W R và W W. Các mô hình nghỉ ngơi được định nghĩa bởi bốn tập thứ tự nghỉ ngơi: 1. Nghỉ ngơi của W R thứ tự mang lại một mô hình được gọi là tổng số bộ nhớ được sắp xếp hoặc bộ xử lý thống nhất. Bởi vì thứ tự này vẫn trong việc ghi vào, nhiều chương trình hoạt động theo tuần tự thống nhất hoạt động theo mô hình này, mà không cần đồng bộ hóa bổ sung. 2. Việc nghỉ của các W W thứ tự mang lại mô hình được gọi là thứ tự lưu trữ một phần. 3. Việc nghỉ các R W và R R thứ tự mang lại một loạt các mô hình bao gồm cả thứ tự yếu, sự thống nhất mô hình PowerPC và tính thống nhất phân phát, tùy thuộc vào các chi tiết của những hạn chế và làm thế nào thực thi các hoạt động đồng bộ hóa sắp đặt. Bằng cách làm thư giãn việc sắp thứ tự, bộ vi xử lý có thể có được lợi thế hiệu suất đáng kể. Tuy nhiên, nhiều phức tạp trong các mô hình thống nhất, bao gồm cả những lợi thế và sự phức tạp của việc nghỉ ngơi sắp các thứ tự khác nhau, xác định chính xác những gì nó có nghĩa là hoàn tất việc ghi vào và quyết định khi xử lý có thể nhìn thấy giá trị mà bộ vi xử lý chính nó đã ghi. Để biết thêm thông tin về sự phức tạp, các vấn đề thực hiện và tiềm năng từ các mô hình nghỉ ngơi hiệu quả Nhận xét về các mô hình nhất quán Tại thời điểm hiện tại, nhiều bộ đa xử lý đang được xây dựng hỗ trợ một số loại mô hình nghỉ ngơi nhất quán, thay đổi từ tính thống nhất xử lý. Kể từ khi đồng bộ hóa xử lý thì đặc trưng bộ đa xử lý cao dễ gây lỗi, mong muốn là hầu hết các lập trình viên sẽ sử dụng thư viện đồng bộ hóa chuẩn và sẽ viết các chương trình đồng bộ, làm cho sự lựa chọn của một mô hình thống nhất để lập trình hiệu suất cao hơn. Một quan điểm khác, mà chúng ta thảo luận rộng rãi hơn trong phần kế tiếp, lập luận rằng với suy đoán nhiều lợi thế nhất quán thực hiện có thể đạt được với trình tự xử lý hoặc tính nhất quán. Một phần quan trọng của lập luận này ủng hộ nhất quán xoay quanh vai trò của trình biên dịch và khả năng của mình để tối ưu hóa bộ nhớ truy cập đến các biến có khả năng phân chia, chủ đề này cũng được thảo luận trong phần tiếp theo.

199 200 Kiến trúc máy tính tiên tiến 4.7. Các vấn đề xuyên suốt (Crosscutting issue) Do đặc điểm xác định lại hệ thống đa xử lý (ví dụ, đánh giá hiệu suất, độ trễ của bộ nhớ và tầm quan trọng của khả năng mở rộng), ảnh hưởng đến cả phần cứng và phần mềm. Trong phần này giới thiệu một số ví dụ liên quan tới vấn đề thống nhất bộ nhớ Tối ưu hóa, trình biên dịch và mô hình nhất quán Một nguyên nhân khác để xác định một mô hình cho phù hợp bộ nhớ là để xác định phạm vi của trình biên dịch tối ưu hóa lĩnh vực biên dịch đúng mà có thể được thực hiện chia sẻ dữ liệu. Trong chương trình song song, trừ khi những điểm đồng bộ hóa được xác định rõ ràng và các chương trình được đồng bộ, trình biên dịch không thể chuyển đổi đọc và ghi trong hai mục khác nhau chia sẻ dữ liệu bởi vì những biến đổi như vậy có thể ảnh hưởng đến ngữ nghĩa của chương trình. Điều này ngăn cản thậm chí tối ưu hóa tương đối đơn giản, chẳng hạn như thanh ghi được cấp cho chia sẻ dữ liệu, bởi vì như một quá trình thường là chuyển đổi giữa đọc và viết Sử dụng dự đoán ẩn trễ trong các mô hình nhất quán nghiêm ngặt Như chúng ta đã thấy ở chương 2, sự dự báo có thể được dùng để ẩn độ trễ bộ nhớ (hide memory latency). Nó cũng có thể được sử dụng để ẩn độ trễ phát sinh từ một mô hình thống nhất chặt chẽ, tạo ra nhiều lợi ích của một mô hình bộ nhớ. Ý tưởng chính là dành cho bộ xử lý sử dụng lập lịch động để sắp xếp lại các tham chiếu bộ nhớ, cho phép chúng có thể thực hiện trong trật tự. Thực hiện những tham chiếu bộ nhớ để có thể tạo ra các vi phạm về tính thống nhất trình tự, mà có thể ảnh hưởng đến việc thực hiện các chương trình. Khả năng này tránh bằng cách sử dụng các cam kết bị trì hoãn tính năng của một bộ xử lý dự báo. Giả sử các giao thức dựa trên sự không hợp lệ. Nếu bộ xử lý nhận được một sự không hợp lệ cho một tham chiếu bộ nhớ trước khi tham chiếu bộ nhớ cam kết, sử dụng bộ vi xử lý dự báo phục hồi trở lại trong việc dự báo và khởi động lại với các tham chiếu bộ nhớ có địa chỉ là không hợp lệ. Nếu sắp xếp lại các yêu cầu bộ nhớ bởi vi xử lý mà có thể dẫn đến một kết quả có khác với những gì đã có thể được thấy theo tuần tự thống nhất, bộ vi xử lý sẽ làm lại việc thực hiện. Khóa để sử dụng phương pháp này là bộ vi xử lý chỉ cần đảm bảo rằng kết quả sẽ giống như tất cả các truy cập được hoàn thành theo thứ tự và nó có thể đạt được điều này bằng cách phát hiện khi các kết quả có thể khác nhau. Cách tiếp cận này là thuyết phục bởi vì dự báo sẽ được khởi động lại hiếm khi nó được kích hoạt. Nó sẽ chỉ được kích hoạt khi có sự không đồng bộ truy cập mà thực sự gây ra một cuộc tranh đua.

200 Chương 4: Các kiến trúc đa xử lý 201 Hill [1998] ủng hộ sự kết hợp của tính nhất quán tuần tự hoặc bộ xử lý cùng với thực hiện suy đoán như là mô hình thống nhất của sự lựa chọn. Lý luận của ông có ba phần. Trước tiên, triển khai thực hiện nhất quán tích cực của tuần tự hoặc bộ xử lý thống nhất sẽ đạt được hầu hết các lợi thế của một mô hình. Thứ hai, để thực hiện một bộ xử lý dự báo. Thứ ba, như một cách tiếp cận cho phép lập trình để lý do sử dụng các mô hình lập trình đơn giản của một trong hai tuần tự hoặc thống nhất xử lý. Một câu hỏi là làm thế nào để công nghệ biên dịch thành công sẽ được tối ưu hóa bộ nhớ để tham khảo các biến được phân chia. Tình trạng của công nghệ tối ưu hóa và thực tế là phân chia dữ liệu thường được truy cập thông qua các con trỏ hoặc mảng chỉ số hóa có giới hạn việc sử dụng tối ưu như vậy. Nếu công nghệ này trở thành có sẵn và dẫn đến hiệu suất lợi thế đáng kể, người viết trình biên dịch sẽ tận dụng lợi thế của mô hình lập trình giảm nhẹ hơn Kết luận và sự thực thi của nó Tất cả các bộ đa xử lý sử dụng phân cấp nhiều mức bộ nhớ cache để làm giảm cả hai nhu cầu về kết nối toàn cầu và độ trễ không tìm thấy trong bộ nhớ cache. Nếu bộ nhớ cache cũng cung cấp nhiều loại bao gồm nội dung, mọi cấp của hệ thống phân cấp bộ nhớ cache là một tập hợp từ mức độ các bộ xử lý, sau đó chúng ta có thể sử dụng cấu trúc đa cấp để giảm sự tranh đua giữa lưu lượng kết cấu, xử lý xảy ra và truy cập bộ nhớ cache. Các bộ đa xử lý với nhiều mức bộ nhớ cache thi hành tính năng bao gồm nội dung, mặc dù các bộ đa xử lý gần đây nhỏ hơn cache L1 và kích thước khối khác nhau có đôi khi không được chọn nội dung để thực thi. Hạn chế này cũng được gọi là sở hữu tập con (sub-set property) vì mỗi bộ nhớ cache là một tập hợp con của bộ nhớ cache bên dưới nó trong hệ thống phân cấp. Hãy xem xét một ví dụ hai cấp: bỏ lỡ bất kỳ trong L1 hoặc L2 hoặc truy cập vào tạo ra không có trong L2, nó sẽ được đưa vào cả hai L1 và L2. Tương tự như vậy, không hợp lệ mà lượt truy cập trong L2 phải được gửi đến L1, nơi mà nó sẽ gây ra các khối để được vô hiệu nếu nó tồn tại. Việc nắm bắt được những gì sẽ xảy ra khi các kích thước khối L1 và L2 là khác nhau. Chọn kích thước khối khác nhau là khá hợp lý, vì sẽ được L2 lớn hơn nhiều và có một thành phần độ trễ lâu hơn nữa, do đó muốn sử dụng một kích thước khối lớn hơn. Điều gì xảy ra để tự động đưa vào khi các kích thước khối khác nhau? Một khối trong L2 yêu cầu nhiều khối trong L1 và không có trong L2 là nguyên nhân sự thay thế dữ liệu tương đương với nhiều khối L1. Ví dụ, nếu kích thước khối L2 là bốn lần so với L1, thì sau đó một bỏ nhỡ trong L2 sẽ thay thế tương đương với bốn khối L1. Chúng ta hãy xem xét một ví dụ chi tiết.

201 202 Kiến trúc máy tính tiên tiến Ví dụ: Giả sử rằng L2 có kích thước khối bốn lần so với L1. Hiển thị như thế nào bỏ nhỡ cho một địa chỉ gây ra một sự thay thế trong L1 và L2 có thể dẫn đến vi phạm của tính năng được đưa vào. Trả lời: Giả sử rằng L1 và L2 được ánh xạ trực tiếp và kích thước khối L1 là b byte và kích thước khối của L2 là 4b byte. Giả sử L1 chứa hai khối có địa chỉ bắt đầu từ x và x + b và x mode 4b = 0, có nghĩa là x cũng là địa chỉ bắt đầu của một khối trong L2, sau đó là một khối trong L2 chứa L1 khối x, x + b, x + 2b và x + 3b. Giả sử các bộ xử lý tạo ra một điểm chuẩn đến khối y, trong cả hai biểu đồ cho các khối có chứa x. Kể từ khi bị mất L2, nó lấy lệnh 4b byte và thay thế các khối có chứa x, x + b, x + 2b và x + 3b, trong khi L1 có b byte và thay thế các khối chứa x. Kể từ L1 vẫn còn chứa x + b. Để duy trì sự bao hàm với nhiều kích cỡ khối, chúng ta phải dò những mức độ phân cấp cao hơn khi một sự thế chỗ được hoàn thành tại mức độ thấp để đảm bảo rằng bất cứ từ (nhớ) nào được thay thế ở mức độ thấp hơn không hợp lệ ở bộ nhớ cache mức độ cao hơn; những mức độ kết hợp khác nhau tạo ra cùng loại vấn đề Kiến trúc đa xử lý cụ thể Sun T1 T1 là một bộ đa xử lý đa lõi được giới thiệu với Sun vào năm 2005 như là một bộ xử lý chủ. Điều làm nên sự thu hút của T1 là hầu như toàn bộ tập trung vào khai thác khả năng thực hiện luồng song song (TLP) hơn là khả năng thực hiện lệnh song song (ILP). Thật vậy, nó chỉ là màn hình nền đa phát hoặc là bộ vi xử lý chủ đã biết trong hơn 5 năm qua. Thay vì tập trung vào ILP, T1 đặt tất cả sự chú ý vào TLP, sử dụng cả đa lõi và đa mạch để sản xuất lưu lượng thông tin. Mỗi bộ xử lý T1 chứa 8 lõi xử lý, mỗi lõi hỗ trợ 4 luồng. Mỗi lõi xử lý bao gồm một bộ 6 tầng đơn, một ống dẫn đơn phát (một ống dẫn RISC 5 tầng chuẩn, với một tầng được thêm vào để chuyển mạch luồng). T1 sử dụng đa luồng, chuyển đến một luồng mới trên mỗi chu trình xung và những luồng đó thì rảnh bởi vì chúng đang đợi do một ống dẫn bị trễ hay bộ nhớ cache bị nhỡ đã được thông qua trong lập lịch. Bộ xử lý chỉ rảnh rỗi khi tất cả 4 luồng rảnh hoặc bị đứng. Cả hai việc tải và phân nhánh đều chịu một sự trì hoãn 3 chu trình, chỉ có thể được che giấu bởi những luồng khác. Một bộ đơn vị chức năng dấu chấm động được chia ra bởi 8 lõi, vì hiệu năng của dấu chấm động thì không là một điểm tập trung đối với T1. Hình 4.17 trình bày tổ chức của bộ xử lý T1. Các lõi truy xuất 4 mức độ 2 bộ nhớ cache qua một chuyển mạch thanh ngang, cũng cung cấp việc truy xuất tới đơn vị chức năng dấu chấm động được chia sẻ. Sự dính liền nhau thì bắt buộc giữa các bộ nhớ cache L1 bởi một thư mục liên kết với mỗi khối bộ nhớ L2. Thư mục hoạt động một cách tương tự mà chúng ta đã thảo luận ở mục 4.4, nhưng nó được sử

202 Chương 4: Các kiến trúc đa xử lý 203 dụng để theo dõi các bộ nhớ L1 có những bản sao của khối L2. Bằng cách kết hợp mỗi bộ nhớ cache L2 với một ngân hàng bộ nhớ riêng biệt và đặc tính tập con bắt buộc, T1 có thể đặt thư mục tại L2 hơn là tại bộ nhớ, cái mà làm giảm thư mục phần đầu (overhead). Bởi vì bộ nhớ dữ liệu cache L1 thì ghi thẳng, chỉ có những thông báo không hợp lệ được đòi hỏi; dữ liệu có thể luôn luôn được truy lục từ bộ nhớ L2. Đặc điểm Bộ đa xử lý và hỗ trợ đa luồng Cấu trúc đường ống Bộ nhớ cache L1 Bộ nhớ cache L2 Cài đặt đầu tiên Sun T1 8 lõi trên mỗi chip, 4 luồng trên mỗi lõi. Lập lịch 5 luồng. Một đơn vị chức năng dấu chấm động đã chia cho 8 lõi. Chỉ hỗ trợ trên chip đa xử lý. Đơn giản, có thứ tự, 6 đường ống dẫn sâu với độ trì hoãn 3 chu kỳ cho việc tải và phân nhánh. 16 KB lệnh, 8 KB dữ liệu. 64 byte kích cỡ khối. Việc nhớ L2 là 23 chu kỳ, giả thiết không có bộ nhớ kết hợp. 4 bộ nhớ L2 phân biệt, mỗi 750 KB và sự kết hợp với một băng bộ nhớ. 64 byte kích cỡ khối. Bộ nhớ chính là 110 chu trình xung, giả thiết không có bộ nhớ kết hợp. Bộ xử lý 90 nm; tốc độ xung nhịp tối đa là 1,2 GHz; nguồn điện 79 W; 300 M transistor, 379 mm Hiệu suất T1 Bảng 4.8: Tóm tắt bộ xử lý T1. Chúng ta nhìn thấy hiệu suất của T1 sử dụng 3 điểm chuẩn: TPC-C, SPECJBB (the SPEC Java Business Benchmark) và SPECWeb99. Chuẩn SPECWeb99 chạy trên một phiên bản T1 có 4 lõi vì nó không thể định kích cỡ để sử dụng 32 luồng đầy đủ của bộ xử lý 8 lõi, 2 chuẩn khác thì chạy với mỗi 8 lõi và 4 luồng cho toàn bộ 32 luồng. Chúng ta bắt đầu bằng cách nhìn vào sự hiệu quả của đa luồng dựa trên hiệu suất của hệ thống bộ nhớ khi chạy trong luồng đơn trái ngược với chế độ đa luồng. Hình 4.18 trình bày tính tương đối tăng lên về tỉ lệ nhỡ và quan sát độ trễ nhỡ khi thực thi với một luồng trên 1 lõi trái ngược với 4 luồng trên 1 lõi đối với TPC-C. Cả tỉ lệ nhỡ và độ trễ nhỡ tăng, do sự tranh chấp tăng lên trong hệ thống bộ nhớ. Sự tăng nhỏ một cách tương đối trong độ trễ nhỡ chỉ định rằng hệ thống bộ nhớ vẫn có công suất vô ích. Như chúng ta đã mô tả trong phần trước, hiệu năng của tải làm việc đa xử lý phụ thuộc một cách mật thiết vào hệ thống bộ nhớ và mối tương tác với những ứng dụng.

203 204 Kiến trúc máy tính tiên tiến Hình 4.17: Bộ xử lý T1. Mỗi lõi hỗ trợ 4 luồng và có những bộ nhớ cache mức 1 riêng của nó (16 KB cho lệnh và 8 KB cho dữ liệu). Bộ nhớ mức 2 tổng toàn bộ là 3 MB thì có 12 cách kết hợp hiệu quả. Bộ nhớ cache xen kẽ bởi những dòng cache 64-byte. Đối với T1, cả hai kích cỡ bộ nhớ L2 và kích cỡ khối đều là những thông số quan trọng. Hình 4.19 trình bày kết quả tốc độ nhỡ từ việc biến đổi kích cỡ bộ nhớ L2 3 MB và bằng cách giảm kích cỡ khối xuống 32 byte. Dữ liệu chỉ ra rõ ràng một ưu điểm quan trọng của L2 là 3 MB trái ngược với 1,5 MB, những cải thiện rộng hơn có thể tăng lên từ L2 là 6 MB. Sự lựa chọn kích cỡ khối 64 byte làm giảm tốc độ nhớ nhưng ít chú ý hơn một nhân tố của 2. Do đó, việc sử dụng kích cỡ khối lớn T1 sinh ra nhiều lưu lượng bộ nhớ hơn. Điều này có một tác động hiệu suất quan trọng phụ thuộc vào đặc điểm của hệ thống bộ nhớ.

204 Chương 4: Các kiến trúc đa xử lý 205 Như chúng ta đã đề cập trước đây, có một vài bộ nhớ không kết hợp từ đa luồng. Kích cỡ bộ nhớ và kích cỡ khối có ảnh hưởng tới bộ nhớ không kết hợp tại hệ thống bộ nhớ như thế nào? Hình 4.20 trình bày hệ quả về độ trễ nhỡ của bộ nhớ L2 dưới những sự biến đổi, giống nhau như chúng ta đã thấy trong hình Như chúng ta có thể thấy, hoặc là bộ nhớ 3 MB hoặc là bộ nhớ 6 MB, kích cỡ khối lớn hơn có kết quả trong một thời gian nhỡ của bộ nhớ L2 thì nhỏ hơn. Hình 4.18: Sự thay đổi tương quan trong tốc độ nhỡ và độ trễ nhỡ khi thực thi với 1 luồng trên mỗi lõi trái ngược với 4 luồng trên một lõi đối với chuẩn TPC-C. Độ trễ là thời gian hiện tại để trở về dữ liệu được yêu cầu sau một lần nhỡ. Trong trường hợp 4 luồng, việc thực thi của những luồng khác có thể che giấu nhiều ứng dụng trễ này một cách tiềm ẩn. Hình 4.19: Sự chuyển đổi trong tốc độ nhớ L2 với sự biến đổi trong kích cỡ bộ nhớ cache và kích cỡ khối. Cả hai TPC-C và SPECJBB chạy với 8 lõi và 4 luồng mỗi lõi.

205 206 Kiến trúc máy tính tiên tiến Hình 4.20: Sự chuyển đổi trong độ trễ nhỡ của bộ nhớ L2 khi kích cỡ bộ nhớ và kích cỡ khối bị chuyển. Mặc dù TPC-C có một tốc độ nhỡ cao hơn nhưng sự nhỡ lỗi của nó chỉ cao hơn một ít. Điều này là do SPECJBB có một tốc độ nhỡ lỗi cao hơn, yêu cầu những đường bộ nhớ L2 được ghi sau với tần số cao Hiệu suất toàn phần Bảng 4.9 trình bày mỗi luồng và mỗi lõi CPI, các lệnh ảnh hưởng tốt trên mỗi xung đồng hồ (IPC) đối với chip 8-bộ xử lý. Bởi vì T1 là một bộ xử lý 5 luồng với 4 luồng trên mỗi lõi, đầy đủ CPI có hiệu quả hoàn hảo trên mỗi luồng là 4, vì điều đó có nghĩa rằng mỗi luồng tiêu thụ một chu trình ngoài 4. CPI lý tưởng trên mỗi lõi là 1. IPC có hiệu lực cho T1 là chia 8 bởi mỗi lõi CPI. Chuẩn Mỗi luồng CPI Mỗi lõi CPI Hiệu lực CPI cho 8 lõi Hiệu lực IPC cho 8 lõi TPC-C 7,2 1,8 0,225 4,4 SPECJBB 5,6 1,40 0,175 5,7 SPECWeb99 6,6 1,65 0,206 4,8 Bảng 4.9: Mỗi luồng CPI, mỗi lõi CPI, hiệu lực 8 lõi CPI và hiệu lực IPC (đảo của CPI) đối với bộ xử lý T1 8 lõi. Mới nhìn qua, một người có thể phản ứng rằng T1 thì không có hiệu quả, vì thông lượng có hiệu quả là giữa 56% và 71% của sự hoàn hảo trên 3 mốc chuẩn này. Những bộ xử lý như Itanium 2 (đếm transistor cao hơn, nguồn điện nhiều hơn, khu vực silic so sánh được) sẽ cần đạt được thông lượng chỉ thị không tin cậy đang duy trì 4,5-4,7 những lệnh trên mỗi xung nhịp, tốt hơn là gấp đôi IPC được chấp nhận. Nó xuất hiện khá rõ, một sự tiếp cận đa lõi là một sự thay thế tốt hơn nhiều một bộ xử lý rộng đơn lẻ. Khu vực con kế tiếp đề cập đến một vài sự so sánh hiệu suất giữa những bộ xử lý đa lõi.

206 Chương 4: Các kiến trúc đa xử lý 207 Hình 4.21: Phá vỡ trạng thái trên một luồng trung bình. Thực thi những chỉ định luồng phát ra một lệnh trong chu trình đó. Sẵn sàng nhưng không được chọn nghĩa là nó có thể phát ra, nhưng luồng khác đã được chọn và không sẵn sàng chỉ định rằng luồng đang đợi hoàn thành một sự kiện (ví dụ, một sự trì hoãn đường ống hoặc bộ nhớ nhỡ). Hình 4.22: Sự phá vỡ những nguyên nhân đối với một luồng không sẵn sàng. Sự cộng tác với loại khác rất đa dạng. Trong TPC-C, bộ đệm cất giữ đầy là sự cộng tác lớn nhất; trong SPEC-JBB. Bằng cách nhìn vào hành vi của một luồng trung bình, chúng ta có thể hiểu sự tương tác giữa đa luồng và bộ xử lý song song. Hình 4.21 trình bày tỉ lệ phần trăm

207 208 Kiến trúc máy tính tiên tiến của những chu trình vì một luồng thực thi, sẵn sàng nhưng không thực thi. Nhớ rằng không sẵn sàng không hàm ý rằng lõi với luồng đó đã chết, chỉ khi nào tất cả 4 luồng không sẵn sàng hoạt động thì lõi sẽ chết. Những luồng có thể không sẵn sàng vì bộ nhớ cache nhỡ, trì hoãn đường ống (nảy sinh ra từ những lệnh trì hoãn dài như phân nhánh, tải, dấu chấm động, hoặc nhân/chia số nguyên) và một sự đa dạng của những hiệu quả nhỏ hơn. Hình 4.22 trình bày tần số tương đối của những nguyên nhân khác nhau này. Hiệu quả bộ nhớ thì chịu trách nhiệm cho luồng không sẵn sàng hoạt động từ 50% đến 75% thời gian, với lệnh L1 nhỡ, dữ liệu L1 nhỡ và L2 nhỡ đóng góp đều nhau. Sự trì hoãn tiềm tàng từ đường ống (gọi là trì hoãn đường ống ) thì hầu như gay gắt trong SPECJBB và có thể nảy sinh từ tần số nhánh cao hơn của nó Hiệu suất của những bộ xử lý đa lõi trên chuẩn SPEC Trong số những bộ xử lý gần đây, T1 được mô tả duy nhất bằng cách tập trung vào khả năng thực hiện luồng song song trái ngược với khả năng thực hiện lệnh song song. Nó sử dụng đa luồng để đạt được hiệu suất từ một đường ống đơn RISC và sử dụng đa xử lý với 8 lõi trên một die để đạt được thông lượng cao cho những ứng dụng máy chủ. Trái ngược, dual-core Power5, Opteron và Pentium D sử dụng cả hai đa phát và đa lõi. Dĩ nhiên, việc khai thác ILP quan trọng đòi hỏi nhiều bộ xử lý lớn hơn, với kết quả là lõi ít hơn thích hợp trên một chip trong sự so sánh với T1. Bảng 4.10 tóm tắt đặc điểm của những chip đa lõi này. Thêm vào đó sự khác nhau nhấn mạnh ở ILP ngược với TLP, có một vài sự khác nhau cơ bản khác trong những bản thiết kế. Quan trọng nhất là: Có những điểm khác biệt quan trọng trong việc hỗ trợ dấu chấm động và hiệu suất. Power5 đặt một điểm nhấn mạnh chính vào hiệu suất dấu chấm động, Opteron và Pentium cấp phát những nguồn tài nguyên quan trọng, còn T1 hầu như bỏ qua nó. Kết quả là, Sun cung cấp bất kỳ kết quả chuẩn cho những ứng dụng dấu chấm động. Một sự so sánh bao gồm chương trình số nguyên sẽ không cân bằng với 3 bộ xử lý gồm phần cứng dấu chấm động quan trọng (và chi phí silic, nguồn điện kết hợp với nó). Ngược lại, một sự so sánh chỉ sử dụng những ứng dụng dấu chấm động sẽ không cân bằng với T1. Sự mở rộng bộ đa xử lý của các hệ thống này khác và điều đó ảnh hưởng tới bản thiết kế hệ thống bộ nhớ và việc sử dụng những giao diện bên ngoài. Power5 được thiết kế cho sự mở rộng nhất. Bản thiết kế Pentium và Opteron đề cập đến sự hỗ trợ đa xử lý có giới hạn. T1 thì không mở rộng hệ thống lớn hơn.

208 Chương 4: Các kiến trúc đa xử lý 209 Có những điểm khác nhau quan trọng trong sự tiêu thụ hệ thống bộ nhớ và băng thông bộ nhớ sẵn có. Đối với chuẩn với tốc độ nhỡ bộ nhớ cao, như TPC-C và những chương trình tương tự, những bộ xử lý với băng thông bộ nhớ lớn hơn có một ưu điểm quan trọng. Đặc điểm SUN T1 AMD Opteron Intel Pentium D IBM Power5 Lõi Lệnh phát trên mỗi xung trên mỗi lõi Đa luồng Tốt-nhỏ Không SMT SMT Những bộ nhớ cache L1 I/D bằng KB trên mỗi lõi L2 trên mỗi lõi/đã chia L3 (off-chip) 16/8 3 MB đã chia 64/64 1 MB/lõi 12/16 1MB/lõi 64/32 L2: 1,9 MB đã chia L3: 36 MB Băng thông bộ nhớ cao nhất (DDR2 DRAMs) 34,4 GB/s 8,6 GB/s 4,3 GB/s 17,2 GB/s Đỉnh MIPS FLOPS (w.sse) (w.SSE) Tốc độ xung (GHz) 1,2 2,4 3,2 1,9 Bộ đếm bán dẫn (M) Kích cỡ Die (mm 2 ) Nguồn điện (W) Bảng 4.10: Tóm tắt những đặc điểm và đặc trưng tiêu biểu của 4 bộ xử lý đa lõi. Tuy nhiên, đưa ra tính quan trọng của sự được mất giữa bản thiết kế của trung tâm ILP và trung tâm TLP, nó sẽ có ích để xác định số lượng sự khác nhau giữa các hiệu suất tốt như là hiệu quả của phương pháp tiếp cận. Hình 4.23 trình bày hiệu suất của 4 bộ xử lý đa lõi sử dụng chuẩn CPU SPECRate, chuẩn doanh nghiệp Java SPECJBB2005, chuẩn máy chủ SPECWeb05 và một TPC-C giống như chuẩn. Hình 4.23 trình bày thước đo hiệu quả về mặt hiệu năng trên mỗi đơn vị khu vực die và mỗi watt cho 4 bộ xử lý dual-core, với những kết quả chuẩn hóa đo lường trên Pentium D. Điểm khác biệt rõ ràng nhất là ưu điểm đáng kể về mặt hiệu năng/watt đối với bộ xử lý Sun T1 trên TPC-C và chuẩn SPECJBB05. Những số đo này đã mô tả một cách rõ ràng về những ứng dụng đa luồng, một phương pháp tiếp cận TLP có thể là hiệu quả mạnh hơn phương pháp tiếp cận chuyên sâu ILP. Đây là dấu hiệu mạnh nhất để ghi nhận rằng tuyến đường TLP có thể cung cấp cách làm tăng hiệu năng trong một mô hình hiệu quả mạnh.

209 210 Kiến trúc máy tính tiên tiến Hình 4.23: Bốn bộ xử lý dual-core trình bày hiệu năng của chúng trên những chuẩn SPEC khác nhau và chuẩn TPC-C. Tất cả đều được chuẩn hóa Pentium D. Một vài kết quả là những dự đoán từ những cấu hình lớn hơn (ví dụ: 4 lõi và 2 bộ xử lý, tốt hơn là 2 lõi và 1 bộ xử lý), bao gồm kết quả Opteron SPECJBB2005, kết quả Power5 SPECWeb05 và kết quả TPC-C đối với Power5, Opteron và Pentium D. Tại thời gian hiện hành, Sun đã từ chối đưa ra kết quả SPECRate đối với số nguyên hoặc thích hợp FP. Hình 4.24: Hiệu quả hiệu năng trên SPECRate cho 4 bộ xử lý dual-core, chuẩn hóa theo hệ metric Pentium D Những vấn đề cần lưu ý Lưu ý 1: Việc đo lường hiệu năng của những bộ đa xử lý bằng cách tăng tốc độ tuyến tính hay thời gian thực thi

210 Chương 4: Các kiến trúc đa xử lý 211 Câu hỏi đầu tiên là khả năng thành công của những bộ xử lý được định tỉ lệ: một chương trình cải thiện hiệu năng để cân bằng 100 Intel 486 có thể chậm hơn loại tuần tự trên Pentium 4. Đặc biệt cẩn thận với những chương trình tăng cường dấu chấm động, xử lý những yếu tố không có phần cứng hỗ trợ có thể định tỉ lệ nhưng có hiệu năng tập hợp kém. Việc so sánh số lần thực thi như ta so sánh những giải thuật tốt nhất trên mỗi máy tính. So sánh đoạn mã giống nhau trên 2 máy tính dường như đúng, chương trình song song trên một bộ xử lý duy nhất có thể chậm hơn so với loại tuần tự. Việc phát triển một chương trình song song sẽ thỉnh thoảng dẫn đến những cải thiện giải thuật, để so sánh chương trình tuần tự được biết nhiều nhất trước đây với đoạn mã song song. Để phản ánh điều này, thuật ngữ tăng tốc độ tương đối (cùng chương trình) và tăng tốc độ thật (chương trình tốt nhất) thì thỉnh thoảng được sử dụng. Những kết quả đó gợi ý hiệu năng siêu tuyến tính (superlinear), khi một chương trình trên n bộ xử lý nhanh hơn n lần bộ xử lý duy nhất tương đương, có thể chỉ định rằng sự so sánh là không cân bằng, mặc dù có những trường hợp mà ở đó tăng tốc độ siêu tuyến tính thực đã được va chạm. Ví dụ, một vài ứng dụng khoa học đạt được tốc độ siêu tuyến tính một cách đều đặn vì sự tăng lên nhỏ trong bộ đếm xử lý (2, hoặc 4, hoặc 8, hoặc 16). Tóm lại, so sánh tốc độ 2 bộ đa xử lý khác nhau không cho chúng ta bất cứ điều gì về hiệu năng tương đối của những bộ đa xử lý. Thậm chí so sánh 2 giải thuật khác nhau trên bộ đa xử lý giống nhau đòi hỏi phải tinh tế, vì chúng ta phải sử dụng tốc độ thật, hơn tốc độ tương đối, để đạt được sự so sánh hợp lệ Lưu ý 2: Luật Amdahl không ứng dụng cho máy tính song song Vào năm 1987, người dẫn đầu tổ chức nghiên cứu đã khẳng định rằng luật Amdahl (xem mục 1.9) đã bị phá vỡ bởi bộ đa xử lý MIMD. Câu phát biểu này có nghĩa thật khó, tuy nhiên, luật đã được đảo lộn đối với những máy tính song song; phần không chú ý của chương trình sẽ vẫn giới hạn hiệu năng. Một kết luận hiển nhiên hợp lý có thể được vẽ tại điểm này là những nỗ lực đã tiêu dùng hết vào việc đạt được tốc độ xử lý song song cao thì lãng phí, trừ khi nó được đi cùng bởi những sự hoàn thành trong tốc độ xử lý tuần tự của cùng cường độ. Một sự thông dịch của luật là vì những phần của mỗi chương trình phải có tuần tự, có một giới hạn lợi ích kinh tế của những bộ xử lý. Bằng cách trình bày sự tăng tốc độ tuyến tính với bộ xử lý, sự thông dịch này của luật Amdahl được bác bỏ. Căn bản của lời phát biểu này là luật Amdahl đã khắc phục việc sử dụng tăng tốc độ đã định tỉ lệ. Những nhà nghiên cứu đã định tỉ lệ chuẩn để có một kích cỡ bộ dữ liệu lớn lần, được so sánh với bộ xử lý duy nhất và số lần thực thi

211 212 Kiến trúc máy tính tiên tiến song song của chuẩn đã định tỉ lệ. Đối với những giải thuật riêng biệt, phần tuần tự của chương trình là hằng số độc lập về kích cỡ đặt vào và sự ngưng lại song song một cách đầy đủ - vì thế, tăng tốc độ tuyến tính với bộ xử lý. Bởi vì thời gian chạy phát triển nhanh hơn tuyến tính, chương trình chạy lâu hơn sau khi định tỉ lệ, ngay cả với bộ xử lý. Việc tăng tốc độ giả sử rằng tỉ lệ dữ liệu đầu vào không giống nhau như tốc độ thực và báo cáo nó như thể nó làm sai lệch. Vì những chuẩn song song thường chạy trên những bộ đa xử lý kích cỡ khác nhau, thật là quan trọng để xác định loại tỉ lệ ứng dụng nào được cho phép và tỉ lệ đó nên được làm như thế nào. Mặc dù kích cỡ dữ liệu định tỉ lệ đơn giản với bộ đếm xử lý thì hiếm khi thích hợp với nhau, giả sử kích cỡ cho bộ xử lý lớn hơn thường không thích hợp, vì với bộ xử lý lớn hơn sẽ chạy trên một loại ứng dụng lớn hơn hoặc chi tiết hơn Lưu ý 3: Tốc độ tuyến tính được cần để tạo chi phí hiệu quả những bộ đa xử lý Nó được thừa nhận một cách rộng rãi rằng lợi nhuận chính của tính toán song song là để cung cấp một thời gian ngắn hơn để giải quyết hơn bộ đơn xử lý nhanh nhất. Chi phí không chỉ là một chức năng của bộ đếm xử lý mà còn phụ thuộc vào bộ nhớ, I/O và thủ tục bổ sung của hệ thống (hộp, cung cấp nguồn điện, sự nối kết với nhau ). Hiệu lực của bộ nhớ bao gồm trong chi phí hệ thống được chỉ ra bởi Wood và Hill [1995]. Chúng ta sử dụng một ví dụ dựa trên dữ liệu gần đây TPC-C và chuẩn SPECRate. Hình 4.25 trình bày tốc độ đối với TPC-C, SPECintRate và SPECfpRate trên máy chủ IBM bộ đa xử lý p5 được cấu hình với 4 đến 64 bộ xử lý. Hình trình bày rằng chỉ TPC-C đạt được sự tăng tốc độ tốt hơn. Đối với SPECintRate và SPECfpRate, tốc độ ít tuyến tính hơn, nhưng hao phí, vì không như TPC-C số lượng bộ nhớ chính và đĩa được yêu cầu cả hai tỉ lệ ít hơn. Như hình 4.26 trình bày, những bộ đếm xử lý lớn hơn có thể hiệu lực chi phí hơn cấu hình 4 bộ xử lý. Trong tương lai, khi chi phí của những bộ đa xử lý giảm so với chi phí hỗ trợ cơ sở hạ tầng (tủ, nguồn cấp điện, quạt ), hiệu năng/tỉ số chi phí của cấu hình bộ xử lý lớn hơn sẽ cải thiện nhiều hơn. Trong việc so sánh hiệu năng chi phí của 2 máy tính, chúng ta phải chắc chắn chứa sự ước định chính xác cả hai tổng chi phí hệ thống và hiệu năng đạt được. Đối với nhiều ứng dụng nhưng với nhu cầu bộ nhớ lớn hơn, như một sự so sánh có thể tăng sức hấp dẫn của việc sử dụng bộ đa xử lý một cách đột ngột.

212 Chương 4: Các kiến trúc đa xử lý 213 Hình 4.25: Tăng tốc độ cho 3 chuẩn trên bộ đa xử lý p5 máy chủ IBM khi cấu hình với 4, 8, 16, 32 và 64 bộ xử lý. Đường gạch nối trình bày sự tăng tốc độ tuyến tính Lưu ý 4: Sự thay đổi tỉ lệ thì hầu như tự do Mục đích của máy tính song song có thể thay đổi tỉ lệ là tiêu điểm của nhiều nghiên cứu và một phần quan trọng của sự phát triển bộ đa xử lý từ giữa thập niên 1980 đến những năm cuối thập niên Trong nửa thời gian đầu, nó được tổ chức rộng rãi, bạn có thể thành lập sự thay đổi tỉ lệ trong bộ đa xử lý và sau đó đơn giản cung cấp bộ xử lý tại bất cứ điểm nào trên phạm vi từ nhỏ đến lớn số bộ xử lý không hy sinh hiệu lực chi phí. Khó khăn là bộ đa xử lý với phạm vi những bộ đếm xử lý lớn hơn đòi hỏi sự đầu tư nhiều hơn (cả về tiền và thời gian thiết kế) trong mạng viễn thông bên trong bộ xử lý, thường phải thỏa mãn các vấn đề như: hỗ trợ hệ thống hoạt động, độ tin cậy và cấu hình lại. Sự thay đổi tỉ lệ cũng tự do trong phần mềm: để hình thành những ứng dụng phần mềm, phạm vi đòi hỏi nhiều sự chú ý để cân bằng tải, khu vực, sự tranh chấp các tài nguyên đã được chia sẻ và những phần chương trình liên tục (hoặc song song từng phần). Sự thay đổi đạt được đối với những ứng dụng thực, khi chống đối với những kernel nhỏ, qua những nhân tố nhiều hơn 5 trong bộ đếm xử lý, là một yêu cầu chính. Trong tương lai, những phương pháp tiếp cận lập trình mới, công nghệ trình biên dịch tốt hơn và công cụ phân tích hiệu năng có thể giúp cho các vấn đề trước đây trở nên tốt hơn so với 30 năm trước.

213 214 Kiến trúc máy tính tiên tiến Hình 4.26: Hiệu năng/chi phí liên quan với hệ thống 4-xử lý đối với 3 chuẩn chạy trên một bộ đa xử lý p5 server IBM chứa từ 4 đến 64 bộ xử lý với những bộ đếm xử lý lớn hơn, có thể có hiệu quả chi phí bằng cấu hình 4-xử lý. Đối với TPC-C những cấu hình đó được sử dụng trong việc chạy chính thức, nghĩa là đĩa và bộ nhớ định tỉ lệ với bộ đếm xử lý và một máy 64-bộ xử lý thì đắt gấp hai lần loại 32-bộ xử lý. Ngược lại, đĩa và bộ nhớ thì được định tỉ lệ thấp hơn (mặc dù vẫn còn nhanh hơn cần thiết để đạt được SPECRate tốt nhất ở 64-bộ xử lý). Đặc biệt những cấu hình đĩa đi từ 1 ổ đĩa đối với loại 4-bộ xử lý đến 4 ổ đĩa (140 GB) đối với loại 64-bộ xử lý. Bộ nhớ được định tỉ lệ từ 8 GB đối với hệ thống 4-bộ xử lý đến 20 GB đối với hệ thống 64-bộ xử lý Lưu ý 5: Không phát triển phần mềm để thu lợi ích Một vấn đề bắt gặp thường xuyên xảy ra khi phần mềm được thiết kế cho bộ xử lý đơn là được lắp vào một môi trường đa xử lý. Ví dụ, hệ thống hoạt động SGI bảo vệ cấu trúc dữ liệu bảng trang với một khóa đơn, giả sử rằng sự định vị trí trang thì không thường xuyên. Trong bộ xử lý đơn, điều này không trình bày một vấn đề hiệu năng. Trong bộ đa xử lý, nó có thể nghẽn cổ chai cho một số chương trình. Xem như một chương trình sử dụng một số lượng lớn trang được đưa dữ liệu ban đầu vào máy tính tại thời điểm bắt đầu, mà UNIX xác định rõ vị trí trang một cách tĩnh. Sự nối tiếp hóa bảng trang này loại bỏ tính song song trong sự khởi tạo và có ảnh hưởng đáng kể đến toàn bộ hiệu năng song song. Cổ chai hiệu năng này tiếp tục thậm chí dưới nhiều chương trình. Ví dụ, giả sử chúng ta tách phần chương trình

214 Chương 4: Các kiến trúc đa xử lý 215 song song thành những quá trình xử lý riêng lẻ và chạy chúng, một quá trình xử lý trên mỗi bộ xử lý, để không có sự phân chia giữa những quá trình xử lý. (Đây là do sự phân chia có mục đích hoặc sự suy diễn trong ứng dụng). Không may, khóa vẫn còn tiếp tục tất cả các quá trình xử lý thậm chí hiệu năng đa chương trình kém. Lỗi hiệu năng đáng kể có thể tăng lên khi phần mềm chạy trên những bộ đa xử lý. Giống như nhiều thành phần phần mềm chính khác, những giải thuật OS và những cấu trúc dữ liệu phải cân nhắc lại trong ngữ cảnh đa xử lý. Những khóa định vị trên những phần nhỏ hơn của bảng trang loại bỏ những rắc rối một cách hiệu quả. Những vấn đề tương tự tồn tại trong cấu trúc bộ nhớ, làm tăng lưu lượng kết hợp trong những vỏ bọc nơi mà không có sự phân chia xảy ra Kết luận Hơn 30 năm, những nhà nghiên cứu và những nhà thiết kế đã dự báo kết thúc những bộ đơn xử lý và sự ưu thế của những bộ đa xử lý. Trong suốt khoảng thời gian sự tăng lên của những bộ vi xử lý và sự phát triển hiệu năng nhanh của chúng đã giới hạn vai trò của đa xử lý. Vào năm 2006, bộ xử lý và khả năng thực hiện luồng song song sẽ thay đổi qua một vài hiện tượng: 1. Việc sử dụng tính xử lý song song trong một vài lĩnh vực được hiểu tốt hơn. Đầu tiền là lĩnh vực khoa học và sự tính toán kỹ thuật. Lĩnh vực ứng dụng này có nhiều tính song hành tự nhiên. 2. Sự tăng trưởng trong những ứng dụng máy chủ đối với những quá trình xử lý giao dịch và dịch vụ Web, tốt bằng những môi trường đa chương trình, cực lớn, những ứng dụng vốn có và được triển khai song song một cách dễ dàng thông qua xử lý các luồng độc lập. 3. Sau 20 năm cải thiện hiệu năng, chúng ta ở trong vùng giảm bớt ILP khai thác, ít nhất là khi chúng ta đã biết nó. Những năng lượng phát, phức tạp và sự vô hiệu tăng đã buộc những nhà thiết kế quan tâm đến những phương pháp tiếp cận khác. Khả năng thực hiện luồng song song là bước tự nhiên kế tiếp. 4. Như thế, trong 50 năm qua, sự cải thiện về tốc độ xung đã cải tiến tốc độ bán dẫn. Như chúng ta thấy sự cải thiện cả hai là sự giới hạn công nghệ và từ sự tiệu thụ điện, triển khai đa xử lý song song hấp dẫn ngày càng tăng. Năm 1995, hai vấn đề được đặt ra: 1. Kiến trúc nào có quy mô lớn, bộ đa xử lý dựa trên máy tính sử dụng? 2. Vai trò đối với đa xử lý trong tương lai về kiến trúc vi xử lý? Hai câu hỏi này đã được giải quyết qua nhiều năm.

215 216 Kiến trúc máy tính tiên tiến Bởi vì những bộ đa xử lý có phạm vi rất lớn không trở thành một thị trường phát triển chính, chỉ các hiệu lực chi phí để xây dựng những bộ đa xử lý phạm vi lớn phải dùng nhóm (cluster) nơi mà những nút riêng, hoặc là những bộ xử lý đơn hoặc là những phạm vi vừa phải. Câu trả lời đối với câu hỏi thứ hai đã trở nên rõ ràng chỉ gần đây. Sự phát triển hiệu năng tương lai trong những bộ vi xử lý, ít nhất cho 5 năm tới, sẽ đến một cách chắc chắn từ sự khai thác khả năng thực hiện luồng song song thông qua những bộ xử lý đa lõi hơn là khai thác thêm ILP. Thật ra, chúng ta thậm chí đang nhìn những người thiết kế chọn lựa để khai thác ít hơn ILP trong những bộ xử lý tương lai. Sun T1 là một bước trong sự định hướng này và trong tháng 3 năm 2006, Intel thông báo rằng những bộ xử lý đa lõi kế tiếp của nó sẽ dựa trên một lõi trong triển khai ILP hơn lõi Pentium 4 Netburst. Sự cân bằng tốt nhất giữa ILP và TLP sẽ hầu như chắc chắn phụ thuộc sự đa dạng những nhân tố bao gồm những ứng dụng hỗn hợp. Trong những thập niên 1980 và 1990, với sự ra đời và phát triển của ILP, phần mềm trong hình thức trình biên dịch tối ưu hóa có thể khai thác ILP là chìa khóa sự thành công của nó.

216 Chương 5 CAÙC VI XÖÛ LYÙ THÖÏC TEÁ 5.1. Very-Long Instruction Word (VLIW) Giới thiệu Ngày nay, vi xử lý (microprocessor) và vi điều khiển (microcontroller) được sử dụng rộng rãi, chúng được dùng trong mọi hệ thống điện tử cả trong công nghiệp lẫn dân dụng. Những hệ thống điện tử phức tạp như: máy tính, máy ATM, hệ thống POS, hệ thống tài chính, hệ thống tương tác, hệ thống điều khiển và hệ thống cơ sở dữ liệu đều dùng một dạng nào đó của microcontroller hoặc microprocessor làm lõi xử lý trong hệ thống. Vậy microcontroller và microprocessor quan hệ như thế nào? Thực ra microprocessor là cốt lõi của microcontroller, nó chính là CPU của microcontroller như hình minh họa dưới. Microcontroller Microprocessor core Peripheral logic, memory, IO logic Microprocessor đã và đang phát triển nhanh chóng từ 8 bit đến 16 bit, 32 bit và mới nhất hiện nay là 64 bit. Kiến trúc Microprocessor bắt đầu từ CISC (complex instruction set computing) rồi đến RISC (reduced instruction set computing), kết hợp RISC-CISC và hiện nay là VLIW (very long instruction word) Khả năng thực hiện lệnh song song (ILP) Chúng ta sẽ xem xét một ví dụ giúp chúng ta hình dung rõ hơn về phương pháp xử lý song song.

217 218 Kiến trúc máy tính tiên tiến Ví dụ câu lệnh sau: p = q*r s/t + u*v w%x Với câu lệnh trên, phương pháp xử lý song song sẽ tính toán những lệnh nào xử lý song song được và sẽ lập lịch để giải quyết bài toán. Mục đích lớn nhất của xử lý song song là thực thi nhiều câu lệnh đồng thời trên những đơn vị phần cứng độc lập nhau nhằm giảm thời gian thực thi chương trình. Phương pháp xử lý song song (Instruction level parallel processing) là sự kết hợp của cả phần mềm lẫn phần cứng nhằm giảm thời gian thực thi chương trình bằng cách tìm và thực thi những lệnh độc lập nhau từ danh sách các lệnh cần phải thi hành. Trong hình trên chúng ta thấy có bốn lệnh tại phía đầu cây có thể được chuyển cho đơn vị xử lý (ALU) xử lý song song. Kết quả của các lệnh thực thi trước sẽ dùng làm dữ liệu cho các lệnh thực thi sau nó. Những bộ xử lý ngày nay có nhiều ALU để hỗ trợ xử lý song song và việc quyết định xử lý song song này do mức tập lệnh quyết định nên gọi là Instruction level parallelism (khả năng thực hiện lệnh song song) VLIW Khi thực hiện xử lý song song, vấn đề đặt ra là làm sao bộ xử lý có thể biết những lệnh nào có thể xử lý song song? Một trong những phương pháp là để cho bộ quản lý của bộ xử lý lo việc này, phần cứng này sẽ tìm kiếm và xác định các thao tác có thể xử lý đồng thời, xác định sự phụ thuộc của các thao tác để lập lịch xử lý, tính toán, thi hành các thao tác song song. Số lượng các lệnh được xem xét thi thành đồng thời được gọi là cửa sổ lệnh. Bộ xử lý Superscalar chính là dùng phương pháp trên để xử lý song song.

218 Chương 5: Các vi xử lý thực tế 219 Một hướng giải quyết khác được gọi là Very long instruction word hay kiến trúc VLIW, khác với Superscalar CPU dùng phần cứng để quyết định những thao tác nào được chạy song song còn VLIW CPU dùng phần mềm (trình biên dịch) để quyết định những thao tác nào được xử lý song song. Trình biên dịch trong VLIW sẽ phân tích chương trình cần thi hành, tìm ra những thao tác có thể xử lý song song, những thao tác được tìm ra này sẽ được nén lại vào trong một cấu trúc lệnh lớn. Một cấu trúc lệnh lớn sẽ được lên lịch để cho thi hành song song, chúng ta có thể xem hình sau để rõ hơn. Hình 5.1: Xác định thao tác có thể thi hành song song, nén lại thành các large instruction. Từ những khác biệt trên, chúng ta nhận thấy sự không cân xứng giữa việc xây dựng các vi mạch phần cứng để dành cho luồng dữ liệu và kiểm soát luồng dữ liệu. Trong các Superscalar processor, người ta dùng bộ xử lý có bộ kiểm soát luồng dữ liệu lớn và phức tạp trong khi vi mạch dùng để chuyển luồng dữ liệu nhỏ. Ngược lại với các vi xử lý VLIW được thiết kế với vi mạch dùng để chuyển luồng dữ liệu lớn và bộ kiểm soát luồng dữ liệu lại nhỏ. Với bộ kiểm soát luồng dữ liệu đơn giản và

219 220 Kiến trúc máy tính tiên tiến nhỏ, VLIW processor đã giúp cho việc xây dựng các bộ xử lý tín hiệu số trở nên dễ dàng hơn, đặc biệt việc tìm ra các quan hệ song song trong các ứng dụng xử lý tín hiệu số dễ dàng hơn các ứng dụng thông thường rất nhiều, trong các ứng dụng thông thường việc xác định quan hệ song song tại thời điểm biên dịch rất là khó khăn. Các Superscalar processor dùng bộ xử lý luồng dữ liệu để xác định và sắp lịch cho các thao tác đồng thời, bộ xử lý Intel Pentium là một ví dụ về ứng dụng Superscalar instruction để tìm kiếm và xử lý song song, trong khi đó ứng dụng của xử lý VLIW có thể kể như Philips Trimedia processor được dùng cho xử lý tín hiệu truyền thông (media processing) và Texas Instruments C6X processor được dùng cho các ứng dụng xử lý tín hiệu số. Công nghệ ILP hiện nay rất phổ biến, bởi vì các nhà lập trình ứng dụng không cần phải có kiến thức về công nghệ này, nhà lập trình cũng không cần phải phân chia rõ ràng việc xử lý song song trong mã. Chính điều trên đã làm cho nhà lập trình không phải viết lại code khi phần cứng thay đổi. Một thuận lợi của Superscalar processor là chúng cung cấp các đối tượng tương thích code (Object code compatibility) với kiến trúc bộ xử lý. Object code compatibility cho phép đối tượng nhị phân được biên dịch cho kiến trúc cũ có thể chạy trên kiến trúc mới mà không cần sửa lại. Các đối tượng tương thích code rất hữu dụng, giúp cho người dùng có thể nâng cấp phần cứng trong khi đang chạy các ứng dụng (các ứng dụng lớn rất khó biên dịch lại) một cách dễ dàng. Về điểm này các Superscalar processor tự bản thân đã được thiết kế để làm việc này, trong khi đó môi trường thực thi trong VLIW processor hay hệ điều hành nên cung cấp tốt hơn tính trong suốt giữa chương trình và các kiến trúc xử lý Tổ chức của VLIW processor Biểu đồ giản lược phía trên cho chúng ta thấy về các cấp khác nhau của con đường xử lý trong VLIW proccessor. Con đường bao gồm khối lấy lệnh, tầng phát (issue stage), tầng đọc thanh ghi (register read stage), tầng thực thi (execute stage) và tầng bộ nhớ (memory stage). Khối lấy lệnh nạp những cấu trúc lệnh từ cache. Tại bước này, những bộ xử lý ngày nay (IA-64) thường kết hợp chung với đơn vị dự báo rẽ nhánh (branch prediction unit). Đơn vị dự báo rẽ nhánh sẽ dự đoán hướng các nhánh lệnh và tính toán để nạp các lệnh tiếp theo. Đây là một thao tác rất quan trọng để đảm bảo đường xử lý luôn hoạt động đúng đắn. Tại thời điểm này, trình biên dịch có thể vẫn còn cung cấp gợi ý cho phần cứng để xác định hướng thi hành các nhánh (nhánh nào được thi hành hoặc không thi hành). Đặc biệt ta thấy trong con đường xử lý vắng mặt tầng giải mã bởi vì với kiến trúc VLIW, phần cứng đã được làm cho trở thành đơn giản tối đa. Tầng đọc thanh ghi sẽ đọc nội dung của các

220 Chương 5: Các vi xử lý thực tế 221 toán hạng trong lệnh từ tập thanh ghi. Tầng thực thi của quá trình là thực thi các lệnh tại các đơn vị chức năng (FU) và tầng bộ nhớ thì đọc hoặc ghi kết quả từ bộ nhớ hệ thống phụ. Hình 5.2: Tổ chức của VLIW processor Ưu, khuyết điểm của bộ xử lý VLIW Ưu điểm Cấu trúc phần cứng đơn giản: - Số lượng của bộ thi hành có thể được tăng lên mà không cần phải thêm các phần cứng phức tạp để xác định các thành phần song song (trong khi superscalar thì không như vậy). - Năng lượng tiêu thụ giảm đi đáng kể. Trình biên dịch tốt có thể xác định thành phần song song bằng cách phân tích toàn bộ chương trình. Đây là một điểm lợi thế vì trình biên dịch biết rất rõ chương trình và có thể tìm các thành phần song song tốt Khuyết điểm Cần một lượng lớn thanh ghi để lưu giữ các kết quả trong khi các thành phần thi hành hoạt động (lưu hành động tiếp theo hoặc kết quả). Cần đường dữ liệu chuyển tải lớn giữa các đơn vị thi hành và tập thanh ghi, giữa tập thanh ghi và bộ nhớ.

221 222 Kiến trúc máy tính tiên tiến Cần băng thông lớn giữa cache lệnh và khối lấy lệnh. Ví dụ 1 lệnh có 7 hành động, mỗi hành động chiếm 24 bit => cần 168 bit/lệnh. Kích thước code lớn, đặc biệt khi không có thao tác cần thi hành trên lệnh dẫn đến lãng phí bit trên từ lệnh (instruction word). Chưa tương thích hoàn toàn với mã nhị phân. Ví dụ, có một phiên bản mới của bộ xử lý có nhiều bộ thi hành đơn vị chức năng hơn được đưa vào sử dụng, điều này dẫn tới số lượng thao tác cần thi hành đồng thời có thể tăng lên, dẫn tới kích thước từ lệnh thay đổi => mã nhị phân cũ có thể không thi hành được trên bộ xử lý mới Tóm tắt Ngày nay, nhà cung cấp bộ vi xử lý và các nhà sản xuất máy tính nhắm đến dùng mô hình VLIW cho sản phẩm đại trà. Ví dụ như công ty Compaq mặc dù đã sản xuất các bộ xử lý như Alpha và RISC nhưng những bộ xử lý server từ sau năm 2003 sẽ được sản xuất dựa theo Itanium processor IA64. Compaq phải thực hiện điều này bởi vì xu hướng xây dựng những thành phần phần cứng quản lý đơn giản đang ngày được ưa chuộng trên thế giới ngày nay Kiến trúc máy chủ Sun Sparc MX000 - M Giới thiệu về dòng máy chủ doanh nghiệp MX000 Dòng máy chủ doanh nghiệp Sun Fujitsu Sparc là các máy chủ ổn định cao, dễ quản trị với tất cả các ưu điểm của các dòng máy chủ mainframe truyền thống. Với bộ đa xử lý đối xứng SMP (symmetric multiprocessing) từ 1 đến 64 bộ xử lý, hệ thống bộ nhớ lên tới 2 TB và kiến trúc I/O dung lượng cao, dòng máy chủ MX000 có thể hoạt động dễ dàng đối với các tác vụ yêu cầu tải cao. Hơn nữa các máy chủ này sử dụng hệ điều hành Solaris và cung cấp các công nghệ tiên tiến như: miền động (dynamic domain), mạch hệ thống mở rộng, hỗ trợ cấu hình động và các gói Solaris đã đưa dòng máy chủ MX000 lên tầng mainframe class, với các cơ chế kiểm soát tài nguyên phức tạp cho các hệ thống tính toán lớn. Dựa trên các ưu điểm của dòng máy chủ MX000, các doanh nghiệp IT có thể tạo ra nhiều nền tảng công nghệ thông tin mạnh, tối ưu việc sử dụng phần cứng cũng như nâng cao tính sẵn sàng của ứng dụng và tiến tới giảm chi phí, rủi ro trong quá trình vận hành hệ thống. Sau đây chúng ta sẽ tìm hiểu kiến trúc của các dòng máy chủ MX000 nói chung và máy chủ M5000 nói riêng.

222 Chương 5: Các vi xử lý thực tế 223 Sun SPARC Enterprise MX000 Servers Hình 5.3: Các dòng máy chủ MX Kiến trúc chung của máy chủ M5000 Hình 5.4: Máy chủ M5000. Hình 5.5: Chi tiết các module của máy chủ.

223 224 Kiến trúc máy tính tiên tiến Chi tiết kết nối của các module trong máy chủ như sau: Bộ nhớ Hình 5.6: Kết nối giữa các thành phần bên trong máy chủ M5000. Hệ thống bộ nhớ của các máy chủ MX000 làm tăng khả năng mở rộng và thông lượng của hệ thống, thực tế các dòng máy chủ này có thể hỗ trợ đến 2 TB. Maximum Memory Capacity Fujitsu SPARC Enterprise M4000 Fujitsu SPARC Enterprise M5000 Fujitsu SPARC Enterprise M8000 Fujitsu SPARC Enterprise M9000 (32 CPU configuration) Fujitsu SPARC Enterprise M9000 (64 CPU configuration) 128 GB 256 GB 512 GB 1 TB 2 TB DIMM slots Up to 128 Up to 256 Up to 512 Bank Size 4 DIMMs 4 DIMMs 8 DIMMs 8 DIMMs 8 DIMMs Number of Banks 8 16 Up to 16 Up to 32 Up to 64 Bảng 5.1: Dung lượng bộ nhớ của các máy chủ MX000.

224 Chương 5: Các vi xử lý thực tế 225 Ngoài ra hệ thống bộ nhớ của các máy chủ MX000 còn hỗ trợ các tính năng sau: Tuần tra bộ nhớ, tuần tra định kỳ quét bộ nhớ cho các lỗi. Chức năng này ngăn chặn việc sử dụng các khu vực bị lỗi bộ nhớ trước khi chúng có thể gây ra lỗi cho hệ thống hoặc lỗi cho ứng dụng, cải thiện độ tin cậy của hệ thống. Hình 5.7: Cơ chế memory patrol của máy chủ M5000. Hình 5.8: Cơ chế memory mirroring của máy chủ MX000. Chức năng mở rộng bộ nhớ ECC (Extended memory ECC) của các máy chủ cho phép chỉnh sửa lỗi bit đơn, cho phép bộ xử lý có thể tiếp tục bất chấp các sự kiện như chùm (burst) đọc lỗi mà đôi khi gây ra do bởi thiết bị bộ nhớ. Giám sát bộ nhớ (Memory mirroring) là một tùy chọn, là khả năng thích hợp cho các ứng dụng thực hiện với những yêu cầu nghiêm ngặt nhất. Khi chế độ memory mirroring được kích hoạt, hệ thống bộ nhớ lưu thêm bản sao dữ liệu viết và

225 226 Kiến trúc máy tính tiên tiến so sánh dữ liệu đọc cho mỗi sự kiện của bộ nhớ. Trong trường hợp lỗi xảy ra ở các bus hoặc DIMM, xử lý dữ liệu bình thường tiếp tục thông qua các bộ nhớ bus và các DIMM thay thế. Trong máy chủ M5000, bộ nhớ được nhân đôi trong cùng một module bộ nhớ, sử dụng bộ điều khiển bộ nhớ địa chỉ (MAC) chung ASIC (Application Specific Integrated Circuit). Hình 5.9: Cách thức memory mirroring của máy chủ M Kiến trúc Bus của hệ thống Hình 5.10: Kết nối bus giữa các module trong máy chủ M5000.

226 Chương 5: Các vi xử lý thực tế 227 Máy chủ M5000 được thực hiện với một bo mạch chủ vật lý (PSB) nhưng cung cấp tính năng tương đương hai bo mạch chủ logic (LSB), từng bo mạch chủ logic bao gồm hai bộ điều khiển hệ thống (system controller) kết nối với các khối CPU (CPU module), bộ điều khiển truy cập bộ nhớ (memory access controller) và khối nhập xuất IOU (I/O Unit). Ngoài ra, hai bo mạch chủ logic cũng kết nối với nhau Bộ xử lý SPARC64 VII Dòng bộ xử lý SPARC64 được phát triển bởi Fujitsu cho máy chủ Unix. Đây là dòng bộ xử lý công nghệ mainframe với độ ổn định cao và tần số vượt quá 1 GHz. Bộ xử lý SPARC64 VII đã được cải tiến hơn nữa bằng cách kết hợp công nghệ 4 nhân và các cơ chế đa luồng. SPARC64 VII sử dụng công nghệ 65 nm và hoạt động ở 2,5 GHz với kích thước 21,3mm/20,9mm. Bộ xử lý tích hợp 4 nhân (Quad core) và với 6 MB L2 shared cache. SPARC64 VII sử dụng cơ chế đa luồng SMT (với tiến trình 2 SMT cho mỗi nhân) thay vì VMT như các dòng SPARC64 trước Lõi (Core) Hình 5.11: Tổng quan bộ xử lý SPARC64 VII. Phần nhân của SPARC64 VII được chia thành 2 khối: khối nạp lệnh và khối thực hiện lệnh.

227 228 Kiến trúc máy tính tiên tiến Hệ thống Cache Hình 5.12: Cấu trúc core của CPU SPARC64 VII. Hình 5.13: Cấu trúc cache của CPU SPARC64 VII.

228 Chương 5: Các vi xử lý thực tế 229 Bộ nhớ cache của SPARC64 VII gồm kiến trúc hai tầng, bao gồm bộ nhớ chính dung lượng trung bình (middle-capacity primary cache) L1 cache và bộ nhớ phụ dung lượng cao (high-capacity secondary cache) L2 cache Kiến trúc I/O M5000 sử dụng các công nghệ PCI, PCIe, PCI-X, PCI Express cho I/O module. Hình 5.14: Kiến trúc I/O của máy chủ M Công nghệ Centrino trong các CPU Lịch sử phát triển Centrino Được Intel ra mắt lần đầu tiên vào tháng 3 năm 2003, Intel Centrino (tên mã cho nền tảng đầu tiên là Carmel) đã nắm lấy cơ hội để đưa thị trường máy tính xách tay (MTXT) thế giới lên một tầm cao mới. Và tại giai đoạn đó, Intel chiếm thế thượng phong trên thị trường và không có bất cứ một nhà sản xuất CPU nào có thể cạnh tranh được. Là sự kết hợp tương đối hoàn hảo giữa bộ vi xử lý Pentium M socket 478, 479 đạt mức FSB (Front Side Bus) 400 MHz, chipset Intel 855 sử dụng bộ nhớ DDR-266 và thiết bị kết nối không dây Intel PRO/Wireless 2100B hay 2200BG dùng giao tiếp mini PCI. Chính thế hệ MTXT sử dụng nền tảng Centrino mang lại cho người dùng khả năng kết nối toàn cầu một cách đơn giản, đồng thời

229 230 Kiến trúc máy tính tiên tiến tăng thời gian sử dụng nguồn lên đến hơn 4 giờ cho các máy sử dụng nguồn 48W/h. Carmel cũng cho phép các nhà sản xuất thiết kế những mẫu MTXT mỏng và nhẹ hơn nhờ các thiết bị tỏa nhiệt ít hơn và máy không phải hoạt động với một hệ thống tản nhiệt phức tạp và nặng nề như trước. Nền tảng di động thế hệ thứ 3 có tên mã Napa được giới thiệu tại triển lãm điện tử tiêu dùng vào tháng 1 năm Đến đây, Intel Centrino đã hoàn toàn lột xác với những nâng cấp đáng kể, tuy nhiên Intel vẫn quyết định giữ nguyên tên gọi của nó. Ban đầu, Napa hỗ trợ CPU Intel Core Duo, tuy nhiên, với những thành công mà Core 2 Duo đạt được, Intel quyết định tích hợp cả C2D vào Napa vào ngày 27 tháng 7 cùng năm đó. Sau gần 7 năm Intel Centrino cống hiến cho người dùng, Intel đã chi hơn 300 triệu USD để quảng bá cho nền tảng di động tiên tiến của mình. Tuy nhiên, đã đến lúc phải thay đổi, lần này, Intel đã đổi tên cho đứa con cưng của mình, Centrino 2 ra mắt lại là một sự thay đổi đầy bất ngờ và vẫn thu hút sự quan tâm của đông đảo những người đam mê công nghệ Centrino thế hệ đầu tiên Với tên mã Carmel, nền tảng Centrino thế hệ đầu tiên bao gồm ba thành phần: CPU Pentium M (mã Banias); chipset 855GM (tên mã Montara) với đồ họa tích hợp Intel Extreme Graphics 2 (chipset này sử dụng bộ nhớ DDR-266 hoặc DDR-333); cùng với card mạng không dây PRO/Wireless 2100B chỉ hỗ trợ chuẩn Wi-Fi B. Ngay khi IEEE chuẩn hóa chuẩn Wi-Fi G, Intel cho phép card mạng không dây PRO/Wireless 2200BG - hỗ trợ chính thức Wi-Fi G - được là một phần của Carmel. Cùng thời điểm đó, Intel cũng cập nhật Carmel với CPU mới mang tên mã Dothan có bộ nhớ L2 lớn hơn, công nghệ sản xuất nhỏ hơn và một vài tối ưu khác. Tổng kết lại, Centrino thế hệ thứ nhất bao gồm những thành phần tối thiểu sau: - CPU: Pentium M (Banias hoặc Dothan) với FSB 400 MHz. - Chipset: 855PM (Odem) hoặc 855GM (Montara). - Wi-Fi: PRO/Wireless 2100B hoặc PRO/Wireless 2200BG Centrino thế hệ thứ hai: Sonoma Bộ ba thành phần của Centrino lần này chỉ có một sự thay đổi lớn nhất về phần chipset. Intel yêu cầu sử dụng chipset 915 Express của hãng cho thế hệ thứ hai này của Centrino. Chipset này (với tên mã Alviso) hỗ trợ bộ nhớ DDR2-533 và kết nối PCI Express. CPU của Sonoma vẫn là Dothan, nhưng được tăng FSB lên tới 533 MHz (so với 400 MHz ở Carmel) và xung nhịp hoạt động cũng cao hơn.

230 Chương 5: Các vi xử lý thực tế 231 Bổ sung thêm card Wi-Fi PRO/Wireless 2915ABG song song với 2200BG vào Sonoma, Intel chính thức áp dụng cách đặt tên mới cho card giao tiếp Wi-Fi trong Centrino. Hai phiên bản 2915 và 2200 không có khác biệt quá nhiều ngoài việc 2915 bổ sung thêm tính tương thích chuẩn A. Các thành phần của chính của Centrino, bao gồm CPU, chipset và card giao tiếp Wi-Fi. Có thể thấy thế hệ thứ hai của Centrino được Intel tập trung nhiều vào việc cập nhật các công nghệ mới cho nền tảng này. Đáng tiếc là việc này lại ít nhiều ảnh hưởng tới công suất tiêu thụ của CPU, CPU xung nhịp cao hơn và chuẩn giao tiếp PCI Express vẫn còn khá mới, các thủ thuật tiết kiệm điện năng cho chuẩn này còn chưa được tìm ra và tận dụng triệt để. Tuy vậy, bằng việc cập nhật Centrino lên Sonoma, Intel vẫn đi đúng hướng, Centrino mang lại những công nghệ mới nhất của ngành công nghiệp đến với môi trường thực sự di động. Sonoma bao gồm những thành phần sau: - CPU: Pentium M (Dothan) với FSB 533 MHz. - Chipset: 915 Express (Alviso, đồ họa tích hợp GMA900 và phiên bản không đồ họa tích hợp). - Wi-Fi: PRO/Wireless 2200BG hoặc PRO/Wireless 2915ABG (đều tên là Calexico 2) Centrino thế hệ thứ ba: Napa Tên mã Napa được sử dụng cho thế hệ thứ ba của nền tảng tính toán di động Centrino của Intel. Giới thiệu vào năm 2006 và mang những thay đổi chính về hiệu suất xử lý trong khi tiếp tục mang lại công suất tiêu thụ thấp cho máy tính xách tay. Nhận thấy tiềm năng tương lai của thiết kế chú trọng vào công suất tiêu thụ của Pentium M, Intel đầu tư mạnh vào việc phát triển kiến trúc vi xử lý này và chính thức lấy tên Core làm tên thương mại cho kiến trúc. Bộ xử lý dựa trên kiến trúc Core của Intel xuất hiện với phiên bản xử lý hai nhân và đây là lần đầu tiên trong lịch sử, bộ xử lý hai nhân xuất hiện trong máy tính xách tay. Ý nghĩa của điều này nghe không hấp dẫn như thực tế. Vốn phải hy sinh tất cả cho mức tiêu thụ năng lượng thấp, máy tính xách tay trong khi không được lợi thế gì hơn máy tính để bàn về thời gian đáp ứng do cùng chỉ có một nhân xử lý lại phải chịu thiệt thêm về tốc độ xử lý bởi xung nhịp hoạt động thấp. Và với bộ xử lý hai nhân, thời gian đáp ứng của các ứng dụng trên máy tính xách tay trở nên tốt hơn nhiều lần so với trước đây.

231 232 Kiến trúc máy tính tiên tiến Công suất tiêu thụ cũng được cải thiện rất nhiều với Napa. Với hai nhân xử lý và hỗ trợ các công nghệ mới nhất, Napa mang lại hiệu suất cao hơn nhiều, vẫn đạt mốc tiêu thụ năng lượng như những thế hệ trước của Centrino và trong một vài trường hợp còn tốt hơn do nhà sản xuất khai thác và tận dụng triệt để các thủ thuật tiết kiệm năng lượng. Trở lại vấn đề năng lượng, Intel không đưa thêm tính năng gì mới vào chipset cũng như card giao tiếp Wi-Fi của Napa (ngoài những thay đổi đơn giản như tăng FSB), chipset 945 Express (mã Calistoga) và card Wi-Fi PRO/Wireless 3945ABG (mã Golan) được Intel tập trung toàn bộ vào phần quản lý điện năng, cung cấp nhiều hơn các mức giảm năng lượng hoạt động phụ thuộc vào mức độ công việc. Intel còn cập nhật Napa thêm một lần nữa với CPU Core 2 và card Wi-Fi có hỗ trợ chuẩn N (tuy chưa chính thức nhưng lần này thì Intel mặc kệ IEEE) - tuy nhiên lần cập nhật này không mang lại nhiều sự chú ý lắm, bởi tất cả đang hướng đến Santa Rosa, thế hệ thứ tư của Centrino. Trước khi bàn về Santa Rosa, hãy tổng kết lại nền tảng Napa: - CPU: Core Solo, Core Duo (Yonah) với FSB 400/533 MHz. Sau được nâng cấp lên Core 2 Duo và Core 2 Solo (Merom) với FSB 667 và 533 MHz tương ứng. - Chipset: 945 Express (Calistoga, đồ họa tích hợp GMA950 và phiên bản không đồ họa tích hợp). - Wi-Fi: PRO/Wireless 3945ABG (Golan) và 4965AGN kế thừa từ Santa Rosa Centrino hế hệ thứ tư: Santa Rosa Được giới thiệu và quyết định cho tồn tại song song với Napa vào năm Santa Rosa được Intel cho giữ vai trò truyền thống của Centrino trong máy tính xách tay, khiến cho người dùng thèm khát. Tất nhiên đối với những người không đủ khả năng để thỏa mãn cơn thèm, Napa giờ đây được Intel tiếp tục giữ trên thị trường nhưng với một mức giá dễ chịu hơn. Tập trung vào Santa Rosa, hãy xem thế hệ thứ tư này của Centrino có những gì thay đổi. Bốn năm tồn tại trên thị trường, Centrino đã xóa bỏ mọi sự nghi ngại về những gì nó mang lại, không những thế, nó đã trở thành chuẩn mực một máy tính xách tay muốn hướng tới. Tiếp nối truyền thống này, Santa Rosa đã không làm thất vọng sự trông đợi của người dùng. CPU được trang bị cho Santa Rosa vẫn là Merom, nhưng với 800 MHz FSB và bộ nhớ đệm L2 4MB (sau đó Intel giới thiệu thêm phiên bản 2 MB có giá rẻ hơn), cùng thời điểm này, Core 2 cũng đã xuất hiện cho máy để bàn và được người dùng

232 Chương 5: Các vi xử lý thực tế 233 và giới truyền thông đánh giá rất cao, khi đã mang lại một kiến trúc vi xử lý mới với khả năng nâng cao hiệu năng lên rất cao trong khi không phải lo quá nhiều về vấn đề nhiệt lượng (thực tế Intel đã thu nhỏ lại bộ tản nhiệt cho Core 2 trên máy để bàn lại rất nhiều do nhiệt lượng rất thấp). Nói như vậy có nghĩa rằng Core 2 Duo trên máy tính xách tay cũng kế thừa tốc độ xử lý đáng nể (hay thực chất là C2D trên máy tính để bàn chỉ chứng minh điều đó vì kiến trúc này vốn được xây dựng với mục đích dành cho máy tính xách tay) và việc tăng bus dữ liệu chính của hệ thống lên 800 MHz đã phần nào giúp đỡ rất nhiều cho CPU không bị đói dữ liệu, thể hiện tối đa năng lực xử lý của CPU này. Bên cạnh đó, một lần nữa Intel lại tiếp tục đẩy xung nhịp của CPU này lên mức tối đa cao hơn nữa (2,4 GHz) trong khi vẫn giữ TDP (mức tiêu thụ năng lượng tối đa - tính theo trung bình ở các mức tải tối đa khác nhau) bằng với các CPU thế hệ trước đó; không chỉ như vậy, những tối ưu mới về các mức giảm điện năng tiêu thụ lại được Intel trang bị cho CPU này. Và như vậy, không phải hy sinh bất cứ thứ gì, Merom lại được cả hai, công suất tiêu thụ thấp trong khi vẫn rất tiết kiệm năng lượng. Ngày càng nhiều những máy tính xách tay có thời gian sử dụng pin lên tới 5 giờ hoặc hơn nữa. Cũng phải nhắc đến một điểm quan trọng, Intel hiểu rằng không phải lúc nào người dùng cũng được lợi từ một bộ xử lý hai nhân và CPU mới này có khả năng tắt một nhân xử lý đi để tiết kiệm năng lượng và nhiệt lượng, phần tiết kiệm đó được sử dụng cho nhân còn lại để tăng năng lực xử lý khi dùng các ứng dụng không khai thác được nhiều nhân xử lý bằng cách tăng xung nhịp hoạt động lên quá mức bình thường (overclock) nhưng vẫn đảm bảo mức tiêu thụ năng lượng danh định. Nhìn vào chipset mới 965 Express dành cho Santa Rosa (Crestline), những thay đổi của chipset này không nhằm vào việc tối đa hóa hiệu năng mà lại ở những tối ưu về quản lý điện năng tiêu thụ. Intel đã đi đúng hướng, sức mạnh của Centrino đã đủ khiến cho những sự đầu tư hơn nữa vào việc nâng cao tốc độ xử lý trở nên ít ý nghĩa. Giờ đây chipset có thể điều chỉnh được xung của FSB xuống thật thấp khi CPU không làm việc nhiều, yêu cầu về băng thông không cần phải luôn giữ ở mức cao nhất và lần đầu tiên thực sự một chipset cho máy tính xách tay có một tính năng tiết kiệm năng lượng quan trọng như vậy. Việc giới thiệu thêm một thành phần tùy chọn sử dụng bộ nhớ flash làm bộ đệm dữ liệu cho đĩa cứng cũng với mục đích tiết kiệm năng lượng, mong muốn đĩa cứng sẽ ít phải dùng đến hơn và có thể ngừng quay khi lượng công việc không nhiều. Tuy vậy Intel Turbo Memory (Robson) chưa mang lại những gì Intel hy vọng, dù sao đây cũng là những cố gắng ban đầu, hy vọng trong thời gian tới Intel sẽ có giải pháp cải thiện công nghệ này, nhất là khi Intel đã chính thức bước vào mảng thị trường thiết bị lưu trữ với công nghệ SSD (và SSD Z-140 của Intel chỉ nhỏ

233 234 Kiến trúc máy tính tiên tiến bằng một cái móng tay, mang lại dung lượng lưu trữ lên tới 16 GB) hoàn toàn phù hợp cho một bộ đệm cực lớn với tốc độ vừa đủ cho những công việc không đáng phải phí điện cho đĩa cứng phải quay. Card giao tiếp Wi-Fi của Santa Rosa đã được nói đến ở phần trên và khi chuẩn Wi-Fi N chưa trở nên phổ biến, thì điều duy nhất đáng nhắc đến lại là những tối ưu mới về cắt giảm năng lượng tiêu thụ. Những công nghệ mới như WWAN và Centrino Pro sẽ không được đề cập sâu, vì WWAN đã được Intel dời lịch ra mắt sang thế hệ sau của Centrino và Centrino Pro chỉ có ý nghĩa trong môi trường doanh nghiệp. Intel vào đầu năm 2008 cũng đã cập nhật thêm bộ xử lý dựa trên công nghệ sản xuất 45 nm mang tên mã Penryn, tuy vậy một lần nữa sự chú ý lại đang hướng tới một sự thay đổi lớn hơn, Montevina - với một con số 2 đằng sau cái tên Centrino. Để tổng kết phần này, chỉ xin đưa ra một minh chứng về sự đền đáp cho những cố gắng về cắt giảm năng lượng tiêu thụ. Một máy tính đầy đủ tính năng đang được sử dụng để viết bài này chỉ tiêu thụ 13,2 W cho toàn bộ hệ thống (mang lại thời gian sử dụng pin 4,5h với pin dung lượng 5200mAh ở hiệu điện thế 11,1V). Những thành phần của Santa Rosa: - CPU: Core 2 Duo (Merom) với FSB 800 MHz. Sau được nâng cấp lên Core 2 Duo (Penryn). - Chipset: 965 Express (Crestline, đồ họa tích hợp X3100 và phiên bản không đồ họa tích hợp). - Wi-Fi: PRO/Wireless 4965AGN. Nền tảng Centrino Pro Centrino Duo Centrino Duo Centrino Centrino Centrino Tên mã Santa Rosa Santa Rosa Napa Napa Sonoma Carmel Bộ vi xử lý Chipset Wireless Core 2 Duo Core 2 Duo Core Duo (Yonah) Intel 965 Express Network Intel PRO /Wireless 4965AGN Intel 965 Express Intel PRO /Wireless 4965AGN Core 2 Duo (Meron) Intel 945 Express Intel PRO /Wireless 3945ABG Core Solo Intel 945 Express Intel PRO /Wireless 3945ABG Pentium M (Dothan) Intel 915 Express Intel PRO /Wireless 2200BG Intel PRO /Wireless 2915ABG Pentium M (Banias) Intel 855 Intel PRO /Wireless 2100 Bảng 5.2: Tổng hợp từ các chi tiết kỹ thuật của các thế hệ Centrino.

234 Chương 5: Các vi xử lý thực tế Những công nghệ ứng dụng trên nền tảng Intel Centrino Bộ vi xử lý Intel Core 2 Duo Bộ vi xử lý Intel Core 2 Duo là bộ vi xử lý có hiệu suất tiết kiệm điện năng cao của Intel mang lại hiệu suất hoạt động di động và khả năng nhạy bén vượt trội cho người sử dụng là các doanh nghiệp và người tiêu dùng khắt khe nhất. Người sử dụng sẽ nhận thấy hiệu suất hoạt động được nâng cao mạnh mẽ khi đồng thời chạy nhiều ứng dụng đòi hỏi sức mạnh điện toán và khi chạy các ứng dụng được tối ưu hóa cho khả năng điện toán hai nhân. Những tính năng cơ bản mới của bộ vi xử lý Intel Core 2 Duo mới nhất gồm: Công nghệ silicon 45 nm cổng kim loại Hi-k của Intel - Tăng gần gấp đôi số lượng bóng bán dẫn và có tỉ lệ thất thoát điện năng thấp hơn so với các công nghệ 65 nm, mang lại những cấp độ mới về hiệu suất hoạt động cũng như hiệu suất tiết kiệm điện năng. Kênh truyền hệ thống FSB tốc độ MHz - Hiệu suất hoạt động nhanh hơn khi so sánh với thế hệ trước có kênh truyền hệ thống tốc độ 800 MHz. Intel HD Boost - Hiệu suất hoạt động nhanh hơn trên các ứng dụng đa phương tiện đòi hỏi sức mạnh điện toán như mã hóa video có độ phân giải cao HD. Bộ nhớ đệm L2 dung lượng 6 MB - Nâng cao hiệu suất hoạt động cho các ứng dụng đòi hỏi xử lý nhiều dữ liệu. Công nghệ tiết kiệm điện năng Deep Power Down - Tắt các nhân của bộ vi xử lý cũng như bộ nhớ đệm L2 khi không cần thiết nhằm mang lại hiệu suất tiết kiệm điện năng tốt hơn. Những tính năng kiến trúc chính của nền tảng vi kiến trúc trong bộ vi xử lý Intel Core 2 gồm: Công nghệ thực thi Intel Wide Dynamic Execution: - Rộng hơn Một ống xử lý vô hướng rộng đủ 4 đường có thể nạp, giải mã, thực thi và thu hồi các lệnh với một tỉ lệ được duy trì liên tục là 4 lệnh trên mỗi chu trình so với 3 lệnh của bộ vi xử lý Intel Core Duo. - Sâu hơn Các kích cỡ bộ nhớ đệm tối ưu hóa hiệu quả số lệnh xử lý tương ứng với ống xử lý, cho phép bộ vi xử lý nhìn sâu hơn vào trong luồng chương trình để tìm ra những lệnh có thể được thực thi đồng thời. - Nhanh hơn Ống dữ liệu được tối ưu hóa cho hiệu suất nâng cao đường thiết yếu kiến trúc cho một ống xử lý 14 giai đoạn rất ngắn và hiệu quả, góp phần nâng xung nhịp cao hơn đồng thời mang lại số lệnh trên mỗi chu trình cao hơn.

235 236 Kiến trúc máy tính tiên tiến - Thông minh hơn Khả năng hợp nhất vĩ mô kết hợp các chuỗi lệnh thường xuyên được sử dụng vào trong một lệnh đơn nhất để thực thi, giảm các tài nguyên cần thiết bên trong đồng thời nâng cao tỉ lệ các lệnh trên mỗi chu trình, từ đó cho phép thu hồi 5 lệnh với cùng một công việc mà bình thường sẽ chỉ thu hồi được 4 lệnh. Khả năng quản lý điện năng thông minh Intel Intelligent Power Capability - Một bộ các khả năng được thiết kế nhằm giảm lượng điện năng tiêu thụ cũng như những yêu cầu về thiết kế bằng cách quản lý lượng điện năng tiêu thụ khi hoạt động của tất cả các nhân trong bộ vi xử lý. Kết quả là khả năng tối ưu hóa điện năng tuyệt vời, cho phép vi kiến trúc Intel Core có thể mang lại những máy tính xách tay có hiệu suất hoạt động và hiệu quả tiết kiệm điện năng cao hơn. Công nghệ bộ nhớ đệm Intel Advanced Smart Cache - Một bộ nhớ đệm được tối ưu hóa cho điện toán đa nhân giúp giảm mạnh mẽ độ trễ tới các dữ liệu thường xuyên được sử dụng, từ đó nâng cao hiệu suất và hiệu quả hoạt động bằng cách nâng cao khả năng mà mỗi nhân trong bộ vi xử lý đa lõi có thể truy cập dữ liệu từ một hệ thống bộ nhớ đệm có hiệu suất hoạt động cao hơn và hiệu quả hơn. Công nghệ truy cập bộ nhớ Intel Smart Memory Access - Nâng cao hiệu suất hoạt động hệ thống bằng cách tối ưu hóa việc sử dụng băng thông dữ liệu sẵn có từ hệ thống bộ nhớ và giảm thiểu độ trễ khi truy cập bộ nhớ. Đột phá này còn bao gồm một khả năng gọi là memory disambiguation (khả năng hợp nghĩa bộ nhớ), nâng cao hiệu quả xử lý ngoài luồng bằng cách mang lại cho các nhân xử lý khả năng thông minh được tích hợp sẵn để có khả năng suy đoán khi tải dữ liệu cho các lệnh sắp được thực thi trước khi tất cả các lệnh lưu trữ trước đó được thực thi. Công nghệ tăng tốc Intel HD Boost - Nâng cao mạnh mẽ hiệu suất hoạt động khi thực thi truyền tải các lệnh mở rộng SIMD (SSE/SSE2/SSE3/ SSE4), tăng tốc một loạt các ứng dụng bao gồm video, thoại và hình ảnh, xử lý ảnh, mã hóa, các ứng dụng tài chính, các ứng dụng công trình và các ứng dụng khoa học. Công nghệ Intel 64 - Khả năng mở rộng của điện toán 64 bit ngay tại phần cứng để tận dụng các hệ điều hành 64 bit như Microsoft Vista* cũng như các ứng dụng 64 bit khi các sản phẩm này trở nên phổ biến cho các hệ thống máy khách di động để tận dụng khả năng bộ nhớ hệ thống tốt hơn nhằm hỗ trợ các ứng dụng đòi hỏi những bộ dữ liệu lớn hơn.

236 Chương 5: Các vi xử lý thực tế Họ chipset Mobile Intel 965 Express Họ chipset Mobile Intel 965 Express là chipset mới của Intel dành cho công nghệ vi xử lý Intel Centrino và công nghệ vi xử lý Intel Centrino 2 tích hợp công nghệ vpro, mang lại những khả năng mới và hiệu suất hoạt động tốt hơn cho một trải nghiệm điện toán di động vượt trội. Một bộ trình điều khiển cho phép mang lại một trải nghiệm Windows Vista Premium mạnh mẽ và vượt trội với Windows Aero trên tất cả các nền tảng. Nâng cao khả năng chơi game với nhiều đơn vị thực thi hơn (10 so với 8 trong thế hệ trước). Công nghệ Intel Clear Video Technology được tăng cường với các tính năng phần mềm bao gồm ProcAmp, tăng tốc tại phần cứng cho MPEG2 và WMV9. Tất cả sẽ cho phép mang lại một trải nghiệm video độ phân giải cao tuyệt vời với khả năng xem video HD mượt mà và không bị giật hình, chất lượng hình ảnh sắc nét hơn, điều chỉnh màu có khả năng tùy biến. Hệ thống Intel Graphics Media Accelerator 4500MHD mang lại một xung nhịp nhân đồ họa tăng cường với tốc độ 533 MHz và dung lượng video lên tới 384 MB. Tăng cường bảo mật với các công nghệ Intel Trusted Platform Module, Intel Trusted Execution Technology và Intel Virtualization Technology. Khả năng tận hưởng nội dung HD tích hợp có logo tương thích (Blu-ray*) với khả năng giải mã ngay tại phần cứng các dòng dữ liệu video HD (AVC, VC1, MPEG). Hỗ trợ trực tiếp cho các hiển thị số với HDMI tích hợp với các khóa HDCP. Các tính năng quản lý điện năng bao gồm Intel Display Refresh Rate Switching Technology, hỗ trợ các màn hình DPO, Render Standby, tất cả sẽ cho phép mang lại khả năng tiết kiệm điện năng tốt hơn để kéo dài thời gian sử dụng pin lâu hơn Hệ thống kết nối Intel WiFi Link 5000 Series Hệ thống kết nối Intel WiFi Link 5000 Series là giải pháp kết nối không dây WLAN theo chuẩn Draft-N thế hệ 2 của Intel, mang lại khả năng kết nối mạng tối đa cho gia đình và doanh nghiệp. Công nghệ Draft-N, với hiệu suất hoạt động và phạm vi phủ sóng tốt hơn là một đòi hỏi chủ đạo cho các nền tảng công nghệ vi xử lý Intel Centrino và công nghệ vi xử lý Intel Centrino 2 tích hợp công nghệ vpro.

237 238 Kiến trúc máy tính tiên tiến Hệ thống kết nối Intel WiFi Link 5300 Hệ thống WLAN Draft-N 450 Mbps 6 đầu tiên trên thế giới mang lại hiệu suất hoạt động tối ưu và các tính năng cao cấp cùng phạm vi phủ sóng được tăng cường so với các giải pháp a/g trước đây. Hệ thống WiFi Link 5300 cho phép mang lại khả năng upload và download nhanh hơn, các kết nối có thể dự đoán được và tin cậy hơn, cùng khả năng quản lý cấp độ doanh nghiệp thông qua mạng không dây hỗ trợ cho công nghệ quản lý Intel Active Management Technology v4.0. Ngoài ra, hệ thống kết nối WiFi Link 5300 còn được sẵn sàng trong một thiết kế PCIe Half Mini Card cho phép mang lại các thiết kế máy tính xách tay mỏng hơn và nhẹ hơn. Hệ thống kết nối Intel WiFi Link 5100 Một hệ thống WLAN Draft-N mang lại băng thông thu lên tới 300 Mbps, tăng gấp 5 lần so với các giải pháp a/g trước đây Hệ thống kết nối mạng Intel Gigabit Intel 82567LM Giải pháp kết nối mạng Gigabit cho các thiết kế doanh nghiệp cao cấp. Hỗ trợ công nghệ vi xử lý Intel Centrino 2 tích hợp công nghệ vpro mang lại khả năng quản lý hệ thống hàng đầu (hoặc ASF 2.0), khả năng tiết kiệm pin tích hợp Auto Connect Battery Saver (ACBS), Link Speed Battery Saver, Low Power Link Up (LPLU), khả năng chuyển đổi kết nối System Idle link downshift cho khả năng tiết kiệm điện năng, Jumbo Frame, Receive Side Scaling và chương trình nền tảng ổn định Intel Stable Image Platform Program (SIPP). Intel 82567LF Giải pháp kết nối mạng Gigabit cho các hệ thống máy tính xách tay phổ thông vốn đòi hỏi khả năng quản lý chỉ ở mức độ cơ bản. Hỗ trợ ASF 2.0, ACBS tích hợp, Link Speed Battery Saver, Low Power Link Up (LPLU), khả năng chuyển đổi kết nối System Idle link downshift cho khả năng tiết kiệm điện năng cũng như chương trình nền tảng ổn định Intel Stable Image Platform Program (SIPP). Intel 82567V Giải pháp kết nối mạng Gigabit cho các hệ thống máy tính xách tay tiêu dùng cơ bản. Hỗ trợ các trạng thái tiêu thụ điện năng thấp cơ bản, Link Speed Battery Saver, Low Power Link Up (LPLU), khả năng chuyển đổi kết nối System Idle link downshift cho khả năng tiết kiệm điện năng Energy Star Chuyển đổi giữa đồ họa tích hợp và đồ họa rời Đồ họa có khả năng hoán đổi là một tính năng tùy chọn mới hiện có mặt trong các máy tính xách tay sử dụng công nghệ Intel Centrino 2, cho phép người sử dụng

238 Chương 5: Các vi xử lý thực tế 239 có thể chuyển đổi giữa đồ họa tích hợp giúp tăng hiệu suất tiết kiệm điện năng, từ đó cho phép nâng cao thời gian sử dụng nguồn và đồ họa rời giúp có thể mang lại hiệu suất 3D tốt hơn, mang lại cả những lựa chọn tối ưu cho cả 2 nhu cầu sử dụng Công nghệ bộ nhớ Intel Turbo Memory Một tính năng tùy chọn được cung cấp rộng rãi trên rất nhiều các máy tính xách tay sử dụng công nghệ vi xử lý Intel Centrino 2 và Intel Centrino 2 tích hợp công nghệ vpro, giờ đây với một dung lượng lớn hơn là 2 GB, giúp nâng cao hiệu suất hoạt động, thời gian khởi động máy và thời gian sử dụng pin. Đây là một thành phần bộ nhớ non-volatile (bất biến) giúp nâng cao hiệu suất hoạt động của hệ thống đồng thời giảm lượng điện năng tiêu thụ Kết luận Centrino sau 5 năm có mặt trên thị trường đã trở thành một chuẩn mực đáng hướng tới của tất cả các máy tính xách tay và thực sự thì cho dù có không thừa nhận, tất cả các đối thủ cạnh tranh của Intel cũng đang ngày đêm nhìn vào Centrino để cải tiến sản phẩm của mình. 5 năm không phải là một thời gian dài trong cuộc sống, nhưng đối với ngành công nghiệp công nghệ cao này, đó là cả một khoảng thời gian đủ để làm chủ thị trường cũng như đủ để mất toàn bộ thị trường. Centrino đáng tiếc là chưa thể khẳng định là đã làm chủ toàn bộ thị trường trong khoảng thời gian đó, nhưng những gì nó mang lại là không thể phủ nhận. Nó làm cho các đối thủ cạnh tranh với Intel hiểu ra thế nào mới đúng nghĩa là một nền tảng riêng cho tính toán di động và họ đã đáp trả lại Centrino với những sản phẩm cạnh tranh. Và người có lợi cuối cùng chính là người dùng, đó mới là điều quan trọng.

239 Chương 6 KIEÁN TRUÙC BOÄ NHÔÙ TIEÂN TIEÁN 6.1. Một số kiểu tổ chức bộ nhớ tốc độ cao Các loại bộ nhớ Bộ nhớ chứa chương trình, nghĩa là chứa lệnh và số liệu. Người ta phân biệt các loại bộ nhớ: Bộ nhớ trong (RAM - Bộ nhớ vào ra ngẫu nhiên): được chế tạo bằng chất bán dẫn. Bộ nhớ chỉ đọc (ROM). Bộ nhớ ngoài bao gồm: đĩa cứng, đĩa mềm, băng từ, trống từ, các loại đĩa quang, các loại thẻ nhớ... Bộ nhớ RAM có đặc tính là các ô nhớ có thể được đọc hoặc viết vào trong khoảng thời gian bằng nhau cho dù chúng ở bất kỳ vị trí nào trong bộ nhớ. Mỗi ô nhớ có một địa chỉ, thông thường, mỗi ô nhớ là một byte (8 bit), nhưng hệ thống có thể đọc ra hay viết vào nhiều byte (2, 4, hay 8 byte). Bộ nhớ trong (RAM) được đặc trưng bằng dung lượng và tổ chức của nó (số ô nhớ và số bit cho mỗi ô nhớ), thời gian thâm nhập (thời gian từ lúc đưa ra địa chỉ ô nhớ đến lúc đọc được nội dung ô nhớ đó) và chu kỳ bộ nhớ (thời gian giữa hai lần liên tiếp thâm nhập bộ nhớ). MAR RAM MBR Wi R/W Wj Wi, Wj, R/W: là các tín hiệu điều khiển. Hình 6.1: Vận hành của bộ nhớ RAM.

240 Chương 6: Kiến trúc bộ nhớ tiên tiến 241 Tùy theo công nghệ chế tạo, người ta phân biệt RAM tĩnh (SRAM: Static RAM) và RAM động (Dynamic RAM). RAM tĩnh được chế tạo theo công nghệ ECL (CMOS và BiCMOS). Mỗi bit nhớ gồm có các cổng logic với 6 transistor MOS, việc nhớ một dữ liệu là tồn tại nếu bộ nhớ được cung cấp điện. SRAM là bộ nhớ nhanh, việc đọc không làm hủy nội dung của ô nhớ và thời gian thâm nhập bằng chu kỳ bộ nhớ. RAM động dùng kỹ thuật MOS. Mỗi bit nhớ gồm có một transistor và một tụ điện. Cũng như SRAM, việc nhớ một dữ liệu là tồn tại nếu bộ nhớ được cung cấp điện. Việc ghi nhớ dựa vào việc duy trì điện tích nạp vào tụ điện và như vậy việc đọc một bit nhớ làm nội dung bit này bị hủy. Vậy sau mỗi lần đọc một ô nhớ, bộ phận điều khiển bộ nhớ phải viết lại ô nhớ đó nội dung vừa đọc và do đó chu kỳ bộ nhớ động ít nhất là gấp đôi thời gian thâm nhập ô nhớ. Việc lưu giữ thông tin trong bit nhớ chỉ là tạm thời vì tụ điện sẽ phóng hết điện tích đã nạp vào và như vậy phải làm tươi bộ nhớ sau mỗi 2 μs. Làm tươi bộ nhớ là đọc ô nhớ và viết lại nội dung đó vào lại ô nhớ. Việc làm tươi được thực hiện với tất cả các ô nhớ trong bộ nhớ. Việc làm tươi bộ nhớ được thực hiện tự động bởi một vi mạch bộ nhớ. Bộ nhớ DRAM chậm nhưng rẻ tiền hơn SRAM. Hình 6.2: SRAM và DRAM. SDRAM (Synchronous DRAM): một dạng DRAM đồng bộ bus bộ nhớ. Tốc độ SDRAM đạt từ MHz (thời gian thâm nhập bộ nhớ từ ns).

241 242 Kiến trúc máy tính tiên tiến DDR SDRAM (Double Data Rate SDRAM): là cải tiến của bộ nhớ SDRAM với tốc độ truyền tải gấp đôi SDRAM nhờ vào việc truyền tải hai lần trong một chu kỳ bộ nhớ. Tốc độ DDR SDRAM đạt từ MHz. RDRAM (Rambus RAM): là một loại DRAM được thiết kế với kỹ thuật hoàn toàn mới so với kỹ thuật SDRAM. RDRAM hoạt động đồng bộ theo một hệ thống lặp và truyền dữ liệu theo một hướng. Một kênh bộ nhớ RDRAM có thể hỗ trợ đến 32 chip DRAM. Mỗi chip được ghép nối tuần tự trên một module gọi là RIMM (Rambus Inline Memory Module) nhưng việc truyền dữ liệu giữa các mạch điều khiển và từng chip riêng biệt chứ không truyền giữa các chip với nhau. Bus bộ nhớ RDRAM là đường dẫn liên tục đi qua các chip và module trên bus, mỗi module có các chân vào và ra trên các đầu đối diện. Do đó, nếu các khe cắm không chứa RIMM sẽ phải gắn một module liên tục để đảm bảo đường truyền được nối liền. Tốc độ RDRAM đạt từ MHz. Bộ nhớ chỉ đọc ROM cũng được chế tạo bằng công nghệ bán dẫn. Chương trình trong ROM được viết vào lúc chế tạo nó. Thông thường, ROM chứa chương trình khởi động máy tính, chương trình điều khiển trong các thiết bị điều khiển tự động... PROM (Programmable ROM): Chế tạo bằng các mối nối (cầu chì - có thể làm đứt bằng điện). Chương trình nằm trong PROM có thể được viết vào bởi người sử dụng bằng thiết bị đặc biệt và không thể xóa được. EPROM (Erasable Programmable ROM): Chế tạo bằng nguyên tắc phân cực tĩnh điện. Chương trình nằm trong ROM có thể được viết vào (bằng điện) và có thể xóa (bằng tia cực tím - trung hòa tĩnh điện) để viết lại bởi người sử dụng. EEPROM (Electrically Erasable Programmable ROM): Chế tạo bằng công nghệ bán dẫn. Chương trình nằm trong ROM có thể được viết vào và có thể xóa (bằng điện) để viết lại bởi người sử dụng. Kiểu bộ nhớ Loại Cơ chế xóa Cơ chế ghi Tính bay hơi RAM Đọc/ghi Bằng điện, mức byte Bằng điện Có ROM Programmable ROM (PROM) Erasable PROM Electrically Erasable PROM (EEPROM) Flash Memory Chỉ đọc Hầu hết chỉ đọc Không thể xóa Tia cực tím, mức chip Bằng điện, mức byte Bằng điện, mức khối Bảng 6.1: Các kiểu bộ nhớ bán dẫn. Mặt nạ Bằng điện Không

242 Chương 6: Kiến trúc bộ nhớ tiên tiến Các cấp bộ nhớ Các đặc tính như lượng thông tin lưu trữ, thời gian thâm nhập bộ nhớ, chu kỳ bộ nhớ, giá tiền mỗi bit nhớ khiến ta phải phân biệt các cấp bộ nhớ: các bộ nhớ nhanh với dung lượng ít đến các bộ nhớ chậm với dung lượng lớn (hình 6.3). Hình 6.3: Các cấp bộ nhớ. Các đặc tính chính của các cấp bộ nhớ dẫn đến hai mức chính là: mức cache - bộ nhớ trong và mức bộ nhớ ảo (bao gồm bộ nhớ trong và không gian cấp phát trên đĩa cứng) - hình 6.4. Cách tổ chức này trong suốt đối với người sử dụng. Người sử dụng chỉ thấy duy nhất một không gian định vị ô nhớ, độc lập với vị trí thực tế của các lệnh và dữ liệu cần thâm nhập. Hình 6.4: Hai mức bộ nhớ.

243 244 Kiến trúc máy tính tiên tiến Các cấp bộ nhớ giúp ích cho người lập trình muốn có một bộ nhớ thật nhanh với chi phí đầu tư giới hạn. Vì các bộ nhớ nhanh đắt tiền nên các bộ nhớ được tổ chức thành nhiều cấp, cấp có dung lượng ít thì nhanh nhưng đắt tiền hơn cấp có dung lượng cao hơn. Mục tiêu của việc thiết lập các cấp bộ nhớ là người dùng có một hệ thống bộ nhớ rẻ tiền như cấp bộ nhớ thấp nhất và gần nhanh như cấp bộ nhớ cao nhất. Các cấp bộ nhớ thường được lồng vào nhau. Mọi dữ liệu trong một cấp thì được gặp lại trong cấp thấp hơn và có thể tiếp tục gặp lại trong cấp thấp nhất. Chúng ta có nhận xét rằng, mỗi cấp bộ nhớ có dung lượng lớn hơn cấp trên mình, ánh xạ một phần địa chỉ các ô nhớ của mình vào địa chỉ ô nhớ của cấp trên trực tiếp có tốc độ nhanh hơn và các cấp bộ nhớ phải có cơ chế quản lý và kiểm tra các địa chỉ ánh xạ Các công nghệ bộ nhớ tiên tiến Cache là bộ nhớ nhanh, nó chứa lệnh và dữ liệu thường xuyên dùng đến. Việc lựa chọn lệnh và dữ liệu cần đặt vào cache dựa vào các nguyên tắc sau đây: Một chương trình mất 90% thời gian thi hành lệnh của nó để thi hành 10% số lệnh của chương trình. Nguyên tắc trên cũng được áp dụng cho việc thâm nhập dữ liệu, nhưng ít hiệu quả hơn việc thâm nhập lệnh. Như vậy có hai nguyên tắc: nguyên tắc về không gian và nguyên tắc về thời gian. Nguyên tắc về thời gian: cho biết các ô nhớ được hệ thống xử lý thâm nhập có khả năng sẽ được thâm nhập trong tương lai gần. Thật vậy, các chương trình được cấu tạo với phần chính là phần được thi hành nhiều nhất và các phần phụ dùng để xử lý các trường hợp ngoại lệ. Còn số liệu luôn có cấu trúc và thông thường chỉ có một phần số liệu được thâm nhập nhiều nhất mà thôi. Nguyên tắc về không gian: cho biết bộ xử lý thâm nhập vào một ô nhớ thì có nhiều khả năng thâm nhập vào ô nhớ có địa chỉ kế tiếp do các lệnh được sắp xếp thành chuỗi có thứ tự. Tổ chức các cấp bộ nhớ sao cho các lệnh và dữ liệu thường dùng được nằm trong bộ nhớ cache, điều này làm tăng hiệu quả của máy tính một cách đáng kể Bộ nhớ Cache tiên tiến Vận hành của Cache Mức cache - bộ nhớ trong trong hình 6.3 các cấp bộ nhớ có cơ cấu vận hành trong suốt đối với bộ xử lý. Với thao tác đọc bộ nhớ, bộ xử lý gửi một địa chỉ và

244 Chương 6: Kiến trúc bộ nhớ tiên tiến 245 nhận một dữ liệu từ bộ nhớ trong. Với thao tác ghi bộ nhớ, bộ xử lý viết một dữ liệu vào một ô nhớ với một địa chỉ được chỉ ra trong bộ nhớ. Để cho chương trình vận hành bình thường thì cache phải chứa một phần con của bộ nhớ trong để bộ xử lý có thể thâm nhập vào các lệnh hoặc dữ liệu thường dùng từ bộ nhớ cache. Do dung lượng của bộ nhớ cache nhỏ nên nó chỉ chứa một phần chương trình nằm trong bộ nhớ trong. Để đảm bảo sự đồng nhất giữa nội dung của cache và bộ nhớ trong thì cache và bộ nhớ trong phải có cùng cấu trúc. Việc chuyển dữ liệu giữa cache và bộ nhớ trong là việc tải lên hay ghi xuống các khối dữ liệu. Mỗi khối chứa nhiều từ bộ nhớ tùy thuộc vào cấu trúc bộ nhớ cache. Sự lựa chọn kích thước của khối rất quan trọng cho vận hành cache có hiệu quả. Hình 6.5: Trao đổi dữ liệu giữa các thành phần CPU-Cache-Bộ nhớ trong. Trước khi khảo sát vận hành của cache, ta xét đến các khái niệm liên quan: Thành công cache (cache hit): bộ xử lý tìm gặp phần tử cần đọc (ghi) trong cache. Thất bại cache (cache miss): bộ xử lý không gặp phần tử cần đọc (ghi) trong cache. Trừng phạt thất bại cache (cache penalty): Thời gian cần thiết để xử lý một thất bại cache. Thời gian bao gồm thời gian thâm nhập bộ nhớ trong cộng với thời gian chuyển khối chứa từ cần đọc từ bộ nhớ trong đến cache. Thời gian này tùy thuộc vào kích thước của khối. Để hiểu được cách vận hành của cache, ta lần lượt xem xét và trả lời bốn câu hỏi liên quan đến các tình huống khác nhau xảy ra trong bộ nhớ trong. Câu hỏi 1: Phải để một khối bộ nhớ vào chỗ nào của cache (sắp xếp khối)? Câu hỏi 2: Làm sao để tìm một khối khi nó hiện diện trong cache (nhận diện khối)? Câu hỏi 3: Khối nào phải được thay thế trong trường hợp thất bại cache (thay thế khối)? Câu hỏi 4: Việc gì xảy ra khi ghi vào bộ nhớ (chiến thuật ghi)?

245 246 Kiến trúc máy tính tiên tiến Trả lời câu hỏi 1: Phải để một khối bộ nhớ vào chỗ nào của cache (sắp xếp khối)? Một khối bộ nhớ được đặt vào trong cache theo một trong ba cách sau: a. Kiểu tương ứng trực tiếp: Nếu mỗi khối bộ nhớ chỉ có một vị trí đặt khối duy nhất trong cache được xác định theo công thức: K= i mod n Trong đó: - K: vị trí khối đặt trong cache - i: số thứ tự của khối trong bộ nhớ trong - n: số khối của cache Như vậy, trong kiểu xếp đặt khối này, mỗi vị trí đặt khối trong cache có thể chứa một trong các khối trong bộ nhớ cách nhau xn khối (x: 0,1,...,m; n: số khối của cache). Ví dụ: Số thứ tự khối cache 0 0, n, 2n, mn Số thứ tự của khối trong bộ nhớ trong 1 1, n+1, 2n+1, mn+1 b. Kiểu hoàn toàn phối hợp: n-1 n-1, 2n-1, mn-1 Trong kiểu đặt khối này, một khối trong bộ nhớ trong có thể được đặt vào vị trí bất kỳ trong cache. Như vậy, trong kiểu xếp đặt khối này, mỗi vị trí đặt khối trong cache có thể chứa một trong tất cả các khối trong bộ nhớ. c. Kiểu phối hợp theo tập hợp: Với cách tổ chức này, cache bao gồm các tập hợp của các khối cache. Mỗi tập hợp của các khối cache chứa số khối như nhau. Một khối của bộ nhớ trong có thể được đặt vào một số vị trí khối giới hạn trong tập hợp được xác định bởi công thức: K= i mod s Trong đó: - K: vị trí khối đặt trong cache - i: số thứ tự của khối trong bộ nhớ trong - s: số lượng tập hợp trong cache.

246 Chương 6: Kiến trúc bộ nhớ tiên tiến 247 Trong cách đặt khối theo kiểu phối hợp theo tập hợp, nếu tập hợp có m khối, sự tương ứng giữa các khối trong bộ nhớ trong và các khối của cache được gọi là phối hợp theo tập hợp m khối. - Nếu m=1 (mỗi tập hợp có 1 khối), ta có kiểu tương ứng trực tiếp. - Nếu m=n (n: số khối của cache), ta có kiểu hoàn toàn phối hợp. Hiện nay, phần lớn các cache của các bộ xử lý đều là kiểu tương ứng trực tiếp hay kiểu phối hợp theo tập hợp (mỗi tập hợp gồm 2 hoặc 4 khối). Ví dụ: Bộ nhớ trong có 32 khối, cache có 8 khối, mỗi khối gồm 32 byte, khối thứ 12 của bộ nhớ trong được đưa vào cache. Trả lời câu hỏi 2: Làm sao để tìm một khối khi nó hiện diện trong cache (nhận diện khối)? Mỗi khối của cache đều có một nhãn địa chỉ cho biết số thứ tự của các khối bộ nhớ trong đang hiện diện trong cache. Nhãn của một khối của cache có thể chứa thông tin cần thiết được xem xét để biết được các khối nằm trong cache có chứa thông tin mà bộ xử lý cần đọc hay không. Tất cả các nhãn đều được xem xét song song (trong kiểu tương ứng trực tiếp và phối hợp theo tập hợp) vì tốc độ là yếu tố then chốt. Để biết xem một khối của của cache có chứa thông tin mà bộ xử lý cần tìm hay không, người ta thêm một bit đánh dấu (valid bit) vào nhãn để nói lên khối đó có chứa thông tin mà bộ xử lý cần tìm hay không. Như đã mô tả ở phần đầu, với thao tác đọc (ghi) bộ nhớ, bộ xử lý đưa ra một địa chỉ và nhận (viết vào) một dữ liệu từ (vào) bộ nhớ trong. Địa chỉ mà bộ xử lý đưa ra có thể phân tích thành hai thành phần: phần nhận dạng số thứ tự khối và phần xác định vị trí từ cần đọc trong khối.

247 248 Kiến trúc máy tính tiên tiến Tương ứng với ba kiểu lắp đặt khối đã xét, ta có: a. Căn cứ vào tổ chức số từ trong khối bộ nhớ mà số bit trong địa chỉ xác định vị trí từ cần đọc trong khối. Cách này đúng với cả ba cách xếp đặt khối đã xét. b. Phần nhận dạng số thứ tự khối sẽ khác nhau tùy thuộc vào cách xếp đặt khối, trường chỉ số khối được so sánh với nhãn của cache để xác định khối trong cache. Dữ liệu được bộ xử lý đọc cùng lúc với việc đọc nhãn. Phần chỉ số khối của khối trong bộ nhớ trong được so sánh với bảng tương quan để xác định khối có nằm trong cache hay không. Để chắc rằng nhãn chứa thông tin đúng đắn (tức là khối có chứa từ mà bộ xử lý cần đọc-ghi), nếu việc so sánh nhãn của khối cache giống với số thứ tự khối, bit đánh dấu (valid bit) phải được bật lên. Ngược lại, kết quả so sánh được bỏ qua. Bộ xử lý căn cứ vào phần xác định từ trong khối để đọc (ghi) dữ liệu từ (vào) cache. Đối với kiểu tương ứng trực tiếp, phần nhận dạng chỉ số khối được chia thành hai phần: - Phần chỉ số khối cache: chỉ ra số thứ tự khối cache tương ứng cần xem xét. - Phần nhãn: so sánh tương ứng với nhãn của khối cache được chỉ ra bởi phần chỉ số khối. Chỉ số khối trong bộ nhớ Nhãn Chỉ số khối cache Địa chỉ từ cần đọc trong khối Đối với kiểu hoàn toàn phối hợp, phần nhận dạng chỉ số khối trong địa chỉ sẽ được so sánh với nhãn của tất cả các khối cache. Chỉ số khối Địa chỉ từ cần đọc trong khối Đối với kiểu phối hợp theo tập hợp, phần nhận dạng chỉ số khối được chia thành hai phần: - Phần chỉ số tập hợp: chỉ ra số thứ tự tập hợp trong cache cần xem xét. - Phần nhãn: so sánh tương ứng với nhãn của các khối cache thuộc tập hợp được chỉ ra bởi phần chỉ số tập hợp. Nhãn Chỉ số khối bộ nhớ Chỉ số tập hợp Địa chỉ từ cần đọc trong khối Ví dụ: Phân tích địa chỉ một từ được cho ở trên, địa chỉ xác định một từ trong bộ nhớ có 10 bit, tùy theo cách xếp đặt khối mà ta có thể phân tích địa chỉ này thành các thành phần như sau:

248 Chương 6: Kiến trúc bộ nhớ tiên tiến 249 Đối với kiểu tương ứng trực tiếp: 10 bit Chỉ số khối bộ nhớ (5 bit) Nhãn (2 bit) Chỉ số khối cache (3 bit) Địa chỉ từ cần đọc trong khối (5 bit) Đối với kiểu hoàn toàn phối hợp: 10 bit Chỉ số khối bộ nhớ (Nhãn) (5 bit) Địa chỉ từ cần đọc trong khối (5 bit) Đối với kiểu phối hợp theo tập hợp, giả sử cache gồm 4 tập hợp, mỗi tập hợp gồm hai khối: 10 bit Chỉ số khối bộ nhớ (5 bit) Nhãn (3 bit) Chỉ số khối cache (2 bit) Địa chỉ từ cần đọc trong khối (5 bit) Trả lời câu hỏi 3: Khối nào phải được thay thế trong trường hợp thất bại cache (thay thế khối)? Khi có thất bại cache, bộ điều khiển cache thâm nhập bộ nhớ trong và chuyển khối mà bộ xử lý cần đọc (ghi) vào cache. Như vậy, khối nào trong cache sẽ bị thay thế bởi khối mới được chuyển lên. Đối với kiểu tương ứng trực tiếp, vị trí đặt khối không có sự lựa chọn, nó được xác định bởi trường chỉ số khối cache trong địa chỉ của từ cần đọc (ghi). Nếu cache là kiểu hoàn toàn phối hợp hay phối hợp theo tập hợp thì khi thất bại phải chọn lựa thay thế trong nhiều khối. Có bốn chiến thuật chủ yếu dùng để chọn khối thay thế trong cache: Thay thế ngẫu nhiên: để phân bố đồng đều việc thay thế, các khối cần thay thế trong cache được chọn ngẫu nhiên. Khối xưa nhất (LRU - Least Recently Used): các khối đã được thâm nhập sẽ được đánh dấu và khối bị thay thế là khối không được dùng từ lâu nhất. Vào trước ra trước (FIFO - First In First Out): Khối được đưa vào cache đầu tiên, nếu bị thay thế, khối đó sẽ được thay thế trước nhất.

249 250 Kiến trúc máy tính tiên tiến Tần số sử dụng ít nhất (LFU - Least Frequently Used): Khối trong cache được tham chiếu ít nhất. Điều này sử dụng hệ quả của nguyên tắc sử dụng ô nhớ theo thời gian: nếu các khối mới được dùng có khả năng sẽ được dùng trong tương lai gần, khối bị thay thế là khối không dùng trong thời gian lâu nhất. Trả lời câu hỏi 4: Việc gì xảy ra khi ghi vào bộ nhớ (chiến thuật ghi)? Thông thường bộ xử lý thâm nhập cache để đọc thông tin. Chỉ có khoảng 15% các thâm nhập vào cache là để thực hiện thao tác ghi (con số này là 33% với các tính toán vectơ-vectơ và 55% đối với các phép dịch chuyển ma trận). Như vậy, để tối ưu hóa các hoạt động của cache, các nhà thiết kế tìm cách tối ưu hóa việc đọc bởi vì các bộ xử lý phải đợi đến khi việc đọc hoàn thành nhưng sẽ không đợi đến khi việc ghi hoàn tất. Hơn nữa, một khối có thể được đọc, so sánh và như thế việc đọc một khối có thể được bắt đầu khi chỉ số khối được biết. Nếu thao tác đọc thành công, dữ liệu ô nhớ cần đọc sẽ được giao ngay cho bộ xử lý. Chú ý rằng, khi một khối được ánh xạ từ bộ nhớ trong vào cache, việc đọc nội dung của khối cache không làm thay đổi nội dung của khối so với khối còn nằm trong bộ nhớ trong. Đối với việc ghi vào bộ nhớ thì không giống như trên, việc thay đổi nội dung của một khối không thể bắt đầu trước khi nhãn được xem xét để biết có thành công hay thất bại. Thao tác ghi vào bộ nhớ sẽ tốn nhiều thời gian hơn thao tác đọc bộ nhớ. Trong việc ghi bộ nhớ còn có một khó khăn khác là bộ xử lý cho biết số byte cần phải ghi, thường là từ 1 đến 8 byte. Để đảm bảo đồng nhất dữ liệu khi lưu trữ, có hai cách chính để ghi vào cache: Ghi đồng thời: Thông tin được ghi đồng thời vào khối của cache và khối của bộ nhớ trong. Cách ghi này làm chậm tốc độ chung của hệ thống. Các ngoại vi có thể truy cập bộ nhớ trực tiếp. Ghi lại: Để đảm bảo tốc độ xử lý của hệ thống, thông tin cần ghi chỉ được ghi vào khối trong cache. Để quản lý sự khác biệt nội dung giữa khối của cache và khối của bộ nhớ trong, một bit trạng thái (Dirty bit hay Update bit) được dùng để chỉ thị. Khi một thao tác ghi vào trong cache, bit trạng thái (Dirty bit hay Update bit) của khối cache sẽ được thiết lập. Khi một khối bị thay thế, khối này sẽ được ghi lại vào bộ nhớ trong chỉ khi bit trạng thái đã được thiết lập. Với cách ghi này, các ngoại vi liên hệ đến bộ nhớ trong thông qua cache. Khi có một thất bại ghi vào cache thì phải lựa chọn một trong hai giải pháp sau: Ghi có nạp: Khối cần ghi từ bộ nhớ trong được nạp vào trong cache như mô tả ở trên. Cách này thường được dùng trong cách ghi lại.

250 Chương 6: Kiến trúc bộ nhớ tiên tiến 251 Ghi không nạp: Khối được thay đổi ở bộ nhớ trong không được đưa vào cache. Cách này được dùng trong cách ghi đồng thời. Trong các tổ chức có nhiều hơn một bộ xử lý với các tổ chức cache và bộ nhớ chia sẻ, các vấn đề liên quan đến tính đồng nhất của dữ liệu cần được đảm bảo. Sự thay đổi dữ liệu trên một cache riêng lẻ sẽ làm cho dữ liệu trên các hệ thống cache và bộ nhớ liên quan không đồng nhất. Vấn đề trên có thể được giải quyết bằng một trong các hệ thống cache tổ chức như sau: Mỗi bộ điều khiển cache sẽ theo dõi các thao tác ghi vào bộ nhớ từ các bộ phận khác. Nếu thao tác ghi vào phần bộ nhớ chia sẻ được ánh xạ vào cache của nó quản lý, bộ điều khiển cache sẽ vô hiệu hóa sự thâm nhập này. Chiến lược này phụ thuộc vào cách ghi đồng thời trên tất cả các bộ điều khiển cache. Một vi mạch được dùng để điều khiển việc cập nhật, một thao tác ghi vào bộ nhớ từ một cache nào đó sẽ được cập nhật trên các cache khác. Một vùng nhớ chia sẻ cho một hay nhiều bộ xử lý thì không được ánh xạ lên cache. Như vậy, tất cả các thâm nhập vào vùng nhớ chia sẻ này đều bị thất bại Hiệu quả của Cache Thông thường người ta dùng thời gian thâm nhập trung bình bộ nhớ trong để đánh giá hiệu quả của cache. Thời gian thâm nhập trung bình được cho bởi công thức: Thời gian thâm nhập trung bình = Thời gian thâm nhập thành công + Tỉ số thất bại x Trừng phạt thất bại. Thời gian thâm nhập thành công là thời gian thâm nhập vào một thông tin trong một thành công cache. Tỉ số thất bại là tỉ số giữa số cache thất bại và tổng số thâm nhập cache. Thời gian thâm nhập thành công và trừng phạt thất bại được đo bằng đơn vị thời gian hoặc bằng chu kỳ xung nhịp (clock cycle). Trong việc tìm kiếm thông tin trong cache phải chú ý làm giảm tỉ lệ thất bại mà các nguyên nhân chính như sau: Khởi động: trong lần thâm nhập cache đầu tiên, không có thông tin cần tìm trong cache nên phải chuyển khối chứa thông tin đó vào cache. Khả năng: vì cache không thể chứa tất cả các khối cần thiết cho việc thi hành một chương trình nên gặp thất bại do cache thiếu khả năng, do đó một khối bị lấy ra khỏi cache rồi lại được đưa vào sau này.

251 252 Kiến trúc máy tính tiên tiến Tranh chấp: Nếu chiến thuật thay thế các khối là phối hợp theo tập hợp hay tương ứng trực tiếp, các thất bại do tranh chấp xảy ra vì một khối có thể bị đưa ra khỏi cache rồi được gọi vào sau đó nếu có nhiều khối phải được thay thế trong các tập hợp. Ba nguyên nhân trên cho ta ý niệm về nguyên nhân thất bại, nhưng mô hình đơn giản trên có những hạn chế của nó. Mô hình này giúp ta thấy một số liệu trung bình nhưng chưa giải thích được từng thất bại một. Ví dụ, nếu tăng kích thước cache thì giảm thất bại do tranh chấp và thất bại do khả năng vì cache càng lớn thì nhiều khối có thể được đưa vào. Tuy nhiên, một thất bại có thể đi từ thất bại do khả năng đến thất bại do tranh chấp khi kích thước của cache thay đổi. Khi nêu ba nguyên nhân trên ta đã không lưu ý đến cách thức thay thế các khối. Cách thức này có thể dẫn đến những vận hành bất thường như là tỉ lệ thất bại tăng khi độ phối hợp lớn lên Cache duy nhất hay Cache riêng lẻ Cache duy nhất chứa đồng thời lệnh và dữ liệu. Cache riêng lẻ phân biệt cache lệnh và cache dữ liệu. Với một cache duy nhất, sẽ có tranh chấp khi một lệnh muốn thâm nhập một số liệu trong cùng một chu kỳ của giai đoạn đọc một lệnh khác. Cache riêng lẻ còn giúp tối ưu hóa mỗi loại cache về mặt kích thước tổng quát, kích thước các khối và độ phối hợp các khối Các mức Cache Việc dùng cache trong có thể làm cho sự cách biệt giữa kích thước và thời gian thâm nhập giữa cache trong và bộ nhớ trong càng lớn. Người ta đưa vào nhiều mức cache: Cache mức một (L1 cache): thường là cache trong (on-chip cache, nằm bên trong CPU). Cache mức hai (L2 cache): thường là cache ngoài (off-chip cache, cache này nằm bên ngoài CPU). Ngoài ra, trong một số hệ thống (PowerPC G4, IBM S/390 G4, Itanium của Intel) còn có tổ chức cache mức ba (L3 cache), đây là mức cache trung gian giữa cache L2 và một thẻ bộ nhớ. Bộ xử lý Kiểu Năm phát hành L1 Cache a L2 Cache L3 Cache IBM 360/85 Mainframe to 32 KB - - PDP-11/70 Mini Computer KB - - VAX 11/780 Mini Computer KB - - IBM 3033 Mainframe KB - -

252 Chương 6: Kiến trúc bộ nhớ tiên tiến 253 Bộ xử lý Kiểu Năm phát hành L1 Cache a L2 Cache L3 Cache IBM 3090 Mainframe to 256 KB - - Intel PC KB - - Pentium PC KB / 8 KB 256 to 512 KB - PowerPC 601 PC KB - - PowerPC 620 PC KB / 32 KB - - PowerPC G4 PC/Server KB / 32 KB 256 KB to 1 MB 2 MB IBM S390/G4 Mainframe KB 256 KB 2 MB IBM S390/G6 Mainframe KB 8 MB - Pentium 4 PC/Server KB / 8 KB 256 KB - IBM SP High-End server/ Super Computer KB / 32 KB 8 MB - CRAY MTA b Super Computer KB 2 MB - Itanium PC/Server KB / 16 KB 96 KB 2 MB SGI Origin 2001 High-End server KB / 32 KB 4 MB - a Hai giá trị cách nhau bởi dấu / chỉ giá trị cache lệnh và cache dữ liệu. b Cả hai giá trị đều là cache lệnh Bộ nhớ trong Bảng 6.2: Kích thước Cache của một số hệ thống. Bộ nhớ trong thỏa mãn các yêu cầu của cache và được dùng làm đệm vào ra vì bộ nhớ trong vừa là nơi chứa các thông tin từ ngoài đưa vào, vừa là nơi xuất ra các thông tin cho cache. Việc đo hiệu quả của bộ nhớ trong dựa vào thời gian thâm nhập và bề rộng dải thông. Thông thường thời gian thâm nhập bộ nhớ trong là phần tử quan trọng cho cache trong lúc bộ nhớ dải thông là phần chính cho các tác vụ xuất nhập. Với việc dùng phổ biến các cache ngoài, dải thông của bộ nhớ trong cũng trở thành quan trọng cho cache. Mặc dù cache cần bộ nhớ trong có thời gian thâm nhập nhỏ, nhưng thường thì dễ cải thiện dải thông bộ nhớ nhờ nhiều cách tổ chức bộ nhớ mới, hơn là giảm thời gian thâm nhập cho cache. Cache thụ hưởng các tiến bộ về dải thông bằng cách tăng kích thước của mỗi khối của cache mà không tăng đáng kể trừng phạt thất bại cache. Người ta dùng các kỹ thuật sau đây để nới rộng dải thông của bộ nhớ trong: Nới rộng chiều dài ô nhớ trong: đây là kỹ thuật đơn giản để tăng dải thông bộ nhớ. Thông thường cache và bộ nhớ trong có chiều rộng ô nhớ là chiều rộng 1 từ vì bộ xử lý thâm nhập vào một từ ô nhớ. Nhân đôi, nhân bốn chiều rộng ô nhớ của cache và bộ nhớ trong làm lưu lượng thâm nhập bộ nhớ trong được nhân đôi hay nhân bốn. Vậy cũng phải nới rộng bus bộ nhớ (là bus nối bộ xử lý với bộ nhớ).

253 254 Kiến trúc máy tính tiên tiến Một ví dụ bộ xử lý có chiều dài ô nhớ trong lớn là bộ xử lý Alpha AXP (Hãng DEC). Cache ngoài, bộ nhớ trong và bus bộ nhớ đều có độ rộng là 256 bit. Bộ nhớ đan chéo đơn giản: các IC bộ nhớ có thể được tổ chức thành dải để đọc hay viết nhiều từ cùng một lúc thay vì chỉ đọc một từ, độ rộng của bus và của cache không thay đổi. Khi gửi nhiều địa chỉ đến nhiều dải thì ta đọc được nhiều từ cùng một lúc. Bộ nhớ đan chéo cũng cho phép ghi vào bộ nhớ nhiều từ cùng một lúc. Tổ chức bộ nhớ đan chéo đơn giản không rắc rối nhiều so với tổ chức bình thường của bộ nhớ trong, vì các dải có thể dùng chung các đường địa chỉ với bộ điều khiển ô nhớ và như thế mỗi dải có thể dùng phần số liệu của bus bộ nhớ. SDRAM và DDR SDRAM là các loại RAM dùng kỹ thuật này. Bộ nhớ đan chéo tổ chức thành dải độc lập: một tổ chức bộ nhớ đan chéo hiệu quả hơn là cho phép nhiều thâm thập bộ nhớ và như thế cho phép các dải làm việc độc lập với nhau. Mỗi dải cần có các đường địa chỉ riêng biệt và đôi khi cần bus số liệu riêng biệt: Trong trường hợp này bộ xử lý có thể tiếp tục công việc của mình trong lúc chờ đợi số liệu (trường hợp thất bại cache). RDRAM là bộ nhớ loại này. Tránh xung đột giữa các dải bộ nhớ. Trong các máy tính đa xử lý và máy tính vectơ, hệ thống bộ nhớ được thiết kế nhằm cho phép nhiều yêu cầu thâm nhập độc lập nhau. Sự hiệu quả của hệ thống tùy thuộc vào tần số các trường hợp có yêu cầu độc lập thâm nhập vào các dải khác nhau. Với sự đan chéo bình thường (hình 6.6), các thâm nhập tuần tự hoặc tất cả các thâm nhập vào các địa chỉ cách biệt nhau một số chẵn, thì vận hành tốt nhưng sẽ gặp rắc rối nếu sự cách biệt giữa các địa chỉ là một số lẻ. Một biện pháp mà các máy tính lớn dùng làm giảm bớt các trường hợp xung đột tĩnh bằng cách tăng số lượng các dải. Ví dụ, máy NEC SX/3 chia bộ nhớ trong ra 128 dải. Địa chỉ Dải 0 Địa chỉ Dải 1 Địa chỉ Dải 2 Địa chỉ Dải Hình 6.6: Bộ nhớ đan chéo bậc 4. Dải thứ i chứa tất cả các từ có địa chỉ thỏa mãn công thức (địa chỉ) mod 4 = i.

254 Chương 6: Kiến trúc bộ nhớ tiên tiến Hỗ trợ bộ nhớ ảo Bộ nhớ ảo xác định một cơ chế vận chuyển tự động số liệu giữa bộ nhớ trong và bộ nhớ ngoài (đĩa từ). Trước đây, khi độ dài của chương trình vượt quá giới hạn dung lượng bộ nhớ thì người lập trình phải phân chia chương trình của mình thành từng phần tự loại bỏ nhau (overlay) và phải tự quản lý việc trao đổi thông tin giữa bộ nhớ và đĩa từ. Bộ nhớ ảo làm nhẹ trách nhiệm của các nhà lập trình bằng cách làm cho việc trao đổi thông tin này được thực hiện một cách tự động. Trong các bộ xử lý hiện đại, bộ nhớ ảo được dùng để cho phép thực hiện cùng lúc nhiều tiến trình (process), mỗi tiến trình có một không gian định vị riêng. Nếu tất cả các không gian định vị này đều thuộc không gian định vị bộ nhớ trong thì rất tốn kém. Bộ nhớ ảo bao gồm bộ nhớ trong và bộ nhớ ngoài được phân tích thành khối để có thể cung cấp cho mỗi chương trình một số khối cần thiết cho việc thực hiện chương trình đó. Hình 6.7 cho thấy một chương trình chứa trong bộ nhớ ảo gồm 4 khối, 3 trong 4 khối nằm ở bộ nhớ trong, khối thứ tư nằm trên đĩa. Hình 6.7: Một chương trình gồm 4 trang A, B, C, D trong đó trang D nằm trong ổ đĩa.

255 256 Kiến trúc máy tính tiên tiến Ngoài việc phân chia không gian bộ nhớ, cần bảo vệ và quản lý tự động các cấp bộ nhớ, bộ nhớ ảo đơn giản hóa việc nạp chương trình vào bộ nhớ để thi hành nhờ một cơ chế được gọi là sự tái định địa chỉ (address relocation). Cơ chế này cho phép một chương trình có thể được thi hành khi nó nằm ở bất cứ vị trí nào trong bộ nhớ. Ngoài sự khác biệt định lượng mà ta thấy trong hình 6.9, có những khác biệt khác giữa bộ nhớ cache và bộ nhớ ảo là: - Khi thất bại cache, sự thay thế một khối trong cache được điều khiển bằng phần cứng, trong khi sự thay thế trong bộ nhớ ảo là chủ yếu do hệ điều hành. Tham số Cache Bộ nhớ ảo Chiều dài mỗi khối (trang) byte byte Thời gian thâm nhập thành công 1 2 xung nhịp xung nhịp Trừng phạt khi thất bại Thời gian thâm nhập Di chuyển số liệu xung nhịp 6 60 xung 2 40 xung triệu xung triệu xung triệu xung Tỉ số thất bại 0,5% - 10% 0,00001% - 0,001% Dung lượng 8 KB 8 MB 16 MB 8 GB Bảng 6.3: Đại lượng điển hình cho bộ nhớ Cache và bộ nhớ ảo. So với bộ nhớ cache thì các tham số của bộ nhớ ảo tăng từ 10 đến lần. - Không gian định vị mà bộ xử lý quản lý là không gian định vị của bộ nhớ ảo, trong lúc đó thì dung lượng bộ nhớ cache không tùy thuộc vào không gian định vị bộ xử lý. - Bộ nhớ ngoài còn được dùng để lưu trữ tập tin ngoài nhiệm vụ là hậu phương của bộ nhớ trong (trong các cấp bộ nhớ). Bộ nhớ ảo cũng được thiết kế bằng nhiều kỹ thuật đặc thù cho chính nó. Các hệ thống bộ nhớ ảo có thể được chia thành 2 loại: loại với khối có dung lượng cố định gọi là trang và loại với khối có chiều dài thay đổi gọi là đoạn. Định vị trang xác định một địa chỉ trong trang, giống như định vị trong cache. Trong định vị đoạn cần 2 từ: một từ chứa số thứ tự đoạn và một từ chứa độ dời trong đoạn. Chương trình dịch gặp khó khăn nhiều hơn trong định vị đoạn. Do việc thay thế các đoạn, ngày nay ít máy tính dùng định vị đoạn thuần túy. Một vài máy dùng cách hỗn hợp gọi là đoạn trang. Trong đó mỗi đoạn chứa một số nguyên các trang. Bây giờ chúng ta trả lời 4 câu hỏi đặt ra trong các cấp bộ nhớ cho bộ nhớ ảo.

256 Chương 6: Kiến trúc bộ nhớ tiên tiến 257 Câu hỏi 1: Một khối được đặt tại đâu trong bộ nhớ trong? Việc trừng phạt bộ nhớ ảo khi có thất bại, tương ứng với việc phải thâm nhập vào ổ đĩa. Việc thâm nhập này rất chậm nên người ta chọn phương án hoàn toàn phối hợp trong đó các khối (trang) có thể nằm ở bất kỳ vị trí nào trong bộ nhớ trong. Cách này cho tỉ lệ thất bại thấp. Địa chỉ ảo Bộ nhớ ảo Page Page 1 Bộ nhớ vật lý Địa chỉ vật lý Page 2 Page frame Page 3 Page frame Page 4 Page frame Page 5 Page frame Page Page 7 Hình 6.8: Ánh xạ các trang ảo vào bộ nhớ vật lý. Câu hỏi 2: Làm thế nào để tìm một khối khi nó đang nằm trong bộ nhớ trong? Định vị trang và định vị đoạn đều dựa vào một cấu trúc dữ liệu trong đó số thứ tự trang hoặc số thứ tự đoạn được có chỉ số. Cho định vị trang, dựa vào bảng trang, địa chỉ trong bộ nhớ vật lý được xác lập cuối cùng là việc đặt kề nhau số thứ tự của trang vật lý với địa chỉ trong trang (hình 6.9). Cho định vị đoạn, dựa vào thông tin trên bảng đoạn, việc kiểm tra tính hợp lệ của địa chỉ được tiến hành. Địa chỉ vật lý cuối cùng được xác lập bằng cách cộng địa chỉ đoạn và địa chỉ trong đoạn (độ dời trong đoạn) - hình Câu hỏi 3: Khối nào phải được thay thế khi có thất bại trang? Hầu hết các hệ điều hành đều cố gắng thay thế khối ít dùng gần đây nhất (LRU: Least Recent Utilized) vì nghĩ rằng đây là khối ít cần nhất. Câu hỏi 4: Việc gì xảy ra khi cần ghi số liệu? Chiến thuật ghi luôn là một sự ghi lại, nghĩa là thông tin chỉ được viết vào trong khối của bộ nhớ trong. Khối có thay đổi thông tin, được chép vào đĩa từ nếu khối này bị thay thế.

257 258 Kiến trúc máy tính tiên tiến Hình 6.9: Minh họa sự ánh xạ địa chỉ giữa bộ nhớ ảo và bộ nhớ vật lý trong định vị trang. Hình 6.10: Ánh xạ địa chỉ giữa bộ nhớ ảo và bộ nhớ vật lý trong cách định vị đoạn.

258 Chương 6: Kiến trúc bộ nhớ tiên tiến Bảo vệ các tiến trình bằng cách dùng bộ nhớ ảo Sự xuất hiện của đa chương trình (multiprogram) trong đó máy tính chạy nhiều chương trình song song với nhau, dẫn tới các đòi hỏi mới về việc bảo vệ và phân chia giữa các chương trình. Đa chương trình đưa đến khái niệm tiến trình (process): một tiến trình gồm có một chương trình đang thực hiện và tất cả các thông tin cần thiết để tiếp tục thực hiện chương trình này. Trong đa chương trình, bộ xử lý và bộ nhớ trong được nhiều người sử dụng chia sẻ một cách qua lại (interactive), cùng một thời điểm, để tạo cảm giác rằng mỗi người dùng đang có một máy tính riêng. Và như thế, tại bất cứ lúc nào, phải có thể chuyển đổi từ một tiến trình này sang một tiến trình khác. Một tiến trình phải vận hành đúng đắn, dù nó được thi hành liên tục từ đầu tới cuối, hay nó bị ngắt qua lại bởi các tiến trình khác. Trách nhiệm đảm bảo các tiến trình đều chạy đúng, được chia sẻ giữa nhà thiết kế máy tính và nhà thiết kế hệ điều hành. Nhà thiết kế máy tính phải đảm bảo bộ xử lý có thể lưu giữ trạng thái các tiến trình và phục hồi các trạng thái này, còn nhà thiết kế hệ điều hành phải đảm bảo các tiến trình không ảnh hưởng lên nhau. Hệ điều hành giải quyết vấn đề này bằng cách chia bộ nhớ trong cho các tiến trình và trạng thái của mỗi tiến trình này hiện diện trong phần bộ nhớ được chia cho nó. Điều này có nghĩa rằng các nhà thiết kế hệ điều hành phải được sự giúp sức của các nhà chế tạo máy tính để bảo vệ một tiến trình không bị ảnh hưởng bởi tiến trình khác. Nhà thiết kế máy tính có thêm 3 trách nhiệm trong việc giúp các nhà thiết kế hệ điều hành bảo vệ các tiến trình là: 1. Cung cấp hai chế độ vận hành cho biết tiến trình đang thực hiện là tiến trình của người sử dụng hay tiến trình hệ thống (của người điều hành). 2. Cung cấp một tập hợp con trạng thái của bộ xử lý mà tiến trình người sử dụng có thể dùng nhưng không thể sửa đổi. 3. Cung cấp các cơ chế để có thể chuyển đổi từ chế độ người dùng sang chế độ người điều hành và ngược lại. Chúng ta đã thấy, địa chỉ mà bộ xử lý đưa ra phải được biến đổi từ địa chỉ ảo sang địa chỉ vật lý. Điều này giúp phần cứng đi xa nữa trong việc bảo vệ các tiến trình. Cách đơn giản nhất làm việc này là cho phép tiến trình người sử dụng tác động lên các bit cho phép thâm nhập vào mỗi trang hay mỗi đoạn. Khi bộ xử lý phát ra tín hiệu đọc (hay viết) và tín hiệu người dùng (hay hệ thống) thì rất dễ dàng phát hiện các việc thâm nhập trái phép bộ nhớ trước khi việc thâm nhập này gây hư hại. Các tiến trình được bảo vệ và có bảng trang riêng cho mình trỏ đến các trang tách rời nhau trong bộ nhớ.

259 TAØI LIEÄU THAM KHAÛO [1]. Hennesy J.L. and Patterson D.A., Computer Architecture: A Quantitative Approach, 4th Edition, Morgan Kaufmann, 2006 [2]. Stallings W., Computer Organization and Architecture: Designing for Performance, 8th Edition, Prentice Hall, 2009 [3]. Hesham El-Rewini, Mostafa Abd-El-Barr, Advanced Computer Architecture and Parallel Processing, Wiley, 2005 [4]. Dr. Petru Eles, Very Long Instruction word processor [5]. S Balakrishnan, Very Long Instruction word processor [6]. Weng Fook Lee, VLIW Microprocessor Hardware Design [7]. Introduction to VLIW Computer Architecture, Philips Semiconductors [8]. [9]. [10]. SPARC Enterprise ARCHITECTURE M4000/M5000/M8000/M9000 Servers - [11]. Sun SPARC Enterprise M4000/M5000 Servers Overview Guide Alcatel University - [12]. [13]. [14]. [15]. [16]. [17]. [18].

260

Quản lý phạm vi (Scope) Chương II

Quản lý phạm vi (Scope) Chương II Quản lý phạm vi (Scope) Chương II 1. Quản lý phạm vi (Scope) là gì? 2. Khởi động dự án (Initiating project). Nội dung 3. Lập kế hoạch phạm vi (Planning) và Xác định phạm vi (Definition). 4. Kiểm tra phạm

More information

Chương 7 KIẾN TRÚC MÁY TÍNH TIÊN TIẾN

Chương 7 KIẾN TRÚC MÁY TÍNH TIÊN TIẾN Kiến trúc máy tính Nội dung giáo trình Chương 7 KIẾN TRÚC MÁY TÍNH TIÊN TIẾN Chương 1. Giới thiệu chung Chương 2. Hệ thống máy tính Chương 3. Số học máy tính Chương 4. Bộ xử lý trung tâm Chương 5. Bộ nhớ

More information

Bài tập 4 C# Mục tiêu:

Bài tập 4 C# Mục tiêu: TRƯỜNG ĐH KỸ THUẬT CÔNG NGHỆ Khoa Công Nghệ Thông Tin Môn: Lập trình Windows Bài tập 4 C# Windows Form Application - Basic Mục tiêu: - Sử dụng Visual Studio.NET 2005 (hoặc 2008) tạo ứng dụng dạng Windows

More information

GIẢI PHÁP QUẢN LÝ DỊCH VỤ CNTT TỔNG QUAN

GIẢI PHÁP QUẢN LÝ DỊCH VỤ CNTT TỔNG QUAN GIẢI PHÁP QUẢN LÝ DỊCH VỤ CNTT TỔNG QUAN "Các nhà cung cấp các dịch vụ IT cần hướng sự quan tâm đến chất lượng các dịch vụ do họ cung cấp và tập trung vào mối quan hệ với các khách hàng" Quản lý dịch vụ

More information

Mô hình Mundell-Fleming

Mô hình Mundell-Fleming Mô hình Mundell-Fleming IS-LM-CM Small Open Economy Capital Mobility This model must be one of the most influential advances in macroeconomics in recent times. Economic Times It still serves as the default

More information

Gv.HVK 1 KIỂU DỮ LIỆU CÓ CẤU TRÚC

Gv.HVK 1 KIỂU DỮ LIỆU CÓ CẤU TRÚC Gv.HVK 1 KIỂU DỮ LIỆU CÓ CẤU TRÚC 1. Trong ngôn ngữ lập trình Pascal, về mặt cú pháp câu lệnh nào sau đây là đúng? A. Type 1chieu=array[1..100] of char; B. Type 1chieu=array[1-100] of byte; C. Type mang1c=array(1..100)

More information

Mô hình Mundell-Fleming. IS-LM-CM Small Open Economy Capital Mobility

Mô hình Mundell-Fleming. IS-LM-CM Small Open Economy Capital Mobility Mô hình Mundell-Fleming IS-LM-CM Small Open Economy Capital Mobility This model must be one of the most influential advances in macroeconomics in recent times. Economic Times It still serves as the default

More information

Nguyên lý hệ điều hành. Các hệ thống lưu trữ. Cấu trúc đĩa. Lập lịch đĩa (1) Lập lịch đĩa (3) Lập lịch đĩa (2)

Nguyên lý hệ điều hành. Các hệ thống lưu trữ. Cấu trúc đĩa. Lập lịch đĩa (1) Lập lịch đĩa (3) Lập lịch đĩa (2) Nguyên lý hệ điều hành Nguyễn Hải Châu Khoa Công nghệ Thông tin Trường Đại học Công nghệ Các hệ thống lưu trữ Cấu trúc đĩa Lập lịch đĩa Quản lý đĩa Quản lý không gian swap Cấu trúc RAID... Cấu trúc đĩa

More information

An toàn Bảo mật thông tin (Mật mã cổ điển) Giáo viên: Phạm Nguyên Khang

An toàn Bảo mật thông tin (Mật mã cổ điển) Giáo viên: Phạm Nguyên Khang An toàn Bảo mật thông tin (Mật mã cổ điển) Giáo viên: Phạm Nguyên Khang pnkhang@cit.ctu.edu.vn Nội dung Tổng quan về an toàn và bảo mật thông tin Các hệ mật mã cổ điển Mật mã thay thế Mật mã Ceasar Mật

More information

VẤN ĐỀ LÝ LUẬN VỀ MÔ HÌNH QUẢN TRỊ CHI PHÍ SẢN XUẤT CAPACITY CỦA CAM-I

VẤN ĐỀ LÝ LUẬN VỀ MÔ HÌNH QUẢN TRỊ CHI PHÍ SẢN XUẤT CAPACITY CỦA CAM-I 1. Đặt vấn đề VẤN ĐỀ LÝ LUẬN VỀ MÔ HÌNH QUẢN TRỊ CHI PHÍ SẢN XUẤT CAPACITY CỦA CAM-I ThS. Nguyễn Thị Thanh Vân Khoa Tài chính - Kế toán, Trường Đại học Đông Á TÓM TẮT Bài báo tiến hành phân tích phương

More information

ỨNG DỤNG MÁY TOÀN ĐẠC ĐIỆN TỬ LEICA VIVA TS15 VÀ PHẦN MỀM GOCA ĐỂ TỰ ĐỘNG QUAN TRẮC BIẾN DẠNG TƯỜNG VÂY NHÀ CAO TẦNG

ỨNG DỤNG MÁY TOÀN ĐẠC ĐIỆN TỬ LEICA VIVA TS15 VÀ PHẦN MỀM GOCA ĐỂ TỰ ĐỘNG QUAN TRẮC BIẾN DẠNG TƯỜNG VÂY NHÀ CAO TẦNG ỨNG DỤNG MÁY TOÀN ĐẠC ĐIỆN TỬ LEICA VIVA TS15 VÀ PHẦN MỀM GOCA ĐỂ TỰ ĐỘNG QUAN TRẮC BIẾN DẠNG TƯỜNG VÂY NHÀ CAO TẦNG ThS. TRẦN NGỌC ĐÔNG, KS. DIÊM CÔNG HUY Viện KHCN Xây dựng Tóm tắt: Bài báo trình bày

More information

QUẢN TRỊ HỆ THỐNG GIAO THÔNG

QUẢN TRỊ HỆ THỐNG GIAO THÔNG QUẢN TRỊ HỆ THỐNG GIAO THÔNG Chủ tịch, Thạc sĩ : Đỗ Bá Dân Công ty CP Đầu tư phát triển công nghệ Trí Nam VIETNAM TRAFFIC IRAQ WAR VS ~12.000 người chết/năm ~15.000 người chết/năm Tham gia giao thông tại

More information

Công ước STCW 78/95/2012 sữa ñổi bổ xung và công tác ñào tạo tiếng Anh

Công ước STCW 78/95/2012 sữa ñổi bổ xung và công tác ñào tạo tiếng Anh Công ước STCW 78/95/2012 sữa ñổi bổ xung và công tác ñào tạo tiếng Anh hàng hải Công ước STCW 78/95/2012 sữa ñổi bổ xung và công tác ñào tạo tiếng Anh hàng hải STCW và tiếng Anh hàng hải Giới thiệu Sự

More information

LUẬN ÁN TIẾN SĨ KINH TẾ

LUẬN ÁN TIẾN SĨ KINH TẾ BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC KINH TẾ THÀNH PHỐ HỒ CHÍ MINH NGUYỄN BÍCH LIÊN XÁC ĐỊNH VÀ KIỂM SOÁT CÁC NHÂN TỐ ẢNH HƯỞNG CHẤT LƯỢNG THÔNG TIN KẾ TOÁN TRONG MÔI TRƯỜNG ỨNG DỤNG HỆ THỐNG HOẠCH ĐỊNH

More information

1.2 Vai trò của kế toán quản trị chi phí trong quản trị doanh nghiệp Mô hình lý thuyết cơ bản của kế toán quản trị chi phí 16

1.2 Vai trò của kế toán quản trị chi phí trong quản trị doanh nghiệp Mô hình lý thuyết cơ bản của kế toán quản trị chi phí 16 LỜI CAM ðoan Tôi xin cam ñoan ñây là công trình nghiên cứu của riêng tôi. Các số liệu trong luận án là trung thực. Những kết quả trong luận án chưa từng ñược công bố trong bất cứ một công trình nào khác.

More information

HỌC VIỆN TÀI CHÍNH GIẢI PHÁP TÁI CẤU TRÚC TÀI CHÍNH CÁC DOANH NGHIỆP TRONG NGÀNH THÉP

HỌC VIỆN TÀI CHÍNH GIẢI PHÁP TÁI CẤU TRÚC TÀI CHÍNH CÁC DOANH NGHIỆP TRONG NGÀNH THÉP BỘ GIÁO DỤC VÀ ĐÀO TẠO BỘ TÀI CHÍNH HỌC VIỆN TÀI CHÍNH ĐẶNG PHƯƠNG MAI GIẢI PHÁP TÁI CẤU TRÚC TÀI CHÍNH CÁC DOANH NGHIỆP TRONG NGÀNH THÉP Ở VIỆT NAM LUẬN ÁN TIẾN SĨ KINH TẾ HÀ NỘI - 2016 BỘ GIÁO DỤC VÀ

More information

THÔNG BÁO TUYỂN SINH ĐÀO TẠO TRÌNH ĐỘ THẠC SĨ NĂM đợt 1 (Địa chỉ trang web: sinh/saudaihoc)

THÔNG BÁO TUYỂN SINH ĐÀO TẠO TRÌNH ĐỘ THẠC SĨ NĂM đợt 1 (Địa chỉ trang web:  sinh/saudaihoc) ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐH KHOA HỌC TỰ NHIÊN CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc Số: 278 /KHTN-SĐH Tp. Hồ Chí Minh, ngày 02 tháng 3 năm 2018 THÔNG BÁO TUYỂN SINH ĐÀO TẠO TRÌNH

More information

TÍNH TOÁN TẢI TRỌNG GIÓ TÁC DỤNG LÊN HỆ MẶT DỰNG KÍNH THEO TIÊU CHUẨN VIỆT NAM, HOA KỲ VÀ CHÂU ÂU

TÍNH TOÁN TẢI TRỌNG GIÓ TÁC DỤNG LÊN HỆ MẶT DỰNG KÍNH THEO TIÊU CHUẨN VIỆT NAM, HOA KỲ VÀ CHÂU ÂU TÍNH TOÁN TẢI TRỌNG GIÓ TÁC DỤNG LÊN HỆ MẶT DỰNG KÍNH THEO TIÊU CHUẨN VIỆT NAM, HOA KỲ VÀ CHÂU ÂU ThS. NGUYỄN MẠNH CƯỜNG, ThS. ĐỖ HOÀNG LÂM, ThS. NGUYỄN HỒNG HẢI Viện KHCN Xây dựng TS. Đại úy. ĐẶNG SỸ

More information

ĐỀ CƢƠNG CHI TIẾT HỌC PHẦN NGÔN NGỮ LẬP TRÌNH 2 PROGRAMMING LANGUAGES II (LẬP TRÌNH DOTNET)

ĐỀ CƢƠNG CHI TIẾT HỌC PHẦN NGÔN NGỮ LẬP TRÌNH 2 PROGRAMMING LANGUAGES II (LẬP TRÌNH DOTNET) KHOA CÔNG NGHỆ THÔNG TIN CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc ĐỀ CƢƠNG CHI TIẾT HỌC PHẦN NGÔN NGỮ LẬP TRÌNH 2 PROGRAMMING LANGUAGES II (LẬP TRÌNH DOTNET) 1. Thông tin về giáo viên

More information

LÀM VIỆC THÔNG MINH TRONG NGÀNH BÁN LẺ

LÀM VIỆC THÔNG MINH TRONG NGÀNH BÁN LẺ LÀM VIỆC THÔNG MINH TRONG NGÀNH BÁN LẺ LS Retail NAV 6.4 Giải pháp bán lẻ trên nền tảng Microsoft Dynamics NAV Đã được Kiểm chứng, Thử nghiệm và Khuyên dùng Điểm mạnh của Microsoft Dynamics NAV là có nền

More information

Buhler Vietnam. 16-July Innovations for a better world.

Buhler Vietnam. 16-July Innovations for a better world. Buhler Vietnam 16-July-2017 Innovations for a better world. Buhler in Vietnam Serving our customers in Vietnam since 1960 Until 1990 Q1 2012 Q4 2012 Q1 2013 Q2 2016 Q4 2016 Active in Vietnam since 1960

More information

Tổng quan về Áp dụng Tiếp cận Hệ sinh thái vào các khu đất ngập nước tại Việt Nam

Tổng quan về Áp dụng Tiếp cận Hệ sinh thái vào các khu đất ngập nước tại Việt Nam Tổng quan về Áp dụng Tiếp cận Hệ sinh thái vào các khu đất ngập nước tại Việt Nam Hà Nội, ngày 9-11 tháng 1 năm 2008 TỔ CHỨC BẢO TỒN THIÊN NHIÊN QUỐC TẾ VĂN PHÒNG TẠI VIỆT NAM Villa 44/4 Vạn Bảo Hà Nội,

More information

BÀI TẬP MÔN HỌC KỸ THUẬT VI XỬ LÝ VÀ ỨNG DỤNG

BÀI TẬP MÔN HỌC KỸ THUẬT VI XỬ LÝ VÀ ỨNG DỤNG 1. Yêu cầu thực hiện - Bài tập môn học Kỹ thuật vi xử lý và ứng dụng được in thành tài liệu chính thống phát cho người học, đây là tài liệu quan trọng giúp người học trong quá trình tự học, tự nghiên cứu.

More information

Phủ UV định hình theo màu in. Ép kim (vàng) Thúc nổi theo hình, ép kim (vàng)

Phủ UV định hình theo màu in. Ép kim (vàng) Thúc nổi theo hình, ép kim (vàng) Phủ UV theo họa tiết Phủ UV định hình theo màu in Ép kim (vàng) Thúc nổi theo hình, ép kim (vàng) ĐÀ NẴNG ơ Nguồn ảnh: Internet Thành phố đáng sống nhất thế giới Điểm du lịch mới hấp dẫn nhất hành tinh

More information

ETABS KIẾN THỨC SỬ DỤNG

ETABS KIẾN THỨC SỬ DỤNG KetcauSoft - Phát triển phần mềm thiết kế Kết cấu Việt Nam ETABS KIẾN THỨC SỬ DỤNG Được biên soạn bởi KetcauSoft - Phát triển phần mềm thiết kế Kết cấu Việt Nam Hà Nội - 2014 Hà Nội - 2014 1 LỜI MỞ ĐẦU

More information

2898 max. ĐH Bách Khoa TP.HCM 1. Phổ của trái đất (288 o K) Phổ điện từ của ánh sáng. Định luật Wien. Dãy phổ phát ra từ mặt trời

2898 max. ĐH Bách Khoa TP.HCM 1. Phổ của trái đất (288 o K) Phổ điện từ của ánh sáng. Định luật Wien. Dãy phổ phát ra từ mặt trời ĐH BÁCH KHOA TP.HCM Bài giảng: QUẢN LÝ VÀ SỬ DỤNG NĂNG LƯỢNG Chương 5: Quản lý và sử dụng hiệu quả năng lượng hệ thống chiếu sáng Chương 5: Quản lý và sử dụng hiệu quả năng lượng hệ thống chiếu sáng 1.

More information

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN Lập trình Visual Basic.Net

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN Lập trình Visual Basic.Net HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CNTT CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc 1. Thông tin về giáo viên ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN Lập trình Visual Basic.Net TT Họ tên giáo viên Học Học

More information

Chương 4. PHÂN TÍCH HỆ THỐNG: Mô hình luồng(dòng) dữ liệu

Chương 4. PHÂN TÍCH HỆ THỐNG: Mô hình luồng(dòng) dữ liệu Chương 4 PHÂN TÍCH HỆ THỐNG: Mô hình luồng(dòng) dữ liệu 1 Các khái niệm Thiết kế mức khái niệm(conceptual design) Mô hình dữ liệu (Data models) Mô hình chức năng(functional Models) Mô hình dữ liệu(data

More information

ĐÁNH GIÁ HIỆU QUẢ XỬ LÝ BỀ MẶT BẰNG CÔNG NGHỆ PLASMA TRÊN MÀNG NHỰA PP, PE, PVC

ĐÁNH GIÁ HIỆU QUẢ XỬ LÝ BỀ MẶT BẰNG CÔNG NGHỆ PLASMA TRÊN MÀNG NHỰA PP, PE, PVC Tạp Chí Khoa Học Giáo Dục Kỹ Thuật Số 35B (3/2016 Trường Đại Học Sư Phạm Kỹ Thuật TP. Hồ Chí Minh 59 ĐÁNH GIÁ HIỆU QUẢ XỬ LÝ BỀ MẶT BẰNG CÔNG NGHỆ PLASMA TRÊN MÀNG NHỰA PP, PE, PVC EVALUATING THE EFFICIENCY

More information

ĐÀ NẴNG. Thành phố đáng sống. nhất thế giới Điểm du lịch mới hấp dẫn nhất hành tinh

ĐÀ NẴNG. Thành phố đáng sống. nhất thế giới Điểm du lịch mới hấp dẫn nhất hành tinh ĐÀ NẴNG ơ Nguồn ảnh: Internet Thành phố đáng sống nhất thế giới Điểm du lịch mới hấp dẫn nhất hành tinh One of the world's best cities to live in Favorite holiday destination Tọa lạc trên con đường mang

More information

Xây dựng lớp xử lý dữ liệu

Xây dựng lớp xử lý dữ liệu Xây dựng lớp xử lý dữ liệu Bởi: Trung tâm tin học Đại học Khoa học tự nhiên HC< Xây dựng lớp xử lý dữ liệu Khi đọc đến phần này, chắc hẳn các bạn cũng đã thực hiện khá nhiều trang web: trang danh sách

More information

Created date March, 2017 Dung Hoang, SEOtheTop.com

Created date March, 2017 Dung Hoang, SEOtheTop.com Created date March, 2017 Dung Hoang, SEOtheTop.com seothetop@gmail.com NỘI DUNG 1. Kỹ thuật SEO Onpage 2017 có còn quan trọng? 2. Các yếu tố quan trọng, bắt buộc với Onpage 3. Kỹ thuật tối ưu SEO Onpage

More information

HIỆU LỰC PHÒNG CHỐNG MỐI CỦA GỖ SAU XỬ LÝ LẮNG ĐỌNG SILICA, DUNG DỊCH HỖN HỢP SILICAT VÀ BORIC AXIT

HIỆU LỰC PHÒNG CHỐNG MỐI CỦA GỖ SAU XỬ LÝ LẮNG ĐỌNG SILICA, DUNG DỊCH HỖN HỢP SILICAT VÀ BORIC AXIT HIỆU LỰC PHÒNG CHỐNG MỐI CỦA GỖ SAU XỬ LÝ LẮNG ĐỌNG SILICA, DUNG DỊCH HỖN HỢP SILICAT VÀ BORIC AXIT Nguyễn Thị Bích Ngọc 1, Nguyễn Duy Vượng 2 TÓM TẮT Gỗ Bồ đề sau khi xử lý lắng đọng silica và dung dịch

More information

PHÂN TÍCH RỦI RO VỀ CHI PHÍ CỦA DỰ ÁN ĐẦU TƯ XÂY DỰNG TRONG GIAI ĐOẠN THI CÔNG RISK ANALYSIS FOR BUILDING PROJECT IN CONSTRUCTION PHASE

PHÂN TÍCH RỦI RO VỀ CHI PHÍ CỦA DỰ ÁN ĐẦU TƯ XÂY DỰNG TRONG GIAI ĐOẠN THI CÔNG RISK ANALYSIS FOR BUILDING PROJECT IN CONSTRUCTION PHASE PHÂN TÍCH RỦI RO VỀ CHI PHÍ CỦA DỰ ÁN ĐẦU TƯ XÂY DỰNG TRONG GIAI ĐOẠN THI CÔNG RISK ANALYSIS FOR BUILDING PROJECT IN CONSTRUCTION PHASE Nguyễn Quốc Tuấn, Lưu Trường Văn* và Hồ Ngọc Phương** ADICO.Co, 1A/27

More information

KẾ TOÁN QUẢN TRỊ CHI PHÍ MÔI TRƯỜNG TRONG CÁC DOANH NGHIỆP CHẾ BIẾN DẦU KHÍ THUỘC TẬP ĐOÀN DẦU KHÍ QUỐC GIA VIỆT NAM

KẾ TOÁN QUẢN TRỊ CHI PHÍ MÔI TRƯỜNG TRONG CÁC DOANH NGHIỆP CHẾ BIẾN DẦU KHÍ THUỘC TẬP ĐOÀN DẦU KHÍ QUỐC GIA VIỆT NAM BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC THƢƠNG MẠI ---------------------------------------- HOÀNG THỊ BÍCH NGỌC KẾ TOÁN QUẢN TRỊ CHI PHÍ MÔI TRƯỜNG TRONG CÁC DOANH NGHIỆP CHẾ BIẾN DẦU KHÍ THUỘC TẬP ĐOÀN

More information

Hướng dẫn sử dụng NukeViet 2.0

Hướng dẫn sử dụng NukeViet 2.0 Hướng dẫn sử dụng NukeViet 2.0 A. Hướng dẫn sử dụng cpanel Tác giả: Nguyễn Hoàng Dũng Sevencd @ nukeviet.vn Email: SevenCD@gmail.com Website: http://lobs-ueh.net Trong phần này chúng tôi sẽ hướng dẫn các

More information

HỢP ĐỒNG MUA BÁN SALE CONTRACT Số / Ref. :../2017/

HỢP ĐỒNG MUA BÁN SALE CONTRACT Số / Ref. :../2017/ CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc ------------- HỢP ĐỒNG MUA BÁN SALE CONTRACT Số / Ref. :../2017/ Ngày / Date: / / - Căn cứ Luật thương mại năm 2005 / Pursuant to the Commercial

More information

243fully-finished units

243fully-finished units RichLane Residences is a premier residential tower that offers a preferred location for Work, Live and Play at the heart of the upmarket neighborhood District 7. It is situated within the vibrant Saigon

More information

TƯ LIỆU VỤ KIỆN GIỮA PHILIPPINES VÀ TRUNG QUỐC VỀ TRANH CHẤP BIỂN ĐÔNG TẠI TOÀ TRỌNG TÀI

TƯ LIỆU VỤ KIỆN GIỮA PHILIPPINES VÀ TRUNG QUỐC VỀ TRANH CHẤP BIỂN ĐÔNG TẠI TOÀ TRỌNG TÀI TƯ LIỆU VỤ KIỆN GIỮA PHILIPPINES VÀ TRUNG QUỐC VỀ TRANH CHẤP BIỂN ĐÔNG TẠI TOÀ TRỌNG TÀI Dự án Đại Sự Ký Biển Đông giới thiệu https://daisukybiendong.wordpress.com/ Bộ tư liệu được thực hiện với sự hợp

More information

NGHIÊN CỨU PHÁT TRIỂN THƯƠNG MẠI ĐIỆN TỬ TRONG CÁC DOANH NGHIỆP DỊCH VỤ VÙNG KINH TẾ TRỌNG ĐIỂM MIỀN TRUNG

NGHIÊN CỨU PHÁT TRIỂN THƯƠNG MẠI ĐIỆN TỬ TRONG CÁC DOANH NGHIỆP DỊCH VỤ VÙNG KINH TẾ TRỌNG ĐIỂM MIỀN TRUNG ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KINH TẾ NGUYỄN XUÂN THỦY NGHIÊN CỨU PHÁT TRIỂN THƯƠNG MẠI ĐIỆN TỬ TRONG CÁC DOANH NGHIỆP DỊCH VỤ VÙNG KINH TẾ TRỌNG ĐIỂM MIỀN TRUNG LUẬN ÁN TIẾN SĨ QUẢN TRỊ KINH DOANH HUẾ -

More information

INDIVIDUAL CONSULTANT PROCUREMENT NOTICE. for individual consultants and individual consultants assigned by consulting firms/institutions

INDIVIDUAL CONSULTANT PROCUREMENT NOTICE. for individual consultants and individual consultants assigned by consulting firms/institutions Date: 26 September 2016 INDIVIDUAL CONSULTANT PROCUREMENT NOTICE for individual consultants and individual consultants assigned by consulting firms/institutions Country: Description of the assignment:

More information

TỔNG CỤC TIÊU CHUẨN ĐO LƯỜNG CHẤT LƯỢNG VIỆN NĂNG SUẤT VIỆT NAM

TỔNG CỤC TIÊU CHUẨN ĐO LƯỜNG CHẤT LƯỢNG VIỆN NĂNG SUẤT VIỆT NAM TỔNG CỤC TIÊU CHUẨN ĐO LƯỜNG CHẤT LƯỢNG VIỆN NĂNG SUẤT VIỆT NAM Bộ Công Thương, 09 tháng 12 năm 2016 Trình bày: Vũ Hồng Dân Trưởng phòng Tư vấn Cải tiến Năng suất, VNPI, Tổng cục TCĐLCL Nghiên cứu, kiến

More information

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CNTT CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc 1. Thông tin về giáo viên ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN Nhập môn lập trình Windows Forms+BTL TT Họ tên giáo viên

More information

Lý do cần tuần hoàn nước?

Lý do cần tuần hoàn nước? GIỚI THIỆU, THIẾT KẾ HỆ THỐNG LỌC SINH HỌC TUẦN HOÀN NƯỚC ThS. Đỗ Quang Tiền Vương Chương trình VIDATEC DHI Vietnam 1 Lý do cần tuần hoàn nước? Bảo tồn nước; Nuôi được mật độ cao với điều kiện hạn chế

More information

CÂY HẬU TỐ VÀ MỘT SỐ ỨNG DỤNG TRONG XỬ LÝ XÂU

CÂY HẬU TỐ VÀ MỘT SỐ ỨNG DỤNG TRONG XỬ LÝ XÂU CÂY HẬU TỐ VÀ MỘT SỐ ỨNG DỤNG TRONG XỬ LÝ XÂU Lê Minh Hoàng (ĐHSPHN) 1. Giới thiệu Cây hậu tố là một cấu trúc dữ liệu biểu diễn các hậu tố của một xâu, được ứng dụng rộng rãi trong các thuật toán xử lý

More information

DỰ BÁO NGUY CƠ VÀ CƯỜNG ĐỘ PHÁT TRIỂN TRƯỢT LỞ KHU VỰC THỊ XÃ BẮC KẠN

DỰ BÁO NGUY CƠ VÀ CƯỜNG ĐỘ PHÁT TRIỂN TRƯỢT LỞ KHU VỰC THỊ XÃ BẮC KẠN DỰ BÁO NGUY CƠ VÀ CƯỜNG ĐỘ PHÁT TRIỂN TRƯỢT LỞ KHU VỰC THỊ XÃ BẮC KẠN PGS.TSKH Trần Mạnh Liểu, ThS. Nguyễn Quang Huy, KS. Nguyễn Thị Khang ThS. Hoàng Đình Thiện, CN. Bùi Bảo Trung Trung tâm nghiên cứu

More information

Giới thiệu về Micro PLC "CP1L/1H"

Giới thiệu về Micro PLC CP1L/1H Giới thiệu về Micro PLC "CP1L/1H" Giới thiệu Micro PLC "CP1L/1H" Chương 1 Phần I: Các khái niệm cơ bản 1.1 Các hệ đếm (Number System): Bộ xử lý trung tâm (CPU) bên trong PLC chỉ làm việc với 2 trạng thái

More information

NƠI CUỘC SỐNG. hăng hoa. Khu tổ hợp du lịch Sonasea Villas & Resort. Dương Tơ, Phú Quốc, Việt Nam.

NƠI CUỘC SỐNG. hăng hoa. Khu tổ hợp du lịch Sonasea Villas & Resort. Dương Tơ, Phú Quốc, Việt Nam. NƠI CUỘC SỐNG T hăng hoa H o t l i n e 0979 709 088 0913 236 767 Khu tổ hợp du lịch Sonasea Villas & Resort Dương Tơ, Phú Quốc, Việt Nam www.sonasea.com.vn www.sonasea.com.vn NƠI CUỘC SỐNG Một sản phẩm

More information

Một giải pháp tóm tắt văn bản tiếng Việt tự động

Một giải pháp tóm tắt văn bản tiếng Việt tự động Một giải pháp tóm tắt văn bản tiếng Việt tự động Trương Quốc Định Khoa CNTT-TT Đại học Cần Thơ Cần Thơ, Việt Nam tqdinh@cit.ctu.edu.vn Nguyễn Quang Dũng Khoa Nông nghiệp & Sinh học ứng dụng Đại học Cần

More information

HAGAR JOB DESCRIPTION HOUSE MOTHER (PART TIME)

HAGAR JOB DESCRIPTION HOUSE MOTHER (PART TIME) HAGARJOBDESCRIPTION HOUSE MOTHER(PART TIME) HagarisaninternationalChristiannon governmentalorganizationcommittedtothe recoveryandeconomicempowermentofwomenandchildrenfromextreme disadvantagedbackgrounds;particularlyhumantrafficking,sexualexploitationand

More information

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG MIDAS/Civil

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG MIDAS/Civil TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI KHOA CÔNG TRÌNH BỘ MÔN TỰ ĐỘNG HÓA THIẾT KẾ CẦU ĐƯỜNG KS. LÊ ĐẮC HIỀN TÀI LIỆU HƯỚNG DẪN SỬ DỤNG MIDAS/Civil ver. 20080624 Mọi ý kiến đóng góp xây dựng xin gửi về: Email:

More information

HƢỚNG DẪN THỰC HÀNH STATA 12

HƢỚNG DẪN THỰC HÀNH STATA 12 TRƢỜNG ĐẠI HỌC KINH TẾ TPHCM HƢỚNG DẪN THỰC HÀNH STATA 12 PHẦN CƠ BẢN TRẦN THỊ TUẤN ANH 14 TRẦN THỊ TUẤN ANH - UEH 2 LỜI MỞ ĐẦU Stata là phần mềm xử lý số liệu rất mạnh, được sử dụng phổ biến trong đào

More information

Cao ốc hoàn thiện mà khách không đến

Cao ốc hoàn thiện mà khách không đến Cao ốc hoàn thiện mà khách không đến trình bày bởi Nigel Smith Executive Director. Châu Á CB Richard Ellis 17-03-2011 Giới thiệu 25 năm kinh nghiệm tại Châu Á Nigel Smith - 20 năm kinh nghiệm tại Châu

More information

BÁO CÁO THƯỜNG NIÊN NĂM 2017

BÁO CÁO THƯỜNG NIÊN NĂM 2017 Báo cáo thường niên năm 2017 BÁO CÁO THƯỜNG NIÊN NĂM 2017 Thành phố Hồ Chí Minh, tháng 04 năm 2018 Công ty cổ phần Đại lý hàng hải Việt Nam 1 Báo cáo thường niên năm 2017 I. Thông tin chung: 1. Thông tin

More information

GIẢI PHÁP TÍCH HỢP DỊCH VỤ NGHIỆP VỤ NGÂN HÀNG THEO MÔ HÌNH SOA

GIẢI PHÁP TÍCH HỢP DỊCH VỤ NGHIỆP VỤ NGÂN HÀNG THEO MÔ HÌNH SOA ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ NGUYỄN THỊ THU PHƢƠNG GIẢI PHÁP TÍCH HỢP DỊCH VỤ NGHIỆP VỤ NGÂN HÀNG THEO MÔ HÌNH SOA LUẬN VĂN THẠC SỸ Ngành: Hệ thống thông tin Hà Nội - 2016 ĐẠI HỌC QUỐC

More information

PHƯƠNG PHÁP NGHIÊN CỨU. Lý thuyết & thực tiễn. Tháng 8/2016. Kantar Media

PHƯƠNG PHÁP NGHIÊN CỨU. Lý thuyết & thực tiễn. Tháng 8/2016. Kantar Media PHƯƠNG PHÁP NGHIÊN CỨU Lý thuyết & thực tiễn Tháng 8/2016 Kantar Media Bài 4 Nhập liệu Data entry/data punching Làm sạch dữ liệu & xử lý dữ liệu Data cleaning & data processing Lập bảng phân tích kết quả

More information

TỔNG QUAN / OVERVIEW. Poolhouse Restaurant

TỔNG QUAN / OVERVIEW. Poolhouse Restaurant p h o n g c á c h s ố n g s a n g t r ọ n g b ậ c n h ấ t b ê n b ờ b i ể n l u x u r y b e a c h f r o n t p r o p e r t y TỔNG QUAN / OVERVIEW Hyatt Regency Danang Resort and Spa nằm trên tổng diện tích

More information

LẬP TRÌNH DI ĐỘNG. Bài 6: Các Điều Khiển Cơ Bản

LẬP TRÌNH DI ĐỘNG. Bài 6: Các Điều Khiển Cơ Bản LẬP TRÌNH DI ĐỘNG Bài 6: Các Điều Khiển Cơ Bản Nhắc lại bài trước Giới thiệu về giao diện của eclipse khi viết ứng dụng android với ADT Các thành phần của một project android File mô tả ứng dụng AndroidManifest.xml

More information

PRIME LOCATION THE EAST SEA

PRIME LOCATION THE EAST SEA HANOI DA NANG HOANG SA ISLANDS SON TRA PENINSULA DANANG BAY HO CHI MINH TRUONG SA ISLANDS TO HUE DANANG INTERNATIONAL AIRPORT MARBLE MOUNTAINS Truong Sa Road THE EAST SEA DANANG GOLF CLUB THE MONTGOMERIE

More information

ỨNG DỤNG MẠNG NORON NHÂN TẠO SOM CHO BÀI TOÁN NHẬN DẠNG KÍ TỰ

ỨNG DỤNG MẠNG NORON NHÂN TẠO SOM CHO BÀI TOÁN NHẬN DẠNG KÍ TỰ ỨNG DỤNG MẠNG NORON NHÂN TẠO SOM CHO BÀI TOÁN NHẬN DẠNG KÍ TỰ Lê Anh Tú 1*, Nguyễn Quang Hoan 2, Lê Sơn Thá 1 1 Trường Đạ học Công nghệ thông tn và truyền thông ĐH Thá Nguyên 2 Học vện Công nghệ Bưu chính

More information

UNIT CORP HỒ SƠ GIỚI THIỆU CÔNG TY UNIT CORP PHIÊN BẢN: 1.0. Công Viên Tri Thức Việt Nhật, Trần Não, Quận 2, TPHCM

UNIT CORP HỒ SƠ GIỚI THIỆU CÔNG TY UNIT CORP PHIÊN BẢN: 1.0. Công Viên Tri Thức Việt Nhật, Trần Não, Quận 2, TPHCM UNIT CORP Công Viên Tri Thức Việt Nhật, 38-2-2 Trần Nã, Quận 2, TPHCM Phne: (84-8) 3740 2388 - Fax: (84-8) 3740 2385 Website: www.unit.cm.vn UNIT CORP HỒ SƠ GIỚI THIỆU CÔNG TY PHIÊN BẢN: 1.0 TPHCM, THÁNG

More information

BAG CAO TAI CHINH GILKA NIEN DO. 6 THANG OAU CUA NAM TA! CHINH KfiT THUC NGAY 31 THANG 12 NAM 2015

BAG CAO TAI CHINH GILKA NIEN DO. 6 THANG OAU CUA NAM TA! CHINH KfiT THUC NGAY 31 THANG 12 NAM 2015 BAKER TILLY A&C CONG TY TNHH KIEM TOAN VA TU" VAN A&C A&C AUDITING AND CONSULTING CO., LTD. BAG CAO TAI CHINH GILKA NIEN DO 6 THANG OAU CUA NAM TA! CHINH KfiT THUC NGAY 31 THANG 12 NAM 2015 CONG TY CO

More information

ĐỒ ÁN TỐT NGHIỆP HỆ THỐNG THÔNG TIN

ĐỒ ÁN TỐT NGHIỆP HỆ THỐNG THÔNG TIN TRƢỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN HỮU NGHỊ VIỆT HÀN -------- KHOA KHOA HỌC MÁY TÍNH ĐỒ ÁN TỐT NGHIỆP HỆ THỐNG THÔNG TIN Tên đề tài: Nghiên cứu mô hình MVC trong lập trình.net để xây dựng website đăng

More information

An Appraisal Study of Social Attitudes in News Reports towards President Obama s Visit to Vietnam

An Appraisal Study of Social Attitudes in News Reports towards President Obama s Visit to Vietnam VNU Journal of Science: Foreign Studies, Vol. 32, No. 4 (2016) 21-29 An Appraisal Study of Social Attitudes in News Reports towards President Obama s Visit to Vietnam Nguyen Thi Thu Hien * Department of

More information

NGHIÊN CỨU VỀ MẠNG NEURAL TÍCH CHẬP VÀ ỨNG DỤNG CHO BÀI TOÁN NHẬN DẠNG BIỂN SỐ XE

NGHIÊN CỨU VỀ MẠNG NEURAL TÍCH CHẬP VÀ ỨNG DỤNG CHO BÀI TOÁN NHẬN DẠNG BIỂN SỐ XE ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ LÊ THỊ THU HẰNG NGHIÊN CỨU VỀ MẠNG NEURAL TÍCH CHẬP VÀ ỨNG DỤNG CHO BÀI TOÁN NHẬN DẠNG BIỂN SỐ XE LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN HÀ NỘI, 2016 ĐẠI

More information

Dear friends, 2- Friday Nov 11, 2016: Gala diner at Khu du lịch Văn Thánh with live band, singers, dancing, soft drinks.

Dear friends, 2- Friday Nov 11, 2016: Gala diner at Khu du lịch Văn Thánh with live band, singers, dancing, soft drinks. De : Bach Pham À : Van Envoyé le : Dimanche 18 septembre 2016 Objet : Retrouvailles JJR-MC in Vietnam 2016 Dear friends, This is finally the program we've

More information

SO SÁNH ẢNH HƯỞNG CỦA DẦU ĐẬU NÀNH VÀ MỠ CÁ ĐẾN TỈ LỆ TIÊU HÓA VÀ TĂNG TRỌNG CỦA BÒ VỖ BÉO

SO SÁNH ẢNH HƯỞNG CỦA DẦU ĐẬU NÀNH VÀ MỠ CÁ ĐẾN TỈ LỆ TIÊU HÓA VÀ TĂNG TRỌNG CỦA BÒ VỖ BÉO SO SÁNH ẢNH HƯỞNG CỦA DẦU ĐẬU NÀNH VÀ MỠ CÁ ĐẾN TỈ LỆ TIÊU HÓA VÀ TĂNG TRỌNG CỦA BÒ VỖ BÉO Nguyễn Thị Hồng Nhân, Nguyễn Trọng Ngữ 1 ABSTRACT In the first experiment, three growing crossbred cattle (Lai

More information

Viện Hàn lâm Khoa học và

Viện Hàn lâm Khoa học và Số 20 Tháng 8 2016 TRUNG TÂM THÔNG TIN - TƯ LIỆU, VIỆN HÀN LÂM KHOA HỌC VÀ CÔNG NGHỆ VIỆT NAM Địa chỉ: Tòa nhà A11, Viện Hàn lâm KHCNVN, 18 Hoàng Quốc Việt, Hà Nội; ĐT: 04 37564344; Email: bantin@isi.vast.vn

More information

Điều khiển chống rung cho cầu trục ba chiều bằng phương pháp Hybrid Shape

Điều khiển chống rung cho cầu trục ba chiều bằng phương pháp Hybrid Shape Hội nghị toàn quốc ần thứ 3 về Điều khiển và Tự động hoá - VCCA-5 Điều khiển chống rung cho cầu trục ba chiều bằng phương pháp Hbrid Shape Vibration suppression contro for three Diension overhead crane

More information

KHOA KINH TẾ BỘ MÔN THẨM ĐỊNH GIÁ LUẬT PHÁP BẤT ĐỘNG SẢN Ở ÚC

KHOA KINH TẾ BỘ MÔN THẨM ĐỊNH GIÁ LUẬT PHÁP BẤT ĐỘNG SẢN Ở ÚC KHOA KINH TẾ BỘ MÔN THẨM ĐỊNH GIÁ LUẬT PHÁP BẤT ĐỘNG SẢN Ở ÚC Huỳnh Kiều Tiên Tháng 11, 2014 Lịch báo cáo dự kiến Buổi NÔI DUNG Thời gian (8h30-10h30) 1 Tổng quan về luật pháp BĐS ở Úc T5-13/11 2 Bất động

More information

Landscape Heritage in Vietnam. Di sản cảnh quan Việt Nam

Landscape Heritage in Vietnam. Di sản cảnh quan Việt Nam Landscape Heritage in Vietnam Di sản cảnh quan Việt Nam The section Architecture of the Department of Building, Civil Engineering and Architecture of the Università Politecnica delle Marche has been involved

More information

Once in a while, it s nice to be reminded that you re important and appreciated.

Once in a while, it s nice to be reminded that you re important and appreciated. Once in a while, it s nice to be reminded that you re important and appreciated. This is why we have created the Savills Club in Asia Pacific. club.savills.com.vn VN 007000 CHÀO MỪNG ĐẾN VỚI ẤN PHẨM KINH

More information

GIÁO TRÌNH SỬ DỤNG HỆ THỐNG

GIÁO TRÌNH SỬ DỤNG HỆ THỐNG GIÁO TRÌNH SỬ DỤNG HỆ THỐNG GALILEO VIETNAM HAN Office: Ford building, #604, 105 Lang Ha, Dong Da, Hanoi, Tel: 04-35622433, Fax: 04-35622435 SGN Office: Saigon Riverside Office Center, #200, 2A-4A TonDucThang,

More information

The 100 Best Business Books of All Time 100 CUỐN SÁCH QUẢN TRỊ KINH DOANH HAY NHẤT MỌI THỜI ĐẠI. The 100 Best Business Books of All Time

The 100 Best Business Books of All Time 100 CUỐN SÁCH QUẢN TRỊ KINH DOANH HAY NHẤT MỌI THỜI ĐẠI. The 100 Best Business Books of All Time The 100 Best Business Books of All Time 100 CUỐN SÁCH QUẢN TRỊ KINH DOANH HAY NHẤT MỌI THỜI ĐẠI The 100 Best Business Books of All Time Tác giả: Jack Covert, Todd Sattersten, NXB Portfolio, 2009 Năm 2009,

More information

Company Portfolio Wonder Technique Corporation

Company Portfolio Wonder Technique Corporation Company Portfolio Wonder Technique Corporation Add.: L5, 37A Phan Xich Long, W.3, Phu Nhuan dist., HCMC Tel : +84 (8) 39 95 40 91 - Fax : +84 (8) 39 95 42 91 Email : quan.nguyen@wonderscorp.com Website:

More information

GIÚP ÐỌC LỜI CHÚA NOVA VULGATA VÀ CÁC BẢN CỔ KINH THÁNH

GIÚP ÐỌC LỜI CHÚA NOVA VULGATA VÀ CÁC BẢN CỔ KINH THÁNH LỜI CHÚA NOVA VULGATA (5) VÀI BA MẸO VĂN PHẠM GIÚP ÐỌC LỜI CHÚA NOVA VULGATA VÀ CÁC BẢN CỔ KINH THÁNH LsNguyenCongBinh@gmail.com Chúng con nguyện xin Cha Thánh Gioan Phaolo đã dạy chúng con phải đọc Nova

More information

Lập trình Pascal. Biên tập bởi: Thu Nguyen

Lập trình Pascal. Biên tập bởi: Thu Nguyen Lập trình Pascal Biên tập bởi: Thu Nguyen Lập trình Pascal Biên tập bởi: Thu Nguyen Các tác giả: Thu Nguyen Phiên bản trực tuyến: http://voer.edu.vn/c/6424aca1 MỤC LỤC 1. Các thành phần cơ bản trong Pascal

More information

MỤC LỤC MỞ ĐẦU... 7 CHƢƠNG 1 : MẠNG NƠRON VÀ QUÁ TRÌNH HỌC CỦA MẠNG NƠRON Giới thiệu về mạng nơron và quá trình học của mạng nơron...

MỤC LỤC MỞ ĐẦU... 7 CHƢƠNG 1 : MẠNG NƠRON VÀ QUÁ TRÌNH HỌC CỦA MẠNG NƠRON Giới thiệu về mạng nơron và quá trình học của mạng nơron... MỤC LỤC MỞ ĐẦU... 7 CHƢƠNG 1 : MẠNG NƠRON VÀ QUÁ TRÌNH HỌC CỦA MẠNG NƠRON... 12 1.1. Giới thiệu về mạng nơron và quá trình học của mạng nơron... 12 1.1.1. Mạng nơron và các phƣơng pháp học... 12 1.1.2.

More information

Hội viên. Quà tặng. Thẻ. Phiếu. MIỄN PHÍ GỬI XE 2 GIỜ với hóa đơn từ VND ĐẶC BIỆT

Hội viên. Quà tặng. Thẻ. Phiếu. MIỄN PHÍ GỬI XE 2 GIỜ với hóa đơn từ VND ĐẶC BIỆT Thẻ Hội viên Phiếu Quà tặng ĐẶC BIỆT Nhận ngay voucher 200.000 VND với giao dịch từ 2.000.000 VND khi thanh toán bằng thẻ tín dụng quốc tế Cremium Visa, MasterCard, JCB (Mỗi khách hàng chỉ nhận 01 lần

More information

BEACH ACTIVITIES PRICE LIST

BEACH ACTIVITIES PRICE LIST ACTIVITIES PRICE LIST BẢNG GIÁ HOẠT ĐỘNG THỂ THAO WATER SPORT DỤNG CỤ THỂ THAO JET SKI 700CC MÔ TÔ NƯỚC 700CC JET SKI 700CC MÔ TÔ NƯỚC 700CC JET SKI 700CC MÔ TÔ NƯỚC 700CC JET SKI 1100CC MÔ TÔ NƯỚC 1100CC

More information

LE MERIEN DA NANG RESORT & SPA PROJECT

LE MERIEN DA NANG RESORT & SPA PROJECT LE MERIEN DA NANG RESORT & SPA PROJECT . Introduction of the investor: Full Name: INVESTMENT CORPORATION SAIGON - DA NANG Transactions in foreign names: SAIGON - DA NANG INVESTMENT CORPORATION Abbreviation:

More information

VIETNAM JAPAN ARCHITECTURE FORUM 2017 Ho Chi Minh City 2017 Feb. 20 Feb. 21 The 3 rd Asian Urban Architecture Forum REPORT

VIETNAM JAPAN ARCHITECTURE FORUM 2017 Ho Chi Minh City 2017 Feb. 20 Feb. 21 The 3 rd Asian Urban Architecture Forum REPORT VIETNAM JAPAN ARCHITECTURE FORUM 2017 Ho Chi Minh City 2017 Feb. 20 Feb. 21 The 3 rd Asian Urban Architecture Forum REPORT Table of Contents 1.Otline... 4 2.Forum Program... 5 3.Exhibition... 14 4.Special

More information

fb.com/nanoco.com.vn

fb.com/nanoco.com.vn www.nanoco.com.vn info@nanoco.com.vn fb.com/nanoco.com.vn WEVH5531/ WEVH5531-7 (Cắm nhanh/bắt vít) Công tắc B, 1 chiều, loại nhỏ 250VAC - 16A Switch B - 1 way Đóng gói 10 cái/hộp, 100 cái/thùng 19.500

More information

COMPANYăPROFILE VIET HAN PRODUCTION TRADING & CONSTRUCTION CO., LTD

COMPANYăPROFILE VIET HAN PRODUCTION TRADING & CONSTRUCTION CO., LTD COMPANYăPROFILE VIET HAN PRODUCTION TRADING & CONSTRUCTION CO., LTD #1 Melody, 3 rd Floor 422-424 Ung Van Khiem, Binh Thanh Dist HCMC, Vietnam Tel: (08) 3512 7009 Fax: (08) 3512 9664 E-mail: info@viethanconcrete.com

More information

BAO CAO TAI CHINH CHO NAM TAI CHINH KET THUC NGAY 31 THANG 12 NAM 2017 CONG TY CO PHAN CONG TRINH DO THI VAN NINH

BAO CAO TAI CHINH CHO NAM TAI CHINH KET THUC NGAY 31 THANG 12 NAM 2017 CONG TY CO PHAN CONG TRINH DO THI VAN NINH BAO CAO TAI CHINH CHO NAM TAI CHINH KET THUC NGAY 31 THANG 12 NAM 2017 CONG TY CO PHAN CONG TRINH DO THI VAN NINH CONG TY C5 PHAN CONG TRINH DO THI VAN NINH BAO CAO CLA BAN GIAM DOC U Ban Giam doe Cong

More information

10 ĐIỀU KIỆN CẦN CHO HOẠT ĐỘNG QUẢN LÝ CHẤT LƯỢNG BỆNH VIỆN

10 ĐIỀU KIỆN CẦN CHO HOẠT ĐỘNG QUẢN LÝ CHẤT LƯỢNG BỆNH VIỆN BỘ Y TẾ CLB GIÁM ĐỐC CÁC TỈNH PHÍA NAM - 2011 10 ĐIỀU KIỆN CẦN CHO HOẠT ĐỘNG QUẢN LÝ CHẤT LƯỢNG BỆNH VIỆN TS BS TĂNG CHÍ THƯỢNG - GĐ BV NHI ĐỒNG 1 NỘI DUNG 1. Đặc điểm bệnh viện Nhu cầu cải tiến chất lượng

More information

Community Safety Seguridad Comunitaria Sự An Toàn của Cộng Đồng

Community Safety Seguridad Comunitaria Sự An Toàn của Cộng Đồng Community Workshop November 23, 2013 Community Safety Seguridad Comunitaria Sự An Toàn của Cộng Đồng Chosen as 1 st or 2 nd Priority by 456 Respondents 8 6 4 2 68% 66% 5 49% 39% 39% 3 24% 2 26% 2 1 1 1

More information

CONG TY CO PHAN CONG TRiNH DO THI VAN

CONG TY CO PHAN CONG TRiNH DO THI VAN I 1 BAO CAO TAI CHiNH,--...,..T:'AIVX:%-j. '---- R AN CHO NAM TAI CHINH /CET THUC NGAY 31 THANG -ia l'in1111 1: - 6. DA i H AN1 24-03- 2011! CONG TY CO PHAN CONG TRiNH DO THI VAN Ho Sa i J CONG TY CO PHAN

More information

The Vietnamese Land Law 2003 and significant renovations on land policy towards the Country s industrialization

The Vietnamese Land Law 2003 and significant renovations on land policy towards the Country s industrialization The Vietnamese Land Law 2003 and significant renovations on land policy towards the Country s industrialization Prof. DrSc. Vice Minister of Natural Resources and Environment, Vietnam Key words: Land administration,

More information

Bài tập ngôn ngữ lập trình C++

Bài tập ngôn ngữ lập trình C++ Bài tập gô gữ lập trìh C++ Bài tập chươg -. Nhập bá kíh đườg trò r. Tíh và uất chu vi, diệ tích đườg trò tươg ứg. Hướg dẫ: cv=**r và dt=*r - Dùg =.4, - hoặc khai báo hằg PI, - hoặc dùg hằg M_PI trog thư

More information

DRAGON HILL CITY HA LONG INTRODUCTION DRAGON HILL CITY INTRODUCTION FACILITIES SITE MAP UNIT FLOOR PLANS ABOUT N.H.O

DRAGON HILL CITY HA LONG INTRODUCTION DRAGON HILL CITY INTRODUCTION FACILITIES SITE MAP UNIT FLOOR PLANS ABOUT N.H.O Land of Prosperity N.H.O INTRODUCES HA LONG INTRODUCTION INTRODUCTION FACILITIES SITE MAP UNIT FLOOR PLANS ABOUT N.H.O 3 7 13 15 17 31 03 HA LONG INTRODUCTION HA LONG INTRODUCTION Ha Long Bay, the UNESCO

More information

Vietnam Land Administration Views from Poverty Alleviation and Small & Medium Enterprise Development. Vo, DANG HUNG and Trung TRAN NHU, Vietnam

Vietnam Land Administration Views from Poverty Alleviation and Small & Medium Enterprise Development. Vo, DANG HUNG and Trung TRAN NHU, Vietnam Vietnam Land Administration Views from Poverty Alleviation and Small & Medium Enterprise Development Vo, DANG HUNG and Trung TRAN NHU, Vietnam Key words: Land administration, poverty alleviation, Small

More information

R3 - Test 11. Question 1

R3 - Test 11. Question 1 R3 - Test 11 Question 1 If you want to take the whole family on holiday, and keep everybody happy, then I have found just the place for you. I recently went with a group of friends to stay at the Greenwood

More information

Vũ Tài Lục. Thủ đoạn chính trị. Chào mừng các bạn đón đọc đầu sách từ dự án sách cho thiết bị di động. Nguồn:

Vũ Tài Lục. Thủ đoạn chính trị. Chào mừng các bạn đón đọc đầu sách từ dự án sách cho thiết bị di động. Nguồn: Thủ đoạn chính trị Chào mừng các bạn đón đọc đầu sách từ dự án sách cho thiết bị di động Nguồn: http://vnthuquan.net/ Tạo ebook: Nguyễn Kim Vỹ. MỤC LỤC HUYỀN THỌAI TRƢƠNG LƢƠNG Lời mở CHƢƠNG 1 CHƢƠNG 2

More information

Từ Điển Tiếng Anh Kỹ Thuật Xây Dựng

Từ Điển Tiếng Anh Kỹ Thuật Xây Dựng Từ Điển Tiếng Anh Kỹ Thuật Xây Dựng --------------------------------------------------------- Abraham s cones : Khuôn hình chóp cụt để đo độ sụt bê tông Accelerator, Earlystrength admixture : Phụ gia tăng

More information

ITAXA Building, M Level, 126 Nguyen Thi Minh Khai St., District 3, HO CHI MINH CITY, VIET NAM

ITAXA Building, M Level, 126 Nguyen Thi Minh Khai St., District 3, HO CHI MINH CITY, VIET NAM Education Representatives Viet Nam ATS (Avenue to Success) Avenue to Success (ATS) Nhi Tran Telephone +84 8 39 333 266 ITAXA Building, M Level, 126 Nguyen Thi Minh Khai St., District 3, HO CHI MINH CITY,

More information

C ~ MVC LVC Trang. Bao cao cua HQi d6ng quan tr! 1-3. Bao cao ki6m toan dqc IfP. Bao cao tai chinh di du'q'cki6m toan. Bang can doi kll toan

C ~ MVC LVC Trang. Bao cao cua HQi d6ng quan tr! 1-3. Bao cao ki6m toan dqc IfP. Bao cao tai chinh di du'q'cki6m toan. Bang can doi kll toan I ' II I Bao CCNG TY co PHAN SAN XUAT THU'ONG M~I MAY sal GON cao tai chinh di dlj'o'ckiltm toan cho nam tai chinh k6t thue vao ngay 31 thang 12 nam 2016 C6NG TV co PHAN SAN XUAT THU'ONG MAl MAY sal GON

More information

Vietnam Airlines TONG CONG TY HANG KHONG VIET NAM-CTCP. BAO CAO TAI CHiNH HOOP NHAT QuST 1 nam 2017

Vietnam Airlines TONG CONG TY HANG KHONG VIET NAM-CTCP. BAO CAO TAI CHiNH HOOP NHAT QuST 1 nam 2017 Vietnam Airlines TONG CONG TY HANG KHONG VIET NAMCTCP BAO CAO TAI CHiNH HOOP NHAT QuST 1 nam 2017 NIEN DO Ha N(ii, Ngay1f thang Ottnam 2017 DANH MUC BAO CAO TAI CHINH MP NH AT 1. Bang can d6i ke than hyp

More information

CONG TY CO PHAN VAN TAI VA DJCH Vy LIEN NINH. BAO CAO TAI CHINH DA BlfQC KIEM TOAN Cho n5m tai chinh ket thuc ngay 31 thang 12 nam 2017

CONG TY CO PHAN VAN TAI VA DJCH Vy LIEN NINH. BAO CAO TAI CHINH DA BlfQC KIEM TOAN Cho n5m tai chinh ket thuc ngay 31 thang 12 nam 2017 CONG TY CO PHAN VAN TAI VA DJCH Vy LIEN NINH BAO CAO TAI CHINH DA BlfQC KIEM TOAN Cho n5m tai chinh ket thuc ngay 31 thang 12 nam 2017 C6NG TY C6 PHAN VAN TAI VA DICH vy LIEN NINH Myc Lvc Trang BAO CAO

More information

LEADVISORS TOWER. Render Images Area Schedule Specifications Floor Plan PHAM VAN DONG, BAC TU LIEM, HANOI. Exclusive Leasing Agent

LEADVISORS TOWER. Render Images Area Schedule Specifications Floor Plan PHAM VAN DONG, BAC TU LIEM, HANOI. Exclusive Leasing Agent LEADVISORS TOWER PHAM VAN DONG, BAC TU LIEM, HANOI Render Images Area Schedule Specifications Floor Plan Exclusive Leasing Agent BUILDING PERSP E CT I VE LOBBY LIFT LOBBY COMMON AREA ALLEY 234 HQV VO CHI

More information