在GPU上初始化
绝大多数CUDA教材,都会提出一般CUDA程序的标准步骤,其中一步是将Host的数据拷贝到Device。也就是说Host中数据要先被初始化,后才能拷贝到Device。其实,可以直接在Device中初始化数据,如此既可以避免Host到Device的数据传输,又可以加快数据初始化的速度。如下是一个小例:
1 |
|
解释一下:
1)分别在Host和Device上开辟空间h_a
和dev_a
。
2)调用kernel,这个kernel的作用是初始化dev_a
。注意并不是从Host中拷贝过去的。以及其他需要在GPU上执行的操作。
3)GPU上的操作完成后,得到的最终数据保存在dev_a
中。拷贝到Hosth_a
中。
4)显示最终计算结果。
5)释放资源。
其中kernel函数initOnGPU
的作用是初始化dec_a
中元素为321。
结果如下:
1 | Time init on GPU: 0.0000160000 |
所以说,直接在Device上初始化,相对先在Host上初始化后拷贝到Device,是更高效的。
CPU与GPU的通信是通过PCIe 实现的。PCIe第三代 的极限速度是 16GB每秒。相比较,费米架构的GPU中,GPU芯片与GPU存储之间的数据交换速度高达144GB 每秒。所以说Host和Device间的数据传输是CUDA应用的 性能瓶颈。
敲黑板 CUDA程序的一个基本规则是,尽可能减少host 与device间的数据交换。