2012-06-13 18 views
9

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?

+0

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) –

+0

@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. –

+0

@ 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ử?" –

Trả lời

5

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).

3

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).

+2

"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. –

+1

@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. –

+0

@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

14

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.

+0

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? –

+0

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). –

+0

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) –

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