2012-05-24 39 views
6

Tôi đang viết một ứng dụng trong C++ cần đọc chỉ từ cùng một bộ nhớ nhiều lần từ nhiều luồng. Câu hỏi của tôi là từ một quan điểm thực hiện của nó sẽ tốt hơn để sao chép bộ nhớ cho mỗi chủ đề hoặc cung cấp cho tất cả các chủ đề cùng một con trỏ và có tất cả chúng truy cập cùng một bộ nhớ.truy cập bộ nhớ so với bản sao bộ nhớ

Cảm ơn

+1

Máy NUMA phải không? – Mysticial

+1

Câu hỏi hiển nhiên là: hằng số bộ nhớ này trong khi nó đang được đọc, hoặc nó có bị thay đổi không? –

+1

@Mysticial, người ta hy vọng rằng tất cả các kiến ​​trúc có hiệu quả xử lý nhân dữ liệu đọc, không chỉ là một hệ thống NUMA. –

Trả lời

6

Không có câu trả lời dứt khoát từ ít thông tin bạn đã cung cấp về hệ thống mục tiêu của bạn và như vậy, nhưng trên một máy tính bình thường, nhiều khả năng nhanh nhất sẽ là không sao chép.

Một lý do sao chép có thể chậm, có thể dẫn đến việc bộ nhớ cache bị mất nếu vùng dữ liệu lớn. Một máy tính bình thường sẽ cache truy cập chỉ đọc vào cùng vùng dữ liệu rất hiệu quả giữa các luồng, ngay cả khi các luồng đó xảy ra để chạy trên các lõi khác nhau.

Một trong những lợi ích được Intel liệt kê rõ ràng để tiếp cận bộ nhớ đệm là "Allows more data-sharing opportunities for threads running on separate cores that are sharing cache". I E. họ khuyến khích một thực hành mà bạn không phải lập trình các luồng để lưu trữ dữ liệu một cách rõ ràng, CPU sẽ làm điều đó cho bạn.

1

Vì bạn đề cập cụ thể đến nhiều chủ đề, tôi cho rằng bạn có ít nhất một hệ thống đa ổ cắm. Thông thường, các ngân hàng bộ nhớ được kết hợp với các socket bộ xử lý. Đó là, một bộ xử lý là "gần nhất" với các ngân hàng bộ nhớ riêng của nó và cần giao tiếp với các bộ điều khiển bộ xử lý khác để truy cập dữ liệu trên các ngân hàng khác. (Bộ xử lý ở đây có nghĩa là vật lý trong ổ cắm)

Khi bạn phân bổ dữ liệu, thường là chính sách ghi đầu tiên được sử dụng để xác định bộ nhớ nào sẽ phân bổ dữ liệu, có nghĩa là nó có thể truy cập dữ liệu nhanh hơn bộ vi xử lý.

Vì vậy, ít nhất đối với nhiều bộ xử lý (không chỉ nhiều lõi) nên có cải thiện hiệu suất từ ​​phân bổ một bản sao ít nhất cho mỗi bộ xử lý. Hãy chắc chắn, để phân bổ/sao chép dữ liệu với mỗi bộ xử lý/luồng chứ không phải từ một luồng chủ (để khai thác chính sách ghi đầu tiên). Ngoài ra, bạn cần đảm bảo rằng các chuỗi sẽ không di chuyển giữa các bộ xử lý, vì sau đó bạn có khả năng mất kết nối gần với bộ nhớ của mình.

Tôi không chắc chắn, cách sao chép dữ liệu cho mỗi luồng trên một bộ xử lý sẽ ảnh hưởng đến hiệu suất, nhưng tôi đoán không sao chép có thể cải thiện khả năng chia sẻ nội dung của bộ đệm cấp cao hơn.

Trong mọi trường hợp, điểm chuẩn và quyết định dựa trên các phép đo thực tế.

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