Đầ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ể?
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
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