交易中的OpenCL - 页 9

 

EECE.6540 异构计算(马萨诸塞大学洛厄尔分校)- 46. 基本 FPGA 概念



46. FPGA 基本概念

该视频涵盖了现场可编程门阵列 (FPGA) 的基本概念。与 CPU 不同,FPGA 可以通过编程来适应特定的硬件资源,这意味着它们是高度可定制的。该视频讨论了延迟在电路设计中的重要性,以及如何通过最大化 fmax 来平衡延迟。它引入了流水线设计的概念,以提高执行计算的频率,并讨论了电路中的数据路径和控制路径。最后,该视频讨论了 FPGA 中的电路占用以及减少气泡和增加占用如何增加 fmax。

  • 00:00:00 在本节中,我们将了解现场可编程门阵列 (FPGA) 的基本概念以及它们与其他处理器架构的区别。与 CPU 不同,FPGA 没有固定的数据路径,可以通过编程来适应特定的硬件资源,以适应不同数量的寄存器、计算逻辑及其连接,从而使其具有高度可定制性。 FPGA 包含各种组件,例如自适应逻辑、RAM 块、DSP 块和可编程路由开关,它们可以连接起来以实现不同的设计。此外,FPGA的最大工作频率由组合逻辑的物理传播延迟决定,这会影响电路的延迟和操作速度。

  • 00:05:00 在本节中,解释了延迟的概念及其在电路设计中的重要性。延迟是电路完成一个或多个操作所花费的时间,可以用时间或时钟周期来衡量。降低延迟通常是目标,但必须仔细平衡它与最大化 fmax。给出了针对延迟优化的设计和通过流水线使用针对 f max 优化的设计的示例。强调了流水线寄存器打破长的关键路径和提高速度的重要性。

  • 00:10:00 在本节中,视频解释了流水线设计的概念以及它如何提高执行计算的频率。通过使用流水线寄存器,可以缩短延迟,从而实现更高的时钟速度和吞吐量的增加。然后视频介绍了电路中数据路径和控制路径的概念,其中数据路径是执行计算的寄存器链和组合逻辑,而控制路径是控制电路操作的数据路径之外的所有其他内容.在握手流控制、循环控制、分支控制等控制路径中加入各种逻辑,并使用占用来定义电路中数据路径的初始化比例。

  • 00:15:00 在本节中,演讲者解释了 FPGA 中电路占用的概念。该电路有多个寄存器,其中一个是有效寄存器,用于确定输入数据是否有效。目标是通过最小化整个电路中的气泡来减少电路中的气泡以增加占用率。计算每个周期以查看资源的使用情况,电路中未占用的部分称为气泡。通过减少气泡和增加占用率,可以增加 f max 。
Basic FPGA concepts
Basic FPGA concepts
  • 2021.04.07
  • www.youtube.com
This video introduces basic concepts of FPGA and design for FPGA
 

47.设计分析(一):分析FPGA早期图像



47.设计分析(一):分析FPGA早期图像

视频的这一部分重点介绍了为 DPC++ 设计分析 FPGA 早期图像的过程。演讲者解释了所涉及的步骤,例如编译程序、生成 FPGA 二进制文件和运行分析。该视频包括如何生成报告和解释报告中提供的各种信息面板的演示。演讲者还分析了 b2 模块的 FPGA 早期图像,并讨论了各种逻辑块、循环、加载单元和展开因子。他们还讨论了内核函数的设计如何显着影响 FPGA 的内部设计,并提供了如何展开内部和外部循环以提高吞吐量的示例。这些示例说明了高级语言编程在影响 FPGA 硬件资源方面的灵活性。

  • 00:00:00 在这部分视频中,演讲者讨论了分析 DPC++ 设计的过程,特别侧重于分析 FPGA 早期图像。这涉及多个步骤,例如将程序编译到 FPGA 仿真器以确保功能正确性、生成 FPGA 二进制文件、在功能卡上执行它以及运行分析以确定运行时性能。第二阶段涉及生成报告并在必要时修改设计之前寻找瓶颈。该视频包括如何生成报告并在浏览器中分析它们的演示,并解释了如何解释报告中提供的各种信息面板和摘要。

  • 00:05:00 在本节中,演讲者概述了设计分析工具及其功能。他们解释了资源利用面板如何显示有关设计将使用的资源的信息,以及系统查看器面板如何允许用户查看设计的不同组件,例如内存组件和管道。系统查看器面板中的图形查看器显示了设计中使用的组件列表以及它们如何相互连接。演讲者还演示了用户如何放大各个模块以查看源代码中的相应部分。

  • 00:10:00 在本节中,演讲者分析了 b2 模块的 FPGA 早期图像,并讨论了构成设计的各种逻辑块和循环。他们还解释了使用加载单元从内存组件加载数据和展开因子以提高循环操作的效率。演讲者还比较了并行 4 和单任务设计,并建议对 FPGA 设计使用单任务来优化内存访问。

  • 00:15:00 在本节中,演讲者讨论了内核函数的设计如何显着影响 FPGA 的内部设计。演讲者举例说明了如何展开内循环和外循环以利用 FPGA 的硬件资源,从而提高吞吐量。这些示例说明了高级语言编程在影响 FPGA 硬件资源方面的灵活性。
Design Analysis (I): Analyze FPGA Early Images
Design Analysis (I): Analyze FPGA Early Images
  • 2021.04.07
  • www.youtube.com
This video introduce the design workflow and how to analyze the early image using DPC++ compiler report.
 

48. DPC++ FPGA设计分析(二):Runtime Profiling



48. DPC++ FPGA设计分析(二):Runtime Profiling

