並列処理(parallel_for
経由)を使用するために〜12,000x12,000のセルマトリックス(約125回)をループするプロセスを変換しようとしています。私が使用しているコードは以下の通りです。 forループがコメントアウトされている場所を確認することができます。Visual C++ parallel_for +ベクトルアクセス違反
このコードをforループで実行すると、問題はありません。私はparallel_for
を使用して(デバッグ中)、それを実行すると、それはFratarProcess.exe 0xc0000005で中0x00f3d4aeで未処理の例外」とのランダムな点でクラッシュ:アクセス違反の書き込み場所0x0000000を
注:accessMatrix
はvector <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
答えを読んでもう少し調べてみると、sqlStringsを 'Concurrency :: concurrent_vector sqlStrings;'として宣言する必要があり、1つのテストを実行しているように見えます。ここまでは順調ですね。正しい方向に指摘してくれてありがとう。 –