2012-04-25 22 views
13

Trong ứng dụng của tôi, tại một thời điểm tôi cần thực hiện các phép tính trên khối dữ liệu bộ nhớ liền kề lớn (100s MB). Những gì tôi đã suy nghĩ là để tiếp tục tìm nạp trước một phần của khối chương trình của tôi sẽ liên lạc trong tương lai, để khi tôi thực hiện các phép tính trên phần đó, dữ liệu đã có trong bộ nhớ cache.Tìm nạp dữ liệu vào bộ nhớ đệm cho x86-64

Ai đó có thể cho tôi một ví dụ đơn giản về cách đạt được điều này với gcc? Tôi đọc _mm_prefetch ở đâu đó, nhưng không biết cách sử dụng nó đúng cách. Cũng lưu ý rằng tôi có một hệ thống đa lõi, nhưng mỗi lõi sẽ làm việc trên một vùng khác nhau của bộ nhớ song song.

+6

Nếu truy cập bộ nhớ là tuần tự, trình tìm nạp trước phần cứng sẽ làm điều đó cho bạn. Vì vậy, bạn có thể sẽ không nhận được nhiều cải tiến với tìm nạp trước thủ công. – Mysticial

+6

Xem câu hỏi này để biết ví dụ về nơi tìm nạp trước thực sự giúp: http://stackoverflow.com/questions/7327994/prefetching-examples – Mysticial

+2

Bạn có nghĩa là trình tìm nạp trước phần cứng bằng cách nào đó nhận ra tôi đang sử dụng các khu vực tiếp giáp trong bộ nhớ và đưa các phần đó vào bộ nhớ cache ? – pythonic

Trả lời

16

gcc sử dụng các hàm dựng sẵn làm giao diện cho hướng dẫn lowlevel. Đặc biệt cho trường hợp của bạn __builtin_prefetch. Nhưng bạn chỉ nên thấy sự khác biệt có thể đo lường khi sử dụng điều này trong trường hợp mẫu truy cập không dễ dự đoán một cách tự động.

13

CPU hiện đại có chức năng tìm nạp tự động khá tốt và bạn cũng có thể thấy rằng bạn gây hại nhiều hơn là tốt nếu bạn cố gắng bắt đầu tìm nạp trước phần mềm. Có nhiều khả năng nhiều hơn "trái cây treo thấp" mà bạn có thể tập trung vào để tối ưu hóa nếu bạn thấy rằng bạn thực sự có một vấn đề hiệu suất. Tìm nạp trước có xu hướng là một trong những điều cuối cùng mà bạn có thể thử, khi bạn đang tuyệt vọng cho một vài phần trăm thông lượng.

+4

+1 Tôi đã thử tìm nạp trước ít nhất 10 lần khác nhau. Chỉ một lần tôi thậm chí còn quản lý để có được một tốc độ đáng chú ý. – Mysticial

+4

Đồng ý - ngay cả trên các CPU cũ với tính năng tìm nạp tự động ít phức tạp hơn, luôn luôn khó có được lợi ích từ phần mềm prefetch - các vấn đề chính mà bạn thường cần phải thực hiện trước một vài trăm chu kỳ đồng hồ trước thời hạn và tất nhiên bạn cần phải có một số băng thông bộ nhớ rảnh rỗi mà bạn có thể tận dụng, thường không phải là trường hợp trong mã hiệu suất cao. –

+1

Tìm nạp trước là không cần thiết - cho đến khi cần thiết. Trong ứng dụng hiện tại của tôi - các mẫu truy cập bộ nhớ không được phát hiện bởi trình tìm nạp trước phần cứng. Và thật không may - việc thay đổi các mẫu truy cập đó trở nên thân thiện với người tìm nạp trước không phải là một lựa chọn. Do đó - _mm_prefetch. Thông lượng đã giảm ~ 10%, nhưng chúng tôi đã đạt được con số độ trễ mà chúng tôi muốn. Đó là một thương mại rất có ý thức được thực hiện sau khi profiling nhiều thông qua perf và vtune. – quixver

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