Lập trình chức năng và tính toán khoa học


42

Tôi xin lỗi nếu đây là một câu hỏi mơ hồ, nhưng đây là:

Trong vài năm qua, lập trình chức năng đã nhận được rất nhiều sự chú ý trong cộng đồng Kỹ thuật phần mềm. Nhiều người đã bắt đầu sử dụng các ngôn ngữ như Scala và Haskell và khẳng định thành công so với các ngôn ngữ lập trình và mô hình khác. Câu hỏi của tôi là: như các chuyên gia điện toán / khoa học hiệu năng cao, chúng ta có nên quan tâm đến lập trình chức năng không? Chúng ta có nên tham gia vào cuộc cách mạng nhỏ này không?

Những ưu và nhược điểm của lập trình chức năng trong lĩnh vực công việc SciComp là gì?


2
Tại sao cố tình đặt mình trong một chiếc áo khoác thẳng? Tác dụng phụ là một công cụ; nó là điều cần thiết cho các ứng dụng trong thế giới thực. Nếu bạn muốn hiệu quả cpu và bộ nhớ, các ngôn ngữ lập trình chức năng sẽ không có trong radar của tôi. Các chương trình cần xác minh tự động / kiểm tra tính chính xác (ví dụ: để sử dụng trong cơ sở nuke?), Thì có thể có trường hợp.
tập xếp hàng

Câu trả lời:


34

Tôi chỉ mới thực hiện một chút về lập trình chức năng, vì vậy hãy trả lời câu hỏi này bằng một hạt muối.

Ưu điểm:

  • Lập trình hàm có vẻ rất toán học; đó là một mô hình hay để diễn đạt một số khái niệm toán học
  • Có những thư viện tốt cho những thứ như xác minh chính thức các chương trình và định lý chứng minh, vì vậy có thể viết các chương trình lý do về các chương trình - khía cạnh này tốt cho khả năng tái tạo
  • Bạn có thể thực hiện lập trình chức năng trong Python và C ++ thông qua các biểu thức lambda; bạn cũng có thể lập trình chức năng trong Julia và Mathematica
  • Không nhiều người sử dụng nó, vì vậy bạn có thể là người tiên phong. Giống như những người đầu tiên sử dụng MATLAB, Python, R và bây giờ là Julia, cần phải sớm có những người áp dụng lập trình chức năng cho nó để bắt kịp

Nhược điểm:

  • Các ngôn ngữ thường được coi là ngôn ngữ lập trình chức năng, như Haskell, OCaml (và các phương ngữ ML khác) và Lisp thường được coi là chậm so với các ngôn ngữ được sử dụng cho tính toán khoa học quan trọng về hiệu năng. OCaml là, tốt nhất, khoảng một nửa nhanh như C.
  • Các ngôn ngữ này thiếu cơ sở hạ tầng thư viện so với các ngôn ngữ thường được sử dụng trong khoa học tính toán (Fortran, C, C ++, Python); nếu bạn muốn giải quyết PDE, cách dễ dàng hơn để thực hiện bằng ngôn ngữ được sử dụng phổ biến hơn trong khoa học tính toán so với ngôn ngữ không.
  • Không có nhiều cộng đồng khoa học tính toán sử dụng các ngôn ngữ lập trình chức năng như sử dụng các ngôn ngữ thủ tục, điều đó có nghĩa là bạn sẽ không nhận được nhiều sự giúp đỡ khi học nó hoặc gỡ lỗi nó, và mọi người có thể sẽ cung cấp cho bạn tào lao sử dụng nó (dù bạn có xứng đáng hay không)
  • Phong cách lập trình chức năng khác với phong cách được sử dụng trong lập trình thủ tục, thường được dạy trong các lớp khoa học máy tính giới thiệu và trong các lớp học "MATLAB dành cho các nhà khoa học và kỹ sư"

