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();
}
}
});
}
빠른 답변 감사드립니다. if-statement가 문제의 원인이며 우리가이를 보호해야합니까? – user2055437
@ user2055437 계산에 다른 문제가있는 경우가 아니면 그럴 것 같습니다. 그리고 물론 이것은 느릴 것입니다 - 잠금/잠금 해제가 느리고 많은 일을해야합니다. 또한 불필요한 대기로 끝납니다. 세분화 된 잠금을 사용하면 (abc의 각 요소에 하나씩 300 * 400의 중요한 섹션을 만든 다음 잠금에 사용하는 경우) 약간의 성능 향상을 볼 수 있습니다. – Cubic
시간을 훔쳐서 죄송합니다. 마지막으로 읽을 수있는 코드 블록 예제 나 예제 사이트를 제공 할 수 있습니까? – user2055437