交易中的OpenCL - 页 8

 

36. 在 CPU 数据路径上执行指令



36. 在 CPU 数据路径上执行指令

该视频使用执行累加操作的示例解释了如何在 CPU 数据路径上执行计算。数据路径包括使用地址将数据加载和存储到内存的加载和存储单元,以及执行操作的功能单元(例如 ALU)。该视频逐步说明了该过程,包括从内存加载数据、执行操作以及将结果存回内存。演讲者还解释了如何利用 FPGA 实现相同的功能,从而充分利用硬件中的可用资源。

  • 00:00:00 在本节中,视频通过执行累积操作的示例说明了如何将计算映射到 PGA。首先,使用 CPU 指令将高级代码转换为汇编语言,并将中间值存储在寄存器中。 CPU 是一个流水线 CPU,在数据路径中具有功能单元,包括加载和存储单元,用于使用地址将数据加载和存储到内存。数据路径设计得足够通用,可以在固定的数据宽度和操作次数内执行各种指令,并且可以通过 ALU 将常量值加载到寄存器中。该视频还提供了 6 条指令如何在 CPU 中执行的示例,逐步说明了该过程。

  • 00:05:00 在本节中,演讲者通过几条指令并解释了它们如何在 CPU 数据路径中执行,包括将数据从内存加载到寄存器文件,使用数据路径中的不同功能单元执行乘法和加法等操作,并将结果存回内存。然后,演讲者继续解释 FPGA 如何通过展开 CPU 硬件并使用功能所需的确切资源来实现相同的内核功能,从而充分利用 FPGA 硬件中的可用资源。
Execute Instructions on CPU Datapath
Execute Instructions on CPU Datapath
  • 2020.07.04
  • www.youtube.com
This video reviews how instructions are executed on a traditional CPU data path, which will be contrasted with the mapping to a customized FPGA design. Ackno...
 

37. FPGA 上的自定义数据路径


37. FPGA 上的自定义数据路径

该视频介绍了如何使用 FPGA 实现内核功能,通过展开 CPU 硬件和自定义 FPGA 上的数据路径来提高性能。通过删除未使用的单元、加载常量和连线,并重新安排一些操作,可以同时执行加载操作以提高性能。定制数据路径的设计可以通过为特定功能选择必要的操作和数据来提高吞吐量、减少延迟和功耗。该视频展示了两个向量的按需加法示例,结果使用阶段之间的寄存器存储回内存中,以实现高效的流水线并启动八个工作项以进行背靠背加法。

  • 00:00:00 在本节中,解释了使用 FPGA 实现内核功能以提高性能和资源利用率的概念。这个想法是展开 CPU 硬件并使用 FPGA 资源来创建实现所需功能的设计,同时使用在每个执行步骤中未使用的资源。通过删除某些未使用的单元、加载常量和连线并重新安排一些操作,加载操作可以同时执行,从而提高性能。自定义 FPGA 上的数据路径可以使用专门的专用资源实现相同的结果。

  • 00:05:00 在本节中,演讲者通过为特定功能、内存大小和配置选择必要的操作和数据,以提高吞吐量、减少延迟和功耗的方式,讨论了 FPGA 上定制数据路径的设计消费,使用内核函数对两个向量执行按需加法,结果存储回内存中。利用阶段之间的寄存器,数据路径可以使用高效的流水线并启动八个工作项以进行背靠背添加,从而允许每个周期处理不同的线程以避免空闲单元。
Customized Datapath on FPGA
Customized Datapath on FPGA
  • 2020.07.04
  • www.youtube.com
This video explains how to map OpenCL program onto a customized design in FPGA.Acknowledgement: the slides are from Intel's "OpenCL for FPGA" tutorial at ISC...
 

38. 用于 FPGA 和数据并行内核的 OpenCL



38. 用于 FPGA 和数据并行内核的 OpenCL

