MsShadow学习
@(mxnet)
1. msshadow简介
msshadow 可以无缝编写cpu和GPU代码
主要作用如下:
- 矩阵基本操作
- 同时编写cpu和gpu代码
- 内存需要显示分配
- 全部使用template编写,包含头文件即可使用。
2. test:
1 下载MSShadow库
2 guide下执行make即可编译出例程
3. mshadow实现原理探究
- stream是用来实现什么功能?: cpu和gpu同步使用。
- 表达式模板如何实现?
- gpu变成细节
4 gpu和cpu抽象
4.1 如何屏蔽gpu和cpu细节
- 编写矩阵的操作就是编写模板。仍然需要为cpu和gpu单独实例化。
- Tensor 实现的时候,根据对gpu和cpu进行特殊实例化
4.2 nvcc如何进行cpu和gpu协同编译
- gpu 的sample 安装在 /usr/local/cuda文件夹下面
- 混合变成方法
- 使用nvcc将 .cu编译为.o
- 使用gcc将.c 编译为.o
- 使用gcc将 两者编译的.o 链接成输出文件
gcc 和nvcc 关于c语言生成的连接符号是一致的。
5. 表达式模板
特点
思想:将运行时进行函数编译优化的过程提到编译的过程进行,这样编写的程序运行的速度便得到保证。
1. 省却写循环的过程,仍然保持程序的高效:表达式模板 inline-操作,重载+,编译时优化。
2. 模板重载运算符重载
3. layer computation: 重载赋值运算符。
实现原理
- 定义表达式泛型
- 为表达式泛型重载 * +等基本类型运算符,其返回值仍然是表达式类型,lazy computation的实现方式。
- 定义数组类型,并将数组类型的赋值运算符重载为求值过程,for循环便在这里编写。
- 定义通用F,可以讲element-wise函数转换为表达式类型
- 将所有的函数都定义为inline类型,最有求值的过程中便能进行优化,函数高效的原因
- 实际使用过程中 遇到等号,便进行求值。
6. cuda编程要点
6.1 编程模型
CUDA并行编程模型包含三个实体: 线程网、线程块,线程。一个网可以包含x*y个线程块,线程块可以包含x*y个线程。
- 内核在在定义在线程上执行的最小实体。内核使用
__global__
声明。 - 内核调用语法
VecAdd<<<1, N>>>(A, B, C);
第一个参数表示设备在执行核函数数使用的并行线程块(block)的数量,第二个参数表示每个线程块启动线程(thread)的数量
调用语法表达二维的方式:
dim3 threadsPerBlock(16, 16);
dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);
MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);
多维度的数据索引:
- gridDim.x-线程网络X维度上线程块的数量
- gridDim.y-线程网络Y维度上线程块的数量
- blockDim.x-一个线程块X维度上的线程数量
- blockDim.y-一个线程块Y维度上的线程数量
- blockIdx.x-线程网络X维度上的线程块索引
- blockIdx.y-线程网络Y维度上的线程块索引
- threadIdx.x-线程块X维度上的线程索引
- threadIdx.y-线程块Y维度上的线程索引
6.2 内存编程模型
- 寄存器内存,local memory 线程私有内存
- 共享内存:同一个block读写内存。使用share_申请。
- 全局内存: gpu和cpu共享的内存
6.3 cuda编程顺序
- 定义并行模型
- 定义内核函数
- 定义调用内核函数的并行方式
- 函数封装,将gpu函数封装出c接口