如何让程序运行在所有CPU核心上

如何让程序运行在所有CPU核心上,第1张

实现方法进程与指定cpu绑定 :SetProcessAffinityMask(GetCurrentProcess(),dwMask); 线程与指定cpu绑定: SetThreadAffinityMask(GetCurrentThread(),dwMask);dwMask为CPU序号的或运算值:1(0001) 代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2 ,以此类推。

设置之前最好判断一下系统有几个CPU: SYSTEM_INFOSystemInfoGetSystemInfo(&SystemInfo);CPU个数:SystemInfo.dwNumberOfProcessors 当前启用的CPU序号: SystemInfo.dwActiveProcessorMask ,Mask representing the set of processors configured into the system. Bit 0 is processor 0bit 31 is processor 31. CPU亲缘性介绍 按照默认设置,当系统将线程分配给处理器时,Windows使用软亲缘性来进行 *** 作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。 有一种新的计算机结构,称为NUMA(非统一内存访问),在该结构中,计算机包含若干块插件板,每个插 件板上有4个CPU和它自己的内存区。 当CPU访问的内存是它自己的插件板上的内存时,NUMA系统运行的性能最好。如果CPU需要访问位于另一个插件板上的内 存时,就会产生巨大的性能降低。在这样的环境中,就需要限制来自一个进程中的线程在共享同一个插件版的CPU上运行。为了适应这种计算机结构的需要,Windows允许你设置进程和线程的亲缘性。换句话说,你可以控制哪个CPU能够运行某些线程。这称为硬亲缘性。请注意,子进程可以继承进程的亲缘性。

注意:

(1)无论计算机中实际拥有多少个CPU,Windows98及以前系统只使用一个CPU,上述API不被支持。

(2)在大多数环境中,改变线程的亲缘性就会影响调度程序有效地在 各个CPU之间移植线程的能力,而这种能力可以最有效地使用CPU时间。 应用场景举例: 将UI线程限制在一个CPU,将其他实时性要求较高的线程限制在另一个CPU。这样,当UI需要占用大量CPU时间时,就不会拖累其他实时性要求较高的线程的执行 。同样可以将UI线程与一些优先级不高但耗时的异步运算线程设置在不同CPU上,避免UI给人卡顿的感觉。

一般双核CPU默认的是会使用双核的。

你的情况有两种可能。

1.双核被禁用了

① 有些电脑的BIOS中有禁用双核的选项,例如Advanced>Core Multi-Processing;

② *** 作系统中可以设置禁用双核,xp中是,开始--运行--输入msconfig--打开"系统配置使用程序",BOOT.INI--高级选项--/NUMPROC(N)=,这里选了1;或者是设备管理器中,一个核心被成功禁用了;vista中,开始--运行--输入msconfig--高级选项中 处理器数前面的方框选中,下拉菜单中选择了1。

2.可能是你那个程序比较老,不能识别到两个CPU核心,有些程序根本不支持两个CPU核心,或是在两个CPU核心工作下比一个核心工作下出现问题,这种情况,你可以下一个兼容双核的版本。

默认是没有限制的。

任务管理器

中,右键点某个进程,可以指定这个进程只允许使用几个核心。

如果是

4核CPU

,只让某进程使用一个核心的话,那么最高使用率就只有25%了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12044163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存