SPU Shader

8个SPU作为Cell的协处理器,承担着大量的并行计算的责任。存在两大问题:

1、SPU是与主CPU异构的处理器,难以自动并行化。

2、SPU只能在称为local store的256K快速内存中进行寻址,主存中的数据需要通过DMA到local store中。


为了解决这两个问题,IBM Cell SDK提供了overlay和software cache来解决。PS3 SDK中提供了SPURS。但似乎都不能够最大程度上满足并行的要求。Insomniac早在抵抗1发布不久就公布了他们的一种技巧,后来他们称之为SPU Shader。概念上有点类似传统GPU Shader,但控制权基本上都在shader程序员手中,而且解决的问题远比GPGPU的一些应用来的宽泛。在他们之后的一些演讲中,甚至有游戏层的代码在使用SPU Shader。


简单来说,SPU的ABI(application binary interface,即二进制代码和OS管理之间的一层接口、或者是协议) 是不会改变的(其实其他处理器在很多时候应该也是这样)。所以代码即是数据,数据即是代码。既然两者在机器指令层是同等待遇的东西,那么程序员也完全可以通过DMA把代码上载到SPU local store中,随后进行调用。由于DMA是通过Cell处理器内部的memory flow controller进行的,这部分操作完全不需要主CPU的参与,只会占用Cell的内部总线带宽。

Insomniac的程序员把SPU源码写好后,并不直接编译成可执行的SPU程序,而是把机器代码dump出来,由Makefile执行一个awk脚本生成一组数组存放在一个头文件中,数组中的内容就是dump出来的机器代码。然后由主CPU的程序#include这些头文件,这样就可以在SPU段通过DMA将这些“代码”上载到local store了。

 

限制:

1、字符串。常量字符串是作为每个编译单元中的常量部分放在.rodata或者.data中的,使用字符串大概需要一些技巧。

2、估计是没法在SPU Shader里搞C++了(经过mangling的函数,有办法知道谁是谁吗?反正我是不知道)。

3、Debug是个大问题|||


参考:

http://www.insomniacgames.com/tech/articles/0807/dynamic_spu_code.php

http://www.insomniacgames.com/tech/articles/0907/spu_shaders_introduction.php

http://www.insomniacgames.com/tech/articles/0108/more_on_spu_shaders.php

 


 

转载于:https://www.cnblogs.com/eygneph/archive/2009/02/28/1400574.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值