Hãy để tôi thử và phá vỡ các yêu cầu của bạn:
- Bảo trì
- Đọc / ghi dữ liệu văn bản
- Giao diện / khả năng mạnh mẽ cho các yếu tố LU
- Giải quyết tuyến tính thưa thớt
- Hiệu suất và khả năng mở rộng dữ liệu lớn
Từ danh sách này, tôi sẽ xem xét các ngôn ngữ sau:
C, C ++, Fortran, Python, MATLAB, Java
Julia là một ngôn ngữ mới đầy hứa hẹn, nhưng cộng đồng vẫn đang hình thành xung quanh nó và nó chưa được triển khai trong bất kỳ mã mới nào.
Đọc / ghi dữ liệu văn bản
Điều này là dễ dàng để có được ngay trong bất kỳ ngôn ngữ lập trình. Hãy chắc chắn rằng bạn đang đệm một cách thích hợp và kết hợp lại quyền truy cập I / O của bạn và bạn sẽ có được hiệu suất tốt từ bất kỳ ngôn ngữ nào bạn nên xem xét. Tránh các đối tượng truyền phát trong C ++ trừ khi bạn biết cách sử dụng chúng một cách hiệu quả.
Giao diện / khả năng mạnh mẽ cho các yếu tố LU
Nếu bạn đang thực hiện các yếu tố LU dày đặc, bạn sẽ muốn sử dụng LAPACK hoặc ScaLAPACK / Elemental cho chức năng song song. LAPACK và ScaLAPACK được viết bằng Fortran, Elemental được viết bằng C ++. Tất cả ba thư viện là hiệu suất và được hỗ trợ tốt và tài liệu. Bạn có thể giao tiếp với chúng từ bất kỳ ngôn ngữ nào bạn nên xem xét.
Giải quyết tuyến tính thưa thớt
Các bộ giải tuyến tính thưa thớt có sẵn miễn phí hàng đầu hầu như đều có sẵn thông qua PETSc , được viết bằng C, được ghi chép lại và hỗ trợ tốt. Bạn có thể giao tiếp với PETSc từ bất kỳ ngôn ngữ nào bạn nên xem xét.
Hiệu suất và khả năng mở rộng dữ liệu lớn
Các mô hình lập trình song song duy nhất bạn đề cập là dựa trên bộ nhớ được chia sẻ, điều đó có nghĩa là bạn không xem xét phương pháp tính toán bộ nhớ phân tán (dựa trên thông điệp) dựa trên MPI. Theo kinh nghiệm của tôi, việc viết mã có tỷ lệ tốt hơn rất nhiều so với hàng chục lõi sử dụng giải pháp bộ nhớ phân tán sẽ dễ dàng hơn nhiều. Hầu như tất cả các "cụm" Đại học đều dựa trên MPI ngày nay, các máy có bộ nhớ chia sẻ lớn rất đắt tiền và tương ứng là rất hiếm. Bạn nên xem xét MPI cho cách tiếp cận của bạn, nhưng lời khuyên của tôi sẽ được áp dụng bất kể mô hình lập trình bạn chọn.
Liên quan đến hiệu suất trên nút, nếu bạn đang tự viết các thói quen số, thì dễ nhất để có được hiệu suất nối tiếp tốt trong Fortran. Nếu bạn có một chút kinh nghiệm về C, C ++ hoặc Python, bạn có thể có hiệu suất rất tương đương (C và C ++ đã chết ngay cả với Fortran, Python và MATLAB chỉ mất khoảng 25% thời gian mà không cần nhiều nỗ lực). MATLAB thực hiện điều này thông qua trình biên dịch JIT và biểu thức đại số tuyến tính rất tốt. Bạn có thể sẽ cần phải sử dụng Cython, numpy, numexpr hoặc nhúng các hạt nhân số để có được hiệu năng được yêu cầu từ Python. Tôi không thể nhận xét về hiệu suất của Java, vì tôi không biết rõ ngôn ngữ này, nhưng tôi nghi ngờ nó không xa Python nếu được viết bởi một chuyên gia.
Một lưu ý về giao diện
Tôi hy vọng tôi đã thuyết phục bạn rằng bạn sẽ có thể làm mọi thứ bạn muốn bằng bất kỳ ngôn ngữ lập trình nào bạn đang xem xét. Nếu bạn đang sử dụng Java, các giao diện C sẽ có một chút thách thức. Python có hỗ trợ giao diện C và Fortran tuyệt vời thông qua ctypes, Cython và f2py. LAPACK đã được bọc và có sẵn thông qua scipy. MATLAB có tất cả các chức năng bạn cần trong các thư viện riêng, nhưng không dễ mở rộng hoặc đặc biệt dễ chạy trên các cụm. Java có thể hỗ trợ các giao diện C và Fortran với JNI , nhưng không được tìm thấy phổ biến trên các cụm và trong phần mềm song song cho tính toán khoa học.
Bảo trì
Rất nhiều điều này sẽ đi vào hương vị cá nhân, nhưng sự đồng thuận chung về khả năng bảo trì là bạn muốn giảm thiểu số lượng dòng mã trong phần mềm của mình, viết mã mô-đun với giao diện được xác định rõ và cho phần mềm tính toán, cung cấp kiểm tra xác minh tính đúng đắn và chức năng của việc thực hiện.
sự giới thiệu
Cá nhân tôi đã có rất nhiều may mắn với Python và tôi giới thiệu nó cho nhiều dự án tính toán. Tôi nghĩ bạn nên mạnh mẽ xem xét nó cho dự án của bạn. Python và MATLAB có lẽ là ngôn ngữ biểu cảm nhất cho tính toán khoa học. Bạn có thể dễ dàng giao tiếp Python với bất kỳ ngôn ngữ lập trình nào khác, bạn có thể sử dụng f2py để bao bọc triển khai Fortran hiện tại của bạn và viết lại từng phần bất kỳ phần nào bạn muốn trong Python trong khi xác minh rằng bạn đang duy trì chức năng. Tại thời điểm này, tôi sẽ đề xuất kết hợp triển khai Python 2.7 chính thức với scipy . Bạn có thể bắt đầu rất dễ dàng với ngăn xếp này từ Phân phối Python có sẵn miễn phí .
Bạn cũng có thể làm hầu hết điều này trong C, C ++ hoặc Fortran. C và C ++ là những ngôn ngữ rất hấp dẫn đối với các nhà phát triển chuyên nghiệp có nhiều kinh nghiệm, nhưng thường xuyên vấp phải các nhà phát triển mới và theo nghĩa này có lẽ không phải là một ý tưởng tuyệt vời cho một mã học thuật hơn. Fortran và MATLAB là phổ biến trong tính toán học thuật, nhưng yếu về cấu trúc dữ liệu nâng cao và tính biểu cảm mà Python cung cấp (ví dụ, nghĩ về một đối tượng dict Python).
Câu hỏi liên quan: