Atomic int错误地递增?英特尔TBB实施
问题描述:
我正在实施一个多线程程序来验证使用英特尔®TBB的一系列数字的Collatz猜想,并且我无法弄清楚为什么原子变量<int> count
(它保持有多少数字被验证)未正确递增。Atomic 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;
}
答
的原因可能是在构造函数中使用了半开区间,[1, 10)
这意味着1包10排他性的,这样你就不会验证数字1-10而是1-9。此外,您可能希望在循环条件下使用!=
而不是<=
。
谢谢。我不知道构造函数使用半开范围!另外,将 Vance 2012-04-18 05:06:46