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.