C ++ 11 hareket semantiğinin bilimsel hesaplama bağlamındaki etkisi nedir?


10

C ++ 11, örneğin C ++ 03'ün bir kopya oluşturma veya kopyalama ataması gerçekleştirmesi gereken durumlarda kod performansını artırabilecek taşıma semantiği sunar. Bu makalede , aşağıdaki kod C + 11 ile derlendiğinde 5 kat hızlanma yaşadığı bildirilmektedir:

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

C ++ 11 hareket semantiğinin bilimsel hesaplama bağlamındaki etkisi nedir?

Bu soru genel ilgileniyorum ama daha spesifik olarak ben destek kütüphaneleri kullanılarak yazılmış Sonlu Eleman kodları için hareket semantiği ile ilgileniyorum. Destek sürüm 1.47.0'ı kullanarak kendi C ++ 03 kodumun bazılarını test ettim ( destek sürüm notları, hareket semantiğinin 1.48.0'da tanıtıldığından beri) ve sürüm 1.53.0'ı artırdığından, ancak çok fazla gelişme fark etmedim. Ben kopyalama-inşaat yapmak zorunda değil herhangi tasarruf tahmin boost::numeric::ublas::vector/ matrixve boost::functionsistem matrisleri çözme iş yükünün büyük bir kısmını teşkil beri fark edilmez.

Düzenleme: Aslında hareket semantiği için uygulanır gibi görünüyor boost::function(bkz. Sürüm 1.52.0 sürüm notları ). Hareket semantiğinden bahsedilmiyor, boost::numericemin olmak için kaynakları selamladım ve hiçbir rvalue referansı yok gibi görünüyor.


1
Sorunuzun son bölümünde belirttiğiniz gibi, kodunuzu profilli etmediyseniz ve çok fazla kopyalama devam etmedikçe, hareket semantiği kullanarak performansınızı önemli ölçüde artıramazsınız.
Bill Barth

Yanıtlar:


10

Uygulamada etkinin sınırlı ve sınırlı olacağını düşünüyorum.

O nedeni olduğu şu anda sınırlı büyük sonlu elemanlar paketleri taşınabilir yazma koduna dikkatli olmasıdır ve onlar henüz kendi kodlarında C ++ 11 dil yapıları kullanın kalmaz.

Tabii ki, kaynak kodunu değiştirmek zorunda kalmadan bile, GCC için libstdc ++ gibi geliştirilmiş bir derleyici destek kitaplığından faydalandığınız, gösterdiğiniz koddan faydalanacaklardır. Bununla birlikte, bilimsel hesaplamadaki insanlar kopyalama maliyetinin oldukça farkındadır ve bu nedenle, önemli olduğu nesneler için kopyalamazlar - ya yerinde oluştururlar ya da sığ kopyalar yaparlar ya da paylaşılan kopyalar kullanırlar. işaretçiler veya kopyalama yükünü önlemek için mevcut diğer tekniklerin birçoğu. Başka bir deyişle, hareket semantiğinin icat edildiği durum aslında "gerçek" bilimsel kodlarda çok sık gerçekleşmez.

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.