CPU与显卡简述显卡的工作原理理

> GPU是什么 GPU的工作原理与
GPU是什么 GPU的工作原理与作用
&  GPU是什么?GPU的工作原理是什么?GPU有什么作用?
  什么是GPU
  GPU是显示卡的心脏&,也就相当于CPU在电脑中的作用,它决定了该显卡的档次和大部分性能。过去有2D和3D之分,现在通俗指3D显示芯片。
  GPU的工作原理
  简单说GPU就是能够从硬件上支持T&L(Transform and
Lighting,多边形转换与光源处理)的显示芯片,因为T&L是3D渲染中的一个重要部分,其作用是计算多边形的3D位置和处理动态光线效 果,也可以称为&几何处理&,提供细致的3D物体和高级的光线特效;只不过大多数PC中,T&L的大部分运算是交由CPU处理的(这就也就是所谓 的软件T&L),由于CPU的任务繁多,除了T&L之外,还要做内存管理、输入响应等非3D图形处理工作,因此在实际运算的时候性能会大 打折扣,常常出现显卡等待CPU数据的情况,其运算速度远跟不上今天复杂三维游戏的要求。但,新一代支持DX10或以上的显卡,在系统为windows
vista或以上的环境中,可以把T&L的所有工作交给GPU完成,大大提高显卡运行的效率。也使得显卡对CPU的依赖最大化的减少。
  GPU的主要作用
  GPU是显示卡的&大脑&,它决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。2D显示芯片在处理3D图像和特效时主要依赖CPU的处理能力,称为&软加速&。3D显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的&硬件加速&功能。显示芯片通常是显示卡上最大的芯片(也是引脚最多的)。现在市场上的显卡大多采用NVIDIA和
AMD-ATI两家公司的图形处理芯片。
  GPU主流供应商
  intel:intel不但是世界上最大的CPU生产销售商,也是世界最大的GPU生产销售商。
intel的GPU在现在完全是集成显卡,用于intel的主板和intel的笔记本。要是只按发售数量计算,intel随着他主板发售的集成GPU占据了整个GPU市场的60%以上。
  nVidia:现在最大的独立显卡生产销售商,旗下有民用的Geforce系列,还有专业的Quadro系列。其GPU具有cuda通用运算,
PureVideo高清视频技术,PhysX物理加速,Optimus智能显卡切换等。
  AMD(ATI):世界上第二大的独立显卡生产销售商,他的前身就是ATI。旗下有民用的Radeon系列,还有专业的FireGL系列等。就发售量和发售盈利方面,AMD显卡方面仍然略输于nv,不过两者不相伯仲,差距只是几个百分点。其GPU具有Stream通用运算,ATI
