CUDA流表示一个GPU操作队列,并且该队列中的操作将以指定的顺序执行。可以将每个流视为GPU的一个任务,并且这些任务可以并行执行,即相同流顺序执行,不同流并行执行;不同流并行执行时不同流所要执行的任务要没有依赖关系;当不手动创建流时,cuda将会默认一个流操作。
在硬件选择上,这里有一个概念,支持设备重叠功能,支持设备重叠功能的 GPU 能够在执行一个 CUDA C 核函数的同时,还能在设备和主机之间执行复制操作;这在流并行过程中很重要,我们假设有流A和流B,设备重叠就会允许流A在复制过程中同时流B进行核函数计算,这会大大加快速度;
cudaDeviceProp prop;
int whichDevice;
cudaGetDevice(&whichDevice);
cudaGetDevice(&prop, whichDevice);
if(prop.deviceOverlap){
std::cout<<"the device will handle overlaps"<<std::endl;
}
我们知道cudaMemcpy与CPU操作是同步的,为了实现设备重叠,cuda提供了cudaMemcpyAsync用于数据拷贝操作,它是异步的,不会等待复制完成就会执行程序的下一步;
但注意,cudaMemcpyAsync仅对分页锁定的主存储器有效,如果传入指向可分页存储器的指针,那么将返回一个错误;
页锁定的主机内存由cudaHostAlloc()分配。页锁定的主机内存也称为固定内存