C ++ hiện đại trong điện toán khoa học?


22

Tôi đang tìm kiếm sách hoặc bài viết, hoặc bài đăng trên blog, hoặc bất kỳ tài liệu được xuất bản nào nói chung, đề cập cụ thể đến việc sử dụng các tính năng hiện đại của C ++ (di chuyển ngữ nghĩa, STL, lặp, đánh giá lười biếng, v.v.) trong điện toán khoa học. Bạn có thể đề nghị bất kỳ?

Tôi nghĩ rằng các tính năng mới này sẽ giúp việc viết mã hiệu quả dễ dàng hơn, nhưng tôi không tìm thấy các ví dụ thực tế. Hầu hết các tài liệu tham khảo mà tôi đã đọc là về việc sử dụng chung C ++ và không chứa các ví dụ về tính toán khoa học. Vì vậy, tôi đang tìm kiếm các ví dụ (không phải là ví dụ về mã sản xuất, chỉ là các ví dụ sư phạm, ở cấp độ, nói, Công thức toán số) của mã máy tính khoa học sử dụng các tính năng hiện đại của C ++.

Lưu ý rằng tôi không hỏi về các thư viện sử dụng các tính năng này. Tôi đang hỏi về các bài báo / sách / vv giải thích làm thế nào tôi có thể khai thác các tính năng này trong điện toán khoa học.


2
Bạn đang hỏi về "hiện đại" theo nghĩa được hiểu là cách thực hành tốt nhất hiện nay (so với 20 năm trước) hay "hiện đại" theo nghĩa cụ thể của C ++ 11/14?
Kirill

2
@Kirill Tôi đoán đó là cả hai. Chủ yếu là một cái gì đó sử dụng C ++ 11/14, nhưng theo các thực tiễn tốt nhất.
vẫy gọi

Câu trả lời:


11

Hai ví dụ về các thư viện sử dụng các cấu trúc C ++ hiện đại:

  • Cả thư viện eigen và armadillo (đại số tuyến tính) đều sử dụng một số cấu trúc C ++ hiện đại. Chẳng hạn, họ sử dụng cả hai mẫu biểu thức để đơn giản hóa các biểu thức số học và đôi khi có thể loại bỏ một số thời gian:

http: // eigen.tuxf Family.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (trình bày về các mẫu biểu thức trong Armadillo)

  • Thư viện CGAL (hình học tính toán) sử dụng nhiều tính năng C ++ hiện đại (nó sử dụng rất nhiều mẫu và chuyên môn):

http://www.cgal.org

Chú thích:

cấu trúc C ++ hiện đại rất thanh lịch và có thể rất thú vị khi sử dụng. Đó là cả một điểm mạnh và một điểm yếu: khi sử dụng chúng, thật hấp dẫn khi thêm một vài lớp mẫu / chuyên môn / lambdas mà cuối cùng đôi khi bạn nhận được nhiều "quản trị" hơn mã hiệu quả trong chương trình (nói cách khác, chương trình của bạn "nói" về vấn đề nhiều hơn là mô tả giải pháp). Tìm sự cân bằng phù hợp là rất tinh tế. Kết luận: người ta cần theo dõi sự phát triển của tỷ lệ "tín hiệu / nhiễu" trong mã bằng cách đo :

  • Có bao nhiêu dòng mã trong chương trình?
  • Có bao nhiêu lớp / mẫu?
  • thời gian chạy
  • tiêu thụ bộ nhớ?

Tất cả mọi thứ làm tăng hai cái đầu tiên có thể được coi là một chi phí (bởi vì nó có thể làm cho chương trình khó hiểu và duy trì hơn), mọi thứ làm giảm hai cái cuối cùng là một lợi ích .

Ví dụ, giới thiệu một khái niệm trừu tượng (một lớp học ảo hoặc một template) mã yếu tố có thể và làm cho chương trình đơn giản ( tăng ), nhưng nếu nó không bao giờ derivated / instanced một lần duy nhất, sau đó nó giới thiệu một chi phí không có liên quan tăng (một lần nữa nó được tinh tế bởi vì lợi ích có thể đến sau trong quá trình phát triển của chương trình trong tương lai, do đó không có "quy tắc vàng").

Sự thoải mái của lập trình viên cũng là một yếu tố quan trọng cần được tính đến trong số dư chi phí / lợi nhuận: với quá nhiều mẫu, thời gian biên dịch có thể tăng đáng kể và thông báo lỗi trở nên khó phân tích.

Xem thêm

Ở mức độ nào thì chung và lập trình meta sử dụng các mẫu C ++ hữu ích trong khoa học tính toán?


2
Tương tự với Armadillo cũng như Eigen, phải không?
dr.blochwave

Vâng, bạn đã đúng (Tôi vừa kiểm tra tài liệu của Armadillo, tôi ít quen với nó hơn). Tôi đang chỉnh sửa bài viết.
BrunoLevy

1
Thời gian biên dịch dài hơn là một chi phí đáng nói khác.
Kirill

@Kirill, vâng điểm tốt (đã chỉnh sửa bài để đề cập đến nó), cảm ơn.
BrunoLevy

10

Tôi sẽ đề nghị xem qua Deal.II. Nó sử dụng STL, nó là các trình vòng lặp riêng, các con trỏ được chia sẻ, v.v.