在此视频中,演示者讨论了使用工具分析程序运行时性能的过程,这些工具通过将分析仪器寄存器添加到 FPGA 比特流来收集性能数据。他们演示了如何使用带有用户添加的性能计数器的英特尔 FPGA 动态分析器来编译分析和解释集体分析结果。它们展示了 V2 分析器如何显示用于分析运行时分析结果的内核函数和可执行文件,以及如何识别分区瓶颈并对其进行优化。使用的例子是一个矩阵修改内核,它对全局内存有很多内存访问,通过使用本地内存进行优化,减少与全局内存的通信,提高设计效率。

  • 00:00:00 在本节中,演示者讨论了分析程序的运行时性能。他们解释了如何使用工具通过将分析仪器寄存器添加到 FPGA 比特流来收集性能数据。英特尔 FPGA 动态分析器与用户添加的性能计数器一起使用,以收集内核性能数据。性能数据在执行结束时存储在一个名为 profile.mall 的文件中,并生成一个 json 文件以允许 Intel v2 profiler 读取这些文件。将结果文件夹加载到英特尔 Retune 工具包时需要这两个文件。将数据加载到 v2 时,从目录导入数据很重要。

  • 00:05:00 在本节中,演示者演示了如何编译分析和解释集体分析结果。它们展示了 V2 分析器如何显示用于分析运行时分析结果的内核函数和可执行文件。该面板显示内存操作函数和循环操作、它们的时间、停顿百分比、占用率、空闲时间、活动百分比、数据传输大小和平均带宽。面板的底部更详细地显示了 FPGA 利用率和全局内存带宽占用的其他指标。通过显示详细的统计数据,设计人员可以了解各个内核及其功能,从而帮助他们优化和改进设计。

  • 00:10:00 在这部分视频中,演讲者讨论了如何识别分区瓶颈并对其进行优化。使用的示例是一个矩阵修改内核,它对全局内存有大量内存访问,导致 15.57GB 的数据传输。内核的设计是memory-bond,解决方案是通过使用local memory来优化内存访问,减少与global memory的通信,提高设计效率。这种优化将在下一讲中讨论。
DPC++ FPGA Design Analysis (II): Runtime Profiling
DPC++ FPGA Design Analysis (II): Runtime Profiling
  • 2021.04.07
  • www.youtube.com
This video introduces DPC++ profiling and how to analyze run-time profiling reports using Intel VTune tool.
 

EECE.6540 异构计算(马萨诸塞大学洛厄尔分校)- 49. OpenCL 示例



49. OpenCL 示例(一)

YouTube 视频“OpenCL 示例 (I)”介绍了在 C 编程中使用嵌套循环实现矩阵乘法及其作为 OpenCL 内核的实现。讲师解释了如何使用两级嵌套循环对矩阵中的结果元素进行点积计算,以及矩阵 C 的每个输出元素如何在 OpenCL 中被视为单独的工作项。该视频还介绍了为执行准备 OpenCL 内核所需的步骤,以及将结果矩阵从设备检索到主机,以及设置工作组大小和使用修改后的内核参数执行内核所需的步骤。此外,还提供了矩阵乘法的示例代码,演讲者演示了在 Mac OS 上获取设备和平台 ID 以及在不同平台上创建程序对象的过程。最后,视频解释了缓冲区管理、跟踪主机端分配的资源和使用的 OpenCL 资源,并提供了一个简单的乘法内核示例。