该视频解释了 OpenCL 如何使 FPGA 工程师能够利用软件工程资源,通过利用 FPGA 上的并行计算资源来扩大 FPGA 应用程序开发人员的数量。 OpenCL 的编程模型通过使用称为内核的数据并行函数来实现并行性规范,每个内核依赖于“获取全局 ID”指定的标识符来对独立的数据段执行并行计算。引入了线程和工作组的概念,其中线程访问数据集的不同部分,划分为工作组,只有同一工作组内的线程才能共享本地内存。通过这种编程模型,OpenCL 可以实现高效的数据并行处理。

  • 00:00:00 在本节中,演讲者介绍了 OpenCL 及其在设计基于 FPGA 的应用程序中的重要性。虽然 FPGA 的程序员比标准 CPU 少,但 OpenCL 作为一种高级编程语言,通过允许 FPGA 工程师使用软件工程资源来利用 FPGA 上的并行计算资源,扩大了 FPGA 应用程序开发人员的数量。 OpenCL 是异构计算的行业标准,允许程序员使用熟悉的 C 或 C++ API 编写程序,以使用多核处理器、GPU 和 FPGA 等硬件加速器执行复杂的工作负载。 OpenCL 背后的重要思想是它的执行模型,它允许明确指定并行性。

  • 00:05:00 本节讲解FPGA和数据并行内核的OpenCL编程模型。该视频描述了 OpenCL 框架的结构,其中主机和加速器或设备在不同的硬件域上运行。主机准备设备和内核,并创建提交给这些设备所需的命令。加速器代码是用 OpenCLC 编写的,主机通过一组 OpenCL API 调用与其通信,允许主机处理器和设备上执行的内核之间的通信抽象。 OpenCL 内核是用于定义多个并行执行线程的数据并行函数,每个线程都依赖于“获取全局 ID”指定的标识符。这些 ID 指定内核应该处理的数据段或分区,允许对独立的数据对执行并行计算。

  • 00:10:00 本节介绍线程和工作组的概念,其中线程可以访问数据集的不同部分,并划分为工作组。只有同一工作组内的线程才能共享本地内存。每个线程都有本地和全局 ID,全局 ID 可以使用组 ID 和本地大小来计算。该系统允许高效的数据并行处理。
OpenCL for FPGA and Data Parallel Kernel
OpenCL for FPGA and Data Parallel Kernel
  • 2020.04.19
  • www.youtube.com
A recap of OpenCL for FPGA, how kernels identify data partition
 

39. OpenCL Host Side Programming:上下文、队列、内存对象等。



39. OpenCL Host Side Programming:上下文、队列、内存对象等。

