2012-02-12 26 views
7

Tôi có một chương trình chia tỷ lệ thành nhiều luồng, mặc dù - về mặt lý thuyết - nó phải mở rộng tuyến tính: đó là phép tính chia thành các đoạn nhỏ hơn và không cần gọi hệ thống, gọi thư viện, khóa, vv Chạy với bốn chủ đề chỉ nhanh hơn gấp đôi khi chạy với một luồng đơn (trên hệ thống lõi tứ), trong khi tôi mong đợi một con số gần gấp bốn lần nhanh.Hiệu suất đa luồng và lược tả

Thời gian chạy của các triển khai với pthread, chủ đề C++ 0x và OpenMP đồng ý.

Để xác định nguyên nhân, tôi đã thử gprof (vô ích) và valgrind (tôi không thấy bất kỳ điều gì rõ ràng). Làm thế nào tôi có thể đánh giá hiệu quả những gì gây ra sự chậm lại? Bất kỳ ý tưởng chung nào về nguyên nhân có thể của nó?

- Cập nhật -

Việc tính toán liên quan đến Monte Carlo hội nhập và tôi nhận thấy rằng một số lượng hợp lý của thời gian được dành tạo số ngẫu nhiên. Trong khi tôi không biết tại sao điều này xảy ra với bốn chủ đề, tôi nhận thấy rằng các máy phát điện số ngẫu nhiên không phải là reentrant. Khi sử dụng mutexes, thời gian chạy sẽ phát nổ. Tôi sẽ reimplement phần này trước khi kiểm tra các vấn đề khác.

Tôi đã thực hiện lại các lớp lấy mẫu đã cải thiện hiệu suất đáng kể. Vấn đề còn lại là, trên thực tế, ganh đua của bộ đệm CPU (nó đã được tiết lộ bởi cachegrind như Evgeny nghi ngờ.)

Trả lời

4

Bạn có thể sử dụng oprofile. Hoặc một trình giả dạng giả của người nghèo: chạy chương trình dưới gdb, dừng nó lại và xem nó bị dừng ở đâu. "valgrind --tool = cachegrind" sẽ chỉ cho bạn cách sử dụng bộ nhớ cache CPU hiệu quả.

Tích hợp Monte Carlo có vẻ là thuật toán rất tốn thời gian. Hãy thử ước tính, băng thông bộ nhớ được sử dụng như thế nào. Nó có thể là yếu tố hạn chế cho hiệu suất của chương trình của bạn. Ngoài ra nếu hệ thống của bạn chỉ có 2 nhân với siêu phân luồng, nó sẽ không hoạt động nhanh hơn nhiều với 4 luồng, so sánh với 2 luồng.

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