Mi piacerebbe chiamare qualcosa come usleep()
all'interno di un kernel CUDA. L'obiettivo di base è rendere tutti i core GPU in sleep o busywait per un numero di millesimi: fa parte di alcuni controlli di integrità che voglio fare per un'applicazione CUDA. Il mio tentativo di fare questo è al di sotto:Equivalente di usleep() nel 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;
}
ricevo il seguente errore quando provo a compilare questo utilizzando NVCC:
error: calling a host function("usleep") from a __device__/__global__
function("gpu_uSleep") is not allowed
Chiaramente, io non sono autorizzato a utilizzare una funzione host come usleep()
all'interno di un kernel. Quale sarebbe una buona alternativa a questo?
Grazie! Mi piacerebbe usare clock64() per poter contare più a lungo e ridurre l'impatto del rollover. Quando compilo un kernel CUDA che include una chiamata clock64(), ottengo "errore: identificatore" clock64 "non definito." Quando uso clock(), il programma viene compilato correttamente. Sto usando nvcc 4.0. Sulla base di una rapida ricerca su google, sembra che clock64() dovrebbe essere in cuda/nvcc 4.0. Qualche idea su come risolvere questo? – solvingPuzzles
È inoltre necessaria la capacità di calcolo> = 2.0 per ottenere 'clock64()'. –
interessante. Sto usando una GTX480, che nvidia elenca come con capacità di calcolo 2.0. – solvingPuzzles