为PS3的Cell处理器编程需要什么?

时间:2009-08-31 04:46:08

标签: ps3

PS3上Cell处理器的编程与普通桌面上任何其他处理器的编程有何不同?

使用什么样的编程范例,技术和实践来充分利用Cell Processors的潜力?

我听到的有关PS3开发的所有文章都在讨论“学习如何在Cell处理器上编程”。除了挥手之外,这究竟意味着什么呢?

4 个答案:

答案 0 :(得分:18)

除了George提到的所有内容之外,SPU更好地被认为是流向量处理器。当你有一个算法可以处理长序列的数值数据时,它们效果最好,可以通过DMA通过SPU的有限内存,而不是让SPU加载一块内存,尝试对它进行操作,发现它需要按照指向其内存之外的指针,加载 ,继续,找到另一个,依此类推。

因此,为它们编程并不是简单的并发和线程模型;它更像是高性能数值或科学计算。它也是极端的非均匀内存访问。

此外,每个处理器都有深度流水线,因此程序员必须更加了解数据危险和指令气泡以及我们被告知编译器“应该”处理的所有大量微优化我们(但它确实没有)。错误预测的分支,加载命中存储,缓存未命中等事情比无序处理器更容易受到伤害,这些处理器可以兼顾操作顺序以隐藏这些延迟。

有关具体示例,请查看Mike Acton的CellPerformance博客。迈克是我最喜欢的老式学校集会 - 这个行业很开心,而且他真的在这个问题上赢得了他的印章。

答案 1 :(得分:14)

PS3的Cell部分由6个SPU处理器组成。它们每个都有256 KB的非共享内存,并通过高速环连接,允许相互之间的DMA和PowerPC主机处理器。它们不是流水线或缓存的。这使得它与具有共享内存,流水线和缓存的多核x86完全不同。此外,SPU处理器不使用与PowerPC相同的指令集,因此您在那里有一些不对称。

简而言之,您的典型共享内存,多线程程序不会在没有一些工作的情况下直接进入Cell(需要注意的是计算机科学努力使不同的机器看起来是相同的,因此一些实现者努力自动化过程)。

在高级别,程序将需要分解为符合Cell的硬内存限制的任务。这些可以并行运行,并且每个子任务可以按顺序排列到可用的Cell处理器。在较低的层次上,编译器(或汇编程序员)需要更加努力地生成在处理器上快速运行的代码 - 没有运行时的技巧可以使事情变得更快。理论上,那些程序员/编译器友好的功能需要花费更多的硅和速度,可以更好地为您提供更多更快的SPU。当然,你没有在PS3上获得更多的SPU,但在一般情况下,你将获得更多的SPU芯片上可用的SPU数量。

答案 2 :(得分:3)

完全同意George Philips和Crashworks。我唯一要补充的是,SPU编程基本上是关于工作管理。为了充分利用SPU,您需要让它们保持勾结并反馈结果。如果你不得不坐下来等待一帧的结果而其余的SPU闲置,那么让一个SPU咀嚼一些复杂的后处理就没有意义了。因此,如何分配您的工作需要经过深思熟虑,这对您整理数据的方式产生了重大影响。

答案 3 :(得分:3)

“我听到有关PS3开发的所有文章都在讨论'学习如何在Cell处理器上编程'。除了挥手之外,这究竟意味着什么?“

嗯,你需要在SPU上处理的东西......

  • 原子操作(无锁试用废弃样式)。
  • 内存区域之间的区别很大。您必须知道哪个指针指向哪个存储区域,否则您将搞砸所有内容。
  • 数据和代码之间没有强制硬件区别。这实际上是一件有趣的事情,您可以设置动态代码加载并基本上将子例程流入和流出。自修改代码是可能的,但在SPU上不一定实用。
  • 缺少硬件调试辅助工具。
  • 内存有限。
  • 快速访问内存。
  • 指令集平衡SIMD操作。
  • 浮点“陷阱”。

理想情况下,您希望让SPU始终保持有用的工作,但这确实很有挑战性。它们不仅不适合处理某些类型的问题,而且通常会使系统在SPU上高效运行可能需要完全重新设计。调试容易在PPU上捕获的问题有时可能需要数天的SPU。

我认为当人们使用“学习如何编程细胞”这一短语时,他们大多是挥手。您可以在一周内学习基础知识,挑战在于尝试将这些知识应用于实际代码......这些代码通常已经存在且不适合在SPU上使用。