Bilimsel hesaplamada modern C ++?


22

Bilimsel hesaplamada, özellikle C ++ modern özelliklerinin (semantik, STL, yineleyiciler, tembel değerlendirme, vb.) Kullanımına yönelik kitaplar, makaleler veya blog yazıları veya genel olarak yayınlanan herhangi bir materyali arıyorum. Herhangi birini önerebilir misin?

Bu yeni özelliklerin verimli kod yazmayı kolaylaştıracağını düşünüyorum, ancak gerçek örnekler bulamadım. Okuduğum çoğu referans C ++ 'ın genel kullanımları ile ilgili ve bilimsel hesaplama örnekleri içermiyor. Bu yüzden C ++ modern özelliklerini kullanarak bilimsel hesaplama kodunun örnekleri (üretim kodu örnekleri olmak zorunda değilsiniz, sadece pedagojik örnekler, örneğin, Sayısal Tarifler) düzeyinde arıyorum.

Bu özellikleri kullanan kütüphaneler hakkında soru sormadığımı unutmayın. Bilimsel hesaplamada bu özelliklerden nasıl yararlanabileceğimi açıklayan makaleler / kitaplar / vb. Hakkında sorular soruyorum.


2
Bugünlerde (20 yıldan önceki) en iyi uygulama olduğu anlaşılan anlamda "modern" veya özel olarak C ++ 11/14 anlamında "modern" mi soruyorsunuz?
Kirill

2
@Killill sanırım ikisi de. Çoğunlukla C ++ 11/14 kullanan, ancak en iyi uygulamaları takip eden bir şey.
becko

Yanıtlar:


11

