0931
都是CPU的外围设备,这个时候,CPU会通过访问它的外围设备,完全相同的方法来通知加速器,你要做一件事情,或者是做长整,或者是做搬运,或者是做sobel。
除了通知它做这件事情以外,还有哪些信息CPU必须及时地通知?
数据在哪?
原始数据的起始地址。
当然这些数据,显存嘛,也是放在memory里面,放在存储器里面。
那么,CPU必须告诉加速器,数据在哪?
原始数据的基地址在哪?
0932
同时还要告诉加速器,目标的基地址在哪?
目标的首地址在哪?
这个信息要告诉。
这些信息,主处理器又是如何来通知加速器的呢?
同样刚才说了,这个时候的加速器,它的地位跟CPU的任何一个外围设备的地位完全相等。
就是被CPU访问。
这个时候CPU是老大,CPU是Master,是主机。
而被接受控制的,是从机,完全相等。
这个时候的加速器,它跟所有CPU的外围设备完全相等。
它是一个从机,接受CPU的访问。
接受CPU唯一地址的访问。
那么有起始地址,源的起始地址和目标的起始地址。
0933
并且呢,会给出一些特定的计算信息,比方说,字宽,字的宽度是多少?
16位的,还是32位的、48位的?
还有其它的一些辅助的信息。
CPU要通知加速器。
一旦加速器获得了完整的信息以后,主处理器还必须给它发一个特定的命令。
什么命令?
就是开始吧,start。
这个命令怎么发出去呢?
这个命令一般处理的形式,是在加速器里面会有一个状态寄存器。
状态寄存器有一个标志的起始位。
这个起始位也是被主处理器访问的。
主处理器可以写它。
启动吧,start。
向start的标志位写上一个帧的一个信号。
于是加速器就获得了CPU的授权了。
0934
CPU的什么授权呢?
就是让它来访问memory。
这个memory我们以后会介绍,现在主要的是SDRAM。
访问存储器里面的这些信息。
这些信息,或者是显存,或者是浮点,或者是图像的边缘检测。
主处理器转而会停下来。
在我们现在的这个架构里面,在绿皮书的教材里面,CPU一旦委托加速器来执行对应的任务以后呢,加速器就空闲了,就真正地空闲了。
稍后我们会解释。
不会,CPU还有其它的事要干。
就好像我们现在刚刚解释的,如果我们现在要玩一段比较强大的游戏,比如像魔兽之类的。
可能这个时候,普通的显卡就不能支持,玩的时候就很卡。
因为它是用CPU算出来的。
0935
用加速器,用一个好的显卡来做的时候呢,它是用命令的形式,CPU很轻松啊。
要图像搬运的时候,它用不着自己做,它只要发出一个命令,告诉这个图像加速器,数据在哪?
目标在哪?
然后启动它。
发出start。
CPU就是发出一个命令即可,当然CPU就轻松了。
接着CPU就可以干其它的事情。
所以说这个时候图像就很流畅。
就不至于很卡。
CPU的开销就很轻松了。
问题是加速器,一旦获得了授权之后,加速器将会全力以赴地以硬件的方式,来处理显存,memory里面的数据,主处理器CPU原本是控制memory的。
对memory而言,原本它的Master,它的主人是CPU。
0936
现在这个memory要被加速器所控制,因为加速器要读里面的数据,写里面的数据。
Memory只有一个它,它听哪个的呢?
主处理器要命令它,是它的主人。
当加速器未获得授权的时候,加速器也是一个仆人,这个时候是一主多仆。
所有的设备都是仆人,都是slave,都是接受Master的指挥的。
可是一旦加速器获得了授权以后,加速器当然就要对memory进行读写了。
这个时候,memory可能就会有一仆二主了。
一仆多主了。
这个时候,对加速器系统,就有一种特定的应用了,就是这个时候如何来解决一仆二主、一仆多主的这种架构。
0937
这个时候,就有一个资源的裁决问题。
一旦加速器获得授权,加速器就必须获得对资源的控制权,控制权就必须转交给加速器,早先的架构里面完全是由CPU定的。
是由老大,由master,也就是唯一的CPU来敲定的,由CPU说了算,CPU说,我把资源给你,CPU就停下来,或者说CPU去访问其它的资源。
把这一部分硬件资源交给加速器。
加速器就全力以赴地运行。
而现代的架构,会考虑到一些问题,如果有CPU来决定,CPU我们知道还多核了,究竟由哪个核来决定呢?
是不是单独还要有一个主的处理器?
0938
都会带来一些处理上的困难。
而现代的处理方法是,既不由加速器来定,也不由CPU来定,由一个第三方的裁决机构,称之为仲裁器的,由仲裁器根据仲裁策略来决定当前的资源给谁。
在我们绿皮书这个教材里面,我们采用了一个简单的仲裁策略,就是唯一申请者获得仲裁。
申请者有谁呢?
申请资源的,有CPU,有加速器。
唯一的申请者,只有一个申请者的时候,判决给它。
有多个申请者的时候,停下来,谁也不给,维持原来的判决。
用这样一种简单的仲裁策略。
根据这个仲裁策略,加速器获得仲裁,得到资源,于是加速器就可以全力以赴地来执行搬运、长整或者是图像边缘检测。
0939
这个是由硬件逻辑来做。
我们看到了,我们做到210帧,很快做完了。
做完了怎么办?
做完了,加速器如何来通知CPU,我完成了这件事呢?
因为CPU如果做图像搬运,是动画,它把这个角色搬完了,CPU显然会让它搬下一个角色。
做下一段动画。
加速器搬完了以后,加速器会如何来通知CPU,我做完了这件事呢?
两种方式,第一种方式,加速器它本身有一个状态寄存器,状态寄存器在我们这张PPT上,主处理器会通过特定的通道来访问加速器的状态寄存器。
通过查询的方式,加速器来访问状态寄存器。
0940
它是否完成了指定的交付的任务,这是一种方式。
当然大家知道,查询的方式比较慢,现代更多的用的是中断。
中断的方式来得更快一点。
当加速器完成了指定的任务的时候,加速器单独地给主处理器发一个中断,主处理器接到这个中断信号以后,就知道加速器已经完成了指定的任务。
于是加速器和CPU之间再一次交换资源,资源的仲裁。
这个时候CPU要重新接管资源。
加速器要释放资源。
或者仲裁要把资源判给CPU。
当资源重新判给CPU以后,这个时候CPU才可以接着做下一件事。
搬完了第一个角色,你让它搬第二个角色。
