交易中的OpenCL - 页 3

 

AMD 开发人员中心:OpenCL 编程网络研讨会系列 2。 OpenCL 简介



2- OpenCL 简介

本视频详细介绍了 OpenCL,这是一个并行计算平台,可以使用 CPU 和 GPU 来加速计算。用 OpenCL 编写的程序可以在不同的设备和架构上执行,允许跨不同平台的可移植代码。该视频讨论了 OpenCL 中的不同执行模型,包括数据并行性和任务并行性,还涵盖了 OpenCL 中使用的不同对象和命令,例如内存对象、命令队列和内核对象。该视频还深入探讨了使用 OpenCL 的优点和局限性,例如显式内存管理的需要以及并行程序中显着提高性能的潜力。

  • 00:00:00 在本节中,演讲者介绍了 OpenCL 及其使用 CPU 和 GPU 加速并行计算的能力,从而显着提高了速度。尽管有时会引用 100X 或 1000X 之类的数字,但实际上,优化程序预计会提速 10-20X 左右。 OpenCL 可以编写跨不同设备和架构的可移植代码;因此,为 AMD GPU 编写的程序通常也可以在 NVIDIA GPU 上运行。与某些其他竞争对手的实施不同,AMD 实施提供了 OpenCL 的 CPU 和 GPU 实施。本节最后概述了异构计算以及 OpenCL 如何融入其中。

  • 00:05:00 在本节中,演讲者介绍了 OpenCL,这是一个低级和冗长的平台,如果应用程序具有正确的特性,它可以在性能方面有所回报。 OpenCL 是一种基于平台的模型,由主机 API、连接设备模型和内存模型组成。这些设备被视为计算单元的集合,每个计算单元被分解为在 SIMD 中执行的处理元素。执行模型基于内核的概念,内核是可以在多个数据上并行执行的可执行代码单元。此外,OpenCL 提供了一组队列,允许异步执行读写操作和内核执行,可以是有序的,也可以是乱序的。

  • 00:10:00 在本节中,演讲者讨论了 OpenCL 中的两个主要执行模型:数据并行性和任务并行性。数据并行模型在 GPU 上的执行效率最高,涉及 N 维计算域,其中每个单独的元素称为一个可以并行执行的工作项。工作项的执行可以分组到称为工作组的本地维度中,这些维度在可用计算单元之一上执行。演讲者还解释了循环如何隐含在 OpenCL 的数据并行世界中,以及如何使用获取全局标识符例程对 a 和 b 进行索引。

  • 00:15:00 在本节中,演讲者讨论了本地内存,它类似于缓存,由用户管理,具有低延迟和比全局内存更快的特点。同步功能允许工作项写入内存位置,等待完成,然后让另一个工作项读取该内存位置并获取前一个工作项写入的值。同步只能在工作组内完成。 OpenCL 还支持由单个工作项执行的任务并行性,并受益于使用 OpenCL 队列模型和主机 API 的同步功能,允许本地编译代码。 OpenCL 与 C 的不同之处在于,特定 GPU 的内存层次结构是明确公开的,程序员可以通过使用屏障操作和同步来诱导数据的排序和一致性。

  • 00:20:00 在本节中,演讲者讨论了 OpenCL 的优势,例如其强大的性能。然而,他们指出,OpenCL 中的内存管理需要显式操作,这可能很复杂,需要仔细考虑算法。编译模型基于OpenGL,它有一个在线编译模型,允许传入OpenCL源代码的流或字符串进行在线编译。 OpenCL 是围绕上下文、设备集合和内存对象构建的,队列用于将工作提交到与上下文关联的特定设备。内存对象是缓冲区,它们是一维内存块,可以被认为是数组。

  • 00:25:00 在本节中,演讲者解释了不同的 OpenCL 对象,包括内存对象、图像、程序和内核。内存对象可以是缓冲区或图像类型,其中图像具有优化访问的硬件实现。可以构建和提取定义用于执行的内核的程序,并且可以使用内核对象来设置内核参数值。命令队列用于将内核和其他命令排入队列以供执行。此外,OpenCL 事件对于构建命令之间的依赖关系和查询命令的状态很有用。演讲者还举例说明了如何查询设备及其 ID。

  • 00:30:00 在本节中,演讲者解释了 OpenCL 如何返回错误代码和对象。如果函数返回一个 CL 对象,它将返回该对象作为结果。但如果它不返回 CL 对象,它将返回错误代码作为结果。讨论了上下文,以及如何在上下文级别分配内存,这意味着缓冲区和图像在设备之间共享。演讲者还提到了 CL get X info 功能,特别是 CL get device info,它允许开发人员查询设备功能以确定最适合该算法的设备。最后,演讲者讨论了缓冲区和图像,以及内核如何访问它们,以及对图像访问的限制。

  • 00:35:00 在本节中,演讲者讨论了如何在 OpenCL 中分配缓冲区和图像,包括如何描述如何访问缓冲区以及使用图像的好处。演讲者还解释了如何使用显式命令访问内存对象数据,以及如何将命令加入队列。此外,该视频还解释了如何映射区域和在缓冲区之间传输数据,以及使用 DMA 单元的优缺点。本节最后讨论程序和内核对象以及设置参数值。

  • 00:40:00 在本节中,演讲者讨论了 OpenCL 中的调度和依赖项。他们解释了调度将如何基于执行域或网格执行,以及如何设置依赖关系以确保事物不会相互超越。演讲者还解释了 NQ 命令的参数,它考虑了等待列表中的事件数以及与该命令关联的事件。最后,演讲者概述了 OpenCL C 语言,它基于 C 并具有一定的限制和添加,例如矢量类型和同步原语。该语言允许工作项和工作组,以及地址空间限定符和内置函数。

  • 00:45:00 在本节中,演讲者简要概述了 OpenCL 及其功能,例如可在内核编程中使用的不同地址空间、向量类型和标量类型。他们还讨论了如何使用 OpenCL API 创建内存对象以及构建和执行程序。然后,演讲者提出了一个问题,即 OpenCL 中的数据并行性与编译器中的循环展开有何不同。

  • 00:50:00 在本节中,演讲者解释了数据并行执行的概念以及组件高效执行的困难。他还强调需要明确并行化 OpenCL 或任何其他模型的程序。 inq_marker 是涵盖的另一个主题,以及它如何在无序提示中发挥作用。演讲者重申常量内存意味着值是常量,它用于特殊的 GPU 以加载到非常快的只读常量内存中。他建议查看 MD 网站上的 OpenCL 专区,了解有关 OpenCL 和并行编程的更多信息。最后,他谈到了 get_global_ID(0) 如何为内核的每次调用返回相同的值。

  • 00:55:00 在本节中,演讲者解释说,当两个不同的应用程序同时运行并尝试在同一台机器上使用 OpenCL 时,今天的所有实现都将共享硬件,操作系统将多路复用应用程序。他们建议使用 OpenCL 的可视化分析器,例如 Visual Studio 插件或 Linux 命令行版本,它们允许查询有关 id 硬件的信息。将数据加载到图像对象或缓冲区的开销取决于设备,通过 PCIe 总线传输数据会有更大的延迟。最后,演讲者提到新的 AMD 68000 GPU 系列及其最佳编程实践类似于它们基于的 Evergreen 架构。
 

