2

組み合わせる必要がある複数の大きな Intel TBB の concurrent_vectors があります。これらは非常に大きいため、適切なサイズの新しい concurrent_vector を割り当てることはできません。

...したがって、次の疑似コードは機能しません

concurrent_vector<myStruct> A(100000);
concurrent_vector<myStruct> B(100000);
...
concurrent_vector<myStruct> X(100000);

concurrent_vector<myStruct> combined;
combined.resize(A.size()+B.size()....X.size()); // This will fail

私がしたいのは、[A]、[B]...[X] が [AB...X] になるように、最初のベクトルのセットを組み合わせたものに転送または交換することです。tbb が 1 つのベクトルの swap() をサポートしていることは知っていますが、複数のベクトルをスワップまたは追加する方法がわかりません。誰かが私を正しい方向に向けることができますか? 前もって感謝します!!

4

1 に答える 1

4

残念ながら、再割り当てせずに複数の concurrent_vector を 1 つに結合する方法はありません。これは、要素の各セグメントのサイズが前のすべてのセグメントの合計と同じサイズでなければならないという tbb::concurrent_vector の厳密なデータ構造規則から来ています。

ただし、concurrent_vector は再割り当てなしで大きくなるため、ベクターを 1 つずつ追加して、コピー直後にベクターを破棄することをお勧めします。このようにして、必要なときに十分な大きさのメモリ ブロックが解放される可能性が高くなります。

std::copy(B.begin(), B.end(), A.grow_by(B.size())); B.clear();
std::copy(C.begin(), C.end(), A.grow_by(C.size())); C.clear();
...
std::copy(X.begin(), X.end(), A.grow_by(X.size())); // X.clear();

ただし、メモリの断片化により、すべてが再び台無しになる可能性があります。

于 2014-04-01T09:38:10.377 に答える