应用介绍
cuDNN工具包是由NVIDIA公司开发的一款深度神经网络库,通俗的来讲就是一个GPU加速深层神经网络原语库。cuDNN为标准例程(如向前卷积,向后卷积,归一化和激活层)提供高度优化的实现。cuDNN是NVIDIA深度学习SDK的一部分。
世界各地的深度学习研究人员和框架开发人员都依靠cuDNN来实现高性能GPU加速。它使他们能够专注于训练神经网络和开发软件应用程序,而不是花时间在低级别的GPU性能调整上。cuDNN加速广泛使用的深度学习框架,包括Caffe2,MATLAB,微软认知工具包,TensorFlow,Theano和PyTorch。查看支持的框架了解更多详情。NVIDIA开发者计划的成员免费提供cuDNN。
cuDNN的主要特征
LRN,LCN,批量归一化,丢失,CTC,ReLU,Sigmoid,softmax和Tanh等许多常见图层类型的前向和后向路径
为卷积神经网络设计的前向和后向卷积程序,包括互相关
LSTM和GRU递归神经网络(RNN)和持久RNN
四维张量的任意维排序,跨步和子区域意味着可以很容易地集成到任何神经网络实现中
张量转换函数
基于上下文的API允许简单的多线程
Windows,Linux和MacOS系统支持cuDNN,包括Volta,Pascal,Kepler,Maxwell Tegra K1,Tegra X1和Tegra X2 GPU。
uDNN 7新功能
使用cuDNN 7的深度学习框架可以利用Volta体系结构的新功能和性能,与Pascal GPU相比,可以将培训性能提高3倍。现在,NVIDIA®(英伟达™)开发者计划的成员可免费下载cuDNN 7。亮点包括:
ResNet50训练速度提高2.5倍,NMT语言翻译训练速度提高3倍Tesco V100与Tesla P100相比,LSTM RNN
在Volta GPU上使用混合精度张量核操作加速卷积
用于时间分类的诸如ResNeXt和Xception和CTC(连接主义者时间分类)损失层的模型的分组卷积。
常见问题
问:什么是CUDA?
CUDA®是一种并行计算平台和编程模型,通过利用图形处理单元(GPU)的强大功能,可显着提高计算性能。
自2006年推出以来,CUDA已经通过数以千计的应用程序和已发表的研究论文被广泛部署,并且已经在笔记本电脑,工作站,计算集群和超级计算机上安装了数以亿计的支持CUDA的GPU。在天文学,生物学,化学,物理学,数据挖掘,制造,金融以及其他计算密集领域使用的应用正在使用CUDA来提高GPU加速的优势。
问:什么是NVIDIA Tesla?
借助全球首款teraflop多核处理器,NVIDIA®(英伟达™)Tesla™计算解决方案实现了高能效并行计算能力的必要转换。凭借每个处理器数千个CUDA内核,Tesla可以快速,准确地扩展以解决全球最重要的计算挑战。
问:什么是OpenACC?
OpenACC是编译器指令或提示的开放式行业标准,可以用C或Fortran编写的代码插入,使编译器能够生成在多CPU和GPU加速系统上并行运行的代码。OpenACC指令是利用GPU计算能力的简单而强大的方法,同时保持代码与非加速CPU系统兼容。在/ openacc了解更多信息。
问:使用GPU计算而不是仅使用CPU的代码,可以期待哪种性能提升?
这取决于问题如何映射到架构上。对于数据并行应用程序,已经看到两个以上数量级的加速度。您可以在我们的CUDA In Action页面上浏览研究,开发人员,应用程序和合作伙伴
问:CUDA支持哪些操作系统?
CUDA支持Windows,Linux和Mac OS。有关完整列表,请参阅最新的CUDA工具包 发行说明。最新版本可从https://docs.nvidia.com获取
问:哪些GPU支持运行CUDA加速应用程序? CUDA是所有NVIDIA GeForce,Quadro和Tesla GPU以及NVIDIA GRID解决方案的标准功能。完整列表可以在CUDA GPU页面上找到。
问:什么是“计算能力”?
GPU的计算能力决定了其一般规格和可用功能。有关详细信息,请参阅“CUDA C编程指南”中的“ 计算功能”部分。
问: 哪里可以找到一个好的并行编程的介绍?
有几个在线大学课程,技术网络研讨会,文章系列,还有几本关于并行计算的优秀书籍。这些可以在我们的CUDA教育页面找到。
硬件和架构
问:下一个新的GPU架构发布时,是否需要重新编写我的CUDA内核?
CUDA C / C ++不提供抽象; 这是你表达你想如何执行你的程序的一种手段。编译器生成也不是硬件特定的PTX代码。在运行时,PTX被编译用于特定的目标GPU - 这是驱动程序的责任,每次发布新的GPU时都会更新。寄存器数量或共享内存大小的变化可能会为进一步优化提供机会,但这是可选的。所以现在编写你的代码,并享受在未来的GPU上运行
问:CUDA在一个系统中是否支持多个显卡?
是。应用程序可以跨多个GPU分配工作。这不是自动完成的,所以应用程序有完整的控制权。请参阅GPU Computing SDK中的“multiGPU”示例,以获取编程多个GPU的示例。
编程问题
问:我认为我在CUDA中发现了一个错误,我该如何报告?
注册成为CUDA注册开发者,一旦您的应用程序获得批准,您可以提交将由NVIDIA工程师审核的错误。
你的错误报告应该包括一个简单的,自包含的代码来说明这个错误,以及错误的描述和预期的行为。
请在您的错误报告中包含以下信息:
机器配置(CPU,主板,内存等)
操作系统
CUDA工具包版本
显示驱动程序版本
对于Linux用户,请附上运行“nvidia-bug-report.sh”生成的nvidia-bug-report.log。
问:CUDA结构计算如何?
CUDA广泛地遵循数据并行计算模型。通常,每个线程并行地在数据的不同元素上执行相同的操作。
数据被分成一维,二维或三维网格。每个块可以是一维,二维或三维形状,并且可以在当前硬件上包含超过512个线程。线程块内的线程可以通过共享内存进行协作。
线程块被作为称为“warps”的更小的线程组来执行。
问:CPU和GPU可以并行运行吗?
CUDA中的内核调用是异步的,因此一旦启动内核,驱动程序就会将控制权返回给应用程序。
测量性能时应使用“cudaThreadSynchronize()”API调用,以确保在停止计时器之前所有设备操作都已完成。
执行内存拷贝的CUDA函数和控制图形互操作性是同步的,隐含地等待所有的内核完成。
问:我可以传输数据并运行一个内核(对于流式应用程序)吗?
是的,CUDA支持使用CUDA流重叠GPU计算和数据传输。有关更多详细信息,请参阅“ CUDA C编程指南” 的“ 异步并行执行”部分。
问:是否有可能从另一个PCI-E设备直接DMA进入GPU内存?
GPUDirect允许您直接DMA到GPU主机内存。有关详细信息,请参阅GPUDirect技术页面。
问:CPU和GPU之间的峰值传输速率是多少?
内存传输的性能取决于许多因素,包括传输的大小和系统主板的类型。
在PCI-Express 2.0系统中,我们测得的传输速率高达6.0 GB /秒。
您可以使用SDK中的bandwidthtest示例来测量系统上的带宽。
从页面锁定的内存转移更快,因为GPU可以直接从这个内存DMA。但是,分配过多的页面锁定内存会严重影响系统的整体性能,请谨慎分配。
问:CUDA中数学运算的精度是多少?
所有当前的NVIDIA GPU图形系列和GT200以来都有双精度浮点。请参阅编程指南了解更多详情。所有具有计算能力的NVIDIA GPU均支持32位整数和单精度浮点运算。它们遵循IEEE-754标准,用于单精度二进制浮点运算,但有一些细微差别。
问:为什么我的GPU计算结果与CPU结果稍有不同? 有很多可能的原因。浮点计算不能保证在任何一组处理器体系结构中给出相同的结果。在GPU上以数据并行方式实现算法时,操作顺序常常会有所不同。
这是浮点算法的一个很好的参考:
精确性和性能:NVIDIA GPU的浮点和IEEE 754兼容性
问:CUDA是否支持双精度算术?
是。计算能力为1.3及更高的GPU在硬件上支持双精度浮点。
问:我如何获得双精度浮点在我的内核中工作?
你需要将开关“-arch sm_13”(或更高的计算能力)添加到你的nvcc命令行,否则双打将被静默降级为浮动。请参阅CUDA安装程序中包含的“ Mandelbrot ”示例,了解如何根据GPU的计算能力在不同内核之间切换的示例。
问:我可以从纹理中读取双精度浮点数吗?
硬件不支持双精度浮点作为纹理格式,但是只要不需要插值,就可以使用int2并将其转换为双精度:
texture
static __inline__ __device__ double fetch_double(texture
{
int2 v = tex1Dfetch(t,i);
return __hiloint2double(vy,vx);
}
问:CUDA是否支持长整数?
是的,CUDA支持64位整数(long long)。根据计算能力,这些类型的操作可以编译为某些GPU上的多个指令序列。
问:我在哪里可以找到有关PTX汇编语言的文档?
这包含在CUDA工具包文档中。
问: 如何查看我的程序生成的PTX代码?
将“-keep”添加到nvcc命令行(或Visual Studio中的自定义生成设置)以保留中间编译文件。然后看看“.ptx”文件。
问: 我怎么知道我的内核有多少个寄存器/多少共享/常量内存?
将选项“--ptxas-options = -v”添加到nvcc命令行。编译时,这些信息将被输出到控制台。
问: 是否可以同时执行多个内核?
是。计算能力2.x或更高的GPU支持并发内核执行和启动。
问: CUDA内核的最大长度是多少?
由于这可能取决于GPU的计算能力,因此可以在CUDA C编程指南的“功能和技术规格”部分中找到明确的答案。
问:如何调试我的CUDA代码?
有几个强大的调试工具,允许创建断点和痕迹。所有主要操作系统和多GPU解决方案和集群均存在工具。请访问CUDA工具和生态系统页面以获取最新的调试工具。
问:如何优化我的CUDA代码?
现在有关如何优化CUDA代码的广泛指南和示例。在下面找一些有用的链接:
CUDA C编程指南
CUDA教育页面
性能分析工具
优化的库
问:如何选择每块最佳线程数?
为了最大限度地利用GPU,您应该仔细地平衡每个线程块的线程数量,每个块的共享内存数量以及内核使用的寄存器数量。
您可以使用CUDA占用率计算器工具通过给定的CUDA内核来计算GPU 的多处理器占用率。这是作为最新CUDA工具包的一部分。
问:最大的内核执行时间是多少?
在Windows上,单个GPU程序启动的最大运行时间约为5秒。超过这个时间限制通常会导致通过CUDA驱动程序或CUDA运行时报告的启动失败,但在某些情况下可能会挂起整个机器,需要硬重置。
这是由Windows“看门狗”定时器引起的,如果它们的运行时间超过了最大允许时间,则会导致使用主图形适配器的程序超时。
出于这个原因,建议CUDA在未连接到显示器的GPU上运行,并且没有将Windows桌面扩展到它。在这种情况下,系统必须至少包含一个用作主要图形适配器的NVIDIA GPU。
问:我如何计算GPU上数组的总和?
这被称为并行减少操作。有关更多详细信息,请参阅“缩小”示例。
问:如何从每个线程输出可变数量的数据?
这可以使用并行前缀和(也称为“扫描”)操作来实现。CUDA数据并行基元库(CUDPP)包含高度优化的扫描函数:
https : //www.gpgpu.org/developer/cudpp/
“ marchingCubes ”示例演示了如何使用扫描来获得每个线程的变量输出。
问:如何在GPU上对阵列进行排序?
提供的“粒子 ”样本包括快速平行基数排序。
要对块中的数组进行排序,可以使用平行比特排序。另请参阅“bitonic”示例。
Thrust库还包括排序功能。在线样本文件。
问:我需要分发我的CUDA应用程序?
使用驱动程序API的应用程序只需要CUDA驱动程序库(Windows下的“nvcuda.dll”),它是标准NVIDIA驱动程序安装的一部分。
使用运行时API的应用程序还需要包含在CUDA Toolkit中的运行时库(Windows下的“cudart.dll”)。根据CUDA工具包中包含的最终用户许可协议的条款,可以将此库与您的应用程序一起分发。
问:如何从我的应用程序获取有关GPU温度的信息?
在Microsoft Windows平台上,NVIDIA的NVAPI可以访问GPU温度和许多其他低级GPU功能。
在Linux下,标准驱动程序安装中包含的“nvidia-smi”实用程序也会显示所有已安装设备的GPU温度。
工具,图书馆和解决方案
问:什么是CUFFT?
CUFFT是CUDA的快速傅立叶变换(FFT)库。有关更多信息,请参阅CUFFT文档。
问:CUFFT支持哪些类型的转换?
当前版本支持复杂到复杂(C2C),实际到复杂(R2C)和复杂到实际(C2R)。
问:什么是最大变换大小?
对于1D变换,1.0版本中的最大变换大小为16M元素。
问:什么是CUBLAS?
CUBLAS是CUDA驱动程序之上的BLAS(基本线性代数子程序)的一个实现。它允许访问NVIDIA GPU的计算资源。该库在API级别上是独立的,也就是说,不需要与CUDA驱动程序直接交互。
问:NVIDIA在Linux和MAC上有CUDA调试器吗?
是CUDA-GDB是用于Linux发行版和MAC OSX平台的CUDA调试器。
问:CUDA-GDB是否支持任何用户界面?
CUDA-GDB是一个命令行调试器,但可用于GUI前端,如DDD - 数据显示调试器,Emacs和XEmacs。也有第三方解决方案,请参阅我们的工具和生态系统页面上的选项列表
问:Parellel Nsight和CUDA-GDB的主要区别是什么?
除了以下内容,它们都具有相同的功能:
Parallel Nsight在Windows上运行,可以在GPU上调试图形和CUDA代码(不需要调试CPU代码)。
CUDA-GDB在Linux和Mac OS上运行,可以在GPU上调试CPU代码和CUDA代码(在GPU上不需要图形调试)。
问:如何使用交互式桌面调试OGL + CUDA应用程序?
您可以ssh或使用nxclient或vnc来远程调试OGL + CUDA应用程序。这要求用户在X服务器配置文件中禁用交互式会话。有关详细信息,请参阅CUDA-GDB用户指南。
问:我使用哪个调试器进行群集调试?
NVIDIA与其合作伙伴合作提供集群调试器。有两个集群调试器支持来自Allinea的 CUDA - DDT和来自RogeWave软件的TotalView调试器。
问:-G标志对代码优化有什么影响?
-G标志关闭了CUDA代码中的大部分编译器优化。有些优化不能关闭,因为它们是应用程序保持正常运行所必需的。例如:局部变量不会溢出到本地内存,而是保存在调试器跟踪生存区域的寄存器中。需要确保应用程序在调试模式下编译时不会因内存不足而无法启动,而没有调试标志。