2013-02-16 2 views
0

을 사용하는 잠금 임계 영역이없는 C++ 병렬 루프에는 PPL로 구현 된 parallel_for 루프가 있습니다. 주요 문제는 여기에 있습니다. cs.lock() 및 cs.unlock() 주석을 달았을 때 abc 벡터 값이 올바르지 않습니다. 무작위로 액세스 배열 값을 concurrency_vector 형식을 사용하고 있지만 작동하지 않는 것. 중요한 부분을 잠그고 있지만 작동하지만 느립니다. 또한 속도 향상을 위해 2D- concurrency_vector를 사용하지 않고 값을 저장하기 위해 인덱싱을 사용했습니다. 중요한 부분을 잠그지 않고 문제가 무엇인지, 놓친 부분이 무엇입니까?아래 코드에서 PPL

#include <iostream> 
#include <ppl.h> 

using namespace concurrency; 
using namespace std; 

int test_function() 
{ 
    critical_section cs; 

    concurrent_vector<double> abc(300 * 400, 1000); 

    parallel_for (0, 1000, [ & ](int k) { 
     for (int y = 0; y < 300; y++) { 
      for (int x = 0; x < 400; x++) { 

       /// k is using with some calculations for thr 

       cs.lock(); 

       if (thr < abc[ 400 * y + x ]) { 

        abc[ 400 * y + x ] = thr; 
       } 

       cs.unlock(); 
      } 
     } 
    }); 
} 

답변

2

왜 작동한다고 생각하십니까? 이것이 잠금없이 병렬로 실행되는 경우 abc[400*y+x]은 if 문과 할당 사이에서 변경 될 수 있으므로 논리를 깨뜨릴 수 있습니다. thread 세이프 인 벡터 타입 자체는 이것과 아무런 관련이 없습니다.

+0

빠른 답변 감사드립니다. if-statement가 문제의 원인이며 우리가이를 보호해야합니까? – user2055437

+0

@ user2055437 계산에 다른 문제가있는 경우가 아니면 그럴 것 같습니다. 그리고 물론 이것은 느릴 것입니다 - 잠금/잠금 해제가 느리고 많은 일을해야합니다. 또한 불필요한 대기로 끝납니다. 세분화 된 잠금을 사용하면 (abc의 각 요소에 하나씩 300 * 400의 중요한 섹션을 만든 다음 잠금에 사용하는 경우) 약간의 성능 향상을 볼 수 있습니다. – Cubic

+0

시간을 훔쳐서 죄송합니다. 마지막으로 읽을 수있는 코드 블록 예제 나 예제 사이트를 제공 할 수 있습니까? – user2055437

관련 문제