2011-11-23 91 views
2

如何找出内核函数中的当前执行流ID?我期望一个类似于blockIdx或threadIdx的预定义变量,但是找不到任何提及的“streamId”。有另一种方法吗?内核中的CUDA流ID

回答

7

在CUDA中,流是主机驱动程序工具 - 实际上只是一系列命令管道,驱动程序从中选择要在GPU上启动的任务。在“基本”CUDA架构中,GPU具有用于PCI Express总线上内存传输的“DMA引擎”,以及用于执行内核代码的“执行引擎”,就是这样。在费米,最多可以有两个“DMA引擎”,“执行引擎”似乎是主机驱动程序可配置的,以允许多个内核执行。该驱动程序将工作从一个或多个FIFO缓冲区(通过流API公开)推送到这些引擎上。但GPU本身并不知道任何有关流的信息,它们就是主机端设备。

5

如果您需要在内核中的流ID,你总是可以在把它作为参数传递给内核:

__global___ 
void kernel(int streamId) { 
    //... 
} 

void callKernel() { 
    cudaStream_t stream; 
    cudaStreamCreate(&stream); 

    kernel<<<1,1,0,stream>>>((int)stream); 
} 
+1

在CUDA运行库和驱动API都,流ID是一个void * : typedef struct CUstream_st * cudaStream_t; typedef struct CUstream_st * CUstream; – ArchaeaSoftware

+0

有趣的是,[这个文档](http://developer.download.nvidia.com/compute/cuda/3_0/toolkit/docs/online/group__CUDART__TYPES_g4d9eac679936eb86c04477230353efd1.html#g4d9eac679936eb86c04477230353efd1)显示它为'typedef int cudaStream_t'它看起来像他们在更新的版本中更改它,或者文档不正确 – flipchart

+1

在5.0版的CUDA工具包和64位上,sizeof(cudaStream_t)== 8 – GeorgT