2012-01-12 23 views
27

Tôi là người mới khi nói đến điều này. Bất cứ ai có thể cung cấp một giải thích đơn giản về sự khác biệt giữa các rào cản bộ nhớ sau đây?C + + Các rào cản bộ nhớ cho nguyên tử

  • Các cửa sổ MemoryBarrier();
  • Các hàng rào _mm_mfence();
  • Việc lắp ráp nội tuyến asm volatile ("" : : : "memory");
  • Các nội _ReadWriteBarrier();

Nếu không có một lời giải thích đơn giản một số liên kết đến bài viết tốt hay sách sẽ có thể giúp tôi làm cho nó thẳng. Cho đến bây giờ, tôi chỉ sử dụng các đối tượng được viết bởi những người khác gói những cuộc gọi này nhưng tôi muốn có một sự hiểu biết tốt hơn suy nghĩ hiện tại của tôi về cơ bản dọc theo các dòng có nhiều cách để thực hiện các rào cản bộ nhớ.

+4

bạn quên khoảng C++ 11s 'atomic_thread_fence' – Grizzly

+0

Vâng đó là điều này dẫn đến ... chúng tôi có đối tượng mẫu nguyên tử của riêng mình cho các loại tích phân và tôi muốn chuyển sang nguyên tử chuẩn C++ 11. Trước khi làm như vậy, tôi muốn hiểu việc triển khai cơ bản về cách cả hai thực sự hoạt động. – AJG85

Trả lời

28

Cả hai MemoryBarrier (MSVC) và _mm_mfence (được hỗ trợ bởi một số trình biên dịch) cung cấp hàng rào bộ nhớ phần cứng, ngăn bộ xử lý di chuyển đọc và ghi trên hàng rào.

Sự khác biệt chính là MemoryBarrier có nền tảng triển khai cụ thể cho x86, x64 và IA64, khi _mm_mfence sử dụng chỉ dẫn mfence SSE2, vì vậy nó không phải lúc nào cũng có sẵn.

Trên x86 và x64 MemoryBarrier được triển khai lần lượt là xchglock or và tôi đã thấy một số xác nhận rằng điều này nhanh hơn mfence. Tuy nhiên điểm chuẩn của riêng tôi cho thấy điều ngược lại, vì vậy dường như nó phụ thuộc rất nhiều vào mô hình bộ vi xử lý.

Một sự khác biệt khác là mfence cũng có thể được sử dụng để đặt hàng các cửa hàng/thời gian không theo thời gian (movntq v.v.).

GCC cũng có __sync_synchronize tạo ra hàng rào phần cứng.

asm volatile ("" : : : "memory") trong GCC và _ReadWriteBarrier trong MSVC chỉ cung cấp hàng rào bộ nhớ cấp trình biên dịch, ngăn trình biên dịch truy cập lại bộ nhớ. Điều đó có nghĩa là bộ vi xử lý vẫn còn miễn phí để làm sắp xếp lại.

Hàng rào biên dịch thường được sử dụng kết hợp với các hoạt động có một số loại hàng rào phần cứng tiềm ẩn. Ví dụ. trên x86/x64 tất cả các cửa hàng đều có hàng rào phát hành và tải có hàng rào, vì vậy bạn chỉ cần một hàng rào biên dịch khi thực hiện tải-mua và phát hành kho.

+0

hoàn hảo! Cảm ơn, đã giúp rất nhiều. – AJG85

3

Xem câu trả lời của tôi here về ngữ nghĩa cấp phần cứng của hàng rào. Những gì không được đề cập ở đó là chúng cũng ngăn cản sắp xếp lại các tải, lưu trữ hoặc tải các cửa hàng & (tùy theo hàng rào) trên các hàng rào, ở cả cấp độ trình biên dịch và cấp phần cứng.