Đề cập đến (hơi ngày) paper bởi Hans Boehm, trong "Hoạt động nguyên tử". Nó đề cập rằng mô hình bộ nhớ (được đề xuất tại thời điểm đó) sẽ không ngăn cản một trình biên dịch tối ưu hóa kết hợp một chuỗi các tải, hoặc lưu trữ, trên cùng một biến được kết hợp thành một tải duy nhất. Ví dụ mình là như sau (cập nhật đến cú pháp hiện tại hy vọng đúng):Kết hợp các cửa hàng/tải các biến nguyên tử liên tiếp
Với
atomic<int> v;
Mã
while(v.load(memory_order_acquire)) { ... }
thể được tối ưu hóa để:
int a = v.load(memory_order_acquire);
while(a) { ... }
Rõ ràng điều này sẽ là xấu, như ông nói. Bây giờ câu hỏi của tôi là, vì bài báo có một chút cũ, mô hình bộ nhớ C++ 0x hiện tại có ngăn chặn kiểu tối ưu hóa này, hay nó vẫn được cho phép về mặt kỹ thuật?
Việc đọc tiêu chuẩn của tôi dường như nghiêng về phía nó không được phép, nhưng việc sử dụng ngữ nghĩa "có được" làm cho nó ít rõ ràng hơn. Ví dụ nếu nó là "seq_cst", mô hình có vẻ đảm bảo rằng tải phải tham gia vào tổng số thứ tự trên truy cập và tải giá trị chỉ một lần do đó dường như vi phạm thứ tự (vì nó phá vỡ trình tự xảy ra trước mối quan hệ).
Để có được, tôi giải thích 29.3.2 có nghĩa là tối ưu hóa này không thể xảy ra, vì bất kỳ hoạt động "giải phóng" nào phải được quan sát bởi thao tác "có được". Chỉ làm một việc có vẻ như không hợp lệ.
Vì vậy, câu hỏi của tôi là liệu mô hình hiện tại (trong tiêu chuẩn đang chờ xử lý) có cho phép loại tối ưu hóa này không? Và nếu có, thì phần nào đặc biệt cấm nó? Nếu không, việc sử dụng nguyên tử volatile
có giải quyết được vấn đề không?
Và để thưởng, nếu hoạt động tải có thứ tự "thoải mái" thì tối ưu hóa có được phép không?
Về ngữ nghĩa thu được: Có, tôi đã hiểu sai bit đó - bản phát hành có thể nhìn thấy thiết lập mối quan hệ được sắp xếp, nhưng về mặt kỹ thuật không có gì đảm bảo tôi thấy nó (ngoại trừ trình biên dịch/CPU đó sẽ nhanh chóng mất tất cả thị trường chia sẻ). –
Khoảng 29.3p13, tôi cũng đọc bit này và đã bị cám dỗ để nghĩ rằng nó làm cho đảm bảo này. Nhưng bởi vì nó sử dụng thuật ngữ * thời gian hợp lý * nó không có giá trị và chỉ có thể được đưa ra khỏi tiêu chuẩn. Đó là một thuật ngữ vô nghĩa có nghĩa là nó không thể dựa vào trong những tình huống có độ trễ thấp. Ví dụ, trong dự án hiện tại của tôi, nếu thời gian này là bất kỳ hơn 10s của nano giây không có giá trị nào trong hoạt động nguyên tử (nói so với một khóa). –
Bạn có đồng ý sau đó, như tôi nghĩ n.m sẽ, mà làm cho nguyên tử này một 'dễ bay hơi' ngăn cản trình biên dịch từ làm tối ưu hóa bạn đã hiển thị? –