CUDA плагин длопен - PullRequest
       3

CUDA плагин длопен

1 голос
/ 22 сентября 2010

Я написал плагин cuda (динамическая библиотека), и у меня есть программа, написанная на C, которая использует dlopen () для загрузки этого плагина.Я использую dlsym (), чтобы получить функции из этого плагина.Для моего приложения очень важно, чтобы в любой момент загрузки плагина программа получала новый дескриптор с вызовом dlopen () (впоследствии файл библиотеки может быть изменен).Поэтому после использования функций из моего плагина я вызываю dlclose ().Вызовы dlopen () - dlsym () - dlclose () происходят во время выполнения моей программы (в цикле).

Если я работаю на компьютере с драйвером NVIDIA 256.35 (CUDA 3.0 или 3.1), у меня естьутечка памяти (я использую в своем плагине cudaMemGetInfo () для диагностики).Если я работаю на компьютере с драйвером NVIDIA 195.36.15 (CUDA 3.0), через некоторое время выполнения программы возникает ошибка: «NVIDIA: не удалось открыть файл устройства / dev / nvidia0 (слишком много открытых файлов)».

Если я не использую вызов dlclose (), программа работает нормально, но в этом случае я не могу заменить плагин на новый во время выполнения моей программы.

Кто-нибудь сталкивалсяЭта проблема?Спасибо.

1 Ответ

1 голос
/ 23 сентября 2010

Никто не писал плагинов на 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 - все отлично работает

Я не могу понять это поведение ... Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...