intel cpu性能瓶颈分析方法_使用intel tmam 测量-程序员宅基地

自顶向下的微体系结构分析方法

使用此配方可了解应用程序如何利用可用的硬件资源以及如何利用CPU微体系结构。获得此知识的一种方法是使用片上性能监视单元(PMU)。

内容专家杰克逊·马鲁萨斯(Jackson Marusarz)德米特里·里亚布采夫Dmitry Ryabtsev)

PMU是CPU内核中的专用逻辑,用于对特定硬件事件(在系统中发生)进行计数。这些事件的示例可能是“高速缓存未命中”或“分支错误预测”。可以观察并组合这些事件以创建有用的高级指标,例如每条指令的周期(CPI)。

特定的微体系结构可以通过其PMU提供数百个事件。但是,确定哪些事件对于检测和修复特定的性能问题通常不是很明显。通常,它需要对微体系结构设计和PMU规范都有深入的了解,才能从原始事件数据中获取有用的信息。但是,您可以受益于使用预定义的事件和指标以及自上而下的表征方法,以将数据转换为可操作的信息。

探索PMU分析配方,以了解该方法及其在英特尔VTune放大器中的使用方式:

自顶向下的微体系结构分析方法概述

现代CPU使用流水线以及诸如硬件线程,乱序执行和指令级并行性之类的技术来尽可能有效地利用资源。尽管如此,某些类型的软件模式和算法仍会导致效率低下。例如,链接的数据结构通常在软件中使用,但是会导致间接寻址,这可能会使硬件预取器失败。在许多情况下,此行为会在检索数据且没有其他指令要执行时在管道中造成闲置气泡。链接的数据结构可能是解决软件问题的适当方法,但可能会导致效率低下。在软件级别上还有许多其他示例对基础CPU管道有影响。基于自上而下表征方法的自上而下的微体系结构分析方法旨在深入了解您是否已通过算法和数据结构做出明智的选择。见英特尔64和IA-32体系结构优化参考手册,附录B.1中有关自顶向下的微体系结构分析方法的更多详细信息。

自上而下的特征是基于事件的指标的层次结构,用于确定应用程序中主要的性能瓶颈。其目的是平均显示运行应用程序时CPU管道的使用情况。以前的用于解释事件的框架都依赖于CPU时钟信号-确定CPU时钟信号的哪一部分花在了哪种类型的操作上(例如,由于L2缓存未命中而检索数据)。相反,此框架基于对管道资源的考虑。要了解自顶向下的特性,请在下面深入探讨一些微体系结构概念。微体系结构的许多细节都在此框架中抽象化,使您无需硬件专家即可使用和理解它。

现代高性能CPU的管线非常复杂。在简化视图中,管道在概念上分为前端和后端两部分。前端负责获取体系结构指令中表示的程序代码,并将其解码为一个或多个称为微操作(uOps)的低级硬件操作。然后,将uOps通过分配过程馈送到后端。一旦分配,后端将负责监视uOp的数据操作数何时可用,并在可用执行单元中执行uOp。uOp执行的完成称为退役,并且uOp的结果将提交到架构状态(CPU寄存器或写回内存)。通常,大多数uOps会完全通过管道并退休,但是有时以推测方式获取的uOps可能会在退休之前被取消-就像分支预测错误的情况一样。

现代乱序的Intel CPU管道

最近的英特尔微体系结构上的流水线前端可以每个周期分配四个uOps,而后端可以每个周期淘汰四个uOps。从这些功能可以得出流水线槽的抽象概念。流水线插槽代表处理一个uOp所需的硬件资源。自上而下的特性假定每个CPU内核在每个时钟周期上都有四个可用的流水线插槽。然后,它使用经过特殊设计的PMU事件来衡量这些管道插槽的利用率。流水线插槽的状态在分配点(在上图中用星号标记)处获取,其中uOps离开前端进入后端。应用程序运行时可用的每个管道插槽将根据上述简化的管道视图分为四个类别之一。

