2013-06-06 36 views
18

Trong Blog Herb Sutter mình viếtGiảm phân tử nguyên tử có đắt hơn gia tăng không?

[...] vì incrementing tính tham khảo con trỏ thông minh thường có thể được tối ưu hóa để được giống như một tăng bình thường trong một tối ưu hóa shared_ptr thực hiện - chỉ cần một tăng thông thường hướng dẫn, và không có hàng rào, trong mã được tạo.

Tuy nhiên, sự sụt phải là sụt lần nguyên tử hoặc tương đương, mà tạo ra hướng dẫn xử lý bộ nhớ đặc biệt mà đắt hơn trong bản thân, và rằng trên đó gây ức hàng rào hạn chế đối với việc tối ưu hóa mã xung quanh.

Văn bản giới thiệu về việc triển khai shared_ptr và tôi không chắc liệu nhận xét của anh chỉ áp dụng cho trường hợp này hay thông thường. Từ công thức của mình, tôi thu thập nó là thường là.

Nhưng khi nghĩ về điều đó tôi chỉ có thể nghĩ đến "giảm giá đắt hơn" khi số if(counter==0) ngay sau đó - có thể là trường hợp với shared_ptr.

Vì vậy, tôi tự hỏi nếu nguyên tử hoạt động ++counter là (thường) luôn nhanh hơn hơn --counter, hay chỉ vì nó được sử dụng if(--counter==0)... với shared_ptr?

+1

* "Từ công thức của mình, tôi thu thập nó thường là" * - Tôi thu thập ngược lại, mặc dù. –

+0

Bạn cũng có thể muốn xem xét hàng rào WriteRead được yêu cầu cho --counter == 0 và thường là giá trị đắt nhất, cũng như loại rào chắn duy nhất yêu cầu phải sau khi ghi dữ liệu phải được đọc lại đảm bảo đồng bộ hóa giữa các lõi. Đối với truy cập ++ bạn chỉ cần viết mà không cần yêu cầu ngay lập tức để có được trạng thái đồng bộ của giá trị này hoặc dữ liệu khác. –

Trả lời

11

Tôi tin rằng nó đề cập đến thực tế là số gia tăng có thể được "ẩn", trong đó "giảm và kiểm tra" phải được thực hiện dưới dạng một thao tác.

Tôi không biết về bất kỳ kiến ​​trúc nơi --counter (hoặc counter--, asssuming chúng ta đang nói về kiểu dữ liệu đơn giản như int, char, vv) là chậm hơn so với ++counter hoặc counter++.

+0

Bạn có ý nghĩa gì bởi "ẩn"? – curiousguy

+0

Nó hoàn toàn trái ngược với những gì anh ta nói, mặc dù. Anh ấy nói rõ ràng "sự gia tăng thông thường". Nó không phải về việc không kiểm tra giá trị sau đó hay bất kỳ thứ gì như vậy. Đó là về việc sử dụng số gia tăng thông thường (đọc bộ nhớ cache, sửa đổi, viết đường dẫn) mà _will_ mất tham chiếu trong sự hiện diện của đồng thời. Do đó tôi rất có khuynh hướng nói rằng điều anh ấy nói chỉ đơn giản là sai. Sutter có thể nói những điều sai trái quá, tại sao không. – Damon

16

Anh ấy thảo luận chi tiết hơn ở đâu đó, tôi nghĩ trong bản trình bày atomic<> weapons của anh ấy. Về cơ bản đó là tất cả về nơi mà các hàng rào bộ nhớ là cần thiết trong trường hợp sử dụng shared_ptr, không phải bất kỳ tài sản nội tại của gia số nguyên tử so với decrements.

Lý do là bạn không thực sự quan tâm đến thứ tự chính xác của số gia bằng con trỏ thông minh được tính ref miễn là bạn không bỏ lỡ bất kỳ điều gì, nhưng với việc giảm, điều quan trọng là bạn phải có rào cản bộ nhớ để trên mức giảm cuối cùng của bạn mà kích hoạt xóa bạn không có bất kỳ khả năng truy cập bộ nhớ trước đó từ một chủ đề khác đến đối tượng thuộc sở hữu của con trỏ thông minh được sắp xếp lại sau khi bộ nhớ được giải phóng.

+0

Bài nói chuyện của Herb là siêu duper! Cảm ơn! +1 – towi

+0

Tuy nhiên, "miễn là bạn không bỏ lỡ bất kỳ" là phần quan trọng. Điều đó, và sự bảo đảm xảy ra trước đó đối với sự sụt giảm (nhưng điều đó được xử lý bởi sự suy giảm nguyên tử). Anh ấy nói rõ ràng "tăng bình thường", _will_ bỏ lỡ một số gia tăng trong một tình huống đồng thời. Có lẽ anh ta phải nói điều gì đó khác, nhưng đó là những gì anh ta nói. – Damon

8

Vấn đề Sutter đang nói đến là việc tăng số lượng tham chiếu không yêu cầu bất kỳ hành động theo dõi nào cho tính chính xác. Bạn đang tính số tham chiếu khác 0 cho một số không khác, do đó không cần thực hiện thêm hành động nào. Tuy nhiên, sự sụt giảm đòi hỏi phải có hành động tiếp theo cho tính chính xác. Giá trị giảm có số tham chiếu khác 0 hoặc số không tham chiếu khác hoặc không, và nếu số lượng tham chiếu của bạn giảm về 0, bạn cần thực hiện một hành động --- cụ thể, xử lý đối tượng được tham chiếu.Hoạt động giảm và hành động này đòi hỏi tính nhất quán cao hơn, cả ở cấp độ hàng rào (do đó thỏa thuận không được sắp xếp lại với một số đọc/ghi khác trên lõi khác mà logic của bộ nhớ/bộ nhớ cache của CPU được sắp xếp lại) và tại trình biên dịch cấp (do đó trình biên dịch không sắp xếp lại các hoạt động xung quanh sự sụt giảm mà có thể gây ra lần đọc/ghi để được sắp xếp lại xung quanh tiềm năng deallocation). Vì vậy, đối với kịch bản được mô tả của Sutter, sự khác biệt về chi phí giữa tăng và giảm không nằm trong các hoạt động cơ bản, đó là các ràng buộc nhất quán áp dụng cho việc giảm thực tế (cụ thể, hành động trên bản thân giảm) không áp dụng cho số gia tăng.

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