CPU (bộ điều khiển bộ nhớ cụ thể) có thể tận dụng thực tế là bộ nhớ không bị đột biến
Ưu điểm là, thực tế này tiết kiệm trình biên dịch từ việc sử dụng các hướng dẫn membar khi dữ liệu được truy cập.
Rào chắn bộ nhớ, còn được gọi là thanh ghi nhớ, hàng rào bộ nhớ hoặc lệnh hàng rào, là một loại lệnh rào cản khiến bộ xử lý trung tâm (CPU) hoặc trình biên dịch thực thi một ràng buộc đặt hàng đối với các hoạt động bộ nhớ được ban hành trước và sau lệnh rào cản. Điều này thường có nghĩa là các hoạt động nhất định được đảm bảo được thực hiện trước hàng rào và các hoạt động khác sau.
Rào cản bộ nhớ là cần thiết bởi vì hầu hết các CPU hiện đại sử dụng tối ưu hóa hiệu suất có thể dẫn đến thực hiện không theo thứ tự. Việc sắp xếp lại các hoạt động bộ nhớ (tải và lưu trữ) thường không được chú ý trong một luồng thực thi, nhưng có thể gây ra hành vi không thể đoán trước trong các chương trình và trình điều khiển thiết bị đồng thời trừ khi được kiểm soát cẩn thận ...
Bạn thấy, khi dữ liệu được truy cập từ các luồng khác nhau, tại CPU đa lõi, nó sẽ diễn ra như sau: các luồng khác nhau chạy ở các lõi khác nhau, mỗi luồng sử dụng bộ đệm riêng (cục bộ đến lõi của chúng) - một bản sao của một số bộ đệm chung.
Nếu dữ liệu có thể thay đổi và lập trình viên cần dữ liệu thống nhất giữa các luồng khác nhau, các biện pháp cần được thực hiện để đảm bảo tính nhất quán. Đối với lập trình viên, điều này có nghĩa là sử dụng các cấu trúc đồng bộ hóa khi họ truy cập (ví dụ đọc) dữ liệu trong luồng cụ thể.
Đối với trình biên dịch, đồng bộ hóa cấu trúc trong các phương tiện mã nó cần để chèn một hướng dẫn membar để đảm bảo rằng những thay đổi thực hiện cho các bản sao dữ liệu tại một trong các lõi được truyền đúng cách ( "xuất bản"), để đảm bảo rằng cache tại lõi khác có cùng bản sao (cập nhật).
Phần nào đơn giản hóa xem ghi chú bên dưới , đây là những gì xảy ra ở bộ xử lý đa lõi cho membar:
- Tất cả các lõi dừng xử lý - để tránh việc vô tình ghi vào bộ đệm.
- Tất cả các bản cập nhật được thực hiện cho bộ nhớ cache cục bộ được ghi lại thành toàn cục - để đảm bảo rằng bộ đệm chung chứa dữ liệu gần đây nhất. Điều này cần một chút thời gian.
- Dữ liệu cập nhật được ghi lại từ bộ đệm chung cho bộ nhớ cache cục bộ - để đảm bảo rằng bộ nhớ cache cục bộ chứa dữ liệu gần đây nhất. Điều này cần một chút thời gian.
- Tất cả các lõi tiếp tục thực hiện.
Bạn thấy đấy, tất cả các lõi đều không làm gì trong khi dữ liệu được sao chép qua lại giữa bộ nhớ cache toàn cục và cục bộ . Điều này là cần thiết để đảm bảo rằng dữ liệu có thể thay đổi được đồng bộ hóa đúng cách (luồng an toàn). Nếu có 4 lõi, cả 4 dừng lại và chờ trong khi bộ nhớ cache đang được đồng bộ hóa. Nếu có 8, tất cả 8 dừng lại. Nếu có 16 ... thì bạn đã có 15 lõi không làm gì cả trong khi chờ đợi những thứ cần thiết để làm một trong những điều này.
Bây giờ, hãy xem điều gì xảy ra khi dữ liệu là bất biến? Bất kể chủ đề nào truy cập nó, nó được đảm bảo là như nhau. Đối với lập trình viên, điều này có nghĩa là không cần chèn các cấu trúc đồng bộ hóa khi họ truy cập (đọc) dữ liệu trong luồng cụ thể.
Đối với trình biên dịch, điều này có nghĩa là không cần phải chèn một lệnh ghi nhớ .
Do đó, việc truy cập dữ liệu không cần phải dừng lõi và chờ trong khi dữ liệu được ghi lại giữa các bộ đệm toàn cục và cục bộ. Đó là một lợi thế của thực tế là bộ nhớ không bị đột biến .
Lưu ý phần nào giải thích đơn giản hóa ở trên làm giảm một số tác động tiêu cực phức tạp hơn của dữ liệu có thể thay đổi, ví dụ như trên đường ống . Để đảm bảo yêu cầu đặt hàng, CPU phải vô hiệu hóa các phi công bị ảnh hưởng bởi thay đổi dữ liệu - đó là một hình phạt hiệu suất khác. Nếu điều này được thực hiện bằng cách đơn giản (và do đó đáng tin cậy :) vô hiệu hóa tất cả các đường ống, thì hiệu ứng tiêu cực được khuếch đại hơn nữa.