Nowoczesne C ++ w informatyce naukowej?


22

Szukam książek lub artykułów, postów na blogu lub innych opublikowanych materiałów, które odnoszą się konkretnie do wykorzystania nowoczesnych funkcji C ++ (semantyka ruchu, STL, iteratory, leniwa ocena itp.) W informatyce naukowej. Czy możesz coś zasugerować?

Myślę, że te nowe funkcje ułatwią pisanie wydajnego kodu, ale nie znalazłem prawdziwych przykładów. Większość referencji, które przeczytałem, dotyczy ogólnych zastosowań C ++ i nie zawiera przykładów obliczeń naukowych. Szukam więc przykładów (nie muszą to być przykłady kodu produkcyjnego, tylko przykłady pedagogiczne na poziomie, powiedzmy, Numerycznych przepisów) naukowego kodu komputerowego, wykorzystującego nowoczesne funkcje C ++.

Pamiętaj, że nie pytam o biblioteki korzystające z tych funkcji. Pytam o artykuły / książki / itp. Wyjaśniające, w jaki sposób mogę wykorzystać te funkcje w informatyce naukowej.


2
Czy pytasz o „nowoczesny” w rozumieniu tego, co jest obecnie uznawane za najlepszą praktykę (w porównaniu z 20 latami temu), czy „nowoczesny” w sensie konkretnie C ++ 11/14?
— Kirill,

2
@Kirill Chyba oba. Głównie coś, co wykorzystuje C ++ 11/14, ale przestrzega najlepszych praktyk.
— becko

Odpowiedzi:


11

Dwa przykłady bibliotek korzystających z nowoczesnych konstrukcji C ++:

  • Zarówno biblioteka własna, jak i pancernik (algebra liniowa) używają kilku nowoczesnych konstrukcji C ++. Na przykład używają obu szablonów wyrażeń, aby uprościć wyrażenia arytmetyczne, a czasem mogą wyeliminować niektóre elementy tymczasowe:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (prezentacja na szablonach wyrażeń w Armadillo)

  • Biblioteka CGAL (geometria obliczeniowa) wykorzystuje wiele nowoczesnych funkcji C ++ (intensywnie wykorzystuje szablony i specjalizacje):

http://www.cgal.org

Uwaga:

nowoczesne konstrukcje C ++ są bardzo eleganckie i mogą być bardzo przyjemne w użyciu. Jest to zarówno mocna strona, jak i słabość: przy ich użyciu tak kuszące jest dodanie kilku warstw szablonów / specjalizacji / lambdas, że w końcu czasem uzyskuje się więcej „administracji” niż skutecznego kodu w programie (innymi słowy, Twój program „mówi” więcej o problemie niż opisuje rozwiązanie). Znalezienie właściwej równowagi jest bardzo subtelne. Wniosek: należy śledzić ewolucję stosunku „sygnał / szum” w kodzie, mierząc :

  • ile wierszy kodu w programie?
  • ile klas / szablonów?
  • czas pracy?
  • zużycie pamięci?

Wszystko, co zwiększa pierwsze dwa, może być uważane za koszt (ponieważ może utrudniać zrozumienie i utrzymanie programu), wszystko, co zmniejsza ostatnie dwa, jest zyskiem .

Na przykład wprowadzenie abstrakcji (klasa wirtualna lub szablon) może uwzględniać kod i uprościć program ( wzmocnienie ), ale jeśli nigdy nie zostanie on wyprowadzony / wystąpi tylko raz, wówczas wprowadza koszt braku powiązanego zysku (ponownie jest to subtelne, ponieważ zysk może przyjść później w przyszłej ewolucji programu, dlatego nie ma „złotej reguły”).

Wygoda programisty jest również ważnym czynnikiem, który należy wziąć pod uwagę w bilansie kosztów i zysków: przy zbyt wielu szablonach czas kompilacji może znacznie wzrosnąć, a komunikaty o błędach stają się trudne do przeanalizowania.

Zobacz też

W jakim stopniu ogólne i metaprogramowanie przy użyciu szablonów C ++ jest przydatne w informatyce?


2
To samo dotyczy Armadillo i Eigen, prawda?
— dr.blochwave

Tak, masz rację (właśnie sprawdziłem dokumentację Armadillo, mniej ją znam). Edytuję post.
— BrunoLevy,

1
Dłuższy czas kompilacji to kolejny koszt, o którym warto wspomnieć.
— Kirill,

@Kirill, tak, dobra uwaga (zredagowałem post, żeby o tym wspomnieć), dzięki.
— BrunoLevy,

10

Proponuję rzucić okiem na Deal.II. Wykorzystuje STL, własne iteratory, wspólne wskaźniki itp.

