我们正在使用一些带有 2 个 CPU 的系统,每个 CPU 有 6 个内核/12 个线程,因此总共有 24 个线程,用于相当多的多线程模拟。由于问题不能完美扩展,我通常并行运行 4 个问题,每个问题有 5 个线程。剩下 4 个内核来运行 4 个线程,这些线程将启动模拟和预处理和后处理。我注意到相同模拟存在一些奇怪的性能差异。
我的想法是,通过使用亲和性,我可以进一步调节性能,引导进程不要分布在 2 个 CPU 上,这样问题就不会扩散到缓存和内存的不同部分,而是固定在单个 CPU 或 CPU 上的一组核心上。
我知道一旦进程运行,如何在任务管理器中设置亲和性,但我喜欢在批处理文件中进行设置。
例如:
启动/affinity HEXNUM myprog3.exe
例如,其中 HEXNUM 为:1F000(011111000000000000 的十六进制表示形式
如果目标是在 cpu2 的 core:0,1,2,3,4 上运行它
或者,如果目标是在 cpu1 的核心 0、1、2、3、4 上运行它,则 HEXNUM 1F 是 011111 的十六进制表示。
但是不知为何它似乎不起作用,正如我所期望的那样:当我在 5 个线程上启动模拟时,没有亲和性规范,该过程占用了 20-21% 的 CPU。当我启动 5 个线程并与 6 个核心具有亲和性时,它也能工作,但是当我启动 5 个线程并与 5 个核心具有亲和性时。它只占用 13%,如果我查看任务管理器(Windows 7 64 Pro),它似乎只使用核心 1、3、5。
使用奇数个核心来实现亲和性规范是否存在问题?还是我做错了什么?
有没有人有使用亲和性规范的经验,并设法获得一些性能提升?你使用了哪些策略?