2012-04-18 3 views
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; 
} 

답변

2

이유는 생성자가 반 개방 범위, 일 포함 10 배타적 인 의미 [1, 10)을 사용 아마도, 그래서 당신은 숫자 1-10 아니라 1-9을 검증 할 수 없습니다 있습니다. 또한 루프 상태에서 <= 대신 !=을 사용하려고합니다.

+0

감사합니다. 나는 생성자가 half-open 범위를 사용했다는 것을 알지 못했다! 또한 <= to! =를 변경하면 문제가 해결되었습니다. – Vance