本视频教程探讨了 OpenCL 中的各种主机端编程概念,重点是上下文、队列和内存对象。它涵盖了 OpenCL 中的两个新 API,clCreateKernelsInProgram 和 clSetKernelArg,它们用于创建内核对象并将参数传递给内核函数。本教程还讨论了使用 clCreateImage API 创建图像对象,以及如何使用通道顺序和通道类型将图像像素存储在内存中。它解释了 OpenCL 如何处理 2D 和 3D 图像,开发人员如何使用 clGetMemoryObjectInfo 等 API 收集有关内存对象的信息,以及如何执行内存对象操作,例如读取和写入缓冲区记录、映射内存对象以及在内存对象之间复制数据。

  • 00:00:00 在本节中,重新审视了 OpenCL 的主机端编程概念。本节重点介绍上下文、队列和内存对象。可以在物理平台上构建多个上下文,即使它由来自不同供应商的设备组成。全局内存中的内存对象可以被多个队列共享,但是需要宿主端的应用程序进行适当的同步。一个上下文中可以有多个上下文和多个命令队列。供应商提供的不同 OpenCL 平台不一定兼容,因此不能放在同一个上下文中。

  • 00:05:00 在本节中,视频讨论了 OpenCL 中的两个新 API。第一个 API 允许使用 clCreateKernelsInProgram 函数为 OpenCL 程序中的每个函数创建内核。这将创建一个内核对象数组,可用于使用 clGetKernelInfo 函数验证内核函数名称和其他相关信息。第二个 API,clSetKernelArg,用于实例化内核参数,并将内核对象和参数的索引作为参数。视频继续解释如何使用这些 API 以及如何在使用后释放内核对象。

  • 00:10:00 在本节中,我们将了解 API 如何将参数值传递给内核函数。我们可以传递一个原始数据类型作为指向内核函数的指针,或者我们可以传递一个指向内存对象或包含复杂数据的样本对象的指针。图像对象是一种特殊类型的内存对象,用于保存像素数据。我们可以使用与缓冲区对象相同的配置标志以及从图像格式列表中定义的格式来创建图像对象。 clCreateImage API 用于创建图像对象,其参数与创建缓冲区对象的参数类似。第三个参数标识要分配的图像数据的格式属性,而第四个参数描述图像的类型和尺寸。

  • 00:15:00 在本节中,介绍了使用 clCreateImage() API 来识别图像像素在内存中的存储方式。图像对象格式旨在将图像存储在内存中,由两个因素组成:通道顺序和通道类型。通道顺序标识如何为每个像素存储通道信息,它是一个包含基本颜色和 alpha 信息的枚举类型。相反,通道类型指定图像通道如何以二进制编码并使用不同的值来确定颜色信息的表示。位级别对于指定使用多少位来表示通道中的颜色值至关重要。此外,演示了图像格式的内存布局,对于每个像素,RGBA 序列存储在内存中,使用一个字节为每个颜色通道编码颜色信息。

  • 00:20:00 在本节中,视频讨论了 OpenCL 如何处理 2D 和 3D 图像,这些图像可以由在另一个维度上堆叠在一起的多个切片组成。 CL 图像描述符用于描述图像对象的布局方式,包括图像宽度、高度和深度(以像素为单位)以及扫描线间距(以字节为单位)等参数。此外,clCreateImage() API 用于识别描述图像所需的字节数,这可能需要调整行和切片内的填充和对齐。

  • 00:25:00 在本节中,演讲者解释了如何使用 clGetImageInfo 和 clGetMemoryObjectInfo 等 API 在 OpenCL 中收集有关图像和内存对象的信息。这些 API 允许开发人员获取有关图像格式、像素大小、像素宽度、像素高度、深度和内存对象的其他属性等信息。此外,它们还可以使用 EnqueueReadBuffer/EnqueueWriteBuffer 将数据读取或写入缓冲区对象,并使用 EnqueueReadImage/EnqueueWriteImage 访问图像对象数据。原点、区域、行距和切片间距的使用也特定于按行、切片和图片组织的图像对象。开发人员可以使用这些 API 来指定他们想要访问或执行复制操作的区域的确切位置,并使用 CL 事件参数生成事件。

  • 00:30:00 在本节中,视频解释了 OpenCL 中的两个内存对象操作:读取和写入缓冲区 rec,以及映射内存对象。使用读写缓冲区 rec,用户指定来源和大小信息,允许在特定点检索或写入数据。映射内存对象允许将设备上的内存对象映射到主机上的内存区域。映射后,可以使用通过内存映射 API 获得的指针在主机端读取和修改内存对象。该视频还介绍了 OpenCL 中可用的内存对象操作列表,用于在内存对象之间复制数据,简化主机端的编程并提高读写操作性能。

  • 00:35:00 在本节中,演讲者讨论了 OpenCL 中的各种内存对象,以及如何使用它们将数据从一个位置复制到另一个位置。复制函数包括复制缓冲区、复制图像、复制缓冲区矩形等。演讲者展示了一个主机设备系统,并演示了如何使用队列复制缓冲区功能中的 CL 将数据从一个缓冲区复制到另一个缓冲区。他们解释了如何使用 cl enqueu map buffer 将缓冲区映射到内存空间,然后使用内存复制将映射区域复制到自身。
OpenCL Host Side Programming: Context, queues, memory objects, etc.
OpenCL Host Side Programming: Context, queues, memory objects, etc.
  • 2020.03.27
  • www.youtube.com
OpenCL Host Side Programming: Context, queues, memory objects, etc.
 

40. FPGA 的 HDL 设计流程



40. FPGA 的 HDL 设计流程

该视频介绍了使用 Quartus 设计软件开发现场可编程门阵列 (FPGA) 的过程。

解释了 FPGA 开发的设计方法和软件工具。典型的可编程逻辑设计流程从设计规范开始,继续进行 RTL 编码,然后是 RTL 功能仿真,然后是综合以将设计转换为特定于设备的原语。然后,工程师将这些原语映射到特定 FPGA 内的特定位置,并通过时序分析验证性能规范。最后,将设计加载到 FPGA 卡中,可以使用调试工具在硬件上对其进行测试。对于英特尔 FPGA,Quartus 设计软件用于执行设计流程,从系统描述开始,然后进行逻辑综合、布局布线、时序和功耗分析,并将设计编程到实际的 FPGA 中。

HDL Design Flow for FPGA
HDL Design Flow for FPGA
  • 2020.04.18
  • www.youtube.com
