cuda stream

关于cuda流

CUDA流表示一个GPU操作队列,该队列中的操作将以添加到流中的先后顺序而依次执行。可以将一个流看做是GPU上的一个任务,不同任务可以并行执行。

 

cuda流同步

默认流是一个隐式流(无需显式创建,CUDA中默认存在),它与同一CUcontext中的所有其他流同步,非阻塞流(non-blocking streams)除外。

例如,在如下代码中,在流 s 中启动核函数 A,然后在默认流中启动 B,在流 s 中启动 C

A<<<1, 1, 0, s>>>();
B<<<1, 1>>>();
C<<<1, 1, 0, s>>>();

其运行结果A阻塞B的运行,B阻塞C的运行。

结论:如果操作A和操作B位于同一个CUDA流中,操作A和操作B按照先后顺序执行;

例如,在如下代码中,在流 s 中先后启动核函数 AB

A<<<1, 1, 0, s>>>();
B<<<1, 1, 0, s>>>();

其运行结果A阻塞B的运行。

结论:如果两个操作位于不同的CUDA流中,则操作A和操作B并没有确定的执行顺序;

例如,在如下代码中,先在流 s1 中先后启动核函数 A1B1,然后在流 s2 中先后启动核函数 A2B2

A1<<<1, 1, 0, s1>>>();
B1<<<1, 1, 0, s1>>>();
A2<<<1, 1, 0, s2>>>();
B2<<<1, 1, 0, s2>>>();

在实际运行结果中,流s1的操作并不会影响流s2的操作,A1会阻塞B1的运行,而不会阻塞B2的运行。

cuda流管理function

创建流

在CUDA中,流的创建有三种方式:cudaStreamCreatecudaStreamCreateWithFlagscudaStreamCreateWithPriority

创建CUDA流

__host__ cudaError_t cudaStreamCreate ( cudaStream_t* pStream )

创建不同标记的CUDA流

__host__ cudaError_t cudaStreamCreateWithFlags ( cudaStream_t* pStream , unsigned int flags )

创建不同优先级的CUDA流

//通过priority参数,指定CUDA 流的优先级,数值越小其优先级越高(“0”表示默认优先级),但主机和设备之间的内存操作不受优先级的影响。
__host__ cudaError_t cudaStreamCreateWithPriority ( cudaStream_t* pStream , unsigned int flags, int priority )

销毁流

__host____device__ cudaError_t cudaStreamDestroy ( cudaStream_t stream )

流同步操作

//调用该操作时会发生阻塞,等待指定流中操作完成
__host__ cudaError_t cudaStreamSynchronize ( cudaStream_t stream )

实验示例

 总结

通过这节,学习了cuda中的流,让我对以往yolo等模型代码中不理解的部分有了一些认识,感受到了cuda在实际现有项目中的使用方式,继续加油,下一阶段对cuda的工具库进行学习。

Logo

欢迎来到FlagOS开发社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。

更多推荐