在任何循环中,管道插槽可以为空,也可以填充uOp。如果在一个时钟周期内某个插槽为空,则归因于停顿。对该管道插槽进行分类所需的下一步是确定管道的前端部分还是后端部分导致了停顿。这是使用指定的PMU事件和公式完成的。自上而下表征的目的是确定主要瓶颈,因此,将停顿归因于前端或后端是一个需要考虑的关键点。通常,如果停顿是由于前端无法用uOp填充插槽而引起的,则它将被归类为此周期的前端绑定插槽,这意味着性能受到前端下某些瓶颈的限制绑定类别。如果前端已经准备好uOp但由于后端尚未准备好处理而无法交付,则空管道插槽将归类为“后端绑定”。后端停顿通常是由后端耗尽某些资源(例如,加载缓冲区)引起的。但是,如果前端和后端都停止,则该插槽将被归类为“后端绑定”。这是因为,在这种情况下,修复前端中的停顿很可能不会提高应用程序的性能。后端是阻塞瓶颈,在解决前端问题之前,首先需要将其删除。例如,加载缓冲区。但是,如果前端和后端都停止,则该插槽将被归类为“后端绑定”。这是因为,在这种情况下,修复前端中的停顿很可能不会提高应用程序的性能。后端是阻塞瓶颈,在解决前端问题之前,首先需要将其删除。例如,加载缓冲区。但是,如果前端和后端都停止,则该插槽将被归类为“后端绑定”。这是因为,在这种情况下,修复前端中的停顿很可能不会提高应用程序的性能。后端是阻塞瓶颈,在解决前端问题之前,首先需要将其删除。

如果处理器没有停止运行,则流水线插槽将在分配点处填充一个uOp。在这种情况下,如何对插槽进行分类的决定因素是uOp是否最终退出。如果确实退休,则该插槽被分类为“退休”。如果不是,则可能是由于前端的分支预测不正确,也可能是由于自修改代码导致的清除事件(如管道刷新),该插槽将被归类为不良推测。这四个类别构成了“自顶向下特征”的顶层。为了表征应用程序,将每个流水线插槽准确分类为以下四个类别之一:

这四个类别中的管道插槽分配非常有用。尽管基于事件的度量标准已经可以使用很多年了,但是在进行表征之前,还没有方法确定哪些可能的性能问题影响最大。将性能指标放入此框架后,您可以看到需要首先解决的问题。从第2代Intel Core处理器家族和IntelXeon处理器E5家族中使用的英特尔微体系结构代号Sandy Bridge开始,就可以将管道插槽分为四类。随后的微体系结构可能允许将这些高级类别进一步分解为更详细的性能指标。

VTune放大器的自顶向下分析方法

英特尔VTune放大器提供了“ 微体系结构探索”分析类型,该分析类型已预先配置为收集自上而下表征中定义的事件,从英特尔微体系结构代码名称Ivy Bridge开始。微体系结构探索还收集计算许多其他有用性能指标所需的事件。默认情况下,在“ 微体系结构探索”视图中显示“微体系结构探索”分析的结果。

微体系结构探索结果显示在层次结构列中,以增强表征的自上而下的本质。“ 摘要”窗口给出了整个应用程序在每个类别中管线插槽的百分比。您可以通过多种方式探索结果。探索结果的最常见方法是在功能级别查看指标:

对于每个功能,显示了每个类别中流水线槽的比例。例如,price_out_impl上面选择的功能在“前端绑定”类别中占2.2%的管道插槽,在“不良推测”中占7.4%,在“内存绑定”中占64.2%,在“核心绑定”中占8.4%,在“退休”类别中占17.8%。可以扩展每个类别以查看该类别下的指标。自动突出显示用于将您的注意力吸引到潜在的问题区域,在这种情况下,用于price_out_impl。

微体系结构调整方法

