精华内容
下载资源
问答
  • 模型参数量(空间复杂度):空间复杂度决定了模型的参数数量。 模型计算量(时间复杂度),直接决定模型的forward time ,决定了模型的训练/预测时间。如果复杂度过高,会导致模型训练预测耗费大量时间,既无法快速...

    模型参数量(空间复杂度):空间复杂度决定了模型的参数数量。

    模型计算量(时间复杂度),直接决定模型的forward time ,决定了模型的训练/预测时间。如果复杂度过高,会导致模型训练和预测耗费大量时间,既无法快速的验证想法和改善模型,也无法做到快速的预测。

    https://blog.csdn.net/laolu1573/article/details/79196160
    时间复杂度
    时间复杂度即模型的运算次数。

    单个卷积层的时间复杂度:Time~O(M^2 * K^2 * Cin * Cout)

    注1:为了简化表达式中的变量个数,这里统一假设输入和卷积核的形状都是正方形。

    注2:严格来讲每层应该还包含1个Bias参数,这里为了简洁就省略了。

    M:输出特征图(Feature Map)的尺寸。
    K:卷积核(Kernel)的尺寸。
    Cin:输入通道数。
    Cout:输出通道数。

    输出特征图尺寸又由输入尺寸X、卷积核尺寸K、Padding、 Stride 这四个参数所决定,表示如下:

    M=(X - K + 2*Padding) / Stride + 1

    空间复杂度

    空间复杂度即模型的参数数量,体现为模型本身的提及。

    Space~O(K^2 * Cin * Cout)

    -空间复杂度只与卷积核的尺寸K、通道数C相关。而与输入图片尺寸无关。

    -当我们需要裁剪模型时,由于卷积核的尺寸通常已经很小,而网络的深度又与模型的能力紧密相关,不宜过多削减,因此模型裁剪通常最先下手的地方就是通道数。

    模型参数量计算比较简单,就是计算模型所有参数数量之和。
    https://www.toutiao.com/a6649299295855968782/
    https://kuaibao.qq.com/s/20190123A05UUJ00?refer=cp_1026

    贴个五种CNN经典模型计算梁和参数量对比:http://m.elecfans.com/article/598165.html

    FFNN

    首先我们定义三个参数:

    i:输入大小

    h:隐藏层大小

    o:输出大小

    即在前馈神经网络中参数数量为:

    num_params =各层之间参数+每层的偏差= (i×h + h×o)+(h + o)

    RNN

    首先我们定义三个参数:

    g:门的数量(RNN有1个门,GRU有3个,LSTM有4个)

    h:隐藏单元大小

    i:输出大小

    每个门中的权重实际上是一个输入大小(h + i)和输出大小为h的FFNN。所以每个门都有h(h + i)+ h个参数。即在RNN中参数数量为:

    num_params= g ×[ h(h + i)+ h ]

    CNN

    首先我们定义三个参数:

    i:输入尺寸

    f:卷积核的大小

    o:输出大小

    则每个滤波器对应的输出映射参数为

    num_params =权重+偏差= [ i×(f×f)×o ] + o

    模型计算量:
    比较详细:https://blog.csdn.net/leayc/article/details/81001801

    前段时间看了几个笔试题,涉及模型复杂度,主要是参数量和计算复杂度的问题。当时搜了一下感觉中文网上的内容比较乱。刚好本文是对神经网络模型资源消耗情况的一篇介绍,就不自己写了,把关键内容搬运一下。

    原文见 http://machinethink.net/blog/how-fast-is-my-model/

    深度网络的计算消耗是学术 paper 相对少见的话题。当然,早期网络精度不够的情况下讨论压缩也没有意义。工程师需要实现模型并让网络尽可能地在各类环境下工作,模型的资源消耗情况和运行速度非常关键。

    原文以移动端的模型应用为例,列出了四个主要问题:

    • 空间占用——单个模型的参数文件要占用多大空间
    • 内存占用——运行在手机或平板上时需要占用多大的 RAM
    • 运行速度——尤其考虑实时的视频和大图像处理情形
    • 耗电情况——我可不想要暖手宝

    原文内容还是挺丰富的。为了节约时间,博主只把关键的部分略作摘录和演绎,即网络中一般操作的运算量、内存占用的计算方法,其他的如 MobileNet 模型的优化就不做介绍了。如有需要请查阅原文。

    原文以外的内容将斜体显示,以作区别。

    正文

    案例:作者的一位客户最近用 MobileNetV2 替换掉了 V1 模型,按理说V2 的计算量远小于 V1 ,

    (网上随手找的图:https://blog.csdn.net/u011995719/article/details/79135818
    这里写图片描述

    然鹅实际情况却是 V2 比 V1 慢得多。

    (注:可参考
    https://www.zhihu.com/question/265709710/answer/299136290https://www.reddit.com/r/MachineLearning/comments/8a7sf6/d_mobilenet_v2_paper_said_depthwise_separable/
    官方已经放出模型 https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet 页面上也有实验测试结果。看完全文也会发现 V2 不比 V1 慢。作者这里有点标题党。)

    为什么会这样呢?

    1.计算消耗

    可以用 FLOPS(floating point operations per second,每秒浮点运算数)来衡量模型的速度。另一种方法是 MACCs(multiply-accumulate operations,乘-加操作),也叫 MAdds。但说穿了,都是点积运算而已。

    什么叫乘-加?神经网络里的运算大都是这样的:

    y = w[0]*x[0] + w[1]*x[1] + w[2]*x[2] + ... + w[n-1]*x[n-1]
     
    • 1

    wx 都是向量,y 是标量。上式是全连接层或卷积层的典型运算。一次乘-加运算即一次乘法+一次加法运算,所以上式的 MACCs 是n

    不过可以看到,加法运算的次数并非 n 而是 n-1 。但考虑 MACCs 时可以类比算法复杂度估算的 big-O ,即结果可以是近似的。

    而换到 FLOPS 的情况,点积做了 2n-1 FLOPS,即 n-1 次加法和 n 次乘法。可以看到,MACCs 大约是 FLOPS 的一半。

    1.1 全连接层

    全连接层的计算

    y = matmul(x, W) + b
     
    • 1

    权重 WW 维实值向量。FC 层的 MACCs 也不难计算。

    上文例子是向量与向量的点积,FC 是向量与矩阵的点积,每一组点积发生在输入 xx,跟权重的尺寸一致。

    偏置项 bb 刚好补上了这个缺。

    所以,对 II

    举例:

    一个全连接层,输入 100 维,输出 300 维,MACCs 有 300×100=30,000300×100=30,000 了。

    1.2 激活函数

    FC 完了接下来通常有个激活函数,ReLU 或者 Sigmoid。激活函数的计算没有点积,所以只用 FLOPS 衡量。

    对输出为 JJ FLOPS:

    y = max(x, 0)
     
    • 1

    相比之下 Sigmoid 就复杂很多。

    y = 1/(1+exp(-x))
     
    • 1

    我们把加减乘除、指数、平方根等等运算都算作一次 FLOPS,这里有除法、加法、指数和减法四种运算,所以 FLOPS 就是 J×4J×4

    相对于全连接的矩阵运算,激活函数的计算量通常忽略不计(博主注:不一定,看情况)

    1.3 卷积层

    卷积层要单独算而不是用全连接层的结论,是因为输入至少是三维的:H×W×CH×W×C 。对于这样的卷积层,MACCs 有:

    K×K×Cin×Hout×Wout×CoutK×K×Cin×Hout×Wout×Cout

    解释一下:

    • 输出的 feature map 里每个通道上有 Hout×WoutHout×Wout

    同样,这里也忽略了偏置和激活函数。不应该忽略的是 stride(步长)、dilation factors(漏孔/膨胀卷积)、padding(填充),这就是为什么直接从输出尺寸 Hout×WoutHout×Wout 开始算的原因——都已经考虑在内了。

    举例:

    3×33×3stride=1padding=same,MACCs 有:

    3×3×64×112×112×128=924,844,0323×3×64×112×112×128=924,844,032

    接近十亿的乘-加操作。

    1.4 Batch Normalization

    计算公式:

    z = gamma * (y - mean) / sqrt(variance + epsilon) + beta
     
    • 1

    首先以输入为卷积层的情况为例。

    每个通道上都存在一组 meanbetagammavarianceCC 个可学习的参数。而且 BN 是作用在每一个元素上的,这样看来,造成的 FLOPS 应该不少。

    但有趣的是,在 BN 直接连接卷积层的情况下,即 Conv-BN-ReLU 时,通过一组推导,可以将 BN 的计算整合到卷积层当中(注意这是 inference 的情况,跟训练阶段差别很大),从而消去的 BN 层造成的 FLOPS。如果是 Conv-ReLU-BN 的结构这一套就行不通了。

    ( BN 层的计算结合到 Conv 层中去,BN 层的 FLOPS 消失了,Conv 层需要乘一个常系数)

    即从结果上来说,在 inference 时模型中的 BN 层实际被消去了。

    1.5 其他层

    像 Pooling 层虽然确实很关键,但没有用到点积运算,所以 MACCs 不能很好地衡量这部分计算消耗。如果用 FLOPS,可以取 feature map 的尺寸然后乘一个常系数。

    如 maxpooling 层,stride=2filter_sz=2(即输出保持相同尺寸),112 x 112 x 128 的feature map,FLOPS 就是 112 x 112 x 128 = 1,605,632 。相对卷积层和全连接层的运算,这个计算量比较小,所以也可以忽略不计。

    RNN 这里不做讨论。简单来说,以 LSTM 为例,计算主要是两个大的矩阵乘法,sigmoid,tanh 和一些元素级的操作。可以看成两个全连接层的运算,所以 MACCs 主要取决于输入、输出和隐状态向量的尺寸。点积运算还是占了大头。

    2. 内存占用

    内存带宽其实比 MACCs 更重要。目前的计算机结构下,单次内存访问比单次运算慢得多的多。

    对每一层网络,设备需要:

    • 从主内存中读取输入向量 / feature map
    • 从主内存中读取权重并计算点积
    • 将输出向量或 feature map 写回主内存

    涉及大量的内存访问。内存是很慢的,所以网络层的内存读写对速度有很大的影响,可能比计算耗时还要多。

    2.1 权重的内存占用

    全连接层有 I x J 大小的权重矩阵,加上偏置向量共计 (I + 1) x J

    卷积层的 kernel 通常是正方形的,对 kernel_sz = K 和输入通道为 Cin 、输出 Cout 和额外的 Cout 个偏置的情况,共有 (K x K x Cin + 1) x Cout 个参数。对比之下卷积层的参数量远小于全连接。

    举例:

    全连接层有4096个输入和4096个输出,所以权重数 (4096+1) x 4096 = 16.8M

    3 x 3 、48个卷积核,在64x64 、32个通道的输入上计算,共有 3 x 3 x 32 x 48 + 48 = 13, 872 个权重。

    注意到此处卷积层的输入实际是全连接层的32倍(通道),输出是48倍,然鹅权重数只有后者的千分之一不到。全连接层的内存占用真的很可怕。

    作者注:卷积层可以看作一个受限连接的全连接层,即权重对 k x k 以外的输入置零,不使用。

    2.2 feature maps 和中间结果

    CS231n 的 Lesson 9 专门花了很多篇幅讲 feature map 的计算,可以参考。

    还是举例说明。卷积层的输入是 224x224x3 ,把所有这些值读出来需要访问 150,528 次内存。如果卷积核是 KxKxCout ,还要乘上这个系数(因为每次卷积都要访问一遍)。拿 stride=2, kernel 数为32的情况来说,输出的 feature map 尺寸为 112x112x32,共计 401,408 次内存访问。

    所以,每层的内存访问总数如下:

    input = Hin x Win x Cin x K x K x Cout

    output = Hout x Wout x Cout

    weights = K x K x Cin x Cout + Cout ,按上例:

    input = 224 x 224 x 3 x 3 x 3 x 32 = 43,352,064
    output = 112 x 112 x 32 = 401,408
    weights = 3 x 3 x 3 x 32 + 32 = 896
    total = 43,754,368
     
    • 1
    • 2
    • 3
    • 4

    当网络层数加深时,Hin Win 会越来越小,但通道数会变得很大:

    input = 28 x 28 x 256 x 3 x 3 x 512 = 924,844,032
    output = 28 x 28 x 512 = 401,408
    weights = 3 x 3 x 256 x 512 + 512 = 1,180,160
    total = 926,425,600
     
    • 1
    • 2
    • 3
    • 4

    这种情况下 weights 部分也会变得很大,所以是不能忽略的。

    2.3 Fusion

    这一节的意思是,像 ReLU 这样比较简单的运算,如果不做优化,在计算时近乎是从输入到输出做了一次拷贝。计算可以认为不耗时间,但内存访问还是有消耗的,所以可以把这一步同卷积层的计算合成,从而节省了一轮内存读写。

    3. MobileNet V2 vs. V1

    这部分作者讲了他认为 V2 不会比 V1 快的分析过程。结论跟开头博主引的图相近,即乘子都为1.0时,V2是显著快于V1的,但V2在乘子为1.4时速度比V1稍慢。

    至于原因嘛,简单来说就是 V2 的层数更深,每层的输入输出参数读写导致内存访问量大增。因此作者认为影响 inference 速度的瓶颈其实不在 MACCs,而是内存访问数(memory accesses)。

    V2 with multiplier=1.4 的速度略慢于 V1,但精度高出不少;V2 with multiplier=1.0 速度比 V1 快很多。可以根据需要进行取舍。官方页面上也给了很多实验参考。

    然后作者对 VGG16 做了一点考察,结论很有意思。

    VGG16 经常被当作图像方面的特征提取器,结构很简单,层数也不多,看起来好像计算比较多、内存访问会少一些,真的是这样吗?对比 MobileNet(输入按移动设备16:9的规格,是126x224,可以算出以下结果:

    VGG16 params: 15M
    VGG16 MACCs : 8380M
    VGG16 MAes  : 8402M
     
    • 1
    • 2
    • 3

    所以更大的 feature map 导致了更多的内存访问。

    4 结论

    论文中 MobileNet V2 主要比较了 MACCs 和参数量,指出因为这两项规模更小所以速度更快。但实际上还要考虑内存访问的情况。

    另外本文给出的 MACCs、内存访问、参数量都是估计值,只用于同类模型的复杂度比较,出了这个语境是毫无意义的。

    进一步阅读

    论文:

    工具:

    • Alchemy from fritz.ai lets you analyze ML models to see if they’re ready for mobile development.

    • Netscope shows the structure of models and also analyzes their computational cost. Currently supports Caffe only.

    • 不过这俩工具还不支持对内存访问量的计算。

    展开全文
  • 一、软件性能的关注点 对一个软件做性能测试时需要关注那些性能呢?我们想想在软件设计、部署、使用、维护中一共有哪些角色...3、 应用服务器数据库资源使用是否合理 4、 系统能否实现扩展 5、 系统最多支持多...

    一、软件性能的关注点

    对一个软件做性能测试时需要关注那些性能呢?我们想想在软件设计、部署、使用、维护中一共有哪些角色的参与,然后再考虑这些角色各自关注的性能点是什么,又该关注什么?

    用户的角度

    用户关注的是用户操作的相应时间。

    管理员的角度:

    1、 响应时间

    2、 服务器资源使用情况是否合理

    3、 应用服务器和数据库资源使用是否合理

    4、 系统能否实现扩展

    5、 系统最多支持多少用户访问、系统最大业务处理量是多少

    6、 系统性能可能存在的瓶颈在哪里

    7、 更换那些设备可以提高性能

    8、 系统能否支持7×24小时的业务访问

    开发(设计)人员角度:

    1、 架构设计是否合理

    2、 数据库设计是否合理

    3、 代码是否存在性能方面的问题

    4、 系统中是否有不合理的内存使用方式

    5、 系统中是否存在不合理的线程同步方式

    6、 系统中是否存在不合理的资源竞争

    二、软件性能的几个主要术语

    1、响应时间:对请求作出响应所需要的时间

    网络传输时间:N1+N2+N3+N4

    应用服务器处理时间:A1+A3

    数据库服务器处理时间:A2

    响应时间=N1+N2+N3+N4+A1+A3+A2

    2、并发用户数的计算公式

    系统用户数:系统额定的用户数量,如一个OA系统,可能使用该系统的用户总数是5000个,那么这个数量,就是系统用户数。

    同时在线用户数:在一定的时间范围内,最大的同时在线用户数量。

    同时在线用户数=每秒请求数RPS(吞吐量)+并发连接数+平均用户思考时间

    平均并发用户数的计算:C=nL / T

    其中C是平均的并发用户数,n是平均每天访问用户数(login session),L是一天内用户从登录到退出的平均时间(login session的平均时间),T是考察时间长度(一天内多长时间有用户使用系统)

    并发用户数峰值计算:C^约等于C + 3*根号C

    其中C^是并发用户峰值,C是平均并发用户数,该公式遵循泊松分布理论。

    3、吞吐量的计算公式

    指单位时间内系统处理用户的请求数

    从业务角度看,吞吐量可以用:请求数/秒、页面数/秒、人数/天或处理业务数/小时等单位来衡量

    从网络角度看,吞吐量可以用:字节/秒来衡量

    对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,他能够说明系统的负载能力

    以不同方式表达的吞吐量可以说明不同层次的问题,例如,以字节数/秒方式可以表示数要受网络基础设施、服务器架构、应用服务器制约等方面的瓶颈;已请求数/秒的方式表示主要是受应用服务器和应用代码的制约体现出的瓶颈。

    当没有遇到性能瓶颈的时候,吞吐量与虚拟用户数之间存在一定的联系,可以采用以下公式计算:F=VU * R /

    其中F为吞吐量,VU表示虚拟用户个数,R表示每个虚拟用户发出的请求数,T表示性能测试所用的时间

    4、性能计数器

    是描述服务器或操作系统性能的一些数据指标,如使用内存数、进程时间,在性能测试中发挥着“监控和分析”的作用,尤其是在分析统统可扩展性、进行新能瓶颈定位时有着非常关键的作用。

    资源利用率:指系统各种资源的使用情况,如cpu占用率为68%,内存占用率为55%,一般使用“资源实际使用/总的资源可用量”形成资源利用率。

    5、思考时间的计算公式

    Think Time,从业务角度来看,这个时间指用户进行操作时每个请求之间的时间间隔,而在做新能测试时,为了模拟这样的时间间隔,引入了思考时间这个概念,来更加真实的模拟用户的操作。

    在吞吐量这个公式中F=VU * R / T说明吞吐量F是VU数量、每个用户发出的请求数R和时间T的函数,而其中的R又可以用时间T和用户思考时间TS来计算:R = T / TS

    下面给出一个计算思考时间的一般步骤:

    A、首先计算出系统的并发用户数

    C=nL / T F=R×C

    B、统计出系统平均的吞吐量

    F=VU * R / T R×C = VU * R / T

    C、统计出平均每个用户发出的请求数量

    R=u*C*T/VU

    D、根据公式计算出思考时间

    TS=T/R

    三、系统吞度量要素

    一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。

    系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间

    QPS(TPS):每秒钟request/事务 数量

    并发数: 系统同时处理的request/事务数

    响应时间: 一般取平均响应时间

    (很多人经常会把并发数和TPS理解混淆)

    再次说明:

    QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

    TPS是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息来估计得分。客户机使用加权协函数平均方法来计算客户机的得分,测试软件就是利用客户机的这些信息使用加权协函数平均方法来计算服务器端的整体TPS得分。

    理解了上面三个要素的意义之后,就能推算出它们之间的关系:

    QPS(TPS)= 并发数/平均响应时间 或者 并发数 = QPS*平均响应时间

    四、系统吞吐量评估

    我们在做系统设计的时候就需要考虑CPU运算、IO、外部系统响应因素造成的影响以及对系统性能的初步预估。而通常境况下,我们面对需求,我们评估出来的出来QPS、并发数之外,还有另外一个维度:日PV。通过观察系统的访问日志发现,在用户量很大的情况下,各个时间周期内的同一时间段的访问流量几乎一样。比如工作日的每天早上。只要能拿到日流量图和QPS我们就可以推算日流量。

    通常的技术方法:

    1. 找出系统的最高TPS和日PV,这两个要素有相对比较稳定的关系(除了放假、季节性因素影响之外)

    2. 通过压力测试或者经验预估,得出最高TPS,然后跟进1的关系,计算出系统最高的日吞吐量。

    展开全文
  • 如何成为一名异构并行计算工程师

    万次阅读 多人点赞 2017-12-15 10:18:16
    两个芯片计算力分别是10T 20T,某人的异构并行计算能力为0.8,他拿到了计算力为10T的芯片,而异构并行计算能力为0.4的人拿到了计算力为20T的芯片,而实际上最终结果两人可能相差不大。异构并行计算能力强的人能够...

    随着深度学习(人工智能)的火热,异构并行计算越来越受到业界的重视。从开始谈深度学习必谈GPU,到谈深度学习必谈计算力。计算力不但和具体的硬件有关,且和能够发挥硬件能力的人所拥有的水平(即异构并行计算能力)高低有关。

    一个简单的比喻是:两个芯片计算力分别是10T和 20T,某人的异构并行计算能力为0.8,他拿到了计算力为10T的芯片,而异构并行计算能力为0.4的人拿到了计算力为20T的芯片,而实际上最终结果两人可能相差不大。异构并行计算能力强的人能够更好地发挥硬件的能力,而本文的目标就是告诉读者要变成一个异构并行计算能力强的工程师需要学习那些知识。

    异构并行计算是笔者提出的一个概念,它本质上是由异构计算和并行计算组合而来,一方面表示异构并行计算工程师需要同时掌握异构计算的知识,同时也需要掌握并行计算的知识;另一方面是为更好地发展和丰富异构计算和并行计算。通过异构并行计算进一步提升了知识的系统性和关联性,让每一个异构并行计算工程师都能够获得想要的工作,拿到值得的薪水。

    对于一个异构并行计算工程师的日常来说,他的工作涉及的方面很广,有硬件,有软件,有系统,有沟通;是一个对硬实力和软实力都有非常高要求的岗位。

    异构并行计算的难度是非常高的,而市场对这个职位的需求一直在提升,期待读者能够和我一起投身于异构并行计算的行列,为异构并行计算在中国的推广做出贡献。

    异构并行计算工程师技能树

    要想成为一个优秀的异构并行计算工程师需要掌握许多知识和技能,这些技能可以分为两个方面:

    1. 处理器体系,处理器如何执行具体的指令;
    2. 系统平台方面,这又可以分成多个细的主题,包括硬件的特点,软件编程相关的平台和基础设施。

    读者可以从图1具体了解到异构并行计算工程师需要掌握的技能和知识。

    图片描述

    图1 异构并行计算工程师技能树

    异构并行计算工程师成长详解

    每个人甚至每个技术领域都是在不停的成长,通常公司的岗位会区分为初级、中级、高级、主任等,这是按照贡献、能力和责任大小来分,并不适合用来表示技术。为了更好地帮助读者学习知识,本文从技能体系角度来分析,因此并不能对应到各个公司招聘的岗位需求上,也意味着读者不能简单的把本文的技能和各个公司的岗位级别对应。

    为了帮助读者更好地理解,本文会使用先硬件后软件的方式介绍。和异构并行工程师相关性最大的硬件知识即处理器特性,我们从这一点开始。

    现代处理器的特性

    从系统启动到终止,处理器一条接着一条地执行存储器中的指令,站在使用者的角度来看就好像是前一条指令执行完之后下一条指令才开始执行,是一个完完全全的串行过程。实际上,现代处理器利用了指令级并行技术,同一时刻存在着多条指令同时被执行,并且处理器执行指令的顺序无需和汇编代码给出的指令顺序完全一致,编译器和处理器只需要保证最终结果一致即可,这类处理器称为“乱序执行处理器”。而严格按照顺序一次执行一条指令,只有前一条执行完才开始执行后一条指令的处理器,称为“按序处理器”。而即使是在按序执行处理器上,编译器也可以对源代码进行类似的优化,以提高程序性能。对于一个特定的流水线来说,现代乱序执行处理器只保证指令执行阶段可以乱序,而其他阶段通常还是顺序的。目前主流的CPU和GPU,甚至DSP,无论是在服务器端,还是在移动端基本上都已经是乱序执行处理器了。

    今天大多数处理器都是哈佛架构的变体,其根本特征是在程序执行时把指令和数据分开存储,程序员通常可以忽略指令存储,实际上异构并行计算更关注的是:计算和数据访问。

    计算和访存

    以作者正在使用的处理器E5-2680v3来说,其主频为2.6GHz,支持FMA指令集,其单核单精度浮点计算能力为2.6*2*8*2=83.2 GFlops;而单通道内存的带宽大约为20GB/s。主流处理器的处理速度远快于内存读写速度,为了减小访问数据时的延迟,现代主流处理器主要采用了两种方式:

    • 利用程序访问数据的局部性特点:采用了一系列小而快的缓存保存正在访问和将要被访问的数据,如果数据会被多次访问且数据能够被缓存容纳,则能够以近似于内存的价格获得近似于缓存的速度;
    • 利用程序的并行性:在一个控制流由于高延迟的操作而阻塞时,执行另一个控制流,这样能够提高处理器核心的利用率,保证处理器核心一直在忙碌的状态。

    简单来说,前一种方法是将经常访问的数据保存在低延迟的缓存中,以减少访问数据时的延迟,通过更快为处理器提供数据而提高性能,主要是目前主流的CPU采用。而后一种方法则尽量保证运算单元一直在忙碌工作,通过提高硬件的利用率以提高程序的吞吐量,这种方法目前主要为主流的GPU所采用。这两种办法没有天然的壁垒,现代处理器(无论是CPU还是GPU)都采用了这两种方法,区别只是更偏重于使用哪一种方法。

    指令级并行

    现代处理器具有许多和代码性能优化相关的特点,本节主要介绍以下部分:

    • 指令级并行技术:主要有流水线、多发射、VLIW、乱序执行、分支预测、超标量等技术;
      向量化:主要有SIMT和SIMD技术;
    • 软件开发人员如果了解现代多核向量处理器的这些特性,就能写出性能效率超过一般开发人员的代码。

    多核

    多核是指一个CPU模块里包含多个核心,每个核心是一个独立的计算整体,能够执行线程。现代处理器都是多核处理器,并且为多核使用场景所优化。

    多核的每个核心里面具有独立的一级缓存,共享的或独立的二级缓存,有些机器还有独立或共享的三级/四级缓存,所有核心共享内存DRAM。通常第一级缓存是多核处理器的一个核心独享的,而最后一级缓存(Last Level Cache, LLC)是多核处理器的所有核心共享的,大多数多核处理器的中间各层也是独享的。如Intel Core i7处理器具有4~8个核,一些版本支持超线程,其中每个核心具有独立的一级数据缓存和指令缓存、统一的二级缓存,并且所有的核心共享统一的三级缓存。

    由于共享LLC,因此多线程或多进程程序在多核处理器上运行时,平均每个进程或线程占用的LLC缓存相比使用单线程时要小,这使得某些LLC或内存限制的应用的可扩展性看起来没那么好。

    由于多核处理器的每个核心都有独立的一级、有时还有独立的二级缓存,使用多线程/多进程程序时可利用这些每个核心独享的缓存,这是超线性加速(指在多核处理器上获得的性能收益超过核数)的原因之一。

    多路与NUMA

    硬件生产商还将多个多核芯片封装在一起,称之为多路,多路之间以一种介于共享和独享之间的方式访问内存。由于多路之间缺乏缓存,因此其通信代价通常不比DRAM低。一些多核也将内存控制器封装进多核之中,直接和内存相连,以提供更高的访存带宽。

    多路上还有两个和内存访问相关的概念:UMA(均匀内存访问)和NUMA(非均匀内存访问)。UMA是指多个核心访问内存中的任何一个位置的延迟是一样的,NUMA和UMA相对,核心访问离其近(指访问时要经过的中间节点数量少)的内存其延迟要小。如果程序的局部性很好,应当开启硬件的NUMA支持。

    硬件平台

    异构并行计算人员的能力最终需要通过运行在硬件上的程序来证明,这意味着异构并行计算编程人员对硬件的了解与其能力直接正相关。

    目前大家接触到处理器主要类型有:X86、ARM、GPU、FPGA等,它们的差别非常大。

    X86

    X86是Intel/AMD及相关厂商生产的一系列CPU处理器的统称,也是大家日常所见。X86广泛应用在桌面、服务器和云上。

    SSE是 X86 向量多核处理器支持的向量指令,具有16个长度为128位(16个字节)的向量寄存器,处理器能够同时操作向量寄存器中的16个字节,因此具有更高的带宽和计算性能。AVX将SSE的向量长度延长为256位(32字节),并支持浮点乘加。现在,Intel已将向量长度增加到512位。由于采用显式的SIMD编程模型,SSE/AVX的使用比较困难,范围比较有限,使用其编程是一件比较痛苦的事情。

    MIC是Intel的众核架构,它拥有大约60左右个X86核心,每个核心包括向量单元和标量单元。向量单元包括32个长度为512位(64字节)的向量寄存器,支持16个32位或8个64位数同时运算。目前的MIC的核为按序的,因此其性能优化方法和基于乱序执行的X86处理器核心有很大不同。

    为了减小使用SIMD指令的复杂度,Intel寄希望于其编译器的优化能力,实际上Intel的编译器向量化能力非常不错,但是通常手工编写的向量代码性能会更好。在MIC上编程时,软件开发人员的工作部分由显式使用向量指令转化为改写C代码和增加编译制导语句以让编译器产生更好的向量指令。

    另外,现代64位X86 CPU还利用SSE/AVX指令执行标量浮点运算。

    ARM

    目前高端的智能手机、平板使用多个ARM核心和多个GPU核心。在人工智能时代,运行在移动设备上的应用对计算性能需求越来越大,而由于电池容量和功耗的原因,移动端不可能使用桌面或服务器高性能处理器,因此其对性能优化具有很高需求。

    目前市场上的高性能ARM处理器主要是32位的A7/A9/A15,已经64位的A53/A57/A72。ARM A15 MP是一个多核向量处理器,它具有4个核心,每个核心具有64KB一级缓存,4个核心最大可共享2MB的二级缓存。ARM 32支持的向量指令集称为NEON。NEON具有16个长度为128位的向量寄存器(这些寄存器以q开头,也可表示为32个64位寄存器,以d开头),可同时操作向量寄存器的16个字节,因此使用向量指令可获得更高的性能和带宽。ARM A72 MP是一个多核向量处理器,其最多具有4个核心,每个核心独享32KB的一级数据缓存,四个核心最高可共享4MB统一的二级缓存。ARM 64支持的向量指令集称为asimd,指令功能基本上兼容neon,但是寄存器和入栈规则具有明显的不同,这意味着用neon写的汇编代码不能兼容asimd。

    GPU

    GPGPU是一种利用处理图形任务的GPU来完成原本由CPU处理(与图形处理无关的)的通用计算任务。由于现代GPU强大的并行处理能力和可编程流水线,令其可以处理非图形数据。特别在面对单指令流多数据流(SIMD),且数据处理的运算量远大于数据调度和传输的需要时,GPGPU在性能上大大超越了传统的CPU应用程序。

    GPU是为了渲染大量像素而设计的,并不关心某个像素的处理时间,而关注单位时间内能够处理的像素数量,因此带宽比延迟更重要。考虑到渲染的大量像素之间通常并不相关,因此GPU将大量的晶体管用于并行计算,故在同样数目的晶体管上,具有比CPU更高的计算能力。

    CPU和GPU的硬件架构设计思路有很多不同,因此其编程方法很不相同,很多使用CUDA的开发人员有机会重新回顾学习汇编语言的痛苦经历。GPU的编程能力还不够强,因此必须要对GPU特点有详细了解,知道哪些能做,哪些不能做,才不会出现项目开发途中发觉有一个功能无法实现或实现后性能很差而导致项目中止的情况。

    由于GPU将更大比例的晶体管用于计算,相对来说用于缓存的比例就比CPU小,因此通常局部性满足CPU要求而不满足GPU要求的应用不适合GPU。由于GPU通过大量线程的并行来隐藏访存延迟,一些数据局部性非常差的应用反而能够在GPU上获得很好的收益。另外一些计算访存比低的应用在GPU上很难获得非常高的性能收益,但是这并不意味着在GPU实现会比在CPU上实现差。CPU+GPU异构计算需要在GPU和CPU之间传输数据,而这个带宽比内存的访问带宽还要小,因此那种需要在GPU和CPU之间进行大量、频繁数据交互的解决方案可能不适合在GPU上实现。

    FPGA

    FPGA是现场可编程门阵列的缩写,随着人工智能的流行,FPGA越来越得到产业界和学术界的重视。FPGA的主要特点在于其可被用户或设计者重新进行配置,FPGA的配置可以通过硬件描述语言进行,常见的硬件描述语言有VHDL和verilog。

    使用VHDL和Verilog编程被人诟病的一点在于其编程速度。随着FPGA的流行,其编程速度越来越得到重视,各个厂商都推出了各自的OpenCL编程环境,虽然OpenCL降低了编程难度,但是其灵活性和性能也受到很大的限制。

    传统上,FPGA用于通信,现在FPGA也用于计算和做硬件电路设计验证。目前主流的两家FPGA厂商是Altera和Xilinx,Intel在2014年收购了Altera,估计在2018年,Intel X86+FPGA的异构产品会出现在市场。

    编程环境

    本节将详细介绍目前主流的并行编程环境,既包括常见的指令级并行编程技术,也包括线程级并行编程技术和进程级技术。

    Intel AVX/AVX512 Intrinsic

    SSE/AVX是Intel推出的用以挖掘SIMD能力的汇编指令。由于汇编编程太难,后来Intel又给出了其内置函数版本(intrinsic)。

    SSE/AVX指令支持数据并行,一个指令可以同时对多个数据进行操作,同时操作的数据个数由向量寄存器的长度和数据类型共同决定。如SSE4向量寄存器(xmm)长度为128位,即16个字节。如果操作float或int型数据,可同时操作4个,如果操作char型数据,可同时操作16个,而AVX向量寄存器(ymm)长度为256位,即32字节。

    虽然SSE4/AVX指令向量寄存器的长度为128/256 位,但是同样支持更小长度的向量操作。在64位程序下,SSE4/AVX 向量寄存器的个数是16个。

    SSE指令要求对齐,主要是为了减少内存或缓存操作的次数。SSE4指令要求16字节对齐,而AVX指令要求32字节对齐。SSE4及以前的SSE指令不支持不对齐的读写操作,为了简化编程和扩大应用范围,AVX指令支持非对齐的读写。

    ARM NEON Intrinsic

    NEON是ARM处理器上的SIMD指令集扩展,由于ARM在移动端得到广泛应用,目前NEON的使用也越来越普遍。

    NEON支持数据并行,一个指令可同时对多个数据进行操作,同时操作的数据个数由向量寄存器的长度和数据类型共同决定。

    ARMv7具有16个128位的向量寄存器,命名为q0~q15,这16个寄存器又可以分成32个64位寄存器,命名为d0~d31。其中qn和d2n、d2n+1是一样的,故使用汇编写代码时要注意避免寄存器覆盖。

    OpenMP

    OpenMP是Open Multi-Processing的简称,是一个基于共享存储器的并行环境。OpenMP支持C/C++/Fortran绑定,也被实现为库。目前常用的GCC、ICC和Visual Studio都支持OpenMP。

    OpenMP API包括以下几个部分:一套编译器伪指令,一套运行时函数,一些环境变量。OpenMP已经被大多数计算机硬件和软件厂商所接受,成为事实上的标准。

    OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中插入各种pragma伪指令来指明自己的意图,编译器据此可以自动将程序并行化,并在必要之处加入同步互斥等通信。当选择告诉编译器忽略这些pragma或者编译器不支持OpenMP时,程序又可退化为串行程序,代码仍然可以正常运作,只是不能利用多线程来加速程序执行。OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据并行的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以适应不同的并行系统配置。线程粒度和负载均衡等是传统并行程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了这两方面的部分工作。

    OpenMP的设计目标为:标准、简洁实用、使用方便、可移植。作为高层抽象,OpenMP并不适合需要复杂的线程间同步、互斥及对线程做精密控制的场合。OpenMP的另一个缺点是不能很好地在非共享内存系统(如计算机集群)上使用,在这样的系统上,MPI更适合。

    MPI

    MPI(Message Passing Interface,消息传递接口)是一种消息传递编程环境。消息传递指用户必须通过显式地发送和接收消息来实现处理器间的数据交换。MPI定义了一组通信函数,以将数据从一个MPI进程发送到另一个MPI进程。在消息传递并行编程中,每个控制流均有自己独立的地址空间,不同的控制流之间不能直接访问彼此的地址空间,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。实践表明MPI的扩展性非常好,无论是在几个节点的小集群上,还是在拥有成千上万节点的大集群上,都能够很好地应用。

    由于消息传递程序设计要求用户很好地分解问题,组织不同控制流间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法。MPI是基于进程的并行环境。进程拥有独立的虚拟地址空间和处理器调度,并且执行相互独立。MPI设计为支持通过网络连接的机群系统,且通过消息传递来实现通信,消息传递是MPI的最基本特色。

    MPI是一种标准或规范的代表,而非特指某一个对它的具体实现,MPI成为分布式存储编程模型的代表和事实上的标准。迄今为止,所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得到MPI在不同并行计算机上的实现,一个正确的MPI程序可以不加修改地在所有的并行机上运行。

    MPI只规定了标准并没有给出实现,目前主要的实现有OpenMPI、Mvapich和MPICH,MPICH相对比较稳定,而OpenMPI性能较好,Mvapich则主要是为了Infiniband 而设计。

    MPI主要用于分布式存储的并行机,包括所有主流并行计算机。但是MPI也可以用于共享存储的并行机,如多核微处理器。编程实践证明MPI的可扩展性非常好,其应用范围从几个机器的小集群到工业应用的上万节点的工业级集群。MPI已在Windows上、所有主要的UNIX/Linux工作站上和所有主流的并行机上得到实现。使用MPI进行消息传递的C或Fortran并行程序可不加改变地运行在使用这些操作系统的工作站,以及各种并行机上。

    OpenCL

    OpenCL(Open Computing Language,开放计算语言),先由Apple设计,后来交由Khronos Group维护,是异构平台并行编程的开放的标准,也是一个编程框架。Khronos Group是一个非盈利性技术组织,维护着多个开放的工业标准,并且得到了工业界的广泛支持。OpenCL的设计借鉴了CUDA的成功经验,并尽可能的支持多核CPU、GPU或其他加速器。OpenCL不但支持数据并行,还支持任务并行。同时OpenCL内建了多GPU并行的支持。这使得OpenCL的应用范围比CUDA广,但是目前OpenCL的API参数比较多(因为不支持函数重载),因此函数相对难以熟记。

    OpenCL覆盖的领域不但包括GPU,还包括其他的多种处理器芯片。到现在为止,支持OpenCL的硬件主要局限在CPU、GPU和FPGA上,目前提供OpenCL开发环境的主要有NVIDIA、AMD、ARM、Qualcomm、Altera和Intel,其中NVIDIA和AMD都提供了基于自家GPU的OpenCL实现,而AMD和Intel提供了基于各自CPU的OpenCL实现。目前它们的实现都不约而同地不支持自家产品以外的产品。由于硬件的不同,为了写出性能优异的代码,可能会对可移植性造成影响。

    OpenCL包含两个部分:一是语言和API,二是架构。为了C程序员能够方便、简单地学习OpenCL,OpenCL只是给C99进行了非常小的扩展,以提供控制并行计算设备的API以及一些声明计算内核的能力。软件开发人员可以利用OpenCL开发并行程序,并且可获得比较好的在多种设备上运行的可移植性。

    OpenCL的目标是一次编写,能够在各种硬件条件下编译的异构程序。由于各个平台的软硬件环境不同,高性能和平台间兼容性会产生矛盾。而OpenCL允许各平台使用自己硬件的特性,这又增大了这一矛盾。但是如果不允许各平台使用自己的特性,却会阻碍硬件的改进。

    CUDA

    CUDA认为系统上可以用于计算的硬件包含两个部分:一个是CPU(称为主机),一个是GPU(称为设备),CPU控制/指挥GPU工作,GPU只是CPU的协处理器。目前CUDA只支持NVIDIA的GPU,而CPU由主机端编程环境负责。

    CUDA是一种架构,也是一种语言。作为一种架构,它包括硬件的体系结构(G80、GT200、Fermi、Kepler)、硬件的CUDA计算能力及CUDA程序是如何映射到GPU上执行;作为一种语言,CUDA提供了能够利用GPU计算能力的方方面面的功能。CUDA的架构包括其编程模型、存储器模型和执行模型。CUDA C语言主要说明了如何定义计算内核(kernel)。CUDA架构在硬件结构、编程方式与CPU体系有极大不同,关于CUDA的具体细节读者可参考CUDA相关的书籍。

    CUDA以C/C++语法为基础而设计,因此对熟悉C系列语言的程序员来说,CUDA的语法比较容易掌握。另外CUDA只对ANSI C进行了最小的扩展,以实现其关键特性:线程按照两个层次进行组织、共享存储器(shared memory)和栅栏(barrier)同步。

    目前CUDA提供了两种API以满足不同人群的需要:运行时API和驱动API。运行时API基于驱动API构建,应用也可以使用驱动API。驱动API通过展示低层的概念提供了额外的控制。使用运行时API时,初始化、上下文和模块管理都是隐式的,因此代码更简明。一般一个应用只需要使用运行时API或者驱动API中的一种,但是可以同时混合使用这两种。笔者建议读者优先使用运行时API。

    编程模式

    和串行编程类似,并行编程也表现出模式的特征,并行编程模式是对某一类相似并行算法的解决方案的抽象。

    和串行编程类似,并行编程对于不同应用场景也有不同的解决方法。由于并行的特殊性,串行的解决方法不能直接移植到并行环境上,因此需要重新思考、设计解决方法。并行编程模式大多数以数据和任务(过程化的操作)为中心来命名,也有一些是以编程方法来命名。

    经过几十年的发展,人们已经总结出一系列有效的并行模式,这些模型的适用场景各不相同。本节将简要说明一些常用并行模式的特点、适用的场景和情况,具体的描述和实现则在后文详细描述。

    需要说明的是:从不同的角度看,一个并行应用可能属于多个不同的并行模式,本质原因在于这些并行模式中存在重叠的地方。由于模式并非正交,因此适用于一种模式的办法可能也适用于另一种模式,读者需要举一反三。

    任务并行模式

    任务并行是指每个控制流计算一件事或者计算多个并行任务的一个子任务,通常其粒度比较大且通信很少或没有。

    由于和人类的思维方式比较类似,任务并行比较受欢迎,且又易于在原有的串行代码的基础上实现。

    数据并行模式

    数据并行是指一条指令同时作用在多个数据上,那么可以将一个或多个数据分配给一个控制流计算,这样多个控制流就可以并行,这要求待处理的数据具有平等的特性,即几乎没有需要特殊处理的数据。如果对每个数据或每个小数据集的处理时间基本相同,那么均匀分割数据即可;如果处理时间不同,就要考虑负载均衡问题。通常的做法是尽量使数据集的数目远大于控制流数目,动态调度以基本达到负载均衡。

    数据并行对控制的要求比较少,因此现代GPU利用这一特性,大量减少控制单元的比例,而将空出来的单元用于计算,这样就能在同样数量的晶体管上提供更多的原生计算能力。

    基于进程的、基于线程的环境,甚至指令级并行环境都可以很好地应用在数据并行上。必要时可同时使用这三种编程环境,在进程中分配线程,在线程中使用指令级并行处理多个数据,这称为混合计算。

    异构并行计算领域现状

    在2005年之前,处理器通常提升频率来提升计算性能,由于性能是可预测的,因此在硬件生产商、研究人员和软件开发人员之间形成了一个良性循环。由于功耗的限制,处理器频率不能接着提升,硬件生产商转而使用向量化或多核技术。而以GPU计算为代表的异构并行计算的兴起,加上人工智能的加持,异构并行计算从学术界走向工业界,获得了大众的认可。今天几乎所有主流的处理器硬件生产商都已经在支持OpenCL,未来异构并行计算必将无处不在。今天无论上技术上还是市场上,它都获得了长足的发展,笔者可以预计在未来的十年,异构并行计算必将进一步深入发展,并且在更多的行业产生价值。

    技术进展

    由于工艺制程的影响,芯片的集成度提升会越来越难,现在14nm已经量产,未来7nm也将很快。随着制程技术到达极限,某些厂商通过制程领先一代的优势会消失,软件公司会进一步重视异构并行计算人才的价值。而一些硬件厂商会进化成系统厂商,不再只是提供单纯的硬件,进而会硬件和系统软件一起提供,通过把软件的成本转嫁到硬件上来获得利润。

    随着异构并行计算影响力的提升,各个厂商和组织开发了一系列的技术,如WebCL、OpenVX、Vulkan等。这些技术进一步丰富和扩张了异构并行计算的领域,更促进了异构并行计算。今天基本上每家硬件和系统软件公司都或多或少的涉及到了异构并行计算。

    市场需求

    随着人工智能的兴起,市场对异构并行计算领域人员的需求已经从传统的科学计算、图像处理转到互联网和新兴企业,目前人员缺口已经很大了,从51job和智联招聘上能够查到许多招聘信息。

    由于目前还在行业的早期,异构并行计算开发人员的能力和老板期望和支出之间存在明显的认知差距,再加上异构并行计算开发人员的工作成果往往需要和产品间接反应,故在多个层面上存在博弈。对于异构并行计算领域的人员来说,这个博弈有点不公平,因为职业特点要求异构并行计算领域的从业人员要比算法设计人员更了解算法实现细节、要比算法实现人员更了解算法的应用场景,再加上编程上的难度和需要付出更多的时间。但是由于行业刚形成不久,老板们并没有意识到这一点,他们还只是把异构并行计算从业人员当成普通的开发者,矛盾就产生了。

    随着人工智能的兴起,市场对异构并行计算从业人员的认知逐渐变得理性。越来越多的企业认识到:异构并行计算是人工智能企业最核心的竞争力之一。可以预见在不远的将来,异构并行计算工程师会越来越吃香。

    作者简介:
    刘文志,商汤科技高性能计算部门负责人,硕士毕业于中国科学院研究生院。曾于2011年至2014年间于英伟达担任并行计算工程师。后就职百度深度学习研究院高级研发工程师,负责异构计算组日常工作。
    责编:何永灿(heyc@csdn.net
    本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅《程序员》


    订阅程序员(含iOS、Android及印刷版)请访问 http://dingyue.programmer.com.cn
    这里写图片描述

    订阅咨询:

    • 在线咨询(QQ):2251809102
    • 电话咨询:010-64351436
    • 更多消息,欢迎关注“程序员编辑部
    展开全文
  • 电感选型的关键参数

    万次阅读 多人点赞 2018-11-19 17:51:22
    ①电感与电容组成低通滤波器时,电感值是一个很关键参数。电感器件资料标称的电感值,是工作频率低于谐振频率点的值,如果工作频率高于谐振频率,则 电感值将会随着工作频率的升高而急剧减小,逐步呈现电容性 。 ...

    电感是一种储能元件,用在LC振荡电路、中低频的滤波电路,DC-DC能量转换等等,其应用频率范围很少超过50MHz。

    从阻抗频率曲线图可知,工作频率低于谐振频率时,电感器件表现出电感性,阻抗随着频率的升高而增大:当工作频率高于谐振频率时,电感器件表现出电容性,阻抗随着频率的升高而减小。

    在应用中,应选择谐振频率点高于工作频率的电感为电源滤波选用电感时,需要注意以下几点。

    ①电感与电容组成低通滤波器时,电感值是一个很关键的参数。电感器件资料标称的电感值,是工作频率低于谐振频率点的值,如果工作频率高于谐振频率,则电感值将会随着工作频率的升高而急剧减小,逐步呈现电容性
    电感用于电源滤波时,需要考虑由于其直流电阻而引起的压降

    用于电源滤波时,电感的工作电流必须小于额定电流。如果工作电流大于额定电流,电感未必会损坏,但是电感值可能低于标称值。

    几个主要有关参数
    ①电感值范围:1-470uH
    ②直流电阻:有多种直流电阻可供选择,电感值越大,对应的直流电阻也越大。一般信号用电感,其直流电阻比高频信号用电感和电源用电感大一些,最小的直流电阻一般为几毫欧,大的几欧。
    ③自谐振频率:几十兆赫兹到几百兆赫兹。电感值越大,其对应的自谐振频率越小。
    ④额定电流:几毫安到几十毫安。电感值越大,其对应的额定电流越小。
    工作频率低于谐振频率时,电感值基本保持稳定:但工作频率超过谐振频率后,电感值将会先增大,达到一定频率后,将迅速减小。
    电感啸叫原因

    如果耳朵能听到啸叫(吱吱声),可以肯定电感两端存在一个20HZ-20KHZ(人耳范围)左右的开关电流。
    例如DC-DC电路的电感啸叫,由于负载电流过大,DC内部有一个限流保护电路,当负载超过IC内部的开关(MOS)电流时,限流检测电路判断负载电流过大,会立即调整DAC内部开关占空比,或者立即停止开关工作,直到检测负载电流在标准范围内时,再重新启动正常的工作开关。从停止开关到重启开关的时间周期正好是几KHZ的频率,正因为这个周期的开关频率产生啸叫。
    改善对策:降低负载电流或更换功率稍大的DC-DC,更改输出电容等方法。

    负载电流或电压过大导致电感引起的噪声问题:电感--由于电流变化产生的感应电压引起传输线效应,突变,串扰,开关噪声,轨道塌陷,地弹和大大多数电磁干扰源(EMI)。

    例如:
    数字电路具有噪声,饱和逻辑(例如TTL和CMOS)在开关过程中会短暂地从电源吸入大电流,从而在数字地上引起的噪声就会很大,但由于逻辑级的抗扰度可达数百毫伏以上(由于电感引起--电流变化产生的感应电压)

    电感加入磁芯,主要目的是为了提高电感线圈的电感(或互感)量。

    反动电势:
    ①反电动势是指有反抗电流发生改变的趋势而产生电动势,其本质上属于感应电动势。
    ②反动电势的由来:电流的变化引起磁场的变化。根据麦克斯韦的说法,变化磁场的周围会产生电场,电场对其中的电荷会有电场力,电场力是非静电力,产生电动势。
    ③当电流是从小增加到大时,产生的反向电动势的方向与原电压方向相同。当电流从大到小时,产生的反向电动势的方向与原电压方向相反。

    在便携电子设备里都包含有多个电源管理芯片,一般常用的开关电源芯片分两种:BOOST转换器(升压),BUCK转换器(降压电路)。下面是两种电源电路的两种拓扑结构,在这里简单说明在两种电源结构中电感的选择准则。

    BOOST变换器是能产生高于电池电压的电路。

    BUCK变换器是能产生一个低于自己输入电压的电路,相比于线性降压器有更高的转换效率更少的发热。

    在开关电源电路里,电感都是独立外置的。随着现在电子设备越来越来小,PCB的面积也会越来越来小。做硬件系统设计时,在电感的大小与电感大小对电源电路性能的影响之前要做一个权衡。

    在选择电感时,许多与电感相关的参数需要认真进行考虑,这些参数一般包括:

    ∆L(感值误差)

    f0(自谐振频率)

    DCR(直流等效电阻)

    Isat(电感饱和电流)

    Irms(电感温升电流)

    电感的额定感值L及感值误差∆L

    额定电感值是电感在一个给定的频率下测得的值,感值误差是同一批电感里电感与电感之值的感值差异。一般在电感器件规格书里为如下:

    对于一个BUCK变换器,最小的电感值由输出电压,开关频率所以决定的,可由以下公式进行计算:

    Vinmax最大输入电压 ,Vout 输出电压 ,fsw开关频率,D开关占空比,Irpp

    电感的峰峰值电流。

    Irpp是一个需要特别重视的参数,它直接决定了选用的电感及输出电容的大小。Irpp电流大意味要得小的输出电压纹波,必须要使用大容值低ESR的输出电容。Irpp电流小意味着要选择大感值电感。为了平衡这一矛盾,一般在设计电路将Irpp选为电源电路Irated额定输出电流的50%,于是电感的计算公式简化为如下:

    相应的,BOOST变换器电感的公式如下:

    Vinmin最小输入电流。

    当我们设计电路时应该选择的电感值大于所计算出来的Lmin,同时在选择电感一定要将电感的误差值也计算在内。如果电感值误差是20%,那么我们在选择电感值就应该至少为1.25 × Lmin。

    例如:

    设一个BUCK变换器,输出电流500mA,电压1.2V。输入电压为电池电压最大到4.4V,开关频率1.2MHz。根据上面公式可以计算出Lmin=  2.91μH,将20%电感误差计算在内,1.25 × Lmin=3.64μH。在目标的标准电感内,可以看到为4.7μH。

    电感的自谐振频率f0

    理想电感器件的阻抗是随着频率的上升而增加的,但是真实中的电感器件由会存在寄生的电容形成RC电路结构,使电感器件存在一个自谐振频率f0。在这个频率之下,电感器件阻抗曲线表现为近以理想的电感特性,电感的阻抗随着频率的上升而增加的。在这个频率之上,电感器件更加表现的像一个电容,电感阻抗随着频率的上升面下降的。下面是理想电感与实际电感的阻抗曲线对比:

    对于一个外型大小已给定电感,电感值越大,自谐振频率越小。一般我们选择电感时自谐振频率为电路开关频率的10倍。

    在电感器件的规格里为如下:

    电感直流电阻DCR

    真实的电感器件并不是一个理想的纯感器件,会有一个直流电阻存在,我们一般称之为DCR。由于这个电阻的存在,使得流过电感器件的一部分电流以热的形热被耗散掉了,使得转换效率下降。在电感器件的阻抗曲线上,低频部分的大小是由DCR决定的。

    DCR与转效率的关系如下:

    Rdc电感的直流电阻,是由电压变换器输入的负载电流。

    从以上公式可以看出,当输入电压,负载电流,输出电压已经被给定的情况下,DCR越大率效越低。对于一般的电感器件来讲:

    电感直流电阻对于效率的影响,重载时比轻载明显。
    在电感值给定的情况下,电感器件的外型越小DCR越大。
    在电感外型大小给定的情况下,电感值越大DCR越大。
    在电感值一定的情况下,有磁屏蔽的电感器件的DCR小于没有磁屏蔽的。
    在电感的规格书里,一般会给DCR的典型值及最大值供我们参考,在设计时尽量选择较小DCR的电感。

    电感的饱和电流Isat及温升电流Iram

    电感都会有磁饱和特性,当电感中的电流大于某一个电流值时,电感量就会出现大幅下降,这个电流值我们称之为电感的饱和电流。在一般的工程实践中,我们将使电感量下降30%所对应的电流做为电感饱和电流。 

    电感的温升电流Irms 是流过电感电流的有效值,它主要会引起电感温度的上升使得电感量大幅下降。温度的上升是由于电感的DCR引起,我们一般定义其为,在室温下使得电感产生40度温升所对应的电流。通常电感的温升电流是低于其饱和电流的。

    如果在电路里发生了电感饱合,电感量下降会使得电感里的峰峰值电流Irpp增加,从而增大了AC损耗,使电压变换的效率降低。另外,更大的Irpp也会使得输出纹波电压变大。

    以一下BUCK为例(1.2V 500mA),测试两种不同规格的电感:

    CBC25184R7M 测试结果

    CB2518T4R7M测试结果

    观察以上两个图可以看到使用CBC25184R7M的Irpp是137mA,相对的使用CB2518T4R7M的是226mA,换算下来,CBC25184R7M的电感值是4.07uH下降了14%,而CB2518T4R7M为2.46uH下降了48%。

    同样的,流过电感的Irms高于电感所规定的温升电流,那么也会引起一样的问题。

    当我们在选择评估Isat,Irms这两个值时,一般要求其中最小的那个值要大于电路额定输出电流的1.3倍。

    部分转自:https://blog.csdn.net/athen21/article/details/83217950

    展开全文
  • 计算机四级网络工程师知识点(非常全面!)

    万次阅读 多人点赞 2019-09-07 01:43:15
    (1)批处理系统:分单道批处理系统多道批处理系统,其中多道批处理效率吞吐较高但缺少人机交互性;指令有特权指令一般指令; (2)分时系统:多用户共同、交互使用系统;独占性(用户感觉);及时性 (3...
  • 隐私AI工程技术实践指南–整体介绍 文章目录隐私AI工程技术实践指南--整体介绍隐私AI框架整体设计思路Rosetta框架核心设计思想融合MPC技术的分布式隐私AI架构多方网络的建立隐私数据的流动DAG的执行小结参考资料 ...
  • 此文觉得非常有逻辑性,而且有很多量子计算方面的常识介绍。大部分资料都是网络公开的,这里做了一个汇集。因此,转发到博客里。 文章目录 (一)量子是个啥? (二)各种量子技术都是啥? (三)量子计算机有啥用?...
  • 参数介绍 spark.scheduler.mode spark.streaming.concurrentJobs scheduler线程池 测试用例 Test Case Group 1: FIFO vs. FAIR Test Case 1-1: FIFO Test Case 1-2: FAIR Test Case Group 2: FIFO 1 Slot vs. ...
  • [工程计算实践]河道回淤率的计算

    千次阅读 2006-05-18 16:13:00
    [工程计算实践]河道回淤率的计算 EmilMatthew(EmilMatthew@126.com)1问题背景:淤泥质海岸浅滩受风浪、潮流的紊动剪切作用后,其泥沙呈丝烟雾状悬扬于水中,随综合动力作用的加强,水体含沙沿垂线分布趋向均匀。...
  • Hyperopt 参数优化

    万次阅读 多人点赞 2018-08-28 20:02:03
    Hyperopt简介 Hyperopt(Hyper-parameter Optimization...另一方面,一个模型会涉及到多个参数,要量化评估各种可能性是一个很大的工程量。因此hyperopt是一个很实用的函数库,可以帮助我们快速选定模型参数,得到...
  • 深度学习与计算机视觉系列(10)_细说卷积神经网络

    万次阅读 多人点赞 2016-01-19 19:27:09
    卷积神经网络普通的神经网络一样,由『神经元』按层级结构组成,其间的权重偏移都是可训练得到的。同样是输入的数据权重做运算,输出结果输入激励神经元,输出结果。从整体上看来,整个神经网络做的事情,...
  • 如今,基于数字血管造影系统指导的介入放射学已发展成为内科、外科以外的第三种有效的临床治疗方法手段。目前在我国介入医学技术的临床应用可概括为以下几方面:肿瘤的介入治疗、门脉高压症的血管内介
  • 以某矿村庄下压煤短壁开采为工程背景,采用大型有限元工程计算软件ANSYS,模拟短壁开采中保护煤柱与关键层的受力状况和变形特征,得到了不同设计参数时的关键层和煤柱最大下沉量和变形曲线,分析了采宽尺寸变化对关键层...
  • 计算机视觉的专家网站

    千次阅读 2015-01-21 10:19:24
     目标跟踪是绝大多数视觉系统中不可或缺的环节。在二维视频跟踪算法中,基于目标颜色信息或...如基于体素图像像素守恒假设的光流算法它也是假设一个物体的颜色在前后两帧没有巨大而明显的变化。 但在特定的场景
  • 计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学计算机技术的,因为计算机科学...
  • 1. 引言 上一节我们讲完了各种激励函数的优缺点选择,以及网络的大小以及正则化对神经网络的影响。这一节我们讲一讲输入数据预处理、正则化以及损失函数...神经网络结构和参数设定完毕之后,我们就得到得分函数/score
  • 庄朝晖:计算和逻辑

    千次阅读 2011-11-12 16:47:23
    庄朝晖:计算和逻辑 (2011-10-09 11:08:34) 标签: 校园 分类: 工作篇 所谓计算模型是刻划计算这一概念的一种抽象的形式系统或数学系统,而算法是对计算过程步骤(或状态的一种刻划,...
  •  计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学计算机技术的,因为计算机...
  • 前段时间看了几个笔试题,涉及 DNN 的模型复杂度,主要是参数量和计算复杂度的问题。当时搜了一下感觉中文网上的内容比较乱。刚好本文是对神经网络模型资源消耗情况的一篇介绍,就不自己写了,把关键内容做了一下...
  • 高性能计算的发展

    千次阅读 2018-07-23 13:20:29
    作为科技创新的重要手段,高性能计算广泛应用于核爆模拟、天气预报、工程计算等众多领域,是当代科技竞争的战略制高点,集中体现一个国家的综合实力。本文介绍高性能计算发展的历史现状,分析当前高性能计算所面临...
  • ML学习分享系列(2)_计算广告小窥[中]

    万次阅读 2016-02-19 12:25:26
    原因很简单,作为一个资历尚浅的研究生,是没有资格对计算广告这样一个伟大的行业、领域学科来评头论足的。之所以这么做,一是总结自己已掌握的知识,二是降低同学们的学习成本。本人能力有限,更缺乏实践经验,...
  • [深度学习] 超参数设定网络训练

    万次阅读 2018-05-12 17:59:43
    参数设定网络训练 介绍一些重要的网络设计过程中的超参数设定技巧训练技巧,如学习率,批规范化操作网络优化化策略的选择。 网络超参数的设定 网络超参数设定在搭建整个网络架构之前,需首先指定与网络...
  • 量子计算

    千次阅读 2018-12-14 22:05:13
    来源:博客丨政策管理作者:贺飞(北京大学)摘要:量子计算:前途光明 道路曲折量子计算:前途光明 道路曲折(一)本周,美国国家科学院、工程医学院的一个由13名量子计...
  • 堆栈计算机的原理实现

    万次阅读 2005-03-07 16:31:00
    堆栈计算机的原理实现 原书《 Stack Computers: the new wave 》 (原书封面) 原作者 Philip J....本书作者从堆栈如何被用于计算开始,对过去现在大约 70 多个堆栈计算机进行分类,并对其中的7个堆栈计算机进
  • 软考—必考考点之网络图计算专题

    千人学习 2016-04-06 11:00:27
    软考教程,软考考点网络图计算专题分析,进度管理中的工期和关键路径的计算是每年的必考题目,又是一个难点。该课程内容包括1.双代号网络图的绘制、最早开始时间、最早结束时间、最晚开始时间、最晚结束时间、自由...
  • 知识图谱关键技术与应用案例

    万次阅读 多人点赞 2018-11-06 11:50:18
    在知识图谱关键技术概念与工具的实践应用中,本课程也会讲解知识图谱的构建经验;以及达观在各行业领域系统中的产品开发系统应用。 报名地址: https://edu.csdn.net/huiyiCourse/detail/844 作者简介:桂洪冠,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,252
精华内容 29,300
关键字:

关键计算参数和工程量