0

まあ、タイトルはそれをかなりうまく要約しています。プロファイリングでこの醜い場所にたどり着きました。私は通常 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>' に変換できません

ここで私は何を間違っていますか(私が忌まわしきものを作成したという事実を除いて)。生産的な批判をお願いします。私はそれが恐ろしいことを知っています、より良い解決策が喜んで検討されます!

注: リストを使用しているのは、最後の部分でベクトルが遅すぎたためです (事前に割り当てられたものを実行し、反復子の場所を削除します)。

4

1 に答える 1

2

parallel_for整数型のみを境界として受け入れます。アイデアを維持して、インデックスのループでvectoraを使用できます。parallel_for

typedef std::vector<Obj>::iterator ItUnallocated;
std::vector<Obj> unallocated;
concurrency::concurrent_vector<ItUnallocated> preallocated;

concurrency::parallel_for<size_t>
    (
    0,
    unallocated.size(),
    [&](size_t index)
    {
        if(Criterion(unallocated[index]))
            preallocated.push_back(unallocated.begin() + index);
    }
);

concurrencyまた、 Microsoft のみであることに注意してください。移植可能な非常によく似たインテル スレッド ビルディング ブロック ライブラリを使用することをお勧めします。

于 2013-07-02T08:05:32.780 に答える