该视频涵盖了使用 OpenCL 的各种示例,包括矩阵乘法、图像旋转和图像过滤。对于图像旋转,演讲者解释了如何使用输入分解来分解问题,并演示了用于识别每个像素的原始位置和新位置的核函数。对于图像过滤,演讲者讨论了在设备端创建图像对象的概念以及使用 OpenCL 采样器来定义如何访问图像。他们还展示了带有两个嵌套 for 循环的图像卷积函数的示例实现。该视频最后演示了如何使用 OpenCL 对图像执行卷积滤波器并验证结果。

  • 00:00:00 在本节中,讲师介绍了经典计算示例矩阵乘法,并解释了如何在C 编程中通过嵌套循环来实现它。他们还解释了矩阵中结果元素的点积计算,即矩阵 A 的一行和矩阵 B 的列的乘积。讲座解释了两级嵌套循环可以独立执行并且可以执行以一种随机的方式。

  • 00:05:00 在本节中,讨论了工作项的概念以及如何应用它在 OpenCL 内核中实现矩阵乘法。矩阵 C 的每个输出元素都被视为一个单独的工作项,并且在 FPGA 或 GPU 处理元素的帮助下,二维范围的工作项可以映射到硬件实现中的其他 for 循环。为实现矩阵乘法,定义了一个名为“simple multiply”的内核函数和一个参数列表,它需要所有必要的输入矩阵及其维度。内核函数体使用全局 ID 计算工作项的二维位置并初始化求和以计算矩阵 C 的结果元素。

  • 00:10:00 在本节中,演讲者使用 OpenCL 编程框架解释矩阵乘法的核函数。内核函数利用点积运算和 for 循环遍历 a 的行向量和 B 的列向量的元素。使用行号和列号计算二维输入矩阵的索引以找到行向量和列向量中的右元素。一旦计算出点积,结果元素就会分配给 C 中的相应元素。还讨论了计算环境,它与平台相关,涉及了解平台中的可用资源和重要参数。

  • 00:15:00 在本节中,演讲者概述了准备 OpenCL 内核工作所需的步骤,首先是创建上下文和命令队列以实例化内核。然后,通过在主机端分配缓冲区、将数据从主机内存复制到设备内存并调度内核来准备输入数据。然后程序等待内核完成以通过读取设备内存来收集结果。 openCL 应用程序有两层:平台层和运行时层,内核程序必须编译成可以在加速器设备(FPGA 或 GPU)上执行的二进制文件。这些步骤因设备而异,PG 二进制文件的编译可能需要数小时,而 GPU 编译通常很快。

  • 00:20:00 在本节中,视频讨论了如何为 OpenCL 编程设置环境。第一步涉及获取平台 ID,这是通过 CL get platform IDs 函数完成的,该函数返回系统中可用的平台数。接下来,视频解释了如何根据用户偏好获取平台内的特定设备,以及如何创建 OpenCL 上下文,它是所有资源(如命令队列和缓冲区)的外壳。本教程建议检查返回值以确保操作成功。

  • 00:25:00 在本节中,视频介绍了如何通过声明缓冲区和使用 OpenCL API 函数从输入矩阵 B 和 C 以及输出矩阵 C 创建和移动数据。他们假设矩阵 A、B 和 C 已经声明为浮点型数组,并将数据存储在物理内存的线性地址空间中。该视频演示了如何使用 CL 创建缓冲区函数为矩阵 A 和 B 声明缓冲区,以及您编写的 CL Inc 缓冲区函数将初始数据从矩阵 A 和 B 复制到创建的缓冲区中,缓冲区位于设备上。下一步是为矩阵 C 分配空间,它被声明为 CL 内存只写缓冲区,因为设备将计算结果写入它。

  • 00:30:00 在 YouTube 视频“OpenCL 示例 (I)”的这一部分中,演讲者解释了从设备检索结果并将结果矩阵从缓冲区 C 复制到主机的过程。显示了 API C 定义,并解释了创建缓冲区的五个参数,包括上下文、标志、大小、主机指针和返回值。演讲者接着解释了 OpenCL 程序中的第三个主要步骤,即内核编译,使用 FPGA 设备的简单编译过程。该过程涉及创建和构建程序以及从源代码中选择正确的内核函数。最后,演讲者讨论了如何在运行内核程序之前使用 CL 设置内核参数 OpenCL API 来初始化内核参数。

  • 00:35:00 在本节中,演讲者讨论了在 OpenCL 程序中初始化内核参数、设置工作组大小、执行内核和获取结果的过程。用户必须使用“CL 创建内核”API 并使用指向实际值的指针指定内核参数的大小和值。演讲者强调了在复制和粘贴时准确设置参数索引并针对每一行修改它们的重要性。必须针对工作项和工作组的数量设置本地和全局工作组大小。最后,加入的 CL 缓冲区用于读取主机内存上的输出缓冲区,指示正确执行的同步要求。

  • 00:40:00 在本节中,演讲者介绍了一个使用 OpenCL 进行矩阵乘法的示例。矩阵乘法示例的源代码由几个文件组成,包括主机端程序、内核程序和帮助编译项目的 makefile。主机端程序用 C 语言编写,包括标准库和 OpenCL 框架的特定头文件。该示例包括输入矩阵和变量声明,包括平台和设备的数量、上下文、OpenCL 程序和 OpenCL 内核。演讲者还解释了如何编译内核源代码,并描述了输入矩阵的大小和生成的输出矩阵。

  • 00:45:00 在这部分视频中,演示者演示了如何在 Mac 操作系统上获取 OpenCL 的设备和平台 ID。通过调用获取平台 ID 和创建命令队列等各种 OpenCL 函数,演讲者创建 OpenCL 上下文并编译程序。他们还解释说,显示的代码同时支持 Mac OS 和 OpenCL SDK,如果在不同的平台上运行,将会报错。

  • 00:50:00 在本节中,视频演示了如何在不同平台上使用 OpenCL 创建程序对象。在 Mac OS 上,程序对象是从内核源代码文件创建的,而在 Altera FPGA OpenCL SDK 上,它是从编译生成的二进制文件创建的。一旦创建了程序对象,就可以构建内核程序,并可以从该程序对象中选择特定的内核函数。到本节结束时,必要的对象和函数已准备好用于程序的下一部分。

  • 00:55:00 在本节中,视频讨论了缓冲区管理过程,包括分配缓冲区来存储矩阵结果和使用 CL create buffer 在设备端创建缓冲区。该视频还强调了检查 Q 中 CL 的返回值和上校范围以确保成功执行的重要性,尤其是在使用 FPGA 时。此外,该视频还解释了通过打印出主机端分配的资源和使用的 OpenCL 资源来验证结果的过程,并提供了一个简单的乘法内核示例,其中使用七个参数通过迭代执行点积运算。

  • 01:00:00 在这部分视频中,演讲者解释了两个使用 OpenCL 的示例。第一个是矩阵乘法。该程序处理两个矩阵并将其对应的元素相乘以将结果存储在第三个矩阵中。第二个例子是图像旋转,其中程序根据某些公式旋转图像的像素。这些公式考虑了每个像素的原始坐标和新坐标以及旋转角度。

  • 01:05:00 在本节中,演讲者讨论了如何使用输入分解将图像旋转问题分解为更小的问题。他们解释说,图像的像素信息将通过 x 和 y 维度的独立计算被复制到一个新的位置。分配工作组以使用其全局 ID 计算每个像素的新位置。演讲者还详细介绍了如何确定工作项组和维度以及完成此操作所需的核函数。目标是为图像旋转计算创建一种更有效和可扩展的方法。

  • 01:10:00 在本节中,视频演示者解释了如何使用 OpenCL 旋转图像。核函数用于识别像素的原始位置,使用旋转参数计算像素的新位置,检查边界检查以确保新坐标落在原始图像大小内,并从原始位置复制像素信息到新位置。该代码还包括 OpenCL API 的 C++ 绑定以及查询平台、获取设备和声明缓冲区以将数据从主机内存移动到设备缓冲区的步骤。还创建了只读缓冲区以确保原始数据的安全性。

  • 01:15:00 在本节中,演讲者解释了使用 OpenCL 执行图像旋转所需的步骤。首先,必须将原始图像复制到图像缓冲区中。然后,通过初始化目标缓冲区并设置正确的内核参数(包括原始图片的尺寸和旋转参数)来编译和执行内核。内核以全局工作组大小和本地工作组大小执行。最后,使用 in Q 读缓冲区将结果读回主机。演讲者还演示了图像旋转的示例源代码,其中包括头文件、实用函数、平台和设备 ID、命令队列、程序和内核对象,以及原始图像和旋转图像的输入/输出缓冲区。

  • 01:20:00 在本节中,视频介绍了使用 OpenCL 旋转图像的过程。主机读取 BMP 格式的图像并将其转换为浮点数数组存储在输入图像缓冲区中。主机上的输出缓冲区是用随机数创建和初始化的。查询平台以查找平台上的设备并创建上下文和命令队列。创建程序和内核对象,并创建设备端缓冲区以存储原始图像和旋转图像。原始图像被复制到设备端的缓冲区,并设置内核参数。通过使用全局和本地工作组大小实例化内核来执行内核。检查返回值以确保内核成功运行。

  • 01:25:00 在本节中,演讲者概述了使用 OpenCL 的图像旋转。完成内核后,在设备端使用指向全局内存的指针将输出数据读回主机,并提供主机缓冲区用于存储图像。该过程涉及 BMP 格式化,一个名为 write BMP float 的实用函数用于创建一个显示结果的新 BMP 文件。详细描述了内核函数,其中目标和源缓冲区指针与图像尺寸和旋转参数一起传递。使用计算每个像素新坐标的公式,并在将像素信息从原始位置复制到新位置之前应用边界检查。该过程以将猫图像旋转 45 度的示例进行演示。

  • 01:30:00 在本节中,演讲者解释了使用 OpenCL 进行图像过滤的概念。他描述了使用 3x3 过滤器对相邻像素值进行乘法和求和以获得新的过滤像素值的过程。他还强调在处理边界附近的像素时要小心,这些像素具有较少的相邻像素以应用过滤器。然后,演讲者演示了不同类型的图像过滤器,这些过滤器可以使用 OpenCL 应用于原始图像。之后,他展示了图像卷积函数的示例实现,其中两个嵌套 for 循环遍历图像中的每个像素,第三个循环遍历过滤器中的元素。

  • 01:35:00 在这一节中,演讲者谈到了 OpenGL 中的图像数据结构,它是一种不透明类型,作为多维结构维护并用于图像数据类型。与整数或指针类型不同,图像不能通过设备中的点直接查看,它们的像素值可以指定为浮点值或整数值。在设备端创建图像对象允许 OpenCL 计算单元读取新像素并将新像素写入图像对象,这有利于特定于图像数据处理或图形处理器的长优化指令序列。演讲者还解释了如何通过使用 CL Write Image 和 CL Create Buffer 等 API 将图像和过滤器数据复制到设备来创建源图像缓冲区、输出图像对象和过滤器。

  • 01:40:00 在本节中,演示者介绍了 OpenCL 采样器的概念,它是用于描述如何访问图像的对象。采样器是使用 API 函数创建的,该函数将上下文作为参数并定义是否对坐标进行归一化。还定义了寻址模式,它处理图像坐标超出范围时的处理方式。过滤模式指定当坐标落在像素之间时需要应用的过滤器。还引入了一个名为卷积的核函数,它采用输入和输出 2D 图像对象、一个常量 float 过滤器来存储过滤器值,以及采样器对象。内核函数从图像对象中读取数据项并返回一个由四个浮点数组成的向量,以对图像数据进行运算。

  • 01:45:00 在本节中,演讲者解释了如何使用四元素浮点向量对浮点向量执行运算。它们经历了初始化过滤器索引、声明二元坐标变量、遍历过滤器行和计算二维坐标的过程。使用读取图像 F 函数从图像对象中读取像素,并与过滤器像素值相乘,更新后的值存储在输出图像中。最后,使用 CL 墨水读取图像功能读取图像。

  • 01:50:00 在本节中,讨论了 OpenCL 示例 (I) 的代码,它提供了用于图像处理的过滤器。该程序为每种类型的过滤器分配不同的大小和值,并使用辅助函数来初始化过滤器值并从文件中读取 BMP 图像数据。在创建输入和输出图像以及过滤器缓冲区之前执行平台和设备发现。初始化后,采样器会设置在使用适当的过滤器参数执行内核之前如何处理落在边界之外的像素。全局大小设置为图像中的列数和行数。

  • 01:55:00 在本节中,演讲者演示了使用 OpenCL 对图像执行卷积滤波的示例。该过程涉及设置一个内核来处理整个图像,并在一个数据维度的组中使用 8 x 8 个工作项的局部大小。输出图像存储在设备端,可以使用 CL 读取图像读回主机。然后将结果与通过在主机端执行过滤器生成的过滤参考图像进行比较。这两个图像在视觉上是相同的,验证了结果。最后,释放主机端和设备端的资源。
