CUDA programming

CUDA programing

cuda是英伟达开发的用于在计算器上实现并行编程的集成技术,对于图像处理来说,输入端通常都是成千上万个像素,相对于cpu,gpu具有更大的吞吐量,可以一次性对大量的数据进行处理,这个真符合图像处理的特性。一个典型的cuda程序工作流程是,cpu作为main程序的入口,将数据传入gpu的内存中,然后启动gpu中的cuda(kernel程序)程序进行计算,最后gpu再将计算结果返回给cpu。

CUDA communication pattern

cuda的thread对内存的操作有多种形式,分别是map,gather,stencil,transpose

gpu hardware

gpu是通过多个SM(streaming multiprocessors)组成的,不同的SM之间并行独立运行,gpu负责将程序中不同块的任务分配到SM上,即一个block对应一个SM。gpu并不会保证thread block的执行顺序,也不会限定同时运行的SM数量,这样可以高效的运行block任务,同时具有较好的平台兼容性(同一份代码可以在具有不同数量SM的gpu上执行)。gpu会保证运行同个kernel的SM都执行完毕之后,才会去执行运行下个kernel的SM。

编程策略

1、maximize compute ops per thread
2、minimize time spent on memory per thread move frequently-accessed data to fast memory(local > shared >> global >> cpu ‘host’)
coalesce access to the glocal memory(gpu每次访问内存空间是以一个区块为单位访问的,访问连续的内存空间可以减少内存的访问次数,提高效率avoid thread divergence

CUDA memory

gpu的内存有三种,线程自己的有个local memory,同一个block的线程有个共享的share memory,不同block之间有个global memory。
由于同一个block的不同的线程可能操作同一块share memory,不同block的线程可能操作global memory,所以需要写同步代码来避免冲突。

scan

reduce

histogram

Udacity assignment

由于Udacity这个课程估计下架了,作业都没有支持了,提供的github版本又只能是mac能跑,暂时不做,回头再用mac做