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

 


 

你可能感兴趣的:(sha)