Parallel processing OpenCL在Radeon图形卡之间的可移植性和优化

Parallel processing OpenCL在Radeon图形卡之间的可移植性和优化,parallel-processing,opencl,Parallel Processing,Opencl,我正计划潜入OpenCL,并一直在阅读OpenCL能做什么(只有表面知识),但有几个问题 假设我有一台AMD Radeon 7750,我有另一台电脑有一台AMD Radeon 5870,没有计划使用带有Nvidia卡的电脑。我听说优化特定设备的代码会带来性能优势。优化到底意味着什么?从我所读到的和一点猜测来看,这听起来像是以GPU喜欢的方式(通常不担心它是AMD或Nvidia卡)编写代码,以及以与图形卡处理内存方式相匹配的方式编写代码(我猜这是特定于计算设备的?或者这只是特定于品牌的?) 因此,

我正计划潜入OpenCL,并一直在阅读OpenCL能做什么(只有表面知识),但有几个问题

假设我有一台AMD Radeon 7750,我有另一台电脑有一台AMD Radeon 5870,没有计划使用带有Nvidia卡的电脑。我听说优化特定设备的代码会带来性能优势。优化到底意味着什么?从我所读到的和一点猜测来看,这听起来像是以GPU喜欢的方式(通常不担心它是AMD或Nvidia卡)编写代码,以及以与图形卡处理内存方式相匹配的方式编写代码(我猜这是特定于计算设备的?或者这只是特定于品牌的?)


因此,如果我为Radeon 7750编写代码并对其进行优化,我是否能够将该代码带到另一台装有Radeon 5870的计算机上,并且在不更改任何部分代码的情况下,仍然可以从优化中获得合理的性能好处?如果代码不起作用,更改部分代码是一个小问题,还是需要重写足够多的代码,以便首先为Radeon 5870编写优化的代码更好。

如果没有关于您打算编写的算法和应用程序的更多信息,这个问题有点模糊。但我想我可以给你一些高级策略,让你在为这两个不同的平台开发代码时牢记在心

Radeon 7750的设计采用新的体系结构,而HD5780则基于旧的体系结构

要使代码在HD5780硬件上运行良好,必须尽可能大量使用压缩的基本数据类型,尤其是
int4
float4
类型。这是因为OpenCL编译器很难自动发现并行性并将数据打包到宽向量中。如果您可以对代码进行结构化,以便已经考虑到这一点,那么您将能够填充更多的VLIW-5插槽,从而使用更多的流处理器

GCN更像NVidia的费米体系结构,其中代码到流处理器功能单元(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];
}
而且它在你的两张牌上都会运行得很好。此外,它还可以在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
类型来减少执行相同工作的工作单元的数量吗?如果是这样,那么您将在这两种平台上看到良好的性能。

谢谢您的回复。我应该澄清的是,它与天体物理学有关,因此是n体模拟和碰撞。这是否意味着OpenCL编译器不擅长为您矢量化代码,但可以在有意义的平台(例如nVidia)上轻松“取消”矢量代码?OpenCL编译器不一定会为您将代码矢量化,是的,如果有必要,编译器总是可以串行执行向量操作。我正在编辑答案,以添加一个更清楚地说明如何充分利用HD5870(VLIW)设备的案例。
// multiply four factors
// as separate work units
// A = B * C

float A, B, C;

A = B * C;