2
インテル®TBBを使用した一連の数値に対するCollatzの憶測を検証するためのマルチスレッド・プログラムを実装していますが、アトミック変数<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;
}
ありがとうございました。私は、コンストラクタが半オープン範囲を使用していたことに気づいていませんでした!また、<= to!=を変更すると問題が解決しました。 – Vance