T版 讲得比较深了,楼主尽量理解就好。
我不说 gpu,我说 cpu,这样楼主可能容易领会一点:
cpu 访问内存是个比较简单的一行为,但这个过程可能也不是像想像的这么简单。因为楼主很可能也知道,cpu 和 内存 之间一般都有三级缓存,也就是说内存其实可以看成第四级缓存。你下达读内存的指令,其实并不一定是读了内存,有可能只读了一级缓存,有可能读到了二级缓存,也有可能是真读了内存。你下令写内存,也是一样,很可能根本没真的写进内存。但总之有一点,硬件会保证最终你要的效果,我一定帮你做到,至于过程你无法控制。这是硬件的电路逻辑,可以靠软件(就是指操作系统)控制是否开启,但开启这后,连操作系统也无法更改它的逻辑行为。操作系统的最最底层需要一部分代码,实现硬件要求系统维护的数据结构,但这些代码一般只占内核代码的很少一部分。
必须深入了解某种类型 cpu 的硬件能够提供哪些功能,以及如何开启或关闭它们。一但需要开启或者关闭,硬件又要求系统维护的相关数据结构,以及应该如何维护。这些硬件提出的接口,一般称为 cpu 的架构。比较有名的架构包括 PowerPC, ARM, SPARC, x86 之类的。还有比如早期的 PDP(unix 最早在其上实现)。我其实也只对 intel 的 x86 架构了解的相对多一点而已。由于它们的架构,下层硬件的执行逻辑就会大相径庭。难道要让程序员换个环境连基本的访问内存也做不到吗?这就需要驱动程序。这有点像反过来的,操作系统为了能在各种硬件上运行,也规定了一套接口。而驱动程序的工作是这样,用 cpu 提供的接口实现操作系统规定的接口。这样当系统调用接口,就会由驱动程序驱动硬件来完成指定的任务。换个架构的话,只需要提供另一套驱动程序即可。驱动可以由生产这种硬件的厂商编码,也可以由熟悉这种架构的第三方编码。
总之需要在这种操作系统里编程的人,只用知道操作系统的接口即可,再底层的不是说不用学,是学了也没用。除非是想满足好奇心(比如我这样的就学了些 x86 架构的东西),或者是你要去写驱动程序。早期 MS DOS 的系统过度依赖硬件,完全没有移植性。甚至很多东西推给程序员实现,是因为那会微软刚起步,系统极为简陋原始。后来推出的早期的 windows 也一样,也只能在 intel 的架构上运行。结成了大家所谓 wintel 联盟的东西。但是现在的 windows 系统好像移植性上去了,不过我也不是很了解 windows。
楼主可能觉得我在转移话题。是的,因为对于显示的问题,我只是稍微了解一点老 DOS 时使用的那种机制。而那种机制,现在也淘汰了。但是道理是一样的。显卡的硬件也有硬件接口,也需要驱动程序在图形库和显卡的硬件接口间建立联系,当然的联系的过程中,需要 cpu 辅助。这样写程序的人就只管调图形库就行了。如果机器没有 gpu,那么实际安装的驱动程序其实是把相关的东西翻译成了 cpu 的硬件接口,并让 cpu 去算了。如果有显卡,又有正确地安装驱动程序,那么它会覆盖掉老的驱动程序。再执行的时候,就可以调用显卡来运算了。所以用不用显卡算,不是写这个程序的人决定的,也不是写图形库的人决定的。所有人都只有一个目的,让程序能正确高效的执行。
现在再看看楼主的问题:
CPU怎么判定哪些程序(代码)交给GPU啊
你清楚答案了吗?最终其实是驱动程序安排 cpu 把相关的内容移交 gpu 计算的。驱动程序一般是 gpu 芯片的设计者负责编写的。
显卡的东西到底是从内存读取的,还是从CPU里面读取的还是CPU写进显存的
显卡应该是无法访问 cpu 内部数据的,也不能访问 cpu 的那三级缓存。它只能访问内存,而它访问哪部分内存,是由 cpu 发指令控制的。
很可能不是 cpu 写进去的,只是告诉 gpu 应该去哪读。当然读完了之后,gpu 会把相关的数据拷贝进自己的显存,之后就可以节约访问内存的成本了。显存成了 gpu 和 内存之间的缓存。这和 cpu 的缓存逻辑很像。
先假设某处内存中存在一个字符A,具体显示到显示器的细节是怎么实现的呢
这有点像通电之后,灯泡会亮一样。只是电路复杂了很多,因此也会有更复杂的逻辑。早期的 DOS 也有 BIOS 程序参与,可以简单地把这些程序也看成电路的一部分。
显卡能直接和内存通信吗?
不能。需要 cpu 参与。
就一个C语言或者汇编程序来说?找不到具体的往显存写东西的代码,莫非是编译器?
编译器没有这么大能力。它调用系统接口了。而系统委托给驱动程序了。
说说打开一张图片的过程,我自己的理解是,CPU 通过主线 从硬盘读取一张图片,然后(放进某个内存中)需要这个过程吗?还是直接输出都显卡,图片处理程序来解读图片的字符流,又或者说那个图片处理程序会在GPU中运行?
版主讲解下 具体的过程 比如读取一个电影
有权限读硬盘我觉得还是只有 cpu,gpu 应该不能把。还是得等 cpu 先读进内存。至于 cpu 是不是能直接把硬盘数据写到显存去,我不是很了解 gpu 的架构。理论上也不是不可能,但我觉得可能不会这么设计。
图片处理程序不可能全在 gpu 中算,许多主代码还是在 cpu 这。比如处理键盘鼠标的输入事件,另存为之类的。这些交给 gpu 去干也没什么优势。
读取电影就更复杂了,因为它还涉及编码问题(其实图片也涉及,只是简单点)。为了做复杂的渲染,很多计算是移交 gpu 了。但依然应该不是全在 gpu 中算的。cpu 这边还有很多其它的逻辑要处理。
我不太专业。有关 cpu 的知识应该还是靠点谱的,提到 gpu 那块的东西,基本是我蒙的。其实我看这个帖子,也跟 TonyDeng 学了不少东西。