1. Tiempo
1.1 linux
#include <sys/time.h>
double cpuSecond() {
struct timeval tp;
gettimeofday(&tp, NULL);
return ((double)tp.tv_sec + (double)tp.tv_usec*1e-6);
}
// 调用
double start = cpuSecond();
kernel_name << <grid, block >> > (argument list);
cudaDeviceSynchronize(); // 显示的使其同步。
double cost = cpuSecond() - start;
1.2 debajo de las ventanas
#include <time.h>
// 调用
time_t begin, end;
time(&begin);
kernel_name << <grid, block >> > (argument list);
time(&end);
time_t elapsed = end - begin;
printf("Time measured: %ld seconds.\n", elapsed);
2. utilidad nvprof
nvprof es una herramienta de análisis de línea de comandos con muchas funciones que pueden ayudar a obtener información de línea de tiempo de las actividades de CPU y GPU de la aplicación, incluida la ejecución del kernel, la transferencia de memoria y las llamadas a la API de CUDA. Los detalles se pueden ver a través del siguiente comando.
nvprof --help
(1) Si el comando anterior informa un error: el código no puede continuar ejecutándose porque no se puede encontrar cupti64_2022.2.1.dll. . .
Motivo: la herramienta nvprof es un complemento y su dll está en el directorio:
C:\Archivos de programa\NVIDIA GPU Computing Toolkit\CUDA\v11.7\extras\CUPTI\lib64
El entorno del sistema no tiene este directorio, por lo que la biblioteca dll no se puede indexar.
Solución: Dado que C:\Archivos de programa\NVIDIA GPU Computing Toolkit\CUDA\v11.7 \bin está en el entorno del sistema, puede copiar cupti64_2022.2.1.dll en el directorio bin.
(2) Pregunta 2, si ejecuta el archivo compilado e informa un error: No se puede encontrar el compilador 'cl.exe' en PATH
nvcc kernel.cu -o kernel // 编译
Luego agregue C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin a la ruta del sistema.
Ejemplo de uso:
nvprof ./kernel
(1) Qué operaciones se pueden ver, cuántas veces se han operado, cuál es el tiempo promedio, máximo y mínimo empleado, y cuál es la proporción del tiempo empleado;
(2) cudaMalloc toma la mayor parte del tiempo y se ejecutó 3 veces, el tiempo mínimo es 2us, el tiempo máximo es 259ms y el tiempo promedio es 86ms;
continuará. . .