2013-07-05 31 views
0

我正在NUMA计算机中进行并行编程(我还没有计算机,计划很快到达)。在窗口中移动或指定线程堆栈空间

我在每个NUMA节点上都有一个工作线程池(处理器关联集合)和一个在池/节点之间均匀分布工作的平衡器。这是为了确保所有的内存分配都在本地内存上。这一切都很好,很棒。

启动期间,池工作线程从主线程创建,他们必须先做一些初始化设置,然后才能设置自己的亲和性(第三方库的要求,我无能为力)。

我担心会有隐藏的性能损失,因为工作线程的堆栈帧被分配到错误的节点上,导致外部内存访问。

这是一个真正的问题?不知怎的,我相信它已经被解决了......

无论如何,我正在寻找一种方法来确保每个线程的堆栈分配在正确的NUMA节点上。

我的专用Google男孩想出了这个:Allocating a Thread's Stack on a specific NUMA memory这是我想做的,但它是pthreads,我需要一个Windows解决方案。

回答

1

在MSDN上有关于这方面的信息显着缺乏,但鉴于我在听到关于Windows内存内部时听到的内容,我不会担心它,除非我开始看到明显的放缓。

在事情的计划中,即使跨节点内存访问仍然比说......交换到磁盘更快。更重要的是因为内存到活动页面的物理映射与windows上的内存空间(纯虚拟内存空间)没有关系,内核可能会根据亲和性重新映射每个线程的堆栈页面。

我真的不认为这会影响你,如果它会有一个暴露的解决方案,因为SQL Server团队很久以前就会遇到它。

+0

是的,MSDN上缺少的信息是我的警报“如果他们没有想到它会怎么样?”。 我担心的是,这种性能损失可能不会显示在我拥有的任何工具上,因此我无法检测到它。因此,我决定在这里先发制人地问:) “我真的不认为这会影响你,如果它已经有一个暴露的解决方案,因为SQL Server团队会遇到很长时间前。” 你也会认为他们会想出在Windows 8中删除启动按钮将是一个坏主意™,但我离题:) –

+0

我真的认为你在想这个。因为windows使用纯虚拟内存空间,所以容纳线程堆栈的页面可以很容易地复制到新的NUMA节点(并且可能甚至会在写入语义上进行天真拷贝)。这似乎更像是怀疑微软拥有胜任的工程师而不是真正的问题。 – Mgetz

+0

你可能是对的,我还没有采取任何愚蠢的措施。我只想确定这一点,因为我无法(我知道)来验证当我在实际硬件上运行它时(现在的任何一天,敲木头)这是否会导致可衡量的性能损失。缺少MSDN上的信息只是让我合法地担心,至少* I *会在关于CreateThread或类似的部分记录这一点......如果我对此负责。 –