2023年12月28日  更新


现在这个AI火热的时代科学计算任务占比越来越大,但是平时使用时也有一些不为人注意的地方需要知道,本文就讨论一下使用超线程CPU时的注意事项。

超线程CPU就是现在的多线程CPU,以Intel和AMD的X86 CPU为例,一个10个物理核心的CPU则有20个逻辑核心,其中多出来的10个核心就是超线程架构扩展出的逻辑CPU核心。假设1个物理核心的计算能力为100%,那么扩展多出的一个逻辑核心的计算能力为30%,也就是说1个物理核心扩展出1个物理核心和一个逻辑核心,那么总性能为130%而不是200%。

一个10个物理核心的CPU,开启超线程功能,共20个逻辑核心。假设一个科学计算任务需要使用5个CPU逻辑核心,在开启超线程的CPU上用时1个小时完成任务,CPU使用率为25%;那么同时运行两个该任务,那么占用10个CPU逻辑核心,两个任务并行运行且同时完成,用时仍为1个小时,CPU使用率为50%。

继续思考(重点内容):

如果这次是同时运行四个该任务,那么占用20个CPU逻辑核心,四个任务并行运行,CPU使用率为100%,总用时为4/2.6=1.53846小时。也就是说使用超线程技术扩展出逻辑核心其性能并不是真实物理核心的100%而是30%,因为该CPU共有10个物理核心,运行四个计算任务时需要使用10个真实物理核心和10个扩展多出的逻辑核心,而这多出的10个核心并不能按照真实核心来计算,因此正确计算时我们需要先按照真实物理核心数计算用时2个小时的用时,然后再除去逻辑核心扩展后的CPU性能1.3倍得出最终的运行用时。

正确的计算方法为:

不可分割的计算量(需要并行运行的计算量):4个任务,每个任务单独运行均需5个物理核心运行一个小时,因此这里需要并行的计算量为1+1+1+1=4,即4小时。

任意时刻上CPU可被使用的计算能力(一个任务运行时需要5个物理CPU核心,即5个物理核心的计算能力为1):1+1+0.3+0.3=2.6

因此,4个任务并行,使用10个物理核心外加10个扩展出的逻辑核心,总用时为4/2.6=1.53846小时。

可以看到,如果我们希望尽快的完成运算任务,那么在上述的CPU架构中最多可以运行两个计算任务,如果再多运行计算任务那么总的时长就会增加。这个问题是极为被忽略的,而造成这个问题的原因就是超线程扩展出的CPU核心并没有达到真实CPU核心的性能,而是只能达到30%。


扩展内容:

在上述的CPU架构和计算任务下,如果同时运行3个计算任务,那么用时多久?

3个计算任务如果同时并行需要15个物理核心,但是实际只有10个物理核心,因此并行运行3个计算任务需要使用10个物理核心和5个逻辑核心,因此按照之前给出的计算方法我们可以得到计算量为1+1+1=3,计算能力为1+1+0.3=2.3,因此总用时为:3/2.3=1.30434小时,此时的CPU使用率为75%。

PS:

操作系统在计算CPU使用率时是不会区分逻辑核心和物理核心的。

=============================

总结一下:

一个10物理核心,10扩展核心的CPU,运行一个需5物理核心并行的任务用时一小时,那么有:

并行运行1个计算任务:用时1小时,CPU使用率为25%

并行运行2个计算任务:用时1小时,CPU使用率为50%

并行运行3个计算任务:用时1.30434小时,CPU使用率为75%

并行运行4个计算任务:用时1.53846小时,CPU使用率为100%

同时有:

并行运行5个计算任务:用时5/2.6=1.92307小时,CPU使用率为100%

并行运行6个计算任务:用时6/2.6=2.30769小时,CPU使用率为100%

因此通过上面的分析,我们可以回答问题:CPU利用率为多少时可以兼顾效率和时间?

个人认为一个科学计算用处的CPU,最好的利用率在75%左右,这样可以使CPU有个比较高的利用率同时也可以尽可能保证每个任务可以在较短的时间内运行完成,同时由于当CPU利用率为100%时我们是难以区分此时的服务器是出于哪种情况,比如上面的4个任务并行,5个任务并行,6个任务并行,其CPU利用率均为100%(服务器CPU为多用户共享使用的),如果管理员不对CPU利用率做一定的要求,那么如果是5个任务并行的情况下会导致每个计算任务的用时都增加了1倍,也就是从1个小时增加到了1.92小时,虽然保证了CPU总的利用率但是却影响了用户的单独体验的感受,因此我个人给出的计算型CPU利用率最好为75%左右,如果是50%则明显存在利用率不足,75%以内的利用率可以保证每个计算任务都可以获得近似于独占服务器情况下的运行时间,而且如果CPU利用率高于75%甚至高于85%,那么也会极可能由于CPU的高负载导致的供电和发热问题使CPU运行频率降低(CPU降频),因此综合来考虑,保持计算型CPU利用率在75%左右是综合最优的一种设置。


