|
|
51CTO旗下网站
|
|
移动端

内存与并发

《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》第7章内存:陷阱和优化技巧,本章将围绕这个话题来进行讨论。除此之外,我们将展示一些陷阱,尤其是在Objective-C 代码中经常出现的问题。本节为大家介绍内存与并发。

作者:李俊阳 等译来源:电子工业出版社|2018-07-17 16:59

内存与并发

由于CPU 和内存的运行速度之间存在着巨大的差异,即便CPU 只有一个内核,所以管理内存带宽和延迟是编写高性能、多核心软件的主要关注点之一。

如果让多个内核同时工作,那么大多数情况下这些内核都需要解决私有缓存的问题。缓存感知程序会优先选用已知大小的缓存,例如,将任务拆分为16KB 大小(或者其他大小)的内存块。顾名思义,缓存感知倾向借助特定的缓存大小和缓存特性来完成参数化操作,因此缓存感知与硬件紧密相关,或者至少在运行时完成参数化操作。

缓存忽略算法使用了递归细分策略,通常用在树或者其他类似的数据结构中,其绝大部分的具体操作都是在叶节点附近进行的。Fortress 数值计算语言(这个名字源于FORTRAN,它的目标是成为更安全的FORTRAN)背后的团队对这个话题进行了大量的实验(不过现在已经停滞了),他们在网上发布了很多非常优秀的演示文稿。

另一种可能会发生缓存污染的情况,便是在某个线程中的数据流经内存的时候,可能会强制将其他线程中的数据移出缓存。在诸如SSE 之类的多媒体指令集中,某些特殊指令允许从主内存中直接读取数据,而无须通过缓存来访问。由于主内存的数据流性能远高于随机访问速率,因此对于实际的数据流算法而言,使用主内存完全足够了。Apple的vDSP 和vImage 充分利用了这些指令,因此这些结构便是一个很好的选择。

当两个线程尝试访问同一块数据时,就会产生竞争。由于CPU 中的数据存入高速缓存行时,通常会被组织成64 字节的形式,所以当两个线程访问的数据位于不同位置,但这两个不同的位置都位于相同的高速缓存行中时,就可能会发生虚假共享的情形。在这种情况下,CPU 必须在两个内核之间保持数据交换,这会使得CPU 吞吐量大大降低。如果线程之间存在错误共享,那么可以在导致虚假共享的数据之间添加足量的填充数据,从而将它们放到不同的缓存行中,这样可以显著提高性能。

如果多个线程需要访问相同数据,并且这个数据还可能会在多个线程之间发生交换的话,则使用线程关联的API 将线程固定在同一个内核中是有意义的。相反,对于两个并行运行的线程,如果处理的数据集不同,那么应该将线程分配到不同的内核上,以免它们去争夺CPU L1 缓存的使用权。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

ASP快速建站全程实录

本书从一个网站制作过程入手,详细介绍基于ASP技术建设网站的全过程。全书共10章。第1章,网站制作规划与流程;第2章,IIS安装与调试;第3...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