在进行任何性能调整时,重点放在应用程序的热点上很重要。热点地区是占用最多CPU时间的功能。专注于这些地方将确保优化影响整体应用程序性能。VTune放大器具有两种特定收集模式的热点分析:用户模式采样和基于硬件事件的采样。在“微体系结构探索”观点内,可以通过确定具有最高Clockticks事件计数的功能或模块来确定热点,该事件或计数测量CPU Clockticks的数量。为了从微体系结构调整中获得最大收益,请确保已应用算法优化(例如添加并行性)。通常,首先执行系统调整,然后是应用程序级算法调整,然后是体系结构和微体系结构调整。此过程也称为“自顶向下”,就像自上而下的软件调整方法一样。它以及性能调整的其他重要方面(如工作负载选择)在本文档中进行了描述。消除神秘的软件性能优化文章。

 

  1. 选择一个热点功能(其中一个占应用程序总时钟的百分比很大)。

  2. 使用自上而下的方法和下面给出的准则评估该热点的效率。

  3. 如果效率不高,则向下钻取代表主要瓶颈的类别,然后使用子级别的下一级别来确定原因。

  4. 优化问题。VTune Amplifier 调整指南包含针对每个类别中许多潜在性能问题的特定调整建议。

  5. 重复直到评估了所有重要的热点。

 

如果度量标准值超出预定义的阈值并出现在热点中,则VTune Amplifier会自动在GUI中突出显示度量标准值。如果VTune放大器对某个应用程序中的某个应用程序的总时钟频率大于总时钟频率的5%,则VTune Amplifier会将其归类为热点。确定特定类别的管道插槽的给定部分是否构成瓶颈可能取决于工作量,但下表提供了一些常规准则:

 

 

调整好的热点中此类别中管道槽的预期范围:

类别

客户/桌面应用

服务器/数据库/分布式应用程序

高性能计算(HPC)应用程序

退役

20-50%

10-30%

30-70%

后端绑定

20-40%

20-60%

20-40%

前端绑定

5-10%

10-25%

5-10%

不良投机

5-10%

5-10%

1-5%

 

这些阈值基于对英特尔实验室中某些工作负载的分析。如果热点的类别(而不是退休)中花费的时间比例处于高端或大于指示的范围,则进行调查可能会有用。如果对于多个类别都适用,则应首先调查时间比例最大的类别。请注意,预计热点在每种类别中花费的时间都将占一定比例,并且以下正常范围内的值可能并不表示有问题。

关于自上而下方法的重要一点是,您无需花费时间优化未被识别为瓶颈的类别中的问题-这样做可能不会显着提高性能。

调整后端绑定类别

大多数未调整的应用程序将是“后端绑定”。解决后端问题通常是与解决延迟源有关,这将导致退休花费的时间超过必要时间。在英特尔微体系结构代码名称Sandy Bridge上,VTune Amplifier具有“后端绑定”指标,用于查找高延迟源。例如,LLC Miss(上级高速缓存未命中)度量标准标识需要访问DRAM以获得数据的代码区域,而Split Loads和Split Stores度量标准指出会损害性能的内存访问模式。有关英特尔微体系结构代码名称Sandy Bridge指标的更多详细信息,请参阅《调优指南》。从英特尔微体系结构代码名称Ivy Bridge(在第三代英特尔酷睿处理器家族中使用)开始,可以使用事件将“后端绑定”分类分解为“内存绑定”和“核心绑定”子指标。前4个类别下的指标可以使用管道插槽域以外的域。每个指标将基于基础PMU事件使用最合适的域。有关更多详细信息,请参见每个指标或类别文档

使用与执行单元的利用率相对应的事件来确定“内存”和“核心绑定”子度量标准,这与顶级分类中使用的分配阶段相反。因此,这些指标的总和不一定与顶层确定的“后端绑定”比率匹配(尽管它们具有很好的相关性)。

“内存绑定”类别中的停顿具有与内存子系统有关的原因。例如,缓存未命中和内存访问可能导致内存绑定停顿。核心绑定停顿是由于每个周期内CPU可用执行单元的使用不尽人意引起的。例如,连续竞争多个除法单元的多个多周期除法指令可能会导致内核绑定停顿。对于此故障,只有在插槽停止且没有未完成的内存访问的情况下,插槽才被归类为“核心绑定”。例如,如果有挂起的负载,则该周期被归类为“内存绑定”,因为在负载尚未返回数据时,执行单元正处于饥饿状态。PMU事件被设计到硬件中,专门允许这种类型的故障,这有助于确定应用程序中的真正瓶颈。