CPU利用率为多少时可以兼顾计算效率和时间效率?—— 75% —— 科学计算时如何正确的使用超线程CPU——使用超线程CPU进行计算密集型任务时的注意事项的更多相关文章

  1. CPU利用率异常的分析思路和方法交流探讨

    CPU利用率异常的分析思路和方法交流探讨在生产运行当中,经常会遇到CPU利用率异常或者不符合预期的情况,此时,往往暗示着系统性能问题.那么究竟是核心应用的问题?是监控工具的问题?还是系统.硬件.网络层 ...

  2. python多进程提高cpu利用率

    cpu参数: 1个物理cpu,2个逻辑cpu(超线程),单核 具体 http://blog.csdn.net/dba_waterbin/article/details/8644626   物理CPU. ...

  3. cpu利用率和cpu 队列

    SIP的第四期结束了,因为控制策略的丰富,早先的的压力测试结果已经无法反映在高并发和高压力下SIP的运行状况,因此需要重新作压力测试.跟在测试人员后面做了快一周的压力测试,压力测试的报告也正式出炉,本 ...

  4. 查看进程,按内存从大到小 ,查看进程,按CPU利用率从大到小排序

    查看进程,按内存从大到小 ps -e -o "%C : %p : %z : %a"|sort -k5 -nr 查看进程,按CPU利用率从大到小排序 ps -e -o "% ...

  5. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  6. HighChartS cpu利用率动态图(Java版)

    来源:http://www.cnblogs.com/haifg/p/3217699.html   最近项目需要监控服务器cpu的利用率,并做成动态图.在网上查找了一些资料,最终选择了HighChart ...

  7. Linux如何统计进程的CPU利用率

    1.0 概述 在Linux的/proc文件系统,可以看到自启动时候开始,所有CPU消耗的时间片:对于个进程,也可以看到进程消耗的时间片.这是一个累计值,可以"非阻塞"的输出.获得一 ...

  8. 如何提高多线程程序的cpu利用率

    正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情.在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行.然后,事情确 ...

  9. Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

    目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps ...

  10. [进程管理]Load和CPU利用率是如何算出来的

    本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://www.penglixun.com/tech/system/how_to_ca ...

随机推荐

  1. vue bus传参

    新建一个js文件,命名为bus.js.bus.js文件的内容为: import Vue from 'vue' const bus = new Vue() export default bus 页面de ...

  2. PasteSpider的集群组件PasteCluster(让你的项目快速支持集群模式)的思路及实现(含源码)

    PasteSpider是什么? 一款使用.net编写的开源的Linux容器部署助手,支持一键发布,平滑升级,自动伸缩, Key-Value配置,项目网关,环境隔离,运行报表,差量升级,私有仓库,集群部 ...

  3. #PowerBi Superchange PowerBi 数据模型篇(1)

    在过去,业务人员通常不熟悉数据建模,因为数据建模往往是专业的IT人员的领域.但是,得益于POWERBI和POWER PIVOT FOR EXCEL ,这样的日子一去不复返了.那么,什么是数据模型呢? ...

  4. Unity中使用ProtocolBuffer

    Unity中使用ProtocolBuffer unityProtocolBufferUnity ProtocolBuggerC# ProtocolBuffer Unity中使用ProtocolBuff ...

  5. Java跳动爱心代码

    1.计算爱心曲线上的点的公式 计算爱心曲线上的点的公式通常基于参数方程.以下是两种常见的参数方程表示方法,用于绘制爱心曲线: 1.1基于 (x, y) 坐标的参数方程 x = a * (2 * cos ...

  6. typroa破解

    Typora 一款 Markdown 编辑器和阅读器 风格极简 / 多种主题 / 支持 macOS,Windows 及 Linux 实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表 目录大 ...

  7. Java开发者的神经网络进阶指南:深入探讨交叉熵损失函数

    前言 今天来讲一下损失函数--交叉熵函数,什么是损失函数呢?大体就是真实与预测之间的差异,这个交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异 ...

  8. 【论文阅读】End-to-End Model-Free Reinforcement Learning for Urban Driving Using Implicit Affordances

    文章名:CVPR2020: End-to-End Model-Free Reinforcement Learning for Urban Driving Using Implicit Affordan ...

  9. UG 2406 python 二次开发环境配置

    UG 2406 python 二次开发环境配置 项目地址 https://gitee.com/unm001/nx2406.git 安装python 安装 python 3.10.11 D:\prog\ ...

  10. debian12 创建本地harbor镜像库

    前言 harbor是一个docker/podman镜像管理库,可用于存储私人镜像.现将本人在debian12系统搭建harbor镜像库的过程记录下来,留作后续参考. 可以参考github harbor ...