Ядро 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 4

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();
}