Chciałbym wywołać coś takiego jak usleep()
wewnątrz jądra CUDA. Podstawowym celem jest sprawienie, aby wszystkie rdzenie GPU były uśpione lub zajęte przez kilka mililitrów - jest to część niektórych testów poprawności, które chcę wykonać dla aplikacji CUDA. Moja próba robi to poniżej:Równoważnik usleep() w jądrze 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;
}
otrzymuję następujący błąd, gdy próbuję skompilować ten korzystając nvcc:
error: calling a host function("usleep") from a __device__/__global__
function("gpu_uSleep") is not allowed
Oczywiste jest, że nie wolno mi użyć funkcji gospodarza, takich jak usleep()
wewnątrz jądra. Co byłoby dobrą alternatywą do tego?
Dzięki! Chciałbym użyć clock64(), aby móc liczyć dłużej i zmniejszyć wpływ przewalutowania. Kiedy kompiluję jądro CUDA, które zawiera wywołanie clock64(), otrzymuję komunikat "błąd: identyfikator" clock64 "jest niezdefiniowany." Kiedy używam zegara(), program kompiluje się poprawnie. Używam nvcc 4.0. Bazując na szybkim wyszukiwaniu google, wygląda na to, że clock64() ma być w cuda/nvcc 4.0. Wszelkie przemyślenia, jak rozwiązać ten problem? – solvingPuzzles
Potrzebujesz również możliwości obliczeniowych> = 2.0, aby uzyskać 'clock64()'. –
interesujące. Używam GTX480, który nvidia wymienia jako posiadający zdolność obliczeniową 2.0. – solvingPuzzles