如果没有关于您打算编写的算法和应用程序的更多信息,这个问题就有点模糊了。但我想我可以为您提供一些高级策略,以便您在为这两个不同平台开发代码时牢记。
Radeon 7750 的设计采用新的Graphics Core Next架构,而您的 HD5780 则基于较旧的VLIW5 (RV770) 架构。
为了使您的代码在 HD5780 硬件上运行良好,您必须尽可能多地使用打包的原始数据类型,尤其是int4
,float4
类型。这是因为 OpenCL 编译器很难自动发现并行性并将数据打包到宽向量中。如果您可以构建您的代码,以便您已经考虑到这一点,那么您将能够填充更多的 VLIW-5 插槽,从而使用更多的流处理器。
GCN 更像 NVidia 的 Fermi 架构,其中代码到流处理器的功能单元(ALU 等)的路径不经过显式调度的 VLIW 指令。因此,可以在运行时自动检测到更多的并行性,让您的功能单元忙于做有用的工作,而无需您费力思考如何实现这一点。
这是一个过于简单的例子来说明我的观点:
// multiply four factors
// A[0] = B[0] * C[0]
// ...
// A[3] = B[3] * C[3];
float *A, *B, *C;
for (i = 0; i < 4; i ++) {
A[i] = B[i] * C[i];
}
该代码可能在 GCN 架构上运行良好(除了次优的内存访问性能——一个高级主题)。但是在您的 HD5870 上这将是一场灾难,因为这四个乘法将占用 4 个 VLIW5 指令而不是 1 个!float4
因此,您将使用以下类型编写上述代码:
float4 A, B, C;
A = B * C;
它会在你的两张卡上运行得非常好。另外,它会在 CPU OpenCL 上下文中发挥作用,并充分利用 MMX/SSE 宽寄存器,这是一个奖励。这也是对内存系统的更好使用。
简而言之,在您开始同时在这两个系统上部署代码时,我建议您牢记一件事,使用打包的原语。
这是另一个更清楚地说明在 HD5870 上需要小心操作的示例。假设我们使用单独的工作单元实现了前面的示例:
// multiply four factors
// as separate work units
// A = B * C
float A, B, C;
A = B * C;
我们有四个独立的工作单元,而不是一个。这对 VLIW 设备来说绝对是一场灾难,并且会在 GCN 设备上显示出更好的性能。这也是您在编写代码时想要寻找的东西——您可以使用float4
类型来减少执行相同工作的工作单元的数量吗?如果是这样,那么您将在两个平台上看到良好的性能。