Який вплив семантики переміщення C ++ 11 у контексті наукових обчислень?


10

C ++ 11 вводить семантику переміщення, яка може, наприклад, покращити продуктивність коду в ситуаціях, коли C ++ 03 потрібно буде виконати побудову копії або призначення копії. Ця стаття повідомляє, що наступний код має 5-кратну швидкість, коли компілюється з C + 11:

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

Який вплив семантики переміщення C ++ 11 у контексті наукових обчислень?

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

Редагувати: насправді схоже, що семантика переміщення реалізована лише для boost::function(див. Примітки до випуску версії 1.52.0 ). У семантиці переміщення не згадується boost::numeric, я перебрався з джерелами, щоб переконатися, що, здається, немає посилань на реальну оцінку.


1
Як ви зазначаєте в останній частині свого запитання, якщо ви не сформулювали код і не побачили багато копіювання, ви не зможете істотно покращити свою ефективність за допомогою семантики переміщення.
Білл Барт

Відповіді:


10

Я думаю, що на практиці вплив обмежений і буде обмежений.

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

Звичайно, вони отримають користь від коду, як той, який ви показуєте, де, навіть не змінюючи вихідний код, ви отримуєте перевагу від покращеної бібліотеки підтримки компілятора, наприклад libstdc ++ для GCC. З цього приводу, люди в наукових обчисленнях добре знають витрати на копіювання, і тому для об'єктів, де це важливо, вони просто не копіюють - вони або генерують на місці, або роблять неглибокі копії, або вони використовують спільне використання покажчики чи багато інших доступних методів, щоб уникнути накладних копіювання. Іншими словами, ситуація, для якої була винайдена семантика руху, насправді не трапляється дуже часто в «реальних» наукових кодексах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.