2011-12-15 9 views
6

Il seguente programma semplice non esce se viene eseguita la chiamata cudaMalloc. Commentando solo il cudaMalloc fa in modo che esca normalmente.programma di console semplice non uscirà se cudaMalloc si chiama

#include <iostream> 
using std::cout; 
using std::cin; 

#include "cuda.h" 
#include "cutil_inline.h" 

void PrintCudaVersion(int version, const char *name) 
{ 
    int versionMaj = version/1000; 
    int versionMin = (version - (versionMaj * 1000))/10; 
    cout << "CUDA " << name << " version: " << versionMaj << "." << versionMin << "\n"; 
} 

void ReportCudaVersions() 
{ 
    int version = 0; 
    cudaDriverGetVersion(&version); 
    PrintCudaVersion(version, "Driver"); 

    cudaRuntimeGetVersion(&version); 
    PrintCudaVersion(version, "Runtime"); 
} 

int main(int argc, char **argv) 
{ 
    //CUresult r = cuInit(0);     << These two lines were in original post 
    //cout << "Init result: " << r << "\n"; << but have no effect on the problem 

    ReportCudaVersions(); 

    void *ptr = NULL; 
    cudaError_t err = cudaSuccess; 
    err = cudaMalloc(&ptr, 1024*1024); 
    cout << "cudaMalloc returned: " << err << " ptr: " << ptr << "\n"; 
    err = cudaFree(ptr); 
    cout << "cudaFree returned: " << err << "\n"; 

    return(0); 
} 

Questo è in esecuzione su Windows 7, driver CUDA 4.1, runtime CUDA 3.2. Ho tracciato il ritorno dal main attraverso il CRT a ExitProcess(), da cui non ritorna mai (come previsto), ma il processo non finisce mai. Da VS2008 posso fermare il debug OK. Dalla riga di comando, devo uccidere la finestra della console.

uscita Programma:

Init result: 0 
CUDA Driver version: 4.1 
CUDA Runtime version: 3.2 
cudaMalloc returned: 0 ptr: 00210000 
cudaFree returned: 0 

provai a fare la quantità di assegnazione così grande che cudaMalloc fallirebbe. Ha fatto e segnalato un errore, ma il programma non sarebbe ancora uscito. Quindi apparentemente ha a che fare solo chiamando cudaMalloc, non l'esistenza di memoria allocata.

Tutte le idee su quello che sta succedendo qui?

EDIT: ho sbagliato nella seconda frase - devo eliminare sia il cudaMalloc e cudaFree per ottenere il programma per uscire. Lasciando entrambi uno causa il riaggancio.

EDIT: Anche se ci sono molti riferimenti al fatto che le versioni dei driver CUDA sono compatibili, questo problema è andato via quando sono ritornato al conducente di V3.2.

+0

si suppone di corrispondere alla versione del driver e runtime per quanto ne so. – jmsu

+0

AFAIK, il driver è generalmente compatibile con le versioni precedenti. Abbiamo una quantità significativa di codice più complesso che funziona bene. –

+0

Ecco perché non l'ho messo come risposta ... Non ne sono sicuro. Direi che il problema è che se cudaMalloc fallisce, non puoi usare cudaFree ma dichiari che lasciare uno solo in causa provoca il riaggancio. Vorrei rimuovere il cudaFree in entrambi i modi o eseguirlo in modo condizionale. Forse provare un cudaDeviceReset() prima di tornare? – jmsu

risposta

1

Sembra che tu stia missando l'API del driver (cuInit) con l'API di runtime (cudaMalloc).

Non so se qualcosa di divertente accade (o dovrebbe accadere) dietro le quinte, ma una cosa che si può provare è rimuovere lo cuInit e vedere cosa succede.

+0

Ho commentato questo - nessun cambiamento. –

Problemi correlati