AMD 开发人员中心:OpenCL 编程网络研讨会系列。 3.GPU架构



3 - GPU 架构

本视频概述了 GPU 体系结构,其中记录了 GPU 作为图形处理器的起源和主要用途。 GPU 设计用于处理具有高度并行性的像素,而 CPU 设计用于具有低延迟管道的标量处理。 GPU 的架构针对特定于图形的任务进行了优化,这可能不适用于通用计算。演讲者解释了 GPU 如何最大化一组线程的吞吐量,而不是最小化单个线程的执行延迟。还讨论了 GPU 引擎块的架构,包括本地数据共享、波前和工作组。该视频探讨了各种 GPU 架构功能,这些功能有助于增加编译器可以执行的打包量,包括在单个数据包中发出相关操作以及支持具有全局 beta 共享的相关计数器。尽管 GPU 和 CPU 核心设计可能相似,但它们的工作负载需要融合才能使它们具有相似的设计。

在这段关于 GPU 架构的视频中,演讲者深入探讨了障碍的概念及其功能。当一个工作组在 GPU 中包含多个波前时,屏障用于同步这些波前。但是,如果一组中只有一个工作波阵面,障碍就变得毫无意义,将沦为无操作。

  • 00:00:00 在本节中,主持人介绍了网络研讨会的目的,即与描述低级架构或优化的传统方法相比,从不同的角度概述 GPU 架构。演示者旨在通过讨论 GPU 架构的起源和作为图形处理器的主要用例,将其置于上下文中。他们解释了 GPU 如何设计用于处理具有高度并行性的像素,这与设计用于具有低延迟管道的标量处理的 CPU 不同。演示者还谈到了 GPU 架构如何可能不适合通用计算,因为它们的硬件块经过优化,专为加速特定于图形的任务而设计。

  • 00:05:00 在本节中,我们将了解如何执行用 GLSL 或 HLSL 编写的独立且与单个像素相关的片段程序,以及这种编程模式如何在没有依赖性分析或像素间通信的情况下实现高效并行。硬件设计为一次在多个像素上执行着色器代码,称为波前,但存在块代码和分支问题。当所有分支都以相同的方式进行时,就会出现问题,从而导致问题,但硬件会生成一个掩码以确保所有像素都在执行相同的指令。

  • 00:10:00 在本节中,演讲者讨论了 Cindy 的执行如何需要简单的指令和向量指令的使用。虽然向量指令可以由硬件或编译器生成,但由于需要手动打包不同的操作、分支屏蔽和仔细的手工编码,它会使开发变得繁琐和困难。另一方面,使用向量指令对 Cindy 执行程序进行编程有使开发人员认为通道独立分支的风险,这是不正确的。尽管如此,程序员仍然更容易考虑,对于当前的 AMD GPU,掩码由硬件控制。这对于计算来说很重要,这也是演讲的目的,因为它会影响性能,尤其是在更广泛的 Waveland 中存在分支分歧。

  • 00:15:00 在本节中,演讲者讨论了基于吞吐量计算的 GPU 架构的可见方面,这意味着如果指令向量在 GPU 中停滞,如果浮点加法需要一些周期完成后,可以使用相同的指令来覆盖下一个向量中的停顿时间,从而使指令解码变得更加高效。演讲者解释说,不是增加向量宽度会降低 ALU 的利用率,而是多个波前可以偷偷从其他正在运行的线程中获取指令,从而有可能在等待纹理单元返回内存数据时不会简单地停顿。然而,由于架构的工作方式,单个波前以这种方式执行需要更长的时间。

  • 00:20:00 在本节中,视频解释了 GPU 如何最大化一组线程的吞吐量,而不是最小化单个线程的执行延迟。这意味着 GPU 试图通过等待第一个线程完成执行然后输入下一个波前来提高线程的利用率,同时重复使用第一组像素的结果以使管道尽可能接近完全占用. GPU 维护着一个大的寄存器池,以覆盖每个运行中线程的向量的整个宽度,占用设备上的空间,这与状态的数量和向量的宽度成比例。 GPU 旨在覆盖延迟,因此 GPU 不是最小化延迟,而是最大化可用的内存带宽,以便它可以满足所有并行性,使用纹理缓存和本地内存在工作项之间重用数据。

  • 00:25:00 在本节中,演讲者讨论了缓存和程序控制的共享内存区域如何通过允许从主内存接口仅复制一次数据然后由不同路径中的不同工作项重复使用来减少数据传输。他们解释了纹理缓存如何设计为自动对其数据强制实施 2D 结构,以有效地捕获四边形的 2D 访问。本地数据区域提供了更多的控制,但开发人员有责任有效地构建加载以使用此内存并共享数据以减少全局内存需求。本节还探讨了如何将 GPU 视为具有多个程序状态的有线 Cindy 内核的集合,交错 4、8 或 16 个线程以覆盖管道延迟。讨论了内核数量和 ALU 密度之间的权衡,并根据工作负载提高利用率。

  • 00:30:00 在本节中,演讲者使用 Andy Phenom 2 X6 6 和 Intel i7 等示例讨论了 CPU 和 GPU 核心设计之间的异同。虽然 Pentium 4 和 ultraSPARC T2 采取的方法涉及具有多个状态集的更大内核大小以提高指令级并行性,但 GPU 处于具有高度数据平衡的范围的极端。还讨论了 AMD Radeon HD 5870 的技术细节,指出其高带宽和可用并发波形的数量,这取决于每个波前使用的寄存器数量。演讲者总结说,虽然 CPU 和 GPU 9 之间的设计空间可能存在相似之处,但它们的工作负载需要收敛才能具有相似的设计。

  • 00:35:00 在本节中,我们将了解 GPU 的设计元素,包括本地数据共享以及它划分成的波阵面和工作组。 GPU 的设计包括一个生成波阵面的上校调度命令处理器,这些波阵面被分配给一个可用的 SIMD 单元,该单元具有足够的资源来适应空间。整个芯片有 20 个 Cindy 引擎和 8 个 GDDR5 内存条,用于交叉开关和缓存。此外,它具有宽松的全局内存一致性模型,需要栅栏指令来确保可见性权限,允许 Cindy 引擎和固定单元尽可能保持高度的数据并行执行,而不会产生功率性能开销。 GPU 使用基于子句的执行模型,使其能够在最简单的引擎上同时执行许多控制流程序。

  • 00:40:00 在本节中,讨论了 GPU 引擎块的架构。引擎块有两个主要组件:本地数据共享,允许在工作组中的工作项和后测试元素或流核心之间共享数据,后者执行来自内核中 ALU 子句的指令。本地数据共享有 32 个存储体,引擎中的 16 个处理单元中的每一个都可以在任意地址的每个周期请求从 LDS 读取或写入 32 位字,并由单元检测冲突。原子操作是使用纯整数 ALU 执行的,而浮点原子操作执行起来会更复杂。 5870 架构的处理单元是由五个相同的 ALU 组成的集群,这些 ALU 对由编译器打包的五个操作组成的非常长的指令字包进行操作,具有一些自身的依赖性,可以执行大多数基本操作。

  • 00:45:00 在本节中,演讲者描述了各种 GPU 架构功能,这些功能有助于增加编译器可以执行的打包量,包括在单个数据包中发出相关操作以及支持具有全局 beta 共享的相关计数器。全局 beta 共享是一个鲜为人知的功能,它连接到设备上的整套计算引擎,并且延迟比访问其他内存低得多。演讲者还警告说,访问纹理缓存中的随机像素可能会导致性能问题,因为它比仅在数据聚集在一起时进行全局内存访问更快。

  • 00:50:00 在本节中,演讲者回答了与在 GPU 架构中实现完全占用相关的问题。给出的示例是,工作组应由 64 个工作项的倍数组成,以获得完全占用。波前和每个核上可以容纳的波前数量也会影响满载率。演讲者还提到,第 5 道生成的超越函数没有完全精确的版本,它们是快速近似,可能不够好,也可能不够好,具体取决于代码的需要。当被问及是否有一种方法可以查询所有设备内的波前大小时,答案是没有这种方法。

  • 00:55:00 在本节中,演讲者解释了在 GPU 架构中的全局内存访问方面完全合并的含义。从本质上讲,这意味着四分之一波阵面将发出一个内存请求,其中每个通道将从经过计算单元的对齐地址连续访问 128 位。但是,根据访问类型、是附加还是分离以及是否是随机收集,存在不同的效率级别。演讲者还澄清,波前是由 64 个工作项组成的工作单元,与一条指令一起执行,它与工作组不同,工作组是一组工作项。

  • 01:00:00 在本节中,演讲者解释了 GPU 架构中障碍的概念。如果一个工作组有多个波前,发出障碍指令将同步这些波前。但是,如果一个团队中只有一个工作波阵面,那么障碍将沦为非操作,没有任何意义。
 

