交易中的OpenCL - 页 5

 

6. 超标量和 VLIW



6. 超标量和 VLIW

该视频探讨了处理器如何使用超标量执行来检测和提取二进制指令之间的并行性以提高性能。它讨论了控制逻辑在识别指令可以同时运行的实例中的重要性,例如它们之间缺乏依赖性。该视频还介绍了处理器设计的两个示例,超标量和 VLIW,后者将检测依赖关系的责任转移给编译器,生成并行执行的长指令字。虽然 VLIW 减少了运行时检查,但长指令字中未使用的点仍然会导致执行单元中的浪费。

  • 00:00:00 在本节中,视频解释了处理器如何利用超标量执行来提高二进制指令程序的整体性能。程序员依靠设计良好的处理器来正确执行他们的程序,因此处理器有责任识别指令并从指令中提取并行性以提高性能。该视频提供了指令之间依赖关系图的示例,虽然某些指令之间存在依赖关系,但由于它们之间缺乏依赖关系,处理器可以同时执行其他指令。处理器内的控制逻辑的工作是识别这些实例并以最有效的方式执行指令以最大限度地提高性能。

  • 00:05:00 在本节中,视频讨论了处理器架构设计的两个示例 - 超标量和 VLIW。第一个示例展示了处理器如何检测指令之间的依赖关系并相应地安排它们以节省时间。该视频还强调了分支指令推测执行的可能性。第二个例子讨论了 VLIW 设计,它将检测依赖关系的责任转移给了编译器。编译器生成包含多条指令的长指令字,这些指令可以并行执行,从而简化处理器设计。

  • 00:10:00 在本节中,解释了超长指令字 (VLIW) 的概念。这允许将多条指令打包成一个长指令字,该指令字被一起取出和解码。 VLIW 将责任转移给编译器,以在程序运行之前发现同时执行指令的机会,并减少运行时检查的需要。然而,如果长指令字中有空位,执行单元仍可能会产生一些浪费。
Superscalar and VLIW
Superscalar and VLIW
  • 2020.05.22
  • www.youtube.com
This video introduces two types of processor architecture: Superscalar and Very Long Instruction Word (VLIW)
 

7. SIMD 和硬件多线程



7. SIMD 和硬件多线程

该视频介绍了两种解决并行挑战的方法:单指令多数据 (SIMD) 和硬件多线程 (SMT)。 SIMD 允许硬件指令在多个数据元素上并行执行,从而简化调度和解码逻辑。 SMT 通过同时运行独立的指令流来利用线程级并行性,需要额外的寄存器文件和谨慎的缓存共享。该视频还讨论了实现时间片线程调度,其中线程以循环方式轮流占用处理器的数据路径,减少延迟并允许多个线程同时访问计算单元和内存系统。最终,处理器可以根据需要容纳尽可能多的线程,尽管性能增益在单线程处理器上可能没有那么显着。

  • 00:00:00 在本节中,解释了单指令多数据 (SIMD) 的概念,其中硬件指令可用于并行执行对多个数据元素的操作。 SIMD 简化了调度和解码逻辑,因为只需要调度一条指令即可对数据的每个元素应用相同的操作。如果要解决的问题涉及大量数据并行性,则使用 SIMD 是有益的,否则,它可能不是有效的解决方案。此外,还解释了 SIMD 和向量计算的相似性,其中向量指令可用于分散在内存不同部分的数据以执行虚拟操作。

  • 00:05:00 在本节中,视频解释了如何使用硬件多线程或同步多线程 (SMT) 来利用线程级并行性。通过将多个程序或线程放在同一个处理器上,不同的指令流可以同时运行,如果它们彼此独立的话。硬件多线程对于大型机器和单 CPU 很有用,因为它允许从两个独立的线程中轻松提取指令。然而,这需要额外的寄存器文件并仔细考虑缓存如何在不同线程之间共享。

  • 00:10:00 在视频的这一部分,演示者讨论了如何通过实施时间片线程调度来保持算术逻辑单元 (ALU) 忙碌。这种方法允许线程以循环方式轮流占用处理器的数据路径,从而通过调度更多线程显着减少延迟。通过在等待停滞线程的同时执行下一条指令,此方法允许多个线程同时使用计算单元和内存系统。最终,结果是没有时间浪费,处理器可以根据需要容纳任意数量的线程。然而,单线程处理器在单线程处理器上的性能可能没有在多线程处理器上提高那么多。