(Intel) FPGA Design Flow using HDL
 

41. OpenCL数据类型和设备内存



41. OpenCL数据类型和设备内存

该视频讨论了 OpenCL 数据类型和设备内存。它涵盖了布尔、整数和浮点类型,并解释了用于对内存地址进行操作的特定数据类型,例如 int-ptr、uint-ptr 和 ptrdiff-t。它还解释了向量数据类型,它是包含多个相同类型元素的数组,允许运算符同时应用于每个元素,以及如何使用它们。该视频提供了有关如何初始化和访问向量中的元素的各种示例,包括使用字母和数字索引、高-低和奇偶数。它还解释了内存对齐以及如何使用设置内核参数和私有内核参数。

  • 00:00:00 在本节中,视频概述了可在 OpenCL 内核编程中使用的数据类型,其中包括布尔值、整数和浮点类型。 int-ptr、uint-ptr 和 ptrdiff-t 等特定数据类型用于对内存地址进行操作。视频指出,仅当目标设备支持 CL Cronus 14 点 64 CLCronus FP 64 扩展时,才支持双精度类型。开发人员可以在他们的 OpenCL 内核程序中使用双精度类型之前检查此扩展。该视频还解释了如何启用双精度类型扩展并在内核程序中使用它。

  • 00:05:00 在视频的这一部分中,讨论了 OpenCL 数据类型和设备内存。 OpenCL 标准不强制要求数据类型的字节顺序。 Little-endian 和 big-endian 是两种可选的字节序类型,它们取决于计算机体系结构如何定义相乘的变量将如何存储在内存中。可以使用 CR get device info vector 数据类型找出设备的字节顺序。此外,矢量数据类型作为包含多个相同类型元素的数组引入,具有固定长度,并允许运算符同时应用于每个元素。使用向量数据类型的好处是它比使用数组更快、更简单。该视频介绍了如何使用向量数据类型对多个数组执行逐元素加法。

  • 00:10:00 在本节中,我们了解可在 OpenCL 中使用的不同矢量类型,它们与标量类型非常相似。但是,向量末尾需要一个数字来指示向量有多大以及它包含什么类型的元素。 OpenCL 还有两种特殊数据类型,double 和 half 数据类型,设备可能支持也可能不支持。为了解不同类型的首选矢量大小,OpenCL 提供了一个 API,可用于查询设备的首选矢量宽度。基于此,我们可以设置构建程序的选项,例如为首选大小 128 定义浮点向量,或者如果首选向量大小为 256 则定义浮点 8。可以通过在内部分配初始值来初始化向量括号。我们甚至可以使用更小的向量来初始化一个向量,例如,如果我们有两个大小为 2 的向量,A 和 B,都用标量值初始化。

  • 00:15:00 在本节中,演讲者解释了如何初始化和访问 OpenCL 矢量中的元素或组件。用户可以使用较小的向量、标量和较小因子的组合来初始化向量,或者直接将值分配给向量元素。提供的示例展示了如何使用数字索引、字母索引和高-低偶数-奇数来访问向量中的元素。不同的示例演示了如何从向量中检索元素的子集并将这些元素分配给其他变量。

  • 00:20:00 在本节中,演讲者讨论了对向量元素进行索引和修改的各种方法,包括使用数字索引、字母(例如 X、Y、Z 和 W)来表示向量的不同维度,以及组合字母和数字索引。他们还解释了如何使用 high-low 和 even-odd 根据它们在向量中的位置来选择向量分量的子集。这些索引和修改方法可用于处理不同长度和维度的向量。

  • 00:25:00 在本节中,我们了解了访问和修改向量中元素的不同方法,例如高低偶数索引,它允许我们获取向量中元素的高半部分或低半部分,甚至- 索引元素。我们还探讨了向量如何存储在小端设备中,其中整数的最低有效字节存储在比最高有效字节低的地址中。这意味着在无符号整数向量中,每个 32 位整数值的四个字节将按从最低有效字节到最高有效字节的顺序存储,向量的每个完整元素占用 16 个字节。

  • 00:30:00 在本节中,演讲者讨论了 OpenCL 数据类型和设备内存如何存储在小端设备和大端设备中。它们显示了无符号整数类型的四元素向量如何存储在两种类型设备的内存中,并指出由于小端和大端设备存储最低有效位和最高有效位的方式不同,字节顺序不同字节。演讲者还演示了一个称为“向量字节”的内核函数,它使用指针从该内存中检索单个字节。

  • 00:35:00 在本节中,讨论了 OpenCL 数据类型中内存对齐的概念。据解释,内存通常对齐 32 位结构,例如整数和浮点数,它们始终存储在四的倍数的内存地址中。还需要注意的是,long 和 double 等 64 位结构存储在 8 的倍数的地址中,大于或等于数据大小的最小 2 的幂设置了数据结构的内存对齐方式。此外,还讨论了在OpenCL中初始化本地和私有内核参数的过程,并解释了本地和私有空间中的内核参数可以使用SetKernelArg进行配置,但是当说明符是本地时不能设置最后一个参数值。此外,请注意私有内核参数必须是简单的原语,例如整数和浮点数。

  • 00:40:00 在本节中,视频讨论了如何在 OpenCL 程序中使用设置内核参数和私有内核参数。使用 set kernel argument 时,第一个参数应该是参数整数大小的索引,后面是指向变量的指针。 private kernel arguments也可以是vector,比如float 4的数组,只能在kernel函数中使用,使用set kernel argument传入。