OpenCL Examples (I)
OpenCL Examples (I)
  • 2017.09.29
  • www.youtube.com
Lectures on OpenCL Examples (I)
 

用于大规模并行支持向量分类的 SYCL、OpenCL、CUDA 和 OpenMP 的比较 ( WOCL / SYCLcon 2022 )



用于大规模并行支持向量分类的 SYCL、OpenCL、CUDA 和 OpenMP 的比较

该视频比较了 SYCL、OpenCL、CUDA 和 OpenMP 在不同硬件平台上用于大规模并行支持向量机分类的性能。演讲者使用称为并行斐波那契的实现解释了矩阵向量乘法的并行化,它支持多 GPU 执行,但仅支持二进制分类和密集计算。用于测试的硬件包括 Nvidia A100 和 RTX 380 GPU、AMD Radeon Pro 7 GPU 和 Intel Core E9-10-09020X CPU。结果表明,CUDA 是 Nvidia GPU 最快的后端,而 OpenCL 是 CPU 最快的后端。 SYCL 是用户友好的,而 Hipsicle 比 DPC++ 和 OpenCL 更快,使用成本低。此外,演讲者还讨论了未来的工作,例如调查 FPGA 的性能、通过 MPI 添加对分布式系统的支持,以及使用混合精度计算和特殊的机器学习硬件,如 NVIDIA 的张量核心。

  • 00:00:00 在视频的这一部分,演讲者介绍了不同并行编程语言的比较,包括 SYCL、OpenCL、CUDA 和 OpenMP,重点介绍了它们在大规模并行支持向量机 (SVM) 分类中的用途多供应商硬件。演讲者介绍了支持向量机并概述了它在二元分类的监督机器学习中的用途。然而,传统的支持向量机存在以顺序方式解决凸二次规划问题的问题。为解决此问题,演讲者使用最小二乘支持向量机公式,将问题简化为求解线性方程组。演讲者还讨论了他们的库的实现细节,称为 Parallel Fibonacci。

  • 00:05:00 在本节中,演讲者解释了用现代 C++ 编写的 PLSS VM。使用单个模板参数,可以在单精度和双精度浮点类型之间切换。演讲者还谈到了 CG 算法中矩阵向量乘法的并行化,因为它是算法中计算量最大的部分。他们实现了四种不同的后端(OpenMP、CUDA、OpenCL、Signal)并支持多 GPU 执行。但是,目前只支持二分类和密集计算,不支持开箱即用的多分类。此外,OpenMP 后端与其他实现有很大不同,对于 GPU 后端(CUDA、OpenCL 和 SYCL),他们实现了一个 CG 并将其用于所有三个后端,以减少代码重复和潜在错误。

  • 00:10:00 在视频的这一部分中,解释了所使用的硬件和测试方法。重点是四个不同的平台,即 Nvidia A100 和 RTX 380 GPU、AMD Radeon Pro 7 GPU 和 Intel Core E9-10-09020X CPU,并讨论了这些平台的结果。检查了 Nvidia A100 和 RTX 380 GPU 的 N 点缩放以及 AMD Radeon Pro 7 GPU 的数据点和特征缩放,发现运行时间随着 NVIDIA 上数据点数量的增加而增加GPU。其中,Cuda 被发现是最快的后端,紧随其后的是 OpenCL,并且使用 N 站点计算生成的 roofline 模型表明,分层内核公式比 ND 范围的对应公式更受内存限制。总的来说,AMD 的运行时间比 NVIDIA 的多。

  • 00:15:00 在本节中,视频讨论了 SYCL、OpenCL、CUDA 和 OpenMP 在不同硬件平台上的性能比较。 Nvidia GPU 没有显示运行时间增加,最快的后端是 OpenCL。然而,AMD GPU 的性能比预期的要差,这可能是由于未对块大小进行微调。 Intel Core E9 CPU 具有与 Nvidia GPU 类似的行为,其中 OpenCL 是最快的后端。除了 OpenMP 更快的小数据集外,DPC++ 是最快的。 DPC++ 分层内核公式在所有硬件平台上都比其独立范围的对应版本慢,表明有优化的潜力。最后,OpenCL 欺骗编译开销在 Nvidia GPU 上最快,在 Intel Iris Xe Max GPU 上最慢,但通过内置缓存,可以在后续执行中减少开销。

  • 00:20:00 在这一部分的文字记录中,演示者讨论了他们针对来自不同供应商(例如 NVIDIA、AMD 和英特尔)的硬件的各种并行编程语言和框架的测试结果。他们指出,如果您只需要针对 NVIDIA GPU,CUDA 仍然是最佳选择,因为它在他们的测试中具有最快的性能。对于仅针对 CPU 的目标,OpenMP 是一个好的开始,尽管它在他们的测试中没有达到最佳性能。如果您需要针对不同的供应商硬件,建议使用 OpenCL 或 SYCL,但如果您从头开始实施新算法,SYCL 会更好,因为它对用户更友好。 Hipsicle 是廉价使用的最佳选择,并且比 GPU 上的 DPC++ 和 OpenCL 更快,他们计划优化他们的 OpenMP 后端,并在未来研究其他信号实现,如 ComputeCPP。

  • 00:25:00 在本节中,演讲者通过讨论未来的工作以及使用各种并行计算框架对其支持向量分类实施的改进来结束视频。他们计划研究 FPGA 等不同硬件的性能,通过 MPI 添加对分布式系统的支持,并探索使用混合精度计算和特殊机器学习硬件(如 NVIDIA 的张量核心)的影响。他们相信这些改进将提高在更大数据集上实施的速度和效率。