AMD 开发人员中心:OpenCL 编程网络研讨会系列。 4 OpenCL 编程详解



4 - 详细的 OpenCL 编程

在此视频中,演讲者概述了 OpenCL 编程,讨论了其语言、平台和运行时 API。他们详细阐述了需要细粒度并行化、工作项和组或线程、同步和内存管理的编程模型。演讲者随后讨论了 n 体算法及其计算阶数 n 平方的性质。他们解释了 OpenCL 内核代码如何更新牛顿力学中粒子的位置和速度,引入缓存来存储一个粒子位置,以及内核如何使用浮点矢量数据类型更新粒子位置和速度。演讲者还深入探讨了主机代码如何通过显式设置参数和参数、在主机和 GPU 之间传输数据以及将内核执行排队以进行同步来与 OpenCL 内核交互。最后,该视频探讨了如何修改 OpenCL 代码以支持多个设备、在 GPU 之间同步数据以及为代表它们的半尺寸数组设置设备 ID。

第二部分讨论 OpenCL 编程的各个方面。它涵盖了诸如用于同步两个数组之间更新的粒子位置的双缓冲区方案、OpenCL 限制以及内存分配中全局指针和局部指针之间的差异等主题。此外,它还强调了 OpenCL 编程的优化技术,包括向量操作、受控内存访问和循环展开,以及可用于分析 OpenCL 实现的工具,例如分析工具。演示者推荐 OpenCL 标准作为 OpenCL 程序员的资源,并提供标准和 ATI Stream SDK 的 URL。该视频还解决了有关内存共享、代码优化、内存分配和计算单元利用率等主题的问题。

  • 00:00:00 在本节中,演讲者介绍了 OpenCL 概念,讨论了混合 CPU-GPU 架构的出现及其给编程带来的挑战。 OpenCL 提供了独立于平台和设备的 API,并得到了全行业的支持,演讲者概述了 OpenCL API 的三个部分:语言规范、平台 API 和运行时 API。执行模型分为两部分:内核,表示将在 OpenCL 设备上运行的可执行代码;主机程序,执行内存管理,并使用命令队列管理一个或多个设备上的内核执行。用于内核编程的 C 语言扩展基于 ISO C99,具有一些限制和添加以支持并行性。

  • 00:05:00 在本节中,演讲者解释了 OpenCL 的编程模型,它需要跨线程和同步的细粒度并行化。工作项和工作组作为线程引入,并被分组为在同步和共享内存访问方面具有特殊属性的工作组。演讲者还介绍了主机端的执行模型,解释说一切都聚集在一个上下文中,其中包括设备、程序对象、内核、内存对象的集合,以及用于排队内核和内存或数据传输操作的命令队列. OpenCL 还支持不同类型内存的层次结构,以反映具有分布式内存的混合系统中内存的性质。

  • 00:10:00 在本节中,演讲者讨论了在使用 OpenCL 编程时管理内存和同步的重要性。 OpenCL 有一个宽松的内存一致性模型,当数据从一个设备移动到另一个设备时,程序员有责任管理数据传输和控制。使用多个设备时,同步变得必不可少,程序员有责任确保事件(包括内核执行和数据传输)正确同步。演讲者介绍了标准 CL 的使用,它是 OpenCL 的简化接口,提供了一个可以使用的默认上下文,包括所有设备,并且不会中断完整的 OpenCL 功能。此外,标准 CL 通过 CL Maylock 简化了内存管理,它分配可在 OpenCL 设备之间共享的内存。

  • 00:15:00 在本节中,演讲者讨论了基本的 n 体算法,该算法模拟受某种形式的粒子-粒子相互作用影响的 n 粒子的运动。该算法涉及通过将与系统中所有其他粒子的相互作用的贡献相加来计算每个粒子上的力。一旦每个粒子上的力已知,粒子的位置和速度就会在一些小的时间步长上更新。对每个粒子重复此过程,从而模拟这些粒子在相互作用力作用下移动。该算法是计算阶 n 平方的,这允许在内存传输带宽受限的情况下使用协处理器实现良好的加速。整个算法仅需几十行 C 代码即可编写。

  • 00:20:00 在本节中,演讲者通过一个累积粒子间相互作用的循环来解释 n 体算法的实现。内核代码旨在从 OpenCL 的角度使用良好实践提供合理的标准实现,但它可能不是特定体系结构的最佳选择。内核将为索引空间内的每个工作项执行,其中每个线程负责更新单个粒子的位置和速度。该应用程序有一个简单的一维索引库,其中工作项的数量等于系统中的粒子数。主机代码对于 OpenCL 设备上的初始化、内存管理和协调操作也是必不可少的。

  • 00:25:00 在本节中,演讲者介绍了牛顿力学中更新粒子位置和速度的内核代码。内核代码的原型类似于 C 函数的原型,但带有一些限定地址空间的限定符和阻塞方案的使用。内核代码存储在一个单独的文件中,用于程序运行时的即时编译。然后,演讲者解释了内核代码如何在进入实际的物理计算之前确定大小和索引。全局和本地线程 ID 也有详细解释,演讲者指出内核代码中隐含了一个外循环,因为内核将针对系统中的每个粒子自动执行。

  • 00:30:00 在本节中,演讲者解释了 OpenCL 内核如何使用缓存实现成对力计算。内核缓存一个粒子位置,并依赖工作组中的其他工作项来填充缓存。一旦缓存了 64 个粒子位置,内核就会循环遍历缓存的粒子位置并执行与 C 代码中所示相同的力计算,其中存在特定于 OpenCL 的显着差异。其中包括为粒子位置使用浮点向量,为平方根使用 OpenCL 内置函数,以及为方便起见将质量存储在浮点向量的未使用的第四个分量中。内核使用浮点矢量数据类型在单个时钟上更新粒子位置和速度。最后,演讲者解释了在缓存填充和循环操作期间同步障碍的必要性。

  • 00:35:00 在本节中,我们将了解如何将新位置和新速度写回新数组中的全局内存,以避免覆盖其他线程仍需要的数据。这种双缓冲方案在后期阶段用于安全地更新粒子位置,而不会遇到任何线程并发问题。转到内核的主机代码实现,我们了解程序如何设置参数、分配内存、初始化位置和速度、构建和编译 OpenCL 内核、按名称查询必要的当前 n 体内核、创建一个维内核计算域,并显式设置内核参数。总的来说,代码显示了 OpenCL 与基本 C 程序的不同之处在于主机通过代理执行内核,以及必须如何直接设置内核的参数。

  • 00:40:00 在本节中,演讲者解释了使用 clm sink 调用将数据从主机传输到 GPU 以及使用阻塞调用标志同步设备 (GPU) 上的数组的过程。然后,他们讨论循环步骤,介绍将用于诊断目的的值和突发,并延迟设置内核参数 2 和 3 以进行双缓冲。演讲者指出,内核执行已入队,并且 CL 等待同步调用用于确保所有内核执行在继续之前已完成。最后,他们使用 CL 排队读取缓冲区将数据从 GPU 带回主机。

  • 00:45:00 在本节中,视频讨论了修改代码以支持多个设备,特别是在两个 GPU 上运行代码。该方法涉及在两个 GPU 之间分配力计算和粒子位置更新的工作,一个 GPU 负责一半的粒子。内核代码几乎没有交换,只是在原型中添加了一个名为“position remote”的附加参数,它指向给定 GPU 不负责更新但仍需要计算总力的粒子的粒子位置.由于使用两个设备,主机端发生了显着变化,涉及内存管理和同步问题。

  • 00:50:00 在本节中,讲座解释了为了在两个 GPU 上执行粒子模拟而需要对内核代码进行的更改。缓存粒子位置上的循环与之前相同,但在第 21 行之前,循环现在是在 GPU 拥有的局部粒子位置上进行。然后对另一个 GPU 负责更新的远程粒子重复该代码。更新粒子位置和速度的代码保持不变。要修改两个 GPU 的主机代码,初始化保持不变,但也会分配包含一半粒子的粒子位置和速度数组,其中 A 和 B 代表两个 GPU。创建了一个索引空间仅为原始大小二分之一的计算域,并删除了将参数指针静态设置为速度数组的代码。

  • 00:55:00 在本节中,我们将学习如何设置设备 ID,以便在将半大小数组复制到相应的 GPU 时定义将数据写入哪个 GPU。我们还看到,为了在多个 GPU 之间交换数据,我们需要通过切换代表它们的半尺寸粒子阵列,将更新后的粒子位置同步回 GPU。我们还了解到,对于 OpenCL 的某些实现,可能需要引入 CL 刷新调用以实现真正的并发,但这不是标准的一部分。

  • 01:00:00 在本节中,主持人介绍了代码,该代码实现了双缓冲区方案以在两个数组之间交换新旧粒子位置。该方案确保将更新的粒子位置放回数组 A 或 B。一旦粒子与主机同步,它们需要被复制回更大的数组以重用一些辅助函数。演示者推荐 OpenCL 标准作为 OpenCL 程序员的必备资源,并提供标准和 ATI Stream SDK 的 URL。主持人还回答了有关 OpenCL 是否可用于奇异值分解或非负矩阵分解等算法的问题,并确认 GPU 上的全局内存中的数据在内核执行之间保持不变,这对于更复杂的算法至关重要。

  • 01:05:00 在本节中,视频讨论了 OpenCL API 的当前局限性,它仅支持 Unix/Linux 系统,并且正在针对 Windows 端口进行开发。该视频还解决了 GPU 和主机之间共享内存的问题,解释说虽然这是可能的,但存在性能损失,因此通常使用在显卡上分配的全局内存。当通过 OpenCL API 分配内存时,有一些方法可以控制它的处理方式,但其中一些是在实现级别自动完成的。此外,该视频还解释了内存分配中全局指针和局部指针之间的区别,以及如何根据正在执行的算法选择最佳内核数。

  • 01:10:00 在本节中,演讲者讨论了与 OpenCL 编程相关的各种问题,例如是否加载和运行 FTL FGL RX 模块、Lib 标准 CL 与 C++ 绑定的兼容性、OpenCL 内核的优化以提高性能,以及在分配内存缓冲区时使用 CL mem 只读或将它们密封为读/写。演讲者还指出,可能存在用于编辑 OpenCL 内核和针对 AMD GPU 进行优化的特定工具,同时还指出优化技术可能非常微妙,需要大量调整。

  • 01:15:00 在本节中,演讲者讨论了 OpenCL 编程的优化技术,包括组织数据以利用向量操作、仔细控制内存访问以获得更好的性能以及手动展开循环以进行优化。此外,复杂数据类型的使用和在 GPU 之间传输数据而不返回主机的能力是特定于实现的,并且可能因编译器而异。演讲者还提到,内存缓冲区存在大小限制,这取决于系统中 OpenCL 设备的可用内存。可以将更简单的浮点参数存储在常量内存中以获得更好的性能。

  • 01:20:00 在本节中,演讲者解释说,各种 SDK 中都有可用于分析 OpenCL 实施的工具,包括用于测量计算单元利用率或内存传输利用率的分析工具。演讲者还澄清了在 GPU 端管理内存碎片是特定于实现的,并且实现必须正确地管理它。使用双精度时,对于是将本地工作组大小降低到 32 还是 16 没有明显的答案,因为这取决于所使用的体系结构。演讲者还提到了辅助调用的可用性,可以在标准 GPU 上下文中轻松获取所有设备的信息。
 

