Có CPU nào thực hiện tối ưu hóa ghi bộ đệm L1 này không?


9

Khi CPU có bộ đệm L1 ghi, điều thường xảy ra là (giả sử rằng dòng bộ đệm mà nó đang ghi đã có trong bộ đệm L1) bộ đệm (ngoài việc cập nhật dữ liệu) đánh dấu dòng bộ đệm đó là bẩn và sẽ viết dòng ra với dữ liệu được cập nhật sau đó.

Một tối ưu hóa có thể là để bộ đệm so sánh nội dung ghi và nội dung trước đó của bộ đệm và nếu chúng giống nhau, đừng đánh dấu dòng là bẩn. Bởi vì điều này có thể cho phép bộ đệm tránh bị ghi ngược lại, tôi có thể thấy nhà sản xuất CPU có thể thấy điều này như thế nào xứng đáng với các cổng cần thiết để thực hiện logic này.

Câu hỏi của tôi: có CPU thực hiện tối ưu hóa này?

Bối cảnh về lý do tại sao tôi hỏi: Tôi đang viết một số mã cần có quyền truy cập bộ nhớ liên tục; nghĩa là, một người có khả năng lắng nghe hành vi của bộ đệm sẽ không thể suy ra những gì tôi đang làm. Một số quyền truy cập của tôi được ghi và theo cách rõ ràng để triển khai mã này, rất nhiều người viết sẽ viết cùng một dữ liệu đã có. Tôi cần thực hiện ghi vì tùy thuộc vào dữ liệu, dữ liệu tôi đang viết có thể giống hoặc không giống nhau và điều quan trọng là phải thực hiện cùng một hành động bất kể. Nếu CPU tối ưu hóa bằng cách không thực sự viết 'không thay đổi-ghi', điều đó có nghĩa là hành vi của bộ đệm sẽ thay đổi tùy thuộc vào những gì tôi đang làm, điều này sẽ lật đổ mục tiêu của tôi.

Vì vậy, có một CPU cố gắng tối ưu hóa ghi theo cách này?


11
Người ta nói rằng có hai vấn đề thực sự khó khăn trong khoa học máy tính: vô hiệu hóa bộ đệm, đặt tên cho mọi thứ tốt và các lỗi không liên quan. Đây là một ví dụ về lý do tại sao đầu tiên trong số này là khó khăn.
Mason Wheeler

@poncho bạn nói rằng "ai đó có thể lắng nghe hành vi của bộ đệm sẽ không thể suy luận được những gì tôi đang làm." Bây giờ nếu một số CPU triển khai tính năng "ghi lại thông minh" này không làm mất hiệu lực bộ đệm trừ khi dữ liệu thực sự được cập nhật, thì bằng cách đi xa hơn một cấp so với CPU trong hệ thống phân cấp bộ nhớ, người ta sẽ có thể quan sát lưu lượng / thời gian sự khác biệt giữa viết thật và viết giả. Đây có phải là những gì bạn quan tâm?
TheCodeArtist

@poncho Ngoài ra, câu hỏi thực sự của bạn dường như là về việc thực hiện chế độ bảo mật / đặc quyền tốt hơn mà không rò rỉ thông tin sử dụng. Có lẽ bạn nên hỏi điều đó? ...
TheCodeArtist

1
@TheCodeArtist: tốt, đã có các cuộc tấn công sidechannel được mã hóa xuất bản trong đó một chương trình mã hóa có thể bị tấn công bởi một chương trình khác chạy trên lõi khác của cùng CPU, bằng cách chương trình tấn công giám sát bộ đệm được chia sẻ. Tôi tin rằng một chương trình như vậy có khả năng phát hiện xem các dòng bộ đệm L1 có bị xóa hay không và do đó có thể suy ra thông tin về chương trình mà tôi quan tâm, nếu CPU thực hiện tối ưu hóa khi thảo luận. Tôi không nói về 'chế độ bảo mật', vì tôi không giả sử khả năng sửa đổi CPU hoặc HĐH.
poncho

4
Ngay cả khi điều này là đúng ngày hôm nay, nó không được đảm bảo là đúng vào ngày mai.
pjc50

Câu trả lời:


4

Từ nhiều giờ tìm kiếm, tôi không thể tìm thấy CPU sử dụng tối ưu hóa cụ thể này. Hầu hết các tối ưu hóa được đề cập thường liên quan đến hit / miss với các hoạt động đọc / ghi và truy cập dữ liệu:

(trang 7 và) https://cseweb.ucsd.edu/groupes/fa14/cse240A-a/pdf/08/CSE240A-MBT-L15-Cache.ppt.pdf

