Tại sao một chương trình chỉ có nguyên tử trong SC-DRF mà không phải là HRF-direct?


7

Trong bài báo "Các mô hình bộ nhớ không đồng nhất chủng tộc" [1], các tác giả nói rằng một chương trình chỉ bao gồm nguyên tử là không có chủng tộc trong SC-DRF nhưng nó không trực tiếp trong HRF. Tôi không thể hiểu tại sao điều này là. Bất cứ ai có thể giải thích làm thế nào điều này có thể xảy ra?

[1] Derek R. Hower et al. , "Mô hình bộ nhớ không đồng nhất chủng tộc". Trong Kỷ yếu của ASPLOS '14 , ACM, 2014. ( PDF )

Câu trả lời:


12

Hy vọng rằng họ đã không nói một cách rõ ràng nói chính xác "một chương trình chỉ bao gồm các nguyên tử là không có chủng tộc trong SC-DRF." Điều đó không chính xác.

Họ nói rằng "[in] đồng bộ hóa phạm vi ... có thể viết một chương trình chủng tộc được cấu tạo hoàn toàn bằng nguyên tử nếu những nguyên tử đó không sử dụng phạm vi chính xác", [đầu trang 2], hơi khác một chút (và Sử dụng từ "chủng tộc" một cách mơ hồ, có lẽ khiến bạn tin rằng chúng có nghĩa là tuyên bố không chính xác.) Có lẽ họ nên nói rằng trong đồng bộ hóa có thể viết một chương trình không nhất quán liên tục bao gồm nguyên tử nếu các nguyên tử đó không sử dụng phạm vi chính xác.

SC-DRF (đại khái: ngữ nghĩa bộ nhớ cho C ++ và Java) chia các vị trí bộ nhớ thành hai lớp, các đối tượng đồng bộ hóa , (đôi khi được gọi atomics) và các đối tượng dữ liệu . Đối với hầu hết các phần, tất cả các hoạt động trên các đối tượng đồng bộ hóa đều được đảm bảo nhất quán liên tục . [1] ( Không chạy đua miễn phí.) Đây là một ràng buộc đối với trình biên dịch, không phải lập trình viên. Nó nói rằng nếu lập trình viên nói rằng một luồng viết đối tượng nguyên tử athì viết đối tượng nguyên tử b, tất cảcác chủ đề sẽ thấy ghi xảy ra theo thứ tự này. (Trình biên dịch không được phép sắp xếp lại các truy cập và được yêu cầu chèn các hàng rào bộ nhớ và hàng rào thích hợp trên các máy không nhất quán liên tục.)

Tuần tự nhất quán có nghĩa là tất cả các luồng trên tất cả các bộ xử lý đồng ý về tổng thứ tự của tất cả các hoạt động bộ nhớ. Nếu một luồng nghĩ rằng hoạt động xảy ra trước khi hoạt động , thì tất cả các luồng nghĩ rằng hoạt động đã xảy ra trước khi hoạt động . Tuần tự nhất quán không có nghĩa là không chủng tộc và nó không có nghĩa là xác định . Ví dụ, hai luồng khác nhau có thể cố gắng viết cùng một biến đồng bộ hóa gần như cùng một lúc. Những truy cập này sẽ được đua. Một hệ thống nhất quán tuần tự sẽ chỉ đảm bảo rằng nếu một luồng cho rằng việc viết xảy ra trước khi viếtx yx yxy , tất cả các chủ đề sẽ đồng ý rằng viết xảy ra trước khi viết . Tính nhất quán tuần tự rất hữu ích vì bạn có thể sử dụng nó để xây dựng và suy luận về các đối tượng đồng bộ hóa không xác định hữu ích như mutexes và biến điều kiện.xy

SC-DRF sau đó nói rằng nếu chương trình của bạn là dữ liệu cuộc đua miễn phí, các hoạt động trên dữ liệu đối tượng sẽ xuất hiện để được tuần tự phù hợp . Trình biên dịch được phép sắp xếp lại (hoặc thậm chí đôi khi loại bỏ) các hoạt động trên các đối tượng dữ liệu và nếu máy bên dưới không nhất quán theo trình tự, trình biên dịch không bắt buộc phải chèn các rào cản hoặc hàng rào bộ nhớ. Nhưng trình biên dịch không được phép sắp xếp lại các hoạt động trên các đối tượng dữ liệu đối với các hoạt động trên các đối tượng đồng bộ hóa.

