Atomic doubles/floats in Intel TBB

8
根据文档,原子支持整数类型、枚举类型或指针类型的 T。Intel TBB 官方支持浮点数/双精度吗?我看到一些补丁 (这里) 和 Raf Schietekat 的 (这里),这些可能已经被合并到最新的 4.0 版本中,也可能没有。从我阅读的补丁中,唯一的主要区别是从整数类型到浮点数/双精度的 reinterpret_cast 添加。如果有人能澄清这一点,我将不胜感激。谢谢!
3个回答

1

C++11支持原子浮点数和双精度浮点数。像std::atomic_fetch_add这样的算术函数仅支持整数类型。

如果您使用的是C++11编译器,我建议您切换到std::atomic,这样您就不必依赖于未记录的行为。


1
值得注意的是,算术函数可以使用std::atomic轻松高效地模拟。 - Cory Nelson
有趣。最好的方法是什么?是比较和交换循环吗?(获取当前值并尝试将其与新结果交换。如果因为值已更改而失败,则重试。) - Philipp Claßen

1

您可以轻松地在64位和32位原子整数的基础上添加浮点数支持。原子加载/存储/交换可以使用reinterpret_cast直接包装实现,原子算术操作可以使用带有原子比较交换的循环实现。


0

test_atomic.cpp 中非整数类型的测试是在2008年添加的(就在与Raf讨论的时间之后不久)。因此,即使在问题提出的时间之前,TBB也支持float&double原子操作(但仅限于fetch_and_store和compare_and_exchange读取-修改-写入操作)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接