Modern C ++ yapılarını kullanan iki kütüphane örneği:

  • Hem öz hem de armadillo kütüphaneleri (doğrusal cebir) birkaç modern C ++ yapısını kullanır. Örneğin, aritmetik ifadeleri basitleştirmek için her iki ifade şablonunu da kullanırlar ve bazen bazı geçici değerleri ortadan kaldırabilirler:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (Armadillo'daki ifade şablonlarında sunum)

  • CGAL kütüphanesi (hesaplama geometrisi) birçok modern C ++ özelliği kullanır (yoğun olarak şablonlar ve uzmanlıklar kullanır):

http://www.cgal.org

Not:

Modern C ++ yapıları çok zarif ve kullanımı çok eğlenceli olabilir. Hem güçlü bir nokta hem de zayıf bir nokta: onları kullanırken, çok sayıda şablon / uzmanlık / lambdas katmanı eklemek o kadar caziptir ki sonunda programda etkili koddan daha fazla "yönetim" elde edersiniz (başka bir deyişle, Programınız sorunu açıklamaktan ziyade sorun hakkında "konuşuyor". Doğru dengeyi bulmak çok incedir. Sonuç: Kodda “sinyal / gürültü” oranının gelişimini ölçerek izlemeniz gerekir :

  • programda kaç kod satırı var?
  • kaç tane sınıf / şablon var?
  • çalışma zamanı
  • hafıza tüketimi?

İlk ikisini artıran her şey bir maliyet olarak düşünülebilir (çünkü programın anlaşılmasını ve sürdürülmesini zorlaştırabilir), son ikisini azaltan her şey bir kazançtır .

Örneğin, bir soyutlamanın (sanal bir sınıf veya bir şablon) kullanılması, kodu etkileyebilir ve programı daha basit hale getirir ( kazanç ), ancak eğer yalnızca bir kez türetilmemiş / denenmemişse, o zaman ilişkili bir kazanç için bir maliyet getirmez (yine zekice çünkü kazanç, programın gelecekteki evriminde daha sonra gelebilir, bu nedenle "altın kural" yoktur).

Programcının rahatı, maliyet / kazanç dengesinde göz önünde bulundurulması gereken önemli bir faktördür: çok fazla şablonla, derleme süresi önemli ölçüde artabilir ve hata mesajlarının ayrıştırılması zorlaşır.

Ayrıca bakınız

Hesaplamalı bilimde C ++ şablonlarını kullanarak genel ve meta-programlama ne derece faydalıdır?


2
Aynı Armadillo ve Eigen için de geçerli değil mi?
dr.blochwave

Evet haklısınız (Armadillo'nun belgelerine baktım, daha az aşina oldum). Gönderiyi düzenliyorum.
BrunoLevy

1
Daha uzun derleme süreleri, söz edilmeye değer başka bir maliyettir.
Kirill,

@Kirill, evet iyi bir nokta (bunu yazacak yazıyı düzenledi), teşekkürler.
BrunoLevy,

10

Deal'e bir göz atmanı öneririm. STL'yi kullanır, kendi yineleyicileri, paylaşılan işaretçileri vb.

Çeşitli lineer çözücüler, nasıl tasarlandıklarından dolayı çeşitli matrisleri kullanabilirler. Hareket anlambiliminin herhangi bir kullanımıyla karşılaşmadım, ama bu onların olmadığı anlamına gelmez. İşte bir link.


Ayrıca OpenFOAM - şablonların oldukça kapsamlı kullanımı.
tpg2114

1
deal.II move semantics kullanmaz (çünkü C ++ 11 dil özelliklerini kullanmaktan kaçınır - fakat BOOST'ta daha eski derleyiciler için değiştirilen C ++ 11 kitaplık özelliklerini kullanır). Orijinal soruda sorulanların tümü de dahil olmak üzere, hemen hemen her diğer C ++ dil özelliğini kullanır.
Wolfgang Bangerth

Büyük bir kütüphaneye ayrıntılarıyla bakmak kolay değil.
Michael,

7

HPX kütüphane C aralığında yoğun kullanımını gündeme getirmektedir ++ 11 hamle yapıcıları gibi özellikleri de tam bir uygulama olmayı hedeflediğini N4409 (Paralellik için C ++ Uzantıları için çalışma taslağı, Teknik Şartname).

Bilimsel hesaplamayı hızlandırmak için kütüphaneyi kullanmanın birkaç örneğini içeren kendi sitelerinde yayınlar listesi var . Kütüphanenin çok ilginç bir tartışması var ve bu CppCast bölümünde modern C ++ kullanımı .


Scicomp.se'ye hoş geldiniz! Bağlantılar eklerseniz veya bu kütüphaneyi bilimsel hesaplama için tartışan makaleler / kitaplar / blog yazılarından alıntı yaparsanız, Cevabınızı mutlu bir şekilde oylayacağım!
hardmath

5

Scientific and Engineering C ++ 'a bir göz atmanızı öneriyorum : Barton ve Nackmann'ın İleri Teknik ve Örneklerine Giriş .

Bu kitabın 1994 yılında yayınlanmış olması, "modern teknikler" kriterinizi ihlal ettiğini gösteriyor. Bununla birlikte, Barton ve Nackmann o sırada C ++ şablonlarıyla mümkün olanın başındaydı ve iyi performans elde etmek için geliştirdikleri yenilikçi teknikler en son C ++ sınıf kütüphanelerinde hala kullanılıyor.


4

Deal.ii (burada zaten önerilmiş) dışında, şablon metaprogramlama, yineleyici aralıkları, akıllı işaretçiler vb. Gibi bazı gelişmiş C ++ özelliklerinden de faydalanan Dune kütüphanesine bakabilirsiniz . Son da vardır önbaskısını Joachim Schöberl tarafından hangi örneği lambda fonksiyonları için, NGSolve içinde sonlu elemanlar yöntemlerinin uygulanmasını kolaylaştırmak için nasıl C ++ 11 özelliklerin kullanımı hakkında yorumlar. artırmakAyrıca UBLAS, Graph, vb. gibi bilimsel programlama ile ilgili bazı kütüphaneler vardır. Bu kütüphanelerin çoğunda modern C ++ kullanımına dair güzel örnekler bulacaksınız. Ancak, gelişmiş / modern C ++ kullanmanın kötü örnekleriyle de karşılaşabileceğinizi unutmayın. Bazı durumlarda, kod / dokümantasyonu okurken, TMP gibi gelişmiş becerileri göstermek adına ara sıra işlerin fazlasıyla genelleştirildiği hissine kapıldım, tüm potansiyel uygulamaların% 99'unda daha basit bir uygulama da iş.


3

Pitt-Francis & Whiteley tarafından yazılan "C ++ 'ta Bilimsel Hesaplama Kılavuzu" adlı kitap, Amazon'da veya yayıncıdan e-kitap olarak sunulan bu tür bir şeyi (STL, yineleyiciler vb. Kullanımı) tam olarak cevaplamak için yazılmıştır .

Açıklama - Yazarlarla aynı araştırma grubunda çalışıyorum , ancak bunun bunun için çok iyi bir kaynak olduğunu düşünüyorum!


1

Bu kitabın benim için olduğu gibi sizin için de mükemmel olduğunu düşünüyorum: Modern C ++ 'ı Keşfetmek: Bilim Adamları, Mühendisler ve Programcılar İçin Yoğun Bir Kurs (C ++ Derinlemesine), özellikle de Programlama İlkeleri ve Uygulama Kullanımı ile birlikte kullanıldığında C ++ 2nd Edition Bjarne Stroustrup. C ++ 'nın mucidi. Her ikisi de durmak için sağlam bir zemin sağlamalıdır.


0

Yangını kütüphanesi lineer cebir için sonuçta ortaya çıkan ve arka dönüş türleri formunda C ++ 14 sıkça kullanılmıştır. Kullanılan diğer modern C ++ özellikleri constexpr, takma ad şablonları ve SFINAE ifadesiyle bir sürü şablon metaprogramlamasıdır.

Örneğin, vektörler ve matrisler için başlatıcı listelerini de kullanabilirsiniz.

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

Daha fazla ayrıntı için başlangıç sayfalarına bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.