kernel总是串行执行的,所以如果需要在设备端, 通过动态并行启动多个能同时执行的kernel, 则必须在设备端使用多流.这也是论坛上面, 为何很多"我只想使用同一个流, 却需要让里面的多个kernel...而CUDA里面,默认的设备端的流是顺序的。所以需要乱序(嗯嗯), 你需要手工像本章那样, 单独的创建多个设备端的流, 给动态并行使用。...我分别说一下这三点:
Host上对流的创建, 可以创建一个普通流, 也可以创建一个非阻塞流.后者这种流, 不对默认流进行隐式的自动同步.而Host上的默认流, 目前也有两种, 一种是经典默认流, 另外一种是新型的...这点需要注意.
所以虽然你看CUDA的动态并行设计比较简单(只是一个cuda runtime api的子集), 但还是考虑过性能很多的, 没有必要的特性, 不提供, 也简化了用户....带有全局自动隐式同步功能(per device);
(2)新默认流. 需要用户要求启用. 这种是每个Host线程单独一个的. 共享NULL或者0流的称呼;
(3)动态并行时候的默认流.