2010-09-22 19 views
1

我已經寫了一個cuda插件(動態庫),並且我有一個使用dlopen()加載這個插件的C編寫的程序。我正在使用dlsym()從該插件獲取函數。對於我的應用程序來說,任何時候加載插件都非常重要,程序會使用dlopen()調用獲得新的句柄(隨後可能會修改庫文件)。 因此,在使用我的插件中的函數之後,我調用了dlclose()。調用dlopen() - dlsym() - dlclose()發生在我的程序執行期間(在循環中)。CUDA插件dlopen

如果我在使用NVIDIA驅動程序256.35(CUDA 3.0或3.1)的計算機上工作,我有內存泄漏(我在我的插件cudaMemGetInfo()中使用,要求進行診斷)。 如果我在使用NVIDIA驅動程序195.36.15(CUDA 3.0)的計算機上工作,程序執行一段時間後出現錯誤:「NVIDIA:無法打開設備文件/ dev/nvidia0(打開的文件太多)。」

如果我不使用dlclose()調用,程序工作正常,但在這種情況下,我無法在程序執行期間替換新插件上的插件。

任何人都遇到過這個問題? 謝謝。

回答

1

沒有人在CUDA上寫過插件嗎?

我在CUDA SDK上找到了類似的示例:matrixMulDynlinkJIT。我在代碼中進行了小修改。特別是,該文件cuda_drvapi_dynlink.c在我已經糾正cuInit()功能:

CUDADRIVER CudaDrvLib = NULL; 

CUresult CUDAAPI cuInit(unsigned int Flags) 

{ 

    //CUDADRIVER CudaDrvLib; 

    CUresult result; 
    int driverVer; 

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

和文件matrixMulDynlinkJIT.cpp在我的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(); 
} 

所以,我有同樣的問題像在我的程序(經過一段時間的執行):「NVIDIA:無法打開設備文件/ dev/nvidia0(太多打開的文件)。」 但是,當我註釋掉dlclose()cuda_drvapi_dynlink.c文件 - 所有工作正常

我無法理解這種行爲... 任何想法?