1

私はC++の経験があまりないので、明らかな何かが欠けている可能性があります。vector.insertの「無効化されたイテレータ」の問題を認識していますが、この場合にどのように発生するかわかりません。OpenMPも含まれていますが、インサート自体は並列ブロックの外側に配置されています。

void doWork(vector<Solution> &sol)
{
    vector<Solution> partial[40];

    #pragma omp parallel for ... shared(partial) ...
    for (...) {
        ...
        partial[tid].push_back(Solution(i,j));
        ...
    }

    for (i = 0; i < 40; i++)
        sol.insert(sol.end(), partial[i].begin(), partial[i].end());
}

編集:エラーメッセージはstdbadallocです。スレッドは40個以下だと思います。どうやら、これは1つのスレッドでも(オンとオフで)発生します。さらに興味深いのは、代替ソリューションです。

for(i = 0; i < 40; i++)
    for(j = 0; j < partial[i].size(); j++)
        sol.push_back(partial[i][j]);

可変数のスレッドで、常に機能しているようです。

4

0 に答える 0