2011-08-03 9 views
4

並列処理(parallel_for経由)を使用するために〜12,000x12,000のセルマトリックス(約125回)をループするプロセスを変換しようとしています。私が使用しているコードは以下の通りです。 forループがコメントアウトされている場所を確認することができます。Visual C++ parallel_for +ベクトルアクセス違反

このコードをforループで実行すると、問題はありません。私はparallel_forを使用して(デバッグ中)、それを実行すると、それはFratarProcess.exe 0xc0000005で中0x00f3d4aeで未処理の例外」とのランダムな点でクラッシュ:アクセス違反の書き込み場所0x0000000を

注:accessMatrixvector <vector <unsigned short> > accessMatrix;として宣言され、前に満たされていますこの時点。

void dumpMatrix(unsigned short m) 
{ 

int complete=0, start=2532, todo=accessMatrix.size()-start; 

    vector <string> sqlStrings; 

    Concurrency::parallel_for(start, (int)accessMatrix.size(),[&complete,&todo,&m,&sqlStrings](int i) 
    //for(int i=start;i<accessMatrix.size();i++) 
    { 
     printf("Processing i=%i... completed %i/%i\n",i,complete,todo); 
     for(unsigned short j=1;j<accessMatrix[i].size();j++) 
     { 
      if(accessMatrix[i][j]>0) 
      { 
       stringstream strSQL; 
       strSQL << "INSERT INTO debug.dbf (I,J,M,V) VALUES(" << i << "," << j << "," << m << "," << accessMatrix[i][j] << ")"; 
       sqlStrings.push_back(strSQL.str()); 
      } 
     } 
     complete++; 
    }); 
... 
} 

誰かが私を得ることができますので、私はすべての8つの私のマシンのコアの代わりの1を使用して、このプロセスを取得することができます右方向に向け?++私はCで初心者の多少だということに注意してください。私が使用していますVisual C++ Express

答えて

2

あなたは同期を使用していませんsqlStringsに対する保護。コンテナを変更したり、出力したり、同期を使わずに複数のスレッドから共有変数を同時にインクリメントすることは安全ではありません。

combinableオブジェクト宣言します:

Concurrency::combinable<vector <string>> sqlStringsCombinable;

をループで:

sqlStringsCombinable.local().push_back(strSQL.str());

ループした後、それらを組み合わせてこれはまた、問題を解決します

+0

答えを読んでもう少し調べてみると、sqlStringsを 'Concurrency :: concurrent_vector sqlStrings;'として宣言する必要があり、1つのテストを実行しているように見えます。ここまでは順調ですね。正しい方向に指摘してくれてありがとう。 –

3

sqlStringsCombinable.combine_each([&sqlStrings](const std::vector<CString>& vec) 
    { 
     std::copy(vec.cbegin(), vec.cend(), back_inserter(sqlStrings)); 
    }); 

これはループを手動で同期させるのではなく、parallel_forの速度を上げます。

+0

私はすでに上記の回答をマークしていますが、あなたも正しいと思われます。本当にありがとうございます。もし私が15名の評判を得ていれば、そうすることができます。再度、これを投稿していただきありがとうございます。 –

関連する問題