同一个CUDA流操作

  • 2 replies
  • 1282 views
同一个CUDA流操作
« 于: 三月 16, 2022, 11:37:08 am »
看到大家说:同一个CUDA流操作是严格顺序的。
但是我跑代码时却出现了不一样的结果
程序代码: [选择]
noisePdf1<<<gridNoiPdf1, blockNoiPdf1 >>>(noiPdf1, d_rx, sigma);
printf("After---------------noisePdf1\n");
convPy1<<<gridConvPy, blockConvPy >>>(convResult, u0, u1);
printf("After------------------convPy\n");
然后分别在两个核函数中有一个printf语句。
在默认流中先后调用这两个核函数,结果输出语句如下:
After---------------noisePdf1
After------------------convPy
run----noisePdf1
running------convPy
请问这是表示如果第二个核函数想用第一个核函数的结果,这两个核函数调用中间必须加cudaDeviceSynchronize();吗?

Re: 同一个CUDA流操作
« 回复 #1 于: 三月 16, 2022, 02:58:50 pm »
是异步调度,但实际执行的时候还是要等第一个kernel执行完再会执行第二个kernel?或者是说 并行资源足够的情况下,两个核函数会一起执行呢

Re: 同一个CUDA流操作
« 回复 #2 于: 三月 22, 2022, 09:19:59 pm »
看到大家说:同一个CUDA流操作是严格顺序的。
但是我跑代码时却出现了不一样的结果
程序代码: [选择]
noisePdf1<<<gridNoiPdf1, blockNoiPdf1 >>>(noiPdf1, d_rx, sigma);
printf("After---------------noisePdf1\n");
convPy1<<<gridConvPy, blockConvPy >>>(convResult, u0, u1);
printf("After------------------convPy\n");
然后分别在两个核函数中有一个printf语句。
在默认流中先后调用这两个核函数,结果输出语句如下:
After---------------noisePdf1
After------------------convPy
run----noisePdf1
running------convPy
请问这是表示如果第二个核函数想用第一个核函数的结果,这两个核函数调用中间必须加cudaDeviceSynchronize();吗?

你在偷换概念, 每个流中的任务(kernel计算任务,或者数据传输任务)的确是按照顺序进行的。但是这不代表,夹杂在中间的其他CPU上的操作,也要按照GPU的流中的顺序。

实际上你的这个例子是,每次kernel启动后,CPU不必等待kernel执行完毕,就可以继续往下执行了(kernel的启动是异步的)。所以你看到这样的是正常的。

只有计算和传输任务才会在同1个流中(你的例子中是默认流,我建议你使用非默认流避免你遭遇其他情况的问题)按照你发布命令的顺序执行的,例如你的第二问中的,连续2个kernel,依次顺序执行,这点是没有问题的。