SIMD and Hardware Multithreading
SIMD and Hardware Multithreading
  • 2020.05.23
  • www.youtube.com
This video introduces SIMD, Vector Processing and Hardware Multithreading
 

8. 多核处理器架构



8. 多核处理器架构

该视频解释了多核处理器的架构及其优势,例如多个内核独立运行并共享某些组件,而每个内核都有自己的管道和数据缓存。使用利用时间和空间局部性的多级缓存突出了缓存层次结构在弥合微处理器和内存访问之间的速度差距方面的重要性。该视频还涉及片上系统设计,它将不同的功能单元和接口组合到一个芯片中以降低成本和尺寸。总的来说,该视频对设计多核处理器所涉及的复杂性和权衡提供了有用的介绍。

  • 00:00:00 在本节中,我们将了解多核处理器及其相对于单核处理器的优势。多核处理器有多个内核,它们独立运行并共享一些组件,例如指令获取、解码和浮点调度程序。但是,每个核心都有自己的管道和自己的 1 级数据缓存。多核处理器需要缓存一致性协议来确保存储在每个缓存中的数据与主内存中的数据一致。片上系统是另一种设计选择,其中多个元素组合到同一芯片上的单个设备中以降低成本和外形尺寸。它有许多不同的专用功能单元和接口,通过 unship 互连连接到芯片的其余部分。

  • 00:05:00 在本节中,演讲者解释了多核处理器架构中缓存层次结构的概念。使用高速缓存的主要原因是弥合微处理器和内存访问之间的速度差距,它们以不同的频率运行并具有不同的存储能力。 1 级、2 级和 3 级缓存用于弥补差距,它们分别利用了在短时间内访问少量指令或数据或访问附近位置的时间和空间局部性。高速缓存使用块进行组织,这些块在内存级别之间移动,允许处理器利用时间和空间局部性。
Multicore Processor Architecture
Multicore Processor Architecture
  • 2020.05.23
  • www.youtube.com
A brief introduction of multicore processor architecture
 

9.GPU架构



9.GPU架构

