web-dev-qa-db-fra.com

Erreur "argument de configuration invalide" pour l'appel du noyau CUDA?

Voici mon code:

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");

Il s'agit de l'exécution de mon deuxième noyau et il est totalement indépendant en termes d'utilisation des données. BLOCKDIM est 512, nWidth and nHeight sont également 512 et cudasafe affiche simplement le message de chaîne correspondant au code d'erreur. Cette section du code donne une erreur de configuration juste après l'appel du noyau.

Que pourrait donner cette erreur, une idée?

25
erogol

Ce type de message d'erreur se réfère fréquemment aux paramètres de configuration de lancement (les dimensions de la grille/threadblock dans ce cas, peuvent également être de la mémoire partagée, etc. dans d'autres cas). Quand vous voyez un message comme celui-ci, c'est une bonne idée d'imprimer vos paramètres de configuration réels avant de lancer le noyau, pour voir si vous avez fait des erreurs.

Vous avez dit BLOCKDIM = 512. Vous avez threadNum = BLOCKDIM/8 so threadNum = 64. Votre configuration de bloc de threads est:

dim3 dimBlock(threadNum,threadNum);

Vous demandez donc de lancer des blocs de 64 x 64 threads, soit 4096 threads par bloc. Cela ne fonctionnera sur aucune génération d'appareils CUDA. Tous les appareils CUDA actuels sont limités à un maximum de 1024 threads par bloc, qui est le produit des 3 dimensions de bloc.

Les dimensions maximales sont répertoriées dans tableau 14 du guide de programmation CUDA, et également disponibles via le code d'exemple CUDA deviceQuery.

41
Robert Crovella

Juste pour ajouter aux réponses précédentes, vous pouvez également trouver le nombre maximal de threads autorisés dans votre code, afin qu'il puisse fonctionner sur d'autres appareils sans coder en dur le nombre de threads que vous utiliserez:

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