Я хотел бы назвать что-то вроде usleep()
внутри ядра CUDA. Основная цель заключается в том, чтобы все ядра GPU спали или заняты в течение нескольких миллисекунд - это часть некоторых проверок здравомыслия, которые я хочу сделать для приложения CUDA. Моя попытка сделать это ниже:Эквивалент usleep() в ядре 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;
}
Я получаю следующее сообщение об ошибке, когда я пытаюсь скомпилировать это с помощью NVCC:
error: calling a host function("usleep") from a __device__/__global__
function("gpu_uSleep") is not allowed
Очевидно, что я не разрешено использовать функцию хозяина, такие как usleep()
внутри ядра. Что было бы хорошей альтернативой этому?
Спасибо! Я хотел бы использовать clock64() так, чтобы я мог рассчитывать дольше и уменьшать влияние перекатывания. Когда я компилирую ядро CUDA, которое включает вызов clock64(), я получаю «error: identifier» clock64 «undefined». Когда я использую clock(), программа компилируется правильно. Я использую nvcc 4.0. Основываясь на быстром поиске google, кажется, что clock64() должен находиться в cuda/nvcc 4.0. Любые мысли о том, как это решить? – solvingPuzzles
Вам также нужна вычислительная способность> = 2.0, чтобы получить 'clock64()'. –
интересный. Я использую GTX480, который перечисляет nvidia как имеющий возможность вычисления 2.0. – solvingPuzzles