2010-07-14 60 views
9

Trên các CPU như x86, cung cấp khả năng kết nối bộ nhớ cache, điều này hữu ích như thế nào từ quan điểm thực tế? Tôi hiểu rằng ý tưởng là để thực hiện cập nhật bộ nhớ được thực hiện trên một lõi ngay lập tức có thể nhìn thấy trên tất cả các lõi khác. Đây là một tài sản hữu ích. Tuy nhiên, người ta không thể dựa quá nhiều vào nó nếu không viết bằng ngôn ngữ lắp ráp, bởi vì trình biên dịch có thể lưu trữ các phép gán biến trong sổ đăng ký và không bao giờ ghi chúng vào bộ nhớ. Điều này có nghĩa rằng người ta vẫn phải thực hiện các bước rõ ràng để đảm bảo rằng các công cụ được thực hiện trong các chủ đề khác được hiển thị trong chuỗi hiện tại. Vì vậy, từ quan điểm thực tế, những gì đã kết hợp bộ nhớ cache đạt được?Điểm kết hợp bộ nhớ cache là gì?

Trả lời

6

Hãy tưởng tượng bạn làm điều này:

lock(); //some synchronization primitive e.g. a semaphore/mutex 
globalint = somevalue; 
unlock(); 

Nếu không có sự gắn kết bộ nhớ cache, mà cuối cùng unlock() sẽ phải đảm bảo rằng globalint hiện nay có thể nhìn thấy ở khắp mọi nơi, với coherance bộ nhớ cache tất cả các bạn cần làm là để viết nó để bộ nhớ và để phần cứng làm phép thuật. Một giải pháp phần mềm có thể giữ được bộ nhớ tồn tại trong đó bộ nhớ cache, trên lõi nào, và bằng cách nào đó đảm bảo chúng được đồng bộ nguyên tử. Bạn sẽ giành được một giải thưởng nếu bạn có thể tìm thấy giải pháp phần mềm theo dõi tất cả các phần bộ nhớ tồn tại trong bộ nhớ cần đồng bộ hóa, hiệu quả hơn so với giải pháp phần cứng hiện tại.

1

Kết nối bộ nhớ cache trở nên cực kỳ quan trọng khi bạn đang xử lý nhiều luồng và truy cập cùng một biến từ nhiều luồng. Trong trường hợp cụ thể đó, bạn để đảm bảo rằng tất cả các bộ xử lý/lõi đều thấy cùng một giá trị nếu chúng truy cập biến cùng một lúc, nếu không bạn sẽ có hành vi không xác định tuyệt vời.

9

Câu chuyện ngắn là, hệ thống không kết hợp bộ nhớ cache đặc biệt khó khăn để lập trình đặc biệt nếu bạn muốn duy trì hiệu quả - đó cũng là lý do chính cho dù hầu hết các hệ thống NUMA hiện nay đều là bộ nhớ cache.

Nếu bộ đệm không tuân thủ, "các bước rõ ràng" sẽ phải thực thi các bước rõ ràng - kết nối thường là những thứ như các phần quan trọng/mutexes (ví dụ: biến động trong C/C++ là đủ hiếm). Nó khá khó khăn, nếu không phải là không thể cho các dịch vụ như mutexes để theo dõi chỉ có bộ nhớ có thay đổi và cần phải được cập nhật trong tất cả các bộ nhớ cache -it có lẽ sẽ phải cập nhật tất cả bộ nhớ, và đó là nếu nó thậm chí có thể theo dõi mà lõi có những phần của bộ nhớ đó trong bộ nhớ cache của họ.

Giả định phần cứng có thể thực hiện công việc tốt hơn và hiệu quả hơn khi theo dõi địa chỉ/dải bộ nhớ đã được thay đổi và giữ chúng đồng bộ.

Và, hãy tưởng tượng một quá trình chạy trên lõi 1 và được ưu tiên. Khi nó được lên kế hoạch một lần nữa, nó đã được lên lịch trên lõi 2.

Điều này sẽ khá nghiêm trọng nếu bộ nhớ cache không được chọn lọc nếu không có thể có phần còn lại của dữ liệu quá trình trong bộ đệm của lõi 1, không tồn tại trong bộ nhớ cache của lõi 2. Mặc dù, đối với các hệ thống hoạt động theo cách đó, hệ điều hành sẽ phải thực thi sự kết hợp bộ nhớ cache khi các luồng được lên lịch - có thể là "cập nhật tất cả bộ nhớ trong bộ nhớ cache giữa tất cả các lõi" hoặc có thể theo dõi các trang bẩn với trợ giúp của MMU và chỉ đồng bộ hóa các trang bộ nhớ đã được thay đổi - một lần nữa, phần cứng có khả năng giữ cho bộ nhớ cache mạch lạc theo một cách tốt hơn và hiệu quả hơn.