Tôi nghĩ rằng nhiều sự phản đối trong phần "Nhược điểm" có thể được khắc phục. Là một điểm thảo luận phổ biến trên trang web Stack Exchange này, thời gian của nhà phát triển quan trọng hơn thời gian thực hiện. Ngay cả khi các ngôn ngữ lập trình chức năng chậm, nếu các phần quan trọng về hiệu năng có thể được ủy quyền cho ngôn ngữ thủ tục nhanh hơn và nếu tăng năng suất có thể được thể hiện thông qua phát triển ứng dụng nhanh, thì chúng có thể đáng sử dụng. Điều đáng chú ý ở đây là các chương trình được triển khai bằng Python thuần túy, MATLAB thuần túy và R thuần túy chậm hơn đáng kể so với việc triển khai các chương trình tương tự trong C, C ++ hoặc Fortran. Các ngôn ngữ như Python, MATLAB và R rất phổ biến vì chúng đánh đổi tốc độ thực thi cho năng suất và thậm chí sau đó, Cả Python và MATLAB đều có các phương tiện để triển khai các giao diện cho mã được biên dịch trong C hoặc C ++ để có thể triển khai mã quan trọng về hiệu năng để thực thi nhanh chóng. Hầu hết các ngôn ngữ có giao diện chức năng nước ngoài với C, sẽ đủ để giao tiếp với hầu hết các thư viện quan tâm cho các nhà khoa học tính toán.

Bạn có nên quan tâm đến lập trình chức năng?

Đó là tất cả phụ thuộc vào những gì bạn nghĩ là mát mẻ. Nếu bạn là kiểu người sẵn sàng tham gia hội nghị và bạn sẵn sàng trải qua các câu chuyện truyền giáo cho mọi người về những đức tính của bất cứ điều gì bạn muốn làm với lập trình chức năng, tôi sẽ nói rằng hãy làm điều đó . Tôi rất thích thấy mọi người làm những điều tuyệt vời với lập trình chức năng trong khoa học tính toán, nếu không vì lý do nào khác ngoài việc chứng minh tất cả những người không tán thành sai (và sẽ có rất nhiều người không tán thành). Nếu bạn không phải là loại người muốn để đối phó với một loạt các người hỏi bạn, "Tại sao trong địa ngục bạn đang sử dụng một ngôn ngữ lập trình chức năng thay vì (chèn ngôn ngữ lập trình thủ tục mà họ yêu thích ở đây)?", Sau đó tôi wouldn' t làm phiền

Đã có một số sử dụng ngôn ngữ lập trình chức năng cho công việc mô phỏng chuyên sâu. Công ty thương mại định lượng Jane Street sử dụng OCaml để mô hình hóa tài chính và thực hiện các chiến lược giao dịch của mình. OCaml cũng được sử dụng trong FFTW để tạo một số mã C được sử dụng trong thư viện. Liszt là một ngôn ngữ dành riêng cho miền được phát triển tại Stanford và được triển khai tại Scala, được sử dụng để giải quyết các PDE. Lập trình chức năng chắc chắn được sử dụng trong công nghiệp (không nhất thiết là trong khoa học tính toán); vẫn còn phải xem liệu nó sẽ cất cánh trong khoa học tính toán.


4
Tôi muốn đóng góp để thêm Pro và Con. Pro :: mã linh hoạt: vì mọi thứ đều là hàm, bạn luôn có thể gọi hàm đó bằng hàm khác; Điều này là vô cùng mạnh mẽ. Con :: khả năng đọc mã: mã lập trình chức năng thực sự khó đọc; ngay cả đối với (hầu hết) những người đã viết chúng. Bây giờ thậm chí tôi phải mất một thời gian để hiểu một số mã cũ mà tôi đã viết để giải quyết một số vấn đề PDE chung với B-splines trong Mathematica 6 tháng trước; Tôi luôn rút mã đó ra khi tôi muốn dọa một số đồng nghiệp ;-).
seb

4
Chỉ thêm vào mà tôi sẽ thêm là: Con :: tiêu thụ bộ nhớ . Rất nhiều sao chép phải được thực hiện để loại bỏ tác dụng phụ.
Matthew Emmett

1
@StefanSmith: (i) Tôi biết đôi khi nó được sử dụng trong nghiên cứu (ví dụ: Maxima là một CAS dựa trên Lisp); Ngoài ra, tôi không biết ra khỏi đầu của tôi. (ii) Không có ý tưởng. Phần lớn câu trả lời của tôi dựa trên bằng chứng giai thoại lượm lặt được từ những cuộc trò chuyện tôi đã có trong vài năm qua.
Geoff Oxberry

