2010-09-22 3 views
1

J'ai écrit un plugin cuda (dynamic library), et j'ai un programme écrit en C qui utilise dlopen() pour charger ce plugin. J'utilise dlsym() pour obtenir les fonctions de ce plugin. Pour mon application, il est très important que chaque fois que vous chargez le plugin, le programme obtienne un nouveau handle avec l'appel dlopen() (le fichier de la bibliothèque peut être modifié par la suite). Par conséquent, après l'utilisation des fonctions de mon plugin, j'appelle le dlclose(). Les invocations dlopen() - dlsym() - dlclose() ont lieu pendant l'exécution de mon programme (dans la boucle).CUDA plugin dlopen

Si je travaille sur l'ordinateur avec le pilote NVIDIA 256.35 (CUDA 3.0 ou 3.1), j'ai une fuite de mémoire (j'utilise dans mon plugin cudaMemGetInfo() pour le diagnostic). Si je travaille sur l'ordinateur avec le pilote NVIDIA 195.36.15 (CUDA 3.0) J'ai une erreur après un certain temps de l'exécution du programme: "NVIDIA: Impossible d'ouvrir le fichier périphérique/dev/nvidia0 (Trop de fichiers ouverts)." Si je n'utilise pas l'invocation dlclose(), le programme fonctionne correctement, mais dans ce cas je ne peux pas remplacer le plugin sur un nouveau lors de l'exécution de mon programme.

Quelqu'un at-il rencontré ce problème? Merci.

Répondre

1

Personne n'a écrit de plugins sur CUDA? J'ai trouvé l'exemple similaire sur CUDA SDK: matrixMulDynlinkJIT. J'ai fait une petite correction dans le code. En particulier, dans le fichier cuda_drvapi_dynlink.c j'ai corrigé cuInit() fonction:

CUDADRIVER CudaDrvLib = NULL; 

CUresult CUDAAPI cuInit(unsigned int Flags) 

{ 

    //CUDADRIVER CudaDrvLib; 

    CUresult result; 
    int driverVer; 

    if (CudaDrvLib != NULL) { 
     dlclose (CudaDrvLib); 
     CudaDrvLib = NULL; 
    } 
    ....... 
} 

Et dans le fichier matrixMulDynlinkJIT.cpp j'ai ajouté boucle dans la fonction main():

int main(int argc, char** argv) 

{ 

    printf("[ %s ]\n", sSDKsample); 


    while (1) { 
     // initialize CUDA 

     CUfunction matrixMul = NULL; 
     cutilDrvSafeCallNoSync(initCUDA(&matrixMul, argc, argv)); 

     ..... 

    }//while (1) 
    cutilExit(); 
} 

Donc, j'ai le même problème comme dans mon programme (après un certain temps d'exécution): "NVIDIA: impossible d'ouvrir le fichier périphérique/dev/nvidia0 (trop de fichiers ouverts)." Mais quand je commente le dlclose() dans le fichier cuda_drvapi_dynlink.c - tout fonctionne bien

Je ne peux pas comprendre ce comportement ... Des idées?