it-swarm-vi.com

Ngôn ngữ lập trình được sử dụng nhiều nhất trong điện toán hiệu năng cao là gì? Và tại sao?

Tôi tin rằng rất nhiều Fortran được sử dụng trong HPC, nhưng không chắc đó chỉ là lý do di sản.

Các tính năng của các ngôn ngữ lập trình hiện đại như thu gom rác hoặc đa hình thời gian chạy không phù hợp với HPC vì tốc độ rất quan trọng nên không chắc chắn C # hoặc Java hoặc C++ xuất hiện ở đâu.

Có suy nghĩ gì không?

25
Fanatic23

Tôi đã thấy rất nhiều Java được sử dụng cho HPC trong các khu vực nơi (1) có ít mã kế thừa và (2) thời gian phát triển và vấn đề chất lượng mã. Các lĩnh vực ứng dụng điển hình là tài chính, khai thác dữ liệu hoặc tin học sinh học.

Nó thực sự phụ thuộc vào ứng dụng (có sự sống bên ngoài đại số tuyến tính), nhưng hiệu năng của các JVM gần đây thường ngang bằng với mã C. Đôi khi nhanh hơn khi JVM có thể thực hiện trong tối ưu hóa thông minh thời gian chạy mà trình biên dịch tĩnh (C, Fortran) không thể làm được. Và chắc chắn nhanh hơn khi có rất nhiều tính toán tượng trưng.

Với một lượng thời gian cố định để phát triển chương trình, kết quả Java luôn nhanh hơn mã C. HPC trong Java chắc chắn có ý nghĩa khi mã được phát triển hoặc sửa đổi thường xuyên. Một tính năng quan trọng khác là tính di động của mã trên phần cứng khác nhau.

Bạn sẽ tìm thấy tài liệu tham khảo trong http://ateji.blogspot.com/2010/09/Java-for-high-performance-computing.html

Về giả định của Fortran rằng hai địa chỉ là duy nhất, chúng tôi đang nghiên cứu một công cụ phân tích tĩnh sẽ cho phép tối ưu hóa mã tương tự cho các ngôn ngữ cấp cao, nhưng không có bit "Những điều tồi tệ có thể xảy ra". Liên hệ với tôi nếu quan tâm.

11
Patrick Viry

Trong những năm kinh nghiệm của tôi, cho đến 5 năm trước, đó luôn là Fortran và C. Cái nào phụ thuộc chủ yếu vào việc mọi người đến từ kỹ thuật hay nhiều hơn từ trường tư tưởng CS (Tôi không biết làm thế nào để đặt cái này tốt hơn, okey ?: -)

Trong những gì chúng tôi đã làm, Fortran hầu như chỉ được sử dụng.

Từ những gì tôi đọc được ngày hôm nay, với các bản cập nhật mới cho Tiêu chuẩn F2003/08 và với sự ra mắt của Co-Arrays, nó dường như đang lấy lại được động lực.

Ngoài ra, một, nếu không phải là một bài viết hơi thiên vị - Ngôn ngữ lập trình HPC lý tưởng

31
Rook

Tôi nghĩ đối với bàn đạp thực sự cho kim loại, sự lựa chọn thực sự duy nhất là Fortran. Lý do là điều quan trọng nhất đối với việc khai thác ILP cấp thấp (Parallism cấp độ hướng dẫn) là định hướng địa chỉ bộ nhớ. Các quy tắc defacto trong Fortran cho phép trình biên dịch xác định rằng hai địa chỉ là duy nhất (và do đó thứ tự tải và lưu trữ, hoặc thậm chí các cửa hàng và cửa hàng có thể được thay thế mà không có nguy cơ tạo mã không chính xác). C để lại quá nhiều phạm vi cho các con trỏ chồng chéo cho trình biên dịch để trích xuất càng nhiều mức độ song song mức thấp từ mã.

Ngoài ra, căn chỉnh mảng, dòng bộ đệm w.r.t và ranh giới SSE/AVX rất quan trọng đối với việc tạo và thực hiện các vòng lặp hiệu quả. Nếu các mảng được truyền qua các khối chung, trình biên dịch/trình tải có thể đảm bảo rằng tất cả các mảng bắt đầu trên cùng một ranh giới căn chỉnh địa chỉ và có thể sử dụng các tải và lưu trữ SSE/AVX hiệu quả hơn. Phần cứng mới hơn có thể xử lý các truy cập bộ nhớ chưa được phân bổ, nhưng vì quyền truy cập bộ nhớ không được căn chỉnh đúng cách sử dụng một phần các dòng bộ đệm dẫn đến hiệu suất thấp hơn. Ngay cả khi một lập trình viên C sắp xếp đúng tất cả các mảng của mình, liệu có một cơ chế để truyền đạt điều này đến trình biên dịch không?

