2011-08-03 7 views
4

병렬 처리 (parallel_for 통해)를 사용하려면 ~ 12,000x12,000 셀 행렬 (약 125 회)을 반복하는 프로세스를 변환하려고합니다. 내가 사용하고있는 코드는 다음과 같습니다. for 루프가 주석 처리 된 부분을 볼 수 있습니다.Visual C++ parallel_for + 벡터 액세스 위반

이 코드를 for 루프와 함께 실행하면 문제가 없습니다. 내가 parallel_for를 사용하여 (디버그)를 실행하면 FratarProcess.exe가 0xc0000005에서 0x00f3d4ae에서 처리되지 않은 예외 "를 임의 지점에서 충돌 :. 액세스 위반 쓰기 위치은 0x0000000F을

참고 : 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++; 
    }); 
... 
} 

은 누군가가 나. 내가 사용하고 ++ 그래서 내가 다소 C에서 초보자의 생각합니다? 하나 대신 내 컴퓨터의 모든 8 개 개의 코어를 사용하여이 프로세스를 얻을 수있는 올바른 방향으로 지적받을 수 Visual C++ Express

답변

2

사용하지 않은 동기화 프로그램 sqlStrings에 대한 보호. 동기화를 사용하지 않고 컨테이너를 변경하거나 인쇄하여 출력하거나 여러 스레드에서 공유 변수를 동시에 증가시키는 것은 안전하지 않습니다.

combinable 객체 선언 :

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

을 그리고 루프 :

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

루프 후, 그들을 결합이 또한 문제를 해결할

+0

답을 읽고 더 많은 연구를 한 후, sqlStrings를 Concurrency :: concurrent_vector sqlStrings;로 선언해야하고, 하나의 테스트를 실행하는 것으로 보입니다. 여태까지는 그런대로 잘됐다. 저를 올바른 방향으로 인도 해 주셔서 감사합니다. –

3

:

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

그러면 루프를 수동으로 동기화하는 것과 달리 parallel_for이 빨라집니다.

+0

나는 이미 위의 답변을 표시했으나 귀하의 것이 틀림없는 것으로 보입니다. 게시 해 주셔서 감사합니다. 내가 그렇게 평판 좋은 평판을 요구한다면 나는 그것을 투표 할 것이다. 다시 게시 해 주셔서 감사합니다. –