2022 Conference Program
2022 Conference Program
  • 2022.05.22
  • Tim Lewis
  • www.iwocl.org
OpenCL allows a programmer to offload a sequence of commands to a heterogeneous accelerator, such as a GPU. For embedded devices the overhead of building a command sequence can be expensive, and many applications require the same pipeline of commands to be repeatedly enqueued in a loop. For example, in computer vision where the same command...
 

使用 libclcxx 在 OpenCL 内核中实现更丰富的 C++ ( WOCL / SYCLcon 2022 )



使用 libclcxx 在 OpenCL 内核中实现更丰富的 C++

该视频讨论了如何使用 libclcxx 将 C++ 库集成到开源内核开发中。该项目集成了类型特征,这是 C++ 元编程的基本库,目的是向开发人员公开更多 C++ 功能。该视频展示了类型特征库如何通过其处理地址空间和矢量类型的能力来优化 OpenCL 内核的性能。该视频鼓励开发人员尝试使用该库,并为缩短开发周期做出贡献,同时获得与 C++ 的最大兼容性。该库以与 C++ 参考页面类似的风格提供氧气文档,使开发人员可以轻松浏览新功能。

  • 00:00:00 在本节中,Anastasia 的 Stulova 讨论了使用 lipclcxx 来支持在开源内核开发中使用 C++ 库。虽然用于 OpenCL 内核语言的 C++ 具有 C++ 功能,但它缺乏库支持,因此解决所存在的限制非常重要。因此,创建了 leap clcxx 项目,集成了 lipcxcxx,目标是向开源内核开发人员公开更多 C++ 功能。此外,Tulva 认为 typetraits 是一个必不可少的库,可以促进 C++ 中的完全元编程,并扩展命名空间 std 为现有特征提供专业化,同时为开放单元向量类型添加新特征等。新库以与 C++ 参考页面类似的风格提供氧气文档,使开发人员更容易浏览新功能。

  • 00:05:00 在本节中,视频讨论了类型特征库的使用如何提高 OpenCL 内核的性能,特别是在地址空间和矢量交易方面。该视频提供了示例,演示了如何使用该库为不同的指针类型创建模板函数,以及如何从类型中删除地址空间来解决 OpenCL 环境中的问题。此外,该视频还展示了包含向量大小交易如何使计算更高效,并强调了缩减算法的实施如何适用于向量类型。总的来说,在 OpenCL 内核中使用类型交换可以导致更丰富的 C++ 编程。

  • 00:10:00 在本节中,演讲者解释了如何使用矢量大小作为条件在 OpenCL 内核中定义添加警报功能。他们阐明,对于不同的矢量大小,选择了不同的实现,如果传入的类型不是矢量类型,则将返回缓冲区中的一项。演讲者还邀请开发人员进行试验和贡献,并获得与 C++ 的最大兼容性以缩短开发周期。他们请求有关缺失功能或错误的反馈,并鼓励在项目页面上加入对现有问题的讨论。
Reaching Even Richer C++ in OpenCL Kernels with use of libclcxx
Reaching Even Richer C++ in OpenCL Kernels with use of libclcxx
  • 2022.05.22
  • www.youtube.com
Presented at: IWOCL / SYCLcon 2022.Additional Information and Slides: https://www.iwocl.org/iwocl-2022/programIWOCL NewsletterSignup to receive regular updat...
 

SYCL beyond OpenCL:hipSYCL 的架构、现状和未来方向(IWOCL / SYCLcon 2020)



SYCL beyond OpenCL:hipSYCL 的架构、现状和未来方向

