为什么使用gpu?
从cpu及gpu的硬件结构和功能来看,gpu具有更多的计算结构。在计算任务重的情况下,使用gpu可以加速任务进度。
简单的gpu使用流程。
1. Allocate device memory.
2. copying data from host(cpu),
3. lauching kernel:this implements compute process.
4. copying data back to host.
5.free memory.(device and host).
上面几个流程对应的关键api为
1. cudaMalloc(start, size);
2. cudaMemcpy(dst,src,size,direction);
3.调用kernel.cu中的函数;
4.同2;
5.free(host_pointer), cudaFree(device_pointer);
kernel中需要完成的关键的步骤:
1. 映射:Calculate global thread index based on the block and thread indices ----
2. 根据global thread index完成计算。
效率方面:
与cpu中一样,gpu的计算性能远远大于读写性能,所以IO是瓶颈。 因为读取global memory花费的时间很长而shared memory较快(实际上在没有冲突和等待时与register速度一致),所以减少global memory的读取是提升性能的一种重要方式。
1. gpu内存模型:这里只大致分为三种 实际上还有constant memory等更多
1.register. 最快,小
2.shared memory 较快, 小
3.global memory. 慢,大
register为线程私有的,每一个执行单元都有自己私有的register(寄存器)。速度最快,应该跟cpu中的寄存器是一样的功能作用,回忆计算机系统结构内容。
shared memory:block私有,block内共享,block内所有线程可读写,较小。但速度快。应当将block内线程会多次读取的数据存储到shared memory当中。
global memory: grid内所有线程可见,大但是慢,是整个系统的瓶颈。
2. 内存分配方式
在初始化Grid和Block时,不同的问题大小适用不同的Grid大小+Block大小,选取合适的搭配可减少闲置的线程块和control divergence,从而提高效率。
gpu的基本调度单位为warp,为32个线程,在不满32个时补齐32个,与分页系统中的分页相似。当一个warp中的线程所做的任务不一致时(例如有些线程有工作,另一些线程没有任务可做),称为control divergence。所以为了保持相率,要尽量减少control divergence的出现。这也是提高效率的一种方式。
三个课程lab任务: 人文交流月课程的课程lab代码及实验报告