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.
źródło
Odpowiedzi:
Dwa przykłady bibliotek korzystających z nowoczesnych konstrukcji C ++:
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)
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 :
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?
źródło
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ódło
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 .
źródło
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 ++.
źródło
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.
źródło
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!
źródło
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ć.
źródło
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
constexpr
szablony 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
Aby uzyskać więcej informacji, zobacz ich stronę początkową .
źródło