PS3 上的 Cell 处理器编程与普通台式机上的任何其他处理器编程有何不同?
使用什么样的编程范式、技术和实践来充分利用单元处理器的潜力?
我听到的所有关于 PS3 开发的文章都在讨论“学习如何在 Cell Processor 上编程”。除了挥手之外,这真正意味着什么?
PS3 上的 Cell 处理器编程与普通台式机上的任何其他处理器编程有何不同?
使用什么样的编程范式、技术和实践来充分利用单元处理器的潜力?
我听到的所有关于 PS3 开发的文章都在讨论“学习如何在 Cell Processor 上编程”。除了挥手之外,这真正意味着什么?
除了 George 提到的所有内容之外,SPU 确实更好地被认为是流矢量处理器。当你有一种算法可以处理长序列的数值数据时,它们的效果最好,这些数据可以通过 DMA 馈入 SPU 的有限内存,而不是让 SPU 加载一块内存,尝试对其进行操作,发现它需要跟随一个指向其内存之外某个地方的指针,加载那个,继续前进,找到另一个,等等。
因此,为它们编程并不是一个简单的并发和线程模型;它更像是高性能数值或科学计算。它也是一种极端的非均匀内存访问。
此外,每个处理器都与深度流水线有序,因此程序员必须更加了解数据危险和指令气泡以及我们被告知编译器“应该”为我们处理的所有众多微优化(但它真的没有)。错误预测的分支、加载命中存储、缓存未命中等事情比在乱序处理器上造成的伤害要大得多,乱序处理器可以左右操作顺序以隐藏这种延迟。
有关具体示例,请查看 Mike Acton 的CellPerformance博客。迈克是我最喜欢的老派集会,在这个行业中表现得很开心,他真的在这个问题上赢得了他的印记。
PS3 的 Cell 部分由 6 个 SPU 处理器组成。它们每个都有 256 KB 的非共享内存,并通过一个高速环连接,允许在彼此和 PowerPC 主机处理器之间进行 DMA。它们不是流水线或缓存的。这使得它与具有共享内存、流水线和缓存的多核 x86 截然不同。此外,SPU 处理器不使用与 PowerPC 相同的指令集,因此那里存在一些不对称性。
简而言之,您的典型共享内存、多线程程序不会在不做一些工作的情况下直接放到 Cell 上(需要注意的是,计算机科学努力使不同的机器看起来是相同的,因此一些实现者努力使该过程自动化) .
在高层次上,程序需要被分解成适合 Cell 硬内存限制的任务。这些可以并行运行,每个子任务可以排序到可用的 Cell 处理器。在低级别,编译器(或汇编程序员)将需要更加努力地生成在处理器上快速运行的代码——没有运行时技巧可以让事情变得更快。理论上,那些对程序员/编译器友好的特性会消耗芯片和速度,而这些成本可以更好地用于为您提供更多更快的 SPU。当然,您不会在 PS3 上获得更多的 SPU,但在一般情况下,每片上可用的晶体管数量您将获得更多的 SPU。
完全同意 George Philips 和 Crashworks。我唯一要补充的是,SPU 编程从根本上讲是关于工作管理的。为了充分利用 SPU,您需要让它们不断运行并反馈结果。如果您不得不坐下来等待一帧的结果而其余的 SPU 处于空闲状态,那么让一个 SPU 咀嚼一些复杂的后处理是没有意义的。所以你如何分配你的工作需要很多思考,这对你如何分块数据有很大的影响。
“我听到的所有关于 PS3 开发的文章都在讨论‘学习如何在单元处理器上编程’。除了挥手之外,这真正意味着什么?”
好吧,你必须在 SPU 上处理的东西......
理想情况下,您希望让 SPU 一直在做有用的工作,但这确实具有挑战性。它们不仅不适合处理某些类型的问题,而且通常移动系统以提高 SPU 的效率可能需要完全重新设计。在 PPU 上很容易发现的调试问题有时在 SPU 上可能需要数天时间。
我认为当人们使用“学习如何对细胞进行编程”这个短语时,他们大多是在挥手。您可以在一周内学习基础知识,挑战在于尝试将这些知识应用到实际代码中……这些代码通常已经存在并且不适合在 SPU 上使用。