C++ 如何控制第三方库的内存分配?

C++ 如何控制第三方库的内存分配?,c++,memory-management,numa,C++,Memory Management,Numa,我正在一台有两个NUMA节点的服务器上开发一个实时应用程序。以下是系统图的简化版本(操作系统为Ubuntu14.04): ---------------------------------。 |设备0 | |设备1| .-------------. .-------------. || || || || .-------------. .-------------. |PC

我正在一台有两个NUMA节点的服务器上开发一个实时应用程序。以下是系统图的简化版本(操作系统为Ubuntu14.04):

---------------------------------。
|设备0 | |设备1|
.-------------.          .-------------.
||                       ||
||                       ||
.-------------.          .-------------.
|PCIE插槽0 | | PCIE插槽1|
.-------------.          .-------------.
||                       ||
||                       ||
.-------------. QPI链接。-------------。
|CPU 0 | | CPU 1|
.-------------.          .-------------.
||                       ||
||                       ||
.-------------.          .-------------.
|内存节点0 | |内存节点1|
.-------------.          .-------------.
这两个设备做完全相同的事情,但是它们每个都消耗了一个CPU的所有能量,所以我必须创建两个线程来分别控制它们。我还必须使用第三方库来控制这两个设备。 虽然我可以使用
numa_alloc
在我自己的线程中的本地节点上分配内存,但这不会改变第三方库分配自己内存的方式

首先:如果我只使用一台带有
numactl--membind
的设备运行程序,我会获得非常好的性能

Second:如果我使用两台设备运行程序,而不使用
numactl--membind
,则两台设备的性能都相对较好,但如果运行时间较长,性能就不太稳定

第三次:如果我使用两个设备与
numactl--membind
一起运行程序,比如说
numactl--membind=0
,那么设备0的性能相当好,但设备1的性能不好,反之亦然

基于以上观察,我怀疑内存局部性是这里的性能瓶颈


我的问题:我可以在我的线程中设置某种约束,以便该线程中的所有内容都分配到特定的NUMA节点上,包括第三方库的节点吗

你有这个库的源代码吗?如果您这样做并且它使用new,则始终可以覆盖new和delete运算符。否则,我认为没有办法控制预建库的分配。@patatahooligan,是的,它是开源的。有趣的是,new/delete可以重载。但是这会不会对程序产生一些副作用/影响?如果他们的库已经提供了一个新的操作员,你可能会破坏一些东西。调试之外的大多数新操作符用于对齐数据,因此只要您强制执行相同或更严格的对齐,就可以安全地替换它们。如果需要,请确保替换它们的实现。新运算符有多个定义会导致未定义的行为!相关:你有这个库的源代码吗?如果您这样做并且它使用new,则始终可以覆盖new和delete运算符。否则,我认为没有办法控制预建库的分配。@patatahooligan,是的,它是开源的。有趣的是,new/delete可以重载。但是这会不会对程序产生一些副作用/影响?如果他们的库已经提供了一个新的操作员,你可能会破坏一些东西。调试之外的大多数新操作符用于对齐数据,因此只要您强制执行相同或更严格的对齐,就可以安全地替换它们。如果需要,请确保替换它们的实现。新运算符有多个定义会导致未定义的行为!相关的:
.-------------.          .-------------.
| Device 0    |          | Device 1    |
.-------------.          .-------------.
      ||                       ||
      ||                       ||
.-------------.          .-------------.
| PCIE slot 0 |          | PCIE slot 1 |
.-------------.          .-------------.
      ||                       ||
      ||                       ||
.-------------. QPI link .-------------.
| CPU 0       |<-------->| CPU 1       |
.-------------.          .-------------.
      ||                       ||
      ||                       ||
.-------------.          .-------------.
| Mem node 0  |          | Mem node 1  |
.-------------.          .-------------.