У меня есть ядро, которое запускается дважды с разным размером сетки.
Моя проблема связана с cuPrintf. Когда у меня нет cudaPrintfInit() до запуска ядра и cudaPrintfDisplay(stdout, true) и cudaPrintfEnd() после запуска ядра, у меня нет ошибки, но когда я помещаю их туда, я получаю сообщение об ошибке "неопределенный сбой запуска".
В моем коде устройства есть только один такой цикл для печати:
if (threadIdx.x==0) {
cuPrintf("MAX:%f x:%d y:%d\n", maxVal, blockIdx.x, blockIdx.y);
}
Я использую CUDA 4.0 с картой с возможностью cuda 2.0, поэтому я компилирую свой код с таким синтаксисом:
nvcc LB2.0.cu -arch=compute_20 -code=sm_20
Ответ 1 · рейтинг 1 · harrism
Если вы используете графический процессор CC 2.0, вам вообще не нужен cuPrintf - CUDA имеет встроенный printf для графических процессоров CC-2.0 и выше. Поэтому просто замените вызов cuPrintf следующим:
#if __CUDA_ARCH__ >= 200
if (threadIdx.x==0) {
printf("MAX:%f x:%d y:%d\n", maxVal, blockIdx.x, blockIdx.y);
}
#endif
(Обратите внимание, что вам нужны строки #if / #endif только в том случае, если вы компилируете свой код для sm_20, а также для более ранних версий. С помощью приведенного вами примера командной строки компиляции вы можете их исключить.)
С printf вам не нужны cudaPrintfInit() или cudaPrintfDisplay() - это происходит автоматически. Однако, если вы печатаете много данных, вам может потребоваться увеличить размер FIFO printf по умолчанию с помощью cudaDeviceSetLimit(), передав параметр cudaLimitPrintfFifoSize.