CUDA event & stream
默认使用的 stream 0。CUDA 流简单来说是一系列按顺序在设备上执行的运算。不同 Stream 中的运算可以交错进行,在某些情况下还可以重叠——这一特性可以用来隐藏主机和设备之间的数据传输。
这里是使用 event 的最佳实践:
// 创建 CUDA 事件
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
// 记录开始事件
cudaEventRecord(start, 0); // 0 代表默认流
// 启动内核
myKernel<<<(size + 255) / 256, 256>>>(d_data, size);
// 记录事件 stop。 这本身是一个异步操作;它不会阻塞 CPU。
// 记录事件只是在流中插入一个标记。在事件被记录后,GPU 仍然可能继续执行其他任务。
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop); // 阻塞 CPU 直到事件 stop 完成
// 计算经过的时间
float milliseconds = 0;
cudaEventElapsedTime(&milliseconds, start, stop);
// 将数据从设备复制回主机
cudaMemcpy(h_data, d_data, size * sizeof(int), cudaMemcpyDeviceToHost);
// 打印结果
printf("Kernel execution time: %.3f ms\n", milliseconds);
// 销毁事件
cudaEventDestroy(start);
cudaEventDestroy(stop);