AMD 开发人员中心:OpenCL 编程网络研讨会系列。 5. 真实世界的 OpenCL 应用程序



5 - 真实世界的 OpenCL 应用程序

在此视频中,Joachim Deguara 谈到了他开发的一个多流视频处理应用程序,重点是性能优化。该视频涵盖了各种主题,例如解码视频格式、使用 DMA 在 CPU 和 GPU 之间传输内存、双缓冲、执行内核、使用事件对象同步和分析操作、OpenCL-OpenGL 互操作、处理视频中的滑动以及在两者之间进行选择处理算法时的 OpenCL 和 OpenGL。 Joachim 还讨论了可用于 OpenCL 应用程序的各种采样和 SDK,但指出目前没有可用于视频中讨论的特定应用程序的示例代码。

  • 00:00:00 在本节中,Joachim Deguara 解释了他开发的一个多流视频处理应用程序。该应用程序涉及打开多个视频流,对它们进行解码,对它们应用视频效果,组合它们,最后呈现一个视频流,最后重复处理。 Joachim Deguara 提到性能是该应用程序的重点,要实现实时演示,必须将解码、处理和显示纳入每秒发生 30 次的循环结构或输入视频的帧速率.

  • 00:05:00 在本节中,重点是解码视频格式并将帧移动到 GPU。要解码视频格式,必须确保尽可能快地完成解码,以免影响性能。一种方法是让解码函数与主循环分开运行,并在调用时返回最新帧。这确保解码在后台完成,而主循环继续不间断。为了将帧移动到 GPU,使用了 API 调用,其中包括指定要写入的图像以及写入应该同步还是异步发生。

  • 00:10:00 在本节中,演讲者讨论了 DMA(直接内存访问)以及如何使用它在系统主内存和 GPU 内存之间传输内存而无需 CPU 复制它。 DMA 引擎并行处理此操作,为 CPU 和 GPU 释放资源。缓冲区和图像的传输可以异步完成,并且需要特殊标志。但是,复制后数据不能立即使用,因此需要相应地重构程序以利用 DMA。演讲者建议双缓冲和重组循环过程以避免破坏当前处理或显示的数据。总的来说,DMA 可以通过卸载 CPU 和 GPU 周期来极大地提高应用程序性能。

  • 00:15:00 在本节中,演讲者讨论了 OpenCL 中用于处理和显示视频帧的双缓冲方法。这种方法涉及不断缓冲两帧 A 和 B,并在上传另一帧的同时处理其中一帧。这消除了将处理时间和上传时间加在一起的需要,而是只占用任一过程所需的最长时间。演讲者还讨论了为内核设置参数,这只需要做一次,如果不需要更改参数,则可以用于所有后续处理执行。

  • 00:20:00 在本节中,演讲者讨论了如何执行内核,并提到了两种调用处理的方式,包括阻塞和非阻塞方法。虽然阻塞使调试更容易,但它并不是性能的最佳选择,因此演讲者介绍了使用事件和事件向量来等待操作或为多个操作设置依赖关系图的选项。通过使用事件对象来指示某些工作项的完成,它可以确保下游操作仅在这些完成后才开始,从而实现更高效的处理。

  • 00:25:00 在本节中,演讲者解释了如何使用 OpenCL 事件对象来同步操作以及如何使用事件分析进行性能测试。在为过滤器创建依赖图时,指向事件的指针作为入队操作的最后一个参数传递,但事件对象是在 InQ 内部创建的。这可能会造成混淆,但它允许在过滤器和上传操作之间设置依赖关系。演讲者描述了如何通过事件分析从事件中获取时间戳,说明某些事件在事件生命周期中何时发生,例如事件引用的操作何时排队、提交、开始运行、并完成运行。这可以在保持所有操作异步的同时启用分析。

  • 00:30:00 在视频的这一部分,演讲者解释了事件在使用 OpenCL 时经历的不同状态,例如排队、提交、运行和完成,以及如何使用事件配置文件数据和时间戳来衡量性能并确定潜在的问题,例如操作或数据上传的执行时间过长。演讲者还讨论了如何等待事件完成,以确保准确显示具有各种过滤器和效果的视频流。

  • 00:35:00 在本节中,演讲者讨论了 OpenCL 和 OpenGL 互操作,这允许在两者之间共享某些信息。此功能是可选的,因此并非所有实现都必须支持它。演讲者强调了检查扩展并在 OpenCL 中创建带有特定标志的上下文以打开 OpenCL-OpenGL 互操作的重要性。其工作方式是从已创建的 OpenGL 纹理创建 OpenCL 图像,因此不会不必要地来回复制数据。

  • 00:40:00 在本节中,演讲者解释了 OpenCL 和 OpenGL 如何通过 Interop 共享图像数据。它们涵盖了引用 Open GL 纹理所需的目标、NIP 级别和纹理对象。创建后,OpenCl 映像可用作普通 OpenCl 映像,但两个程序需要进行一些握手以确保它们不会相互干扰。演讲者还回答了有关如何在视频渲染中创建过渡的问题。他说这可以通过使用滑动的位置作为过滤器的输入来完成。最终,将最终结果交给 OpenGL 进行显示,从而完成所有步骤。

  • 00:45:00 在本节中,演讲者解释了他们如何通过查看每个帧的时间标记并使用关键帧来插入滑动的位置来处理视频中的滑动。他们还回答了有关在 OpenCL 中进行分析的问题,指出时间戳取决于外部高分辨率计时器,而不是对 CL finish 的调用。此外,演讲者还讨论了 OpenCL 设备和运行时的执行顺序,并确认大多数设备的操作都是按顺序处理的。

  • 00:50:00 在本节中,演讲者探讨了 OpenCL 和 OpenGL 在处理算法时的差异。使用哪个平台的决定取决于个人喜好,尽管 OpenCL 由于其全面的语言结构可能更容易编程。在性能方面,OpenCL 可能允许处理需要更复杂硬件的应用程序;但是,在某些情况下,使用 OpenGL 着色可能会带来更好的性能。此外,虽然演讲者无法为特定应用提供任何可用的示例代码,但 AMD 的 OpenCL SDK 中有各种代码示例可供用户学习。

  • 00:55:00 在本节中,演讲者讨论了可供开发人员用于 OpenCL 应用程序的各种示例和 SDK。这些示例展示了如何查询设备和运行时以获得扩展,并提供了 OpenCL OpenGL 互操作的示例。但是,目前没有可用于视频中讨论的特定应用程序的示例代码,但这可能会在未来发生变化。网络研讨会现已结束,将向与会者提供录音。
 