Các bộ giải tuyến tính khác nhau có thể sử dụng các ma trận khác nhau do cách nó được thiết kế. Tôi đã không bắt gặp bất kỳ việc sử dụng ngữ nghĩa di chuyển, nhưng điều đó không có nghĩa là họ không có ở đó. Đây là một liên kết.


Ngoài ra OpenFOAM - sử dụng khá nhiều mẫu.
tpg2114

1
deal.II không sử dụng ngữ nghĩa di chuyển (vì nó không sử dụng các tính năng ngôn ngữ C ++ 11 - nhưng nó sử dụng các tính năng thư viện C ++ 11 có các thay thế trong BOOST cho các trình biên dịch cũ hơn). Mặc dù vậy, nó sử dụng khá nhiều tính năng ngôn ngữ C ++ khác, bao gồm tất cả những tính năng được hỏi trong câu hỏi ban đầu.
Wolfgang Bangerth

Dường như không dễ để nhìn vào một thư viện lớn một cách chi tiết.
Michael

7

Các HPX thư viện tận dụng nặng của một loạt các C ++ 11 tính năng như nhà xây dựng di chuyển và cũng đang đặt mục tiêu trở thành một thực hiện đầy đủ của N4409 (Dự thảo làm việc, Thông số kỹ thuật cho C ++ Extensions cho Parallelism).

Họ có một danh sách các ấn phẩm trên trang web của họ bao gồm một số ví dụ về việc sử dụng thư viện để tăng tốc tính toán khoa học. Ngoài ra còn có cuộc thảo luận thú vị về thư viện và nó sử dụng C ++ hiện đại trong tập CppCast này .


Chào mừng bạn đến với scicomp.se! Nếu bạn thêm liên kết hoặc trích dẫn một số bài viết / sách / bài đăng trên blog thảo luận về thư viện này để tính toán khoa học, tôi sẽ vui vẻ nâng cao câu trả lời của bạn!
hardmath

5

Tôi đề nghị xem qua Khoa học và Kỹ thuật C ++: Giới thiệu về các kỹ thuật và ví dụ nâng cao của Barton và Nackmann .

Việc cuốn sách này được xuất bản năm 1994 khiến nó dường như vi phạm tiêu chí "kỹ thuật hiện đại" của bạn. Tuy nhiên, Barton và Nackmann là người tiên phong trong những gì có thể với các mẫu C ++ vào thời điểm đó và các kỹ thuật cải tiến mà họ nghĩ ra để đạt được hiệu suất tốt vẫn được sử dụng trong các thư viện lớp C ++ mới nhất.


4

Bên cạnh deal.ii (đã được đề xuất ở đây), bạn cũng có thể xem thư viện Dune sử dụng rộng rãi một số tính năng C ++ nâng cao như siêu lập trình mẫu, phạm vi lặp, con trỏ thông minh, v.v. Ngoài ra còn có một bản in gần đây của Joachim Schöberl, nhận xét về việc sử dụng các tính năng C ++ 11, như các hàm lambda, để đơn giản hóa việc thực hiện các phương thức phần tử hữu hạn trong NGSolve. Tăng cườngcũng có một số thư viện liên quan đến lập trình khoa học như uBLAS, Graph, v.v. Tôi đoán trong hầu hết các thư viện này bạn sẽ tìm thấy những ví dụ hay về việc sử dụng C ++ hiện đại. Tuy nhiên, lưu ý rằng bạn cũng có thể gặp phải các ví dụ xấu về việc sử dụng C ++ tiên tiến / hiện đại. Trong một số trường hợp, trong khi đọc mã / tài liệu, tôi có cảm giác rằng đôi khi mọi thứ được khái quát quá mức vì mục đích thể hiện các kỹ năng nâng cao như TMP, trong đó 99% tất cả các ứng dụng tiềm năng triển khai đơn giản hơn cũng sẽ làm được việc làm.


3

Cuốn sách "Hướng dẫn tính toán khoa học trong C ++" của Pitt-Francis & Whiteley được viết để trả lời chính xác loại điều này (sử dụng STL, iterators, v.v.) nó có sẵn thông qua Amazon hoặc dưới dạng Sách điện tử từ nhà xuất bản .

Tiết lộ - Tôi làm việc trong cùng nhóm nghiên cứu với các tác giả, nhưng vẫn nghĩ rằng đó là một nguồn lực rất tốt cho việc này!


1

Tôi nghĩ rằng cuốn sách này rất phù hợp với bạn, cũng như đối với tôi: Khám phá C ++ hiện đại: Khóa học chuyên sâu dành cho các nhà khoa học, kỹ sư và lập trình viên (C ++ In-Depth) của Peter Gottschling đặc biệt nếu được sử dụng kết hợp với Nguyên tắc lập trình và thực hành sử dụng C ++ Phiên bản thứ 2 Bjarne Stroustrup. Người phát minh ra C ++. Cả hai nên cung cấp một nền tảng vững chắc để đứng trên.


0

Các thư viện Blaze cho đại số tuyến tính tận dụng nặng của C ++ 14 theo hình thức loại trở lại suy luận và đuôi. Các tính năng C ++ hiện đại khác đang được sử dụng là constexpr, các mẫu bí danh và toàn bộ rất nhiều mẫu siêu lập trình với biểu thức SFINAE.

Bạn cũng có thể sử dụng danh sách khởi tạo cho vectơ và ma trận của mình, vd

blaze::DynamicVector<int> x{ 4, -1, 3 };

Để biết thêm chi tiết xem trang bắt đầu của họ .

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.