0
openmp에서 두 가지 다른 버전의 축소 기능을 사용하고 있으며 결과가 완전히 다릅니다. 다음 중 잘못된 것은 무엇입니까? openmp를 사용한 잘못된 축소
omp_set_num_threads(t);
long long unsigned int d = 0;
#pragma omp parallel for default(none) shared(some_stuff) reduction(+:d)
for (int i=start; i< n; i++)
{
d += calc(i,some_stuff);
}
cout << d << endl;
와 두 번째 버전
은 이것이다 :omp_set_num_threads(t);
//reduction array
long long unsigned int* d = new long long unsigned int[t];
for(int i = 0; i < t; i++)
d[i] = 0;
#pragma omp parallel for default(none) shared(somestuff, d)
for (int i=start; i< n; i++)
{
long long unsigned dd = calc(i, somestuff);
d[omp_get_thread_num()] += dd;
}
long long unsigned int res = 0;
for(int i = 0; i < omp_get_num_threads(); i++){
res += d[i];
}
delete[] d;
cout << res << endl;
@emab, 두 번째 접근법은 Hristo가 지적한 바와 같이 오류가 발생하는 것 외에도 허위 공유 때문에 제대로 수행되지 않습니다. –