2011-12-15 8 views
6

Poniższy prosty program nigdy nie zostanie zakończony, jeśli zostanie wykonane wywołanie cudaMalloc. Komentowanie tylko cudaMalloc powoduje, że normalnie wychodzi.Prosty program konsoli nie zostanie zakończony, jeśli nazwa cudaMalloc zostanie nazwana

#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); 
} 

Działa na systemie Windows 7, sterownik CUDA 4.1, środowisko wykonawcze CUDA 3.2. Śledziłem powrót z głównego poprzez CRT do ExitProcess(), z którego nigdy nie wraca (zgodnie z oczekiwaniami), ale proces nigdy się nie kończy. Od VS2008 mogę przestać debugować OK. Z wiersza poleceń muszę zabić okno konsoli.

wyjście Program:

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

Próbowałem dokonywania kwoty alokacji tak duża, że ​​cudaMalloc zawiedzie. Zrobił to i zgłosił błąd, ale program nadal nie mógł wyjść. Najwyraźniej ma to związek jedynie z wywołaniem cudaMalloc, a nie z istnieniem przydzielonej pamięci.

Jakieś pomysły dotyczące tego, co się tutaj dzieje?

EDYCJA: Myliłem się w drugim zdaniu - Muszę wyeliminować zarówno cudaMalloc, jak i cudaFree, aby program został zakończony. Pozostawienie jednego z nich powoduje zawieszenie.

EDYCJA: Chociaż istnieje wiele odniesień do faktu, że wersje sterowników CUDA są kompatybilne wstecz, problem ten uległ zmianie po przywróceniu sterownika do wersji V3.2.

+0

Powinieneś dopasować wersję sterownika i wersji runtime, o ile wiem. – jmsu

+0

AFAIK, sterownik jest ogólnie zgodny z poprzednimi wersjami. Mamy znaczną ilość bardziej złożonego kodu, który działa dobrze. –

+0

Dlatego nie powiedziałem tego jako odpowiedź ... Nie jestem tego pewien. Powiedziałbym, że problem polegał na tym, że jeśli cudaMalloc ulegnie awarii, nie można użyć programu cudaFree, ale stwierdza się, że pozostawienie jednego z nich powoduje zawieszenie. Chciałbym usunąć cudaFree w dowolny sposób lub wykonać to warunkowo. Może wypróbujesz cudaDeviceReset() przed powrotem? – jmsu

Odpowiedz

1

Wygląda na to, że miksujesz interfejs API sterownika (cuInit) z interfejsem API środowiska wykonawczego (cudaMalloc).

Nie wiem, czy coś dziwnego dzieje się (lub powinno) zza kulis, ale można spróbować usunąć cuInit i zobaczyć, co się stanie.

+0

Skomentowałem to - bez zmian. –

Powiązane problemy