2
멀티 스레드 프로그램을 구현하여 인텔 TBB를 사용하는 일련의 숫자에 대해 Collatz 추측을 확인하고 원자 번호가 <int> count
(유효성이 검사 된 개수를 유지하는 이유)을 파악하는 데 문제가 있습니다.)가 올바르게 증가하지 않습니다.원자 int가 잘못 증가합니까? 인텔 TBB 구현
아래 나열된 관련 코드의 경우 작은 간격 (1-10의 숫자 만 유효성 검사를했지만 간격이 커짐에 따라 문제가 커짐)을 사용하고 카운트 수에 대해 일관되게 반환 값 18을 얻습니다. 어떤 아이디어?
task_scheduler_init init(4);
atomic<int> count;
void main
{
tick_count parallel_collatz_start = tick_count::now();
parallel_collatz();
tick_count parallel_collatz_end = tick_count::now();
double parallel_time = 1000 *(parallel_collatz_end - parallel_collatz_start).seconds();
}
void parallel_collatz()
{
parallel_for
(
blocked_range<int>(1,10), [=](const blocked_range<int>&r)
{ for (int k = r.begin(); k <= r.end(); k++) { collatz(k); } }
);
}
long long collatz (long long n)
{
while (n != 1) {
if (n%2 == 0)
n = (n/2);
else
n = (3*n + 1);
}
if (n == 1) {
count++;
return n;
}
return -1;
}
감사합니다. 나는 생성자가 half-open 범위를 사용했다는 것을 알지 못했다! 또한 <= to! =를 변경하면 문제가 해결되었습니다. – Vance