2014-10-10 13 views
6

Đầu tiên, một số ngữ cảnh: Tôi đang làm việc với mô hình nguyên tử dựa trên C11, inline-asm, nhưng với mục đích này, tôi rất vui khi bỏ qua khía cạnh C (và bất kỳ rào cản trình biên dịch nào mà tôi có thể xử lý riêng) và xem xét nó về bản chất chỉ là câu hỏi về kiến ​​trúc asm/cpu.Có thể sử dụng rào cản bộ nhớ chỉ ở bên lưu trữ

Giả sử tôi có mã trông giống như:

various stores 
barrier 
store flag 
barrier 

Tôi muốn để có thể đọc flag từ một lõi CPU và kết luận rằng various stores đã được thực hiện và đã nhìn thấy được. Có thể làm như vậy mà không có bất kỳ loại hướng dẫn rào cản bộ nhớ nào ở phía tải? Rõ ràng nó có thể ít nhất là trên một số kiến ​​trúc cpu, ví dụ x86, nơi một rào cản bộ nhớ rõ ràng là không cần thiết trên một trong hai lõi. Nhưng nói chung thì sao? Nó có thay đổi rộng rãi bởi cpu arch cho dù điều này là có thể?

+0

AFAIK, Alpha cần rào cản, trong khi ARM/PPC cần hoặc là rào cản, hoặc phụ thuộc địa chỉ/dữ liệu, hoặc phụ thuộc điều khiển RW, hoặc kiểm soát RR depencies + ISYNC/ISB giữa đọc cờ và hoạt động phụ thuộc vào nó. Đối với ARM/PPC, bạn có thể quan tâm đến "Hướng dẫn giới thiệu về mô hình bộ nhớ ARM và POWER Relaxed Memory". – ninjalj

+0

Một điểm dữ liệu khác: theo đề xuất của bộ nhớ tiêu thụ tại http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1444.htm, một số CPU MIPS được nhúng cũng có thể tránh được các rào cản bằng cách sử dụng các phụ thuộc (cũ hơn, "đúng" MIPS được cho là seq-cst). Ngoài ra, vì 'smp_read_barrier_depends()' trong nhân Linux chỉ là một rào cản đối với Alpha, có vẻ như nếu có sự phụ thuộc địa chỉ (có thể giả) ở phía đọc, thì có thể tránh được rào cản đọc (lưu cho Alpha). Làm cho trình biên dịch bảo toàn sự phụ thuộc là một vấn đề khác. – ninjalj

Trả lời

3

Nếu CPU sắp xếp lại tải, mã của bạn sẽ yêu cầu hàng rào tải để hoạt động chính xác. Có rất nhiều kiến ​​trúc làm việc sắp xếp lại; xem bảng trong Memory ordering để biết một số ví dụ.

Vì vậy, trong trường hợp chung, mã của bạn không yêu cầu các rào cản tải.

x86 không phải là rất điển hình ở chỗ nó cung cấp đảm bảo đặt hàng bộ nhớ khá nghiêm ngặt. Xem Who ordered memory fences on an x86? để thảo luận.

+0

Có thể sắp xếp lại các tải khi có một trong các tải xảy ra phụ thuộc vào giá trị được tải bởi người khác không? Chắc chắn loại sắp xếp lại này không thể diễn ra ở mức trình biên dịch (vì nó có thể tạo ra các tải bị lỗi) nhưng có lẽ CPU có thể thực hiện các tải có khả năng gây lỗi và chỉ trì hoãn lỗi? –

+0

Cảm ơn "Ai đã đặt hàng hàng rào bộ nhớ trên liên kết x86". Rất thú vị đọc - Tôi luôn luôn tự hỏi tại sao, với đảm bảo đặt hàng mạnh mẽ đã có, một hướng dẫn hàng rào rõ ràng đã được thêm vào. –

+0

Đây là một bài giảng thú vị khác có thể giải thích mọi thứ - http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-2-of-2 – Leeor

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