2014-12-14 27 views
8

Hầu hết các kiến ​​trúc CPU sẽ sắp xếp lại các hoạt động tải cửa hàng, nhưng câu hỏi của tôi là tại sao? giải thích của tôi về một hàng rào cửa hàng tải sẽ trông như thế này:Tại sao hàng rào tải hàng bị coi là đắt?

x = 50; 
store_load_barrier; 
y = z; 

Hơn nữa, tôi không thấy như thế nào rào cản này sẽ có nhiều sử dụng trong chương trình lock-free so với phát hành và có được ngữ nghĩa.

Trả lời

12

Trả lời ngắn: Hàng rào tải cửa ngăn cản bộ xử lý thực thi LOAD một cách bất thường sau hàng rào tải cửa hàng cho đến khi tất cả các cửa hàng trước đó đã hoàn tất.

Chi tiết:

Lý do mà một rào cản cửa hàng tải là tốn kém là nó ngăn ngừa sự sắp xếp lại các hoạt động tải và lưu trữ qua hàng rào.

Giả sử bạn có một chuỗi hướng dẫn như sau:

...    ;; long latency operation to compute r1 
ST r1, [ADDR1] ;; store value in r1 to memory location referenced by ADDR1 
LD r3, [ADDR2] ;; load r3 with value in memory location ADDR2 
...    ;; instructions that use result in r3 

Khi chuỗi này thực hiện rằng giá trị của r1 sẽ là kết quả của một hoạt động mà phải mất một thời gian dài để hoàn thành. Hướng dẫn ST r1, [ADDR1] sẽ phải dừng lại cho đến khi r1 được đọc Trong thời gian chờ đợi, một bộ xử lý không theo thứ tự có thể thực thi đầu tiên LD r3, [ADDR2] và các hướng dẫn khác nếu chúng độc lập với cửa hàng trước đó. Họ sẽ không thực sự cam kết cho đến khi các cửa hàng được cam kết, nhưng bằng cách làm hầu hết các công việc speculatively kết quả có thể được lưu trong bộ đệm sắp xếp lại và sẵn sàng cam kết nhanh hơn.

Điều này làm việc cho một hệ thống xử lý đơn vì CPU có thể kiểm tra xem có phụ thuộc giữa ADDR1 và ADDR2 hay không. Nhưng trong một hệ thống đa bộ xử lý nhiều CPU có thể thực hiện độc lập tải và lưu trữ. Có thể có nhiều bộ xử lý đang thực hiện ST đến ADDR1 và LD từ ADDR2. Nếu các CPU có thể thực thi một cách suy đoán các lệnh này không có các phụ thuộc thì các CPU khác nhau có thể thấy các kết quả khác nhau. Tôi nghĩ rằng các following blog post cho một lời giải thích tốt về cách này có thể xảy ra (Tôi không nghĩ rằng đó là một cái gì đó tôi có thể tóm tắt ngắn gọn trong câu trả lời này).

Bây giờ xem xét các chuỗi mã mà có một hàng rào cửa hàng tải:

...    ;; long latency operation to compute r1 
ST r1, [ADDR1] ;; store value in r1 to memory location referenced by ADDR1 
ST_LD_BARRIER ;; store-load barrier 
LD r3, [ADDR2] ;; load r3 with value in memory location ADDR2 
...    ;; instructions that use result in r3 

Điều này sẽ ngăn chặn sự hướng dẫn LD r3, [ADDR2] và theo hướng dẫn phụ thuộc không bị suy đoán được thực hiện cho đến khi các hướng dẫn cửa hàng trước hoàn tất. Và điều này có thể làm giảm hiệu suất CPU vì toàn bộ đường ống CPU có thể phải dừng trong khi đợi lệnh ST hoàn tất, mặc dù trong chính CPU không có sự phụ thuộc giữa LD và ST.

Có một số điều có thể được thực hiện để giới hạn số tiền mà CPU phải ngừng. Nhưng điểm mấu chốt là rào cản tải cửa hàng tạo ra các phụ thuộc bổ sung giữa các tải và các cửa hàng và điều này giới hạn số lượng thực thi đầu cơ mà CPU có thể thực hiện.

+0

Tôi nghĩ bạn có thể đã đề cập đến nó trong một bối cảnh tương tự, nhưng tải cũng có thể được 'sắp xếp lại' nếu lưu trữ và tải từ cùng một địa chỉ. Tôi có chính xác trong suy nghĩ tải có thể tìm kiếm bộ đệm cửa hàng của chủ đề và lấy giá trị, thay vì đi đến bộ nhớ chính sẽ đắt hơn – William

+0

@William, có giá trị của cửa hàng sẽ được chuyển tiếp đến tải phụ thuộc khi có thể. Đây là [link] (http: //blog.stuffedcow.net/2014/01/x86-memory-disambiguation /) cung cấp thêm một số chi tiết. –

+0

Câu trả lời hay. Về ý kiến ​​- định nghĩa bộ nhớ chỉ cần thiết khi các địa chỉ chưa được biết, nhưng ngay cả khi chúng - vẫn còn một cửa sổ dài để chuyển tiếp trong trường hợp cửa hàng nhớ cache và đi vào bộ nhớ. – Leeor

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