加速处理单元 (APU) 是一种异构处理器,低功耗内核和 GPU 单元均位于同一芯片上。 GPU 有大量可以用指令调度的着色器核心,它们的缓存通常是非一致的,这使得它们的设计更简单,并且当许多核心同时运行时允许更高的性能。 AMD 和 Nvidia 利用小型计算单元支持同时对多条数据进行运算,并拥有大型寄存器文件以支持快速上下文切换。演讲者还解释了如何在 GPU 架构中管理控制流,尤其是在处理可能产生无效结果的分支指令时,但程序员无需过多担心这些问题,因为处理器供应商已经在硬件中提供了控制逻辑。总体而言,GPU 是现代市场上复杂工作负载的流行处理器,尤其是在 AI 和机器学习领域。

  • 00:00:00 在本节中,我们将了解加速处理单元 (APU),这是一种典型的异构处理器,由用于系统的通用计算、管理和配置的低功耗内核和 GPU 单元组成,都在同一个芯片上。 APU 具有典型的 x86 内核和两级缓存,而 GPU 内核则不同且不是 x86,较低的本地数据存储被视为私有内存。内存所有权在图中可见,显示了内存的位置、可访问性和大小,私有内存比本地内存小,比全局内存小得多。当前来自英特尔或 AMD 的笔记本电脑处理器通常具有少量通用内核、集成内存和片上图形处理单元。

  • 00:05:00 在本节中,我们将了解 GPU 架构及其在 AI 和机器学习领域的使用方式。 GPU 有大量处理器,称为着色器核心,可以使用指令进行调度。它们可以访问与通用处理器的内存子系统不同的高速 GPU 内存,并且它们的缓存通常是非一致的。 GPU 不使用缓存一致性协议来确保一致性,这使得设计更简单,并且在许多内核同时运行时可以实现更高的性能。总的来说,GPU 是现代市场上处理复杂工作负载的流行处理器。

  • 00:10:00 在本节中,我们将了解 AMD 和 Nvidia 如何利用具有 cmd 硬件的小型计算单元来支持同时对多条数据进行操作。两家供应商都有 16 个宽 cmd,他们可以将工作项分组到更大的组中,并根据芯片和配置参数将它们映射到不同的批次。此外,它们拥有大型寄存器文件以支持快速上下文切换,并且两家供应商都结合了自动一级缓存和用户管理的暂存器,后者在高带宽方面得到大力支持,以支持对各自私有存储器的快速操作。最后,我们简要介绍了控制流和用一条指令执行多个数据的概念,以及分支指令如何导致执行路径出现偏差,需要一种方法来最小化对无效数据执行的计算量。

  • 00:15:00 在本节中,演讲者解释了如何在 GPU 架构中管理控制流,尤其是在处理可能产生无效结果的分支指令时。为了处理这个问题,可以屏蔽 cmd 通道以丢弃一些计算,尽管这可能会损害性能。使用单指令多线程(SIMT)技术时我们需要解决的另一个问题是软件线程之间的分歧,如果管理不善,可能会浪费计算周期。幸运的是,OpenCL 程序员不需要太担心这些问题,因为处理器供应商已经在硬件中提供了控制逻辑。
GPU Architecture
GPU Architecture
  • 2020.05.23
  • www.youtube.com
This video introduces the internals of a Graphics Processing Unit (GPU), which can be an accelerator for general purpose computing, in addition to graphics p...
 

10. FPGA 内部结构


10. FPGA 内部结构