“内存绑定”类别下的大多数度量标准都确定了从L1缓存到内存的哪个内存层次结构级别是瓶颈。同样,仔细确定了用于此确定的事件。后端停止后,指标将尝试将暂挂的负载的停顿归因于特定级别的缓存或运行中的存储。如果将热点绑定到给定级别,则意味着正在从该缓存级别或内存级别检索其大部分数据。优化应该集中在使数据更靠近核心。Store Bound也称为子类别,它可以指示相关性-例如何时管道中的负载取决于先前的存储。在每个类别下,都有一些指标可以识别导致内存绑定执行的特定应用程序行为。例如,

核心绑定停顿通常在后端绑定中不常见。当可用的计算资源没有得到充分利用和/或在没有显着内存需求的情况下使用时,可能会发生这些情况。例如,一个紧密循环对适合缓存的数据执行浮点(FP)算术计算。VTune Amplifier提供了一些指标来检测此类别中的行为。例如,除法器度量标准确定了大量使用除法器硬件时的周期,而端口利用率度量标准则确定了对离散执行单元的竞争。

后端绑定类别

注意

指标值显示为灰色表示该指标收集的数据不可靠。例如,如果为PMU事件收集的样本数量太少,则可能会发生这种情况。您可以忽略此数据,也可以在数据收集时间,采样间隔或工作量增加的情况下重新运行收集。

调整前端绑定类别

前端绑定类别涵盖了其他几种类型的管线停转。管道的前端部分成为应用程序的瓶颈的可能性较小。但是,在某些情况下,前端可能会导致机器停顿。例如,JIT代码和解释代码会导致前端停顿,因为指令流是动态创建的,没有事先编译器代码布局的好处。在“前端绑定”类别中提高性能通常将与代码布局(共定位热代码)和编译器技术有关。例如,分支代码或具有较大占用空间的代码可能会突出显示“前端绑定”类别。在许多情况下,诸如代码大小优化和编译器配置文件引导的优化(PGO)之类的技术可能会减少停顿。

英特尔微体系结构代号为Ivy Bridge的自上而下方法将前端绑定的停顿分为两类,即前端延迟和前端带宽。前端延迟度量标准报告周期,其中一个周期中前端未发出任何微指令,而后端则准备使用它们。回想一下,前端集群每个周期最多可以发出4微分。“前端带宽”度量标准报告了发出少于4微秒的周期,这表示对前端功能的使用效率低下。在每个类别下都将确定其他指标。

分支错误预测(通常在不良推测类别中得到了解决)也可能导致前端效率低下,如前端延迟下的“分支延迟”瓶颈指标所表示的那样,前端效率低下是从英特尔微体系结构代码名称Ivy Bridge开始的。

前端绑定类别

VTune Amplifier列出了可以识别前端绑定代码原因的指标。如果这些类别中的任何一个在结果中显着显示,请更深入地研究度量标准以确定原因以及如何纠正它们。例如,ITLB开销(指令转换后备缓冲区开销)和ICache丢失(指令缓存未命中)度量标准可能指出受前端绑定执行影响的区域。有关调整建议,请参见《 VTune放大器调整指南》。

调整不良推测类别

第三个顶级类别不良推测,表示管道何时忙于获取和执行无用的操作。坏投机管道槽是由从来没有退休或停滞不前,而机器从一个不正确的猜测恢复发行微指令浪费插槽。坏猜测是由分支预测失误引起的机械清除和喜欢自我修改码的情况较少见。可以通过诸如Profile-Guided Optimization(PGO)之类的编译器技术来减少不良推测,避免间接分支,并消除导致机器清除的错误情况。纠正不良投机问题也可能有助于减少前端绑定停顿的数量。有关特定的调整技术,请参考适用于您的微体系结构的《 VTune放大器调整指南》。

不良投机类别

退休类别调