+0

Quá trình di chuyển giữa các lõi không phải là quá thường xuyên, do đó chi phí xóa bộ đệm ghi cho bất kỳ lõi nào mất quá trình hoặc xóa bộ đệm đọc cho bất kỳ lõi nào có được, thực sự không nên quá nhiều vấn đề. Một vấn đề lớn hơn là nếu quá trình # 1 đang chạy trên lõi A và B, trong khi tiến trình # 2 đang chạy trên C và D, lõi C và D không cần đầu tư bất kỳ tài nguyên nào đang xem truy cập bộ nhớ thay mặt cho quá trình # 1 bởi lõi A và B, vì những vùng nhớ này thực sự không nên quan tâm. Truy cập – supercat

0

Không cần thiết để khóa. Mã khóa sẽ bao gồm xóa bộ nhớ cache nếu cần. Nó chủ yếu là cần thiết để đảm bảo rằng các bản cập nhật đồng thời bởi các bộ xử lý khác nhau cho các biến khác nhau trong cùng một dòng bộ nhớ cache không bị mất.

6

Có một số sắc thái không được đề cập trong các phản hồi tuyệt vời từ các tác giả khác.

Trước hết, hãy xem xét rằng CPU không xử lý byte bộ nhớ theo byte, nhưng với các dòng bộ nhớ cache. Một dòng có thể có 64 byte. Bây giờ, nếu tôi phân bổ một mảnh bộ nhớ 2 byte tại vị trí P và một CPU khác phân bổ một bộ nhớ 8 byte tại vị trí P + 8 và cả P ​​và P + 8 đều sống trên cùng một dòng bộ nhớ cache, hãy quan sát mà không có sự kết hợp bộ nhớ cache hai CPU không thể đồng thời cập nhật P và P + 8 mà không cần phải thay đổi mỗi lần những thay đổi khác! Bởi vì mỗi CPU không đọc-sửa đổi-ghi trên dòng bộ nhớ cache, họ có thể cả hai viết ra một bản sao của dòng mà không bao gồm những thay đổi của CPU khác! Người viết cuối cùng sẽ thắng, và một trong những sửa đổi của bạn trong bộ nhớ sẽ "biến mất"!

Điều khác cần ghi nhớ là sự khác biệt giữa tính nhất quán và nhất quán. Bởi vì ngay cả các CPU có nguồn gốc x86 sử dụng bộ đệm lưu trữ, không có sự bảo đảm nào bạn có thể mong đợi rằng các lệnh đã hoàn thành có bộ nhớ đã sửa đổi theo cách mà các CPU khác có thể thấy những sửa đổi đó, ngay cả khi trình biên dịch đã quyết định viết lại giá trị vào bộ nhớ (có thể vì volatile?). Thay vào đó các mod có thể được đặt xung quanh trong bộ đệm cửa hàng. Khá nhiều tất cả các CPU sử dụng chung đều là cache, nhưng rất ít CPU có một mô hình nhất quán như được giả định là của x86. Hãy xem, ví dụ: http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html để biết thêm thông tin về chủ đề này.

Hy vọng điều này sẽ giúp, và BTW, tôi làm việc tại Corensic, một công ty đang xây dựng một trình gỡ rối đồng thời mà bạn có thể muốn kiểm tra. Nó giúp nhận các mảnh khi các giả định về tính đồng thời, sự mạch lạc và tính nhất quán chứng minh không có cơ sở :)

+1

bị cấm vào liên kết. Lỗi 403. ( – Ayrat

0

Tính nhất quán của bộ nhớ cache được thực hiện trong phần cứng bởi vì người lập trình không phải lo lắng tất cả các chủ đề đều thấy giá trị mới nhất của bộ nhớ vị trí trong khi hoạt động trong môi trường đa lõi/đa xử lý. Cache coherence cho một trừu tượng rằng tất cả các lõi/bộ vi xử lý đang hoạt động trên một bộ nhớ cache thống nhất duy nhất, mặc dù mỗi lõi/bộ xử lý có bộ nhớ cache riêng của nó.

Nó cũng đảm bảo mã đa luồng cũ hoạt động như trên các mô hình bộ vi xử lý mới/hệ thống đa bộ xử lý, mà không thực hiện bất kỳ thay đổi mã nào để đảm bảo tính nhất quán của dữ liệu.

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