Bởi vì các bộ xử lý đa xử lý xác định lại nhiều đặc điểm của hệ thông (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), chúng đưa ra các vấn đề thiết kế thú vị, ảnh hưởng đến cả phần cứng và phan mềm. Trong phân này, chúng tôi đưa ra một số ví dụ bao gồm: đo lường và báo cáo hiệu suất của đa xử lý, tăng cường khả năng chịu độ trễ trong hệ thống bộ nhớ và phương pháp sử dụng hỗ trợ bộ nhớ ảo đề triển khai bộ nhớ chia sẻ.
e Các vấn đề về hệ thống bộ nhớ
101
Như chúng ta đã thấy trong chương này, các vấn đề về hệ thông bộ nhớ là cốt lõi của việc thiết kế các bộ đa xử lý bộ nhớ dùng chung. Thật vậy, đa xử lý giới thiệu nhiều phức tạp hệ thống bộ nhớ mới không tồn tại trong các bộ đơn xử lý. Trong phần này, chúng ta xem xét hai vẫn đề triển
khai có ảnh hưởng đáng kê đến việc thiết kế và triển khai hệ thống bộ nhớ trong bồi cảnh đa xử lý.
e Sự bao gôm và việc thực hiện nó
Nhiều bộ xử lý sử dụng cầu trúc phân cấp bộ nhớ cache đa cấp để giảm nhu cầu về kết nối toàn cầu và độ trễ của bộ nhớ cache. Nếu bộ nhớ đệm cũng cung cap tính nang bao gồm đa cấp - mọi cấp của cầu trúc phân cấp bộ nhớ cache là một tập con của cấp ở xa bộ xử lý hơn - thì chúng ta có thé sir dung cau trúc đa cấp đề giảm bớt sự tranh chấp giữa lưu lượng kết hợp và lưu lượng bộ xử lý, như đã giải thích trước đó. Do đó, hầu hết các bộ đa xử lý có bộ nhớ đệm đa cấp thực thi thuộc tính bao gồm. Hạn chế này còn được gọi là thuộc tính tập hợp con, vì mỗi bộ đệm là một tập con của bộ đệm bên dưới nó trong hệ thông phân cấp.
Thoạt nhìn, việc duy trì thuộc tính bao gồm đa cấp có vẻ như không đáng kê. Hãy xem xét một ví dụ hai cấp độ: bát kỳ lần bỏ sót nào trong L1 hoặc là đánh trúng ở L2 hoặc tạo ra lỗi ở L2, khiến nó được đưa vào cả LI và L2. Tương tự như vậy, bất kỳ lệnh không hợp lệ nào xảy ra trong L2 phải được gửi đến LI, nơi nó sẽ khiến khối bị mắt hiệu lực, nếu nó tôn tại.
Nắm bắt là những gì sẽ xảy ra khi kích thước khối của LI và L2 khác nhau. Việc chọn các kích thước khối khác nhau là khá hợp lý, vì L2 sẽ lớn hơn nhiều và có thành phân độ trễ lâu hơn nhiều trong hình phạt bỏ lỡ của nó, và do đó sẽ muốn sử dụng kích thước khối lớn hơn. Điều gì xảy ra với việc thực thi đưa vào "tự động" của chúng tôi khi kích thước khối khác nhau? Một khôi trong L2 đại diện cho nhiều khối trong L] và sự thiếu sót {rong L2 gây ra việc thay thể dữ liệu tương đương với nhiều khối LI. Ví dụ: nếu kích thước khối của L2 gap bốn lần của LI, thì một khối thiếu sót trong L2 sẽ thay thế khôi lượng tương đương của bốn khôi L1. Hãy xem xét một ví dụ chỉ tiết.
VÍ DỤ:
Giả sử rằng L2 có kích thước khối gấp bốn lần L1. Cho biết việc bo sót địa chỉ gây ra sự thay thể trong L1 và L2 có thể dẫn đến vi phạm thuộc tính bao gồm như thé nào.
TRẢ LỜI:
Gia str rang LI và L2 được ánh xạ trực tiếp và kích thước khối của LI là b byte và kích
thước khối của L2 là 4b byte. Giả sử LI chứa hai khối có địa chỉ bắt đầu là x và x + b và x mod 4b = 0, nghĩa là x cũng là địa chỉ bắt đầu của khối trong L2, thì khối duy nhất
đó trong L2 chứa các khối LI x,x+b,x+ 2b và x + 3b. Giá sử bộ xử lý tạo ra một
tham chiếu đến khối y ánh xạ tới khôi chứa x trong cả hai bộ nhớ đệm và do đó bỏ sót.
Vì L2 bị thiểu, nó tim nap 4b byte va thay thé khối chứa x, x +b, x + 2b va x + 3b, trong
khi LI lây b byte và thay thế khối chứa x. Vì L1 vẫn chứa x + b, nhưng L2 thì không, thuộc tính bao gồm không còn được giữ.
Để duy trì sự bao gồm với nhiều kích thước khối, chúng tôi phải thăm dò các cấp cao hơn của hệ thông phân cấp khi việc thay thế được thực hiện ở cấp thấp hơn dé dam bao rang bất kỳ từ nào được thay thế ở cấp thấp hơn đều bị vô hiệu trong bộ nhớ đệm cấp cao hơn, Hầu hết các hệ thông đã chọn giải pháp này hơn là giải pháp thay thế không dựa vào việc bao gồm và theo dõi các bộ nhớ đệm câp cao hơn. Trong Bài tập, chúng tôi khám phá thêm sự bao hàm và chỉ ra rằng các vẫn đề tương tự tồn tại nếu tính liên kết của các mức độ khác nhau. Baer và Wang [1988] mô tả chỉ
tiết những lợi thế và thách thức của việc hòa nhập.
e© Không chặn bộ nhớ đệm và ấn độ trễ
Chúng ta đã thấy ý tưởng về bộ nhớ đệm không khóa hoặc không khóa trong Chương 5, trong đó khái niệm này được sử dụng đề giảm các lần bỏ sót bộ nhớ cache bằng cách chồng chéo chúng với quá trình thực thi và bằng cách ghép nối các lần bỏ lỡ. Có những lợi ích bô sung trong trường hợp đa xử lý. Đầu tiên là các hình phạt bỏ lỡ có thê lớn hơn, có nghĩa là có nhiều độ trễ hơn đề an và cơ hội cho các lần bỏ lỡ liên kết cũng có thể lớn hơn, vì bộ nhớ và hệ thông kết nỗi thường
cũng có thể xử lý nhiều tham chiếu bộ nhớ còn tôn tại.
Thứ hai, một bộ đa xử lý cần bộ nhớ đệm không chặn đề tận dụng các mô hình nhất quán yếu.
Ví dụ: để triên khai một mô hình như tính nhất quán của bộ xử lý, yêu cầu ghi không được chặn đối với việc đọc để bộ xử lý có thê tiếp tục ngay lập tức, bằng cách lưu vào bộ đệm ghi hoặc ngay sau khi nó thiết lập quyền sở hữu khối và cập nhật bộ đệm. Các mô hình nhất quán thoái mái cho phép sắp xếp lại thứ tự thêm các lần bỏ sót, nhưng bộ nhớ đệm không chặn là cần thiết đề tận dụng tối đa tính linh hoạt này.
Cuối cùng, hỗ trợ không chặn là rất quan trọng đề triển khai tìm nạp trước. Tìm nạp trước, mà chúng fa cũng đã thảo luận trong Chương 5, thậm chí còn quan trong hon trong đa xử lý so với đơn xử lý, một lần nữa do độ trễ bộ nhớ lâu hơn. Trong Chương 5, chúng tôi đã mô tả lý do tại sao điều quan trọng là tìm nạp trước không ảnh hưởng đến ngữ nghĩa của chương trình, vì điều này cho phép chúng được chèn vào bất kỳ đâu trong chương trình mà không làm thay đổi kết quả tính toán.
Trong một bộ đa xử lý, việc duy trì không có bất kỳ tác động ngữ nghĩa nào từ việc sử dụng tìm nạp trước yêu cầu đữ liệu tìm nạp trước phải được giữ mạch lạc. Giá trị được tìm nạp trước được giữ chặt chẽ nếu, khi giá trị thực sự được truy cập bởi lệnh tái, giá trị được ghi gần đây nhất sẽ được trả về, ngay cá khi giá trị đó được viết sau khi tìm nạp trước. Kết quả này chính xác là thuộc tính mà tính liên kết trong bộ nhớ cache cung cấp cho chúng ta đối với các biến khác trong bộ nhớ. Tìm nạp trước đưa giá trị dữ liệu đến gần hơn và đảm bảo rằng trên bộ nhớ thực sự truy cập vào dữ liệu (tải giá trị tìm nạp trước), giá trị gần đây nhất của mục đữ liệu nhận được, được gọi là không liên kết, vì giá trị dữ liệu không bị ràng buộc sang một bản sao cục bộ, sẽ không mạch lạc. Ngược lại, việc tìm nạp trước để di chuyền giá trị dữ liệu vào một thanh ghi có mục đích chung là ràng buộc, vì giá trị thanh ghi là một biến mới, trái ngược với khối bộ nhớ cache, là một bản sao nhất quán của một biến. Tìm nạp trước không liên kết duy trì các thuộc tính liên kết của bất kỳ giá trị nào khác trong bộ nhớ, trong khi tìm nạp trước liên kết có vẻ giống tải thanh ghi hơn, vì nó loại bỏ dữ liệu khỏi không gian địa chỉ nhất quan.
103
Tại sao tìm nạp trước không ràng buộc lại quan trọng? Hãy xem xét một ví dụ đơn giản nhưng điện hình: một giá trị dữ liệu được ghi bởi một bộ xử lý và được sử dụng bởi bộ xử lý khác. Trong trường hợp này, người tiêu dùng muôn tìm nạp trước giá trỊ càng sớm càng tot; nhung giả sử quá trình sản xuất bi trì hoãn vì một lý do nào đó. Sau đó, tìm nạp trước có thê lay giá trị cũ của mục dữ liệu. Nếu tìm nạp trước là không liên kết, bản sao của dữ liệu cũ sẽ bị vô hiệu khi giá trị được ghi, duy trì sự mạch lạc. Tuy nhiên, nếu tìm nạp trước có ràng buộc, thì giá trị cũ, không mạch lạc của dữ liệu sẽ được sử dụng bởi quá trình tìm nạp trước. Do độ trễ bộ nhớ đài, một tìm nạp trước có thể cần phải đặt hàng trăm hướng dẫn trở lên sớm hơn so với việc sử dụng dữ liệu, nêu chúng ta muon ân toàn bộ độ trê. Yêu câu này làm cho thuộc tính không liên kết trở nên quan trọng dé đám bảo việc sử dụng mạch lạc của tìm nạp trước trong các bộ xử lý đa năng.
Việc triên khai tìm nạp trước yêu câu cùng một loại hỗ trợ mà bộ nhớ cache không khóa cân có, vì có nhiều quyên truy cập bộ nhớ vượt trội. Yêu câu này gây ra một sô phức tạp:
1. Một nút cục bộ sẽ cần theo dõi nhiều lượt truy cập chưa thanh toán, vì các câu trả lời có thê trả về theo thứ tự khác với thứ tự đã được gửi. Việc tính toán này có thê được xử lý băng cách thêm thẻ vào các yêu câu hoặc băng cách kết hợp địa chỉ của khôi bộ nhớ trong thư trả lời.
2. Trước khi đưa ra yêu cầu (tìm nạp thông thường hoặc tìm nạp trước), nút phải đảm bảo rằng nó chưa đưa ra yêu cầu cho cùng một khối, vì hai yêu cầu ghi cho cùng một khối có thê dẫn đến hoạt động không chính xác của giao thức. Ví du: néu nut phát hành tìm nạp trước ghi cho một khối, trong khi nó có lỗi ghi hoặc ghi trước tìm nạp trước còn tồn đọng, thì cả giao thức snooping và giao thức thư mục của chúng tôi đều có thể không hoạt động bình thường.