2010-10-22 59 views
11

Tôi đang đọc các rào cản bộ nhớ của Paul E. McKenney http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf mọi thứ được giải thích chi tiết và khi tôi thấy mọi thứ rõ ràng, tôi gặp phải một câu. tôi không hiểu gì cả. Hãy để tôi hiển thị ví dụHàng rào bộ nhớ - Cần trợ giúp để hiểu

void foo(void) 
{ 
    a = 1; #1 
    b = 1; #2 
} 

void bar(void) 
{ 
    while (b == 0) continue; #3 
    assert(a == 1); #4 
} 

giả sử hai chức năng này đang chạy trên một bộ xử lý khác. Bây giờ những gì có thể xảy ra là lưu trữ một số 1 có thể được nhìn thấy sau khi lưu trữ để b # 2 bởi bộ vi xử lý thứ hai, bởi vì hàng đợi xử lý đầu tiên lưu trữ để "a" và tiến hành để lưu trữ b hướng dẫn. OK, tốt thôi, chúng ta thêm hàng rào viết vào dòng giữa # 1 và # 2, nhưng mã này vẫn có thể thất bại, vì bộ xử lý thứ hai có thể xếp hàng thông điệp vô hiệu, vì vậy chúng ta thêm một hàng rào bộ nhớ nữa (đọc hàng rào lần này) vào dòng giữa # 4 và # 4.

void foo(void) 
{ 
    a = 1; #1 
    write_memory_barrier(); 
    b = 1; #2 
} 

void bar(void) 
{ 
    while (b == 0) continue; #3 
    read_memory_barrier(); 
    assert(a == 1); #4 
} 

này thực thi xử lý thứ hai để xử lý tất cả xếp hàng đợi thông điệp (làm mất hiệu lực a) và đọc nó một lần nữa bằng cách gửi thông điệp đọc MESI để xử lý đầu tiên trên # 4. ĐƯỢC. Tiếp theo bài báo nói

Nhiều kiến ​​trúc CPU do đó cung cấp yếu bộ nhớ hàng rào hướng dẫn mà làm chỉ có một hoặc khác của hai. Nói chung, “rào cản bộ nhớ đọc” chỉ đánh dấu hàng đợi không hợp lệ và “rào cản viết ” chỉ đánh dấu bộ đệm cửa hàng. trong khi rào chắn bộ nhớ chính thức thực hiện cả hai.

Tuyệt vời, đó là rõ ràng, nhưng sau đó tôi thấy điều này

Hiệu quả của việc này là một đọc lệnh rào cản bộ nhớ chỉ tải về CPU thực thi nó, vì vậy mà tất cả tải trước bộ nhớ đọc rào chắn sẽ xuất hiện để hoàn thành trước bất kỳ tải nào sau ngưỡng đọc bộ nhớ . Tương tự như vậy, chỉ cần viết một hàng rào bộ nhớ , một lần nữa trên CPU thực thi nó, và một lần nữa để tất cả các cửa hàng trước ghi rào cản bộ nhớ sẽ xuất hiện đã hoàn thành trước bất kỳ cửa hàng nào .

nên

tất cả tải trọng trước hàng rào bộ nhớ đọc sẽ dường như đã hoàn thành trước bất kỳ tải sau hàng rào bộ nhớ đọc

pha trộn lên tất cả những gì được giải thích trước đó. Nó có nghĩa là gì? Tải nào trong "thanh" chức năng phải hoàn thành trước khi tải "a" # 4? Tôi hiểu khẳng định có thể thất bại mà không có rào cản bộ nhớ trong chức năng này chỉ vì bộ vi xử lý có thể đọc một giá trị cũ, bởi vì nó vẫn không quản lý để làm mất hiệu lực dòng cache của nó, nơi đối tượng "a" được đặt.

Giải thích chi tiết sẽ thực sự hữu ích, tôi đang cố gắng hiểu nó cả ngày.

Cảm ơn rất nhiều trước.

Trả lời

10

Điều đó có nghĩa là gì?

Điều đó có nghĩa rằng nếu bạn có:

read 
read 
read 
READ BARRIER 
read 
read 
read 

thì rào cản đọc đóng vai trò như một "tham gia điểm" chia những lần đọc thành hai lô. Tất cả các lần đọc trước hàng rào đọc sẽ được thực hiện trước khi bất kỳ đọc nào sau hàng rào đọc được bắt đầu.

Tải nào trong bar() phải hoàn tất trước khi tải a (# 4) bắt đầu?

Tất cả số lần đọc b (# 3) bắt buộc phải đọc trước a (# 4). Điều này có nghĩa là a không được đọc cho đến sau b không còn 0. Bởi vì foo() sử dụng hàng rào viết để đảm bảo rằng a đã được đổi thành 1 (# 1) vào thời điểm b bị thay đổi (# 2). Hai rào cản do đó làm việc cùng nhau để đảm bảo tuyên bố khẳng định sẽ luôn thành công.

+0

Cảm ơn câu trả lời của bạn, nhưng nếu chúng ta xem ví dụ 4.3 trong bài viết chúng ta sẽ thấy ví dụ, khi tất cả các lần đọc của b (# 3) trước đọc của một rào cản không có bộ nhớ và khẳng định vẫn không thành công, vì CPU 1 thực thi xác nhận (a == 1) và, kể từ giá trị cũ của “a” vẫn nằm trong bộ nhớ cache của CPU 1, xác nhận này không thành công. – confucius

+0

Trong mã cố định (có hàng rào đọc) CPU 1 thực hiện xác nhận (a == 1), và, kể từ dòng bộ nhớ cache có chứa “a” không còn trong bộ nhớ cache của CPU 1 (2).), nó truyền một thông điệp "đọc". – confucius

+0

Vì vậy, nó không chỉ là một thứ tự, phải không? Tôi không thấy làm thế nào nó có thể được giải thích chỉ bằng cách nói rằng nó buộc phải đặt hàng. Tôi nghĩ có điều gì đó mà tôi không hiểu, một số chi tiết cơ bản, điều đó không cho phép tôi tham gia tất cả thông tin tôi có và có được bức tranh cuối cùng. – confucius

Các vấn đề liên quan