Tóm lại, hai vấn đề quan trọng nhất là sự độc lập của địa chỉ bộ nhớ và sự nhận biết của trình biên dịch rằng các cấu trúc dữ liệu được truy cập có cùng căn chỉnh "tự nhiên" mà phần cứng muốn. Cho đến nay Fortran thực hiện công việc tốt nhất trong hai nhiệm vụ đó.

16
Omega Centauri

Chỉ cần một số ghi chú giai thoại. Tôi đã không thực hiện bất kỳ tính toán hiệu suất cao bản thân mình.

Đối với các tính toán (crunching số), Fortran và C. Có, đó là vì lý do di sản:

  • Có sẵn nhiều mã nguồn và công thức nấu ăn trong miền.
  • Cả hai đều hỗ trợ MPI .
  • Cả hai ngôn ngữ được biên dịch.
  • Trình biên dịch cho cả hai ngôn ngữ được cung cấp bởi tất cả các hệ điều hành và nhà cung cấp HPC.
  • Trình biên dịch Vectorizing có sẵn.
  • Cả hai đều yêu cầu mức độ tinh chỉnh điên rồ để có hiệu suất cao khi được chuyển sang một cụm khác (kích thước bộ nhớ khác nhau, số lượng CPU, v.v.) [.__.]
    • Điều này thực sự giải thích tại sao mã nguồn mở là quan trọng: điều chỉnh là cần thiết, do đó công thức ban đầu phải được viết bằng ngôn ngữ tốt cho việc điều chỉnh thủ công.

Xu hướng hiện nay cho việc bẻ khóa số là viết các trình tạo chương trình tự động điều chỉnh mã nguồn để tối ưu hóa hiệu suất với các đặc điểm của cụm. Những máy phát điện này thường xuất ra C.

Xu hướng thứ hai là viết bằng một số phương ngữ chuyên biệt của C cho các GPU hoặc Cell BE cụ thể.

Đối với công việc không phải là số, chẳng hạn như các chương trình xử lý dữ liệu từ cơ sở dữ liệu (chứ không phải cơ sở dữ liệu), sẽ rẻ hơn nhiều khi chạy trên các cụm máy "hàng hóa" mà không có các thiết bị mạng tùy chỉnh đắt tiền. Điều này thường được gọi là "Tính toán thông lượng cao". Và Python là ngôn ngữ số 1 ở đây (sử dụng Bản đồ thu nhỏ nổi tiếng). Trước Python, các dự án xử lý hàng loạt có thể được viết bằng bất kỳ ngôn ngữ nào và thường được gửi bởi Condor .

15
rwong

Tôi đã làm việc với một số mã chuyên sâu tính toán RẤT trong (gasp!) C #.

Tôi đang xây dựng triển khai GPGPU của FDTD cho mô hình quang học. Trên một cụm nhỏ (128 bộ xử lý), nhiều mô phỏng của chúng tôi mất vài tuần để chạy. Tuy nhiên, việc triển khai GPU có xu hướng chạy nhanh hơn khoảng 50 lần - và đó là trên thẻ NVidia cấp độ người tiêu dùng. Chúng tôi hiện có một máy chủ với hai thẻ xử lý kép GTX295 (vài trăm lõi) và sẽ sớm nhận được một số Teslas.

Làm thế nào điều này liên quan đến ngôn ngữ của bạn? Theo cùng một cách mà mã FDTD C++ mà chúng tôi đã sử dụng trước đây bị ràng buộc bởi CPU, chúng bị ràng buộc bởi GPU, do đó, sự khác biệt về mã lực ( rất nhỏ ) của mã được quản lý và mã gốc không bao giờ đi vào chơi. Ứng dụng C # hoạt động như một dây dẫn - tải hạt nhân OpenCL, truyền dữ liệu đến và từ GPU, cung cấp giao diện người dùng, báo cáo, v.v. - tất cả các tác vụ gây khó khăn cho C++.

Trong những năm trước, sự khác biệt về hiệu năng giữa mã được quản lý và không được quản lý là đủ quan trọng đến mức đôi khi đáng để đưa ra mô hình đối tượng khủng khiếp của C++ để có thêm vài phần trăm tốc độ. Ngày nay, chi phí phát triển của C++ so với C # vượt xa lợi ích cho hầu hết các ứng dụng.

Ngoài ra, hầu hết sự khác biệt về hiệu suất của bạn sẽ không đến từ sự lựa chọn ngôn ngữ của bạn, mà từ kỹ năng của nhà phát triển của bạn. Vài tuần trước, tôi đã di chuyển một thao tác phân chia duy nhất từ ​​bên trong vòng lặp ba lần (lồng ngang mảng 3D), giúp giảm 15% thời gian thực hiện cho một miền tính toán nhất định. Đó là kết quả của kiến ​​trúc bộ xử lý: sự phân chia chậm, đó là một trong những khuôn mặt mà bạn chỉ cần chọn ở đâu đó.

