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.
Powinieneś dopasować wersję sterownika i wersji runtime, o ile wiem. – jmsu
AFAIK, sterownik jest ogólnie zgodny z poprzednimi wersjami. Mamy znaczną ilość bardziej złożonego kodu, który działa dobrze. –
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