2009-05-20 22 views
7

Tôi có một bộ đệm (25 đến 30 trong số đó) trong ứng dụng của tôi là khá lớn (.5mb) và truy cập simulataneousley. Để làm cho nó thậm chí còn tồi tệ hơn các dữ liệu trong họ thường chỉ đọc một lần, và nó được cập nhật thường xuyên (như 30 lần mỗi giây). Phân loại các cơn bão hoàn hảo của việc sử dụng bộ nhớ cache không tối ưu. Dù sao đi nữa, nó đã xảy ra với tôi rằng nó sẽ được mát mẻ nếu tôi có thể đánh dấu một khối bộ nhớ là không thể lưu trữ ... Về mặt lý thuyết, điều này sẽ để lại nhiều chỗ trong bộ nhớ cache cho tất cả mọi thứ khác.Có thể phân bổ, trong không gian người dùng, một khối bộ nhớ không thể lưu trữ trên Linux được không?

Vì vậy, đó là cách của họ để có được một khối bộ nhớ được đánh dấu là không thể lưu vào bộ nhớ cache trong Linux?

+0

Tôi nghĩ điều này sẽ làm tổn thương sự hoàn hảo - bằng cách đánh dấu là không thể lưu vào bộ nhớ tất cả các bản cập nhật thường xuyên sẽ phải chuyển sang bộ nhớ thay vì ghi vào bộ nhớ cache. – Michael

+0

Bộ nhớ cache chỉ hữu ích trong trường hợp này nếu các ghi không tuần tự và nhiều ghi sẽ rơi trên cùng một dòng bộ nhớ cache. Nếu viết được bán ngẫu nhiên và do thời gian cùng một vị trí được viết một lần nữa rằng vị trí đã được flushed từ bộ nhớ cache có rất ít điểm. –

+0

@Michael - các bản cập nhật được * giả định * để bỏ qua bộ nhớ cache trong trường hợp này. – Tom

Trả lời

8

Cách tránh gây ô nhiễm cache với dữ liệu như thế này được đề cập trong What Every Programmer Should Know About Memory (PDF) - Điều này được viết theo quan điểm phát triển của Red Hat rất hoàn hảo cho bạn. Tuy nhiên, hầu hết nó là nền tảng chéo.

Điều bạn muốn được gọi là "Truy cập không phải tạm thời" và yêu cầu bộ xử lý mong đợi rằng giá trị bạn đang đọc bây giờ sẽ không cần thiết nữa trong một thời gian. Bộ xử lý sau đó tránh lưu vào bộ nhớ đệm giá trị đó.

Xem trang 49 của tệp PDF mà tôi đã liên kết ở trên. Nó sử dụng intel nội tại để thực hiện streaming xung quanh bộ nhớ cache.

Về phía đọc, xử lý, cho đến khi thời gian gần đây, thiếu hỗ trợ ngoài gợi ý yếu sử dụng truy cập phi thời (NTA) hướng dẫn prefetch. Có không tương đương với việc ghi kết hợp cho các lần đọc , đặc biệt xấu cho bộ nhớ không thể thu thập được như I/O được ánh xạ bộ nhớ. Intel, với các tiện ích mở rộng SSE4.1, đã giới thiệu NTA lượt tải. Chúng được triển khai bằng cách sử dụng số lượng nhỏ tải trực tuyến bộ đệm; mỗi bộ đệm chứa một dòng bộ nhớ cache . Hướng dẫn movntdqa đầu tiên cho một dòng bộ nhớ cache nhất định sẽ tải một dòng bộ nhớ cache vào bộ đệm, có thể thay thế một dòng bộ nhớ cache khác. Truy cập được liên kết 16 byte tiếp theo đến cùng một dòng bộ nhớ cache sẽ được phục vụ từ bộ đệm tải với chi phí thấp. Trừ khi có các lý do khác để làm vì vậy, dòng bộ nhớ cache sẽ không được tải vào bộ nhớ cache, do đó cho phép tải số lượng lớn bộ nhớ mà không gây ô nhiễm bộ đệm.Trình biên dịch cung cấp một nội tại cho hướng dẫn này:

#include <smmintrin.h> 
__m128i _mm_stream_load_si128 (__m128i *p); 

nội tại này nên được sử dụng nhiều lần, với địa chỉ của khối 16-byte truyền như tham số , cho đến khi mỗi dòng bộ nhớ cache là đọc. Chỉ sau đó nên bắt đầu dòng bộ nhớ cache tiếp theo. Vì có một vài luồng đọc bộ đệm nó có thể là thể đọc từ hai vị trí bộ nhớ cùng một lúc

