能否在kernel里调用其他的kernel?

dushuchen 2013-01-16 03:53:45
有点复杂
不知道现在的CUDA是否支持
...全文
762 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainliuyu 2013-02-18
  • 打赏
  • 举报
回复
引用 8 楼 linxxx3 的回复:
引用 7 楼 yjoe61 的回复: 我想了一下,貌似用device端的kernel还是可以使编程简单不少。如有不妥欢迎指教。 关于stream我是这样理解的:device启动kernel,也可以指定stream。如果不指定stream,就默认使用NULL stream。这个NULL stream是整个block共享的:也就是说这个block启动的所有子kernel都会进入这个stream……
刚好碰到这个问题,想上来请教就看见这贴,好巧 我目前需要解决的是把一个串行算法调整为GPU算法 算法中有3层循环嵌套,每一层循环量都很大,而只在最里一层循环得出运算数据结果 设想的就是把每一层循环都做成一个device kernal,然后上层调用下层 如以上诸层所说,这样做是可行的?
linxxx3 2013-01-28
  • 打赏
  • 举报
回复
引用 7 楼 yjoe61 的回复:
我想了一下,貌似用device端的kernel还是可以使编程简单不少。如有不妥欢迎指教。

关于stream我是这样理解的:device启动kernel,也可以指定stream。如果不指定stream,就默认使用NULL stream。这个NULL stream是整个block共享的:也就是说这个block启动的所有子kernel都会进入这个stream。但是子ker……


从我看guide的结论,母kernel上启动子kernel,如果用默认stream,等子kernel执行完成,母kernel才继续执行,给你贴个图,如果你手头有这个文档,是在第4页:


不管怎么说,CUDA学习曲线挺陡的,多学一个特性其实也没啥,如果能用好的话就赚了,不熟悉的话,不用也能写程序。
yjoe61 2013-01-25
  • 打赏
  • 举报
回复
我想了一下,貌似用device端的kernel还是可以使编程简单不少。如有不妥欢迎指教。 关于stream我是这样理解的:device启动kernel,也可以指定stream。如果不指定stream,就默认使用NULL stream。这个NULL stream是整个block共享的:也就是说这个block启动的所有子kernel都会进入这个stream。但是子kernel和母kernel还是可以异步运行的。 假设现在在host启动第一级的qsort,这样得到两个子序列,传回host。然后就需要在host再启动两个新的不相干的kernel。其中一个完成后又传回两个子序列。而这两个子序列和另一个kernel传回的子序列又是不相干的。。。这样貌似还是有很大的复杂性,差不多等同于需要和kernel同样多数量的host thread来控制每一级的kernel启动。而这些工作,如果有device级的kernel,就可以直接在kernel里完成。从易用性的角度来说,我感觉这样对程序员更具亲和性。 不知道那个Guide有没有人打算翻译一下?
linxxx3 2013-01-23
  • 打赏
  • 举报
回复
引用 5 楼 yjoe61 的回复:
一个简单的例子是quicksort。如果不在kernel里调用kernel,那么必须在host做一次synchronization,将上一层的运算结果(比如排序的pivot序号)传回host,然后再在host执行下一层的kernel。如果多个kernel同时运算,这将大大增加host控制的复杂性。总的来说,任何分而治之的算法都有这个问题。 如果能在kernel直接执……
递归调用的例子确实是我没考虑过的,学习了。不过还是有些地方要探讨的,我也不百分比确定: 1. host上要使多个kernel同时启动,好像一定必须使用流(stream)?从kernel内启动kernel隐含的保证一个执行顺序,即调用的子函数必须完成之后,母函数才会继续,隐含了同步操作,这样确实能使编程容易。但是这样做,多个kernel能并行运算吗?能避免使用流吗? 2. 如果有多个kernel同时运算,在host执行使用sync会造成什么结果?实际上我们需要的只是保证执行的先后顺序,不需要全局同步来控制,而应该使用阻塞的调用,比如使用事件(event)。对快排这个例子,在partition之后阻塞,直到partition完成之后,再调用子序列的quicksort就可以了。调用的两个子序列quicksort为了并行运算,可以启动两个新的流,不过可能遇到递归调用流的数目不够用。 3. 新特性多比较麻烦,一知半解危险,要用的话,至少又要读一篇新东西 "CUDA Dynamic Parallelism programming guide",我还没找到有中文的资料能把这点讲清楚的。看了也不保证用的好。打比方就是本来难走的路,有很多陷阱,它拿些树叶啥的给盖上,看起来是好走,等掉坑里的时候就想哭了。
yjoe61 2013-01-22
  • 打赏
  • 举报
回复
一个简单的例子是quicksort。如果不在kernel里调用kernel,那么必须在host做一次synchronization,将上一层的运算结果(比如排序的pivot序号)传回host,然后再在host执行下一层的kernel。如果多个kernel同时运算,这将大大增加host控制的复杂性。总的来说,任何分而治之的算法都有这个问题。 如果能在kernel直接执行kernel,并且同步的话,复杂度就大大降低了。
linxxx3 2013-01-21
  • 打赏
  • 举报
回复
引用 3 楼 yjoe61 的回复:
需要3.5或以上的计算能力。 好处还是有的,比如你需要host kernel的每一个thread再调用n个block和thread。这时你不需要把数据传回host再运行kernel,而是可以直接在kernel里运行新的kernel。
即使不用这个特性,也不需要将数据传回主机,再启动新kernel,因为数据本身就在显存里,全部算完了,最后传一次就行。 启动时间可能减少,是一个好处。但是要注意的是:1. 如果启动时间是一个问题,说明写的kernel粒度太细,需要调整;2. 这种新特性其实容易让人产生疑惑,编程学习的成本不是减少了,而是增加。 用CUDA强调的就是计算效率,想避开底层架构不需要了解不现实。这个特性出来,可以想象的是,主要的作用是方便已有的CPU程序移植到GPU上,对原程序的结构修改小,很少的时间就能得到一定效果。但是真的想要得到比较高的加速比,简单改改一般靠不住,这个特性就鸡肋了。
yjoe61 2013-01-19
  • 打赏
  • 举报
回复
需要3.5或以上的计算能力。 好处还是有的,比如你需要host kernel的每一个thread再调用n个block和thread。这时你不需要把数据传回host再运行kernel,而是可以直接在kernel里运行新的kernel。
linxxx3 2013-01-17
  • 打赏
  • 举报
回复
CUDA最新的版本可以支持,但是关键是显卡设备需要3.0以上计算能力,一些老显卡可以排除了。而且这种特性对性能和编程复杂度上,我没看出有明显好处。
dushuchen 2013-01-17
  • 打赏
  • 举报
回复
引用 1 楼 linxxx3 的回复:
CUDA最新的版本可以支持,但是关键是显卡设备需要3.0以上计算能力,一些老显卡可以排除了。而且这种特性对性能和编程复杂度上,我没看出有明显好处。
谢谢 为什么没有明显好处呢?具体在哪些方面?

589

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