0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用CUDA并行化矩阵乘法加速Blender Python

星星科技指导员 来源:NVIDIA 作者:NVIDIA 2022-04-24 17:04 次阅读

拟或 合成数据 生成是人工智能工具发展的一个重要趋势。传统上,这些数据集可用于解决低数据问题或边缘情况场景,而或许现在存在于可用的实际数据集中。

合成数据的新兴应用包括建立模型性能水平、量化适用领域,以及下一代系统工程,其中人工智能模型和传感器是串联设计的。

pYYBAGJlEruAAaZdAABmyZg_tPc927.png

图 1 。 船舶合成孔径雷达渲染: 相位图 ( left ) ,压缩图像 ( right )。

Blender 是生成这些数据集的一个常用且引人注目的工具。它是免费使用和开源的,但同样重要的是,它可以通过强大的 Python API 完全扩展。 Blender 的这一特性使其成为视觉图像渲染的一个有吸引力的选择。因此,它已被广泛用于此目的,有 18 +渲染引擎选项可供选择。

集成到 Blender 中的渲染引擎(如 Cycles )通常具有紧密集成的 GPU 支持,包括最先进的 NVIDIA RTX 支持。但是,如果在可视化渲染引擎之外需要高性能级别,例如合成 SAR 图像的渲染,那么 Python 环境对于实际应用程序来说可能过于迟缓。加速这段代码的一个选择是使用流行的 Numba 包将 Python 代码的部分预编译成 C 。然而,这仍有改进的余地,特别是在采用领先的 GPU 体系结构进行科学计算方面。

GPU 科学计算功能可直接从 Blender 中获得,允许使用简单的统一工具,利用 Blender 强大的几何体创建功能以及尖端计算环境。对于 blender2 。 83 +的最新变化,可以使用 CuPy (一个专门用于数组计算的 GPU 加速 Python 库)直接从 Python 脚本中完成。

根据这些想法,下面的教程将比较两种不同的加速矩阵乘法的方法。第一种方法使用 Python 的 Numba 编译器,而第二种方法使用 NVIDIA GPU-compute API, CUDA 。这些方法的实现可以在 rleonard1224/matmul GitHub repo 中找到,还有一个 Dockerfile ,它设置了 anaconda 环境,从中可以运行 CUDA – 加速的 Blender Python 脚本。

矩阵乘法算法

作为讨论用于加速矩阵乘法的不同方法的前奏,我们简要回顾了矩阵乘法本身。

对于两个矩阵的乘积[A*B]为了更好地定义[A]必须等于[B].

[A]然后是一个矩阵[m]行和[n]列,即[m*n]matrix.

[B]是一个[n*p]matrix.

产品[C=A.B]结果是[m*p]matrix.

如果[C],[A],和[B]使用数字 1 (即基于 1 的索引)进行索引,然后是的第 i 行和第 j 列中的元素[C],[C[i,j]],

由以下公式确定:

latex.php?latex=%5BC%5Bi%2Cj%5D+%3D+%5CSigma_%7Br+%3D+1%7D%5E%7Bn%7D+A%5Bi%2Cr%5D+%5Ccdot+B%5Br%2Cj%5D%5D&bg=ffffff&fg=000&s=0&c=20201002

麻木加速度

通过使用 Numba 。 jit decorator ,可以将 Numba 编译器应用于 Python 脚本中的函数。通过预编译到 C 中,在 Python 代码中使用 numba 。 jit decorator 可以显著减少循环的运行时间。由于直接转换为代码的矩阵乘法需要嵌套 for 循环,因此使用 numba 。 jit decorator 可以显著减少用 Python 编写的矩阵乘法函数的运行时间。 matmulnumba.py Python 脚本实现矩阵乘法并使用 numba 。 jit decorator 。

CUDA 加速度

在讨论使用 CUDA 加速矩阵乘法的方法之前,我们应该大致概述 CUDA 内核的并行结构。内核启动中的所有并行进程都属于一个网格。网格由块数组组成,每个块由线程数组组成。网格中的线程组成了由 CUDA 内核启动的基本并行进程。图 2 概述了这类并行结构的示例。

