Tôi có một mảng dữ liệu khổng lồ, nơi tôi cần đọc/ghi từ/đến vị trí ngẫu nhiên từ các luồng khác nhau. Có một mutex
rõ ràng sẽ giết hiệu suất. Ý tưởng của tôi là có nhiều mutexes
mỗi người chịu trách nhiệm cho phạm vi cụ thể trong mảng. Bằng cách này trước khi viết, tôi có thể khóa đúng mutex
dựa trên chỉ mục trong mảng mà tôi sẽ viết. Về lý thuyết nó có thể làm giảm cuộc đua. Nhưng tôi tự hỏi - có lẽ có một cách tốt hơn?Đọc song song với mảng
Trả lời
Điều đó nghe giống như một cách hợp lý để đi.
Có một số điều cần lưu ý, mặc dù:
Bạn nói rằng ý tưởng của bạn là phải có "nhiều mutexes, mỗi người chịu trách nhiệm về phạm vi cụ thể trong mảng". Bạn có lẽ nên xem xét các mẫu truy cập để quyết định cách gán các mục nhập cho các mutex. Nếu chuỗi sẽ có xu hướng hoạt động trên các mục nhập cận cảnh, bạn có thể xem xét gán các mục nhập cho các mutex bằng cách sử dụng một lược đồ khác, ví dụ: chỉ mục mục nhập modulo số lượng các mutex.
Từ kinh nghiệm, lưu ý rằng số lượng mutexes phải được xác định theo số chủ đề chứ không phải kích thước của phạm vi. Tôi đã viết về điều này nhiều hơn trong this question (đó là câu trả lời được chấp nhận, tại thời điểm viết bài này).
Một lần nữa tùy thuộc vào mẫu sử dụng, bạn nên cân nhắc sử dụng khóa đọc/ghi để tránh việc tuần tự hóa không cần thiết cho nhiều người đọc trên cùng một mục nhập. YMMV.
Chỉ là một nhận xét nhỏ cho "điều 1" - nếu chủ đề hoạt động trên các yếu tố lân cận, bạn nên biết [chia sẻ sai] (https://en.wikipedia.org/wiki/False_sharing) – Rostislav
@Rostislav, vâng, cảm ơn - Đó là một điểm tốt. –
@AmiTavory Cảm ơn. Tôi thực sự thích điều này modulo thingy). – nikitablack
- 1. Nhiều mảng không nhất quán song song
- 2. Nguồn cấp dữ liệu GNU song song với một mảng?
- 3. Phân bổ mảng song song trong PHP
- 4. Luồng song song với Xử lý song song
- 5. Song song với "Giảm" trong "MapReduce"
- 6. LinqToSql - Song song - DataContext và song song
- 7. spark đọc dữ liệu từ mysql song song
- 8. Repa Không song song
- 9. Xử lý mảng song song bằng cách sử dụng GCD
- 10. Giảm song song
- 11. Truy cập các mảng song song trong các mẫu Django?
- 12. pragma OMP song song cho vs pragma OMP song song
- 13. Perl cách lặp lại hơn 2 mảng song song
- 14. Tại sao sử dụng mảng song song trong Java?
- 15. SqlConnection với lập trình song song
- 16. Đường ống Jenkins với song song
- 17. Thực hiện song song TestNG với DataProvider
- 18. GNU song song với chuỗi biến?
- 19. rjdbc Truy vấn song song với parallelmap
- 20. Python - Lặp song song với joblib
- 21. đa hướng song song với chồng runghc
- 22. OpenMP - Chạy mã song song bên trong mã song song
- 23. thử nghiệm chạy thử nghiệm song song song song
- 24. Tại sao các phiên song song được tạo ngay cả khi tôi tắt DML song song và DDL song song
- 25. Dự đoán song song
- 26. Tập tin song song xen kẽ đọc chậm hơn tuần tự đọc?
- 27. quicksort song song trong c
- 28. Chạy thử nghiệm song song với PNunit, không thể đọc từ tệp cấu hình
- 29. Bộ lặp song song
- 30. chạy song song AsyncTask
Nếu một công nhân đọc vị trí A và sau đó viết vị trí B, làm cách nào để đảm bảo không bị thay đổi ở giữa, làm cho kết quả vô nghĩa? Lý do tôi hỏi là bởi vì nếu có các mẫu truy cập, họ có thể làm cho một cách tiếp cận tốt hơn có thể, ví dụ như một biến thể của mô hình người tiêu dùng sản xuất, được giải quyết tốt nhất bằng cách sử dụng hàng đợi. –
Tôi không thể chắc chắn. Các mẫu không được biết - đó là một số loại đệm sâu. Đó là lý do tại sao đọc và viết nên được thực hiện trong một khóa duy nhất. – nikitablack
Tôi vẫn không hiểu: Bạn có đọc một phần tử, thực hiện một số thao tác trên nó và sau đó viết lại thành phần tử đó không? Nếu đúng như vậy, bạn có thể trích xuất thuật toán chọn các phần tử và sau đó phân phối chúng thông qua một hàng đợi đơn giản của người sản xuất-người tiêu dùng đến các luồng công nhân và tương tự truyền chúng lại để lưu trữ các kết quả. –