【问题标题】:CUDA stream ID inside kernel内核中的 CUDA 流 ID
【发布时间】:2011-11-23 10:05:01
【问题描述】:

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您需要内核中的流 ID,您可以随时将其作为参数传递给您的内核:

      __global___
      void kernel(int streamId) {
          //...
      }
      
      void callKernel() {
          cudaStream_t stream;
          cudaStreamCreate(&stream);
      
          kernel<<<1,1,0,stream>>>((int)stream);
      }
      

      【讨论】:

      • 在 CUDA 运行时和驱动 API 中,流 ID 都是 void *: typedef struct CUstream_st *cudaStream_t; typedef struct CUstream_st *CUstream;
      • 有趣,this documentation 显示为typedef int cudaStream_t 看起来他们在更新的版本中更改了它,或者文档不正确
      • 在 CUDA 工具包 5.0 版和 64 位上,sizeof(cudaStream_t)==8
      猜你喜欢
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多