まあ、タイトルはそれをかなりうまく要約しています。プロファイリングでこの醜い場所にたどり着きました。私は通常 Open MP 2.0 を使用していますが、私が知る限り、OMP2.0 でそれを行う簡単な方法はありません。代わりに Concurrency::parallel_for を使用していますが、うまく動作しないようです。
したがって、 unallocatedという Obj オブジェクトのリストがあり、特定の基準を満たした場合に削除したいと考えています。ループ内でそれらを並行して削除することはできないため、代わりに、 preallocatedと呼ばれる別のシーケンスでunallocatedの対応する場所にイテレータを格納しようとしています。これは後で list::erase() 関数を呼び出すために使用します。シリアルループ。
これが私がこれまでに持っているものです:
// (std::list<Obj> unallocated is already created and full of Obj objects)
typedef std::list<Obj>::iterator ItUnallocated;
concurrency::concurrent_vector<ItUnallocated> preallocated;
// We can now do a parallelised search through all remaining elments of unallocated to
//check if the cell pointer collides with any other unallocated cells, which will be added to
// the preallocated sequence.
concurrency::parallel_for
(
unallocated.begin(),
unallocated.end(),
[&](ItUnallocated const it)
{
if (Criterion(*it)) // check if the criterion is met
{
// criterion is met! Add the iterator
preallocated.push_back(it);
}
}
);
// run through each element of *preallocated* in serial and call unallocated.erase() for each of the elements.
これをコンパイルすると、次のエラーが発生します。
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\ppl.h(3447): エラー C2440: '': 'int' から 'std::_List_iterator<_Mylist>' に変換できません
ここで私は何を間違っていますか(私が忌まわしきものを作成したという事実を除いて)。生産的な批判をお願いします。私はそれが恐ろしいことを知っています、より良い解決策が喜んで検討されます!
注: リストを使用しているのは、最後の部分でベクトルが遅すぎたためです (事前に割り当てられたものを実行し、反復子の場所を削除します)。