如何衡量CUDA中内核启动的开销

san*_*ana 4 cuda

我想测量CUDA中内核启动的开销.

我知道有各种参数会影响这种开销.我对以下内容感兴趣:

  • 创建的线程数
  • 要复制的数据大小

我这样做主要是为了衡量使用CUDA 6.0中引入的托管内存的优势.我将使用我开发的代码和评论更新此问题.谢谢!

Jac*_*ern 6

如何衡量CUDA中内核启动的开销在N.Wilt的"CUDA手册"一书的第6.1.1节中讨论.基本思想是启动一个空内核.这是一个示例代码段

#include <stdio.h>

__global__ void EmptyKernel() { }

int main() {

    const int N = 100000;

    float time, cumulative_time = 0.f;
    cudaEvent_t start, stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);

    for (int i=0; i<N; i++) { 

        cudaEventRecord(start, 0);
        EmptyKernel<<<1,1>>>(); 
        cudaEventRecord(stop, 0);
        cudaEventSynchronize(stop);
        cudaEventElapsedTime(&time, start, stop);
        cumulative_time = cumulative_time + time;

    }

    printf("Kernel launch overhead time:  %3.5f ms \n", cumulative_time / N);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的笔记本电脑GeForce GT540M卡上,内核启动开销是0.00245ms.

如果要检查此时间与启动的线程数的相关性,则只需更改内核启动配置<<<*,*>>>.似乎时间并没有随着启动的线程数量而显着变化,这与本书的大部分时间花在驱动程序中的声明一致.