@seb, có vẻ như bạn đang mô tả các thuộc tính của các ngôn ngữ chức năng giống Lisp không áp dụng gần như với các ngôn ngữ chức năng giống như Haskell.
Đánh dấu S.

1
Bỏ phiếu lớn cho bình luận của @MatthewEmmett. Sao chép có thể rất tốn kém cho các tính toán hiệu suất cao.
Charles

10

Tôi có thể có một quan điểm độc đáo về điều này bởi vì tôi là một học viên HPC với nền tảng tính toán khoa học cũng như người dùng ngôn ngữ lập trình chức năng. Tôi không muốn đánh đồng HPC với tính toán khoa học, nhưng có sự giao thoa đáng kể, và đó là quan điểm tôi đưa ra khi trả lời điều này.

Hiện tại, ngôn ngữ chức năng dường như không được áp dụng trong HPC vì người dùng và khách hàng của HPC thực sự quan tâm đến việc đạt được hiệu suất cao nhất có thể. Đúng là khi mã được viết theo cách chức năng, nó tự nhiên phơi bày sự song song có thể bị khai thác, nhưng trong HPC là không đủ. Tính song song chỉ là một phần của câu đố để đạt được hiệu suất cao, bạn cũng phải tính đến một loạt các chi tiết kiến ​​trúc vi mô và việc này thường đòi hỏi phải có sự kiểm soát rất chi tiết đối với việc thực thi mã, điều khiển đó không có sẵn trong bất kỳ ngôn ngữ chức năng mà tôi biết.

Điều đó nói rằng, tôi có hy vọng cao điều này có thể thay đổi. Tôi đã nhận thấy một xu hướng mà các nhà nghiên cứu đang bắt đầu nhận ra rằng rất nhiều tối ưu hóa kiến ​​trúc vi mô này có thể được tự động hóa (ở một mức độ nào đó). Điều này đã tạo ra một vườn thú công nghệ trình biên dịch nguồn-nguồn trong đó người dùng nhập "đặc tả" tính toán mà họ muốn xảy ra và trình biên dịch đưa ra mã C hoặc Fortran để nhận ra rằng tính toán với tối ưu hóa và song song cần thiết để có hiệu quả sử dụng kiến ​​trúc đích. Ngẫu nhiên đây là những gì ngôn ngữ chức năng thích nghi tốt để làm: mô hình hóa và phân tích ngôn ngữ lập trình. Không phải ngẫu nhiên mà những người áp dụng chính các ngôn ngữ chức năng đầu tiên là các nhà phát triển trình biên dịch. Với một vài ngoại lệ đáng chú ý tôi chưa thấy điều này thực sự nắm giữ, nhưng các ý tưởng đã có,


8

Tôi muốn thêm một khía cạnh cho hai câu trả lời khác. Bỏ qua hệ sinh thái, lập trình chức năng cung cấp một cơ hội tuyệt vời để thực hiện song song như đa luồng hoặc điện toán phân tán. Các đặc tính bất biến vốn có của nó làm cho nó phù hợp với tính song song, nói chung là một nỗi đau thực sự trong * bleep * khi nói đến các ngôn ngữ bắt buộc.

Vì sự cải thiện về hiệu suất phần cứng trong những năm gần đây đã tập trung vào việc thêm lõi vào bộ xử lý thay vì đẩy tần số cao hơn, tính toán song song đang trở nên phổ biến hơn rất nhiều (tôi cá là tất cả các bạn đều biết điều này).

Một điều khác mà Geoff đề cập là thời gian của nhà phát triển thường quan trọng hơn thời gian thực hiện. Tôi làm việc cho một công ty xây dựng SaaS tính toán chuyên sâu và chúng tôi đã thực hiện một bài kiểm tra hiệu suất ban đầu khi bắt đầu, đưa C ++ so với Java. Chúng tôi thấy rằng C ++ cung cấp thời gian thực hiện cắt giảm khoảng 50% so với Java (điều này là cho hình học tính toán và các số liệu rất có thể sẽ thay đổi tùy thuộc vào ứng dụng), nhưng dù sao chúng tôi đã đi với Java vì tầm quan trọng của thời gian của nhà phát triển và hy vọng rằng tối ưu hóa và cải tiến hiệu suất phần cứng trong tương lai sẽ giúp chúng tôi đưa nó ra thị trường. Tôi có thể nói với sự tự tin rằng chúng tôi đã chọn khác, chúng tôi sẽ không kinh doanh.

