cuda笔记

写在前面

最近不停的google学习新的东西,看了很多文章,受益匪浅,也打算将自己学到的东西记录下来方便分享.


cuda入门推荐

<>,简单暴力的一本入门书籍.


New Features in CUDA 7.5

写本文的时候CUDA 8.0已经发布了,以后有时间再追加

16-bit Floating Point (FP16)

cuda笔记_第1张图片
Figure 1: 16-bit half-precision data formats. Top: single `half` value. Bottom: `half2` vector representation.

新增half(16bit)和half2(16bit x 2)两种类型(参见cuda_f16.h API),能够缓解ML的内存瓶颈,同时相对提升1/2的内存带宽.
half2是否有SIMD类似的特性呢?
提供__half2float()和__float2half()等类型转换接口.

“Mixed Precision” Computation

以FP16存储,用FP32(single)或FP64(double)计算.
例如cublasSgemmEx()矩阵乘接口,以FP16 传入参数,32-bit计算,相对32bit的float扩张了一倍的数据吞吐.
针对Tegra X1 GPUs 和Pascal架构的GPU(我做实验的时候貌似要求计算能力大于5.3(简直买不起)的GPU才可以使用half,这里还是一个疑点),cuda_f16.h中定义了FP16的计算和比较函数,cuBlas提供cublasHgemm() 对FP16的矩阵乘法.

稀疏矩阵

暂时没有涉及到,以后追加吧.

Profile工具升级

这个是个好东西,有时间新开一篇文章学习一下吧


New Features in CUDA 8

全新的统一寻址(Unified Memory)

  • 简化编程和简化内存模型,专注于并行,忽略内存分配和拷贝,简化内存管理

cuda6.0 引入 Unified Memory,用一个统一的虚拟地址,cuda自动相互在CPU和GPU之间转换内存.
在6.0中Unified Memory的大小受到显存的限制,而在8.0中,cuda能够寻址49bit长度的地址,远超过CPU48bit的地址长度,所以Unified Memory不再受显存的限制而和CPU的内存有关系.
6.0中采用特殊的内存池来管理Unifie Memory,而在8.0中,支持Unified Memory的GPU可以直接使用cpu内存指针访问由操作系统分配的内存空间(如malloc).Unified Memory可以访问整个OS的虚拟内存空间,这就意味着Unified Memory申请的空间可以超高CPU RAM的物理大小.
这么方便的东西肯定是需要OS级别的支持.好在NVIDIA和Red Hat合作,让这一特性能够在Linux社区能够使用(难道没有Windows的份?).

Page Faulting

结合统一寻址,CUDA不需要在cuda程序launch的时候同步GPU内存,当发生page fault的时候,cuda自动的将内存移动( PCIe 或NVLink会采用map方式,速度更快)到GPU或CPU内存之之中.这样GPU和CPU能够同时访问Unified Memory,需要做好CPU和GPU对内存的同步和互斥,避免污染内存数据.

Mixed-Precision Computing

  • FP16和Int8

主要用于DeepLearning,低精度的数值能够更快的load和更快的计算,在cuBLAS, cuDNN, 和 cuFFT,FP16和Int8的计算性能明显提升.


cuda笔记_第2张图片
The cuBLAS Library included with CUDA 8 provides high-performance GEMM routines for INT8, FP16, FP32, and FP64 data.

新的GPU还没有合适的电源,暂时无法HelloWord --
hello world

你可能感兴趣的:(cuda笔记)