1

並列化のための実用的なソリューションが 1 つあります。ただし、並列化によって実行時間はごくわずかに改善されます。ループ内の変数を新規作成して削除したことが原因だと思います。スタックを作成したいのですが、 Command クラスは抽象的であり、抽象的である必要があります。それを回避するにはどうすればよいですか? これらの非常に長いループに費やされる時間を改善するにはどうすればよいですか???

#pragma omp parallel for  reduction(+:functionEvaluation)
for (int i=rowStart;i<rowEnd+1;i++)
{
    Model model_(varModel_);
    model_.addVariable("i", i);
    model_.addVariable("j", 1);
    Command* command_ = formulaCommand->duplicate(&model_);
    functionEvaluation += command_->execute().toDouble();
    delete command_;
}

問題は別のところにあるかもしれません!アドバイス大歓迎!!

ありがとうございます。

4

2 に答える 2

1

割り当てられたメモリを再利用するメカニズムを使用するようにしてください。来るオブジェクトのサイズや配置がわからない可能性があるCommandため、「十分な大きさの」バッファでは不十分です。duplicateメソッドに2つの引数をとらせます。2つ目は。への参照boost::poolです。プールオブジェクトが十分に大きい場合は、その中に新しいCommandオブジェクトを作成し、それが展開されていない場合は、その中に作成します。boost::poolアライメントの問題を処理するので、それについて考える必要はありません。このように、スレッドごとに数回だけ動的メモリ割り当てを行う必要があります。

ちなみに、C++で生のポインタを返すことは一般的に良い習慣ではありません。代わりにスマートポインタを使用してください。しかし、この方法の方が簡単です。しかし、この場合は:)です。私の提案では、内部でカスタムメモリ管理を行うことになるからです。それでも、ベストプラクティスは、ユーザーが混乱するリスクを冒すことなく、特殊なケースを適切に処理するカスタムスマートポインターを作成することです。もちろん、他のみんなと同じようにして、この場合は例外にすることもできます:)(私のアドバイスは通常の状況でも当てはまりますが、上記の質問のfxでは、通常は次のようなものを使用する必要がありますboost::scoped_ptr

于 2012-04-16T16:24:18.577 に答える
1

privateorfirstprivateで遊んでみることもできます。

インクルードまたは同様の#pragma場合...private(varModel, formulaCommand)...、各スレッドはそれらの変数の独自のコピーを持ちます。を使用firstprivateすると、初期化されていないのではなく、スレッド固有の変数に初期値がコピーされます。これにより、各ループ反復のインスタンスを変更するだけでよいと仮定するnewと、必要がなくなります。delete

多くの詳細を提供していないため、これは希望どおりに機能する場合と機能しない場合があります。

于 2012-04-16T14:35:57.437 に答える