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ử a
thì 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ình là cuộ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.
Là 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.)