21
CUDA / Re: 同一个CUDA流操作
« 最后发表 作者 屠戮人神 于 三月 22, 2022, 09:19:59 pm »看到大家说:同一个CUDA流操作是严格顺序的。
但是我跑代码时却出现了不一样的结果程序代码: [选择]noisePdf1<<<gridNoiPdf1, blockNoiPdf1 >>>(noiPdf1, d_rx, sigma);
然后分别在两个核函数中有一个printf语句。
printf("After---------------noisePdf1\n");
convPy1<<<gridConvPy, blockConvPy >>>(convResult, u0, u1);
printf("After------------------convPy\n");
在默认流中先后调用这两个核函数,结果输出语句如下:
After---------------noisePdf1
After------------------convPy
run----noisePdf1
running------convPy
请问这是表示如果第二个核函数想用第一个核函数的结果,这两个核函数调用中间必须加cudaDeviceSynchronize();吗?
你在偷换概念, 每个流中的任务(kernel计算任务,或者数据传输任务)的确是按照顺序进行的。但是这不代表,夹杂在中间的其他CPU上的操作,也要按照GPU的流中的顺序。
实际上你的这个例子是,每次kernel启动后,CPU不必等待kernel执行完毕,就可以继续往下执行了(kernel的启动是异步的)。所以你看到这样的是正常的。
只有计算和传输任务才会在同1个流中(你的例子中是默认流,我建议你使用非默认流避免你遭遇其他情况的问题)按照你发布命令的顺序执行的,例如你的第二问中的,连续2个kernel,依次顺序执行,这点是没有问题的。