CUDA入门(10):CUDA 流

来源:互联网 发布:21端口查看 编辑:程序博客网 时间:2024/04/26 23:39

并发重点在于一个极短时间段内运行多个不同的任务;并行重点在于同时运行一个任务。

1.       任务并行性:是指并行执行两个或多个不同的任务,而不是在大量数据上执行同一个任务。

2.       概念:CUDA流表示一个GPU操作队列,并且该队列中的操作将以指定的顺序执行。我们可以在流中添加一些操作,如核函数启动,内存复制以及事件的启动和结束等。这些操作的添加到流的顺序也是它们的执行顺序。可以将每个流视为GPU上的一个任务,并且这些任务可以并行执行。

3.       硬件前提:必须是支持设备重叠功能的GPU。支持设备重叠功能,即在执行一个核函数的同时,还能在设备与主机之间执行复制操作。

4.       声明与创建:声明cudaStream_t stream;创建cudaSteamCreate(&stream);。

5.       cudaMemcpyAsync():这是一个以异步方式执行的函数,而cudaMemcpy()是一个同步执行函数,同步执行意味着,当函数返回时,复制操作已完成,并且在输出缓冲区中包含了复制进去的内容。而在调用cudaMemcpyAsync()时,只是放置一个请求,表示在流中执行一次内存复制操作,这个流是通过参数stream来指定的。当函数返回时,我们无法确保复制操作是否已经启动,更无法保证它是否已经结束。我们能够得到的保证是,复制操作肯定会当下一个被放入流中的操作之前执行。传递给此函数的主机内存指针必须是通过cudaHostAlloc()分配好的内存。(异步操作需要使用固定内存)

6.       流同步:通过cudaStreamSynchronize()来协调,确保GPU执行完计算和复制操作。

7.       流销毁:在退出应用程序之前,需要销毁对GPU操作进行排队的流,调用cudaStreamDestroy()。

8.       针对多个流:

1)       记得对流进行同步操作。

2)       将操作放入流的队列时,应采用宽度优先方式,而非深度优先的方式,换句话说,不是首先添加第0个流的所有操作,再依次添加后面的第1,2,…个流。而是交替进行添加,比如将a的复制操作添加到第0个流中,接着把a的复制操作添加到第1个流中,再继续其他的类似交替添加的行为。

3)       要牢牢记住操作放入流中的队列中的顺序影响到CUDA驱动程序调度这些操作和流以及执行的方式。

1 0
原创粉丝点击