pYYBAGJlEsSABbfvAADCrQ__-iQ419.png

图 2 。 一个由 2 组成的 CUDA 核网格的并行结构× 2 块数组。每个块由一个 2 × 2 个线程阵列。

既然已经详细说明了 CUDA 内核启动的并行结构,那么在 matmulcuda.py Python 脚本中用于并行化矩阵乘法的方法可以描述如下。

假设以下由一个由块的二维数组组成的 CUDA 内核网格计算,每个块由线程的一维数组组成:

矩阵积[C=A.B]

[A]and[m*n]matrix

[B]and[n*p]matrix

[C]and[m*p]matrix

此外,进一步假设如下:

网格 x 维中的块数 ([nblocksx]) 大于或等于[m]([nblocksx≥m])。

网格 y 维中的块数 ([nblocksy]) 大于或等于[p]([nblocksy≥p])。

每个块中的线程数 ([ntheads]) 大于或等于[n]([ntheads≥n])。

矩阵积的元素[C=A.B]可以通过为每个块分配一个元素的计算来并行计算[C],[C[i,j].

您可以通过将指定给要执行的块的每个线程来获得进一步的并行增强[C],[C[i,j]分配,计算[n]和等于[C],[C[i,j].

为了避免竞争条件,这些[n]积和结果的赋值[C],[C[i,j]可以使用 CUDA atomicAdd 函数处理。 atomicAdd 函数签名由作为第一个输入的指针和作为第二个输入的数值组成。该定义将输入的数值与第一个输入所指向的值相加,然后将该和存储在第一个输入所指向的位置。

假设[C]初始化为零[tid(i,j)]表示属于块的线程的线程索引,其索引在块的网格中[(i,j)]. 上述平行排列可通过以下方程式进行总结:

latex.php?latex=%5BC%5Bi%2Cj%5D+%3D+%5Ctextrm%7BatomicAdd%7D%28C%5Bi%2Cj%5D%2C+A%5Bi%2C+%5Ctextrm%7Btid%7D%28i%2Cj%29%5D+%5Ccdot+B%5B%5Ctextrm%7Btid%7D%28i%2Cj%29%2C+j%5D%29%5D&bg=ffffff&fg=000&s=0&c=20201002

图 3 总结了两个样本矩阵乘法的并行排列[2*2].

2x2-grid-parallelized-625x275.png

图 3 。两个 2 的乘法的并行化方法× 2 个矩阵。每个块被分配两个矩阵乘积的一个元素,一个线程块中的线程并行地计算乘积,以确定分配给块的矩阵元素的值。

提速

图 4 显示了 CUDA 加速矩阵乘法相对于不同大小矩阵的 Numba 加速矩阵乘法的加速比。在该图中,绘制了加速比以计算两个[N*N]两个矩阵的所有元素都等于一的矩阵。[N]范围从一百到一千,增量为一百。

pYYBAGJlEtWACGWcAABSgX0TnGI314.png

图 4 。两个 NxN 矩阵相乘时 CUDA 加速矩阵相乘相对于 Numba 加速矩阵相乘的加速比。

今后的工作

考虑到 Blender 作为计算机图形工具的作用,一个适用于 CUDA 加速的相关应用领域涉及到通过光线跟踪解决可见性问题。可见性问题可以概括如下: 相机存在于空间的某个点上,并且正在观察由三角形元素组成的网格。可见性问题的目标是确定哪些网格元素对摄影机可见,哪些网格元素被其他网格元素遮挡。

光线跟踪可以用来解决可见性问题。您试图确定其可见性的网格由[N]网格元素。那样的话,[N]可以生成以场景中的摄影机为原点的光线。这些端点位于[N]网格元素。

每条光线在不同的网格元素上都有一个端点。如果光线到达其端点时未被其他网格元素遮挡,则可以从摄影机中看到端点网格元素。图 5 显示了这个过程。

poYBAGJlEteADqybAACIB87vL5Y171.png

图 5 。 从相机向场景中的人脸发射的两条光线;一个面可见,另一个面被遮挡。

使用光线跟踪来解决可见性问题的本质使其成为

latex.php?latex=%5B%5Cmathcal%7BO%7D%28N%5E%7B2%7D%29%5D&bg=ffffff&fg=000&s=0&c=20201002

作为直接计算实现时的问题。幸运的是, NVIDIA 开发了一个光线跟踪库,名为 NVIDIA OptiX ,它使用 GPU 并行性来实现显著的加速。在 Blender Python 环境中使用 NVIDIA OptiX 将带来实实在在的好处。

概括

这篇文章描述了两种不同的加速矩阵乘法的方法。第一种方法使用 Numba 编译器来减少 Python 代码中与循环相关的开销。第二种方法使用 CUDA 并行化矩阵乘法。速度比较证明了 CUDA 在加速矩阵乘法方面的有效性。

因为前面描述的 CUDA 加速代码可以作为 Blender Python 脚本运行,所以可以在 Blender Python 环境中使用 CUDA 加速任意数量的算法。这大大提高了 blenderpython 作为科学计算工具的有效性。

关于作者

Eric Leonard 博士获得了博士学位。在马里兰大学机械工程系,他专门从事理论和计算流体力学。研究生毕业后,他在马萨诸塞州剑桥市的三菱 Ele CTR ic 研究实验室实习,致力于开发一种替代传统计算流体力学算法的方法。在 Rendered 。 AI ,他使用 CUDA 加速了合成孔径雷达仿真代码库。

Nathan Kundtz 博士是物理学家、工程师和企业家。他与建筑公司、杜克大学以及众多其他组织合作,寻找并建立大公司。 Kundtz 博士拥有电子工程硕士学位和博士学位。来自杜克大学物理系。他的工作涵盖了人工智能、超材料、微波器件和低温凝聚态物理。著有或合著专利及专利申请 40 余项,同行评议出版物 30 余篇;包括获奖的博士研究。 Kundtz 博士被 LinkedIn 评为 40 岁以下十大科技专业人士之一。他是高盛 100 位最具吸引力的企业家之一, 40 岁以下的 Puget Sound ,并入选杜克大学研究生院为数不多的 Glasson 社团。

Ethan Sharratt 是 Rendered.AI 的软件工程总监。他有一个学士学位,在华盛顿大学的 EDE CTR 工程,目前正在一个硕士。他拥有 10 年在具有挑战性的环境中构建软件和固件解决方案的经验,包括开发空间等级软件定义的无线电、信号和图像处理以及实时计算机视觉管道。

Steven Forsyth 是 NVIDIA 的解决方案架构师,专注于支持联邦生态系统。他在激光干涉仪引力波天文台工作了几年,在那里他获得了信号处理和高性能计算方面的经验。在 NVIDIA ,他将从 LIGO 获得的知识与深度学习的知识结合起来,专门从事深度学习应用,涉及广泛的领域,包括计算机视觉和网络安全。史蒂文最近从乔治亚理工学院毕业,在那里他获得了物理学学士学位。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    4929

    浏览量

    102790
  • CUDA
    +关注

    关注

    0

    文章

    121

    浏览量

    13597
收藏 人收藏

    评论

    相关推荐

    Mali GPU编程特性及二维浮点矩阵运算并行优化详解

    本文针对Mali-T604 GPU论述了基于OpenCL的Linux平台上进行通用计算并行优化的方法,论述了Mali-T604 GPU的硬件特点,并基于OpenCL设计了二维矩阵乘法并行
    发表于 08-07 17:12 2539次阅读
    Mali GPU编程特性及二维浮点<b class='flag-5'>矩阵</b>运算<b class='flag-5'>并行</b>优化详解

    #硬声创作季 cuda_lecture3_part5_2_扫描并行实例

    并行编程语言CUDA
    Mr_haohao
    发布于 :2022年09月03日 15:02:11

    请问Mali GPU的并行计算模型是怎样构建的?

    Mali T604 GPU的结构是由哪些部分组成的?Mali T604 GPU的编程特性有哪些?Mali GPU的并行计算模型是怎样构建的?基于Mali-T604 GPU的快速浮点矩阵乘法
    发表于 04-19 08:06

    【KV260视觉入门套件试用体验】硬件加速之—使用PL加速矩阵乘法运算(Vitis HLS)

    乘法的快速算法对科学计算有着极为重要的意义。 使用KV260硬件加速矩阵乘法运算,会带来以下好处: KV260中PL(FPGA)是一种可编程的逻辑器件,能够实现高度定制
    发表于 10-13 20:11

    支持优化分块策略的矩阵加速

    存储器容量十分有限,计算大规模矩阵乘法时往往需要将矩阵划分成细粒度的子块计算任务。当加速非均匀矩阵乘法
    发表于 11-25 10:38 3次下载
    支持优化分块策略的<b class='flag-5'>矩阵</b>乘<b class='flag-5'>加速</b>器

    基于Spark的矩阵分解并行算法

    针对传统矩阵分解算法在处理海量数据信息时所面临的处理速度和计算资源的瓶颈问题,利用Spark在内存计算和迭代计算上的优势,提出了Spark框架下的矩阵分解并行算法。首先,依据历史数据
    发表于 01-02 11:31 0次下载
    基于Spark的<b class='flag-5'>矩阵</b>分解<b class='flag-5'>并行</b><b class='flag-5'>化</b>算法

    基于深度学习的矩阵乘法加速器设计方案

    为满足深度学习推理中对不同规模矩阵乘法的计算需求,提出一种基于 Zynq soc平台的整数矩阵乘法加速器。采用基于总线广播的
    发表于 05-25 16:26 3次下载

    新型的分布式并行稠密矩阵乘算法

    并行矩阵乘法是线性代数中最重要的基本运算之一,同时也是许多科学应用的基石。随着高性能计算(HPC)向E级计算发展,并行矩阵
    发表于 06-01 14:33 5次下载

    面向数组计算任务而设计的Numba具有CUDA加速功能

    Numba 为 Python 开发人员提供了一个进入 GPU 加速计算的简单入口,并为使用日益复杂的 CUDA 代码提供了一条路径,只需使用最少的新语法和行话。
    的头像 发表于 04-11 09:58 1529次阅读

    一行Python代码如何实现并行

    Python 在程序并行方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。
    的头像 发表于 04-19 17:09 1004次阅读

    使用map函数实现Python程序并行

    Python 在程序并行方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"
    的头像 发表于 06-12 16:31 1666次阅读

    如何在OpenCV中实现CUDA加速

    OpenCV4.x中关于CUDA加速的内容主要有两个部分,第一部分是之前OpenCV支持的图像处理与对象检测传统算法的CUDA加速;第二部分是OpenCV4.2版本之后开始支持的针对深
    的头像 发表于 09-05 10:03 5006次阅读

    CUDA矩阵乘法优化手段详解

    单精度矩阵乘法(SGEMM)几乎是每一位学习 CUDA 的同学绕不开的案例,这个经典的计算密集型案例可以很好地展示 GPU 编程中常用的优化技巧。本文将详细介绍 CUDA SGEMM
    的头像 发表于 09-28 09:46 1882次阅读

    CUDA与Jetson Nano:并行Pollard Rho测试

    电子发烧友网站提供《CUDA与Jetson Nano:并行Pollard Rho测试.zip》资料免费下载
    发表于 06-15 09:30 0次下载
    <b class='flag-5'>CUDA</b>与Jetson Nano:<b class='flag-5'>并行</b>Pollard Rho测试

    FPGA加速神经网络的矩阵乘法

    电子发烧友网站提供《FPGA加速神经网络的矩阵乘法.pdf》资料免费下载
    发表于 09-15 14:50 0次下载
    FPGA<b class='flag-5'>加速</b>神经网络的<b class='flag-5'>矩阵</b><b class='flag-5'>乘法</b>