hipSYCL 项目是 SYCL 的开源实现,它通过 HIP 编程模型而不是 OpenCL 以 GPU 为目标。它由编译器组件、镰刀接口和安全运行时组成。安全编译器识别内核,处理本地内存分配,并实现信号机制。 dispatch 函数根据用户提供的内核创建特定的项目,优化函数可以用 rock prim 定义。未来的方向是允许多个后端并取消对静态编译模型的限制。操作提交模型正在过渡到批量提交以获得更高的任务吞吐量,并且 hipSYCL 在源代码级别具有互操作性,可以与 hip 和 CUDA 混合匹配。作为一个开源项目,欢迎贡献者。

  • 00:00:00 在本节中,演讲者讨论了 hipSYCL 项目背后的动机,该项目是一个开源 SYCL 实现,它通过 HIP 编程模型而不是使用 OpenCL 直接以 GPU 为目标。目的是优化代码并使使用供应商提供的分析器和调试器变得更容易,同时避免与其他编程模型可能发生的采用摩擦。演讲者还将 hipSYCL 与可用于 SYCL 和 CUDA 互操作性的其他解决方案进行了比较,由于 hipSYCL 使用了 HIP 编程模型,因此将 hipSYCL 置于规模的 CUDA 互操作性端。

  • 00:05:00 在本节中,视频解释了 hipSYCL 的工作原理及其三个主要组件:编译器组件、镰刀接口和安全运行时。编译器组件允许编译器同时理解 CUDA 和 sickle,使得在源代码级别具有互操作性成为可能。安全运行时负责数据管理和任务调度,而镰刀接口由镰刀命名空间中的类和函数组成。此外,该视频还提到 sickle 是一种灵活的解决方案,可用于构建涵盖所有可能用例的实现。为了以加速器为目标,需要一个专用的编译器组件,它可以识别内核并为加速器编译它们。

  • 00:10:00 在视频的这一部分,演讲者讨论了 hipSYCL 中的安全编译器如何运行。他们解释说,编译器必须识别内核并确定哪些代码需要发送到设备,然后处理内核在本地内存中的分配方式。特定于镰刀的诊断功能也被提及为未来发展的优先事项。演讲者解释说,通过使用名为 Cycle CC 的编译器包装器,使用 hip secure 编译器组件相对简单,它隐藏了所涉及的复杂性,例如编译器的正确调用和链接,以及如何设置包含路径。他们讨论了调用内核如何需要一些技巧并解释了它是如何完成的。此外,目前在 hipSYCL 中使用协程和 Hip 事件的信号机制用于动态乱序处理,但讨论了其缺点。

  • 00:15:00 在本节中,演讲者讨论了如何使用调度函数创建基于用户提供的内核的特定项目,以及如何通过实例化用户提供的调度函数来实现并行和安全核心。然而,最初,所有代码都作为主机代码传递,其中用户提供的内核是主机 lambda,不能直接调用,因此他们添加了一个名为 HIP 内核的虚拟属性,只有在一旦初始解析完成并且 hipSYCL 插件接管了该属性。他们为 hipSYCL 和 CUDA 实现了良好的内存性能,并且使用 hipSYCL,他们可以在源代码级别实现 hip 和 CUDA 互操作性。

  • 00:20:00 在本节中,演讲者讨论了如何使用带 epsilon 的 rock prim 来实现优化缩减。他们建议使用 macro zip secure platform cuda 或 hips a good platform rockem 定义优化函数,标记为主机和设备。如果针对目标平台进行编译,则调用优化函数,否则调用回退函数。演讲者解释说,像 rock prim 这样的供应商优化库可以实现更快的性能,因为它们对目标硬件有更多的了解,尽管 hipSYCL 仍然是预一致性并且缺少图像和开放状态互操作性等一些功能,但它仍然可以用于实际-世界应用。但是,由于纯库循环实现的问题,CPU 包上安排的并行下降速度很慢。

  • 00:25:00 在本节中,演讲者讨论了在 CPU 上使用基本并行形式或分层并行形式与使用 nd 范围并行形式与 hipSYCL 的性能差异。后者会导致巨大的性能损失,因为它需要启动与每个工作组中的工作项一样多的威胁。演讲者随后谈到了 hipSYCL 的未来发展方向,即创建一个新的运行时,允许任意后端同时处于活动状态,并消除对静态编译模型的限制。他们还正在过渡到端到端映射,其中 n 循环使用映射到 M 后端队列来优化硬件利用率。此外,新运行时和现有 SYCL 接口之间将严格分离,以便于维护和试验。

  • 00:30:00 在本节中,演讲者讨论了对 hipSYCL 中的手术提交模型所做的改进。他们正在从基于信号的提交模型过渡到批处理提交模型,在这种模型中,每批操作只向运行时发送一次已完成的信号,从而实现更高的任务吞吐量。演讲者解释了提交操作然后由甲板构建器处理的过程,甲板构建器收集并订购它们。然后,deck scheduler 将执行提示分配给操作,然后这些操作会转到后端执行器以执行内核并确定需要哪些同步操作。此配置的成本估算然后返回到甲板调度程序以进一步优化或按原样提交操作。演讲者还提供了有关如何通过其软件包存储库和安装脚本获取 hipSYCL 的信息。

  • 00:35:00 在本节中,解释了 hipSYCL 是针对 CPU、视频 GPU 和 AMD GPU 的 SICL 的实现。它建立在低级供应商 API hip 和 CUDA 之上,这使得它可以在源代码级别进行互操作。这允许开发人员混合搭配 hip 和 CUDA,使其适用于一系列 HPC 和其他需要访问最新的低级硬件优化或供应商优化库的用例。此外,它允许为特定硬件创建高度优化的代码路径,并且内核性能有望与常规 hip 或 CUDA 相当。作为一个开源项目,始终欢迎贡献者,感兴趣的人可以在 GitHub 页面上了解更多信息。
SYCL beyond OpenCL: The architecture, current state and future direction of hipSYCL
SYCL beyond OpenCL: The architecture, current state and future direction of hipSYCL
  • 2020.04.28
  • www.youtube.com
This video was presented at the online version of IWOCL / SYCLcon 2020.Authors: Aksel Alpay and Vincent Heuveline (Heidelberg University) Additional Informat...
 

