2013-04-20 16 views
17

Oto mój kod:"błąd nieprawidłowej konfiguracji" dla wywołania jądra 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"); 

Jest to realizacja mojego drugiego jądra i jest w pełni niezależny w perspektywie wykorzystania danych. BLOCKDIM to 512, nWidth and nHeight to także 512, a cudasafe po prostu drukuje odpowiednią wiadomość z kodem błędu. Ta sekcja kodu podaje błąd konfiguracji tuż po wywołaniu jądra.

Co może dać ten błąd, jakiś pomysł?

Odpowiedz

27

Ten typ komunikatu o błędzie często odnosi się do parametrów konfiguracji uruchamiania (wymiary grid/threadblock w tym przypadku mogą być również pamięcią wspólną itd. W innych przypadkach). Kiedy zobaczysz taki komunikat, dobrym pomysłem jest wydrukowanie rzeczywistych parametrów konfiguracyjnych przed uruchomieniem jądra, aby sprawdzić, czy popełniłeś jakieś błędy.

Mówiłeś BLOCKDIM = 512. Trzeba threadNum = BLOCKDIM/8 tak threadNum = 64. Konfiguracja threadblock jest:

dim3 dimBlock(threadNum,threadNum); 

Więc prosicie, aby uruchomić bloki 64 x 64 wątków, czyli 4096 wątków na blok. To nie zadziała na żadnej generacji urządzeń CUDA.

+0

I wiem, że moja karta ma konfigurację 1024 wątków dla każdego bloku. Czy to samo dotyczy konfiguracji 32 * 32 2D i wątku havin 1D 1024? – erogol

+4

1024 wątków jest limitem dla poszczególnych bloków. Możesz mieć dowolny zestaw wymiarów 1D, 2D lub 3D, które nie przekraczają tego. Tak więc 1024x1, 512x2, 256x4, 128x8 itd. Są dopuszczalnymi granicami 2D. Podobnie dla 3D, np. 16 x 8 x 8, 32 x 8 x 4, 64 x 4 x 4 itd. To dopuszczalne limity 3D. Próbka "deviceQuery' cuda podaje informacje o limitach całkowitych i wymiarowych. Ale niezależnie od limitów na wymiar, rzeczywisty całkowity produkt nie może przekroczyć całkowitego limitu 1024 lub cokolwiek odpowiedniego dla twojego urządzenia. –

1

Wystarczy dodać do poprzednich odpowiedzi, można znaleźć wątki max dopuszczalne w kodzie też, więc można go uruchomić w innych urządzeniach bez sztywnego kodowania liczbę wątków będzie użyć:

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