原子整数错误地递增?英特尔 TBB 实施
Atomic int incorrectly incrementing? Intel TBB Implementation
我正在实施一个多线程程序,以使用英特尔 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。此外,您可能希望在循环条件中使用!=
而不是<=
。
相关文章:
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 手动管理和更新英特尔 TBB 流程图?
- 英特尔 TBB 计算图:如何指定节点的输入队列容量
- 在调试模式下使用英特尔 TBB
- 如何使用英特尔 TBB 并发无序列图
- 英特尔 TBB - "初始化关键部分 Ex":找不到标识符编译器错误
- 英特尔 TBB,执行具有并行 for 的成员函数
- 英特尔 TBB,parallel_pipeline,当我在阶段之间传递常量字符*时出错
- 与 Nuwen 一起设置英特尔 TBB
- 英特尔TBB内存开销
- 如何在任务组中在英特尔TBB中等待单个任务并杀死其他任务
- 英特尔 TBB 编译和测试
- 英特尔TBB链接和rpath
- 用于服务网络连接的英特尔TBB任务 - 良好的模型
- 如何在英特尔TBB中拥有长时间等待的线程
- 编译适用于Android的英特尔TBB-ARMv7 ARMv8 MIPS
- 链接英特尔 TBB 库时出现问题
- 英特尔TBB在并行线程中运行函数
- 英特尔 tbb 任务调度是否适用于 DBMS
- 英特尔 TBB 与 CilkPlus