cuda线上训练营学习笔记-5
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 中先后启动核函数 A和 B。
A<<<1, 1, 0, s>>>();
B<<<1, 1, 0, s>>>();
其运行结果A阻塞B的运行。
结论:如果两个操作位于不同的CUDA流中,则操作A和操作B并没有确定的执行顺序;
例如,在如下代码中,先在流 s1 中先后启动核函数 A1和 B1,然后在流 s2 中先后启动核函数 A2和 B2。
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中,流的创建有三种方式:cudaStreamCreate,cudaStreamCreateWithFlags,cudaStreamCreateWithPriority
创建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的工具库进行学习。
欢迎来到FlagOS开发社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。
更多推荐



所有评论(0)