原子整数错误地递增?英特尔 TBB 实施

Atomic int incorrectly incrementing? Intel TBB Implementation

本文关键字:英特尔 TBB 实施 整数 错误      更新时间:2023-10-16

我正在实施一个多线程程序,以使用英特尔 TBB 验证一系列数字的科拉茨猜想,并且我无法弄清楚为什么原子变量 <int> count(它保留验证了多少个数字的计数)没有正确递增。

对于下面列出的相关代码,我使用了一个小间隔(只验证数字 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;
}

原因可能是构造函数使用半开放范围,[1, 10)这意味着 1 包含 10 独占,因此您验证的不是数字 1-10,而是 1-9。此外,您可能希望在循环条件中使用!=而不是<=