2017-09-24 1 views
0

Ich benutze: GeForce GTX 1080 TI, die eine Rechenleistung hat 6.1. OpenCV 3.2-Version (wurde für VS2013, x64 Release und Debug-Konfigurationen separat erstellt). CUDA 8.0 Version. Visual Studio 2013, Relase und Debug-Konfigurationen der x64-Plattform.Ungültiges Konfigurationsargument für Release-Konfiguration Standalone-Ausführung auf x64-Plattform

Mein Zweck ist es, einen Teil des gesamten Eingangsbildes zu verarbeiten. Der Bildteil, der von der oberen linken Koordinate und der Breite und Höhe deklariert wird.

Problembeschreibung: Eine ungültige Konfiguration Argument CUDA Fehler rasied ist nur, wenn ich in der Release-Ausgabe im Stand-Alone-Betrieb (ohne Debuggen) über Visual Studio DEBUG-Menü (Strg + F5) ausgeführt wird.

Wenn ich die gleiche Release ausführbare über VS Debug-Menü (F5) ausführen, wird der Fehler nicht ausgelöst.

Auch wenn ich die Ausgabe der Debug-Konfiguration ausführen, die von demselben Anwendungscode generiert wurde, funktionieren beide Optionen F5 und Ctrl + F5 ordnungsgemäß und der Fehler wird nicht ausgelöst.

Hier ist mein Code:

struct sRect 
{ 
unsigned int m_StartRow; 
unsigned int m_StartCol; 
unsigned int m_SizeRows; 
unsigned int m_SizeCols; 
}; 
__global__ void CleanNoisePreparation(unsigned char * SrcImage, size_t  iStep, const sRect ImageSlice) 
{ 
int iXPos = threadIdx.x + blockIdx.x*blockDim.x; 
int iYPos = threadIdx.y + blockIdx.y*blockDim.y; 

if (!(iXPos < ImageSlice.m_SizeCols && iYPos < ImageSlice.m_SizeRows)) 
    return; 

/*In case pixel value is less or equal to 127 set it to black color (0) otherwisw set it to white color (255)*/ 
SrcImage[iYPos * iStep + iXPos] = (SrcImage[iYPos * iStep + iXPos] <= (unsigned char)127) ? ((unsigned char)0) : ((unsigned char)255); 
} 
void PerformCleanNoisePreparationOnGPU(cv::cuda::GpuMat& Image, 
            const sRect &ImageSlice, 
            const dim3 &dimGrid, 
            const dim3 &dimBlock, 
            const cudaStream_t &Stream) 
{ 
     /*Calculate the rquired start address based on the required image slice characteristics*/ 

unsigned char * pImageData = (unsigned char*)(Image.data ImageSlice.m_StartRow * Image.step + ImageSlice.m_StartCol); 

CleanNoisePreparation << <dimGrid, dimBlock, 0, Stream >> >(pImageData, Image.step, ImageSlice); 
CUDA(cudaGetLastError()); 
} 

void main 
{ 
    sRect ResSliceParams;   

    ResSliceParams.m_StartRow = 0; 
ResSliceParams.m_StartCol = 4854; 
ResSliceParams.m_SizeRows = 7096; 
ResSliceParams.m_SizeCols = 5146; 
    cv::cuda::GpuMat MyFrame = cv::cuda::GpuMat::GpuMat(cv::Size(10000, 7096), CV_8U); 
    //Image step size is 10240 

    dim3 dimBlock (32, 32, 1) 
    dim3 dimGrid (161, 222, 1) 

    cudaStream_t cudaStream; 

    cudaStreamCreateWithFlags(&cudaStream, cudaStreamNonBlocking); 

    PerformCleanNoisePreparationOnGPU(MyFrame, 
              ResSliceParams, 
              dimGrid, 
              dimBlock, 
              cudaStream); 
} 

Der Fehler wird ausgelöst, auch wenn:

  1. Der Kern völlig leer ist (alle Linien wurden kommentiert)
  2. Der Kernel-Eingänge Liste ist leer. anstelle von spezifischen Strom wird
  3. Standardstrom verwendet
+0

Für welche Architektur kompilieren Sie? Ihre GPU ist ein Compute-fähiges 6.1-Gerät, nicht 3.0. Das CUDA 8-Toolkit berechnet standardmäßig 2.0. Das könnte den Startfehler erklären. – talonmies

+0

Vielen Dank für Ihre schnelle Antwort. Sie haben Recht mit dem CC, es war ein Tippfehler. In Bezug auf Ihre Frage zur Architektur: Wenn ich Sie richtig verstehe, verwende ich Release-Konfiguration und x64-Plattform. Wenn nicht, bitte klarstellen. Können Sie mir bitte helfen, wie kann ich das CC für das CUDA 8.0 Toolkit ändern? – OronG

+1

Wenn es ein Tippfehler ist, dann redigiere die Frage und behebe sie. –

Antwort

0

Das Problem Quelle gefunden wurde. Aufgrund der Tatsache, dass das Problem nur ausgelöst wurde, wenn ich meine Anwendung unter Release ohne Debugging-Modus ausgeführt wurde, konnte ich nur eine Druckbefehle verwenden, um zu lernen, was sind die Variablenwerte und was ist der tatsächliche Fluss des Codes.

So wurde ich gedacht, dass dimGrid.y versehentlich nur in diesem Ausführungsmodus auf einen negativen Wert festgelegt wurde und unter allen anderen Ausführungsmodi war es ein positiver Wert, wie ich erwartet wurde. Aufgrund dieses negativen Wertes wurde der CUDA der Fehler "Ungültiges Konfigurationsargument" ausgelöst.

Weitere Details: Ich habe einen Code, der die erforderlichen dimGrid-Werte auf der Grundlage der Bildauflösung berechnet und ob es ein Hochformat oder eine Landschaft ist. Ich benutze ein Klassenmitglied vom Typ bool, um diese Angabe zu halten und ihren Initialisierungswert als Teil der Aufrufe der main-Initialisierungsliste der Hauptklasse, die alle als Mitglieder enthalten, an andere Unterklassen zu senden.

Es wurde herausgefunden, dass der Bool-Wert nur im Ausführungsmodus "Release ohne Debugging" im Gegensatz zu seinem Wert im Bereich der Hauptklasse false anstelle von true (der den Querformatmodus darstellt) im Bereich der Unterklassen ist.

Ich wurde verifiziert, dass ich es initialisiert wurde (als Teil der Elementinitialisierungsliste), um wahr zu sein, bevor ich es an alle anderen Unterklassenkonstruktoren sendete, aber aufgrund der Tatsache, dass die Reihenfolge der Klassenmitglieder nicht bestimmt wurde Mitglieder-Initialisierungslisten-Reihenfolge, aber gemäß ihrer Deklarationsreihenfolge in der Klasse wurde ihnen ein Uneingeweihter gesendet.

In meinem System, nur in Release ohne Debugging Ausführungsmodus, ein nicht initiierter Bool-Typ bekommen 0 Wert, aber in allen anderen Ausführungen Modus bekommt es einen positiven Wert.

Während die Bedingung "if" für einen nicht initiierten Bool-Typ ausgeführt wird, wird 0 in false übersetzt, aber jeder positive Wert wird in true übersetzt.

Dies wurde zu einer falschen Berechnung der dimGrid-Werte verursacht.

Verwandte Themen