Nó sẽ là hoàn hảo cho bạn nếu khi đọc, các bộ đệm được đọc theo thứ tự tuyến tính thông qua bộ nhớ. Bạn sử dụng tính năng phát trực tuyến để làm như vậy. Khi bạn muốn sửa đổi chúng, các bộ đệm được sửa đổi theo thứ tự tuyến tính và bạn có thể sử dụng tính năng ghi trực tuyến để làm điều đó nếu bạn không muốn đọc lại chúng bất kỳ lúc nào từ cùng một chuỗi.

0

Trên một số kiến ​​trúc bộ vi xử lý nhất định, có các hướng dẫn đặc biệt có thể được sử dụng để đánh dấu một số dòng bộ nhớ cache nhất định bị tắt. Tuy nhiên, đây thường là kiến ​​trúc cụ thể và phụ thuộc vào một số hướng dẫn lắp ráp. Vì vậy, tôi sẽ khuyên bạn nên tham khảo tài liệu kiến ​​trúc bộ vi xử lý và tìm ra cách để làm điều đó trong hội đồng. Sau đó bạn có thể sử dụng lắp ráp nội tuyến với GCC để kích hoạt nó. Nó sẽ làm cho hiệu suất hút mặc dù.

PS: Nếu có thể, bạn có thể nghĩ ra một cách khác để xử lý dữ liệu?

+0

Bạn sẽ không thể sử dụng các hướng dẫn như thế từ không gian người dùng ... – bdonlan

+0

Đúng, trên bộ vi xử lý ở đó nó là một hướng dẫn đặc quyền. Sau đó, với Linux, bạn sẽ cần phải tìm một nơi để thả nó vào không gian hạt nhân và viết một số loại chức năng không gian người dùng để truy cập nó. – sybreon

1

Bạn cũng có thể muốn xem xét mối quan hệ của bộ vi xử lý để giảm sự cố bộ nhớ cache.

2

Dữ liệu cập nhật thường xuyên thực sự là ứng dụng hoàn hảo của bộ nhớ cache. Như đã đề cập, bộ nhớ cache CPU hiện đại khá lớn và 0.5mb có thể phù hợp với bộ nhớ cache. Quan trọng hơn, mặc dù, đọc-sửa đổi-ghi vào bộ nhớ uncached là RẤT chậm - đọc ban đầu đã chặn trên bộ nhớ, sau đó hoạt động ghi ALSO đã chặn trên bộ nhớ để cam kết. Và chỉ để thêm sự xúc phạm vào thương tích, CPU có thể thực hiện bộ nhớ không có bộ nhớ đệm bằng cách tải dữ liệu vào bộ nhớ cache, sau đó ngay lập tức làm mất hiệu lực của dòng bộ nhớ cache - do đó sẽ khiến bạn ở vị trí được đảm bảo tồi tệ hơn trước.

Trước khi bạn cố gắng outsmarting CPU như thế này, bạn thực sự nên điểm chuẩn toàn bộ chương trình, và xem nơi chậm thực sự là. Hồ sơ hiện đại như valgrind's cachegrind có thể đo nhớ cache, vì vậy bạn có thể tìm thấy nếu đó là một nguồn đáng kể chậm lại là tốt.

Trên một lưu ý thực tế khác, nếu bạn đang thực hiện 30 RMW mỗi giây, đây là trường hợp xấu nhất theo thứ tự 1920 byte bộ nhớ cache. Đây chỉ là 1/16 kích thước L1 của bộ vi xử lý Core 2 hiện đại và có khả năng bị mất trong tiếng ồn chung của hệ thống. Vì vậy, đừng lo lắng về nó quá nhiều :)

Điều đó nói rằng, nếu 'truy cập đồng thời' bạn có nghĩa là 'truy cập bởi nhiều chủ đề cùng một lúc', hãy cẩn thận về dòng bộ nhớ cache nảy giữa các CPU. Điều này sẽ không được giúp đỡ bởi RAM không có bộ nhớ - nếu bất cứ điều gì nó sẽ tồi tệ hơn, vì dữ liệu sẽ phải di chuyển trở lại RAM vật lý mỗi lần thay vì có thể đi qua bus liên CPU nhanh hơn - và cách duy nhất để tránh vấn đề này là giảm thiểu tần suất truy cập vào dữ liệu được chia sẻ. Để biết thêm về điều này, hãy xem http://www.ddj.com/hpc-high-performance-computing/217500206

+0

Đọc-sửa-ghi rất chậm, nhưng đây chỉ là vấn đề nếu bạn không ghi vào toàn bộ dòng bộ nhớ cache qua một số lệnh ngắn. CPU có thể phát hiện nếu toàn bộ dòng bộ nhớ cache đã được sửa đổi và tránh đọc. –

+0

Khóa bộ nhớ mà một CPU khác có trong cache cũng được cho là rất chậm, vì vậy tôi sẽ cẩn thận trong việc xác nhận rằng nó nhanh hơn để khóa bộ nhớ để sửa đổi trong bộ nhớ cache khác hơn là đọc cùng một bộ nhớ từ hệ thống . –

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