该视频讨论了现场可编程门阵列 (FPGA) 的架构和功能。 FPGA 具有可编程逻辑,允许对其重新编程以适应新功能,并可通过大量输入和输出 (I/O) 直接访问数据。 FPGA 中的查找表结构由多级多路复用器组成,可以对其进行编程以定义逻辑功能。 FPGA 使用可用于计数器、移位寄存器、状态机和 DSP 功能的可编程寄存器。芯片上的每个矩形块代表一个逻辑阵列块 (LAB),每个 LAB 包含十个自适应逻辑模块 (ALM)。 FPGA 用于消费设备、汽车、医疗仪器以及通信和广播等行业。

  • 00:00:00 在本节中,介绍了 FPGA 的基础知识,包括可以重新编程以适应新功能的可编程逻辑,以及通过大量 I/O 直接访问数据的功能。 FPGA 的优势在于它们可以方便地连接到存储器组件和协处理器,无需更换硬件即可更换功能,以及它们在消费设备、汽车、医疗仪器、通信和广播等行业中的普遍性。 FPGA 的体系结构包括可通过编程定义逻辑功能的查找表,以及其他重要部分,例如将在后续部分讨论的进位寄存器和自适应逻辑模块。

  • 00:05:00 在视频的这一部分,演示者解释了 FPGA 中查找表的结构,它由具有可选输入的多级多路复用器组成。查找表的输入可用于构建任意组合逻辑函数。然后视频讨论了可编程寄存器,它们是 FPGA 中用于计数器、移位寄存器、状态机和 DSP 功能的存储元件。这些寄存器具有通常由全局时钟驱动的时钟信号,并且可以反馈到查找表中。此外,该视频还解释了逻辑元件和自适应逻辑模块如何通过链信号连接
    和进位,以及寄存器的输入如何来自先前的逻辑元素。

  • 00:10:00 在本节中,我们将学习如何组织 FPGA 芯片内的逻辑元素。芯片上的每个矩形块代表一个逻辑阵列块 (LAB),每个 LAB 包含十个自适应逻辑模块 (ALM)。每个 ALM 都包含算术单元、本地互连和注册连接,以及专用资源和自适应查找表,用于灵活组织输入和特定输出生成。此外,我们有可以连接特定 LAB 的行和列互连,并且路由根据设备密度线性扩展。最后,我们拥有支持不同类型存储器结构的嵌入式存储器块,例如单端口或双端口 RAM、只读存储器或称为 eMLAB 的小片存储器结构。

  • 00:15:00 在本节中,我们将了解 FPGA 的不同功能,包括数字信号处理 (DSP) 块和输入/输出 (IO) 组件。 DSP 模块可用于实现信号处理功能,例如 FFT 变换和高性能乘法和累加运算。 FPGA 还可以与各种 IO 组件通信,允许输出启用、控制和终止。 IO元件逻辑包括双向管脚和输出使能信号控制,输出路径通过时钟信号产生值A和B。另一方面,如果禁用输出控制,则输入信号通过输入寄存器。

  • 00:20:00 在关于 FPGA 内部结构的这一部分中,强调了时钟信号的重要性以及使用专用输入时钟引脚来支持 FPGA 操作。还讨论了高速收发器,这有助于在 FPGA 中实现更复杂的信号协议,而无需复杂的信号调节和处理。还解释了如何使用 PLL 生成不同的时钟信号以在整个设备中以最小的偏差使用,以及使用 SRAM 单元技术和查找表来配置控制输入和输出信号连接的可编程位。该视频还介绍了使用外部 W prom、Cpl D 或 CPU 控制编程序列对 FPGA 进行编程的方法,以及使用特殊的硬件 JTAG 连接进行进一步诊断和调试的方法。

  • 00:25:00 在本节中,将讨论现场可编程门阵列 (FPGA) 的设计和功能。 FPGA 中的大部分区域是逻辑阵列块,可以通过行和列互连进行连接。其他模块包括 PR、收发器和可以连接到不同内存组件的内存控制器。以一个PJ面积10g X FPGA为例,有100万个逻辑单元,170万个寄存器,54000个22位内存块,1518个DSP块,367.4Gbps收发器,两个硬PCIe块,492个通用IO引脚,以及12 个内存控制器。 FPGA的优势在于高密度创建复杂的功能,集成多种功能,接入不同的IO标准和特性,直接在一个芯片上访问数据。
FPGA Internals
FPGA Internals
  • 2020.04.18
  • www.youtube.com
The internal architecture of FPGA
 

11. GPU 系统上的 OpenCL 内存



11. GPU 系统上的 OpenCL 内存

讲师解释了 OpenCL 内存到 AMD GPU 的映射以及 GPU 系统中的不同内存层。计算设备有一个命令处理器,用于管理计算单元的指令,计算单元用作具有多个 SIMD 通道、专用寄存器文件和专用内存的内核。内核程序旨在提供自主作业,使所有可用内核都得到利用并减少内存访问延迟。演讲者还提到算术强度的概念,它指的是计算和内存轴移动之间的比率,以及应该如何高以避免GPU的内存带宽成为限制因素。

  • 00:00:00 在本节中,演讲者讨论了与不同处理器的硬件架构相关的 OpenCL,特别是 AMD GPU。该图显示了全局内存、常量内存和本地内存,左侧的内核代表设计数据并行程序时使用的 OpenCL 内核。每个工作组根据数据执行计算的一个子集,本地内存对工作组来说是本地的,并与处理器内的执行单元共享。工作组中的工作项是实际执行的计算,每个都有自己的数据集。

  • 00:05:00 在本节中,讲师讨论了 OpenCL 内存如何映射到 AMD GPU 以及 GPU 系统上的不同内存级别。计算设备有一个命令处理器,可以将指令调度到计算单元,计算单元具有一级缓存并共享一些二级缓存,并连接到全局内存。计算机单元作为核心,具有多个 SIMD 通道和私有寄存器文件,称为 GPR,构成私有内存。内核程序应提供独立的工作片段,这些工作片段应尽可能多以使所有可用内核忙碌,并且这些片段应允许硬件上下文切换以最大程度地减少内存访问延迟。内核还应具有较高的运算强度,以有效利用硬件。

  • 00:10:00 在本节中,演讲者讨论了浪漫强度的概念,它本质上是计算和记忆轴运动之间的比率。目标是让数学运算尽可能高地访问内存,以避免受到内存带宽的限制。
