我想测量CUDA中内核启动的开销。
我知道有各种参数会影响这种开销。我对以下内容感兴趣:
我这样做主要是为了衡量使用CUDA 6.0中引入的托管内存的优势。我将使用我开发的代码和评论更新此问题。谢谢!
答案 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提案类似。