2015-12-17 2 views
0

У меня проблема при запуске ядра. Я запускаю ядро ​​с размером сетки (3000000, 16), а CUDA сообщает об ошибке «недействительный аргумент». Я пробовал различное значение maxPixelCount и нашел: когда maxPixelCount - 200000, сообщалось об ошибке, а когда оно 50000, оно продолжается без ошибок.Ошибка CUDA «неправильный аргумент» при запуске ядра

dim3 dimGrid(maxPixelCount, imageCount); 
printf("grid: %d * %d * %d", dimGrid.x, dimGrid.y, dimGrid.z); 
mcudaGetGrayDataKernel <<< dimGrid, 1 >>> (deviceDestDataPtrs, deviceImageDataPtrs, deviceSizes); 

cudaStatus = cudaGetLastError(); 
if (cudaStatus != cudaSuccess) { 
    printf("cuda start kernel error\n%s", cudaGetErrorString(cudaStatus); 
    goto Error; 
} 

Я проверил максимальный размер сетки, чтобы обеспечить возможность моей карты, используя следующую фразу:

printf(" - max grid size: %d * %d * %d\n", 
    prop.maxGridSize[0], 
    prop.maxGridSize[1], 
    prop.maxGridSize[2]); 

я получил следующее сообщение:

- max grid size: 2147483647 * 65535 * 65535 

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


Мой IDE является Visual Studio 2013


Эта проблема была решена. Чтобы достигнуть максимального предела размера сетки, параметр Device ->Code Generation должен быть установлен в соответствующую версию. Для моего GPU я изменил его на compute_30,sm_30.

+2

как вы скомпилируете свой код? Если вы скомпилируете cc2.0 (по умолчанию для CUDA 6.5, 7, 7.5), вы получите нижний предел 65535. Чтобы получить более высокий предел 2147483647, вам необходимо скомпилировать устройство cc3.0 или более поздней версии. Переключатель типа '-arch = sm_30' в командной строке компиляции может быть всем, что вам нужно. –

+0

Я использую Visual Studio 2013. Я изменил проект ** Свойства CUDA C/C++ **: В ** Установке ** я изменил параметр «Генерация кода» на 'compute_20, sm_30'. В ** Host ** я изменил опцию «Дополнительные параметры компилятора» на «-arch = sm_30». Но проблема все еще остается.Сообщалось о компиляционном предупреждении: '1> cl: предупреждение о командной строке D9002: игнорируется неизвестная опция« -arch = sm_30 »' – cosmozhang

+0

'compute_20, sm_30' не будет работать. Вы должны выбрать 'compute_30, sm_30'. И вы, похоже, изменили больше, чем просто вариант генерации кода (везде, где вы добавили« -arch = sm_30', удалите это). Поскольку вы боретесь с этим, вы также можете просто взять свой код и отбросить его в проект образца vectorAdd' cuda и скомпилировать его там. И, конечно, вам понадобится графический процессор cc3.0 или выше для его запуска. –

ответ

1

Эта формулировка:

dim3 dimGrid(maxPixelCount, imageCount); 

maxPixelCount место в .x измерения переменного (dimGrid), который будет использоваться для задания размеров сетки запуска ядра:

mcudaGetGrayDataKernel <<< dimGrid, 1 >>> ... 

Обратившись до the programming guide (или вы можете использовать примерный код deviceQuery или запросить данные самостоятельно программно), мы можем видеть, что устройства с возможностью вычисления 2.0 поддерживают только до предела 65535 на размер .x сетки. Для того, чтобы достичь большего размера (2^31 - 1), доступного в вычислительной способности 3.0 (или выше) устройствах, необходимо, чтобы:

  1. компилировать для возможности вычислительной 3.0+ устройства <and>
  2. запущен код на устройстве с возможностью вычисления 3.0+.

Существует множество способов указать, как скомпилировать для устройства с вычислительной способностью 3.0. Большинство проектов кода кода CUDA демонстрируют это для проектов windows и linux (Makefile). Для получения дополнительной информации о компиляции для данной архитектуры устройства и о том, что означают различные коммутаторы, см. this answer и this answer и соответствующий раздел the nvcc manual.

Смежные вопросы