Tính ôn định của bộ nhớ đệm dam bảo rằng nhiều bộ xử lý có một chế độ xem ôn định về bộ nhớ. Nó không trả lời câu hỏi về bộ nhớ ôn định đến mức nào. Bởi “ổn định đến mức nào”
chúng ta muốn nói đến khi nào một bộ xử ly thay được một giá trị đã được cập nhật bởi một bộ xử lý khác? Vì bộ xử lý giao tiếp thông qua các biến được chia sẻ (được sử dụng trong cả giá trị dữ liệu và đồng bộ hóa), câu hỏi đặt ra là: Một bộ xử lý phải quan sát việc ghi dữ liệu của một bộ xử lý khác theo thứ tự nào? Vì cách duy nhất đề “ “quan sát quá trình ghi của một bộ xử lý khác”
là thông qua cách đọc, câu hỏi trở thành, những yếu tố nào phải được áp đặt vào giữa các lần đọc và ghi đến các vị trí khác nhau bởi các bộ xử lý khác nhau?
Mặc dù câu hỏi về cách thức bộ nhớ ôn định có vẻ đơn giản, nhưng nó lại phức tạp đáng kể,
như chúng ta có thê thây với một ví dụ đơn giản. Đây là hai đoạn mã từ quy trình PI và P2, được hiên thị cạnh nhau:
PI: A=0; P2: B=0;
A = 13 B = 1;
LI: if (B == 0)... L2: if (A == 0)...
Giả sử rằng các quá trình đang chạy trong các bộ xử lý khác nhau, và vị trí Á và B được cả hai bộ xử lý lưu trong bộ nhớ đệm ban đầu với gia tri ban dau là 0. Nếu việc ghi luôn có hiệu lực ngay lập tức và được các bộ xử lý khác nhau đều nhìn thấy ngay lập tức, thì cả hai câu lệnh 1ƒ (được gắn nhãn L1 và L2) đều là bất khả thi để đánh giá các điều kiện của chúng là đúng, vì đạt được câu lệnh 1ƒ có nghĩa là A hoặc B phải được gán giá trị 1. Nhưng giá sử việc ghi không hợp lệ bị trì hoãn và bộ xử lý được phép tiếp tục trong thời gian trì hoãn nay; thì có thê cả P1 và P2 đều không thấy sự bất hợp lệ của B và A (tương ứng) trước khi chúng cô gắng đọc các giá trị. Câu hỏi đặt ra là có nên cho phép hành v1 này không, và nêu có thì với những điêu kiện nao?
Mô hình đơn giản nhất cho tính ôn định của bộ nhớ được gọi là tính ôn định tuần tự. Tính ồn định tuần tự cần kết quả của bất kỳ quá trình thực thi nào cũng như nhau khi sự truy cập bộ nhớ được thực thi bởi mỗi bộ xử lý được giữ theo thứ tự và các truy cập giữa các bộ xử lý khác nhau được xen kẽ tùy ý. Tính ôn định tuần tự loại bỏ khả năng xảy ra một số thực hiện không rõ
rang trong ví dụ trước, bởi vì các nhiệm vụ phải được hoàn thành trước khi câu lệnh if duoc bắt đầu.
Cách đơn giản nhất dé thực hiện ô 6n định tuần tự là yêu cầu bộ xử lý trì hoãn việc hoàn thành bat ky truy cap bộ nhớ nào cho đến khi các trường. hợp vô hiệu do truy cập đó gây ra được giải quyết. Tất nhiên, việc trì hoãn lần truy cập bộ nhớ tiếp theo cho đến khi lần truy cập trước đó được hoàn thành cũng hiệu quả không kém. Hãy nhớ rằng tính ôn định của bộ nhớ liên quan đến hoạt động giữa các biến khác nhau: hai phải truy cập được sắp xếp thực sự đến vị trí bộ nhớ khác nhau.
Trong ví dụ của chúng ta, chúng ta phải trì hoãn việc đọc A hoặc B (A =0 hoặc B= =0) cho đến khi quá trình ghi trước đó hoàn thành (B = I hoặc A= 1). Theo tính ôn định tuần tự, chúng ta không thẻ, ví dụ, chỉ cần đặt ghi vào bộ đệm ghi và tiếp tục đọc. Mặc dù tính ô ôn định tuần tự thê hiện một mô hình lập trình đơn giản, nhưng nó làm giảm hiệu suất tiềm năng, đặc biệt là trong một bộ đa xử lý có số lượng bộ xử lý lớn hoặc độ trễ kết nói liên tục kéo dài, như chúng ta có thê thấy trong ví dụ sau.
VÍ DỤ
Giả sử chúng ta có một bộ xử lý trong đó một lần ghi bỏ lỡ mất 40 chu kỳ đề thiết lập quyên sở hữu, 10 chu kỳ để phát hành mỗi lần vô hiệu sau khi quyền sở hữu được thiết lập và 50 chu kỳ đề một lần mắt hiệu lực hoàn tất và được thừa nhận sau khi nó được ban hành. Giả sử rằng bốn bộ xử lý khác chia sẻ một khối bộ nhớ cache, thì một lần ghi lỗi sẽ làm ngưng trệ bộ xử lý ghi trong bao lâu nếu bộ xử lý đó là ôn định tuần tự? Giả Sử rằng các lệnh không hợp lệ phải được thừa nhận một cách rõ ràng trước khi bộ điều khiến thư mục biết chúng đã hoàn thành. Giả sử chúng ta có thê tiếp tục thực thi sau khi có được quyền sở hữu đôi với việc ghi bỏ lỡ mà không cần đợi vô hiệu: việc viết sẽ mat bao lâu?
TRẢ LỜI
Khi chúng ta chờ các lần vô hiệu, mỗi lần ghi sé lay tong thoi gian sở hữu cộng với thời gian để hoàn thành các lần vô hiệu. Vì các lần vô hiệu có thể chồng chéo lên nhau, chúng ta chi can lo lang về lần cuối cùng, bat dau 10 + 10 + 10 + 10 =40 chu kỳ sau khi quyền sở hữu được thiết lập. Do đó tông thời gian ghi là 40 + 40 + 50 = 130 chu kỳ. Trong khi đó, thời gian sở hữu chỉ là 40 chu kỳ. Với việc triên khai bộ đệm ghi thích hợp, thậm chí có thể tiếp tục trước khi quyền sở hữu được thiết lập.
Để cung cấp hiệu suất tốt hơn, các nhà nghiên cứu và người thiết lập đã khám phá hai hướng khác nhau. Đầu tiên, họ đã phát triển các triển khai day tham vọng nhằm duy trì tính ôn định tuần tự nhưng Sử dụng các kỹ thuật độ trễ ân để giảm sai sót; chúng ta sẽ thảo luận những vấn đề này trong phần về các vấn đề xuyên suốt (xem trang 731). Thứ hai, họ đã phát triển các mô hình ôn định bộ nhớ ít hạn chế hơn cho phép phần cứng nhanh hơn. Những mô hình như vậy có thê ảnh hưởng đến cách lập trình viên nhìn nhận bộ đa xử lý, vì vậy, trước khi thảo luận về những mô hình ít hạn chế hơn này, chúng ta hãy xem những gì lập trình viên mong đợi.
e Góc nhìn của lập trình viên
95
Mặc dù mô hình ôn định tuần tự có một nhược điểm về hiệu suất, nhưng theo quan điểm của lập trình viên, nó có uu diém 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 nhưng vấn cho phép triên khai hiệu suât cao.
Một mô hình lập trình như vậy cho phép chúng ta triển khai hiệu quả hơn là giá định rằng các chương trình được dong bộ hóa. Một chương trình được đồng bộ hóa nếu tất cả truy cập vào dữ liệu được chia sẻ được sắp xếp bằng các hoạt động đồng bộ hóa. Một tham chiều đữ liệu được sắp xếp theo thứ tự bởi một hoạt động đồng bộ hóa nếu, trong mọi lần thực thi có thẻ, việc ghi một biến bởi một bộ xử lý và một truy cập (đọc hoặc ghi) của biến đó bởi một bộ xử lý khác được phân tách bằng một cặp hoạt động đồng bộ hóa, một thực thi sau khi ghi bởi bộ xử lý ghi và một thực thĩ trước khi truy cập bởi bộ xử lý thứ hai. Các trường hợp mà các biến có thê được cập nhật mà không cần sắp xếp thứ tự bằng cách đồng bộ hóa được gọi là cuộc đua đữ liệu, vì kết quả thực thi phụ thuộc vào tốc độ tương đối của bộ xử lý và giống như các cuộc đua trong thiết kế phần cứng, kết quả là không thê đoán trước, dẫn đến một tên gọi khác cho các chương trình đồng bộ:
data-face-race.
Ví dụ đơn giản, hãy xem xét một biến đang được đọc và cập nhật bởi hai bộ xử lý khác nhau.
Mỗi bộ xử ly bao quanh việc đọc và cập nhật bằng một khóa và một khóa, cả hai đều để đảm bảo loại trừ lẫn nhau cho bản cập nhật và đảm bảo rằng việc đọc là ôn định. Rõ ràng, mọi thao tác ghi gio đây được tách biệt khỏi việc đọc bởi bộ xử lý khác bằng một cặp thao tác đồng bộ hóa: một lần mở khóa (sau khi ghi) và một lần khóa (trước khi đọc). Tất nhiên, nêu hai bộ xử lý đang ghi một biến mà không có lần đọc nào can thiệp, thì việc ghi cũng phải được tách biệt bằng các hoạt động đồng bộ hóa.
Một quan sát được chấp nhận rộng rãi rằng hầu hết các chương trình đều được đồng bộ hóa.
Nhận định này chủ yếu đúng bởi vì nêu các truy cập không được đồng bộ hóa, hành vi của chương trình sẽ khá khó xác định vì tốc độ thực thi sẽ quyết định bộ xử lý nào thắng trong cuộc đua dữ liệu và do đó ảnh hưởng đến kết quả của chương trình. Ngay cả với sự ôn định tuần tự, việc lập luận về các chương trình như vậy là rất khó. Các lập trình viên có thê cố gắng đảm bảo thứ tự bằng cách xây dựng cơ chế đồng bộ hóa của riêng họ, nhưng điều này cực kỳ phức tạp, có thê dẫn đến các chương trình lỗi và có thê không được hỗ trợ về mặt kiến trúc, nghĩa là chúng có thể không hoạt động trong các thế hệ tương lai của bộ đa xử lý. Thay vào đó, hầu như tất cả các lập trình viên sẽ chọn sử dụng các thư viện đồng bộ hóa phù hợp và tôi ưu hóa cho bộ đa xử lý và kiêu đồng bộ hóa. Cuối cùng, việc sử dụng các nguyên thủy đồng bộ hóa tiêu chuẩn dam bao rang ngay cả khi kiến trúc trién khai m6 hinh 6n dinh thoai mai hon so véi tinh 6n dinh tuan tự, một chương trình được đồng bộ hóa sẽ hoạt động như thể phần cứng thực hiện tính ôn định tuần tự.
e Các mô hình ôn định nhẹ nhàng: Cơ bản
Ý tưởng chính trong các mô hình ôn định thoải mái là cho phép đọc và ghi hoàn tất theo thứ tự, nhưng sử dụng các hoạt động đồng bộ hóa để thực thi thứ tự, để một chương trình được đồng bộ hóa hoạt động như thể bộ xử ly đã ôn định tuần tự. Có một loạt các mô hình thư giãn được phân loại theo những thách thức mà họ thư giãn. Ba nhóm thử thách chính được thả lỏng là:
1. Thử tự W —R: mang lại một mô hình được gọi là tông thứ tự cửa hàng hoặc tính ôn định của bộ xử lý. Bởi vi thir tw nay duy trì thứ tự giữa các lần ghi, nhiều chương trinh hoạt động theo tinh 6 ôn định tuần tự hoạt động theo mô hình này mà không cân đồng bộ hóa bô sung.
2. Thử tự W — W: tạo ra một mô hình được gọi là đặt hàng từng phần tại cửa hàng.
3. R >WvàR->R: tạo ra nhiều mô hình khác nhau bao gôm sắp xếp thứ tự yêu, mô hình ôn định Alpha, mô hình õ ồn định PowerPC và tính ôn định giải phóng tùy thuộc vào chi tiết của các hạn chế về thứ tự và cách hoạt động đồng bộ hóa thực thị thứ tự.
Bằng cách thư giãn các thử thách này, bộ xử lý có thê có được những lợi thế hiệu suất đáng kê. Tuy nhiên, có rất nhiều sự phức tạp trong việc mô tả các mô hình ôn định thoải mái, bao gồm những ưu điểm và sự phức tạp của việc nới lỏng các đơn đặt hàng khác nhau, xác định chính xác ý nghĩa của việc ghi hoàn thành và quyết định khi nào bộ xử lý có thể nhìn thấy các giá trị mà chính bộ xử lý đã ghi. Những phức tạp này, cũng như đánh giá hiệu suất của mô hình thoải mái và thảo luận về các vấn đề triên khai, được mô tá chỉ tiết hơn trong Phu luc F.
e© Nhận xét cuối cùng về các mô hình ôn định
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 ôn định thoải mái, thay đôi từ tính ôn định của bộ xử lý đến tính ôn định của phiên bản. Vì đồng bộ hóa là đặc thù của đa xử lý cao và dễ xảy ra lỗi, kỳ vọng là hầu hết các lập trình viên sẽ sử dụng các thư viện đồng bộ hóa tiêu chuẩn và sẽ viết các chương trình đồng bộ hóa, làm cho việc lựa chọn một mô hình 6n định yếu đối với lập trình viên và mang lại hiệu suất cao hơn.
Một quan điểm thay thế, mà chúng ta sẽ thảo luận nhiều hơn trong phần tiếp theo (cụ thé là ở trang 731), lập luận răng với suy đoán phân lớn lợi thê về hiệu suât của các mô hình ôn định thoái mái có thê đạt được với tính ôn định của bộ xử lý tuân tự.
Một phần quan trọng của lập luận này ủng hộ tính ôn định thoải mái xoay quanh vai trò của trình biên dịch và khả năng của nó đê tôi ưu hóa truy cập bộ nhớ vào các biên được chia sẻ tiêm năng. Chủ đê này cũng được thảo luận trên trang 73 l.