C ++:在大型旧版代码库中解决NUMA兼容性问题

我有一个Windows C ++应用程序,该应用程序大量使用了多线程。我使用自定义线程池实现来管理std :: threads,并从代码库中数百个不同位置向他们发送任务。这些任务通常与读取/修改数十种不同的巨大数组和数据结构(数组,std :: vector,std :: unordered_maps等,具有数百万个元素)中的值有关。我还实现了本身是多线程的各种第三方库(使用TPP,OpenmP等)。基本上,我要绘制的图片是一个大型代码库,具有分散在数百个函数和库中的各种线程方法。一切都可以在旧式多核CPU上很好地工作。

但是,我收到用户的报告说Ryzen Threadripper CPU的性能严重下降。我无权使用Ryzen机器进行测试,但粗略的研究似乎指向多NUMA架构,而NUMA内核从非相邻内存位置读取导致的速度下降,我认为这是有道理的。 >

我已经看到了在Stackoverflow上发布的一些示例,这些示例涉及用于非常基本的数组初始化的NUMA友好型第一触分配,但是这些似乎效率不高(必须先初始化数组,然后对第一触进行迭代,然后发送给线程。 ..),而不是可以轻松转换为具有数百个初始化和访问的数据结构的代码的东西。无论如何,我包括的一些不透明的第三方库都无法适应此要求。

在一个大型项目中,人们将如何开始寻求NUMA兼容?有什么简单的我想念的吗?我是否应该仅将进程/线程关联性设置为单个NUMA内核并完成此操作?还是有一种更合理的方式来应对这种情况?

liuxinnc 回答:C ++:在大型旧版代码库中解决NUMA兼容性问题

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3111448.html

大家都在问