我有一个多线程代码,我想在我的处理器拥有的所有4个内核上运行。即我创建了四个线程,我希望每个线程都在一个单独的核心上运行。
它会在四个内核上运行,但偶尔会切换到三个内核。唯一运行的是OS和我的exe。这有点令人失望,因为它将性能降低了四分之一,这对我来说非常重要。
我在任务管理器中看到的进程关联允许进程使用任何核心。我试图限制线程亲和力,但它没有帮助。我也尝试提高流程的优先级,但它也没有帮助。
所以问题是,有没有办法强制Windows让它在所有四个核心上运行?如果无法做到这一点,我可以降低这些中断的频率吗?谢谢!
答案 0 :(得分:1)
这不是亲和力的问题,除非我非常错误。当然,系统不会将您的进程限制为与特定线程集相关联。如果确实发生了这种情况,系统中的其他一些程序就必须这样做。
然而,更有可能的是,简单地说,还有另一个准备运行的线程,系统正在以循环方式进行调度。您有四个随时可以运行的线程。如果有另一个准备运行的线程,它将轮到它。现在有5个线程共享4个处理器。当另一个线程正在运行时,只有3个能够运行。
如果您想确保此类其他线程无法运行,则需要执行以下操作之一:
现在,在这些选项中,首先是首选。如果您将线程优先于其他线程,则其他线程根本无法运行。这真的是你想要发生的吗?
在问题中,您说没有其他进程在运行。如果是这种情况,并且没有人干涉处理器关联,并且只有一部分线程正在执行,那么唯一的结论就是并非所有线程都准备好运行并且还有工作要做。例如,如果您在一部分工作结束时加入您的主题,那么可能会发生这种情况,然后再继续下一步。
也许下一步就是缩小范围。使用Process Explorer之类的工具来诊断实际运行的线程。
答案 1 :(得分:0)
如果这是windows,请尝试SetThreadAffinityMask():
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx
我认为如果你只设置一个位,那么强制线程只在选定的处理器(核心)上运行。
其他进程/线程函数:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx
我使用的是Windows视频程序,它能够在渲染视频时让所有核心都以接近最大值的速度运行。