在顶层最后一类是退休。它是指当管道忙于通常有用的操作。理想情况下,一个应用程序应具有尽可能多的此类插槽。然而,代码与他们的管线槽退休可以有改进的余地的大部分甚至地区。将落入该类别退役下一个性能问题是大量使用的微定序器,其通过产生的uop的长流,以解决特定条件协助前端的。在这种情况下,虽然有很多退休的微操作,其中一些本来是可以避免的。例如,在非正规数的情况下应用FP协助通常可以通过编译选项(如DAZ或FTZ)减少。代码生成的选择也可以帮助缓解这些问题 - 有关详细信息,请参阅使用VTune放大器调整指南。在英特尔微架构代号Sandy Bridge的,协助被认定为退休类别下的度量。在英特尔微架构代号Ivy Bridge的超越,在退休后的理想类别的管线槽被分成称为通用退休的一个子类,和微码序微指令,分别确定。

退休类别

如果尚未完成,那么诸如并行化和向量化之类的算法调整技术可以帮助提高属于退休类别的代码区域的性能。

结论

自上而下的方法及其在VTune放大器中的可用性代表了使用PMU进行性能调整的新方向。花费在开发人员熟悉该特性上的时间将是值得的,因为对它的支持已被设计到最新的PMU中,并且在可能的情况下,层次结构在将来的英特尔微体系结构上进一步扩展。例如,在英特尔微体系结构代码名称Sandy Bridge和英特尔微体系结构代码名称Ivy Bridge之间,该特性得到了显着扩展。

自顶向下方法的目标是确定应用程序性能中的主要瓶颈。VTune放大器的微体系结构探索分析和可视化功能的目标是为您提供可操作的信息,以改善您的应用程序。这些功能加在一起,不仅可以显着提高应用程序性能,而且可以极大地提高优化效率。

https://software.intel.com/en-us/vtune-amplifier-cookbook-top-down-microarchitecture-analysis-method

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Dreamandpassion/article/details/102784969

智能推荐

【新手科研指南5】深度学习代码怎么读-小白阶段性思路(以手写数字识别应用为例)_深度学习程序怎么读-程序员宅基地

文章浏览阅读6.2k次,点赞6次,收藏26次。我是一个深度学习代码小白,请你用中文写上注释,能让我能轻松理解下面这段代码。注意包含所有函数、调用和参数的注释。以同样的python代码块样式返回你写的代码给我。代码看累了,就看《动手学深度学习》文档:基于PyTorch框架,从底层函数实现基础功能,再到框架的高级功能。努力上路的小白一枚,麻烦路过的大佬指导一二,同时希望能和大家交流学习~争取更新学习这个文档的专栏,记录学习过程。量身定做了一套话术hhh,亲身测试还不错。这个感觉更浅一点儿,之后复习看吧。20天吃掉那只Pytorch。_深度学习程序怎么读

Java学习路线图,看这一篇就够了!-程序员宅基地

文章浏览阅读2.7w次,点赞126次,收藏1.2k次。耗废1024根秀发,Java学习路线图来了,整合了自己所学的所有技术整理出来的2022最新版Java学习路线图,适合于初、中级别的Java程序员。_java学习路线

PCL_Tutorial2-1.7-点云保存PNG_pcl::io:savepng-程序员宅基地

文章浏览阅读4.4k次。1.7-savingPNG介绍代码详情函数详解savePNGFile()源码savePNGFile()源码提示savePNGFile()推荐用法处理结果代码链接介绍PCL提供了将点云的值保存到PNG图像文件的可能性。这只能用有有序的云来完成,因为结果图像的行和列将与云中的行和列完全对应。例如,如果您从类似Kinect或Xtion的传感器中获取了点云,则可以使用它来检索与该云匹配的640x480 RGB图像。代码详情#include <pcl / io / pcd_io.h>#incl_pcl::io:savepng

知乎问答:程序员在咖啡店编程,喝什么咖啡容易吸引妹纸?-程序员宅基地

文章浏览阅读936次。吸引妹子的关键点不在于喝什么咖啡,主要在于竖立哪种男性人设。能把人设在几分钟内快速固定下来,也就不愁吸引对口的妹子了。我有几个备选方案,仅供参考。1. 运动型男生左手单手俯卧撑,右手在键盘上敲代码。你雄壮的腰腹肌肉群活灵活现,简直就是移动的春药。2.幽默男生花 20 块找一个托(最好是老同学 or 同事)坐你对面。每当你侃侃而谈,他便满面涨红、放声大笑、不能自已。他笑的越弱_咖啡厅写代码

