1.1.1节 计算单元
计算单元的主要属性是其每个周期能进行的操作数量以及每秒能完成多少个周期。
第一个属性通过每周期完成的指令数(IPC)①
来衡量,
而第二个属性则是通过其时
钟速度衡量。
当新的计算单元被制造出来时,它们的这两个参数总是互相竞争

矢量计算是指一次提供多个数据给一个 CPU 并能同时被操作。这种类型的 CPU 指
令被称为 SIMD(单指令多数据)。

超线程技术为主机的操作系统(OS)虚拟了第二个 CPU,而聪明的硬件逻辑则试
图将两个指令线程交错地插入单个 CPU 的执行单元。如果成功插入,能比单线程
提升 30%。一般来讲,当两个线程的工作分布在不同的执行单元上时,这样做效果
不错——比如一个操作浮点而另一个操作整数时。

给 CPU 增加更多的核心并不一定能提升程序运行的速度。这是由阿姆达尔定律决
定的。简单地说,阿姆达尔定律认为如果一个可以运行在多核上的程序有某些执行
路径必须运行在单核上,那么这些路径就会成为瓶颈导致最终速度无法通过增加更
多核心来提高。

另外,对于 Python 来说,充分利用多核性能的阻碍主要在于 Python 的全局解释器
锁(GIL)。GIL 确保 Python 进程一次只能执行一条指令,无论当前有多少个核心。
这意味着即使某些 Python 代码可以使用多个核心,在任意时间点仅有一个核心在
执行 Python 的指令。以前面调查的例子来说,即使我们有 100 位提问者,然而一
次仅有一位可以提问和接受回答,并没有什么用!这看上去是个严重的阻碍,特别
是当现在计算机发展的趋势就是拥有更多而非更快的计算单元的时候。好在这个问
题其实可以通过一些方法来避免,比如标准库的 multiprocessing,或 numexpr、
Cython 等技术,或分布式计算模型等

1.1.2节 存储单元
存储单元的概念包括了主板上的寄存器、RAM 以及硬盘。所有这些不同
类型的存储单元的主要区别在于其读写数据的速度。更复杂的问题在于,其读写数
据的速度还与数据的读写方式息息相关。

比如,大多数存储单元一次读一大块数据的性能远好于读多次小块数据(顺序读取
VS 随机数据)。将这些存储单元中的数据想象成一本书中的书页,大多数存储单元
的读写速度在连续翻页时高于经常从一张随机页跳至另一张随机页。
所有的存储单元或多或少都受到这一影响,但不同类型存储单元受到的影响却大
不相同。

除了读写速度以外,存储单元还有一个延时的属性,表示了设备为了查找到需要的
数据所花费的时间。一个旋转硬盘的延时可能较高,因为磁盘必须物理旋转到一定
速度且读取磁头必须移动到正确的位置。而从另一方面来说,RAM 的延时就比较
小,因为一切都是固态的。下面是一个标准工作站内常见的各类存储单元的简短描
述,以读写速度排序:

旋转硬盘
计算机关机也能保持的长期存储。读写速度通常较慢,因为磁盘必须物理旋转
和等待磁头移动。随机访问性能下降但容量很高(TB 级别)。

固态硬盘
类似旋转硬盘,读写速度较快但容量较小(GB 级别)。

RAM
用于保存应用程序的代码和数据(比如用到的各种变量)。具有更快的读写速
度且在随机访问时性能良好,但通常受限于容量(GB 级别)。

L1/L2 缓存
极快的读写速度。进入 CPU 的数据必须经过这里。很小的容量(KB 级别)。

图 1-2 展示了当今市面上可以见到的这几类存储单元的区别。
一个清晰可见的趋势是读写速度和容量成反比—当我们试图加快速度时,容量就
下降了。因此,很多系统都实现了一个分层的存储:数据一开始都在硬盘里,部分
进入 RAM,然后很小的一个子集进入 L1/L2 缓存。这种分层使得程序可以根据访
问速度的需求将数据保存在不同的地方。在试图优化程序的存储访问模式时,我们
只是简单优化了数据存放的位置、布局(为了增加顺序读取的次数),以及数据在
不同位置之间移动的次数。另外,异步 I/O 和缓存预取等技术还提供了很多方法来
确保数据在被需要时就已经存在于对应的地方而不需要浪费额外的计算时间—
这些过程可以在进行其他计算时独立进行!

1.1.3 通信层

最后,让我们看看这些基本单元如何互相通信。通信有很多模式,但它们都是同一
样东西的变种:总线。
比如说,前端总线是 RAM 和 L1/L2 缓存之间的连接。它将已经准备好被处理器操
作的数据移入一个集结场所以备计算所需,又将计算结果移出。除此之外还有其他
总线,如外部总线就是硬件设备(如硬盘和网卡)通向 CPU 和系统内存的主干线。
该总线通常比前端总线慢。
事实上,L1/L2 缓存的很多好处实际上是来自更快的总线。因为可以将需要计算的
数据在慢速总线(连接 RAM 和缓存)上攒成大的数据块,然后以非常快的速度从
后端总线(连接缓存和 CPU)传入 CPU,这样 CPU 就可以进行更多计算而无须等
待这么长的时间。

同样,使用 GPU 的不利之处很多都来自它所连接的总线:因为 GPU 通常是一个外
部设备,它通过 PCI 总线通信,速度远远慢于前端总线。结果,GPU 数据的输入
输出就像是一种抽税操作。异质架构,一种在前端总线上同时具有 CPU 和 GPU 的
计算机架构的兴起就是为了降低数据传输成本,使得 GPU 能够被使用在需要传输
大量数据的计算上。

