2013-07-17 4 views
-1

Я пытаюсь вызвать два ядра, как показано нижеCuda неудачного запуска ядра

for (t=0; t<=time_total; t++) 
{  
     //kernel calls 
     kernel1<<<noOfBlocks,noOfThreadsPerBlock>>>(** SOME PARAMETERS **); 
     checkCudaError(cudaThreadSynchronize()); 

     kernel2<<<noOfBlocks,noOfThreadsPerBlock>>>(** SOME PARAMETERS **); 
     checkCudaError(cudaThreadSynchronize()); 

} 

А структура второго ядра является

var[index+0]=**SOME CALCULATION** 
var[index+1]=**SOME CALCULATION** 
var[index+2]=**SOME CALCULATION** 

Теперь, когда я выполняю этот код, checkCudaError не сообщает что-либо, и код выполнен с выдачей какого-либо результата, но визуальная студия дает следующее исключение

First-chance exception at 0x7640c41f in **.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0039f9c4.. 
First-chance exception at 0x7640c41f in **.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0039f9c4.. 

И когда я проверяю на Nsight он говорит ядро ​​2, имеющий следующую ошибку

CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES 

Теперь проблема заключается в том, что переменная массива в ядре 2 дает некоторые строки исправить некоторые копии других значений строк и некоторые из них мусор.

Кроме того, когда я делаю это

var[index+0]=3 
var[index+1]=3 
var[index+2]=3 

Все значения вар установлены 3

+0

его лучше дать весь код .., чтобы мы могли скомпилировать, запустить и проверить проблему .. –

+0

Извините, я не могу создать код здесь .. Я просто хотел узнать, что вызывает исключения, и если есть ошибка запуска ядра, что именно это означает? – amitdonanand

+0

Я проголосовал, чтобы закрыть это. Если вы не предоставите необходимую информацию для других здесь, чтобы помочь вам, я не понимаю, как вы можете ожидать, что кто-нибудь предоставит вам ответ. – talonmies

ответ

0

Несколько боковые заметки:

  1. cudaThreadSynchronize() осуждается в пользу cudaDeviceSynchronize().
  2. Тот факт, что nsight сообщает об ошибке при запуске 2-го ядра, но ваш код проверки ошибок не работает, приводит меня к выводу, что ваш код проверки ошибок не работает.

Теперь, что касается вашего вопроса, из ресурсов часто связанно с кодом запроса слишком много регистров (слишком много регистров для каждого потока раз числа нитей на threadblock запрошенного.) Попробуйте повторно компиляцию кода specifying-Xptxas -v в получить подробный вывод, а затем повторно перекомпилировать с помощью -maxrregcount 20 (или something like that), чтобы попытаться обойти это для целей тестирования.

Если это «исправляет» ваша проблема, вы можете затем хотите рассмотреть следующие вопросы:

  1. Смотрите, если есть способ, вы можете изменить порядок или перестроить свой код, чтобы уменьшить давление регистра
  2. Если нет, то скорректируйте значение maxrregcount вверх до примерно самого высокого значения, которое позволит компилировать и запускать ваш код в соответствии с конфигурациями запуска (количество потоков на блок), которые вам интересны. Вы также можете сравнить свой код на разных уровнях этого параметра, так как это может повлиять на занятость. Обычно, если у вас установлено максимальное значение, которое будет компилироваться и выполняться, тогда вы ограничиваете себя одним блоком потоков на SM во время выполнения. Это может быть в порядке, или может быть более низкая настройка, которая лучше, позволяя использовать два потоковых блока на место SM SM и, возможно, более высокую производительность. Скажет только бенчмаркинг вашего кода.
Смежные вопросы