OpenCL data types and device memory
OpenCL data types and device memory
  • 2020.03.31
  • www.youtube.com
Data types specific to OpenCL kernel functions and their layout in device memory.
 

42. OpenCL 向量关系运算



42. OpenCL 向量关系运算

该视频讨论了 OpenCL 内核编程及其运算符和内置函数。重点是关系运算符以及它们如何处理标量和向量值。提供了一个示例内核函数“op test”,它在常量和私有向量之间执行按元素的 AND 运算。该视频介绍了如何通过使用逻辑运算将特定向量元素与标量进行比较,从而在 OpenCL 中实现具有关系运算的向量。生成的向量可用于 while 循环以创建分配给输出内存对象的最终输出向量。

  • 00:00:00 在本节中,视频介绍了 OpenCL 内核编程,并讨论了该语言从其他高级语言继承的运算符和内置函数。提供的运算符包括算术、比较和逻辑、按位和三元选择。特别是,本节侧重于关系运算符并解释它们如何处理标量值和向量值。该部分还提供了一个名为“op test”的示例内核函数,它使用关系运算符在常量向量和用初始值初始化的私有向量之间执行逐元素 AND 运算。

  • 00:05:00 在本节中,演讲者解释了如何在 OpenCL 中实现具有关系运算的向量。通过使用逻辑运算将向量的特定元素与标量值进行比较的示例,演讲者展示了如何使用分别表示为 -1 和 0 的真值和假值创建结果向量。然后可以在 while 循环中使用生成的向量,其中各个元素进行进一步的逻辑运算以创建最终输出向量,该向量被分配给输出内存对象。
OpenCL vector relational operations
OpenCL vector relational operations
  • 2020.04.03
  • www.youtube.com
vector relational operations
 

43. OpenCL内置函数:vloadn、select



43. OpenCL内置函数:vloadn、select

该视频介绍了两个关键的 OpenCL 内置函数:vloadn 和 select。 Vloadn 允许您使用标量数组中的值初始化批次,并接受两个参数:偏移量和指向标量数组的指针。另一方面,选择允许您从两个批次中选择某些元素并使用它们来创建新向量。它可以包含有符号或无符号整数值,并且只有掩码元素中的最高有效位很重要。本教程演示了这些功能在实践中是如何工作的。

  • 00:00:00 在本节中,我们将了解 Vloadn,这是一个内置函数,用于使用标量数组中的值初始化批处理。 Vloadn 有两个参数:偏移量和指向标量数组的指针。偏移量确定数组的哪些元素被放置在批次中,根据向量的大小给出。此外,我们还了解了 Select 函数,该函数可用于从两个批次中选择某些元素并使用它们来构建新向量。它可以包含有符号或无符号整数值,并且只有掩码元素中的最高有效位很重要。 Select 中掩码组件的最高有效位决定了输出向量中相应元素使用的批次。

  • 00:05:00 在本节中,教程讨论了两个 OpenCL 内置函数:vloadn 和 select。 Vloadn 用于将指定向量中的元素加载到新向量中,而 select 用于根据掩码从第一个或第二个输入中选择元素。本教程提供了这些函数在实践中如何工作的示例,包括 vloadn 如何根据掩码从第一个输入向量中选择值,以及 select 如何从第一个或第二个输入向量中选择位。
