Dễ dàng đặt các rào cản bộ nhớ ở phía hạt nhân: các macro mb, wmb, rmb, v.v. luôn được đặt vào nhờ các tiêu đề hạt nhân Linux.Rào cản bộ nhớ trong không gian người dùng? (Linux, x86-64)
Làm cách nào để thực hiện điều này ở phía người dùng?
Dễ dàng đặt các rào cản bộ nhớ ở phía hạt nhân: các macro mb, wmb, rmb, v.v. luôn được đặt vào nhờ các tiêu đề hạt nhân Linux.Rào cản bộ nhớ trong không gian người dùng? (Linux, x86-64)
Làm cách nào để thực hiện điều này ở phía người dùng?
Bạn đang tìm kiếm số nội dung tích lũy nguyên tử gcc của full memory barrier.
Xin lưu ý các chi tiết về tài liệu tham khảo tôi đã cung cấp ở đây cho biết,
Các [sau] builtins được dự định để tương thích với những mô tả trong Application Binary Intel Itanium Processor cụ thể Interface, phần 7.4 . Như vậy, họ khởi hành từ thực hành GCC thông thường bằng cách sử dụng tiền tố “__builtin_” và hơn nữa chúng bị quá tải sao cho chúng hoạt động trên nhiều loại.
Posix defines a number of functions hoạt động như các rào cản bộ nhớ. Các vị trí bộ nhớ không được truy cập đồng thời; để ngăn chặn điều này, sử dụng đồng bộ hóa - và đồng bộ hóa đó cũng sẽ hoạt động như một rào cản.
Việc đồng bộ hóa không cần thiết khi tất cả những gì cần thiết là khóa và chờ một hàng đợi của một nhà văn/một người đọc. Các thư viện POSIX không cung cấp các hoạt động mfence/lfence/sfence AFAIK. –
Bạn không yêu cầu khóa hoạt động miễn phí; bạn đã yêu cầu các rào cản bộ nhớ trong không gian người dùng. POSIX có chúng; chúng được gọi là "pthread_mutex_lock", "pthread_mutex_unlock", v.v. Bạn có thể không thích mô hình đằng sau chúng, nhưng đó là * một câu trả lời chính thức cho câu hỏi của bạn. –
Linux x64 có nghĩa là bạn có thể sử dụng các hướng dẫn rào cản bộ nhớ Intel. Bạn có thể bọc chúng trong macro tương tự như trong các tiêu đề Linux, nếu những macro là không phù hợp hoặc tiếp cận với mã của bạn
Tôi nghĩ đây là lựa chọn tốt nhất. Lỗ hổng chính là việc duy trì yêu cầu các trình biên dịch riêng biệt và các bộ vi xử lý cũ/tương lai/không phải của Intel. –
Vậy bạn muốn gì? Bạn không thích giải pháp di động và bạn không thích giải pháp xử lý cụ thể. –
Các include/arch/qatomic_*.h
tiêu đề của một phân phối Qt gần đây bao gồm (LGPL) mã cho rất nhiều kiến trúc và tất cả các loại rào cản bộ nhớ (có được, phát hành, cả hai).
__sync_synchronize()
trong GCC 4.4+
The Memory Intel đặt hàng trắng, một phần từ Tập 3A của Intel 64 và IA-32 thủ http://developer.intel.com/Assets/PDF/manual/253668.pdf
Các Qprof profiling thư viện (không có gì để làm với Qt) cũng bao gồm trong mã nguồn của nó một thư viện các hoạt động nguyên tử, bao gồm các rào cản bộ nhớ. Chúng hoạt động trên nhiều trình biên dịch và kiến trúc. Tôi đang sử dụng nó trên một dự án của tôi.
Sử dụng libatomic_ops. http://www.hpl.hp.com/research/linux/atomic_ops/
Nó không phải là trình biên dịch cụ thể và ít lỗi hơn các công cụ GCC. Nó không phải là một thư viện giganto cung cấp rất nhiều chức năng mà bạn không quan tâm. Nó chỉ cung cấp các hoạt động nguyên tử. Ngoài ra, nó di động với các kiến trúc CPU khác nhau.
Chỉ cần vay các rào cản được xác định cho hạt nhân Linux, chỉ cần thêm các macro đó vào tệp tiêu đề của bạn: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21. Và tất nhiên, cung cấp cho các nhà phát triển Linux tín dụng trong mã nguồn của bạn.
Tôi không quá quen thuộc với chủ đề này. Đây có phải là chức năng cụ thể của bộ xử lý không? (Vì ví dụ của bạn là Itanium ...) –
Nói chung, người dùng không nên tận dụng chức năng cụ thể của nền tảng và trình biên dịch khi có các cơ chế tiêu chuẩn, đa nền tảng để đạt được hiệu quả tương tự. Những gì emg-2 thực sự cần là sử dụng thư viện chủ đề POSIX (pthreads). –
@Michael, tôi hoàn toàn đồng ý với ý kiến của bạn. Đó là lý do để làm nổi bật ghi chú cụ thể trên nền tảng. – nik