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.
sumber
Jawaban:
Dua contoh perpustakaan yang menggunakan konstruksi C ++ modern:
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)
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 :
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?
sumber
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.
sumber
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 .
sumber
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.
sumber
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.
sumber
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!
sumber
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.
sumber
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
Untuk lebih jelasnya lihat halaman memulai mereka .
sumber