2013-04-20 4 views
17

Hier ist mein Code:Fehler "ungültiges Konfigurationsargument" für den Aufruf des CUDA-Kernels?

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

Dies ist die Ausführung meines zweiten Kerns, und es ist in Begriff der Verwendung von Daten völlig unabhängig. BLOCKDIM ist 512, nWidth and nHeight sind auch 512 und cudasafe druckt einfach die entsprechende String-Nachricht des Fehlercodes. Dieser Abschnitt des Codes gibt Konfigurationsfehler direkt nach dem Kernel-Aufruf.

Was könnte diesen Fehler geben, irgendeine Idee?

Antwort

27

Diese Art von Fehlermeldung bezieht sich häufig auf die Parameter der Startkonfiguration (Grid/Threadblock-Dimensionen in diesem Fall, könnte in anderen Fällen auch Shared Memory usw. sein). Wenn Sie eine Nachricht wie diese sehen, ist es eine gute Idee, nur Ihre tatsächlichen Konfigurationsparameter auszudrucken, bevor Sie den Kernel starten, um zu sehen, ob Sie irgendwelche Fehler gemacht haben.

sagte Sie BLOCKDIM = 512. Sie haben threadNum = BLOCKDIM/8 so threadNum = 64. Ihre threadblock Konfiguration ist:

dim3 dimBlock(threadNum,threadNum); 

So fragen Sie Blöcke von 64 x 64 Threads zu starten, das heißt 4096 Fäden pro Block. Das funktioniert bei keiner Generation von CUDA-Geräten.

+0

I wissen Sie, dass meine Karte eine Konfiguration von 1024 Threads für jeden Block hat. Ist es dasselbe, 32 * 32 2D Konfiguration zu haben und 1D 1024 Gewindekonfiguration zu haben? – erogol

+4

1024 Threads ist die Grenze pro Block. Sie können einen beliebigen Satz von 1D-, 2D- oder 3D-Dimensionen haben, die diesen Wert nicht überschreiten. Also sind 1024x1, 512x2, 256x4, 128x8 usw. alles akzeptable 2D-Grenzen. Ähnlich für 3D, z.B. 16x8x8, 32x8x4, 64x4x4 usw. sind alle akzeptable 3D-Grenzen. Das 'deviceQuery'-cuda-Beispiel gibt Informationen über Gesamt- und Dimensionsgrenzen. Unabhängig von den Grenzwerten pro Dimension kann das tatsächliche Gesamtprodukt jedoch nicht die Gesamtgrenze von 1024 oder die für Ihr Gerät geeigneten Werte überschreiten. –

1

Nur um den vorherigen Antworten hinzuzufügen, können Sie auch die max Fäden erlaubt im Code finden kann, so kann es ohne Hartcodierung die Anzahl der Threads Sie verwenden in anderen Geräten laufen:

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