AMD 开发人员中心:OpenCL 编程网络研讨会系列。 6. OpenCL 的设备裂变扩展



6 - OpenCL 的设备裂变扩展

在此视频中,演讲者涵盖了与 OpenCL 的设备裂变扩展相关的各种主题。他们解释了不同类型的扩展以及设备裂变如何允许将大型设备分成较小的设备,这对于为高优先级任务保留核心或确保将特定工作组分配给特定核心很有用。他们讨论了在并行化矢量推回操作、使用并行模式优化流程以及在 OpenCL 中创建本机内核时保留顺序语义的重要性。演讲者还演示了一个将设备裂变用于 OpenCL 的应用程序,并讨论了内存亲和力和设备裂变在其他设备上的未来。

  • 00:00:00 在本节中,演讲者讨论了 OpenCL 中的扩展,特别是三种不同类型的扩展:KHR 扩展、EXT 扩展和供应商扩展。 KHR 扩展由 OpenCL 工作组批准,并附带一组一致性测试。 EXT 扩展由至少两个工作组成员开发,不需要一致性测试。供应商扩展,如 CL_AMD_printf,由单一供应商开发,可能仅受该供应商支持。所有扩展的文档都可以在 Chronos OpenCL 注册网站上找到,从而实现跨供应商的透明度和可访问性。

  • 00:05:00 在本节中,演讲者提到了 OpenCL 的设备裂变扩展,称为设备视觉。此扩展允许用户将具有许多计算单元的大型设备分成较小的 OpenCL 设备,无论是按名称还是按内存关联。这种划分有助于为优先任务保留核心,或确保将特定工作组分配给特定核心,例如在基于 SMP 的系统中。演讲者通过基于 OpenCL 构建的并行算法和并行容器的示例来推动设备视觉的使用,并指出 AMD 和 IBM 目前在其 CPU 和 Cell Broadband 设备上支持此扩展。

  • 00:10:00 在本节中,演讲者讨论了在并行化向量回推操作时保留顺序语义的重要性。他们解释说,当在顺序循环中向向量中插入元素时,预期的顺序将作为循环的函数出现。然而,当并行化时,这个顺序丢失了,元素可以乱序插入,所以演讲者建议保留向量推回操作的顺序语义。然后他们给出了一个例子,说明这在 MPEG-2 流的简化版本等应用程序中是多么重要。他们最后介绍了一个 C 函数并讨论了如何在 CPU 上实现这些并行操作。
     
  • 00:15:00 在本节中,演讲者解释了如何使用并行模式来优化 OpenCL 流程的 Device Fission Extensions。他们使用管道模式并行执行功能,并引入一个数据块以从输入数据中读取,以处理本地内存中的一个工作项。该方法然后将邮箱的偏移量写入相应的工作组以计算偏移量,同时保留输出的顺序。排序是通过工作组之间的通信实现的,而不是依赖于可以按任意顺序执行的全局 ID。管道模式确保函数并行运行以优化流程。

  • 00:20:00 在本节中,演讲者讨论了他们的管道,以及他们现在如何使用术语“计数器”作为邮箱,因为他们已经超越了仅仅计算事物的范围。他们解释说,他们正在传递用于索引邮箱的组 ID,并使用本地和全局内存进行简单计算。但是,他们指出无法保证工作组的执行,并解释了这会如何导致死锁情况。为了解决这个问题,演讲者建议使用设备视觉将设备分成两个独立的核心,在每个核心上启动一个工作组,并保证进度。它们还介绍了 OpenCL 提供的用于在主机设备上运行的重要机制。

  • 00:25:00 在本节中,演讲者讨论了在 OpenCL 中使用本机内核的好处,它允许运行任意 C 或 C++ 函数。它可以在尝试不同的实现时提供更大的灵活性,以及调用标准 I/O 例程或 OpenCL 中可能不可用的其他库函数的能力。在 OpenCL 中创建本机内核的过程涉及传入命令队列和函数及其参数和内存对象。但是,必须谨慎使用线程本地存储,因为该函数可能不会在包含它的同一线程中执行。演讲者还介绍了 OpenCL C++ 绑定 API,它在 C API 之上提供了一些抽象。该程序首先查询可用平台并创建上下文和设备类型。

  • 00:30:00 在本节中,演讲者讨论了 OpenCL 设备裂变扩展的使用。一旦查询到一个有效的设备,就会返回一个设备列表,并选择第一个设备来支持设备裂变。 Device fission 是 OpenCL API 的新功能,需要扩展机制,允许描述分区。他们平均使用分区将其分区为一个单元的设备。然后设置子设备属性,并调用创建子设备函数。假设至少创建了一个子设备,创建了邮箱,并为每个设备创建了一个命令队列。生成的设备与任何其他设备完全一样,可以与现有库互换使用。然后演讲者开始设置原生 OpenCL 内核。

  • 00:35:00 在本节中,演讲者讨论了为 OpenCL 实施 Device Fission 扩展所需的输入和参数。演讲者解释说,输入的内存缓冲区将分为四个部分,FN c 运行时将在其中放置指针。内存缓冲区将由邮箱、块和缓存事务组成,并且将为每个内核生成唯一的 ID。演讲者进一步解释说,内核的每个实例都将在单独的设备上运行,一旦所有事件完成,数据将被写入并插入填充。内核本身将包括与阻塞和缓存相关的优化,以确保高效执行。

  • 00:40:00 在本节中,演讲者讨论了利用 OpenCL 设备裂变的应用程序的实施。他们解释了应用程序如何使用各种类型(例如输入/输出、邮箱、本地块数组、块大小和组 ID)来并行索引数据集。该应用程序还实现了简单的忙等待和阻塞优化,以确保所有内容都尽可能并行执行。通过利用设备裂变,该应用程序的实施展示了在几乎没有或没有 ALU 操作的情况下在 CPU 上实现加速的潜力,这可能会随着未来更广泛的矢量的实施而进一步增加。演讲者还讨论了设备裂变的其他应用和用例,例如关于无限和 Numa 空间系统的划分。

  • 00:45:00 在本节中,演讲者讨论了 OpenCL 中内存亲和性的优势,它允许将缓冲区与特定设备精确关联。通过避免争用和负共享,这可以导致更好的缓存局部性和改进的性能。 OpenCL 中使用的邮箱方案可以扩展以支持多次迭代,允许循环一次又一次地启动瀑布流水线。演讲者还提到了 developer.amd.com 上 OpenCL 专区资源的可用性,感兴趣的各方可以在其中找到有关 OpenCL 的更多信息,包括网络研讨会、过去的演示以及即将举行的异构计算峰会。演讲者还暗示了未来在 GPU 上支持设备裂变的可能性,为高优先级的任务预留一部分核心,保证更好的性能。

  • 00:50:00 在视频的这一部分,演讲者讨论了设备裂变转向其他设备的未来。目前,只有 AMD 和 IBM 支持 OpenCL 的设备裂变扩展,但其他供应商已对该提案表现出兴趣。提出了关于是否支持 BLAS 和 FFT 等数学库的问题,并且发言人确认他们正在研究 BLAS 的 OpenCL 实现以及线性代数的不同变体和实现,这些将在 FFT 风格的库中呈现。
 

