我们在买电脑的时候,经常会看 cpu 的参数,对 cpu 的描述有这几种:“双核”、“双核四线程”、“四核”、“四核四线程”、“四核八线程”……。
我们接触的电脑基本上都只有一个 cup。cpu 的个数很容易得到,螺丝刀拆开你的电脑数一下就行了。这没有什么好说的。
为了给电脑更高的性能,一个 cup 中集成了多个内核,这样电脑的性能就成倍的提升。随着科技的发展,我们发现每个内核的性能也变的十分强大,于是一个内核又被分成两个线程。但是,我们要注意的是,一个 cpu 分成多个内核,这是物理的分隔,拆开 cpu 是可以看到的;但是一个内核被分成两个线程是一种超线程技术,也就是串代码,操作系统会认为一个线程也是一个内核,有点欺骗操作系统的感觉。
如果操作系统说我的 cpu 有四核,这时我们要提高警惕,是真四核还是四线程(假四核)。
这是我的台式机 windows7:
任务管理器显示有 4 核。
设备管理器显示依然为 4 核
我百度了一下:
原来我的电脑是假四核。
其实 windows 有一个命令是可以查看的:
在 cmd 命令中输入 “wmic”,回车;然后再输入 “cpu get ”。
NumberOfCores:表示 CPU 核心数
NumberOfLogicalProcessors:表示 CPU 线程数
修改处理器个数物理内核个数是不能修改的,但是假内核个数是可以修改的:
处理器个数修改成 3,保存重启电脑。
任务管理器中已经改变:
设备管理器未发生改变:
如何禁用超线程技术Hyper-Threading 是 Intel 微处理器采用的一种技术,这种技术能够让微处理器在操作系统和应用程序中的性能表现的类似于两个处理器一样。
进入 BIOS,找到 Hyper-Threading 选项设置成 disable。
保存设置,启动电脑。
任务管理器发生了变化:
设备管理器也发生了变化:
超线程这个东西并不是开了就一定比不开的好。
因为每个CPU核心里ALU,FPU这些运算单元的数量是有限的,而超线程的目的之一就是在一个线程用运算单元少的情况下,让另外一个线程跑起来,不让运算单元闲着。
但是如果当一个线程整数,浮点运算各种多,当前核心运算单元没多少空闲了,这时候你再塞进了一个线程,这下子资源就紧张了。两线程就会互相抢资源,拖慢对方速度。
至于,超线程可以解决一个线程cache miss,另外一个可以顶上,但是如果两个线程都miss了,那就只有都在等了。这个还是没有GPU里一个SM里很多warp,超多线程同时跑来得有效果。
所以,如果你的程序是单线程,关了超线程,免得别人抢你资源,如果是多线程,每个线程运算不大,超线程比较有用。
CPU 个数,核心数,线程数我们在买电脑的时候,经常会看 cpu 的参数,对 cpu 的描述有这几种:“双核”、“双核四线程”、“四核”、“四核四线程”、“四核八线程”……。
我们接触的电脑基本上都只有一个 cup。cpu 的个数很容易得到,螺丝刀拆开你的电脑数一下就行了。这没有什么好说的。
为了给电脑更高的性能,一个 cup 中集成了多个内核,这样电脑的性能就成倍的提升。随着科技的发展,我们发现每个内核的性能也变的十分强大,于是一个内核又被分成两个线程。但是,我们要注意的是,一个 cpu 分成多个内核,这是物理的分隔,拆开 cpu 是可以看到的;但是一个内核被分成两个线程是一种超线程技术,也就是串代码,操作系统会认为一个线程也是一个内核,有点欺骗操作系统的感觉。
如果操作系统说我的 cpu 有四核,这时我们要提高警惕,是真四核还是四线程(假四核)。
这是我的台式机 windows7:
任务管理器显示有 4 核。
设备管理器显示依然为 4 核
我百度了一下:
原来我的电脑是假四核。
其实 windows 有一个命令是可以查看的:
在 cmd 命令中输入 “wmic”,回车;然后再输入 “cpu get ”。
NumberOfCores:表示 CPU 核心数
NumberOfLogicalProcessors:表示 CPU 线程数
修改处理器个数物理内核个数是不能修改的,但是假内核个数是可以修改的:
处理器个数修改成 3,保存重启电脑。
任务管理器中已经改变:
设备管理器未发生改变:
如何禁用超线程技术Hyper-Threading 是 Intel 微处理器采用的一种技术,这种技术能够让微处理器在操作系统和应用程序中的性能表现的类似于两个处理器一样。
进入 BIOS,找到 Hyper-Threading 选项设置成 disable。
保存设置,启动电脑。
任务管理器发生了变化:
设备管理器也发生了变化:
超线程这个东西并不是开了就一定比不开的好。
因为每个CPU核心里ALU,FPU这些运算单元的数量是有限的,而超线程的目的之一就是在一个线程用运算单元少的情况下,让另外一个线程跑起来,不让运算单元闲着。
但是如果当一个线程整数,浮点运算各种多,当前核心运算单元没多少空闲了,这时候你再塞进了一个线程,这下子资源就紧张了。两线程就会互相抢资源,拖慢对方速度。
至于,超线程可以解决一个线程cache miss,另外一个可以顶上,但是如果两个线程都miss了,那就只有都在等了。这个还是没有GPU里一个SM里很多warp,超多线程同时跑来得有效果。
所以,如果你的程序是单线程,关了超线程,免得别人抢你资源,如果是多线程,每个线程运算不大,超线程比较有用。