DAY10:阅读CUDA异步并发执行中的Streams

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第10天,我们用几天时间来学习CUDA 的编程接口,其中最重要的部分就是CUDA C runtime.希望在接下来的90天里,您可以学习到原汁原味的CUDA,同时能养成英文阅读的习惯。

本文共计263字,阅读时间15分钟

重要的是——

如果你已经坚持了10天,你已经共计阅读了8164个字!

前情回顾:

DAY5:阅读 CUDA C编程接口之CUDA C runtime

DAY6:阅读 CUDA C编程接口之CUDA C runtime

DAY7:阅读 CUDA C编程接口之CUDA C runtime

DAY8:阅读CUDA异步并发执行中的Streams

DAY9:阅读CUDA异步并发执行中的Streams

今天继续讲解异步并发执行中的Streams,好消息是,今天讲完就真的把Stream部分讲完了,我们可以继续往下走了:

3.2.5.5.6. Callbacks

The runtime provides a way to insert【插入】 a callback at any point into a stream via cudaStreamAddCallback(). A callback is a function that is executed on the host once all commands issued to the stream before the callback have completed. Callbacks in stream 0 are executed once all preceding tasks and commands issued in all streams before the callback have completed.

The following code sample adds the callback function MyCallback to each of two streams after issuing a host-to-device memory copy, a kernel launch and a device-to-host memory copy into each stream. The callback will begin execution on the host after each of the device-to-host memory copies completes.

The commands that are issued in a stream (or all commands issued to any stream if the callback is issued to stream 0) after a callback do not start executing before the callback has completed. The last parameter of cudaStreamAddCallback() is reserved for future use.

A callback must not make CUDA API calls (directly or indirectly), as it might end up waiting on itself if it makes such a call leading to a deadlock.

3.2.5.5.7. Stream Priorities

The relative priorities of streams can be specified at creation using cudaStreamCreateWithPriority(). The range of allowable priorities, ordered as [ highest priority【优先级】, lowest priority ] can be obtained【获得】 using the cudaDeviceGetStreamPriorityRange() function. At runtime, as blocks in low-priority schemes finish, waiting blocks in higher-priority streams are scheduled in their place.

The following code sample obtains the allowable range of priorities for the current device, and creates streams with the highest and lowest available priorities

本文备注/经验分享:

A callback must not make CUDA API calls (directly or indirectly), as it might end up waiting on itself if it makes such a call leading to a deadlock.

回调函数不能调用任何CUDA API函数,无论是直接的,还是间接的调用。因为如果在回调函数中这样做了,调用CUDA函数的回调函数将自己等待自己,造成死锁。其实这很显然的,流中的下一个任务将需要等待流中的之前任务完成才能继续,因为CUDA Stream是顺序执行的, 而如果你一个流中的某回调函数,继续给某流发布了一个任务,很有可能该回调函数永远也等待不完下一个任务完成,因为等待下一个任务完成首先需要这回调函数先结束,而回调函数却在等待下一个任务完成....于是就死锁了。

有不明白的地方,请在本文后留言

或者在我们的技术论坛bbs.gpuworld.cn上发帖

原文发布于微信公众号 - 吉浦迅科技(gpusolution)

原文发表时间:2018-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Java设计模式-责任链模式

责任链模式: 将能够处理某一类请求的对象串成一条链, 请求沿链传递, 链上的对象逐个判断是否有能力处理该请求. 使多个对象都有机会处理请求, 从而避免请求发送者...

3819
来自专栏歪先生_自留地

Python test2

1023
来自专栏Java开发者杂谈

分布式改造剧集之Redis缓存踩坑记

2284
来自专栏c#开发者

Biztalk 调用带Soap Head WebService的方法

    前天有位网友正好也提到了类似的问题,正好以前我也作过这方面的项目;在Biztalk Orchestration中调用对方发布的WebService;但必...

3366
来自专栏我是攻城师

ElasticSearch入门之彼行我释(四)

3325
来自专栏机器学习从入门到成神

Java 进阶面试问题列表

911
来自专栏everhad

[翻译][架构设计]The Clean Architecture

原文地址:The Clean Architecture The Clean Architecture ? Over the last several years...

5776
来自专栏吉浦迅科技

DAY36:阅读”执行空间&扩展修饰符

1233
来自专栏日常学python

一步一步教你如何用python操作mysql

这是日常学python的第九篇原创文章 首先祝大家新年快乐哈!学生的估计明天也要上课了,工作的估计早就去上班了,我也快要上课了,哈哈,新年这段时间一直没有写过文...

65813
来自专栏NetCore

[原创]Fluent NHibernate之旅二--Entity Mapping

接着上一篇,今天我们说说ORM中的Mapping。如果你要体验NHibernate的强大,首先你就要学会配置,包括SessionFactory和Mapping的...

2199

扫码关注云+社区