首页 > 其他分享 >MIT 6.172 lec1笔记

MIT 6.172 lec1笔记

时间:2023-04-04 16:24:31浏览次数:38  
标签:程序 性能 Cache 矩阵 6.172 编译器 lec1 MIT 乘法

为何要做性能工程

性能是购买软件各种特性的货币:我们可以牺牲性能来换取下图中的属性

image.png

2004年之后,多核处理器流行了起来。其中每个独立的处理器核都可以参与各种运算,但性能工程仍然复杂因为其涉及到多个方面。如何编写软件来最大化利用硬件,这是此系列课程将要解决的问题。

程序优化实例:矩阵乘法

矩阵乘法原理如下图,假设矩阵的大小为2的整数幂。

image.png

测试机器配置如下图:

image.png

FLOPS(floating point operations per second)是衡量硬件性能的指标。

不同语言的性能差异

分别用Python、Java、C语言实现矩阵乘法,得到了下图所示的性能:

image.png

C最快,Python最慢。Python是解释型语言,解释器对于每条Python语句都需要读取语句、解释语句、执行语句、更新计算机状态这四个步骤。

image.png

尽管解释器能容易地支持高级语言,但是相应地程序性能就下降了(性能作为货币)。

JIT编译器可以弥补解释器地部分性能缺陷:当某段Java代码被频繁执行时,运行时系统(runtime system)会把这段代码编译为机器码。

C编译器会将C代码编译为机器码,因此速度最快。

循环次序对性能的影响

如下图为i、j、k版本的矩阵乘法:

image.png

总共有6种循环次序,并且不同循环次序程序的性能差异可能很大。

image.png

这是由Cache命中率造成的。Cache line用来存储内存中连续的数据,每个CPU核都会从Cache读写数据,当要读写的数据已经在Cache时,读写速度非常快(Cache hit)。

来看j、k、i版本的矩阵乘法:

image.png

对矩阵C、A、B,每次读写的数据都是分散的,不能有效利用Cache,因此程序性能差。

编译器优化

为了进一步提高程序性能,在编译C程序时,加上O2标志让编译器优化程序。

image.png

多核并行

到目前为止,我们只用了18核中的1个核,这是一种浪费。clik_for(并行循环)可以使多核并行地执行循环。现在有三个循环,经过测试,把最外层循环的for替换为clik_for可以得到最佳的性能。一条经验:尽量并行化外层循环

image.png

分块矩阵乘法

回到Cache,我们可以重新组织矩阵的结构,使计算时得到更高的Cache命中率。把4096*4096的矩阵分块,做分块矩阵乘法。

image.png

经测试,分为32*32的子矩阵可以得到最佳性能

两级Cache的分块

之前的分块我们只有一个参数s,现在增加一个参数t,如下图:

image.png

我们能够写出下图的代码,这段代码会根据矩阵的规模选定不同的处理方式,当规模小于某个THRESHOLD时,直接用上图版本的代码,当规模较大时,用递归版本。

image.png

我们得到了更好的性能。

向量计算

现代处理器支持向量计算,以SIMD方式处理数据。

image.png

编译器可以为程序生成向量指令。我们得到了矩阵乘法程序的最终版本,程序的性能有了显著提高。

image.png

标签:程序,性能,Cache,矩阵,6.172,编译器,lec1,MIT,乘法
From: https://www.cnblogs.com/Kyo-Kyo/p/17286807.html

相关文章

  • MIT 6.172 lec2笔记
    本节课介绍了优化的一些法则从以下四个方面介绍了优化法则Datastructures包装与编码包装的思想是把多个数据值存储在一个机器字中,而编码的思想是把数据值转换为需要更少比特表示的形式。例如日期字符串"September11,2018"可以转换为下图中的结构体,其中year为13位,month为......
  • MIT Linear Algebra
    MITLinearAlgebra:按照列的方式进行多维向量的线性组合而不是用对应行和列的各元素的乘积和;......
  • 线程间数据传递之ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal
    前言在JAVA中线程之间传输数据的方式有多种,而本文旨在探讨ThreadLocal及其衍生类的使用场景。使用场景业务系统的参数传递:在我们的业务系统中可能会用到许多公共参数,可能是用户的token信息,在我们链路中可能某一个方法需要用到它,那么我们又不想一层层的传递它。分布式系统要打......
  • 启动redis时,告警日志中出现“The TCP backlog setting of 511……”以及“overcommit_
    问题描述:启动redis时,告警日志中出现“TheTCPbacklogsettingof511……”以及“overcommit_memoryissetto0…..”警告,如下所示:系统:rhel7.9数据库:redis6.2.61、异常重现[[email protected]]#redis-serverredis6379.conf[root@leo-redis626-aredis-6.......
  • MIT6.1810的学习笔记
    Chapter0OperatingsysteminterfacesProcessesandmemory这一节主要了解一下基础的xv6中的systemcall其中fork是对进程本身进行操作的它复制当前进程的全部内容以及当前进程的fd表也就是说子进程会做和原进程相同的事且对相同的file进行操作。(需要注意,子进程......
  • ipmitool详解
    1、ipmitool(IPMITool)是一个开源的命令行实用程序,用于与基于IPMI(IntelligentPlatformManagementInterface)协议的远程管理控制器(RMC)通信。IPMI是一种硬件标准,它定义了一组接口和协议,用于管理和监控服务器等计算机系统。通过IPMI,管理员可以使用远程控制台、Web界面或命令行接口来......
  • 【RabbmitMQ安装步骤】
    安装安装:一、下载所需要的包linux服务器输入命令:erlang下载地址:rabbitmq/erlang-Packages·packagecloudrabbitmq-server下载地址:Releases·rabbitmq/rabbitmq-server·GitHub二、安装Erlangrpm-Uvherlang-24.1.7-1.el8.x86_64.rpmyuminstall-yerlangerl-v//查......
  • Git Commit Message 应该怎么写?
    原文链接:GitCommitMessage应该怎么写?最近被同事吐槽了,说我代码提交说明写的太差。其实都不用他吐槽,我自己心里也非常清楚。毕竟很多时候犯懒,都是直接一个-m"fix"就提交上去了。这样做是非常不好的,我也是自食恶果,深受其害。特别是查看历史提交记录时,想通过提交说明来了解......
  • overcommit_memory的简单学习
    overcommit_memory的简单学习背景前几天一个测试环境启动失败.总是有如下的提示:Nativememoryallocation(mmap)failedtomap12288bytesforcommittingreservedmemory.当时看free其实内存剩余总量还是有的.但是JVM启动总是失败.当时没有考虑太多.改了下参数......
  • 40、K8S-安全机制-准入机制之LimitRanger、ResourceQuota、PodSecurityPolicy(PSP)
    1、基础知识1.1、准入机制1.1.1、简介所谓的"准入机制",指的是经过了用户认证、角色授权之后,当进行一些写操作的时候,需要遵循的一些原则性要求。准入机制有一大堆的"准入控制器"组成,这些准入控制器编译进kube-apiserver二进制文件,由集群管理员进行配置。这些控制器中,最......