我有一个从 for 循环中调用的 CUDA 内核。类似的东西
for(i=0; i<10; i++) {
myKernel<<<1000,256>>>(A,i);
}
现在假设我有一张带有 15 个流多处理器 (SM) 的 NVIDIA 卡。 为简单起见,还假设只有一个 block 可以映射到 SM,这基本上意味着大多数时候,我将在设备上执行 15 个 block 。 由于内核执行是异步的,基本上 i=1 的调用将在第一个内核(i=0 的那个)启动后立即排队执行。
我的问题是这样的:在执行第一个内核(i=0)时的某个时刻,将只有 14 个 SM 忙碌,然后只有 13 个,然后只有 12 个,然后只有 11 个,等等。
一旦有一个 SM 可用,i=1 的内核就会被发送到设备上执行,还是等到所有 SM 处理完第一个内核(i= 的那个内核)后才启动第二个内核? 0)?
还假设我正在一个 CUDA 流中工作。
最佳答案
同一流中的内核启动是序列化的。如果有足够的资源(SM、共享内存等),来自不同流的内核调用可能会重叠
关于从 for 循环内调用 CUDA 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874244/