科学計算のコンテキストで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移動セマンティクスの影響は何ですか?

この質問は一般的な質問に興味がありますが、具体的には、Boostライブラリを使用して記述された有限要素コードの移動セマンティクスにも興味があります。ブーストバージョン1.47.0(ブーストリリースノートには移動のセマンティクスが1.48.0で導入されていると記載されているため)とブーストバージョン1.53.0 を使用して、独自のC ++ 03コードの一部をテストしましたが、あまり改善されていません。システムマトリックスの解決はワークロードの大部分を構成するため、boost::numeric::ublas::vector/のコピー構築を行わなくても済むことによる節約は目立たないmatrixと思いますboost::function

編集:実際には、移動のセマンティクスが実装されているように見えますboost::functionバージョン1.52.0リリースノートを参照)。には移動のセマンティクスについての言及はありません。boost::numericソースを確認して確認し、右辺値の参照がないようです。


1
質問の最後の部分で述べたように、コードのプロファイルを作成して多くのコピーが行われているのを見ない限り、移動のセマンティクスを使用してパフォーマンスを大幅に向上させることはできません。
Bill Barth

回答:


10

実際には影響は限定的であり、限定されると思います。

それが理由され、今制限は大きな有限要素パッケージはポータブルで書き込みコードに注意を払っているということです、そして、彼らはまだ、自分のコードにC ++ 11言語構造を使用しないように。

もちろん、ソースコードを変更する必要がなくても、GCC用のlibstdc ++などの改善されたコンパイラサポートライブラリから恩恵を受ける場所を示すようなコードの恩恵を受けます。とは言っても、科学計算の人々はコピーの費用にかなり気づいているので、重要なオブジェクトについては、単にコピーしません-インプレースで生成するか、浅いコピーを行うか、共有を使用しますポインタ、またはコピーのオーバーヘッドを回避するために利用可能な他の多くの手法。言い換えると、移動のセマンティクスが発明された状況は、「実際の」科学的コードでは実際にはそれほど頻繁には発生しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.