AMD 开发人员中心:OpenCL 编程网络研讨会系列。 7.平滑粒子流体力学




7 - 平滑粒子流体力学

该视频讨论了平滑粒子流体动力学 (SPH),这是一种求解流体动力学方程的技术,特别是纳维-斯托克斯方程。该视频解释了方程中的不同项,包括密度、压力和粘度项,以及如何使用平滑核对它们进行近似。还讨论了用于 SPH 的数值算法,以及空间索引和互操作的使用。演讲者解释了构建空间索引和邻域地图的过程以及物理计算的方式。该视频邀请观众下载和使用该程序,并讨论了模拟的局限性。然后,演讲者回答听众关于 GPU 性能、不可压缩行为和使用缓存图像的问题。

  • 00:00:00 在本节中,AMD 高级技术人员 Alan Hierich 概述了计算流体动力学,特别是光滑粒子流体动力学 (SPH)。 SPH 最初用于天体物理学计算,但它在视频游戏和模拟中变得相当流行。该技术用于求解 Navier-Stokes 方程,这些方程是 1900 年代制定的偏微分方程,是当今大多数流体动力学工作的基础。艾伦解释了流体的定义,并直观地解释了它们的工作原理,重点是液体和气体。他还概述了流体通常由 Navier-Stokes 方程描述,不可压缩的 Navier-Stokes 方程适用于正常速度和正常温度下的水等流体。

  • 00:05:00 在本节中,演讲者解释了控制流体的方程,即纳维-斯托克斯方程。运动方程将速度的变化表示为重力、压力和粘度的函数,而质量连续性方程表明质量既不会产生也不会消失。支配流体的现象是重力、压力和速度,而粘度是流体的粘性,它决定了流体粒子沿同一方向运动的可能性。还讨论了对流加速项,它描述了流体通过较小开口(例如花园软管上的喷嘴)时的加速度。演讲者邀请听众下载并试玩演示的模拟盒子中液体的程序。

  • 00:10:00 在本节中,演讲者解释了流体动力学运动方程中的不同术语,包括对流加速度、压力梯度和粘度。压力定义为流体在某一点的实际密度与静止密度之间的差值。粘度项是运动方程式右侧的最后一项,它扩散系统的动量,最终导致所有位置的速度都相等的状态。还有一个质量连续性方程,del dot V 等于 0,这意味着在不可压缩方程中既不产生也不破坏质量。最后,为了表示系统的动力学,扬声器采用方程的物质导数来获得粒子的运动方程。

  • 00:15:00 在本节中,视频讨论了用于求解上一节中介绍的简化不可压缩 Navier-Stokes 方程的平滑粒子流体动力学 (SPH) 技术。 SPH 技术于 1992 年首次引入,用于研究天体物理学和星系,但也可用于流体方程。它涉及引入数量的平滑核表示,这些表示类似于基函数,允许我们通过将附近点的数量乘以加权函数的总和来近似任何数量。 SPH 技术用于近似 Navier-Stokes 方程中的密度和压力梯度项。该视频还提到 Navier-Stokes 方程在数值上对比例敏感,并且在扩展到常规空间比例之前在较小的比例下进行计算,以便在空间中四处移动粒子。

  • 00:20:00 在本节中,演讲者解释了平滑粒子流体动力学 (SPH) 中近似的三个主要项,即密度、压力和粘度项。为了计算密度,程序计算了不同点处的粒子质量,并将其乘以平滑核的梯度。然后使用压力除以密度的标量计算压力项,密度乘以平滑核的梯度。另一方面,粘度项是使用确定流体粘度水平的标量系数和两点之间的速度差除以点 J 的密度来近似的。演讲者还解释了平滑内核的属性,即用于 SPH 模拟,以及它如何在半径为 H 的球体上求和。

  • 00:25:00 在本节中,演讲者讨论了用于平滑粒子流体动力学 (SPH) 的数值算法。该算法涉及计算密度、压力、压力梯度、粘性项和加速度,然后将其用于对粒子的速度和位置进行时间步长。演讲者解释说,初始算法涉及测试所有粒子对所有粒子的相互作用,这是正确的,但速度不够快。因此,引入了一种更好的算法,将空间划分为体素,只允许与相互作用半径内的粒子相互作用。此外,随机选择一个粒子子集来计算相互作用,而不是考虑所有粒子,从而产生一个高效的程序。

  • 00:30:00 在本节中,演讲者讨论了在 OpenCL 模拟中使用空间索引仅计算与有限数量粒子的交互,以及使用 Interop 与图形系统共享数据缓冲区的重要性。虽然 Interop 允许直接从 GPU 缓冲区进行渲染并节省图形内存空间,但如果没有它,程序将不得不将数据复制到主机内存并返回,从而显着降低模拟速度。演讲者解释了使用 Interop 所需的修改,包括创建不同的上下文,并介绍了模拟所需的缓冲区集,包括用于排序的粒子索引。尽管讨论了 Interop 的重要性,但显示的程序并未使用它,这会减慢模拟速度。

  • 00:35:00 在本节中,演讲者讨论了平滑粒子流体动力学算法中使用的各种内核。第一个内核是“散列粒子”,它将粒子与体素相关联。然后,“排序”和“排序后传递”内核将粒子分类为体素,并组织它们用于空间索引构建。接下来,“index”和“index post pass”内核构建从体素到粒子的空间索引。之后,“好邻居”内核决定哪些邻居将相互交互。最后,“计算密度压力”、“计算加速度”和“积分”内核计算粒子之间的相互作用和物理。演讲者解释说基数排序在GPU版本的代码中使用,而Q排序在CPU版本的代码中使用。

  • 00:40:00 在本节中,视频解释了在平滑粒子流体动力学 (SPH) 中构建从体素到粒子的空间索引的过程。内核使用二进制搜索来识别每个体素中编号最低的粒子,并在不包含粒子的体素中保留负值 1。索引后处理然后通过复制网格单元索引中下一个非空体素的值来填充空体素的索引值。索引完成后,程序会通过搜索每个粒子周围 2×2×2 体素的局部区域来构建邻域图。为了消除偏差,程序会在每个体素中生成一个随机偏移量并交替搜索方向。然后内核选择交互半径内的前 32 个粒子并将它们添加到邻域图中。

  • 00:45:00 在本节中,演讲者解释了他们如何通过构建邻域图来计算物理,这使得它们可以与 32 个粒子相互作用。他们遍历用于近似密度和压力的方程式,计算加速度项,然后将所有内容结合起来以确定总加速度。然后通过数值积分推进速度和位置,并设置边界条件以防止粒子逃离盒子。演讲者鼓励观众下载并使用源代码,并强调虽然求解 Navier-Stokes 方程有很多慢的方法,但慢并不一定意味着好。

  • 00:50:00 在视频的这一部分,演讲者解释了模拟的更新步骤,其中在更新位置之前将速度集成到其新位置。速度的更新是显式的,而位置的更新是半隐式的,使用下一时间步的速度值。出于性能目的,模拟是浮动的,但如果需要高保真度和准确性,建议使用双精度。该算法是完全可并行化的,但需要考虑空间分区的权衡。最后,演讲者回答了有关在多个 GPU 上使用 Interop、模拟湍流以及模拟中实际最大粒子数的问题。

  • 00:55:00 在这一部分,演讲者回答了听众的一些问题。他们解释说,他们模拟的实际限制是性能速率,这取决于所使用的 GPU 和 CPU 的类别。他们还提到,尽管他们的模拟基于不可压缩方程,但他们并未明确求解不可压缩条件,这可能会限制其可压缩行为。演讲者还回答了一个关于为什么他们使用缓冲区而不是缓存图像内存的问题,并指出在他们开发程序时,他们没有看到使用缓存图像有任何性能优势。然而,他们提到 OpenCL 将在未来提供对缓存缓冲区的支持,并且他们可能会更改程序以支持它们。总的来说,演讲者邀请听众以他们想要的任何方式下载和使用该程序,因为它没有任何限制。
 

