Каково влияние семантики перемещения C ++ 11 в контексте научных вычислений?

10

C ++ 11 вводит семантику перемещения, которая может, например, улучшить производительность кода в ситуациях, когда C ++ 03 потребуется выполнить конструкцию копирования или назначение копирования. В этой статье сообщается, что при компиляции с C + 11 следующий код ускоряется в 5 раз:

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

Каково влияние семантики перемещения C ++ 11 в контексте научных вычислений?

Меня интересует этот вопрос в целом, но, в частности, меня интересует также семантика перемещения для кодов конечных элементов, написанных с использованием библиотек надстроек. Я протестировал некоторый собственный код C ++ 03 с использованием надстройки версии 1.47.0 (поскольку в заметках о выпуске надстройки упоминается семантика перемещения в версии 1.48.0) и надстройки версии 1.53.0, но особых улучшений я не заметил. Я предполагаю, что любая экономия из-за того, что не нужно делать копирование для boost::numeric::ublas::vector/ matrixи boost::functionне заметна, так как решение системных матриц составляет основную часть рабочей нагрузки.

Редактировать: На самом деле похоже, что семантика перемещения реализована только для boost::function(см . Примечания к выпуску версии 1.52.0 ). В нем нет упоминания о семантике перемещения boost::numeric, я нашел источники, чтобы убедиться, что ссылки на значения отсутствуют.

Матия Кечман
источник
1
Как вы заметили в последней части вашего вопроса, если вы не профилировали свой код и не видели много копий, вы не можете существенно улучшить свою производительность, используя семантику перемещения.
Билл Барт,

Ответы:

10

Я думаю, что на практике влияние ограничено и будет ограничено.

Причина, по которой он сейчас ограничен, заключается в том, что большие пакеты с конечными элементами стараются писать код, который переносим, ​​и поэтому они еще не используют языковые конструкции C ++ 11 в своих собственных кодах.

Конечно, они получат выгоду от кода, подобного тому, который вы показываете, где даже без необходимости изменять исходный код вы получаете выгоду от улучшенной библиотеки поддержки компилятора, такой как libstdc ++ для GCC. Тем не менее, люди в научных вычислениях довольно хорошо осведомлены о затратах на копирование, и поэтому для объектов, где это имеет значение, они просто не копируют - они либо генерируют на месте, либо делают мелкие копии, либо используют общий доступ. указатели или многие другие доступные методы, чтобы избежать накладных расходов на копирование. Другими словами, ситуация, для которой была изобретена семантика перемещения, на самом деле не часто встречается в «реальных» научных кодах.

Вольфганг Бангерт
источник