精华内容
下载资源
问答
  • 关于多功能单元流水线的延迟(latency)与启动间隔(Initiation interval)前言因为前段时间在写Intel Intrinsics, 看到latency和Throughput(CPI)一直不太理解。直到今天刚好看到了《计算机体系结构——量化研究...

    关于多功能单元流水线的延迟(latency)与启动间隔(Initiation interval)

    前言

    因为前段时间在写Intel Intrinsics, 看到latency和Throughput(CPI)一直不太理解。直到今天刚好看到了《计算机体系结构——量化研究方法》中关于MIPS中多功能单元(长延迟)流水线的介绍,才发现两者好像有一定的关系。因此本篇博客主要是我对MIPS中多功能单元(长延迟)流水线中的latency和Initiation interval的理解,以及简单谈一谈它们与指令latency、Throughput的关系。

    正文

    《计算机体系结构——量化研究方法》中的MIPS多功能单元流水线。

    69f899f656b276ace1637ba5708d43a6.png

    如上图是含有多个执行单元的多级流水线图。其中每个执行单元内部也拥有多级的流水线。刚好最近我在看Intel的微体系结构,按我的理解,这个执行单元实际上就是对应于Intel 微体系结构中 Back End 各个端口(Port)中的执行单元。

    af9b67d1873ce6f7c91d52907b9ccb93.png

    因为每个执行单元完成执行任务所需的时钟周期不同,例如浮点运算的时间与整形运算的时间就有一定的差距,因此执行单元中的流水线分级是不同的。

    下图是各功能执行单元中的具体流水线分级,以及各功能执行单元的latency和Initiation interval:

    6ac80db68d85bce802a19c9dc05607ee.png

    318f1c9270ca45d422f011ab4bd34073.png

    从书上可以得知,功能单元的latency等于执行流水线深度减去1个时钟周期,也就是比如说浮点加法单元中有四级流水线,因此它的latency为4-1=3。而功能单元的Initiation interval与功能单元流水线中最耗时的阶段有关,且与有多少个功能单元有关。像图中的浮点加法单元使用了4级流水线,每个阶段需要花费1个时钟周期,所以每个时钟周期都可以发射一条浮点加法指令,两者间不会发生结构冒险。而像浮点除法单元,内部没有使用流水线,所以后一条浮点除法指令必须等到前一条浮点除法指令完全执行完,退出浮点出发单元,才可以开始执行,Initiation interval就是25个时钟周期。

    这里我再重新引用书上对于latency和Initiation interval的描述。

    • 延迟(latency):生成结果的指令与使用结果的指令之间的周期数。(在没有发生RAW冒险的情况下)。关于latency我的理解是,该指令执行之后,需要等待多久该指令才能产生可以使用的结果,被其他指令所使用。举个例子,浮点加法单元的latency为3,意味着如果有一条浮点加法指令,那么在不发生RAW的情况下,最快也要在3个时钟周期后,其他指令才能使用刚才这条浮点加法指令的运算结果。
    • 启动间隔(Initiation interval):在发出两个给定类型的操作之间必须间隔的周期数。关于Initiation interval我的理解是:它有点像Throughput吞吐量,也就是在发射了一条这样的指令后,需要多少个时钟周期才能够再次发射一条这样的指令。

    关于这两个名词,我联想到最近正在使用的Intel Intrinsics文档中提到的avx2向量指令的两个属性latency和Throughput(CPI):

    48b080ceb592df8517385300e945a165.png

    其中指令的latency可以对应到功能单元的latency,也就是完成一条指令所需要的时钟周期。而指令的Throughput(CPI)意思是发送一条指令所需要的时钟周期数,0.5意味着一个时钟周期可以发射两条这样的指令,这与功能单元的Initiation interval定义是可以对应上的。因此按照我的理解,指令的latency、Throughput和功能单元的latency、Initiation interval的含义应该是相似的。当然因为我还是初学者,这个东西也没有经过验证,所以我的理解可能是错误的。

    长延迟流水线可能会导致结构冒险和写后写(WAW)冒险。WAW冒险产生的原因如下:浮点运算指令的latency较长,因此可能会出现后面整形运算指令比前面的浮点运算指令先完成的情况,从而导致后面的写操作被前面的写操作所覆盖,违背了代码的原意。这两种冒险在原来标准的5级流水线中是不可能出现的。因此需要使用特殊的技术来检测这些冒险。

    总结

    总的来说,指令的latency与Throughput,与对应功能单元的流水线组成是密切相关的。从本文也可以看出,在对程序进行调优时(尤其是使用Intel Intrinsics写avx向量化指令时),就特别需要注意指令流水的问题。如果将相同运算类型的指令排在一起执行,其实是有利于充分发挥功能单元中的流水的,从而提高功能单元的执行效率的。而如果指令的Throughput较大时(比如上面正文所提到的浮点除法指令),两条这种类型的指令之间就必须填充足够多的指令,来掩盖这种指令较大的Throughput,而不是让流水线阻塞在这两条指令之间的等待。当然,填充这部分的工作,现在编译器的指令重排可能就已经实现了。如果指令的Throughput较小,(例如0.5),则应该将两条这种类型的指令放在一起,使得在一个时钟周期内可以同时将他们发射出去执行,提高利用率。

    展开全文
  • Reference:《Java定时器...让Tomcat在WEB程序启动的时候启动一个线程池和一个Timer线程,Timer线程每隔一段时间跑一次(比如检查到期的用户,类似轮询查看),然后触发另一个后台线程(甩给线程池去处理,比如处理到期

    Reference:《Java定时器timer.schedule在Web中间隔执行任务和定时》《【Java】Timer和TimerTask详解

     

    做了一个Demo,完成如下的功能:

    让Tomcat在WEB程序启动的时候启动一个线程池和一个Timer线程,Timer线程每隔一段时间跑一次(比如检查到期的用户,类似轮询查看),然后触发另一个后台线程(甩给线程池去处理,比如处理到期的用户,发送等)。

    直接用代码说话

    StarupListener.java

    package Listeners;
    
    import java.util.Timer;
    
    import java.util.concurrent.Executors;
    
    import javax.servlet.ServletContextEvent;
    
    import javax.servlet.ServletContextListener;
    
    import BackStage.MyTimerTask;
    
    import Support.PoolManager;
    
    public class StartupListener implements ServletContextListener {
    
    	@Override
    
    	public void contextDestroyed(ServletContextEvent sce) {
    
    		sce.getServletContext().log("定时器销毁");
    
    	}
    
    	@Override
    
    	public void contextInitialized(ServletContextEvent sce) {
    
    		sce.getServletContext().log("启动线程池");
    
    		// Start a thread pool to deal with different task;
    
    		PoolManager.pool = Executors.newFixedThreadPool(10);
    
    		sce.getServletContext().log("启动定时器");
    
    		//Create a Daemon timer thread
    
    		Timer timer=new Timer(true);
    
    		// 每隔10秒钟执行任务
    
    		timer.schedule(new MyTimerTask(sce.getServletContext()), 0,10 * 1000); 
    
    		sce.getServletContext().log("已经添加任务调度表");
    
    	}
    
    }

    MyTimeTask.java

    package BackStage;
    
    import java.util.TimerTask;
    
    import javax.servlet.ServletContext;
    
    import Support.PoolManager;
    
    public class MyTimerTask extends TimerTask {
    
    	private ServletContext context = null;
    
               private int  param;
    
    	public MyTimerTask(ServletContext context) {
    
    		this.context = context;
    
    	}
    
    	@Override
    
    	public void run() {
    
    		context.log("开始执行指定定時任务");
    
    		// TODO 自定义
    
    		System.err.println("号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务");
    
    		//让线程池去跑一个任务
    
    		PoolManager.pool.execute(new WorkThread(param++));
    
    		context.log("指定定時任务执行结束");
    
    	}
    
    }
    
    
    

    PoolManager.java

    package Support;
    
    import java.util.concurrent.ExecutorService;
    
    public class PoolManager {
    
    	public static ExecutorService pool;
    
    }
    
    
    

    WorkThread.java

    package BackStage;
    
    public class WorkThread implements Runnable {
    
    	private int param;
    
    	public WorkThread(int param) {
    
    		this.param = param;
    
    	}
    
    	@Override
    
    	public void run() {
    
    		// TODO Do something
    
    		System.err.println("我被线程池调用执行啦~!参数:" + param);
    
    	}
    
    }
    
    
    

    web.xml片段

    <listener>
    
    	<listener-class>Listeners.StartupListener</listener-class>
    
    </listener>

     

    输出结果:(我就喜欢用System.err输出红色的!多喜庆╮(╯▽╰)╭)

    信息: 开始执行指定定時任务 
    号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务 
    2011-3-31 18:26:46 org.apache.catalina.core.ApplicationContext log 
    信息: 指定定時任务执行结束 
    我被线程池调用执行啦~!参数:1 
    2011-3-31 18:26:56 org.apache.catalina.core.ApplicationContext log 
    信息: 开始执行指定定時任务 
    号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务 
    我被线程池调用执行啦~!参数:2 
    2011-3-31 18:26:56 org.apache.catalina.core.ApplicationContext log 
    信息: 指定定時任务执行结束 
    2011-3-31 18:27:06 org.apache.catalina.core.ApplicationContext log 
    信息: 开始执行指定定時任务 
    号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务 
    2011-3-31 18:27:06 org.apache.catalina.core.ApplicationContext log 
    信息: 指定定時任务执行结束 
    我被线程池调用执行啦~!参数:3

    展开全文
  • 启动间隔(Initiation interval):在发出两个给定类型的操作之间必须间隔的周期数。关于Initiation interval我的理解是:它有点像Throughput吞吐量,也就是在发射了一条这样的指令后,需要多少个时钟周期才能够...

    前言

    因为前段时间在写Intel Intrinsics, 看到latency和Throughput(CPI)一直不太理解。直到今天刚好看到了《计算机体系结构——量化研究方法》中关于MIPS中多功能单元(长延迟)流水线的介绍,才发现两者好像有一定的关系。因此本篇博客主要是我对MIPS中多功能单元(长延迟)流水线中的latency和Initiation interval的理解,以及简单谈一谈它们与指令latency、Throughput的关系。

    正文

    《计算机体系结构——量化研究方法》中的MIPS多功能单元流水线。

    在这里插入图片描述

    如上图是含有多个执行单元的多级流水线图。其中每个执行单元内部也拥有多级的流水线。刚好最近我在看Intel的微体系结构,按我的理解,这个执行单元实际上就是对应于Intel 微体系结构中 Back End 各个端口(Port)中的执行单元。

    在这里插入图片描述

    因为每个执行单元完成执行任务所需的时钟周期不同,例如浮点运算的时间与整形运算的时间就有一定的差距,因此执行单元中的流水线分级是不同的。

    下图是各功能执行单元中的具体流水线分级,以及各功能执行单元的latency和Initiation interval:

    在这里插入图片描述

    在这里插入图片描述

    从书上可以得知,功能单元的latency等于执行流水线深度减去1个时钟周期,也就是比如说浮点加法单元中有四级流水线,因此它的latency为4-1=3。而功能单元的Initiation interval与功能单元流水线中最耗时的阶段有关,且与有多少个功能单元有关。像图中的浮点加法单元使用了4级流水线,每个阶段需要花费1个时钟周期,所以每个时钟周期都可以发射一条浮点加法指令,两者间不会发生结构冒险。而像浮点除法单元,内部没有使用流水线,所以后一条浮点除法指令必须等到前一条浮点除法指令完全执行完,退出浮点出发单元,才可以开始执行,Initiation interval就是25个时钟周期。

    这里我再重新引用书上对于latency和Initiation interval的描述。

    • 延迟(latency):生成结果的指令与使用结果的指令之间的周期数。(在没有发生RAW冒险的情况下)。关于latency我的理解是,该指令执行之后,需要等待多久该指令才能产生可以使用的结果,被其他指令所使用。举个例子,浮点加法单元的latency为3,意味着如果有一条浮点加法指令,那么在不发生RAW的情况下,最快也要在3个时钟周期后,其他指令才能使用刚才这条浮点加法指令的运算结果。
    • 启动间隔(Initiation interval):在发出两个给定类型的操作之间必须间隔的周期数。关于Initiation interval我的理解是:它有点像Throughput吞吐量,也就是在发射了一条这样的指令后,需要多少个时钟周期才能够再次发射一条这样的指令。

    关于这两个名词,我联想到最近正在使用的Intel Intrinsics文档中提到的avx2向量指令的两个属性latency和Throughput(CPI):

    在这里插入图片描述

    其中指令的latency可以对应到功能单元的latency,也就是完成一条指令所需要的时钟周期。而指令的Throughput(CPI)意思是发送一条指令所需要的时钟周期数,0.5意味着一个时钟周期可以发射两条这样的指令,这与功能单元的Initiation interval定义是可以对应上的。因此按照我的理解,指令的latency、Throughput和功能单元的latency、Initiation interval的含义应该是相似的。当然因为我还是初学者,这个东西也没有经过验证,所以我的理解可能是错误的。

    长延迟流水线可能会导致结构冒险和写后写(WAW)冒险。WAW冒险产生的原因如下:浮点运算指令的latency较长,因此可能会出现后面整形运算指令比前面的浮点运算指令先完成的情况,从而导致后面的写操作被前面的写操作所覆盖,违背了代码的原意。这两种冒险在原来标准的5级流水线中是不可能出现的。因此需要使用特殊的技术来检测这些冒险。

    总结

    总的来说,指令的latency与Throughput,与对应功能单元的流水线组成是密切相关的。从本文也可以看出,在对程序进行调优时(尤其是使用Intel Intrinsics写avx向量化指令时),就特别需要注意指令流水的问题。如果将相同运算类型的指令排在一起执行,其实是有利于充分发挥功能单元中的流水的,从而提高功能单元的执行效率的。而如果指令的Throughput较大时(比如上面正文所提到的浮点除法指令),两条这种类型的指令之间就必须填充足够多的指令,来掩盖这种指令较大的Throughput,而不是让流水线阻塞在这两条指令之间的等待。当然,填充这部分的工作,现在编译器的指令重排可能就已经实现了。如果指令的Throughput较小,(例如0.5),则应该将两条这种类型的指令放在一起,使得在一个时钟周期内可以同时将他们发射出去执行,提高利用率。

    展开全文
  • 最近发现客户端启动后不做任何操作,程序CPU占比已经达到20%以上,经过排查发现又如下代码导致: QTimer* pTimer = new QTimer();...定时器启动时不设置间隔时间,执行定时任务会耗费大量的CPU使用率,设置时间...

    最近发现客户端启动后不做任何操作,程序CPU占比已经达到20%以上,经过排查发现又如下代码导致:

    QTimer* pTimer = new QTimer();

    connect(pTimer,SIGNAL(timeout()), this, SLOT(OnTimeout));

    pTimter->start();

    定时器启动时不设置间隔时间,执行定时任务会耗费大量的CPU使用率,设置时间间隔后,cpu使用率在1%左右,此处定时器使用需格外注意

    展开全文
  • 在系统盘中找到如下位置C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp,并将需要自启动的可执行程序以快捷方式的形式放入该文件夹中。 计划任务方式 1. 点击抄Win7的 开始图标(左下角的Windows...
  • Timer类第一次启动时间的间隔

    千次阅读 2015-06-04 21:36:05
    参数3,这个参数特别有意思,它是一个时间 段,是指第一次被启动后,间隔多少时间后触发回调函数。这个参数可以用来设置随程序启动后,需要一定的时间后,才启动的进程。 参数4,这个是计时器,是指回调过程
  • @echo off rem 定义循环间隔时间和监测的服务: set secs=60 set srvname="nginx" ...echo == 如发现其停止,则立即启动。 == echo ======================================== echo. echo 此脚本监测的服
  • 2、新建一个定时器,我这里演示同时打开多个程序(比如同时启动多个QQ,或者多个微信等),那就把单次数量提高,如果想每次执行这个定时器里面的3个事件,那单次数量就是写3,我就演示1个,所以这里写1 3、新建好...
  • 解决ionic3下app启动后,出现一段时间白屏的情况,在config.xml中找到如下配置,将value设置的足够长,以便app启动的时候进行必要的数据加载,基本上就能解决问题了。 注意:app.component.ts文件中的platform....
  • 讲述使用Timer组件,根据自定义的时间间隔启动某一应用;主要应用场景在于当一个软件仅有固定节点数可用,可使用该软件思路实现节点的判断和抢占式使用
  • 好记性不如赖笔头…………@echo off echo 准备关闭kugou软件。。。 taskkill /f /im KuGou.... start "" "C:\Program Files (x86)\KuGou\KGMusic\KuGou.exe"echo 启动软件成功echo 等待5秒后再次启动 CHOICE /T 5 /C y
  • 距离上次,间隔1个月,深度再次更新系统,修复了一大批问题,优化了桌面的启动速度。由于深度操作系统是基于Linux开发的,可能很多朋友不是很了解。在大部分人心中,认为linux只有专业人士“玩得动”。其实不然,...
  • 客户要求是这样的:后台控制给用户发随机红包,当检测到有红包,无论用户在浏览哪个页面在做什么,马上弹出红包界面。来分析实现思路:首先,需要实现心跳请求,得借助小程序的定时器的setInterval,官网地址:...
  • 因为客户和环境需要,...内网服务器上的socket常连接通过控制台应用程序能保持常连接,但是通过windows服务启动常连接会每间隔2分钟断开一次。我已经使用心跳包保持连接活跃了,是否windows服务有什么机制会断开连接?
  • protected void Application_Start(object sender, EventArgs e)  {  //定义定时器  System.Timers.Timer myTimer = new System.Timers.Timer(2000);  myTimer.Elapsed +...
  • BAT(Batch file)批处理是个好东西,... 需要在Windows下启动多个Tomcat服务,且需要第一个服务成功启动后才能启动第二个、第三个服务。 解决方法: 第一个服务判断是否启动成功,需要读取Tomcat的Starup.ba...
  • macOS重新连接 一个简单的启动脚本,强制您的mac自动重新连接到首选网络。 细节 我已经将Mac Mini用作plex服务器已有一段时间了,但是我注意到了...自定义启动间隔 在<key>StartInterval下的plist文件中,您可以将600更
  • Timer设置时间间隔

    2020-08-31 20:35:13
    启动该控件,则每个时间间隔引发一次Tick事件,开发人员可以在Tick事件中添加要执行操作的代码。 Timer控件的Interval属性用于设置计时器开始计时的时间间隔,其语法格式: public int Interval{ get;set } ...
  • 启动事件

    2018-03-26 15:58:38
    启动事件 每个流程总是以启动事件作为入口,启动事件分为以下三中类型: ...一次性启动,在特定的时间间隔启动。 异常启动事件: 异常启动事件可以触发一个异常子流程,但是不能通过API方式启...
  • jQuery 设置点击间隔

    2018-10-30 10:21:21
    var time = 0; $('button').click(function() { //判断计时器是否处于关闭状态 ... //设定间隔时间(秒) //启动计时器,倒计时time秒后自动关闭计时器。 var index = setInterval(function(){ ...
  • Linux系统进程间隔定时器Itimer

    千次阅读 2015-07-22 22:53:36
    所谓“间隔定时器(Interval Timer,简称itimer)就是指定时器采用“间隔”值(interval)来作为计时方式,当定时器启动后,间隔值interval将不断减小。当interval值减到0时,我们就说该间隔定时器到期。与上一节所...
  • Java程序中 通过定时任务,设置访问Hbase的时间间隔,设置告警规则,比如三次获取Hbase中的数据失败,则调用存过,遍历配置的告警号码,插入短信中间表,实现短信的发送。 项目结构如下 启动脚本分析根据服务器上...
  • LINUX进程间隔定时器itimer

    千次阅读 2009-05-11 11:07:00
    转自:http://hi.baidu.com/wzbob/blog/item/dec68f8255391690f703a66f.html系统时钟硬件与LINUX时间表示 之 进程间隔定时器itimer7 、进程间隔定时器itimer 所谓“间隔定时器(IntervalTimer,简称itimer)就是指...
  • 配置组策略刷新间隔

    2017-11-21 12:39:00
    配置组策略刷新间隔 默认情况下,域中的计算机会在后台每隔 90 分钟更新一次计算机策略和用户策略,并将时间作 0 到 30 分钟的随机调整。除了后台更新之外,在系统启动时总会更新计算机的组策略。 6.5.1示例:配置...
  • 定时任务间隔时间

    2019-10-02 02:39:21
    -- 查询定时任务 select * from user_jobs; -- 停止JOBbegin dbms_job.broken(jobno,true);end;begin dbms_job.remove.../-- 启动JOBbegin dbms_job.run(jobno);end;-- 修改JOB运行内容begin dbms_job.what(j...
  • 通过发出MPC[6:0] [DQS Osc]命令来启动DQS间隔振荡器,该命令将启动内部环形振荡器,该内部环形振荡器对信号传播到振荡器的时间进行计算。 通过发出MPC[6:0] [stop DQS Osc]命令来停止DQS间隔振荡器,或者

空空如也

空空如也

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

启动间隔