我使用的是具有 16 个内核的 AMD Ryzen 7950X。借助同步多线程 (SMT),Windows 11 将其识别为具有 32 个虚拟内核。我的应用程序是一个国际象棋引擎,它受益于多个内核,但无法有效利用虚拟内核。它在 16 个独立的物理内核上运行速度比在 32 个虚拟内核上运行速度更快,因为后者会导致每个虚拟内核由于共享资源而变慢。
以前,在其他 CPU 上,当我运行线程数等于或小于 CPU 核心数的应用程序时,负载会均匀分布在所有物理核心上。但是,使用我的新 7950X,我注意到了不同的行为。当我运行 16 个线程时,Windows 似乎将它们分配给虚拟核心 0-16,这些虚拟核心对应于物理核心 0-7,而核心 8-15 则处于空闲状态。这似乎是 Windows 试图将进程保留在单个核心复合芯片 (CCD) 中,这可能对某些应用程序有益,但对我的应用程序无益。
结果,我的应用程序的执行速度慢了约 40%,因为它的 16 个线程仅使用 8 个物理核心。
我曾考虑过将进程亲和性设置为在偶数或奇数核心之间交替,但我宁愿不这样做。我的应用程序的其他部分可以从 SMT 中受益,而且每次启动应用程序时都必须更改亲和性是一件很繁琐的事情。
有没有办法修改或禁用此行为,以便更好地利用我的 Ryzen 7950X 的物理核心来满足我的特定用例?