好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

cublas库 中文简介.doc

4页
  • 卖家[上传人]:兰***
  • 文档编号:210229027
  • 上传时间:2021-11-13
  • 文档格式:DOC
  • 文档大小:22KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • cublas库 中文简介Cublas Library 第一章 简介 Cublas Library 就是在NVIDIA CUDA中实现Blas(基本线性代数子程序)它允许用户访问NVIDIA中GPU(图形处理单元)的计算资源,但不能同时对多个GPU进行自动并行访问.在使用Cublas library时,应用程序必须在GPU内存空间中分配所需的矩阵向量空间,并将其填充数据,再顺序调用所需的Cublas函数,最后将计算结果从GPU内存空间上传到主机中Cublas library 同时还提供了从GPU中书写和检索数据的功能 1.1 数据布局 对于现有的具有最大兼容性的Fortran环境,Cublas library使用column-major storage(列主序存储)和1-based indexing(以1开始索引)由于C和C++使用row-major storage, 使得用这些语言编写的应用程序对于二维数组不能使用本地数组语义相反,宏或内联函数应该被定义为实现以为数组矩阵将Fortran代码机械的移植到C中,你可以选择保留1-based indexing 以避免转换循环。

      在这种情况下,矩阵中位于i行j列的数组元素可通过下面的宏计算:#define IDX2F(i,j,ld) ((((j)-1)*(ld))+((i)-1))这里,ld代表矩阵的主要维度,而在列主序存储矩阵中代表行数在本地写C或C++代码,我们喜欢用0-based indexing, 那么上述矩阵中元素可通过下面宏计算: #define IDX2C(i,j,ld) (((j)*(ld))+(i)) 1.2 新的和遗留的Cublas AP1(应用程序接口) 从第四版开始, Cublas Library提供了一个升级的API,另外还有已有的 legacy API. 这节讨论为什么要提供新的API,它有哪些优势,以及与原先的API 的区别 新的CUBLAS library API可以通过引用头文件“cublas_v2.h”而被使用它包含以下legacy CUBLAS library API 所没有的特征 1.已经利用函数初始化了对Cublas Library 内容的处理并明确的传递给每个后续的库函数调用,这使得用户在使用多主机线程和多个GPU时能对库的设置有更多的控制。

      这也使得CUBLAS API成为可重入的 2.标量α和β可通过引用传递给主机或设备,替代原先只能通过主机数值进行传递这种改变使得库函数在使用流时可以异步地并行执行,即使当α和β由前一个内核所产生 3.当库例程序返回一个标量结果时,它可通过主机或设备上的应用返回,代替只能通过主机上的数值返回这种改变允许库例程序被称为异步的,当标量结果通过设备参数产生和返回导致最大的并行性 4.错误状态cublasStatus_t可通过所有Cublas Library 函数调用返回,这种变化促进了调试并简化了软化开发cublasStatus重命名为cublasStatus_t使它更符合Cublas Library库中其他类型 5.? cublasAlloc()和cublasFree()函数已被弃用,此更改分别移除cudaMalloc() 和 cudaFree()中不必要的包装 6.?函数cublasSetKernelStream()被重命名为cublasSetStream()以便更符合CUDA libraries中其他内容 第二章 使用Cublas AP1 2.1. Error status(错误状态) 所有的CUBLAS library都通过cublasStatus_t返回错误状态。

      2.2. CUBLAS context 所有应用程序必须通过调用cublasCreate()函数对Cublas Library 内容进行初始化处理,然后明确地传递给后面库函数调用,一旦应用程序结束了对库的使用,必须调用函数cublasDestory()以释放与Cublas库内容相关的资源 这种方式允许用户在使用多主机线程和多GPU 时可明确地掌握库的启动 例如,应用程序可使用cudaSetDevice()连接不同设备和不同的主机线程,其中的每一个主机线程初始化一个独特的处理,这可使一个独特的设备连接那个主机线程,然后cublas库函数调用不同处理去自动调度不同的计算到设备中只有在假设相应的cublasCreate() 和cublasDestory()之间内容保持不变的情况下才能使设备与某个特定的CUBLAS内容相连为了使CUBLAS库在同一主机线程中使用不同设备,应用程序必须通过cudaSetDevice()设置所需要使用的新设备然后创建另一个CUBLAS内容,通过调用cublasCreate()连接一个新设备 2.3. Thread Safety(线程安全性) 该库是线程安全,可以从多个主机线程调用此功能,即使是相同的操作。

      2.4. Scalar Parameters(标量参数) 在CUBLAS中,标量参数α和β可以通过主机或设备中的参数传递 一些函数例如amax(), amin, asum(),rotg(), rotmg(), dot() 和nrm2()可以返回标量结果,通过主机或设备的参数返回标量数值尽管这些函数可以像矩阵和向量一样立即返回值,标量结果只有当常规的GPU执行完成后才能准备好,这些都需要适当的同步以从主机上读取结果这些变化允许库函数使用流执行完全异步,即使标量α和β由前一个内核产生例如当出现迭代法解线性系统和如何使用Cublas库完成特征值问题 2.5. Parallelism with Streams(流的并行性) 如果应用程序使用多个独立任务来得到计算结果,CUDA流可用于在重叠计算中执行这些任务应用程序可以在概念上将每个流与任务相联系,为了实现任务的重叠计算,用户应当使用cudaStreamCreate()函数创建CUDA 流,在调用实际的cublas 例程以前,调用cublasSetStream()让这些流被cublas库中每个单独的例程所引用,然后再每个单独流中的计算结果将会在GPU上自动重叠计算。

      当一个任务的计算规模相对较小时,不足以填满GPU工作 我们建议在标量参数中使用新的CUBLAS API,在结果传递中使用设备内存的参数,以实现最大程度的重叠计算 2.6. Batching Kernels(批处理内核) 本节将讨论如何使用流批处理小内核,例如我们有个应用程序需要使用密集矩阵实现多个独立小矩阵的相乘运算 很明显即使有数以百万的独立小矩阵也不能实现像一个大矩阵实现GFLOPS(每秒千兆次浮点运算)例如对于一个nn规模的大矩阵乘法对于的输入需要执行n三次方的操作然而对于1024个(n/32)*(n/32)小矩阵对于相同的输入需要执行n三次方/32次操作由此可见我们可以通过使用很多独立的小矩阵实现更好的计算效率相比于一整个大矩阵 GPU体系结构允许我们同时执行多个内核因此,为了批处理这些独立内核,我们可以将其放在每个单独的流中执行尤其,在上述事例中我们通过cudaStreamCreate()创建了1024个CUDA流这将确保不同的计算能够同步执行,虽然用户可以创建许多流,但实际上不可能有超过16个流同时运算 2.7. Cache configuration(缓存配置) 在一些设备中,一级缓存和共享内存使用相同的硬件资源。

      缓存可以通过CUDA的事例程序cudaDeviceSetCacheConfig()直接配置,当然对于某些专门函数也可以通过cudaFuncSetCacheConfig()来专门配置 因为从一个配置切换到另一个会影响到核并发,CUBLAS Library并没有设置任何缓存配置偏向和依赖于当前配置然而对于某些Cublas例程,尤其是 Level-3例程,严重依赖于共享内存,因此缓存首选设置可能对其表现不利 4 / 4。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.