2012-04-18 11 views
2

インテル®TBBを使用した一連の数値に対するCollat​​zの憶測を検証するためのマルチスレッド・プログラムを実装していますが、アトミック変数<int> count(有効数字の数をカウントし続ける理由)は正しくインクリメントされません。アトミックintが間違ってインクリメントしていますか?インテル®TBBのインプリメンテーション

以下の関連コードについては、小さな間隔(1〜10の数字だけを検証していますが、間隔が大きくなるにつれて問題のスケールが変わります)を使用しています。何か案は?

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

理由は、コンストラクタは半開範囲、1以上10以下の排他的意味[1, 10)を使用することはおそらくあるので、あなたは、番号1-10ではなく、1-9を検証していません。さらにループの状態で<=の代わりに!=を使用するとします。

+0

ありがとうございました。私は、コンストラクタが半オープン範囲を使用していたことに気づいていませんでした!また、<= to!=を変更すると問題が解決しました。 – Vance

関連する問題