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

时间:2014-06-23 22:13:54

标签: cuda

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

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

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

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

2 个答案:

答案 0 :(得分: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;
}

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

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

答案 1 :(得分:2)

也许你应该对弗吉尼亚大学的这些测试结果感兴趣:

内存转移开销:http://www.cs.virginia.edu/~mwb7w/cuda_support/memory_transfer_overhead.html

内核启动开销:http://www.cs.virginia.edu/~mwb7w/cuda_support/kernel_overhead.html

他们的测量方式与JackOLantern提案类似。