SYCL:未来是开放的、并行的和异构的(Core C++ 2022



SYCL:未来是开放的、并行的、异构的

在这段关于 SYCL 编程的视频中,演讲者强调了提高抽象级别以提高生产力和吸引更多开发人员的必要性,因为复杂的模型需要更高的计算能力,而加速器系统可以满足这一要求。强调了软件可移植性和 OneAPI 的重要性,因为它允许设备在 CPU、GPU 和其他设备上工作。还讨论了 SYCL 的好处,这是一种开放、并行和异构的编程模型,演讲者强调了可用于优化代码和提高性能的众多在线资源和工具。演讲者鼓励观众访问 oneapi.io 及其 YouTube 频道以获取资源和支持。

  • 00:00:00 在本节中,演讲者讨论了提高抽象级别以提高生产力和吸引更多开发人员的必要性。随着模型变得越来越复杂,对计算能力的需求迅速增加。演讲者提到了忍者差距,指的是难以找到和雇用较低级别的专家,例如汇编或 Cuda 开发人员。提高抽象级别会导致性能损失,这就是为什么需要 GPU 和 GAUDI 等 AI 加速器来满足日益增长的计算能力需求。

  • 00:05:00 在本节中,演讲者讨论了加速器实现最快性能的必要性,但指出一个加速器不足以涵盖所有应用程序。需要异构系统,结合 CPU 和加速器,例如类 ASIC 加速器和 CPU。演讲者强调了软件可移植性和代码在任何机器或设备上运行的能力的重要性,无论使用何种硬件,而无需为每个平台或操作系统重新编码、重新编译或重建。 OneAPI 是一项旨在简化软件堆栈、统一库和工具以确保开放、免费和跨设备的软件可移植性的行业努力,这意味着软件堆栈可以在 CPU、GPU 和其他设备上运行。 OneAPI 提供了一个基本工具包,其中包含入门所需的一切。

  • 00:10:00 在本节中,演讲者讨论了使用基于 OneAPI 的工具包的强大功能以及 Data Policy++ 编译器的概念,该编译器旨在为 C++ 库添加异构性。通过使用预定义的策略,您可以轻松访问 CPU 或 GPU,而无需了解太多关于 OpenCL 或 CUDA 的底层细节。编译器提供了控制和分离周围内存、处理异常代码和创建并行计算的能力。

  • 00:15:00 在视频的这一部分中,演讲者解释了要具有良好的异构计算能力,需要具备三个条件。第一个是发现设备并获取有关它的信息的能力。这是演讲者展示一段简单代码的地方,它检测并列出所有连接到系统的设备。第二个需求是关于设备状态的实时信息,它允许使用率和温度监控,还允许用户在 CPU 和 GPU 之间切换。第三个要求是能够在设备和主机之间高效无缝地交换内存,这是通过SYCL中的两种主要方式实现的——缓冲区和统一图表内存。

  • 00:20:00 在本节中,演讲者解释了使用 SYCL 这一开放、并行和异构编程模型的好处。通过将 SYCL 添加到 C++,可以编写可在多种设备上运行的代码,包括 GPU、CPU、ARM 和 FPGA。演讲者提到,有许多在线资源和示例可以说明如何使 SYCL 与多个设备一起工作。 Intel Advisor 是演讲者推荐的工具,它可以帮助优化代码并提供将特定功能卸载到 GPU 的选项。演讲者强调了使用这个工具的重要性,它可以使代码运行得更快,提高程序的整体性能。

  • 00:25:00 在本节中,演讲者宣传使用 SYCL 作为让代码在多个供应商的多个设备上可用的最快方式,并鼓励观众访问 oneapi.io 网站和他的 YouTube 频道以获取资源和支持。他还提到在某些示例中 SYCL 可能比 CUDA 更快,但强调 SYCL 的主要优势在于其可移植性,因为它允许编码到一个平台,然后可以在各种设备上运行,从而无需制作多个不同设备的编码决策。此外,演讲者愿意回答任何问题并提供资源,例如 Jupyter 笔记本和对英特尔 Devcloud 的访问,以帮助用户开始使用 SYCL。
Core C++ 2023
Core C++ 2023
  • Oleh Zasadnyy, GDG Lviv
  • corecpp.org
Core C++ 2023
 

Python 中的 GPU 加速



Python 中的 GPU 加速

该视频解释了如何利用图形处理单元的强大功能在 Python 编程中实现 GPU 加速,这可以通过数据并行性提供高达 10 倍的加速。简单介绍了GPU计算的两个标准OpenCL和CUDA,视频演示了使用Pi OpenCL和CUDA在Python中进行矩阵乘法。演讲者解释了全局内存和矩阵乘法内核的使用,还讨论了用于计算矩阵-矩阵乘积中的一个元素的算法。讨论了 C 和 Python 中的 GPU 加速代码,重点是理解矩阵的内部表示和内存分配。讲座中的习题为进一步探索GPU计算提供了基础。

  • 00:00:00 在本节中,视频介绍了 GPU 计算作为一种利用图形处理单元的能力实现数据并行和加速程序的方法,图形处理单元每秒可以处理数十亿次浮点运算,并提供了factor of 10. 简单介绍了GPU计算的两个标准OpenCL和CUDA,并以Nvidia的Kepler、Pascal、Volta等高端GPU为例。 GPU 计算的大规模并行方面被强调为保持 GPU 占用的一种方式,通常需要调度足够多的线程。视频还提到了硬件加速器在科学和工程领域的潜在应用。

  • 00:05:00 在视频的这一部分,演讲者讨论了 GPU 加速的演变,从具有 1 teraflops 峰值性能的 Kepler 到超过 7.9 teraflops 的当前一代。大规模并行计算的编程模型遵循单指令多数据方法,数据被分成线程块,每个块至少运行一个线程。演讲者谈到了开放计算语言,这是一种并行编程的开放标准,除了 GPU 计算之外,还涵盖了多核和多线程计算。

  • 00:10:00 在本节中,演讲者讨论了在 Python 中使用 OpenCL 和 Pi OpenCL 进行 GPU 加速。 OpenCL 是一个通用标准,最初在 NVIDIA 显卡上得到支持,但已被废弃。但是,它在 MacBook 上运行良好,因为它是由 Apple 发起的。 Pi OpenCL 通过减少样板代码并允许更轻松地关注内核来简化 OpenCL 编程。它还支持 NumPy 数组,但由于数据并行性,数据结构受到更多限制。演讲者演示了使用 Pi OpenCL 对两个整数矩阵进行矩阵乘法以进行测试。

  • 00:15:00 在本节中,演讲者解释了如何使用 GPU 在 Python 中使用 OpenCL 进行矩阵乘法。他们首先导入必要的库,包括 OpenCL 和 NumPy。演讲者还指出,使用的显卡不支持 64 位运算,因此他们选择了 32 位浮点运算。然后他们定义矩阵,生成随机整数,并将它们的类型更改为 32 位流矩阵。然后,演讲者解释了在设备上定义矩阵对应项和创建队列所需的样板代码。最后,演讲者定义了矩阵乘法的内核,在程序运行时编译,并演示了如何在 GPU 上进行矩阵乘法。

  • 00:20:00 在本节中,演讲者解释了 Python 编程中 GPU 加速上下文中“全局”的概念。全局表示矩阵驻留在显卡的全局内存中,为每个线程提供对数据的访问。维度作为短整数传递,每个线程都有一个唯一的标识号。矩阵乘法过程受益于 GPU 加速,因为几乎每个部分都可以通过矩阵行和列索引独立完成。矩阵存储在 C-wise 中,作为一个长数组,指针确定它们在内存中的位置。

  • 00:25:00 在本节中,演讲者解释了用于计算矩阵-矩阵乘积中的一个元素的 C 语言算法以及矩阵-矩阵乘法的潜在加速,这通常是矩阵维度中的三次运算。但是,通过使用 GPU 和内核启动,可以将操作简化为线性操作,从而大幅降低成本并显着加快速度。演讲者还提到,虽然执行操作的最简单方法是通过 Python,无需显式编译,但超级计算机中使用的实际算法使用 GPU 上的共享内存和编译过程,超出了本文讨论的范围视频。演讲者强调 PiCUDA 和 PiOpenCL 使程序员能够在更高层次上开发代码,而不必担心较低层次的编译和链接过程。

  • 00:30:00 在本节中,视频讨论了在 Python 中安装 CUDA 以实现 GPU 加速。要使用 CUDA,用户必须安装 NVIDIA GPU 和驱动程序。讲座通过说明检查系统是否设置正确,演讲者指出该技术是高度交互的并行计算。讲师解释说,配备优质显卡的高端笔记本电脑可以获得出色的性能。然后,本课程以矩阵乘法为例进行展示。主持人指出,通常必须有一个程序在 CPU 上运行,而 GPU 只会加速计算密集的部分。最后,讲座讨论了在 GPU 上为相应矩阵分配内存以及初始化结果矩阵,指出使用 NumPy 分配内存比使用 C 更好。此外,此阶段不需要编译。

  • 00:35:00 本节讨论 C 中 GPU 加速的代码。 C 中的矩阵以逐行方式存储,代码利用了这一事实。在二维结构中启动线程块的语法用于显式计算线程。带有显式括号的循环用于避免指针运算。该函数采用数据的维度和指针,其中包括用于输入的矩阵 A 和 B 以及结果矩阵 C_gpu。到设备的内存复制必须在打印之前结束,并且到主机的内存复制设备必须在打印数据之前完成,因为在 GPU 执行的内核函数中的函数内打印可能是不可能的。最后,讨论结束时指出 pyCUDA 比 piOpenCL 和 PyCUDA 更新。

  • 00:40:00 在本节中,演讲者讨论了 Python 中的 GPU 加速,它面向 CUDA,但也正在努力在其他 GPU 上运行。它负责编译和执行,使后续运行速度更快。可以在脚本环境中使用 Python 开发 GPU 内核;但是,必须了解 GPU 的工作原理以及如何使用 C 语法在内部表示矩阵。讲座中的练习是开放式的,可以为探索 GPU 计算的第二个项目提供基础。总的来说,这是一个介绍性部分,旨在让程序员和软件开发人员了解如何开发在 GPU 上运行的功能。
GPU acceleration in Python
GPU acceleration in Python
  • 2022.02.10
  • www.youtube.com
This lecture introduces PyOpenCL and PyCUDA to define and run functions on General Purpose Graphics Processing Units (GPUs). The running example is a basic ...
 

OpenCL 3.0 发布演示(IWOCL / SYCLcon 2020)



OpenCL 3.0 发布演示

本视频讨论了 OpenCL 3.0 的推出,重点是它对行业低级并行编程的重要性。 OpenCL 3.0 并没有为 API 增加新的功能,而是提供了生态系统的重新调整,使 OpenCL 能够接触到更多的开发者和设备。演示者还讨论了 DSP 光处理器扩展的添加、未来功能的路线图,以及可以为 OpenCL Vulcan 生成精神内核的开源内核语言编译器不断发展的生态系统。在工作组为未来几个月的第一波实施做准备时,鼓励用户提供反馈以帮助完成规范。

  • 00:00:00 在本节中,来自 NVIDIA 和 Khronos 小组的 Neil Travis 讨论了 OpenCL 3.0 的发布以及行业低级并行编程标准的重要性。 OpenCL 被 GPU 供应商广泛使用,并且越来越多地被应用程序、引擎和库使用。 OpenCL 3.0 的推出提供了生态系统的重新调整,而不是向 API 添加新功能,目的是使 OpenCL 能够覆盖更多的开发人员和设备。 OpenCL 3.0 使所有超出点的 2x 功能成为可选功能,使供应商能够专注于为客户提供他们需要的功能,并重新设置提高核心功能标准的机会。

  • 00:05:00 在本节中,解释了 OpenCL 3.0 是一种新规范,它附带一个统一的 API,旨在查询所有 OpenCL 2.x 功能,并为 DSP 光处理器添加了扩展,以在全局和全局之间传输 2D 和 3D 数据通过直接内存访问 (DMA) 事务灵活且异步地访问本地内存。尽管 OpenCL 3.0 不包含 OpenCL C++ 规范,但鼓励其他实现使用 C++ for OpenCL 开源前端编译器,通过将 OpenCL C 与 C++17 的大部分内容混合来生成 Spir-V 内核。 OpenCL 的路线图包括首先将新功能作为扩展提供给行业采用,使其成熟并得到验证,然后再将其纳入未来的核心规范。 OpenCL 工作组还将配置文件视为平衡实施灵活性与应用程序可移植性并避免目标市场碎片化的重要工具。

  • 00:10:00 在本节中,主持人讨论了开源内核语言编译器不断发展的生态系统,其中包括 clang 和 lvm,它们可以为 OpenCL Vulcan 生成精神内核,或进一步翻译成着色器以在其他 API 上运行,例如作为金属。这将使 Apple 平台上的 OpenCL 应用程序无需使用 OpenCL 驱动程序。演示者还提到了 OpenCL 12 项目,该项目使用开源转换管道将 LLVM 生成的精神内核转换为 DXi L,使语言编译器能够独立于运行时进行创新。 OpenCL 3 的规范是临时的,在工作组为未来几个月的第一波实施做准备时,我们鼓励用户提供反馈以帮助最终确定规范。
OpenCL 3.0 Launch Presentation
OpenCL 3.0 Launch Presentation
  • 2020.05.07
  • www.youtube.com
This video was presented as part of the panel discussion at the online version of IWOCL / SYCLcon 2020, and was presented by Neil Trevett, Khronos Group Pres...