4
3Dave

Fortran là phổ biến nhất, chủ yếu là do di sản (mọi người vẫn chạy mã cũ) và sự quen thuộc (hầu hết những người làm HPC không quen thuộc với các loại ngôn ngữ khác).

Các tính năng của các ngôn ngữ lập trình hiện đại như thu gom rác hoặc đa hình thời gian chạy không phù hợp với HPC vì tốc độ rất quan trọng nên không chắc chắn C # hoặc Java hoặc C++ xuất hiện ở đâu.

Điều đó không đúng nói chung. HPC cổ điển chủ yếu thực hiện đại số tuyến tính với các số chính xác của máy. Tuy nhiên, HPC hiện đại đang ngày càng sử dụng siêu máy tính cho nhiều loại giòn hơn, như tính toán tượng trưng với các biểu thức toán học tùy ý thay vì số chính xác của máy. Điều này đặt các đặc điểm khá khác nhau trên các công cụ bạn sử dụng và không có gì lạ khi sử dụng các ngôn ngữ lập trình khác ngoài Fortran vì việc tính toán biểu tượng có thể rất khó khăn nếu không có GC và các loại trình biên dịch tối ưu hóa khác như trình biên dịch khớp tối ưu hóa mẫu của OCaml.

Ví dụ: đọc bài báo này của Fischbacher và cộng sự nói rằng "các tác giả có lý do mạnh mẽ để tin rằng điều này có thể tốt là phép tính tượng trưng lớn nhất được thực hiện cho đến nay ".

3
Jon Harrop

Fortran, vì một số lý do tốt và một số lý do không tốt. Đối với môn toán nặng, một lý do chính đáng là có các thư viện rộng lớn (BLAS, LAPACK) của các chương trình con đã thử và đúng, tất cả được viết bằng Fortran (mặc dù chúng có thể được gọi từ C và C++).

Một lý do không chính đáng là lợi thế hiệu suất được cho là của Fortran so với C/C++. Trình tối ưu hóa là khá tốt và ít người hiểu rằng lợi ích của việc tối ưu hóa một đoạn mã tỷ lệ thuận với phần trăm thời gian bận rộn, trong hầu hết tất cả các mã gần như bằng không.

Một lý do không chính đáng khác là khoảng cách văn hóa giữa các lập trình viên CS và không CS. Các lập trình viên khoa học có xu hướng được dạy những thói quen xấu ở Fortran, và xem thường các lập trình viên CS và những thói quen xấu họ đã được dạy, và những người coi thường trước đây.

3
Mike Dunlavey

Về cơ bản, tất cả các chương trình thực hiện công việc bẻ khóa số vẫn là FORTRAN (blas cũ, lapack, arnoldi, v.v. vẫn là chương trình được sử dụng) ... Tuy nhiên, khi nói đến cấu trúc cấp cao hơn ... mọi người đang sử dụng ngày càng nhiều C++.

Sự phức tạp của mô phỏng liên quan đến mã lớn và để có được bất kỳ loại lợi ích nào từ việc viết một cái là làm cho nó có thể tái sử dụng. Ngoài ra, các khái niệm được sử dụng cũng trở nên rất phức tạp. Nó gần như điên rồ khi đại diện cho thông tin đó bằng cách sử dụng FORTRAN. Đó là nơi C++ xuất hiện vì nó vốn hỗ trợ Thiết kế hướng đối tượng. Tuy nhiên, đa hình thời gian chạy hiếm khi được ưa thích. Thay vào đó, mọi người hầu như luôn sử dụng Đa hình tĩnh (được triển khai trong C++ với lập trình meta mẫu)

Ngoài ra, bây giờ trình biên dịch thực sự tốt, do đó rất nhiều tối ưu hóa được dành cho trình biên dịch.

2
user27946

Có hai loại vấn đề cần được giải quyết trong các ứng dụng HPC: một là số lượng chính nó và thứ hai là quản lý các tính toán. Cái đầu tiên thường được tiếp cận với mã được viết bằng Fortran, C hoặc C++ vì tốc độ và vì thực tế là đã có rất nhiều thuật toán khoa học được viết bằng ngôn ngữ này. Việc chỉ đạo tính toán được thực hiện thuận tiện hơn trong các ngôn ngữ cấp cao hơn. Python là ngôn ngữ "keo" được lựa chọn để xử lý logic ứng dụng và các phần mở rộng cuộc gọi được triển khai bằng các ngôn ngữ được biên dịch. Java thường được sử dụng bởi các dự án quản lý mạng và điện toán phân tán là điều cần thiết.

1
j..