OpenCL Memory on a GPU System
OpenCL Memory on a GPU System
  • 2020.05.23
  • www.youtube.com
This lecture introduces how OpenCL memory model is mapped to a GPU based system.
 

12. OpenCL 示例:矩阵乘法



12. OpenCL 示例:矩阵乘法

该视频介绍了矩阵乘法作为 OpenCL 编程的示例。演讲者演示了如何编写 C 代码来创建可以遍历矩阵行和列的独立循环。讨论了工作项以及如何将它们映射到 OpenCL 中的矩阵元素。解释了内核实现,包括内核函数参数、调用方式及其主体。演讲者展示了如何使用行号和索引号将输入矩阵存储到一维数组中以计算索引。最终,内核函数计算点积以生成输出矩阵中的元素。强调了在物理内存中存储矩阵的线性方法。

  • 00:00:00 在本节中,我们以 OpenCL 编程为例了解矩阵乘法。矩阵乘法是一个经典的幂计算示例,已用于许多不同的应用程序。该实现需要嵌套循环,要求矩阵 A 的列数必须等于矩阵 B 的行数。这是因为矩阵 C 中的每个结果元素都是 A 的行向量的点积具有 B 的列向量。我们了解如何编写 C 代码来实现操作以及循环如何独立工作,从而允许我们以随机方式遍历结果矩阵 C 的每一行或每一列。

  • 00:05:00 在本节中,介绍了工作项的概念,并解释了如何将工作项映射到 OpenCL 中的矩阵元素。可以为要独立计算的矩阵的每个输出元素创建工作项,因此可以将它们映射到二维范围工作项。还讨论了 OpenCL 中矩阵乘法的内核实现,其中解释了内核函数的参数以及如何从主函数调用它,并介绍了内核函数的主体。核函数计算行向量和列向量的点积,以计算输出矩阵的每个元素。

  • 00:10:00 在本节中,演讲者解释了使用 OpenCL 编程语言进行矩阵相乘的过程。主要思想是将二维输入矩阵存储到一维数组中,使用行号和索引号计算出正确的索引,找到正确的元素进行点积运算。核函数将sum变量初始化为0,遍历A的行向量和B的列向量进行点积,最终将结果赋值到C中对应的元素中。这些步骤说明了如何使用行号和列号来计算以线性方式计算索引,这对于将矩阵存储在物理内存中至关重要。
OpenCL Example: Matrix Multiplication
OpenCL Example: Matrix Multiplication
  • 2020.06.05
  • www.youtube.com
This video explains how to do matrix multiplication in OpenCL. Note the thinking process to break a large problem into smaller partitions, and compute the sm...
 

13. OpenCL 程序的结构(第 1 部分)



13. OpenCL 程序的结构(第 1 部分)

