C ++ modern dalam komputasi ilmiah?

22

Saya mencari buku atau artikel, atau posting blog, atau materi apa pun yang diterbitkan secara umum, yang membahas secara khusus penggunaan fitur-fitur modern C ++ (memindahkan semantik, STL, iterator, evaluasi malas, dll.) Dalam komputasi ilmiah. Bisakah Anda menyarankan?

Saya pikir fitur-fitur baru ini akan membuatnya lebih mudah untuk menulis kode yang efisien, tetapi saya belum menemukan contoh nyata. Sebagian besar referensi yang saya baca adalah tentang penggunaan C ++ secara umum, dan tidak mengandung contoh komputasi ilmiah. Jadi saya mencari contoh (tidak harus menjadi contoh kode produksi, hanya contoh pedagogis, pada tingkat, katakanlah, Numerical Recipes) dari kode komputasi ilmiah menggunakan C ++ fitur modern.

Perhatikan bahwa saya tidak bertanya tentang perpustakaan yang menggunakan fitur ini. Saya bertanya tentang artikel / buku / dll yang menjelaskan bagaimana saya dapat memanfaatkan fitur-fitur ini dalam komputasi ilmiah.

becko
sumber
2
Apakah Anda bertanya tentang "modern" dalam arti apa yang dipahami sebagai praktik terbaik saat ini (vs 20 tahun lalu), atau "modern" dalam arti khusus C ++ 11/14?
Kirill
2
@ Kirill kurasa itu keduanya. Sebagian besar sesuatu yang menggunakan C ++ 11/14, tetapi mengikuti praktik terbaik.
becko

Jawaban:

11

Dua contoh perpustakaan yang menggunakan konstruksi C ++ modern:

  • Baik perpustakaan eigen dan armadillo (aljabar linier) menggunakan beberapa konstruksi C ++ modern. Misalnya, mereka menggunakan kedua templat ekspresi untuk menyederhanakan ekspresi aritmatika dan terkadang dapat menghilangkan beberapa temporer:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (presentasi tentang templat ekspresi di Armadillo)

  • Pustaka CGAL (geometri komputasi) menggunakan banyak fitur C ++ modern (ini sangat menggunakan templat dan spesialisasi):

http://www.cgal.org

catatan:

konstruksi C ++ modern sangat elegan dan bisa sangat menyenangkan untuk digunakan. Ini adalah titik kuat dan juga kelemahan: ketika menggunakannya, sangat menggoda untuk menambahkan beberapa lapisan templat / spesialisasi / lambda sehingga pada akhirnya Anda kadang-kadang mendapatkan lebih banyak "administrasi" daripada kode efektif dalam program (dengan kata lain, program Anda "berbicara" lebih banyak tentang masalah daripada menjelaskan solusinya). Menemukan keseimbangan yang tepat sangat halus. Kesimpulan: seseorang perlu melacak evolusi rasio "sinyal / noise" dalam kode dengan mengukur :

  • berapa baris kode dalam program ini?
  • berapa kelas / templat?
  • waktu berjalan ?
  • konsumsi memori?

Segala sesuatu yang meningkatkan dua yang pertama dapat dianggap sebagai biaya (karena dapat membuat program lebih sulit untuk dipahami dan dipelihara), segala sesuatu yang mengurangi dua yang terakhir adalah keuntungan .

Sebagai contoh, memperkenalkan abstraksi (kelas virtual atau templat) dapat memfaktorkan kode dan membuat program lebih sederhana ( mendapatkan ), tetapi jika tidak pernah diturunkan / di-instanc sekali saja, maka ia memperkenalkan biaya tanpa keuntungan terkait (sekali lagi itu adalah halus karena keuntungan mungkin datang kemudian dalam evolusi program di masa depan, oleh karena itu tidak ada "aturan emas").

Kenyamanan pemrogram juga merupakan faktor penting yang harus diperhitungkan dalam keseimbangan biaya / perolehan: dengan terlalu banyak templat, waktu kompilasi dapat meningkat secara signifikan, dan pesan kesalahan menjadi sulit diurai.

Lihat juga

Sejauh mana generik dan meta-pemrograman menggunakan template C ++ bermanfaat dalam ilmu komputasi?

BrunoLevy
sumber
2
Sama berlaku untuk Armadillo dan juga Eigen, bukan?
dr.blochwave
Ya, Anda benar (saya baru saja memeriksa dokumentasi Armadillo, saya kurang terbiasa dengannya). Saya sedang mengedit posting.
BrunoLevy
1
Waktu kompilasi yang lebih lama adalah biaya lain yang perlu disebutkan.
Kirill
@ Kirill, ya poin bagus (diedit pos untuk menyebutkannya), terima kasih.
BrunoLevy
10

Saya sarankan melihat Deal.II. Menggunakan STL, iterator sendiri, pointer bersama, dll.

Berbagai pemecah linier dapat menggunakan berbagai matriks karena cara itu dirancang. Saya belum menemukan penggunaan semantik bergerak, tetapi itu tidak berarti mereka tidak ada di sana. Berikut ini tautannya.

