没有合适的资源?快使用搜索试试~ 我知道了~
软件X 17(2022)100901原始软件出版物ACORNS:一个易于使用的梯度和黑森的Deshana Desai1,Etai Shuchatowitz1,Zhongshi Jiang,Teseo Schneider,DanielePanozzo地址:60 5th Ave,New York,NY 10011ar t i cl e i nf o文章历史记录:接收9七月2021收到修订版2021年11月10日接受2021年保留字:代码生成自动微分a b st ra ct一阶和二阶导数的计算是从机器学习到科学计算的许多计算应用中的主要内容。我们提出了一个算法,自动区分算法写在一个子集的C99代码及其有效的实现作为一个Python脚本。我们证明,我们的算法,使自动,可靠,高效的区分常用的算法在物理模拟和几何处理。版权所有©2021作者。由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本v3.0指向此代码版本所用代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX-D-21-00129Code Ocean compute capsule N/A法律代码许可证MIT使用git的代码版本控制系统软件代码使用的语言、工具和服务Python,C99编译要求,操作环境依赖性Conda Package Manager如果可用,链接到开发人员文档/手册https://github.com/deshanadesai/acorns问题支持电子邮件panozzo@nyu.edu1. 动机和意义导数的计算被用于许多应用中,包括机器学习、科学计算、几何处理、计算机视觉、自然语言处理等等。大型复杂计算图的导数计算是这些应用的计算瓶颈。因此,导数的有效计算是一个活跃的研究兴趣的领域。在过去的几年里,人们花费了大量的研究和工程努力来支持深度学习中的应用,这导致了TensorFlow或PyTorch等库的开发,这些库针对具有大型和密集张量的应用易于使用的微分方程的可用性是深度学习取得巨大进步的原因之一它们使研究人员能够专注于新网络架构和损失函数的设计,同时自动化并确保最小化这些泛函所需的低级任务的正确性。然而,它们专门用于计算*通讯作者。电子邮件地址:panozzo@nyu.edu(Daniele Panozzo).1 两位作者对这项研究的贡献相当。https://doi.org/10.1016/j.softx.2021.100901它们仅适用于一阶导数,并且针对大而密集的张量进行了优化,这在深度学习之外的应用中并不常见。这些库的新颖之处不在于所使用的自动区分技术,而在于易于使用、跨平台可用性以及易于在新的研究项目中集成。我们的目标是提供一个类似的解决方案的科学applications需要一阶和二阶导数的表达式,涉及小到中等张量,使用基于符号微分的方法。当与现代编译器中可用的优化算法配对时,我们的方法生成的代码比现有的计算Hessians的方法快一个数量级,同时允许用户直接用C语言编写函数该算法很容易集成到现有的构建系统中,并生成无依赖性的代码。该库的核心部分是使用C99解析器在Python中实现的[1]。我们执行符号微分展开的衍生物,存储为表达式树,并生成一个有效的内核来评估他们使用现有的C99编译器,解决潜在的长编译时间与文件分割的方法。最先进的编译器能够进行复杂的优化,例如循环和表达式树向量化,消除表达式中的冗余,2352-7110/©2021作者。 由Elsevier B.V.出版。这是一篇开放获取的文章,使用CC BY许可证(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softxDeshana Desai,Etai Shuchatowitz,Zhongshi Jiang etal.软件X 17(2022)1009012xj然后重用在先前循环迭代中执行的计算。我们的方法受益于这些功能,我们的方法的性能可能会随着编译器技术的进步而提高。表达式展开还允许我们不仅针对不同的数据点,而且针对多个CPU内核上的单个数据点进行平凡的并行计算最后,我们提供了支持嵌套循环,数组和函数的算法的有效区分。与现有库的一个关键区别是,我们创建内核来有效地评估表达式本身,它的梯度和它的Hessian,所有这些都可选地支持并行求值。我们的开源实现使算法在现代C和C++应用程序中的集成变得简单,这要归功于它能够直接区分代码并生成标准的、无依赖性的C99代码,这些代码可以很容易地在现有应用程序中使用。为了证明我们的方法的实际影响,我们将其集成到两个应用程序中,一个是几何处理,一个是科学计算。我们表明,我们的库提供了重要的加速在网格参数化算法的整体运行时间和非线性弹性变形的准静态模拟。1.1. 相关工作自动(或算法)微分已经在[2我们简要回顾了最相关的工作,并 请 读 者 参 阅 各 种 书 籍 和 调 查以 获 取 更 多 细 节[5www.autodiff.org在第4节中,我们提供了针对算子重载和梯度和高阶导数的源变换的代表性方法的比较。1.2. 运算符重载实现自动微分的最常见方法是定义一个新的对象类,将梯度信息与数据相关联。在前向模式中,梯度信息在整个计算轨迹中更新。在反向模式中,记录计算磁带,然后梯度信息沿着记录磁带(反向)传播。由于原型化的多功能性和自由度,基于运算符重载的方法已经获得了很大的吸引力,值得注意的例子包括[9然而,由于额外的运行时开销,代码的效率通常会受到影响,当重复执行相同的计算时,这一点尤其明显。1.3. 源转换源代码转换方法分析输入源代码源代码转换的一个较小但实际相关的缺点是存在额外的源文件,这对构建系统和不断发展的软件的版本控制构成了挑战。我们展示了我们的库,由于其许可的开源许可证,最小的依赖性和Conda包系统中的可用性,可以毫不费力地集成到基于CMake的构建系统中[19]。我们展示了如何自动生成所需的文件作为构建过程的一部分,使自动区分对用户透明(第3.3节)。1.4. 高阶导数虽然在科学计算和数值优化中很有价值,但由于需要内存管理和稀疏模式检测,计算高阶导数具有挑战性[20,21]。因此,只有少数现有的库支持二阶或高阶导数计算。我们的方法支持密集Hessian计算,利用对称结构减少计算时间[22]。2. 软件描述我们算法的输入是用C99 [23]的子集编写的算法:我们支持数组,编译时已知范围(嵌套)循环,二进制赋值,函数和变量声明。输出是一组独立的、多线程的C99函数,用于计算输入文件中的函数、其一阶导数和二阶导数。我们将库设计成构建系统的一部分,无缝地生成衍生代码,作为软件包构建过程的一部分(第3.3节)。我们在第2.1节中概述了我们的算法,并在第3节中展示了一个原型表达式的完整执行。然后,我们将在3.1节中讨论如何并行计算,以及如何在3.2节中使我们的方法扩展到大型表达式。我们展示了该算法在合成表达式上的性能(第4节),将其与最先进的微分库进行比较,并将其集成到物理模拟中库的一个现实的基准。2.1. 概述自动启动底漆分化给定一目标函数f:Rn→Rm,相应的雅可比矩阵具有元素J ij= fi。我们使用pyc解析器[1]来解析输入的C99代码生成输入算法的抽象树(AST)树的叶子是数字常量或变量,内部节点遵循从代码构建的层次结构。让我们考虑一个例子:如果f是一个复合函数:f(x)=h<$g(x)=h(g(x)),其中x∈Rn,g:Rn→Rk,h:Rk→Rm,(most[15-18 ]),并生成一个新的Jij=fihi=++··+.(一个)计算输入函数的导数的算法。说明:运算符重载的实现方法,获取源码xj1美元xj2000年2月,gk代码文件先验打开了全局数据流分析和优化的大门,从而减少了运行时间。此外,这种方法使开发人员能够直接调试导数计算的代码,这是识别和解决数值舍入或溢出潜在问题的关键功能。依赖编译器来编译生成的源代码使得这些方法是面向未来的,在这个意义上,生成的代码将受益于编译器设计和优化的进展。在我们的算法中,我们限制到C99的一个子集,涵盖科学计算,有限元分析和计算机图形学中的常见用例。从例子中我们可以看出,函数f将雅可比矩阵对向量的作用分解为简单的分量,这些分量被顺序地评估我们将计算每一部分的导数所需的操作最后的导数是子操作的分段导数的累积,遵循链式规则。为了计算二阶导数,我们对树进行两次微分。我们利用Hessian的对称性进一步优化了计算次数:我们只计算矩阵的下三角部分,并将其复制到上三角部分。Deshana Desai,Etai Shuchatowitz,Zhongshi Jiang etal.软件X 17(2022)1009013具体实施细节。导数公式在一系列赋值中展开(不使用循环或条件),并保存在C文件中然后使用完整的代码优化(-O3withgcc[24]和clang[25])编译该文件这利用了编译器在程序中存在循环或条件语句的情况下,我们执行额外的解析步骤来扩展这些结构。我们执行循环展开,以产生一系列的操作,并消除控制循环的其他指令条件语句是通过在解析过程中评估其条件来删除的此阶段的输出是分配指令的列表,其以中间二进制格式存储然后解析该文件以创建AST,区分,并将区分的AST导出为C文件。3. 说明性示例为了进一步说明ACORNS的机制,我们考虑一个典型的统计例子。我们将计算两个概率分布a和b之间的交叉熵损失函数的梯度。损失函数可以由以下C99代码给出:该函数展开后生成以下代码:从展开的代码构造抽象树。使用反向传播来区分语法树以构造导数方程。这个展开的代码最终由启用了完整代码优化的C编译器编译(见图10)。①的人。3.1. 并行化并行计算可用于加速大梯度或Hessians的评估[26]。我们观察到,在我们的情况下,不同条目的评估是独立的,因此可以使用OpenMP [27]指令进行简单的并行化。我们在第4节中实验性地研究了生成代码的缩放。Fig. 1. 交叉熵损失函数的表达式图3.2. 大表达式随着表达式的复杂性和/或输出数量的增加,生成的C文件的大小相应地增加。虽然这为编译器提供了更多优化计算的机会,但也增加了内存消耗和编译时间。对于大型表达式,如Hessian对于立方拉格朗日元素,这可能变得不切实际。 我们提出了一个简单,但有效和实用的策略来克服这个问题:我们将输出分成多个独立编译的C文件。这样做的缺点是减少了编译器的优化机会。然而,在我们的实验中,性能下降是可以忽略不计的,因此我们积极地使用这个选项来减少编译时间。为了评估分裂对性能的影响,我们考虑了一个用于计算线性、二次和三次拉格朗日元素(分别为12、30和60个变量)的新胡克弹性能量[28]的函数。这些函数生成的代码很大(60个变量的函数为29 GB),使用gcc9编译不会在160小时内终止我们测试了分割成不同数量的文件,测量编译时间,评估时间和编译后的二进制大小。正如预期的那样,编译时间随着文件变小而减少(图2顶部),而生成的二进制文件的大小不会受到拆分的明显影响(图2顶部)。 2中间)。令人惊讶的是,生成的代码的评估时间也没有受到拆分的明显影响(图2底部)。因此,默认情况下,我们选择拆分,使每个文件的大小约为16 MB,这是文件数量和编译时间之间的一个很好的折衷3.3. 集成到CMake构建系统中我们的系统的关键设计目标之一是简单,基于数值方法的快速部署。我们展示了如何将ACORNS集成到CMake构建系统中,以实现快速轻松的部署。下面我们将描述这个过程,并参考我们的github存储库以获取完整的示例https://github.com/deshanadesai/acorns。让我们考虑一个简单的问题:我们想使用梯度下降来最小化以下函数(保存在文件function.c中)Deshana Desai,Etai Shuchatowitz,Zhongshi Jiang etal.软件X 17(2022)1009014∏×× ××××x/。要将ACORNS用于其派生,我们需要将代码生成添加到CMake项目文件中:3. Mitsuba Autodiff [14,29]使用运算符重载计算自动微分,并依赖于线性代数和存储的本征[30我们只使用静态堆栈分配的矩阵来运行所有的比较,因为动态模式比较慢,而且对于我们用于基准测试的表达式来说是不必要的4. Enoki [31]是一个专门为支持可微分渲染而开发的新库与PyTorch类似,它支持CPU和GPU评估,我们只与CPU版本进行比较,并且只针对梯度,因为它不支持Hessian计算。5. Adept [32]是一个使用运算符重载来执行自动微分的C++库。它不支持高阶导数,因此我们将比较限制在梯度上。Adept不支持并行化,所以我们在单个线程上运行比较。我们在运行Ubuntu 19.10 GNU/Linux 5.3.0-29-generic x86_64的2.35 GHz AMD EPYC™表达式类型。我们使用三个表达式来评估使用自微分的不同现实场景:1. 高阶多项式、非多项式函数和具有大量变量的过程表达式:这将生成ders_0.h和ders_0.c文件,它们将直接由CMake编译,并与另f(x)=x2+3x−x/4+x4+22 7x3+x9(二)项目中的文件。使用导数,以包含生成的头文件。我们展示了一个使用计算的导数通过梯度下降找到根的例子。4. 影响我们将生成的代码与4种最先进的微分算法进行比较:1. Tapenade [15]与我们的系统有许多相似之处。它将C代码转换为计算其导数和Hessians的C程序。22. PyTorch [9]是一个面向机器学习的后向自动微分库。它提供了CPU和GPU版本,我们只比较CPU版本。2 Tapenade中的Hessian计算不受官方支持,我们使用文档的Q A部分中提出的半手动构造进行比较。2. 标量三角函数:g(x)= sin(x)+cos(x)+x2。(三)3. 具有s个变量的向量值多项式Sh s(x)= 4 s x i(1 − x i),x =(x1,. . . ,x s)。(四)i=1对于每个表达式,我们随机生成评估点,并绘制10次运行的平均运行时间ACORNS生成C代码,Mitsuba和Enoki都在C++中运行。所有的C和C++代码都是用gcc 9/g++9编译的,标志是-O3,-ffast-math,-flto和,仅适用于C++,-std=c++11。梯度离心图3(顶部)我们报告了三个函数的不同数量的评估点的时间。对于两个多项式函数,我们比Mit-suba,Adept和Enoki快大约5倍,比PyTorch快2.9倍。对于三角函数,由于计算三角函数的成本增加,我们的优势略有减少。对于梯度,我们的方法与Tapenade非常相似,并且我们获得了相当的时间。图 4(左)我们固定评估的数量,并改变方程中的参数s。(4)评估方法如何随变量的数量而缩放。正如预期的那样,所有方法都是线性缩放的,但我们的方法仍然是3.97 7。95,分别比Mitsuba,Enoki和Pytorch快3倍。 与图 3、Tapenade的代码运行时间和我们的非常相似。熟练的规模类似于Enoki。黑森我们重复与上一节相同的实验,将ACORNS与Mitsuba,PyTorch和Tapenade进行比较,以计算Hessians。图 3(底部)表明我们的代码非常高效,12。8比Mitsuba快,1336比Py- Torch(它没有被优化来评估Hessians)快。Tapenade比其他替代方案更快,但它仍然比我们的代码慢5倍左右。还请注意,虽然Hessian生成是完全自动的ACORN,但它确实需要与Tapenade手动交互,因为Hessian计算不完全支持。相对于Hessian评估的变量数量的缩放如图所示。4(右)与梯度具有相似的趋势。Deshana Desai,Etai Shuchatowitz,Zhongshi Jiang etal.软件X 17(2022)1009015=图二. (上图)分别为12、30和60个变量的函数的Hessian的编译时间。(中)为Hessians生成的二进制文件(.o)的存储大小分别是12、30和60个变量的函数(下)分别为12、30和60个变量的函数的Hessian的运行时间图三. 计算不同测试函数的梯度(顶部)或Hessian(底部)的对数尺度平均运行时间。(a)方程中的长多项式(2)(b)方程中的(3)(c)方程中的多项式(4)s=10。平行评价。 我们在Eq中运行函数。 (4)对于S25并计算了100000个评估点的梯度,允许OpenMP使用不同数量的线程。我们观察到一个几乎线性的扩展到15个线程,如图所示。 5(右)开我们的工作站,然后当更多的线程被添加时,它会停止运行。我们推测,这是由于饱和的内存带宽的工作站,因为我们的任务本质上是大规模并行。Deshana Desai,Etai Shuchatowitz,Zhongshi Jiang etal.软件X 17(2022)1009016图四、 运行时间相对于 方 程 中 多 项 式 的变量数 。(4)对于不同的方法。(a)梯度(b)黑森。图五. 时间和加速我 们 的方法超过线 程 数计算Hessian表达式h25方程。(4)100,000点。5. 结论我们介绍了ACORNS,这是一个用于自动微分的软件库,可以生成用于计算梯度和Hessian的高效内核,并且可以轻松集成到现有的C或C++项目中。我们的算法的核心思想是完全展开计算图,并依靠现代编译器来优化结果代码。与替代方案相比,我们的算法在Hessian计算的评估时间更快,但在编译过程中更慢:我们相信这种权衡对于许多科学计算应用程序来说非常有趣,其中小的密集Hessian的评估重复了数百万次。通过在生成.c文件之前对代码执行符号简化,可以缩短编译时间。 此外,我们可以通过直接生成字节码(例如LLVM编译器[25])并在内存中编译来避免编译器的解析时间,从而避免不必要的磁盘访问。ACORNS不支持分支和循环中使用的条件变量。可以添加对它的支持,但由于优化选项减少和更复杂的并行化,性能可能会下降。我们希望扩展ACORNS以直接支持稀疏Hessian的生成[21,33],并将代码生成扩展到目标GPU加速器。我们的开源参考实现和一组关于如何使用它的示例可以在https://github上找到。com/deshanadesai/acorns,它也作为conda- forge上的Conda包发布,允许在所有主要操作系统上轻松安装我 们 还 在 https : //github 上 发 布 了 我 们 的 基 准 测 试 。com/geometryprocesing/acorns-benchmark以促进我们的结果的可复制性。竞合利益作者声明,他们没有已知的竞争性财务利益或个人关系,可能会影响本文报告的工作致谢我们感谢NYU High Performance Computing提供的资源、服务和员工专业知识。这项工作得到了美国国家科学基金会CA-REER奖的部分支持,1652515,美国国家科学基金会授予OAC-1835712、OIA 1937043、CHS-1908767、CHS-1901091,加拿大授 予 RGPIN-2021-03707 和 DGECR-2021-00461 、 Sloan 奖 学 金 、Adobe Research的礼物、nTopology的礼物,以及由AdvancedMicro Devices,Inc.提供阑尾应用我们在几何处理和物理模拟两个应用程序中集成了ACORNS,以评估在现实环境中的性能增益。在这两种情况下,算法需要组装一个密 集 的 梯 度 和 一 个 稀 疏 的 Hessian 。对 于 这 两 个 应 用 程 序 ,ACORNS用于计算小密集Deshana Desai,Etai Shuchatowitz,Zhongshi Jiang etal.软件X 17(2022)1009017表A.1优化曲面网格的参数化。表A.2不同FE度的Neo-Hookean弹性模拟图块,然后组装在一个更大的稀疏海森矩阵。直接支持稀疏Hessian的自动构造是未来工作的一个有趣途径。A.1. 参数化给定一个嵌入在三维空间中的曲面,几何处理中的一个重要问题是给它赋参数值,即计算曲面在平面上的展平。我们建议读者参考[34,35]进行全面调查。在我们的应用中,我们考虑使用投影牛顿方法[ 37 ]最小化非凸对称Dirichlet能量[36]该算法涉及计算每个元素的完整雅可比矩阵和海森矩阵:我们最初的实现使用Mitsuba,我们用ACORNS代替它我们在表A.1中总结统计数据。自动微分运行时间大大减少,但在此应用中,不是瓶颈,因此导致总体运行时间的小幅减少。A.2. 有限元模拟有限元法的目的是求解描述物理现象的偏微分方程。一个典型的例子是模拟一个弹性体的变形受到一些外力(边界条件);该算法涉及最小化弹性能量,并需要计算导数。我们将ACORNS集成到PolyFEM [38]中,并针对不同的有限元离散阶数(从线性到立方),比较了使用Mitsuba autodiff和ACORNS计算Hessian和能量梯度的Neo-Hookean模拟的时间。在有限元法中,所有的计算都是在每个四面体上局部进行的不同Deshana Desai,Etai Shuchatowitz,Zhongshi Jiang etal.软件X 17(2022)1009018阶将具有不同的局部自由度数(其确定梯度和Hessian的大小):线性四面体具有12个,二次型具有30个,而三次型具有60个。我们的方法在整个模拟时间内提供了2到4倍的总体加速,具体取决于程度(表A.2)。引用[1] 本德斯基湾Pycparser。GitHubRepository2020.https://github.com/eliben/pycparser.[2] Wengert RE.一个简单的自动导数求值程序. Commun ACM 1964;7(8):463-4. http://dx.doi.org/10.1145/355586.364791网站。[3] 斯皮尔彭宁湾编译快速偏导数的函数算法。Tech.代表,伊利诺伊大学,Urbana(USA).部计算机科学;1980年,http://dx.doi.org/10.2172/5254402。[4] Beda LM,Korolev LN,Sukkikh NV,Frolova TS. BESM机床的自动微分程序。技术报告,莫斯科,苏联:科学院精密力学和计算技术研究所; 1959年,(俄文)。[5] 瑙曼大学微分计算机程序的艺术:算法微分导论。第24卷,SIAM; 2012,http://dx.doi.org/10。1137/1.9781611972078。[6] 作者声明:A.评估衍生品:算法微分的原理和技术。第105卷,Siam; 2008,http://dx.doi.org/10。1137/1.9780898717761。[7] Bischof CH,Bücker HM.计算机程序的计算衍生物在:Grotendorst J,编辑.量子化学的现代方法和算法:会议录。NIC系列,第二版。卷3,Jülich:NIC-Directors; 2000,p.315http://hdl.handle.net/2128/6053[8] 马戈西恩山 自动微分及其应用有效的实施。Wiley Intercept Rev Data MinKnowl Discov 2019;9(4):e1305。http://dx.doi.org/10.1002/widm.1305网站。[9] Paszke A, Gross S, Massa F , Lerer A , Bradbury J, Chanan G, et al.PyTorch : An imperative style , high-performance deep learning library.在:神经信息处理系统的进展。2019年,第8024-35[10]Paszke A,Gross S,Chintala S,Chanan G,Yang E,DeVito Z,et al.In:NIPS Autodiff Workshop; 2017.[11]Abadi M , Barham P , Chen J , Chen Z , Davis A , Dean J 等 人 ,Tensorflow:大规模机器学习系统。在:第12届{USENIX}操作系统设计和实现研讨会({OSDI}16)。2016,p.265-83.http://dx.doi.org/10.1145/2450153.2450158网站。[12]贝尔BM。CppAD:一个C++算法微分的软件包。Comput.下。操作员Res.2012;57(10).网址https://coin-or.github.io/CppAD/doc/cppad.htm。[13]Griewank A,Juedes D,Utke J. Algorithm 755:ADOL-C:A package fortheautomaticdifferentiationofalgorithmswritteninC/C++.ACMTransMathSoftw1996;22(2):131-67.http://dx.doi.org/10.1145/229473.229474网站。[14]雅各布·W Mitsuba渲染器。 2010,http://www.mitsuba-renderer.org。[15]Hascoet L,Pascual V. Tapenade自动微分工具:原理,模型和规范。ACMTransMathSoftw2013;39(3):1-43.http://dx.doi.org/10.1145/2450153.2450158网站。[16] 张文辉,王文辉,王文辉. TAC++的开发和首次应用。在:自动微分的进展。Springer; 2008,p. 187-97. http://dx.doi.org/10.1007/978-3-540-68942-3_17网站。[17]Vassilev V,Vassilev M,Penev A,Moneta L,Ilieva V. Clad -使用clang和LLVM 的 自 动 区 分 。 608 , ( 1 ) : IOP Publishing; 2015 , 012055.http://dx.doi.org/10.1088/1742-6596/608/1/012055网站,[18]Moses WS,Churavy V.不是为机器学习重写外来代码,而是自动合成快速梯度。In:Larochelle H,Ranzato M,Hadsell R,Balcan MF,Lin H,editors.神 经 信 息 处 理 系 统 研 究 进 展 。 33 , 2020 , 第 12472-85 页https://proceedings.neurips。cc/paper/2020/file/9332c513ef44b682e9347822c2e457ac-Paper.pdf。[19]马丁·K霍夫曼·B掌握cmake:一个跨平台的构建系统。Kitware;2010.[20]Gower RM,Mello MP. Hessian矩阵的自动微分坎皮纳斯国立大学,数学研究所,EstatísticaeComputação Científica;2010。[21] 瓦 尔 特 A. 用 自 动 微 分 法 计 算 稀 疏 海 森 ACM TransMath Softw 2008;34(1):1-15. http://dx.doi.org/10.1145/1322436的网站。1322439。[22]Petra CG,Qiang F,Lubin M,Huchette J.在Julia中使用边缘推送算法进行有 效 的 Hessian 计 算 。 OptimMethodsSoftw2018;33 : 1010-29.http://dx.doi.org/10.1080/10556788.2018.1480625网站。[23]Ritchie DM , Kernighan BW , Lesk ME. C 编 程 语 言 。PrenticeHallEnglewood Cliffs; 1988.[24]StallmanRM.GNU编译器集合内部。2002年成立[25]Lattner C,Adve V. Llvm:A compilation framework for lifetime programanalysis transformation. 2004年,代码生成和优化国际研讨会。CGO 2004..IEEE; 2004年,第75-86页。http://dx.doi.org/10.1109/CGO.2004.1281665。[26]Bücker HM,Rasch A,Vehreschild A.海森计算并行代码的自动生成。2005年和2006年关于OpenMP共享内存并行编程的国际会议论文集。IWOMPhttp://dx.doi.org/10.1007/978-3-540-68555-5_30网站。[27]Chandra R,Dagum L,Kohr D,Menon R,Maydan D,McDonald J.在OpenMP中进行并行编程。Morgan Kaufmann; 2001.[28]里夫林海峡各向同性材料的大弹性变形。1.基本概念。Philos Trans R SocLondSerAMathPhysEngSci1948;240 ( 822 ) : 459-508.http://dx.doi.org/10.1007/978-1-4612-2416-7_5网站。[29]Grinspun E,Hirani AN,Desbrun M,Schröder P.离散壳。2003年ACMSIGGRAPH/Eurographics计算机动画研讨会论文集。Citeseer; 2003,p. 62比7[30]Guennebaud G,Jacob B,等.特征值v3。2010,http://eigen.tuxfamily.org。[31]雅各布·W Enoki:现代处理器架构上的结构化向量化与差异化。2019年,https://github.com/mitsuba-renderer/enoki。[32]霍根RJ。在C++中使用表达式模板的快速反向模式自动微分。ACM TransMath Softw 2014;40(4):1-16. http://dx.doi的网站。org/10.1145/2560359。[33]Gebremedhin AH,Tarafdar A,Poten A,Walther A.利用着色和自动微分有 效 计 算 稀 疏 海 森 。 通 知J Comput 2009;21 ( 2 ) : 209-23.http://dx.doi.org/10.1287/ijoc.1080.0286网站。[34]Floater MS,Hormann K.表面参数化:教程和调查。 在:几何建模的多分辨率进展。Springer; 2005, p. 157-86. http://dx.doi.org/10.1007/3-540-26808-1_9网站。[35]Sheffer A,Hormann K,Levy B,Desbrun M,Zhou K,Praun E,et al.Mesh parameterization:Theory and practice.在:ACM SIGGRAPPH课程笔记。10,(1281500.1281510).2007,http://dx.doi.org/10.1145/1508044.1508091。[36]Smith J,Schaefer S.具有自由边界的双射参数化。ACM Trans Graph 2015;34(4):1-9. http://dx.doi.org/10.1145/2766947网站。[37]张 文 辉 , 张 文 辉 , 张 文辉 .鲁 棒 准 静 态 有限 元 与 肉 体 模 拟 。 2005 年 ACMSIGGRAPH/Eurographics计算机动画研讨会论文集。2005,第181-90页。http://dx.doi.org/10的网站。1145/1073368.1073394。[38]Schneider T,Dumas J,Gao X,Zorin D,Panozzo D.PolyFEM。2019年,https://polyfem.github.io/网站。
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功