如何找出内核函数中的当前执行流ID?我期望一个类似于blockIdx或threadIdx的预定义变量,但是找不到任何提及“streamId”的东西。还有另一种方式吗?
答案 0 :(得分:7)
在CUDA中,流是主机驱动程序工具 - 实际上只是一系列命令管道,驱动程序从中选择要在GPU上启动的任务。在“基本”CUDA架构中,GPU具有用于PCI Express总线上的存储器传输的“DMA引擎”,以及用于执行内核代码的“执行引擎”,就是这样。在Fermi上最多可以有两个“DMA引擎”,而“执行引擎”似乎是主机驱动程序,可以允许多个内核执行。驱动程序将工作从一个或多个FIFO缓冲区(通过流API公开)推送到这些引擎上。但GPU本身并不知道有关流的任何信息,它们只是一个主机端设备。
答案 1 :(得分:6)
如果您需要内核中的流ID,您可以随时将其作为参数传递给内核:
__global___
void kernel(int streamId) {
//...
}
void callKernel() {
cudaStream_t stream;
cudaStreamCreate(&stream);
kernel<<<1,1,0,stream>>>((int)stream);
}