AMD 开发人员中心:OpenCL 编程网络研讨会系列。 8.优化技术:图像卷积



8 - 优化技术:图像卷积

在此视频中,Udeepta D. Bordoloi 讨论了图像卷积中的优化技术。

 

AMD Developer Inside Track:如何优化图像卷积



如何优化图像卷积

本视频讨论了优化图像卷积的各种方法,包括使用局部数据共享、优化常量以及使用更大的局部区域来提高效率。演讲者强调了最小化图像卷积处理时间以提高整体性能的重要性,并强调了一种使用本地内存重用数据的新方法。该视频提供了优化步骤的建议,例如使用明显或纹理、使用思维力以及使用传递选项到柜台。开发人员 AMD 网站上提供了有关优化图像卷积技术的分步文章。

  • 00:00:00 在本节中,来自 AMD 图形团队的 Udeepta Bordolo 解释了图像卷积的概念,它涉及对输入图像的一个区域进行加权求和以生成输出图像像素。他使用 OpenCL 和 5870 GPU 进行优化,从基本的相关代码开始逐步优化。镜像和使用 LDS(本地数据共享)是使用的一些优化方法,可显着减少执行时间。

  • 00:05:00 在本节中,演讲者讨论了适用于所有过滤器尺寸和所有输入尺寸的程序中图像卷积的优化。他专注于利用本地区域来改善数据共享并减少等待时间。通过将常量和输入解释为 128 位值,编译器和精灵可以更轻松地解释代码并减少处理时间。他展示了优化常数和使用更大的局部区域如何极大地提高图像卷积的效率。总的来说,演讲者强调了寻找方法来最小化图像卷积处理时间以提高整体性能的重要性。
     
  • 00:10:00 在本节中,演讲者讨论了如何通过确定滤波器大小来优化图像卷积,以及如何针对不同的蒙版更改它。演讲者指出,在不同时间应用优化会影响性能,但它可以帮助发现任何意外问题。演讲者还讨论了使用全力数据为 2k x 2k 输入图像运行相同数量的元素,从而产生更高效的数据格式。此外,演讲者强调了一种通过使用本地内存(在硬件中称为 LDS)来重用数据而不是使用电机的新方法。

  • 00:15:00 在本节中,演讲者讨论优化图像卷积技术。他们加载所有输入,将它们延迟特定组,然后处理显而易见的问题。他们使用他们所知道的现金并停止使用 LDS 来尝试使用纹理。他们用 2K x 2K 分辨率和不同的过滤器尺寸进行了实验,他们在使用纹理时获得了最快的数字。他们建议使用明显或纹理的优化步骤,使用思想力,以及使用传递选项到柜台。他们还建议尽可能使用现金怪物。他们在开发者 AMD 网站上发布了一篇关于优化图像卷积技术的分步文章,他们链接到视频旁边。