Cuộc đua dữ liệu miễn phí không giống như cuộc đua miễn phí . Và liên tục nhất quán không giống như cuộc đua miễn phí . Lịch biểu thực hiện chương trình cụ thể là cuộc đua dữ liệu miễn phí nếu đối với bất kỳ cặp đối tượng dữ liệu nào truy cập, và , bởi hai luồng khác nhau (ít nhất một trong số đó là thao tác ghi), chúng ta có thể sử dụng thứ tự (nhất quán liên tục) của truy cập đối tượng nguyên tử để chứng minh rằng xảy ra trước khi hoặc xảy ra trước . Nếu chúng ta không thể làm bằng chứng thì lịch thực hiện đó là dữ liệu .xyx yy x

Một chương trìnhcuộc đua dữ liệu miễn phí nếu tất cả các lịch trình thực hiện có thể là cuộc đua dữ liệu miễn phí. Một chương trình là dữ liệu chủng tộc nếu có một lịch trình thực hiện đó là dữ liệu đua.

cuộc đua dữ liệu miễn phí là một cản trở đối với các lập trình viên, không phải là trình biên dịch. Nó nói rằng nếu chương trình của bạn là dữ liệu đua, thì chương trình của bạn không có ngữ nghĩa. Trình biên dịch được phép làm bất cứ điều gì nó muốn, bao gồm tạm dừng chương trình, đi vào một vòng lặp vô hạn hoặc làm nổ tung máy tính.

Trời ơi. TL; DR! Tôi thậm chí chưa đề cập đến SC-for-HRC!

Trong SC-for-HRC, các nguyên tử cần xác định phạm vi của chúng. Các truy cập nguyên tử được đảm bảo (bởi trình biên dịch) chỉ nhất quán liên tục trong phạm vi riêng của chúng. Tất cả các luồng trong phạm vi sẽ đồng ý về thứ tự xảy ra truy cập nguyên tử, nhưng các luồng trong một phạm vi khác có thể không đồng ý (và thậm chí có thể không nhìn thấy các truy cập đó, chứ đừng nói đến thứ tự của chúng.)

Ví dụ, có thể là trường hợp tất cả các luồng GPU đồng ý rằng luồng 19 thu được mutex A sau đó thu được mutex B, nhưng tất cả các luồng CPU không đồng ý (hoặc biết) rằng luồng 19 có được mutex A hoặc mutex B cả. SC-DRF không có "phạm vi" nên không gặp phải vấn đề này.

[1] Các ngoại lệ đối với các nguyên tử nhất quán tuần tự phải được thực hiện với việc sử dụng rõ ràng std::memory_order_relaxed. Vì vậy, đừng làm điều đó. (Và tôi sẽ bỏ qua các ngoại lệ trong phần còn lại của những gì tôi đang nói.)


Cảm ơn bạn đã giải thích ngắn gọn của SC. Đây là cuốn sách hay nhất tôi từng đọc cho đến nay. Tôi không muốn nó kết thúc :) Bạn có thể vui lòng giải thích "cuộc đua miễn phí" là gì không, như bạn nói nó khác với cuộc đua dữ liệu miễn phí và SC?
sanatana

"Race free" có nghĩa là cả dữ liệu và đồng bộ hóa của bạn đều "không có chủng tộc", điều đó có nghĩa là đồng bộ hóa của bạn phải mang tính quyết định. ("Cuộc đua" là một trật tự được xác định (giải quyết) bởi một quy trình không xác định.) Có các hệ thống đồng bộ hóa xác định (ví dụ: nhóm.csail.mit.edu / commit / con / 09 / asplos073-olszewski.pdf ) nhưng chúng không bình thường, và đây không phải là một.
Logic lang thang

Cá nhân, tôi muốn không ai sử dụng thuật ngữ "chủng tộc" hoặc "không có chủng tộc" đối với các hoạt động đồng bộ hóa. Tôi muốn rằng họ đã sử dụng "không xác định" và "xác định" cho việc giải quyết ai có được một mutex. Và do đó, tôi thích từ "chủng tộc" luôn được đặt trước từ "dữ liệu".
Logic lang thang

Bạn nói " trình biên dịch không được phép sắp xếp lại các hoạt động trên các đối tượng dữ liệu đối với các hoạt động trên các đối tượng đồng bộ hóa. " - Trình biên dịch (C ++) (và CPU) có được phép sắp xếp lại theo các đặc điểm thu nhận / giải phóng ngầm của các hoạt động SeqCst không? (nghĩa là sắp xếp lại các hoạt động trên các đối tượng dữ liệu một chiều với các cửa hàng SeqCst và sắp xếp lại chúng theo hướng ngược lại với tải SeqCst)
LWimsey

@LWimsey Vâng, tôi nghĩ bạn đã đúng. Câu trả lời của tôi đã quá dài, vì vậy tôi không chính xác trong việc tiếp thu / phát hành.
Logic lang thang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.