Różne solwery liniowe mogą wykorzystywać różne macierze ze względu na to, jak zostały zaprojektowane. Nie spotkałem się z żadnym zastosowaniem semantyki ruchu, ale to nie znaczy, że ich tam nie ma. Oto link.


Również OpenFOAM - dość szerokie wykorzystanie szablonów.
— tpg2114

1
deal.II nie używa semantyki przenoszenia (ponieważ powstrzymuje się od korzystania z funkcji języka C ++ 11 - ale korzysta z funkcji biblioteki C ++ 11, dla których istnieją zamienniki w BOOST dla starszych kompilatorów). Wykorzystuje jednak prawie każdą inną funkcję języka C ++, łącznie ze wszystkimi zadanymi w pierwotnym pytaniu.
— Wolfgang Bangerth,

Szczegółowe spojrzenie na dużą bibliotekę nie wydaje się łatwe.
— Michael

7

HPX biblioteka znaczący sposób korzysta z szeregu C ++ 11 cech, takich jak ruch i konstruktorów jest również dążenie do być pełna realizacja N4409 (projekt działa, Specyfikacji Technicznej dla C ++ rozszerzeń pod kątem równoległości).

Na swojej stronie znajduje się lista publikacji, która zawiera szereg przykładów wykorzystania biblioteki do przyspieszenia obliczeń naukowych. Jest też tak interesująca dyskusja na temat biblioteki i jej użycia nowoczesnego C ++ w tym odcinku CppCast .


Witamy w scicomp.se! Jeśli dodasz linki lub zacytujesz artykuły / książki / posty na blogu, które omawiają tę bibliotekę do obliczeń naukowych, z przyjemnością poprę twoją odpowiedź!
— hardmath

5

Proponuję rzucić okiem na C ++: Wprowadzenie do zaawansowanych technik i przykładów autorstwa Bartona i Nackmanna .

Fakt, że ta książka została opublikowana w 1994 r., Wydaje się naruszać twoje kryterium „nowoczesnych technik”. Jednak Barton i Nackmann byli wówczas w czołówce tego, co było możliwe dzięki szablonom C ++, a innowacyjne techniki opracowane w celu osiągnięcia dobrej wydajności są nadal stosowane w najnowszych bibliotekach klasy C ++.


4

Oprócz deal.ii (który został już tutaj zasugerowany) możesz również zajrzeć do biblioteki Dune, która szeroko wykorzystuje niektóre zaawansowane funkcje C ++, takie jak metaprogramowanie szablonów, zakresy iteratorów, inteligentne wskaźniki i tak dalej. Jest też najnowszy przedruk Joachima Schöberla, który komentuje użycie funkcji C ++ 11, takich jak na przykład funkcje lambda, w celu uproszczenia implementacji metod elementów skończonych w NGSolve. Podnieśćma także kilka bibliotek związanych z programowaniem naukowym, takich jak uBLAS, Graph itp. Myślę, że w większości tych bibliotek znajdziesz dobre przykłady współczesnego użycia C ++. Pamiętaj jednak, że możesz napotkać również złe przykłady używania zaawansowanego / nowoczesnego C ++. W niektórych przypadkach podczas czytania kodu / dokumentacji miałem wrażenie, że czasami rzeczy są znacznie nadmiernie uogólnione ze względu na popisywanie się zaawansowanymi umiejętnościami, takimi jak TMP, gdzie dla 99% wszystkich potencjalnych aplikacji prostsza implementacja również praca.


3

Książka „Guide to Scientific Computing in C ++” autorstwa Pitt-Francis & Whiteley została napisana, aby odpowiedzieć dokładnie na tego rodzaju rzeczy (użycie STL, iteratory itp.), Która jest dostępna za pośrednictwem Amazon lub jako e-Book od wydawcy .

Ujawnienie - pracuję w tej samej grupie badawczej co autorzy, ale nadal uważam, że jest to bardzo dobre źródło informacji!


1

Myślę, że ta książka jest idealna dla ciebie, tak jak dla mnie: Odkrywanie nowoczesnego C ++: Intensywny kurs dla naukowców, inżynierów i programistów (C ++ Dogłębność) Petera Gottschlinga, zwłaszcza jeśli jest używany w połączeniu z zasadami programowania i praktyką C ++ 2nd Edition Bjarne Stroustrup. Twórca samego C ++. Oba powinny zapewnić solidne podłoże, na którym można stać.


0

Biblioteka Blaze dla algebry liniowej znaczący sposób korzysta z C ++ 14 w postaci przewidywanych i spływu rodzajów powrotów. Inne nowoczesne używane funkcje C ++ to constexprszablony aliasów i cała masa metaprogramowania szablonów z wyrażeniem SFINAE.

Możesz także użyć list inicjalizujących dla swoich wektorów i macierzy, np

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

Aby uzyskać więcej informacji, zobacz ich stronę początkową .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.