gpt4 book ai didi

c - 如何在 Windows 10 上通过 openMP 使用所有 NUMA 节点

转载 作者:可可西里 更新时间:2023-11-01 10:31:56 24 4
gpt4 key购买 nike

我可以访问由两个 NUMA 节点组成的双路系统来进行一些数据处理。

我的代码相对简单,我将 openMP 用于一个看起来像这样的可并行化主循环(k 是一个函数参数,buffer 是一个几千兆字节的长度为 n 的数组):

uint64_t m=0;
uint64_t *rk = (uint64_t *) calloc(k, sizeof(uint64_t));
#pragma omp parallel
{
#pragma omp for reduction(+:m), reduction(+:rk[:k])
for (uint64_t i=0; i<n-k; i++)
{
m += (uint64_t)buffer[i];
for (uint64_t j=0; j<k; j++)
{
rk[j] += (uint64_t)buffer[i]*(uint64_t)buffer[i+j];
}
}
/* Other stuff, serial and parallel */
}

在 Linux Mint 下,我可以毫无问题地使用 gcc 进行编译,并且两个插槽上的所有内核都得到了很好的利用。但是,在 Windows 上(cygwin 上的 mingw-gcc)仅使用单个 NUMA 节点。由于我的代码对内存延迟并不十分敏感,因此我在 Windows 上的运行速度降低了 2 倍。

我不知道如何强制 Windows 在两个节点上传播线程。据我所知,openMP 不支持 Windows 上的亲和性(cygwin mingw-gcc 实现无论如何),但我不知道我应该如何手动完成。

非常感谢任何帮助!

最佳答案

我找到了问题的原因。机器上有超过 64 个逻辑核心,因此 Windows 需要两个 CPU 组来处理它们。默认情况下,它将每个 NUMA 节点放在自己的组中。

如果您的物理内核少于 64 个,修复方法是禁用 HTT,或者禁用 bios 中的 NUMA 分组。在后一种情况下,前 64 个逻辑内核将被分组并在 Windows 中显示为单个 NUMA 节点,其余的则放置在第二个节点中。理想的解决方案将取决于您的特定应用程序,无论您是受益于使用所有内核还是受益于超线程......

[编辑]您也可以手动管理线程。如果您想这样做,我建议深入研究 Processtopologyapi.hprocessthreadsapi.h,特别是研究函数 GetActiveProcessorCountSetThreadGroupAffinity

关于c - 如何在 Windows 10 上通过 openMP 使用所有 NUMA 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52544875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com