cudaEventCreate(): 用于创建事件,用于测量 GPU 操作的时间。
cudaEventSynchronize(): 用于等待事件完成。
cudaEventRecord(): 用于记录事件。
cudaEventElapsedTime(): 用于计算两个事件之间的时间差。
cudaEventDestroy(): 用于销毁事件。
这里,cudaEvent_t 是一个指向事件对象的指针类型。当调用 cudaEventCreate() 时,需要传递一个 cudaEvent_t 类型的指针,函数成功执行后,这个指针将指向一个新创建的事件对象。
使用 CUDA 事件的基本步骤如下:
创建事件:通过调用 cudaEventCreate() 创建一个或多个事件对象。
记录事件:使用 cudaEventRecord() 函数将事件记录到特定的 CUDA 流中。这标记了流中的一个点,后续的操作可以等待这个事件。
等待事件:主机代码可以使用 cudaEventSynchronize() 函数等待一个事件。这会阻塞主机执行,直到 GPU 完成该事件之前的所有工作。或者,可以使用 cudaEventQuery() 来非阻塞地查询事件是否已经完成。
销毁事件:当不再需要事件时,应该使用 cudaEventDestroy() 函数来释放与事件相关联的资源。
下面是一个简单的示例,展示了如何使用 CUDA 事件来测量 GPU 上核函数的执行时间:
#include <cuda_runtime.h>
#include <stdio.h>
// 简单的核函数,用于演示目的
__global__ void simpleKernel(int *array, int size) {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (idx < size) {
array[idx] = idx * idx;
}
}
int main() {
const int ARRAY_SIZE = 100000;
int *devArray;
cudaEvent_t start, stop;
float elapsedTime;
// 分配 GPU 内存
cudaMalloc((void**)&devArray, ARRAY_SIZE * sizeof(int));
// 创建事件
cudaEventCreate(&start);
cudaEventCreate(&stop);
// 记录开始事件
cudaEventRecord(start, 0); // 0 表示默认流
// 启动核函数
simpleKernel<<<1000, 100>>>(devArray, ARRAY_SIZE);
// 记录停止事件
cudaEventRecord(stop, 0);
// 等待停止事件完成
cudaEventSynchronize(stop);
// 计算两个事件之间的时间差
cudaEventElapsedTime(&elapsedTime, start, stop);
printf("Time taken by kernel: %f ms\n", elapsedTime);
// 销毁事件
cudaEventDestroy(start);
cudaEventDestroy(stop);
// 释放 GPU 内存
cudaFree(devArray);
return 0;
}