A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 5772|回复: 8

PS2 CPU/GPU编程漫谈

[复制链接]

圣骑士

中国异度联盟盟主

精华
0
帖子
3432
威望
0 点
积分
3789 点
种子
92 点
注册时间
2005-10-4
最后登录
2025-8-3
 楼主| 发表于 2013-9-18 10:29  ·  四川 | 显示全部楼层 |阅读模式
本帖最后由 chenke 于 2013-9-18 10:47 编辑

今天讲讲ps2的cpu(ee)和gpu(gs)上的编程 顺便说说cpu和gpu的基本架构


任何一个游戏的基本流程是这样的(不考虑发声):

while (1) {
    判断当前输入
    根据输入得出当前所有元素位置和状态
    绘制所有可见元素
}


其中绝大部分计算工作用在在绘制上
所谓绘制 对于gpu来说 就是计算出所有基本元素(如线段,三角形)的位置,颜色,透明度等,写入frame buffer
而这些基本元素的属性则靠cpu计算出来,通过几个特定的接口送给gpu

对程序员来说 主要任务就是利用cpu和DSP 尽可能高效的计算出所有元素的属性 然后把数据丢给dma通道

ps2相当有趣的一个设计就是,所有硬件都映射到了主内存上
譬如说 所有的寄存器 都映射到了主内存里某一个特定位置
要读写一个寄存器 只需读写0xXXXXXXXX
譬如说要把一个多边形传送给gpu 可以通过dma 也可以跳过dma 只需要把所有数据依次写入到同一个地址即可
当然 这里需要考虑到同步的问题 每写一个数据之前要等待“可以写入”的状态被设置

ps2的架构非常灵活 其中主要原因是cpu带的两个可编程DSP可以工作在不同模式下
默认模式是你可以假设这两个DSP(VPU0, VPU1)透明 但这样做效率最低 因为这样的话 喂给gpu的数据是通过dram传过去的 不仅速率低 优先级也是最低的
如果设置DSP为micro模式的话 你可以将其从cpu的协处理器的地位提升到独立运作的地位
通过注入自己写的micro code,VPU可以得到最大限度的利用,并行于CPU的运行,从而将cpu解放出来,除此之外,还可以通过高优先级的接口将数据填充入gpu



这里先说说如何让vpu工作
首先要讲vpu设置为micro工作模式
然后写一段micro code,譬如根据输入的方程生成一段曲线并打包传给gs,存入vu
然后把方程本身作为数据通过dma丢给vu
然后设置开始的状态
之后的工作就交给vu去做了


一旦vpu介入 就涉及到怎么把数据喂给vpu的问题 这也是带来很高灵活性的源头之一
vpu自带了vu memory 所有要处理的数据都必须先丢进去
最基本的方式是独占vu memory:

拷贝数据
处理数据
将数据传给gpu(gs)

但是这么做浪费了ps2的高速处理能力
在拷贝数据给vpu的时候 vpu是没法做计算的 gs也处于stall状态
在处理数据的时候 dma是stall的 gs同样在等
在传数据给gs的时候 又只有gs一个人工作

为了避免这些大量的stall  稍微高级一些的方式如下:
将vu memory分成两块
第一块只写入数据 第二块用作处理数据
这样就可以同时写入数据和处理数据

还有第三种方法
将vu memory分成4块
1、2块和3、4块分别照第二种方式运行

还有第四种方式
将vu memory分成三块
每块独立按照第一种方式运行

还有第五种方式
不是有两块vpu吗 第一块把主内存当作工作区 第二块则独立工作 分别给gs喂数据

这些运行方式的目的都是不让gs和vu闲着 尽可能的减少stall
理论上还有其它方式 但是更复杂的方式会给编程带来很大的难度 因为并行的处理需要程序员自己处理同步的问题
具体该用哪种方式也和具体的应用有紧密联系 这也是为什么很给gpu难抽象出一个通用的api的缘故


ps2的编程总的来说是很简单的 难就难在怎么高效的组织vpu和cpu一起工作
另外 由于不同的micro instruction的throughput和lantency是不同的 在写micro code的时候必须把这些因素考虑进去 加入必要的NOP 当然 这部分工作已经有成熟的编译器可以帮你做了。

参考
http://www.philvaz.com/games/PS2.htm
http://www.assemblergames.com/fo ... and-Service-Manuals
http://lukasz.dk/playstation-2-p ... oduction-to-ps2dev/
http://www.iteye.com/topic/393908

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

精华
0
帖子
526
威望
0 点
积分
537 点
种子
5 点
注册时间
2007-2-5
最后登录
2022-9-29
发表于 2013-9-18 10:41  ·  上海 | 显示全部楼层
我居然都看懂了  

精华
0
帖子
4649
威望
1 点
积分
5293 点
种子
544 点
注册时间
2008-9-25
最后登录
2025-8-13
发表于 2013-9-18 11:03  ·  新加坡 | 显示全部楼层
支持一下~





         

精华
0
帖子
1371
威望
0 点
积分
1523 点
种子
18 点
注册时间
2007-12-16
最后登录
2025-8-27
发表于 2013-9-18 17:20  ·  浙江 | 显示全部楼层
看的似懂非懂

精华
0
帖子
5564
威望
0 点
积分
5735 点
种子
48 点
注册时间
2006-8-16
最后登录
2025-8-27
发表于 2013-9-18 17:34  ·  法国 | 显示全部楼层
是原创吗?很厉害的样子!

精华
0
帖子
3209
威望
0 点
积分
3544 点
种子
20 点
注册时间
2011-1-30
最后登录
2025-8-27
发表于 2013-9-21 00:04  ·  辽宁 | 显示全部楼层
这么厉害怎么不去做PS2模拟器?

审判者

大家好 我软软会免哥(逃 PSN:SPUDSL-HK

精华
0
帖子
13950
威望
1 点
积分
15368 点
种子
1607 点
注册时间
2007-1-17
最后登录
2025-8-27
发表于 2013-9-21 00:08  ·  浙江 | 显示全部楼层
这样的技术帖才是好的 感谢楼主

精华
0
帖子
9631
威望
0 点
积分
9817 点
种子
591 点
注册时间
2010-5-7
最后登录
2025-8-27
发表于 2013-9-21 00:23  ·  浙江 | 显示全部楼层
这个看不太懂,没肯过编程的书。。。。。慢慢学点知识~~

精华
0
帖子
38091
威望
0 点
积分
44169 点
种子
1811 点
注册时间
2010-9-9
最后登录
2025-8-24
发表于 2013-9-21 17:17  ·  河南 | 显示全部楼层
是啊看得还不是很明白。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2025-8-28 00:23 , Processed in 0.242785 second(s), 22 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部