【发布时间】:2018-12-10 05:21:54
【问题描述】:
这是一个关于 NUMA 的问题。
例如,在下面的代码中,缓冲区是否在线程/进程的整个生命周期中都分配在本地内存中?
for (int th = 0; th < maxThreads; th++)
{
threads[th] = std::thread([&, th] {
int* buffer = new int[1000];
// do something
delete []buffer;
}
}
更新:为了让问题更直接,让我这样问。如果我有 10 个同时启动的线程(例如,t0 到 t9),并且在每个线程的范围内,它会分配一个内存块(例如,m0 到 m9)。在线程退出之前,线程 t_n 是否总是在 m_n(n 从 0 到 9)上运行,或者线程 0 可能会迁移并在内存 9 上运行?在我的情况下内存块不是很大,通常只有几兆字节。
【问题讨论】:
-
这将是特定于实现的;你的编译器是什么?
-
我主要使用 Visual Studio 编译器或 intel 编译器(与 Visual Studio 捆绑)
-
鉴于您使用的是 Visual Studio,您可能想从这里开始:docs.microsoft.com/en-us/windows/desktop/procthread/…
-
thanks @AndrewHenle 我不知道如何理解第一节末尾关于 VirtualAllocExNuma 的这句话:“如果首选节点用完页面,内存管理器将使用来自其他节点的页面. 如果内存被调出,调回时使用相同的进程。这是否意味着如果内存是从其他节点分配的,那么使用内存的进程也在那个“其他”节点上?
标签: c++ multithreading memory allocation numa