Ok, nhưng Java không phải là ngôn ngữ lập trình chức năng, vậy bạn phải làm gì với bất cứ điều gì, bạn có thể hỏi. Chà, sau này khi chúng tôi sử dụng nhiều người đề xuất mô hình chức năng và vấp phải sự cần thiết của sự ngang hàng hóa, chúng tôi đã dần dần di chuyển các phần của hệ thống sang Scala, kết hợp các khía cạnh tích cực của lập trình chức năng với sức mạnh của mệnh lệnh và kết hợp tốt với Java. Nó đã giúp chúng tôi rất nhiều khi tăng hiệu năng của hệ thống của chúng tôi với sự đau đầu tối thiểu và có thể sẽ tiếp tục gặt hái lợi ích từ việc tăng hiệu suất hơn nữa trong kinh doanh phần cứng khi có nhiều lõi được đưa vào bộ xử lý vào ngày mai.

Lưu ý rằng tôi hoàn toàn đồng ý với những khuyết điểm được đề cập trong các câu trả lời khác, nhưng tôi nghĩ rằng việc tạo điều kiện thực hiện song song là một chuyên gia mạnh mẽ đến mức nó không thể không được đề cập.


8

Geoff đã đưa ra một cái nhìn tổng quan tốt về những lý do mà tôi có ít bổ sung ngoài việc nhấn mạnh một trong những điểm của ông: hệ sinh thái. Cho dù bạn đang ủng hộ lập trình chức năng hay bất kỳ mô hình nào khác, một trong những câu hỏi quan trọng bạn phải giải quyết là có một số lượng phần mềm đáng kinh ngạc mà mọi người khác có thể xây dựng khi bạn phải viết lại. Ví dụ là MPI, PETSc hoặc Trilinos cho đại số tuyến tính hoặc bất kỳ thư viện phần tử hữu hạn nào - tất cả được viết bằng C hoặc C ++. Có một lượng quán tính rất lớn trong hệ thống, có thể không phải vì mọi người nghĩ rằng C / C ++ trên thực tế là ngôn ngữ tốt nhất để viết phần mềm tính toán, nhưng vì nhiều người đã dành nhiều năm để tạo ra thứ gì đó hữu ích cho có nhiều người.

Tôi nghĩ rằng hầu hết những người tính toán sẽ đồng ý rằng có rất nhiều giá trị trong việc thử các ngôn ngữ lập trình mới và đánh giá sự phù hợp của họ đối với vấn đề này. Nhưng đó sẽ là một thời gian khó khăn và cô đơn vì bạn sẽ không thể tạo ra kết quả cạnh tranh với những gì mọi người đang làm. Nó cũng có thể mang lại cho bạn danh tiếng như một người bắt đầu bước tiếp theo đến một mô hình lập trình khác. Này, chỉ mất 15 năm để C ++ thay thế Fortran!


6
Và C ++, tốt nhất, chỉ là một nửa để thực sự thay thế Fortran trong không gian này. Chúng tôi thấy các mã mới ở Fortran mọi lúc và rất nhiều di sản để khởi động!
Bill Barth

2
C ++ (không giống như Fortran) quá phức tạp để vừa học vừa sử dụng. Các mã khoa học mã nguồn mở mới vẫn đang được viết ở Fortran. Đáng chú ý trong khu vực của tôi (Khoa học Trái đất) là PFlotran, SPECFEM3D, GeoFEM, v.v. Ditto cho hầu hết tất cả các mã mới trong khoa học Khí quyển. IMHO C ++ thậm chí còn không thay thế những gì nó được cho là sẽ thay thế (C).
stali

1
Bạn nên cho Fortran dùng thử Wolfgang, đây là một ngôn ngữ tuyệt vời, dễ học / viết và tốc độ sẽ không làm bạn thất vọng.
Ondřej Čertík

