Me gustaría llamar a algo como usleep()
dentro de un kernel CUDA. El objetivo básico es hacer que todos los núcleos de la GPU duerman o queden ocupados durante varios miles de segundos; es parte de algunas comprobaciones de cordura que quiero hacer para una aplicación CUDA. Mi intento de hacer esto es a continuación:Equivalente de usleep() en kernel CUDA?
#include <unistd.h>
#include <stdio.h>
#include <cuda.h>
#include <sys/time.h>
__global__ void gpu_uSleep(useconds_t wait_time_in_ms)
{
usleep(wait_time_in_ms);
}
int main(void)
{
//input parameters -- arbitrary
// TODO: set these exactly for full occupancy
int m = 16;
int n = 16;
int block1D = 16;
dim3 block(block1D, block1D);
dim3 grid(m/block1D, n/block1D);
useconds_t wait_time_in_ms = 1000;
//execute the kernel
gpu_uSleep<<< grid, block >>>(wait_time_in_ms);
cudaDeviceSynchronize();
return 0;
}
me sale el siguiente error al intentar compilar este usando NVCC:
error: calling a host function("usleep") from a __device__/__global__
function("gpu_uSleep") is not allowed
Claramente, no se me permite utilizar una función como anfitrión usleep()
dentro de un kernel. ¿Cuál sería una buena alternativa a esto?
Gracias! Me gustaría utilizar clock64() para que pueda contar más tiempo y reducir el impacto de voltearse. Cuando compilo un kernel CUDA que incluye una llamada clock64(), obtengo "error: identificador" clock64 "undefined". Cuando uso clock(), el programa se compila correctamente. Estoy usando nvcc 4.0. Basado en una búsqueda rápida en Google, parece que clock64() se supone que está en cuda/nvcc 4.0. ¿Alguna idea sobre cómo resolver esto? – solvingPuzzles
También necesita capacidad de cálculo> = 2.0 para obtener 'clock64()'. –
interesante. Estoy usando una GTX480, que nvidia enumera como que tiene capacidad de cálculo 2.0. – solvingPuzzles