在视频“OpenCL 程序的结构(第 1 部分)”中,解释了构建 OpenCL 应用程序的过程。该程序必须首先查询 OpenCL 平台以了解其资源并创建 OpenCL 上下文和命令队列。然后创建缓冲区用于主机和设备内存之间的数据交换,并将内核程序编译成二进制文件以在设备上执行。该视频继续解释如何创建只读和只写缓冲区、为输出矩阵分配空间以及将结果复制回主机。强调了检查 API 调用是否成功执行的重要性。

  • 00:00:00 在本节中,演讲者解释了构建 OpenCL 应用程序的步骤。首先,程序需要查询 OpenCL 平台以了解平台上可用的资源,然后创建 OpenCL 上下文和命令队列,这对于缓冲区操作和内核启动至关重要。然后创建缓冲区以在主机和设备内存之间交换数据。在此之后,内核程序需要编译成二进制文件,可以在 FPGA 或 GPU 上的加速器设备上执行。编译过程因设备而异。

  • 00:05:00 在本节中,视频讨论了如何设置环境以创建平台和设备、创建上下文以及为 OpenCL 编程创建命令队列。这涉及获取平台 ID,它允许程序员确定可用平台的数量并分配存储空间。该视频继续解释如何在平台内选择设备、获取有关所选设备的信息、设置适当的参数以及将这些参数的值传递给内核函数以实例化内核。最后,他们展示了如何在内核完成后将结果从设备复制回主机内存。

  • 00:10:00 在本节中,视频解释了如何创建 OpenCL 上下文以及上下文对象在将 OpenCL 操作所需的所有资源(例如命令队列和缓冲区)捆绑在一起时的重要性。文字记录概述了如何创建只读和只写缓冲区,以及如何使用 CL ink 和 CL in Q write buffer 命令在主机和设备之间复制数据。使用的示例是矩阵乘法,其中矩阵 A 和 B 是输入,矩阵 C 是输出。该视频强调了检查 API 调用是否成功的重要性。

  • 00:15:00 在本节中,演讲者解释了如何为输出矩阵 Matrix C 分配空间。他们说缓冲区 C 被声明为 CL 内存,这允许设备将结果写入其中。但是,这并不禁止从主机端读取此缓冲区,这是从设备检索结果并将生成的矩阵复制到主机中某处所必需的。演讲者展示了缓冲区 API 的完整定义,它有五个参数:上下文、标志、大小、主机指针和返回值。
Structure of an OpenCL Program (part1)
Structure of an OpenCL Program (part1)
  • 2020.06.05
  • www.youtube.com
This video describes the basic structure of an OpenCL program. (this is part1, a second part follows)
 

14. OpenCL 程序的结构(第 2 部分)



14. OpenCL 程序的结构(第 2 部分)

OpenCL 编程的第三步涉及内核编译,这对于 FPGA 设备来说是不同的,因为它是离线完成的。 CL create program with source和C TX用于创建程序,然后CL build program将程序构建成二进制。使用适当的入口点选择正确的内核函数,并且必须使用 CL set kernel argument 和正确的指针来初始化内核参数。演讲者详细介绍了如何在矩阵乘法中正确设置参数。然后,他们讨论了设置本地和全局工作组大小、执行内核以及使用 CL in queue buffer API 获取结果。最后,演讲者简要提到了 OpenCL 编程中的事件。

  • 00:00:00 在本节中,将讨论 OpenCL 程序的第三步,其中涉及内核编译。这个过程对于 FPGA 设备有点不同,因为编译是离线完成的。假设程序源代码存放在一个字符缓冲区中,CL create program with source和C TX用于创建程序,CL build program用于将程序编译成二进制。接下来,通过使用所选特定内核函数的适当入口点创建内核,从源代码中选择正确的内核函数。创建内核后,必须使用 CL set kernel argument 正确初始化内核参数,并使用指向实际值的指针。例如,在矩阵乘法中,必须正确设置七个参数,包括目标缓冲区、矩阵的大小和两个输入矩阵。

  • 00:05:00 在本节中,演讲者讨论了初始化多个内核参数并强调了正确设置这些参数的索引以避免错误的重要性。然后他们解释如何设置本地和全局工作组大小,指定组中工作项的数量和工作组的数量。最后,他们描述了执行内核的步骤,包括调用 OpenCL API 以及使用 CL in queue buffer API 将结果从设备获取到主机内存。演讲者还简要提到了事件以及如何在 OpenCL 编程中使用它们,但这将在以后的讲座中进一步讨论。