除了计算机内部的通信模块,网络可以被认为是另一种通信模块。不过这个模块就
比之前讨论的更为灵活,一个网络设备可以直接连接至一个存储设备,如网络连接
存储(NAS)设备或计算机集群中的另一台计算机节点。但是网络通信通常要比之
前讨论的其他类型的通信慢很多。前端总线每秒可以传输数十 GB,而网络则仅有
数十 MB。

现在我们清楚,一条总线的主要属性是它的速度:在给定时间内它能传输多少数据。
该属性由两个因素决定:
一次能传输多少数据(总线带宽)和每秒能传输几次(总线频率)。
需要说明的是一次传输的数据总是有序的:一块数据先从内存中读出,然后被移动到另一个地方。这就是为什么总线的速度可以被拆分为两个因素,因为这两个因素分别独立影响计算的不同方面:
高的总线带宽可以一次性移动所有相关
数据,有助于矢量化的代码(或任何顺序读取内存的代码),而另一方面,低带宽
高频率有助于那些经常随机读取内存的代码。
有意思的是,这些属性是由计算机设计者在主板的物理布局上决定的:当芯片之间相距较近时,它们之间的物理链路就
较短,就可以允许更高的传输速度。而物理链路的数量则决定了总线的带宽(带宽这个词真的具有物理上的意义!)。


下面是文中的小标注
①不要跟进程间通信(也是 IPC)混淆——我们会在第 9 章讨论这个主题。

《高性能python》第一章-理解高性能Python-阅读笔记相关推荐

  1. python第一章笔记_head first python(第一章)–学习笔记

    head first python(第一章)--学习流程图 1.安装python 这里是用python3的,除了windows之外,linux和macos都自带了,只是版本没有这么新. 举例:cent ...

  2. 【Python数据科学】第一章 IPython 超越Python

    1.IPythonde 的帮助和文档 1.1.用符号 ?获取文档 help(len) Help on built-in function len in module builtins:len(obj, ...

  3. python第一章(下)

    python系列 python第一章(上) python第二章 python第三章(上) python第三章(下) 字符串 python系列 一.字符串 定义方式 拼接 索引与切片 切片 设置取子串顺 ...

  4. 趣学PYTHON 第一章python不是大蟒蛇

    趣学PYTHON 第一章python不是大蟒蛇 把我自己的学习记录在这里,留下一片回忆. Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:3 ...

  5. 高一信息技术课件python编程_教科版高中信息技术选修第一章第三节Python入门--奇妙曲线的绘制 课件(22张ppt) 教案 (2份打包)...

    ID:10986924 资源大小:11671KB 资料简介: 教学设计 [课程标准要求] 体验算法思想,了解算法和程序设计在解决问题过程中的地位及作用:能从简单的问题出发,设计解决问题的算法,并能初步 ...

  6. Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】

    Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...

  7. 第一章 计算机网络 4 性能指标 [计算机网络笔记]

    第一章 计算机网络 4 性能指标 本笔记参考书目: 计算机网络(第8版)谢希仁 2021王道计算机网络视频公开课 本节重点: 数据率/带宽/吞吐量 时延/时延带宽积/RTT/利用率 转载请注明文章来源 ...

  8. Python第一章-基础知识

    第一章:基础知识 1.1 安装python.     直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...

  9. 【python第一章 基础捋顺,第二章 python基础语法】

    第一章 基础捋顺,第二章 python基础语法 第一章 基础捋顺 第二章 python基础语法 2.1输入输出 2.2代码注释 2.3代码缩进 2.4命名规范 2.5变量 2.6基本数据类型 2.7数 ...

最新文章

  1. 在nodejs中的集成虹软人脸识别
  2. lambdaquerywrapper查询指定字段_MongoDB系列 | 高级查询与索引(四)
  3. SAP Cloud for Customer里根据External Reference搜索销售订单
  4. Chrome浏览器扩展程序的本地备份
  5. 第二十期:想吃透监控系统,就这一篇够不够?
  6. LeetCode 207. 课程表(拓扑排序)
  7. 数据挖掘:实用案例分析 下载_【实用干货】17 种服装印花工艺(图文案例分析)...
  8. 一键部署Zabbix客户端
  9. element ui里dialog关闭后清除验证条件
  10. js 实现php md5加密,js实现md5加密插件代码分享
  11. Linux网络服务(network service)管理
  12. notifier_call -----总结
  13. 导出pdf文件时加图片水印
  14. Linux I/O编程 实验内容
  15. layui 借助 parseData 回调函数解析table 组件所规定的数据格式
  16. MCV模型流程图整理
  17. Vue-全局websocket 实现消息推送
  18. php获取cnzz数据,PHP curl抓取cnzz统计数据
  19. SUS2019迎新赛ret2moonWP
  20. 一周学python系列(7)——面向对象

热门文章

  1. redis配置文件讲解
  2. 浏览器事件捕获冒泡以及阻止冒泡
  3. 给服务器端下拉asp:DropDownList 绑定改变事件,Ajax绑定下拉
  4. 简明Vim练级攻略(转)
  5. 查找单项链表中间元素,若有相同,取第一个
  6. element el-popover 要渲染较多内容,特定格式,以及在table 显示不完整。
  7. 原生JS实现Ajax和JSONP跨域请求
  8. 使用vue-router的meta实现 设置每个页面的title标题
  9. lstm 文本纠错_工业界纠错系统
  10. 学习响应式BootStrap来写融职教育网站,Bootsrtap第十天你的收获