Tôi phát triển mã Lattice Boltzmann (Động lực học chất lỏng) bằng F #. Bây giờ tôi đang thử nghiệm mã trên 24 lõi, máy chủ bộ nhớ 128 GB. Mã này về cơ bản bao gồm một hàm đệ quy chính cho sự phát triển thời gian và bên trong một vòng lặp System.Threading.Tasks.Parallel.For cho một không gian 3D chiều. Không gian 3D là 500x500x500 lớn và một chu kỳ thời gian mất bao giờ :).F # dưới dạng ngôn ngữ HPC
let rec timeIterate time =
// Time consuming for loop
System.Threading.Tasks.Parallel.For(...)
Tôi hy vọng máy chủ sẽ sử dụng tất cả 24 lõi để sử dụng 100%. Những gì tôi quan sát là một cái gì đó giữa 1% - 30% sử dụng.
Và câu hỏi của tôi là:
- là F # là một công cụ thích hợp để tính toán HPC trên các máy chủ như vậy?
- Thực tế có sử dụng tới 100% CPU cho một vấn đề thực tế không?
- Tôi nên làm gì để đạt được tốc độ cao? Tất cả mọi thứ là trong một lớn song song cho vòng lặp vì vậy tôi mong rằng đó là tất cả những gì tôi nên làm ...
- Nếu F # KHÔNG phải là một ngôn ngữ thích hợp, ngôn ngữ là gì?
Cảm ơn bạn đã đề xuất.
EDIT: Tôi sẵn sàng chia sẻ mã nếu có ai muốn xem.
EDIT2: Đây là phiên bản rút gọn của mã: http://dl.dropbox.com/u/4571/LBM.zip Nó không làm bất cứ điều gì hợp lý và tôi hy vọng tôi đã không giới thiệu bất kỳ lỗi bằng cách tách mã :)
Các tập tin khởi động là ShearFlow.fs và tại đáy hồ sơ là
let rec mainLoop (fA: FArrayO) (mR: MacroResult) time =
let a = LBM.Lbm.lbm lt pA getViscosity force g (fA, mR)
Đây có phải là ấm (thread. NET mất một ít thời gian để làm nóng và nhận đủ chủ đề) không? Bạn đang làm bất kỳ I/O chặn nào? Bạn đã thực hiện bất kỳ hồ sơ bộ nhớ nào để xem liệu bộ thu gom rác có phải là nút cổ chai không? Bạn đã làm hồ sơ gì (VS có các công cụ dễ sử dụng tuyệt vời)? – Brian
Tôi nghi ngờ sử dụng bộ nhớ cache xấu. Bạn có chia lưới để mỗi lõi có được dữ liệu được bản địa hóa không? – CodesInChaos
Tôi không phải là chuyên gia lập trình. Tôi không lưu bất kỳ tệp nào ngay bây giờ. Tôi đã cố gắng chạy thuật sĩ hiệu suất nhưng tôi không biết làm thế nào để làm hồ sơ bộ nhớ. Tôi sẽ phải kiểm tra điều đó. Tôi không chia lưới. Hiện tại, chúng tôi không mong đợi có mạng lưới lớn hơn 50x50x50. 500x500x500 chỉ là một ví dụ. Tôi đã thêm mã của tôi cho những người quan tâm :). –