How to Optimize Image Convolution
How to Optimize Image Convolution
  • 2013.05.28
  • www.youtube.com
Udeepta Bordoloi, MTS Software Engineer in the Stream Computing Group Udeepta Bordoloi walks though several different ways to optimize an image convolution a...
 

AMD 开发人员中心:OpenCL 技术概述。 OpenCL 简介



AMD 开发人员中心:OpenCL 技术概述。 OpenCL 简介

在本视频中,Michael Houston 概述了 OpenCL,OpenCL 是针对多核 CPU、移动设备和其他形式的硅的数据并行计算的行业标准。 OpenCL 旨在统一以前竞争的专有实现,例如 CUDA 和 Brook+,这将简化独立软件供应商的开发。它提供了在设备上运行的代码和使用专为游戏开发人员提供反馈而设计的排队系统管理设备的代码之间的细分。 OpenCL 旨在与图形 API 协同工作,创建一种无处不在的计算语言,可用于照片和视频编辑等各种应用程序,以及人工智能系统、建模和物理学。主持人还讨论了 OpenCL 在好莱坞渲染中的使用,并希望看到更多这方面的工作。

  • 00:00:00 在本节中,Mike Houston 解释了 OpenCL 作为数据并行计算行业标准的目的,目标是多核 CPU、移动设备和其他形式的硅。 OpenCL 旨在统一以前相互竞争的专有实现,例如 CUDA 和 Brook+,这将简化独立软件供应商的开发。尽管 OpenCL 存在不同的方言和细微差别,但从其他数据并行语言(如 CUDA)过渡是直接且快速的。 OpenCL 还提供了在设备上运行的代码和使用专为游戏开发人员提供反馈而设计的排队系统管理设备的代码之间的细分。它旨在与图形 API 配合使用,为照片和视频编辑等应用程序中的消费者空间创建一种无处不在的计算语言。

  • 00:05:00 在本节中,演讲者解释了 OpenCL 的一些初始用途,包括处理图像或高分辨率视频以及运行病毒扫描程序。此外,该技术还可用于人工智能系统、建模系统、物理、后处理以及加速电影的照明和渲染。演讲者希望看到更多关于将 OpenCL 用于好莱坞渲染等方面的工作。
Introduction to OpenCL
Introduction to OpenCL
  • 2013.05.29
  • www.youtube.com
Michael Houston, GPG System Architect Learn about OpenCL, what the transition to OpenCL will be like, what applications are ideal for OpenCL and what impact ...
 

AMD 开发人员中心:第 1 集:什么是 OpenCL™?



AMD 开发人员中心:第 1 集:什么是 OpenCL™?

该视频介绍了 OpenCL 及其设计目标,其重点是利用各种处理器来加速并行计算而不是顺序计算。 OpenCL 支持使用内核、全局和局部维度以及工作组为不同处理器编写可移植代码。工作项和工作组可以通过共享资源进行协作,但不同工作组中的工作项之间不能同步。最佳问题维度因不同类型的处理而异,选择最佳维度以获得最佳性能很重要。 OpenCL 可以通过使用 OpenCL 事件模型一起表达任务和数据并行性来充分利用系统的功能。

  • 00:00:00 在本节中,Justin Hensley 讨论了 OpenCL 的基础知识及其设计目标,主要侧重于利用 CPU、GPU 或任何其他处理器(例如单元宽带引擎或 DSP)来加速并行计算,而不是连续的,导致显着的加速。 OpenCL 允许编写可移植代码以在任何处理器类型(例如 AMD CPU 和 GPU)上运行,使用类似于用于利用并行性的 C 函数的内核,以及作为内核和其他函数集合的程序,应用程序执行内核实例使用按顺序或乱序排队和执行的队列。 OpenCL 中的全局和局部维度定义了计算范围,而 OpenCL 的重点是使用高度并行的设备来同时加速计算,允许本地工作组通过共享资源来协作,因为全局工作项必须是独立的,只有同步才有可能在一个工作组内。

  • 00:05:00 在本节中,我们将了解工作项和工作组,以及 OpenCL 如何允许我们使用屏障或内存栅栏在工作组内的工作项之间进行同步。但是,不同工作组中的工作项不能相互同步。最佳问题维度也因不同类型的处理而异,重要的是为给定问题选择最佳维度以获得最佳性能。在 OpenCL 中,还可以通过使用 OpenCL 事件模型将单个工作项作为任务执行来表达任务并行性。通过允许任务和数据并行工作,OpenCL 可以充分利用系统的能力。
Episode 1: What is OpenCL™?
Episode 1: What is OpenCL™?
  • 2013.05.27
  • www.youtube.com
In this video, you learn what OpenCL™ is and why it was designed the way itis. We go through design goals and the execution model of OpenCL™. Topicscovered i...