Подтвердить что ты не робот

Ошибка "неправильного аргумента конфигурации" для вызова ядра CUDA?

Вот мой код:

int threadNum = BLOCKDIM/8;
dim3 dimBlock(threadNum,threadNum);
int blocks1 = nWidth/threadNum + (nWidth%threadNum == 0 ? 0 : 1);
int blocks2 = nHeight/threadNum + (nHeight%threadNum == 0 ? 0 : 1);
dim3 dimGrid;
dimGrid.x = blocks1;
dimGrid.y = blocks2;

//  dim3 numThreads2(BLOCKDIM);
//  dim3 numBlocks2(numPixels/BLOCKDIM + (numPixels%BLOCKDIM == 0 ? 0 : 1) );
perform_scaling<<<dimGrid,dimBlock>>>(imageDevice,imageDevice_new,min,max,nWidth, nHeight);
cudaError_t err = cudaGetLastError();
cudasafe(err,"Kernel2");

Это исполнение моего второго ядра, и оно полностью независимо в отношении использования данных. BLOCKDIM равно 512, nWidth and nHeight тоже 512, а cudasafe просто печатает соответствующее строковое сообщение кода ошибки. Этот раздел кода дает ошибку конфигурации сразу после вызова ядра.

Что может дать эта ошибка, любая идея?

4b9b3361

Ответ 1

Этот тип сообщения об ошибке часто ссылается на параметры конфигурации запуска (в этом случае размеры сетки/блока потоков также могут быть общей памятью и т.д. В других случаях). Когда вы видите такое сообщение, хорошей идеей будет просто распечатать фактические параметры конфигурации перед запуском ядра, чтобы проверить, не сделали ли вы какие-либо ошибки.

Вы сказали BLOCKDIM = 512. У вас есть threadNum = BLOCKDIM/8, поэтому threadNum = 64. Ваша конфигурация потокового блока:

dim3 dimBlock(threadNum,threadNum);

Итак, вы просите запустить блоки из 64 x 64 потоков, то есть 4096 потоков на блок. Это не будет работать на любом поколении устройств CUDA. Все текущие устройства CUDA ограничены максимум 1024 нитями на блок, что является произведением трех размеров блока.

Максимальные размеры указаны в таблице 14 Руководства по программированию CUDA, а также доступны через пример кода deviceQuery CUDA.

Ответ 2

Чтобы добавить к предыдущим ответам, вы также можете найти максимальные потоки в вашем коде, чтобы он мог работать на других устройствах без жесткого кодирования количества потоков, которые вы будете использовать:

struct cudaDeviceProp properties;
cudaGetDeviceProperties(&properties, device);
cout<<"using "<<properties.multiProcessorCount<<" multiprocessors"<<endl;
cout<<"max threads per processor: "<<properties.maxThreadsPerMultiProcessor<<endl;