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?
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
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. –