Tuy nhiên, điều đó không có nghĩa là tối ưu hóa này không thể được thực hiện. Nói chung, có thể lập trình truy cập kích thước của dòng bộ đệm CPU. Cũng có thể truy cập các giá trị hiện tại trong các thanh ghi bộ đệm - nhưng hơi nguy hiểm khi làm như vậy. Nếu bạn truy cập vào các thanh ghi sai vào thời điểm xấu, bạn có thể bị giả mạo với những thanh ghi liên quan đến một chương trình đang chạy. Hoặc bạn có thể vô tình sửa đổi nội dung của các dòng bạn đang cố đọc.

Lấy giá trị hiện tại trong bộ đệm của người đăng ký

Hơn nữa, tất cả các giải pháp lý thuyết đòi hỏi một số hình thức thực hiện phần mềm (trình biên dịch). Gần nhất tôi tìm thấy liên quan đến kiến ​​trúc ARM, dường như cho phép thao tác bộ đệm. Ngoài ra, bạn cũng cần biết kích thước của một dòng bộ đệm cho CPU mong muốn của bạn. Bạn có thể đọc kỹ nội dung bộ đệm đến một vị trí thứ cấp trong bộ nhớ, theo gia số có kích thước dòng và so sánh nó với dữ liệu sắp được ghi vào các thanh ghi (hoặc dòng bộ đệm L1, trong trường hợp này).

Đọc nội dung bộ đệm CPU

Từ đó, bạn có thể nghĩ ra một hệ thống dựa trên phần mềm ngăn chặn việc viết lại giống hệt nhau. Mặc dù điều này được đơn giản hóa một chút, nhưng nó là như vậy bởi vì giải pháp phải được áp dụng cho bất kỳ CPU nào tồn tại.

Một khả năng khác mà tôi thấy có liên quan đến sự kết hợp Cache:

Đoạn văn có liên quan từ một bài viết trên Wikipedia về sự gắn kết của acche

Điểm chính thu hút sự chú ý của tôi, liên quan đến vấn đề này, là mô tả Snarfing:

Đây là một cơ chế trong đó bộ điều khiển bộ đệm theo dõi cả địa chỉ và dữ liệu trong nỗ lực cập nhật bản sao vị trí bộ nhớ của chính nó khi chủ thứ hai sửa đổi vị trí trong bộ nhớ chính. Khi một hoạt động ghi được quan sát đến một vị trí mà bộ đệm có một bản sao, bộ điều khiển bộ đệm sẽ cập nhật bản sao của vị trí bộ nhớ bị đánh cắp với dữ liệu mới.

Nói cách khác, có thể có các cơ chế đã được đưa ra. Chỉ là chúng có thể không được sử dụng để tối ưu hóa mà bạn đã đề xuất. Bạn sẽ phải thực hiện phần mềm thực hiện so sánh đọc / ghi.


Cũng có thể truy cập các giá trị hiện tại trong các thanh ghi bộ đệm - nhưng hơi nguy hiểm khi làm như vậy. Huh, điều này không có ý nghĩa. Bạn có nghĩa là đăng ký CPU? Trình biên dịch mã asm được tạo hoặc viết bằng tay sử dụng các thanh ghi để giữ các giá trị mà nó hoạt động trên ...
Peter Cordes

Nếu bạn đang cố gắng thực hiện điều này trong phần mềm, bạn sẽ có trình biên dịch tạo mã if (mem != x) { mem = x; }thay thế mem = x;. Điều này đôi khi chỉ là tối ưu hóa cho các dòng bộ đệm được chia sẻ trong một chương trình đa luồng, bởi vì việc viết gây cản trở việc đọc các luồng khác.
Peter Cordes

1
"đánh hơi" không có gì để làm với điều này. Nó chỉ là rình mò thụ động. Bộ nhớ CPU sử dụng MESI để chúng có bộ đệm ghi lại mạch lạc.
Peter Cordes

@PeterCordes Nếu bạn thấy câu trả lời của tôi khó chịu, tôi xin lỗi. Tuy nhiên, có vẻ như bạn có cái nhìn sâu sắc hơn tôi về vấn đề này. Vì vậy, tại sao không tự trả lời câu hỏi? Phản hồi của tôi rõ ràng là không thỏa đáng theo tiêu chuẩn của bạn ...


3

Ghi vào bộ đệm L1 là một hoạt động rất quan trọng.

Viết dữ liệu chính xác trở lại dường như là khá hiếm. Một tối ưu hóa giúp tăng tốc mọi thứ trong trường hợp cụ thể này sẽ không thu được nhiều tốc độ.

Mặt khác, việc tối ưu hóa này yêu cầu so sánh dữ liệu cũ và dữ liệu mới trên mỗi lần ghi vào bộ nhớ cache. Điều làm cho điều này tồi tệ hơn, là nó yêu cầu dữ liệu được ghi phải thực sự có sẵn tại thời điểm viết!