Structure of an OpenCL Program (part2)
Structure of an OpenCL Program (part2)
  • 2020.06.05
  • www.youtube.com
This video describe the basic structure of an OpenCL program. (continued from part 1)
 

15. OpenCL 矩阵乘法演示



15. OpenCL 矩阵乘法演示

“OpenCL 矩阵乘法演示”视频解释了使用 OpenCL 框架运行矩阵乘法示例的过程。它包括多个源代码文件,例如用于主机端的主 C 程序、内核程序和一个 makefile。该视频涵盖了 OpenCL 框架的不同方面,获取平台和设备 ID,创建 OpenCL 上下文、程序和内核对象,主机缓冲区管理,以及在设备上创建和初始化缓冲区。演示者还展示了一个执行点积运算的示例内核以及在 AMD Radeon pro 575 计算引擎上的最终结果演示。

  • 00:00:00在本节中,演讲者解释了如何通过 OpenCL 运行矩阵乘法示例。该示例由多个源代码文件组成,包括作为主机端程序的主 C 程序、名为 my kernel CL 的内核程序以及帮助编译项目的 makefile。主程序包括标准库、OpenCL 框架的宏定义、输入矩阵(矩阵 A 和矩阵 B)的声明以及设备名称、平台标识符和设备数量。演讲者还介绍了 OpenCL 框架的各个方面,例如上下文、程序、内核以及源代码阅读和编译。此外,演讲者还解释了平台和设备 ID 以及代码中矩阵维度的重要性。

  • 00:05:00在本节中,演讲者讨论了获取平台和设备 ID 以及为矩阵乘法演示创建 OpenCL 上下文的过程。他们解释了如何返回平台计数以及如何分配数组来存储平台 ID。它们还展示了如何获取所选特定类型的设备 ID 并查询其名称。该视频演示了如何为每个设备创建命令队列以及如何编译 OpenCL 程序。他们进一步解释了如何使用app open 打开内核源代码文件并编译程序。

  • 00:10:00在本节中,视频介绍了如何从 OpenCL 内核源代码创建程序对象。这个过程在不同的平台上是不同的。在具有本机 OpenCL 支持的 Mac OS 上,可以使用源代码创建程序对象。然而,在 Altera FPGA OpenCL SDK 上,创建程序对象涉及编译内核并使用 Altera 的特定 API 从编译的二进制结果创建它。创建程序对象后,视频将展示如何构建内核程序和创建内核对象。最后,视频进入主机端的缓冲区管理,分配一个缓冲区来存储生成的矩阵 C。

  • 00:15:00在本节中,演示者解释了如何使用 OpenCL 在设备端创建和初始化缓冲区以进行矩阵乘法。他们继续展示如何正确设置内核参数,包括设置全局和本地工作组大小。还强调了检查 CL 返回值的重要性。然后演示者演示如何将结果读取到主机内存,然后释放在主机和 OpenCL 上分配的资源。最后,他们展示了一个示例内核,它使用获取全局 ID 来遍历矩阵的宽度,执行点积运算,并将结果存储在矩阵 C 中的相应元素中。

  • 00:20:00在本节中,演讲者讨论构建主要 C 程序和 Mike Rinder CL 程序。要构建主机端程序,用户需要编译单个 C 程序文件,而对于内核,可以使用 GPU 编译器将 Micra know CL 编译为 GPU 二进制文件。在主机端和设备端构建程序后,用户将拥有一个名为“main”的可执行文件,以及可用于不同 GPU 版本的不同二进制文件。执行此文件后,演讲者展示了一个带有 AMD Radeon pro 575 计算引擎的 OpenCL 平台,该平台具有 C 矩阵的初始值,所有元素都包含八个点。
OpenCL Matrix Multiplication Demo
OpenCL Matrix Multiplication Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Matrix Multiplication.
原因: