#pragma omp parallel for
for(span=0;span<info.nospanelement;span++) {
some_function(info,wakePtr[time][span],P,w_ind,1);
//additions to be done each repeat
#pragma omp atomic
w_wake[0] += w_ind[0];
#pragma omp atomic
w_wake[1] += w_ind[1];
#pragma omp atomic
w_wake[2] += w_ind[2];
}
평행 합계를보다 효율적인 방법은 (해당 스레드에서 본) 전용 변수의 값을 누적 각 스레드를 가지고있다 :
간단하지만 비효율적 인 해결 방법은 원자 추가를 사용하는 부분합을 얻는다.
#pragma omp parallel
{
int wake0 = wake1 = wake2 = 0; // private variables
#pragma omp for
for(span=0;span<info.nospanelement;span++)
{
some_function(info,wakePtr[time][span],P,w_ind,1);
//additions to be done each repeat
wake0 += w_ind[0]; // accumulate in private variable
wake1 += w_ind[1];
wake2 += w_ind[2];
}
// now we're out of the loop but still inside the parallel region
// so, let's add up the partial sums
#pragma omp atomic
w_wake[0] += wake0;
#pragma omp atomic
w_wake[1] += wake1;
#pragma omp atomic
w_wake[2] += wake2;
}
그것은 OpenMP를이 감소 작업을 관리해야하는 것이 좋습니다,하지만,하지만 당신은 배열에 결과를 저장해야하는 경우는 아마 쉽게는 자신이 방법으로 만 할 수 있습니다. 한편
, 당신이 정말로 다음 배열을 필요로하지 않는 경우에 당신은 단순히이 작업을 수행 할 수 있습니다
int wake0 = wake1 = wake2 = 0; // SHARED variables this time
#pragma omp parallel for reduction(+ : wake0, wake1, wake2)
{
for(span=0;span<info.nospanelement;span++)
{
some_function(info,wakePtr[time][span],P,w_ind,1);
//additions to be done each repeat
wake0 += w_ind[0]; // accumulate in private variable
wake1 += w_ind[1];
wake2 += w_ind[2];
}
}
를 "내가 몇 가지 오류 받고 있어요"어떤 오류가? – Borgleader