Boost:: HPC的侵入性

Boost::Intrusive for HPC

本文关键字:HPC Boost      更新时间:2023-10-16

boost::intrusive库对高性能计算有多好?我想为一个不可复制的不可赋值类使用一个容器。我正打算用正常STL与shared_ptr。我发现boost::intrusive也可以用于同样的目的。所以我的问题是,他们真的那么有效率吗?

如果在具有shared_ptr类型的STL容器和boost::intrusive之间给出一个选项,您更喜欢哪一个?

通常,就内存使用而言,侵入式收集是最有效的。如果您的目标是压缩每一个最后的cpu周期,这是唯一的方法。

考虑一个boost共享指针列表。当创建一个新对象时发生的事情是:

  • 从堆中分配并初始化的对象
  • 基于原始指针的boost共享指针的构造函数在堆上分配另一个对象来存储对象的引用计数器(这就是为什么boost侵入式指针更好,因为引用计数器存储在对象中,避免了这种分配)
  • list::insert分配一个列表节点并复制共享指针

在上面的例子中,创建一个新对象并将其插入到一个集合中涉及到三次内存分配。

现在考虑使用侵入式列表。对于相同的任务,发生的情况是:

  • 一个新对象被分配和初始化
  • list::insert只分配给对象的列表节点指针,因为节点嵌入在对象中并且已经分配了

在这里,只分配一次内存。由于使用侵入式收集时cpu地址更少,cpu缓存得到更好的利用,导致更少的缓存丢失以及更少的内存占用(称为引用局部性原则)。

侵入式集合的缺点是必须事先知道一个对象一次可以作为元素的类型和多少个集合。根据我个人的经验,这种额外的预先思考会导致更简洁的设计。