Đó thường không phải là trường hợp trên một CPU hiện đại. Dữ liệu được viết vẫn có thể được tính toán chẳng hạn. Bộ đệm vẫn có thể tiếp tục, tải dòng bộ đệm nếu cần, đánh dấu dòng bộ đệm là đã sửa đổi, v.v., ngay cả trước khi tính toán kết thúc. Tất cả việc giữ sách có thể đã được thực hiện ngoại trừ sửa đổi thực tế của dòng bộ đệm. Nếu bạn muốn so sánh kết quả mới được ghi và dữ liệu dòng bộ đệm cũ, điều đó là không thể.

Ví dụ: nếu bạn có mã C a [i] = x / y; bộ phận x / y mất nhiều thời gian để thực hiện trên hầu hết các CPU. Tuy nhiên, hầu hết các công việc cần thiết để xử lý lưu trữ kết quả vào [i] đã xảy ra từ lâu trước khi phân chia kết thúc; điều duy nhất còn thiếu là việc di chuyển tám byte kết quả vào dòng bộ đệm. Một thao tác xóa dòng bộ đệm sẽ tự động đợi cho đến khi phân chia xong. Một thao tác đọc [i] có thể sẽ được chuyển hướng để nhận kết quả trực tiếp từ dải phân cách.


Bộ đệm sử dụng MESI để kết hợp vẫn có thể thực hiện RFO, nhưng nếu dữ liệu được so sánh giống nhau một khi nó đã sẵn sàng, hãy để dòng ở trạng thái Độc quyền thay vì Sửa đổi. Lý do thực sự không được thực hiện trong phần cứng là vì nó tốn thêm bộ đệm đọc khi dữ liệu cam kết vào bộ đệm và sẽ yêu cầu một loại chu trình đọc / so sánh / ghi nguyên tử (với cài đặt tùy chọn của bit bẩn) khiến nó bị hút thực hiện đường ống.
Peter Cordes

1

Một tối ưu hóa có thể là để bộ đệm so sánh nội dung ghi và nội dung trước đó của bộ đệm và nếu chúng giống nhau, đừng đánh dấu dòng là bẩn

Sẽ không tối ưu hóa như vậy gấp đôi thời gian CPU cần ghi một cái gì đó vào bộ đệm? Bởi vì mỗi dòng ghi bộ đệm hiện sẽ được đi kèm với một hoạt động so sánh, không miễn phí.

Vì vậy, thực sự tối ưu hóa bây giờ sẽ phụ thuộc vào yếu tố rất mơ hồ: bao nhiêu lần một phần mềm trung bình viết lại bộ nhớ có thể lưu trong bộ nhớ cache của nó với cùng một dữ liệu.


So sánh này sẽ được thực hiện trong logic CPU. Nó sẽ không yêu cầu một hoạt động CPU bổ sung, nhưng thời gian tín hiệu có thể tăng lên, điều này có thể là một vấn đề hoặc không.
ziggystar

@ziggystar Chà, tôi không phải là bậc thầy về phần cứng, nhưng tôi đã quen với suy nghĩ rằng mọi thứ đều phải trả giá. Vì vậy, so sánh hoạt động với dòng bộ đệm. Nó có thể nhanh Nhưng đây vẫn là chi phí. Và tôi nghĩ những người thực hiện đã quyết định không trả nó. Có thể thậm chí sau một số suy nghĩ và đo lường.
Vladislav Rastrusny

1
Nhưng bạn đang nói về thời gian, trong đó chi phí chỉ có thể là sự gia tăng số lượng cổng.
ziggystar

1
@ziggystar: Đây không chỉ là nhiều cổng. Khi dữ liệu được gửi đến bộ đệm, thông thường quá trình gửi dữ liệu có thể đánh dấu dòng bộ đệm là đã sửa đổi. Với "tối ưu hóa" này, cả dữ liệu cũ và dữ liệu mới đều phải đi qua các cổng này sẽ gây ra một số chậm trễ và chỉ sau đó bộ đệm mới có thể bị vô hiệu. Bạn phải ép tất cả điều này vào một chu kỳ bộ xử lý, nếu không, việc ghi vào dòng bộ đệm đột nhiên mất hai chu kỳ. Và bây giờ để làm cho mọi thứ phức tạp hơn, hãy xem xét những gì xảy ra khi tôi viết tám từ liên tiếp vào một dòng bộ đệm.
gnasher729

1
Và mỗi lần ghi này sẽ trì hoãn quyết định xem dòng cache có bị sửa đổi hay không. Vì vậy, khi lần ghi thứ hai xảy ra, dòng bộ đệm không biết liệu nó có được sửa đổi hay không (chưa). Sẽ rất vui đấy.
gnasher729
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.