【笔试面试】腾讯WXG 面委会面复盘总结 --一次深刻的教训_腾讯面委会面试是什么-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏5次。今天 (应该是昨天了,昨晚太晚了没发出去)下午参加了腾讯WXG的面委会面试。前面在牛客上搜索了面委会相关的面经普遍反映面委会较难,因为都是微信的核心大佬,问的问题也会比较深。昨晚还蛮紧张的,晚上都没睡好。面试使用的是腾讯会议,时间到了面试官准时进入会议。照例是简单的自我介绍,然后是几个常见的基础问题:例如数据库索引,什么时候索引会失效、设计模式等。这部分比较普通,问的也不是很多,不再赘述。现在回想下,大部分还是简历上写的技能点。接下来面试官让打开项目的代码,对着代码讲解思路。我笔记本上没有这部分代码,所_腾讯面委会面试是什么

AI绘画自动生成器:艺术创作的新浪潮-程序员宅基地

文章浏览阅读382次,点赞3次,收藏4次。AI绘画自动生成器是一种利用人工智能技术,特别是深度学习算法,来自动创建视觉艺术作品的软件工具。这些工具通常基于神经网络模型,如生成对抗网络(GANs),通过学习大量的图像数据来生成新的图像。AI绘画自动生成器作为艺术与科技结合的产物,正在开启艺术创作的新篇章。它们不仅为艺术家和设计师提供了新的工具,也为普通用户提供了探索艺术的机会。随着技术的不断进步,我们可以预见,AI绘画自动生成器将在未来的创意产业中发挥越来越重要的作用。

随便推点

Flutter ListView ListView.build ListView.separated_flutter listview.separated和listview.builder-程序员宅基地

文章浏览阅读1.7k次。理解为ListView 的三种形式吧ListView 默认构造但是这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿直接返回的是每一行的Widget,相当于ios的row。行高按Widget(cell)高设置ListView.build 就和io..._flutter listview.separated和listview.builder

2021 最新前端面试题及答案-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏14次。废话不多说直接上干货1.js运行机制JavaScript单线程,任务需要排队执行同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行以宏任务和微任务进一步理解js执行机制整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务执行新的宏任务,凡是在..._前端面试

linux基本概述-程序员宅基地

文章浏览阅读1k次。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。_linux

JavaScript学习手册十三:HTML DOM——文档元素的操作(一)_javascript学习手册十三:html dom——文档元素的操作(一)-程序员宅基地

文章浏览阅读7.9k次,点赞26次,收藏66次。HTML DOM——文档元素的操作1、通过id获取文档元素任务描述相关知识什么是DOM文档元素节点树通过id获取文档元素代码文件2、通过类名获取文档元素任务描述相关知识通过类名获取文档元素代码文件3、通过标签名获取文档元素任务描述相关知识通过标签名获取文档元素获取标签内部的子元素代码文件4、html5中获取元素的方法一任务描述相关知识css选择器querySelector的用法代码文件5、html5中获取元素的方法二任务描述相关知识querySelectorAll的用法代码文件6、节点树上的操作任务描述相关_javascript学习手册十三:html dom——文档元素的操作(一)

《LeetCode刷题》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量-程序员宅基地

文章浏览阅读132次。《LeetCode学习》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量

php 公众号消息提醒,如何开启公众号消息提醒功能-程序员宅基地

文章浏览阅读426次。请注意,本文将要给大家分享的并不是开启公众号的安全操作风险提醒,而是当公众号粉丝给公众号发消息的时候,公众号的管理员和运营者如何能在手机上立即收到消息通知,以及在手机上回复粉丝消息。第一步:授权1、在微信中点击右上角+,然后选择“添加朋友”,然后选择“公众号”,然后输入“微小助”并关注该公众号。2、进入微小助公众号,然后点击底部菜单【新增授权】,如下图所示:3、然后会打开一个温馨提示页面。请一定要..._php微信公众号服务提示

推荐文章

热门文章

相关标签