OpenCL built-in functions: vloadn , select
OpenCL built-in functions: vloadn , select
  • 2020.04.05
  • www.youtube.com
OpenCL built-in functions: vloadn , select
 

44. DPC++简介



44. DPC++简介

该视频介绍了 DPC++,一种用于数据并行编程的高级语言,可将复杂的计算卸载到 FPGA 和 GPU 等加速器,并且是 OneAPI 框架的一部分。 DPC++ 旨在使用现代 C++ 和面向架构的性能优化来加速数据并行工作负载。讲师提供了一个简单的 DPC++ 示例,演示了如何使用命令和访问器在设备上声明数据管理变量和执行内核函数。该视频还解释了 lambda 函数如何从在其外部声明的变量中获取参数和引用。

  • 00:00:00 在本节中,讲师介绍了 DPC++ 编程,这是一种用于数据并行编程的高级语言,可将复杂的计算卸载到 FPGA 和 GPU 等加速器。 DPC++ 使用现代 C++,旨在通过分析算法、分解任务或数据以及使用面向架构的性能优化来加速数据并行工作负载。 DPC++ 是 OneAPI 框架的一部分,其目标是使用可以在任何 CPU、FPGA 或 GPU 上执行的单一语言进行编程。讲师随后提供了一个简单的 DPC++ 示例,该示例声明变量、缓冲区和用于数据管理的设备队列。

  • 00:05:00 在本节中,演讲者介绍了一个 DPC++ 程序示例,该程序创建命令和 lambda 函数来定义将在设备上执行的内核函数。该程序使用一个访问器将缓冲区与命令相关联,并使用另一个访问器访问结果。最后,该程序包含一个 for 循环以使用结果访问器访问缓冲区中的内容并将其打印出来。 lambda 函数可以通过不同的方式将参数传入函数,例如传递对在函数外部声明的变量的引用。
Intro to DPC++
Intro to DPC++
  • 2021.04.07
  • www.youtube.com
This videos give a brief introduction to DPC++ and go through a simple DPC++ example source code.
 

45.如何并行思考?



45.如何并行思考?

该视频以矩阵乘法为例讲授并行编程。它突出了此计算中的并行性,其中可以独立计算多行和多列。使用允许并行计算的核函数显示了矩阵 C 中单个元素计算的实现。详细解释了访问器、范围和并行内核函数的使用。讨论了将范围值传递给内核函数所涉及的步骤。还演示了使用英特尔 FPGA 开发云的矩阵乘法演示。

  • 00:00:00 在本节中,视频介绍了矩阵乘法作为教授并行编程的常用示例。该视频解释了矩阵乘法涉及从一个矩阵中获取行并从另一个矩阵中获取列以执行逐元素乘法和累加以生成结果矩阵。该视频解释说,此计算中存在大量并行性,因为不同的行和列可以相互独立计算。矩阵乘法的简单实现显示为使用常规 C 或 C++ 语言,嵌套 for 循环执行逐元素乘法和累加。

  • 00:05:00 在本节中,我们将了解矩阵 C 中单个元素计算的实现,它被实现为一个允许并行计算的核函数。关键是对于每一行和每一列,计算都是相同的,唯一的区别是行号和列号。访问器帮助访问内核中的缓冲区,对矩阵 A 和 B 进行只读访问,对矩阵 C 进行写访问。范围用作声明多个维度的抽象,H.parallel4 帮助定义并行核函数.内核函数包含一个 lambda 函数,参数是用于遍历两个维度中所有值的变量。

  • 00:10:00 在本节中,演讲者解释了将范围值传递到层流函数核函数中所涉及的步骤。他们讨论了变量的两个维度以及它如何识别每个变量。演讲者介绍了 lambda 函数的工作原理,并展示了问题大小如何由我们执行内核函数的行数和列数来定义。他们使用矩阵乘法的例子,传统的 C plus plus 符号,以及在最内层的 for 循环中完成的逐元素乘法和累加。最后,他们使用英特尔 FPGA 开发云演示了矩阵乘法的快速演示。
How to Think In Parallel ?
How to Think In Parallel ?
  • 2021.04.07
  • www.youtube.com
This video use matrix multiplication example to introduce how to think in parallel with design data parallel algorithms.