Và tốc độ nhanh hơn/chậm hơn so với một biến nguyên tử không được kích hoạt (chẳng hạn như hoạt động nguyên tử <> của C++). Ngoài ra, các biến nguyên tử gây tranh cãi có liên quan đến khóa không được kích hoạt chậm hơn bao nhiêu? Kiến trúc tôi đang làm là x86-64.Nhanh như thế nào là một khóa không được kiểm soát?
Trả lời
Có một số project on GitHub với mục đích đo lường điều này trên các nền tảng khác nhau. Thật không may, sau khi luận án thạc sĩ của tôi tôi không bao giờ thực sự có thời gian để theo dõi về điều này, nhưng ít nhất là mã thô sơ là có.
Nó đo lường pthreads và khóa OpenMP, so với __sync_fetch_and_add
nội tại.
Từ những gì tôi nhớ, chúng tôi đang mong đợi một sự khác biệt khá lớn giữa khóa và hoạt động nguyên tử (~ thứ tự độ lớn) nhưng sự khác biệt thực sự hóa ra là rất nhỏ. Tuy nhiên, bây giờ, đo trên hệ thống của tôi mang lại kết quả phản ánh dự đoán ban đầu của tôi, cụ thể là (bất kể pthreads hoặc OpenMP được sử dụng) hoạt động nguyên tử nhanh hơn khoảng năm lần, và một hoạt động tăng khóa duy nhất mất khoảng 35ns (điều này bao gồm lấy khóa, thực hiện gia số và giải phóng khóa).
tùy thuộc vào việc triển khai khóa, cũng phụ thuộc vào hệ thống. Biến nguyên tử không thể thực sự được tranh cãi theo cách giống như khóa (ngay cả khi bạn đang sử dụng acquire-release semantics), đó là toàn bộ điểm nguyên tử, nó khóa bus để truyền bá cửa hàng (tùy thuộc vào chế độ rào cản bộ nhớ) , nhưng đó là một chi tiết thực hiện. Tuy nhiên, hầu hết các khóa chế độ người dùng chỉ được bao bọc bằng nguyên tử, xem this bài viết của Intel cho một số số liệu về hiệu suất cao, ổ khóa có thể mở rộng bằng cách sử dụng các op nguyên tử dưới x86 và x64 (so với ổ khóa CriticalSection
của Windows). được tìm thấy cho các khóa SWR, nhưng một trong những nên luôn luôn hồ sơ cho những người thân của hệ thống/môi trường).
"Biến nguyên tử không thể thực sự được tranh cãi theo cùng một cách như là một khóa "- nếu hai luồng (trên các lõi khác nhau) búa cùng một biến nguyên tử, thì đó là sự phản đối nó, chắc chắn? Đó là sau đó lên đến kiến trúc/thực hiện có hay không thực sự cuộc thi thực sự chậm lại. Bạn có lẽ có thể so sánh nó với hai luồng trên các lõi khác nhau tạo ra cùng một biến phi nguyên tử, để có được cảm giác về việc đồng bộ nguyên tử có theo nghĩa nào đó không. –
@SteveJessop, chắc chắn rồi. Hai lõi sử dụng cùng một biến sẽ gây ra sự đồng bộ hóa quá mức của biến đó. Bạn đang bị ràng buộc vào thời điểm này bởi độ trễ/băng thông của bus cache. –
@SteveJessop: bạn có thể gọi nó, nhưng, IMO, nó được thực hiện theo một cách khác nhau tất cả cùng nhau, do đó bạn không thể thực sự đặt nó trong cùng một thể loại như quay-chờ-thử lại trên một khóa đã mua. – Necrolis
Tôi tình cờ có rất nhiều bài kiểm tra tốc độ thấp nằm xung quanh. Tuy nhiên, những gì chính xác tốc độ có nghĩa là rất không chắc chắn bởi vì nó phụ thuộc rất nhiều vào những gì chính xác bạn đang làm (thậm chí không liên quan từ hoạt động chính nó).
Dưới đây là một số con số từ AMD 64-bit Phenom II X6 3.2Ghz. Tôi cũng chạy trên chip Intel và thời gian làm thay đổi rất nhiều (một lần nữa, tùy thuộc vào chính xác những gì đang được thực hiện).
Một GCC __sync_fetch_and_add
, là một bổ sung nguyên tử có rào chắn, có trung bình 16ns, với thời gian tối thiểu là 4ns. Thời gian tối thiểu có lẽ là gần gũi hơn với sự thật (mặc dù ngay cả ở đó tôi có một chút chi phí).
Một mutex pthread không mong muốn (thông qua tăng) là 14ns (cũng là mức tối thiểu). Lưu ý đây cũng là một chút quá thấp, vì thời gian thực sự sẽ tăng nếu một cái gì đó khác đã bị khóa mutex nhưng nó không phải là uncontested bây giờ (vì nó sẽ gây ra một bộ nhớ cache đồng bộ).
Một try_lock không thành công là 9ns.
Tôi không có một nguyên tử thô nguyên gốc kể từ trên x86_64 đây chỉ là một hoạt động trao đổi bình thường. Có khả năng gần với thời gian tối thiểu có thể, vì vậy 1-2ns.
Gọi thông báo mà không có người bồi bàn trên biến điều kiện là 25ns (nếu có gì đó đang đợi khoảng 304ns).
Tuy nhiên, tất cả các khóa đều làm bảo đảm trật tự CPU nhất định, lượng bộ nhớ bạn đã sửa đổi (bất kỳ thứ gì phù hợp với bộ đệm cửa hàng) sẽ thay đổi thời gian thực hiện các thao tác này. Và rõ ràng nếu bạn đã từng tranh cãi về một mutex đó là thời gian tồi tệ nhất của bạn. Bất kỳ trở về hạt nhân Linux có thể được hàng trăm nano giây ngay cả khi không có chuyển đổi chủ đề thực sự xảy ra. Đây thường là nơi các khóa nguyên tử hoạt động tốt vì chúng không bao giờ liên quan đến bất kỳ cuộc gọi hạt nhân nào: hiệu suất trường hợp trung bình của bạn cũng là trường hợp xấu nhất của bạn. Mở khóa Mutex cũng phải chịu phí trên nếu có các luồng chờ đợi, trong khi một nguyên tử thì không.
LƯU Ý: Thực hiện các phép đo đó là đầy vấn đề, vì vậy kết quả luôn là vấn đề. Các thử nghiệm của tôi cố gắng giảm thiểu sự thay đổi bằng cách sửa tốc độ CPU, thiết lập ái lực CPU cho các luồng, không chạy các tiến trình khác, và lấy trung bình trên các tập kết quả lớn.
Cảm ơn các con số! Bạn đã thử nghiệm nền tảng nào? nói "pthread mutex" không nói nhiều, vì điều đó có nghĩa là phụ thuộc hoàn toàn vào việc thực hiện. Khi thời gian là gần với một nguyên tử thêm tôi giả sử nó là GNU/Linux, do đó, bằng cách sử dụng một futex? –
Có, trên linux. Uncontested có nghĩa là nó không chạm vào một cuộc gọi hệ thống, do đó, futex không thực sự tham gia vào trường hợp đó (không tranh cãi trong thư viện NPTL được giải quyết hoàn toàn trong không gian người dùng mà không có cuộc gọi hệ thống). –
Trong tâm trí của tôi "futex" _is_ số nguyên, do đó, nó có liên quan, nhưng tất cả những gì cần thiết là một sự gia tăng nguyên tử của "futex" (tức là số nguyên) –
- 1. Kiểm soát 'dường như' bị khóa
- 2. Kiểm soát phiên bản nhanh?
- 3. kiểm soát phiên bản hoạt động như thế nào?
- 4. kiểm soát phiên bản monodevelop hoạt động như thế nào?
- 5. cảnh báo: [kiểm soát] không được kiểm soát chuyển đổi
- 6. Sự chồng chéo bộ nhớ xảy ra như thế nào và nó được kiểm soát như thế nào?
- 7. Lịch sử kiểm soát phiên bản được lưu trữ và tính toán như thế nào?
- 8. Python: nhanh như thế nào?
- 9. Id kiểm soát GUI của Windows được tạo ra như thế nào?
- 10. Dropbox có phải là giải pháp kiểm soát nguồn nhanh và hợp lệ không?
- 11. Tốc độ nhanh như thế nào là Data.Array?
- 12. Công việc được khóa liên động như thế nào và tại sao nó lại nhanh hơn khóa?
- 13. Việc sử dụng chuỗi như là chìa khóa trong dict có luôn nhanh hơn không?
- 14. Làm thế nào để có được quyền kiểm soát của một đống 5GB trong Haskell?
- 15. Hệ thống kiểm soát sửa đổi khôi phục bản sửa đổi như thế nào?
- 16. Làm thế nào để kiểm soát JavaScript được chạy sau khi UpdatePanel một phần postback endRequest?
- 17. cuộc gọi không được kiểm soát để ArrayAdapter
- 18. Data.Sequence.Seq nhanh như thế nào so với []?
- 19. Grep chạy quá nhanh như thế nào?
- 20. Kiểm soát hành trình như PHPUnderControl và Hudson cho PHP
- 21. Làm thế nào để có được tất cả trẻ em của một kiểm soát cha mẹ?
- 22. Bộ lập lịch hệ điều hành lấy lại quyền kiểm soát CPU như thế nào?
- 23. WPF: Làm thế nào để vượt qua toàn bộ kiểm soát như CommandParameter thông qua XAML?
- 24. Sử dụng thư viện được kiểm soát nguồn trong các dự án được kiểm soát nguồn
- 25. Sự khác biệt giữa Kiểm soát luồng và Kiểm soát tắc nghẽn trong TCP là gì?
- 26. Làm thế nào nhanh là slice python
- 27. Kiểm soát .NET giống như Kiểm soát Văn bản Địa chỉ E-mail của Outlook
- 28. Làm thế nào để buộc tải một trang trong Twebbrowser kiểm soát khi điều này là không thể nhìn thấy
- 29. Kiểm tra nếu kiểm soát là Textbox trong TabControl
- 30. Google Chrome kiểm soát/chứa nhiều quy trình như thế nào?
bản sao có thể có của [Chi phí sử dụng khóa thay vì nội tại nguyên tử] (http://stackoverflow.com/questions/4296876/overhead-of-using-locks-instead-of-atomic-intrinsics) –
@KonradRudolph, I xem các câu hỏi tương tự nhưng không chính xác như nhau. Điều này tập trung hơn vào chi phí cơ bản của các hoạt động trong khi khác là chi phí đầu vào của hai phương pháp tiếp cận một thuật toán. Tôi thực sự sẽ trả lời chúng một cách hơi khác. –
@ edA-qamort-ora-y Là tác giả của câu hỏi khác, tôi có thể nói rằng chúng giống nhau. Câu hỏi khác có thể được * phrased * khác nhau (về mặt chi phí) nhưng những gì nó thực sự hỏi là "Nhanh hơn khóa là một hoạt động nguyên tử?" –