3
Tôi không quan tâm đến tốc độ (tốt, tôi làm một chút, nhưng đó không phải là sự cân nhắc bao quát nó dành cho người khác). Điều quan trọng với tôi là tôi mất bao lâu để lập trình một thuật toán phức tạp và Fortran thua cuộc ở mặt trận này vì ngôn ngữ quá đơn giản. Không có thư viện chuẩn để nói, không có mẫu nào cho phép mã chung, hướng đối tượng nửa khẳng định. Fortran đơn giản không phải là ngôn ngữ của tôi và thật lòng mà nói, nó cũng không dành cho hầu hết những người làm máy tính khoa học khác.
Wolfgang Bangerth

4
@StefanSmith: Vâng. Nó có thể là một ý tưởng phòng thủ trong điện toán khoa học (nơi tôi vẫn sẽ cho rằng nó đã lỗi thời và không hiệu quả). Nó chắc chắn không thể phòng thủ được như liên quan đến giáo dục của sinh viên - bởi vì phần lớn sinh viên của chúng tôi rời khỏi học viện và trong thực tế không ai sử dụng Fortran.
Wolfgang Bangerth

7

Tóm tắt nhanh là

  1. Điện toán số sử dụng khả năng biến đổi / tác dụng phụ để đạt được hầu hết các tốc độ và giảm phân bổ (nhiều cấu trúc lập trình chức năng có dữ liệu bất biến)
  2. Đánh giá lười biếng có thể được thô để sử dụng với mã số.
  3. Hoặc bạn đang phát triển một gói trong đó giảm xuống mức thấp nhất cho hiệu suất thực sự quan trọng (C / Fortran hoặc bây giờ là Julia) (trong đó bạn cũng có thể chỉnh sửa mã trình biên dịch khi cần thiết) hoặc bạn đang viết một tập lệnh sử dụng các thư viện nhanh này vì vậy bạn chủ yếu quan tâm đến thời gian phát triển (và vì vậy bạn chọn Julia / MATLAB / Python / R). Các ngôn ngữ chức năng có xu hướng ngồi ở một khu vực giữa kỳ lạ, hữu ích trong các ngành khác, nhưng không hữu ích ở đây.
  4. xnxn+1

Những sự thật này cùng nhau làm cho lập trình chức năng dường như không cần thiết đối với hầu hết người dùng.


+1, nhưng một điểm bổ sung cho điểm 3: Tôi nghĩ rằng các tính năng chức năng trong các ngôn ngữ cấp cao khá hữu ích và nhiều ưu điểm của các ngôn ngữ chức năng được đề cập trong các câu trả lời khác (ví dụ: song song dễ dàng) có xu hướng áp dụng cho kịch bản này.
Szabolcs

3

Tôi nghĩ thật thú vị khi lưu ý rằng việc sử dụng lập trình chức năng trong Khoa học tính toán không phải là mới. Ví dụ, bài báo này từ năm 1990 đã chỉ ra cách cải thiện hiệu suất của các chương trình số được viết bằng Lisp (có thể là ngôn ngữ lập trình chức năng sớm nhất) bằng cách sử dụng đánh giá một phần. Công trình này là một phần của chuỗi công cụ được sử dụng trong một bài báo năm 1992 của GJ Sussman ( danh tiếng SICP ) và J Wisdom, cung cấp bằng chứng bằng số về hành vi hỗn loạn của Hệ mặt trời . Thông tin chi tiết về phần cứng và phần mềm liên quan đến tính toán đó có thể được tìm thấy ở đây .


1

R là ngôn ngữ chức năng và cũng là ngôn ngữ thống kê (& bây giờ là Machine learning) và thực sự là ngôn ngữ số 1 để thống kê. Mặc dù đây không phải là ngôn ngữ HPC: nó không được sử dụng cho "bẻ số" truyền thống như mô phỏng vật lý, v.v. Nhưng nó có thể được thực hiện để chạy trên các cụm lớn (ví dụ thông qua MPI) để mô phỏng thống kê lớn (MCMC) cho việc học máy.

Mathematica cũng là một ngôn ngữ chức năng nhưng miền cốt lõi của nó là điện toán tượng trưng chứ không phải là điện toán số.