fred
sumber
Juga OpenFOAM - penggunaan template yang cukup luas.
tpg2114
1
deal.II tidak menggunakan move semantik (karena tidak menggunakan fitur bahasa C ++ 11 - tetapi menggunakan fitur pustaka C ++ 11 yang ada penggantian dalam BOOST untuk kompiler lama). Ia menggunakan hampir semua fitur bahasa C ++ lainnya, termasuk semua yang ditanyakan dalam pertanyaan awal.
Wolfgang Bangerth
Tampaknya tidak mudah untuk melihat perpustakaan besar secara detail.
Michael
7

The HPX perpustakaan yang menggunakan berat berbagai C ++ 11 fitur seperti langkah konstruktor dan juga bertujuan untuk menjadi implementasi lengkap dari N4409 (Draft Kerja, Spesifikasi Teknis untuk C ++ Ekstensi untuk Paralelisme).

Mereka memiliki daftar publikasi di situs mereka yang mencakup sejumlah contoh penggunaan perpustakaan untuk mempercepat perhitungan ilmiah. Ada juga diskusi yang sangat menarik tentang perpustakaan dan penggunaan C ++ modern dalam episode CppCast ini .

SteveL
sumber
Selamat datang di scicomp.se! Jika Anda menambahkan tautan atau mengutip beberapa artikel / buku / posting blog yang membahas pustaka ini untuk perhitungan ilmiah, saya dengan senang hati akan meningkatkan Jawaban Anda!
hardmath
5

Saya sarankan melihat Ilmiah dan Teknik C ++: Pengantar dengan Teknik dan Contoh Lanjutan oleh Barton dan Nackmann .

Fakta bahwa buku ini diterbitkan pada tahun 1994 membuatnya tampak melanggar kriteria Anda tentang "teknik modern." Namun, Barton dan Nackmann berada di ujung tombak dari apa yang mungkin dengan template C ++ pada saat itu dan teknik inovatif yang mereka rancang untuk mencapai kinerja yang baik masih digunakan di perpustakaan kelas C ++ terbaru.

Bill Greene
sumber
4

Selain deal.ii (yang sudah disarankan di sini), Anda juga dapat melihat perpustakaan Dune yang menggunakan banyak fitur C ++ canggih seperti metaprogramming template, rentang iterator, pointer pintar, dan sebagainya. Ada juga preprint baru-baru ini oleh Joachim Schöberl, yang berkomentar tentang penggunaan fitur C ++ 11, seperti misalnya fungsi lambda, untuk menyederhanakan implementasi metode elemen hingga di NGSolve. Doronganjuga memiliki beberapa perpustakaan yang berkaitan dengan pemrograman ilmiah seperti uBLAS, Grafik, dll. Saya kira di sebagian besar perpustakaan ini Anda akan menemukan contoh yang baik dari penggunaan C ++ modern. Namun, perlu diketahui bahwa Anda juga dapat menemukan contoh buruk menggunakan C ++ canggih / modern. Dalam beberapa kasus, saat membaca kode / dokumentasi, saya merasa bahwa kadang-kadang hal-hal yang sangat umum untuk memamerkan keterampilan canggih seperti TMP, di mana untuk 99% dari semua aplikasi potensial, implementasi yang lebih mudah juga akan melakukan pekerjaan.

Christian Waluga
sumber
3

Buku "Guide to Scientific Computing in C ++" oleh Pitt-Francis & Whiteley ditulis untuk menjawab hal semacam ini (penggunaan STL, iterators, dll.) Tersedia melalui Amazon , atau sebagai e-Book dari penerbit .

Pengungkapan - Saya bekerja di kelompok penelitian yang sama dengan penulis, tetapi masih berpikir itu sumber yang sangat bagus untuk ini!

keajaiban
sumber
1

Saya pikir buku ini sangat cocok untuk Anda, seperti halnya bagi saya: Menemukan Modern C ++: Kursus Intensif untuk Ilmuwan, Insinyur, dan Pemrogram (C ++ Dalam-Kedalaman) oleh Peter Gottschling terutama jika digunakan bersama dengan Prinsip-prinsip Pemrograman dan Praktek Menggunakan C ++ 2nd Edition Bjarne Stroustrup. Penemu C ++ sendiri. Keduanya harus memberikan landasan yang kokoh untuk berdiri.

Ramy Elkady
sumber
0

The Blaze perpustakaan untuk aljabar linear yang menggunakan berat C ++ 14 dalam bentuk tipe kembali dideduksi dan trailing. Fitur C ++ modern lainnya yang digunakan adalah constexpr, alias templat, dan banyak pemrograman metaplat dengan ekspresi SFINAE.

Anda juga dapat menggunakan daftar penginisialisasi untuk vektor dan matriks Anda, mis

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

Untuk lebih jelasnya lihat halaman memulai mereka .

Henri Menke
sumber