2

Intel TBB を使用して、ある範囲の数値について Collat​​z Conjecture を検証するマルチスレッド プログラムを実装していますが、原子変数<int> count(検証された数値の数を保持する) が正しくインクリメントされない理由を理解するのに苦労しています。

以下にリストされている関連するコードでは、小さな間隔を使用しました (1 ~ 10 の数字のみを検証しますが、間隔が大きくなるにつれて問題が拡大します)。count の戻り値は一貫して 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;
}
4

1 に答える 1

2

その理由はおそらく、コンストラクターが半開きの範囲を使用している[1, 10)ためです。これは、1 を含む 10 を含まないことを意味するため、数値 1 から 10 ではなく 1 から 9 を検証しています。さらに、ループ条件!=の代わりに使用することをお勧めします。<=

于 2012-04-18T04:38:17.267 に答える