Trong Julia, bạn cũng có thể lập trình theo kiểu chức năng (bên cạnh thủ tục và hương vị của OO (đa công văn)) nhưng nó không thuần túy (các cấu trúc dữ liệu cơ sở đều có thể thay đổi (ngoại trừ tuples), mặc dù có một số thư viện không thay đổi Cấu trúc dữ liệu chức năng. Quan trọng hơn, nó chậm hơn nhiều so với kiểu thủ tục nên không được sử dụng nhiều.

Tôi sẽ không gọi Scala là ngôn ngữ chức năng mà là một đối tượng chức năng lai. Bạn có thể sử dụng nhiều khái niệm chức năng trong Scala. Scala rất quan trọng đối với điện toán đám mây vì Spark ( https://spark.apache.org/ ).

Lưu ý rằng Fortran hiện đại thực sự có một số yếu tố của lập trình chức năng: nó có ngữ nghĩa con trỏ nghiêm ngặt (không giống như C), bạn có thể có các hàm thuần túy (không có tác dụng phụ) (và đánh dấu như vậy) và bạn có thể có tính bất biến. Nó thậm chí còn có lập chỉ mục thông minh nơi bạn có thể chỉ định các điều kiện cho các chỉ số ma trận. Đây là truy vấn giống và thường chỉ được tìm thấy trong ngôn ngữ cấp cao như R của LINQ trong C # hoặc thông qua các hàm bộ lọc bậc cao hơn trong các ngôn ngữ chức năng. Vì vậy, Fortran hoàn toàn không tệ, thậm chí nó còn có một số tính năng khá hiện đại (ví dụ: đồng mảng) không được tìm thấy trong nhiều ngôn ngữ. Trên thực tế, trong các phiên bản tương lai của Fortran, tôi muốn thấy nhiều tính năng chức năng được thêm vào hơn là các tính năng OO (thường là như vậy) vì OO trong Fortran thực sự rất khó xử và xấu xí.


1

Ưu điểm là "công cụ" được tích hợp trong từng ngôn ngữ chức năng: Rất dễ lọc dữ liệu, rất dễ lặp lại dữ liệu và việc đưa ra giải pháp rõ ràng và ngắn gọn cho các vấn đề của bạn rất dễ dàng.

Con duy nhất là, bạn phải suy nghĩ về kiểu suy nghĩ mới này: Có thể mất một chút thời gian để tìm hiểu những gì bạn phải biết. Những người khác trong miền SciComp không thực sự sử dụng các ngôn ngữ đó, điều đó có nghĩa là bạn không thể nhận được nhiều sự hỗ trợ đó :(

Nếu bạn quan tâm đến ngôn ngữ chức năng-khoa học, tôi đã phát triển một https://ac1235.github.io


1

Dưới đây là những lập luận của tôi về lý do tại sao lập trình chức năng có thể , và nên được sử dụng cho khoa học tính toán. Những lợi ích là rất lớn, và những khuyết điểm sẽ nhanh chóng biến mất. Trong tâm trí tôi chỉ có một con:

Con : thiếu hỗ trợ ngôn ngữ trong C / C ++ / Fortran

Ít nhất là trong C ++, con lừa này đang biến mất - vì C ++ 14/17 đã thêm các phương tiện mạnh mẽ để hỗ trợ lập trình chức năng. Bạn có thể cần phải tự viết một số thư viện / mã hỗ trợ, nhưng ngôn ngữ sẽ là bạn của bạn. Ví dụ, đây là một thư viện (cảnh báo: plug) thực hiện các mảng đa chiều bất biến trong C ++: https://github.com/jzrake/ndarray-v2 .

Ngoài ra, đây là một liên kết đến một cuốn sách hay về lập trình chức năng trong C ++, mặc dù nó không tập trung vào các ứng dụng khoa học.

Dưới đây là tóm tắt của tôi về những gì tôi tin là chuyên nghiệp:

Ưu điểm :

  • Đúng
  • Hiểu được
  • Hiệu suất

Xét về tính đúng đắn , các chương trình chức năng là ràng nổi đặt ra : họ buộc bạn phải xác định đúng tình trạng tối thiểu của các biến vật lý của bạn, và chức năng mà những tiến bộ mà nhà nước về phía trước trong thời gian:

int main()
{
    auto state = initial_condition();

    while (should_continue(state))
    {
        state = advance(state);
        side_effects(state);
    }
    return 0;
}

Giải phương trình vi phân từng phần (hoặc ODE) là hoàn hảo cho lập trình hàm; bạn chỉ đang áp dụng một hàm thuần túy ( advance) cho giải pháp hiện tại để tạo ra hàm tiếp theo.

Theo kinh nghiệm của tôi, phần mềm mô phỏng vật lý thường là do gánh nặng quản lý nhà nước kém . Thông thường, mỗi giai đoạn của thuật toán hoạt động trên một số trạng thái được chia sẻ (có hiệu quả toàn cầu). Điều này gây khó khăn, hoặc thậm chí là không thể, để đảm bảo thứ tự hoạt động chính xác, khiến phần mềm dễ bị lỗi có thể biểu hiện là lỗi phân tách hoặc tệ hơn là các thuật ngữ lỗi không làm hỏng mã của bạn mà âm thầm làm tổn hại đến tính toàn vẹn của khoa học. đầu ra. Cố gắng quản lý trạng thái chia sẻ trong một mô phỏng vật lý cũng ức chế đa luồng - đó là một vấn đề cho tương lai, vì các siêu máy tính đang tiến tới số lượng lõi cao hơn và nhân rộng với MPI thường đạt tới ~ 100 nghìn nhiệm vụ. Ngược lại, lập trình chức năng làm cho song song bộ nhớ chia sẻ trở nên tầm thường, vì tính bất biến.

Hiệu năng cũng được cải thiện trong lập trình chức năng do đánh giá lười biếng các thuật toán (trong C ++, điều này có nghĩa là tạo ra nhiều loại tại thời gian biên dịch - thường là một loại cho mỗi ứng dụng của hàm). Nhưng nó làm giảm chi phí truy cập và phân bổ bộ nhớ, cũng như loại bỏ công văn ảo - cho phép trình biên dịch tối ưu hóa toàn bộ thuật toán bằng cách nhìn thấy tất cả các đối tượng hàm bao gồm nó. Trong thực tế, bạn sẽ thử nghiệm các cách sắp xếp khác nhau của các điểm đánh giá (trong đó kết quả thuật toán được lưu vào bộ đệm) để tối ưu hóa việc sử dụng CPU so với phân bổ bộ nhớ. Điều này khá dễ dàng do tính địa phương cao (xem ví dụ bên dưới) của các giai đoạn thuật toán so với những gì bạn thường thấy trong một mô-đun hoặc mã dựa trên lớp.

Các chương trình chức năng dễ hiểu hơn khi chúng tầm thường hóa trạng thái vật lý. Điều đó không có nghĩa là cú pháp của họ dễ hiểu bởi tất cả các đồng nghiệp của bạn! Các tác giả nên cẩn thận sử dụng các hàm có tên tốt và các nhà nghiên cứu nói chung nên làm quen với việc nhìn thấy các thuật toán được thể hiện theo chức năng hơn là theo thủ tục. Tôi sẽ thừa nhận rằng sự vắng mặt của các cấu trúc điều khiển có thể gây khó khăn cho một số người, nhưng tôi không nghĩ rằng điều đó sẽ ngăn chúng ta đi vào tương lai có thể làm khoa học chất lượng tốt hơn trên máy tính.

Dưới đây là một advancehàm mẫu , được điều chỉnh từ mã khối lượng hữu hạn bằng cách sử dụng ndarray-v2gói. Lưu ý các to_sharednhà khai thác - đây là những điểm đánh giá tôi đã ám chỉ trước đó.

auto advance(const solution_state_t& state)
{
    auto dt = determine_time_step_size(state);
    auto du = state.u
    | divide(state.vertices | volume_from_vertices)
    | nd::map(recover_primitive)
    | extrapolate_boundary_on_axis(0)
    | nd::to_shared()
    | compute_intercell_flux(0)
    | nd::to_shared()
    | nd::difference_on_axis(0)
    | nd::multiply(-dt * mara::make_area(1.0));

    return solution_state_t {
        state.time + dt,
        state.iteration + 1,
        state.vertices,
        state.u + du | nd::to_shared() };
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.