Jaki jest wpływ semantyki ruchów w C ++ 11 w kontekście obliczeń naukowych?


10

C ++ 11 wprowadza semantykę przenoszenia, która może na przykład poprawić wydajność kodu w sytuacjach, w których C ++ 03 musiałby wykonać konstrukcję kopii lub przypisanie kopii. W tym artykule opisano, że następujący kod przyspiesza 5-krotnie po skompilowaniu z C + 11:

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

Jaki jest wpływ semantyki ruchów w C ++ 11 w kontekście obliczeń naukowych?

Interesuje mnie to pytanie ogólne, ale dokładniej interesuje mnie również semantyka przenoszenia dla kodów elementów skończonych napisanych przy użyciu bibliotek doładowań. Przetestowałem część własnego kodu C ++ 03 przy użyciu wersji boost 1.47.0 (ponieważ informacje o wydaniu boost wspominają, że semantyka move została wprowadzona w wersji 1.48.0) i wersji boost 1.53.0, ale nie zauważyłem dużej poprawy. Wydaje mi się, że wszelkie oszczędności wynikające z konieczności wykonywania kopiowania dla boost::numeric::ublas::vector/ matrixi boost::functionnie są zauważalne, ponieważ rozwiązywanie macierzy systemowych stanowi większość obciążenia.

Edycja: W rzeczywistości wygląda na to, że semantyka przenoszenia jest zaimplementowana tylko dla boost::function(patrz informacje o wersji 1.52.0 ). Nie ma wzmianki o semantyce przenoszenia w boost::numeric, przeszukałem źródła, aby się upewnić i wydaje się, że nie ma odniesień do wartości.


1
Jak zauważyłeś w ostatniej części pytania, o ile nie wyprofilowałeś kodu i nie widziałeś dużo kopiowania, nie możesz znacząco poprawić swojej wydajności za pomocą semantyki przenoszenia.
Bill Barth,

Odpowiedzi:


10

Myślę, że w praktyce wpływ jest ograniczony i będzie ograniczony.

Powodem, dla którego jest to obecnie ograniczone, jest to, że duże pakiety elementów skończonych starają się pisać przenośny kod, więc nie używają jeszcze konstrukcji języka C ++ 11 we własnych kodach.

Oczywiście skorzystają na kodzie takim jak ten, który pokazujesz, nawet jeśli nie musisz zmieniać kodu źródłowego, skorzystasz z ulepszonej biblioteki obsługi kompilatora, takiej jak libstdc ++ dla GCC. To powiedziawszy, ludzie w informatyce naukowej są w pełni świadomi kosztów kopiowania, a więc w przypadku obiektów, w których ma to znaczenie, po prostu nie kopiują - albo generują w miejscu, albo wykonują płytkie kopie, lub używają współdzielonych wskaźniki lub wiele innych dostępnych technik w celu uniknięcia narzutu związanego z kopiowaniem. Innymi słowy, sytuacja, dla której wymyślono semantykę ruchu, w rzeczywistości nie zdarza się często w „prawdziwych” kodach naukowych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.