对于我目前正在开发的应用程序,我希望有一个长内核(即,相对于其他内核需要很长时间才能完成的内核)与多个同时运行的较短内核的序列同时执行。然而,更复杂的是,四个较短的内核在完成后都需要同步,以便执行另一个短内核,收集和处理其他短内核输出的数据。
以下是我想到的示意图,编号的绿色条代表不同的内核:
为了实现这一点,我编写了如下所示的代码:
// definitions of kernels 1-6
class Calc
{
Calc()
{
// ...
cudaStream_t stream[5];
for(int i=0; i<5; i++) cudaStreamCreate(&stream[i]);
// ...
}
~Calc()
{
// ...
for(int i=0; i<5; i++) cudaStreamDestroy(stream[i]);
// ...
}
void compute()
{
kernel1<<<32, 32, 0, stream[0]>>>(...);
for(int i=0; i<20; i++) // this 20 is a constant throughout the program
{
kernel2<<<1, 32, 0, stream[1]>>>(...);
kernel3<<<1, 32, 0, stream[2]>>>(...);
kernel4<<<1, 32, 0, stream[3]>>>(...);
kernel5<<<1, 32, 0, stream[4]>>>(...);
// ?? synchronisation ??
kernel6<<<1, 32, …Run Code Online (Sandbox Code Playgroud)