Video Converter视频转码,UVD高清视频技术,Havok、Bullet和Pixelux DMM三种物理引擎等。GPU工作原理简介_中华文本库
第1页/共8页
GPU工作原理简介
计算机0601 沈凯杰
在GPU出现以前,显卡和CPU的关系有点像“主仆”,简单地说这时的显卡就是画笔,根据各种有CPU发出的指令和数据进行着色,材质的填充、渲染、输出等。
较早的娱乐用的3D显卡又称“3D加速卡”,由于大部分坐标处理的工作及光影特效需要由CPU亲自处理,占用了CPU太多的运算时间,从而造成整体画面不能非常流畅地表现出来。
例如,渲染一个复杂的三维场景,需要在一秒内处理几千万个三角形顶点和光栅化几十亿的像素。早期的3D游戏,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由CPU单独完成。图形渲染适合并行处理,擅长于执行串行工作的CPU实际上难以胜任这项任务。所以,那时在PC上实时生成的三维图像都很粗糙。不过在某种意义上,当时的图形绘制倒是完全可编程的,只是由CPU来担纲此项重任,速度上实在是达不到要求。
随着时间的推移,CPU进行各种光影运算的速度变得越来越无法满足游戏开发商的要求,更多多边形以及特效的应用榨干了几乎所有的CPU性能,矛盾产生了······
第一章.GPU的诞生
3.1 GPU中数据的处理流程
3.2 CPU与GPU的数据处理关系
3.3 传统GPU指令的执行
3.4 GPU的多线程及并行计算
3.4.1 多线程机制
3.4.2 并行计算
第二章.GPU的结构
第三章.GPU的工作原理
第四章.GPU未来的展望
4.1 GPU能否包办一切
4.2 GPU时代即将到来
第一章.GPU的诞生
NVIDIA公司在日发布GeForce 256图形处理芯片时首先提出GPU的概念。
GPU之所以被称为图形处理器,最主要的原因是因为它可以进行几乎全部与计算机图形有关的数据运算,而这些在过去是CPU的专利。
目前,计算机图形学正处于前所未有的发展时期。近年来,GPU技术以令人惊异的速度在发展。渲染速率每6个月就翻一番。性能自99年,5年来翻番了10次,也就是(2的10次方比2)提高了上千倍!与此同时,不仅性能得到了提高,计算质量和图形编程的灵活性也逐渐得以改善。
以前,PC和计算机工作站只有图形加速器,没有图形处理器(GPU),而图形加速器只能简单的加速图形渲染。而GPU取代了图形加速器之后,我们就应该摒弃图形加速器的旧观念。
第二章.GPU的结构
第1页/共8页
寻找更多 ""集成显卡的工作原理?_百度知道
集成显卡的工作原理?
拿现在比较火的880G类主板来说,1.集成显示芯片是显示芯片处理图像,也就是说处理图像时只占内存不费CPU吗?2.双核缉订光寡叱干癸吮含经心显卡是有两个显示芯片的显卡,集成双核显卡的主板从理论上是可行的,如果不可行,原因在哪?(考虑成本和性能问题)3.如果是主板上集成两个显示芯片交火的效率高还是做成双核显卡的效率高?PS:本人完全外行。
提问者采纳
先给你说下显卡的构成,显卡由GPU(看清楚不是CPU)和显存为缉订光寡叱干癸吮含经基本构成,集成显卡就是把这些东西集成到了主板上。一般的集成显卡没有集成显存,A家的有一部分是集成显存的。GPU在一个叫做“桥”的芯片组内集成,听过“北桥”“南桥”之类的名称没,他们就承担了GPU的工作。没显存的靠从内存分显存来完成工作。工作原理与主板和CPU+内存的工作模式一样说白了,就是集成把显卡的工作交给CPU,就像是老板分给员工的活儿,现在没员工,老板干了。独立的是用自己的GPU
提问者评价
没人答,分就给你吧,哎。。。
其他类似问题
为您推荐:
您可能关注的推广回答者:
集成显卡的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁首先我最关心CPU和显卡交互部分,显卡内部原理并不是很在乎。&br&&br&一、我大概知道早期DOS时代的VGA卡的原理:首先系统将高端的128K物理地址映射到VGA卡,然后CPU就可以直接操作VGA卡的显存了。同时VGA卡根据显存的内容以一定的频率刷新显示器。(如果有理解错误的地方也请指正,谢谢!)&br&&br&二、我对当代的PCI显卡了解如下:在现在经典的南北桥+各种PCI总线架构下,首先系统将一部分物理地址空间(大概256M)映射到显存,然后就不知道了,而且这仅有的一点理解也不一定准确。&br&&br&三、问题来了(主要针对当代经典的显卡):&br&1.请看下图的三个范围,我算了下分别是256M, 128K,256B,它们都是什么?&br&我的猜测是映射到物理地址的部分显存,控制寄存器和端口。&br&2.CPU是如何访问显存的(拿写为例子),是通过物理地址直接访问(如果上面256M是映射的显存的话);还是通过控制寄存器间接访问,即先把要写的数据放到寄存器,再发出命令让显卡取走,最后显卡把来自寄存器的数据写入显存。&br&3.很多人说显存的地址和内存的地址是统一编址的,那么CPU就可以直接访问显存,而不是通过控制器接口间接访问。我认为这是不对的,原因如下:我的显卡是1G的,但是下图显示只有256M地址空间分配给了显卡。&br&4.我的显卡是1G的为什么只分配了256M的地址空间给它?&br&5.要了解这方面的知识要看什么书或哪方面知识,求推荐。。。&img data-rawheight=&430& data-rawwidth=&414& src=&/0f5f86efda43ab37ac780a387cbf167a_b.jpg& class=&content_image& width=&414&&
首先我最关心CPU和显卡交互部分,显卡内部原理并不是很在乎。一、我大概知道早期DOS时代的VGA卡的原理:首先系统将高端的128K物理地址映射到VGA卡,然后CPU就可以直接操作VGA卡的显存了。同时VGA卡根据显存的内容以一定的频率刷新显示器。(如果有理解错误的地方也请指正,谢谢!)二、我对当代的PCI显卡了解如下:在现在经典的南北桥+各种PCI总线架构下,首先系统将一部分物理地址空间(大概256M)映射到显存,然后就不知道了,而且这仅有的一点理解也不一定准确。三、问题来了(主要针对当代经典的显卡):1.请看下图的三个范围,我算了下分别是256M, 128K,256B,它们都是什么?我的猜测是映射到物理地址的部分显存,控制寄存器和端口。2.CPU是如何访问显存的(拿写为例子),是通过物理地址直接访问(如果上面256M是映射的显存的话);还是通过控制寄存器间接访问,即先把要写的数据放到寄存器,再发出命令让显卡取走,最后显卡把来自寄存器的数据写入显存。3.很多人说显存的地址和内存的地址是统一编址的,那么CPU就可以直接访问显存,而不是通过控制器接口间接访问。我认为这是不对的,原因如下:我的显卡是1G的,但是下图显示只有256M地址空间分配给了显卡。4.我的显卡是1G的为什么只分配了256M的地址空间给它?5.要了解这方面的知识要看什么书或哪方面知识,求推荐。。。…
3.很多人说显存的地址和内存的地址是统一编址的,那么CPU就可以直接访问显存,而不是通过控制器接口间接访问。我认为这是不对的,原因如下:我的显卡是1G的,但是下图显示只有256M地址空间分配给了显卡。显存的地址和物理内存的地址是统一编址的意思是,它们逻辑上是属于一个地址空间,就是说对CPU来说,只要往总线上提供一个“数”,就可以明确向总线表达它到底想访问的是哪个地址。假如不是统一编址的,那就必须再提供一个“名字空间的标记”同这个“数”一起确定一个唯一的地址,这样带来的是给写软件的人的复杂性,硬件发展的一个目标之一就是向软件开发者屏蔽一切值得屏蔽的东西。至于通不通过独立显卡的控制器接口间接访问,那当然是要通过。你CPU就算要访问普通的DDR物理内存,也不是“直接”访问啊,不也是要先把访问请求送给PCI桥芯片来“间接”访问的吗。毕竟不管是物理内存还是独立显卡的显存,都不是直接连在CPU的地址总线上的。所以肯定要通过其他控制器。要了解这方面的知识要看什么书或哪方面知识,求推荐。。。个人觉得看书的帮助有限,不知道你要研究它们的目的是什么?你开车时要求对引擎,变速箱的工作原理了解吗?你如果是处女座不能接受你不理解的东西,那么最高效获取这些知识的方法就是去做相关东西的公司去上班,很快就可以了解了。
&b&问题1:&/b&&br&&br&设备管理器属性里:&br&&br&&b&内存范围&/b&,表示的是MMIO(内存映射)的范围,这个范围是通过PCI配置寄存器读出来的,Windows里,在驱动里用HalGetBusData可以获得,用户态好像没有直接访问的方法。&br&&br&关于PCI寄存器的描述,详见:&a class=& wrap external& href=&///?target=http%3A//en.wikipedia.org/wiki/PCI_configuration_space& target=&_blank& rel=&nofollow noreferrer&&PCI configuration space&i class=&icon-external&&&/i&&/a&&br&&br&鉴于篇幅原因,只贴一个图:&br&&br&&img data-rawheight=&600& data-rawwidth=&650& src=&/332ae54dfb79dff2380c9c_b.jpg& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&/332ae54dfb79dff2380c9c_r.jpg&&&br&其中你能看到的属性里的那些描述,都是Base Address Registers里的东西。&br&&br&&b&I/O范围&/b&,表示的是I/O端口号,如果你熟悉汇编,你就知道汇编里有IN/OUT指令,这个I/O范围指的就是操作这个设备使用IN/OUT指令时的端口范围,这个范围跟内存就没什么关系了。有些I/O范围也写在PCI配置里,但是没有严格的规定。&br&&br&这段MMIO映射的内存大小代表什么意思呢?如果准确点说,我也不知道。&br&&br&因为显卡厂商一般不太愿意公开这方面的信息,从我看到的一些资料上看,各个厂商对MMIO映射的地址空间的描述也完全不同,没有任何规范可言。&br&&br&如果能拿到厂商的白皮书的话,也许还好办,但显卡厂商出于保密原因一般不给这方面的资料。&br&&br&一般来说,这里包含的内容有:&br&&br&1) 操作显卡的寄存器映射,用于发送控制命令,你的图里的那128K可能就是这个用途,这类地址一般都可以直接读写;&br&2) 映射显卡的一部分显存(注意不是全部),你的图里的那256M可能就是这个用途,这类地址读写的特性不确定。&br&&br&&b&问题2:&/b&&br&&br&Linux一般是向Frame Buffer(&a class=& wrap external& href=&///?target=http%3A//en.wikipedia.org/wiki/Framebuffer& target=&_blank& rel=&nofollow noreferrer&&Framebuffer&i class=&icon-external&&&/i&&/a&)里写数据,然后显卡会周期性的取走数据。&br&&br&写之前可能会通过I/O端口或者其它MMIO地址去操作显卡寄存器发送一部分控制命令,具体是什么就不清楚了,厂商一般都保密。&br&&br&Windows应该采取的是类似的动作,Frame Buffer就是你截图里的那256M的一部分。&br&&b&&br&问题3:&/b&&br&&br&你截图肯定不全,滚动条向下,你还能找到更多的MMIO内存地址范围,但一般情况下,不会把全部显存都映射过去。&br&&br&原因是显存可能很大,这么做太浪费地址空间,对于32位系统来说,地址空间实在有限。&br&&br&那么CPU是如何通过256M地址空间访问1G的显存的?原因是256M只是一个窗口,它可以把显存的某一段映射到内存中去,如果CPU要操作其它的位置,就发送控制命令改变映射的范围即可。&br&&br&这个技术有点类似于:&a href=&///?target=http%3A//en.wikipedia.org/wiki/Bank_switching& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bank switching&i class=&icon-external&&&/i&&/a&&br&&br&&b&问题4:&/b&&br&&br&MMIO映射空间小于实际显卡显存,有些时候是为了刷新更多帧的需要,以题主你自己的显卡为例,可以先映射1G空间里的第一个256M,把要显示的图像写进去,再映射第二个256M,把后面要显示的图像写进去……以此类推,这样就能操作完整的显存了,甚至这么做可以提前把未来要绘制的图像先写到显存里。&br&&br&不同的显卡每次能映射的最大显存数是不同的,可能是显卡本身DMA的限制,或者显卡本身处理能力有限,毕竟一次传输完一个完整显存大小的数据对于显卡来说负担还是太大了。&br&&br&&b&问题5:&/b&&br&&br&你可以去了解一下PCI驱动的开发,但这方面真的没有书可以推荐,因为显卡技术涉及到的保密内容太多,其中很多东西甚至没有专利,只有一些小厂商公开了一部分2D加速的技术资料,但具体如何操作寄存器,如何渲染图像,资料实在太难找。&br&&br&-----------------------------------&br&&br&&a data-title=&@Toe Z& data-editable=&true& class=&member_mention& href=&///people/66acde23d2f5c2780ac17aac& data-hash=&66acde23d2f5c2780ac17aac& data-tip=&p$b$66acde23d2f5c2780ac17aac&&@Toe Z&/a&
的一些解释我不是特别认同,说CPU不能直接访问显存这个问题,我觉得说法不太严谨。&br&&br&一般来说,Linux里都是用Frame Buffer驱动来向显卡写数据的,Frame Buffer最终是把数据送到显存里,这个过程是可以直接操作显存的,只不过这个“操作”的概念很模糊,因为有些是用DMA把数据传走的,如果说不能直接访问,也不对,至少DMA控制器是看见这部分显存了,只不过直接用CPU的指令MOV肯定会失败。&br&&br&通常情况下操作显卡的动作是:&br&&br&第一步:准备一个命令字,通过I/O端口或者MMIO映射的寄存器发送;&br&第二步:利用MMIO做DMA把内存里的东西送到显存里;&br&第三步:如果有返回命令,这里可能要等待DMA中断完成之类的动作;&br&&br&如果是频繁的刷新图像,可能会有一个专门的线程不停的向MMIO映射的那部分显存里做DMA,目的就是不停的刷新显存,让显卡那边图像更新。&br&&br&&b&统一编址的用途是给DMA控制器做DMA的时候用的&/b&,否则DMA操作起来会很麻烦。所以,严格的说,看具体什么样的显卡,有些显卡的显存是可以被CPU直接访问的,有些是不能的,&b&但所有显存都是可以被DMA的&/b&。&br&&br&-----------------------------------&br&&br&题外话:&br&&br&显卡的具体操作技术都是保密的,很多显卡驱动也都是闭源的,包括在Linux上(有办法可以规避GPL),显卡的3D加速之类的具体如何操作硬件,基本上不会有厂商公布,所以对外表现出来的这些特性只能猜。&br&&br&一些有合作的企业会公布一些代码,但看代码有时候很难理解它的行为,所以不要指望说看几本书就会写显卡驱动,很不现实,要做显卡驱动最好是到显卡厂商那边去。&br&&br&-----------------------------------&br&&br&睡不着,做了一个比较有意思的实验:&br&&br&在虚拟机里写一个简单的驱动,工作在内核态,然后找到显卡的MMIO的第一段地址,在驱动里加一段代码去读这个地址,结果发现这段地址上的数据正好就是屏幕上显示的像素信息。&br&&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&n&&VOID&/span& &span class=&nf&&ReadGPUMem&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&LARGE_INTEGER&/span& &span class=&n&&p&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&o&&*&/span& &span class=&n&&np&/span&&span class=&p&&;&/span&
&span class=&n&&p&/span&&span class=&p&&.&/span&&span class=&n&&QuadPart&/span& &span class=&o&&=&/span&
&span class=&mh&&0xE8000000&/span&&span class=&p&&;&/span&
&span class=&n&&np&/span& &span class=&o&&=&/span& &span class=&n&&MmMapIoSpace&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span& &span class=&n&&PAGE_SIZE&/span&&span class=&p&&,&/span& &span class=&n&&MmNonCached&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&np&/span& &span class=&o&&!=&/span& &span class=&nb&&NULL&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&KdPrint&/span&&span class=&p&&((&/span&&span class=&s&&&%08x %08X %08X %08X %08X&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&np&/span&&span class=&p&&,&/span& &span class=&n&&np&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span& &span class=&n&&np&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&],&/span& &span class=&n&&np&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&],&/span& &span class=&n&&np&/span&&span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&]));&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span&
&span class=&n&&KdPrint&/span&&span class=&p&&((&/span&&span class=&s&&&Map fail&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&));&/span&
&span class=&k&&return&/span& &span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&&br&因为是读的前4个int,所以用截图键(print screen)截图比较了一下,像素点像素值完全等于我通过debug打印的数值,这说明0xE8000000这个地址就是我虚拟机上的显存地址。&br&&br&然后我又在打印的后面加了一句:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&RtlZeroMemory(np, PAGE_SIZE);
&/code&&/pre&&/div&&br&屏幕显示似乎没有变化,但通过截图键截图发现,屏幕的上面有一条黑线,正好是我ZeroMemory的位置:&br&&br&&img data-rawheight=&379& data-rawwidth=&1276& src=&/4fc7c06f6dde_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1276& data-original=&/4fc7c06f6dde_r.jpg&&&br&这说明至少虚拟机里显卡映射的这部分是肯定可以读写的,甚至会影响系统截图的效果。
问题1:设备管理器属性里:内存范围,表示的是MMIO(内存映射)的范围,这个范围是通过PCI配置寄存器读出来的,Windows里,在驱动里用HalGetBusData可以获得,用户态好像没有直接访问的方法。关于PCI寄存器的描述,详见:鉴于篇幅原…
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 5. 显卡的工作原理 的文章

 

随机推荐