Ядро CUDA не запускается
Моя проблема очень похожа на эту Одну. Я запускаю простейшую программу CUDA, но ядро не запускается. Тем не менее, я уверен, что моя установка CUDA в порядке, так как я могу запускать сложные проекты CUDA, состоящие из нескольких файлов (которые я взял у кого-то другого) без проблем. В этих проектах компиляция и связывание осуществляется через Makefile с большим количеством флагов. Я думаю, что проблема заключается в правильных флагах для использования при компиляции. Я просто использую такую команду:
nvcc -arch=sm_20 -lcudart test.cu
с а такая программа (для запуска на linux машине):
__global__ void myKernel()
{
cuPrintf("Hello, world from the device!n");
}
int main()
{
cudaPrintfInit();
myKernel<<<1,10>>>();
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
}
Программа компилируется правильно. Когда я добавляю операции cudaMemcpy (), он не возвращает ошибки. Есть предположения, почему ядро не запускается ?
2 ответа:
Вы уверены, что ваше устройство CUDA поддерживает архитектуру SM_20?
Удалите параметр arch= из командной строки nvcc и перестройте все. Это компиляция для архитектуры 1.0 CUDA, которая будет поддерживаться на всех устройствах CUDA. Если он по-прежнему не запускается, выполните чистую сборку и убедитесь, что нигде не осталось объектных файлов. Затем перестроиться и бежать.
Также arch= относится к виртуальной архитектуре, которая должна быть чем-то вроде compute_10. sm_20-это настоящее архитектура и я считаю, что должны использоваться с кодом = switch, а не arch=.
Причина, по которой он не печатается при использовании
printf
, заключается в том, что запуск ядра асинхронен и ваша программа завершает работу до того, как буфер printf будет сброшен. Раздел B. 16 руководства по программированию CUDA (5.0) C объясняет это.По этой причине данная программа ничего не печатает:Выходной буфер printf () устанавливается в фиксированный размер перед запуском ядра (см. Связанный API на стороне хоста). Он является круговым и если во время ядра производится больше выходных данных выполнение, чем может поместиться в буфере, более старые выходные данные перезаписываются. Это только покраснел когда выполняется одно из этих действий:
- запуск ядра через >> или cuLaunchKernel() (в начале запуска, и если Переменная окружения CUDA_LAUNCH_BLOCKING имеет значение 1, в конце запуска как ну),
- синхронизация через cudaDeviceSynchronize (), cuCtxSynchronize(), cudaStreamSynchronize (), cuStreamSynchronize (), cudaEventSynchronize(), или cuEventSynchronize (),
- копии памяти через любую блокирующую версию cudaMemcpy* () или cuMemcpy*(),
- загрузка/выгрузка модуля через cuModuleLoad () или cuModuleUnload (),
- разрушение контекста через cudaDeviceReset () или cuCtxDestroy ().
#include <stdio.h> __global__ void myKernel() { printf("Hello, world from the device!\n"); } int main() { myKernel<<<1,10>>>(); }
Но эта программа печатает "Hello, world from the device!"десять раз.
#include <stdio.h> __global__ void myKernel() { printf("Hello, world from the device!\n"); } int main() { myKernel<<<1,10>>>(); cudaDeviceSynchronize(); }