Tôi đã được giao nhiệm vụ thực hiện mô phỏng đơn luồng monte carlo hiện có và tối ưu hóa. Đây là một ứng dụng giao diện điều khiển C#, không truy cập db nó tải dữ liệu một lần từ một tệp csv và ghi nó ra ở cuối, vì vậy nó là khá nhiều chỉ CPU ràng buộc, cũng chỉ sử dụng khoảng 50MB bộ nhớ.Di chuyển một ứng dụng đơn luồng sang đa luồng, thực thi song song, mô phỏng monte carlo
Tôi đã chạy qua trình thu thập dữ liệu Jetbrains dotTrace. Trong tổng thời gian thực hiện khoảng 30% là tạo ra các số ngẫu nhiên đồng nhất, 24% chuyển số ngẫu nhiên đồng nhất sang các số ngẫu nhiên được phân phối thông thường.
Các thuật toán cơ bản là một toàn bộ rất nhiều lồng nhau cho vòng, với số ngẫu nhiên các cuộc gọi và nhân ma trận ở trung tâm, mỗi lần lặp trả về một đôi mà được thêm vào một danh sách kết quả, danh sách này được định kỳ sắp xếp và thử nghiệm cho một số tiêu chí hội tụ (tại các điểm kiểm tra mỗi 5% tổng số lần lặp) nếu chương trình có thể chấp nhận thoát ra khỏi vòng lặp và ghi kết quả, nếu không nó sẽ tiến tới cuối.
Tôi muốn phát triển phải cân nhắc ở trên:
- tôi nên sử dụng Chủ đề mới v ThreadPool
- tôi nên nhìn vào các thư viện Microsoft Parallels mở rộng
- tôi nên xem xét AForge.Net Parallel.For, http://code.google.com/p/aforge/ bất kỳ thư viện nào khác?
Một số liên kết đến các hướng dẫn trên trên sẽ được chào đón nhất như Tôi chưa bao giờ viết bất kỳ song song hoặc mã đa luồng.
- các chiến lược tốt nhất để tạo số ngẫu nhiên được phân phối bình thường, và sau đó tiêu thụ các số này. Số ngẫu nhiên đồng nhất không bao giờ được ứng dụng sử dụng trong trạng thái này, chúng luôn được dịch sang thường được phân phối và sau đó được tiêu thụ.
- thư viện nhanh tốt (song song?) Để tạo số ngẫu nhiên
- cân nhắc bộ nhớ khi tôi thực hiện song song này, tôi sẽ yêu cầu thêm bao nhiêu.
Ứng dụng hiện tại mất 2 giờ cho 500.000 lần lặp lại, doanh nghiệp cần điều này để chia tỷ lệ thành 3.000.000 lần lặp lại và được gọi là lần mulitple mỗi ngày, vì vậy cần tối ưu hóa nặng.
Particulary muốn nghe từ những người người đã sử dụng Microsoft Parallels mở rộng hoặc AForge.Net Parallel
này cần phải được productionised khá nhanh chóng để .net 4 beta ra mặc dù Tôi biết nó có các thư viện đồng thời được đưa vào, chúng ta có thể xem xét việc di chuyển sang .net 4 sau đó sau khi nó được phát hành. Hiện tại máy chủ có .Net 2, tôi đã gửi để xem xét nâng cấp lên .net 3.5 SP1 mà hộp dev của tôi có.
Cảm ơn
Cập nhật
Tôi vừa cố gắng thực hiện Parallel.For nhưng nó đi kèm với một số kết quả kỳ lạ. đơn luồng:
IRandomGenerator rnd = new MersenneTwister();
IDistribution dist = new DiscreteNormalDistribution(discreteNormalDistributionSize);
List<double> results = new List<double>();
for (int i = 0; i < CHECKPOINTS; i++)
{
results.AddRange(Oblist.Simulate(rnd, dist, n));
}
Để:
Parallel.For(0, CHECKPOINTS, i =>
{
results.AddRange(Oblist.Simulate(rnd, dist, n));
});
Bên trong mô phỏng có rất nhiều cuộc gọi đến rnd.nextUniform(), Tôi nghĩ rằng tôi nhận được nhiều giá trị giống nhau, có khả năng này xảy ra bởi vì điều này bây giờ là song song?
Cũng có thể sự cố với cuộc gọi Danh sách AddRange không phải là chủ đề an toàn? Tôi thấy điều này
System.Threading.Collections.BlockingCollection có thể đáng được sử dụng, nhưng nó chỉ có phương thức Thêm không có AddRange nên tôi phải xem xét kết quả đó và thêm một cách an toàn cho luồng. Bất kỳ cái nhìn sâu sắc từ một người đã sử dụng Parallel.For nhiều đánh giá cao. Tôi chuyển sang System.Random cho các cuộc gọi của tôi tạm thời như tôi đã nhận được một ngoại lệ khi gọi nextUniform với thực hiện Mersenne Twister tôi, có lẽ nó đã không đề an toàn một mảng nhất định đã nhận được một chỉ số ngoài giới hạn. ...
Bạn đang chạy máy nào? Có thể nhận được một phần tốc độ tăng yêu cầu từ phần cứng được nâng cấp. –
Đây là trên một opteron AMD 275, 4 cpus tôi nghĩ, không chắc chắn có bao nhiêu lõi. Máy chủ Windows 2003 SP2 32 bit – m3ntat