Apa dampak dari semantik C ++ 11 dalam konteks komputasi ilmiah?

10

C ++ 11 memperkenalkan langkah semantik yang dapat, misalnya, meningkatkan kinerja kode dalam situasi di mana C ++ 03 perlu melakukan konstruksi salin atau tugas penyalinan. Artikel ini melaporkan bahwa kode berikut mengalami kecepatan 5x saat dikompilasi dengan C + 11:

vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
    vector<int> x(1000);
    V.push_back(x);
}

Apa dampak dari semantik C ++ 11 dalam konteks komputasi ilmiah?

Saya tertarik dengan pertanyaan ini secara umum, tetapi lebih khusus lagi saya juga tertarik pada semantik bergerak untuk kode Elemen Hingga yang ditulis menggunakan boost library. Saya menguji beberapa kode C ++ 03 saya sendiri menggunakan boost versi 1.47.0 (karena catatan rilis menyebutkan langkah semantik diperkenalkan di 1.48.0) dan meningkatkan versi 1.53.0, tapi saya tidak melihat banyak perbaikan. Saya kira setiap penghematan dari tidak harus melakukan copy-konstruksi untuk boost::numeric::ublas::vector/ matrixdan boost::functiontidak terlihat karena memecahkan matriks sistem merupakan bagian terbesar dari beban kerja.

Sunting: Sebenarnya sepertinya memindahkan semantik hanya diterapkan untuk boost::function(lihat versi 1.52.0 catatan rilis ). Tidak disebutkan tentang pindah semantik boost::numeric, saya mengambil sumber untuk memastikan dan tampaknya tidak ada referensi nilai.

Matija Kecman
sumber
1
Seperti yang Anda catat di bagian terakhir dari pertanyaan Anda, kecuali jika Anda telah membuat profil kode Anda dan melihat banyak penyalinan terjadi, Anda tidak dapat secara substansial meningkatkan kinerja Anda dengan menggunakan semantik bergerak.
Bill Barth

Jawaban:

10

Saya pikir dalam praktiknya dampaknya terbatas dan akan terbatas.

Alasan mengapa adalah terbatas sekarang adalah bahwa paket elemen hingga besar berhati-hati untuk menulis kode yang portabel, dan sehingga mereka belum menggunakan C ++ konstruksi 11 bahasa dalam kode mereka sendiri.

Tentu saja, mereka akan mendapat manfaat dari kode seperti yang Anda tunjukkan di mana, bahkan tanpa harus mengubah kode sumber, Anda mendapat manfaat dari pustaka dukungan kompiler yang ditingkatkan seperti libstdc ++ untuk GCC. Yang mengatakan, orang-orang dalam komputasi ilmiah cukup sadar akan biaya penyalinan dan karenanya, untuk objek yang penting, mereka tidak menyalin - mereka menghasilkan di tempat, atau mereka membuat salinan dangkal, atau mereka menggunakan shared pointer, atau banyak teknik lain yang tersedia untuk menghindari overhead menyalin. Dengan kata lain, situasi di mana semantik bergerak diciptakan sebenarnya tidak sering terjadi dalam kode ilmiah "nyata".

Wolfgang Bangerth
sumber