【问题标题】:Portability and Optimization of OpenCL between Radeon Graphic CardsRadeon 显卡之间 OpenCL 的可移植性和优化
【发布时间】:2012-09-20 08:52:27
【问题描述】:

我正计划深入研究 OpenCL,并且一直在阅读(仅了解表面知识)关于 OpenCL 可以做什么,但有几个问题。

假设我有一台 AMD Radeon 7750,而我有另一台装有 AMD Radeon 5870 的计算机,并且没有计划使用配备 Nvidia 卡的计算机。我听说优化特定设备的代码会带来性能优势。优化究竟是什么意思?根据我的阅读和一些猜测,这听起来意味着以 GPU 喜欢的方式编写代码(通常不用担心它是 AMD 或 Nvidia 卡)以及以匹配方式显卡处理内存(我猜这是特定于计算设备的?还是这只是品牌特定的?)。

因此,如果我为 Radeon 7750 编写代码并对其进行优化,我是否能够将该代码带到具有 Radeon 5870 的另一台计算机上,并且在不更改任何代码部分的情况下,仍能保留合理数量的性能优势从优化?如果代码不起作用,更改部分代码是否会是一个小问题,或者是否涉及重写足够多的代码,因此首先为 Radeon 5870 编写优化代码会是一个更好的主意.

【问题讨论】:

    标签: parallel-processing opencl


    【解决方案1】:

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

    Radeon 7750 的设计是新的Graphics Core Next 架构,而您的 HD5780 是基于旧的VLIW5 (RV770) Architecture

    为了使您的代码在 HD5780 硬件上运行良好,您必须尽可能多地使用打包的原始数据类型,尤其是 int4float4 类型。这是因为 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 类型来减少执行相同工作的工作单元的数量吗?如果是这样,那么您将在两个平台上看到良好​​的性能。

    【讨论】:

    • 感谢您的回复。我应该澄清一下,它与天体物理学有关,所以它是 n 体模拟和碰撞。
    • 这是否意味着 OpenCL 编译器不擅长为您的代码矢量化,但可以在有意义的平台(例如 nVidia)上轻松“取消矢量化”矢量代码?
    • OpenCL 编译器不一定会为您矢量化您的代码,是的,如果必须,编译器总是可以串行地对矢量执行操作。我正在编辑答案以添加一个案例,更清楚地说明您需要做什么才能充分利用您的 HD5870 (VLIW) 设备。
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多