2015-09-11 20 views
4

У меня есть доступ к системе под управлением Debian 7 с двумя установленными картами Nvidia Tesla. Я бы хотел провести бенчмаркинг с помощью OpenCL. Однако OpenCL не может найти совместимые платформы. Нужны ли мне дополнительные библиотеки или специальные драйверы для работы с OpenCL?OpenCL на Nvidia Tesla: Платформы не найдены

Вот пример кода, который показывает, что никакие платформы не найдены:

#include <stdio.h> 
#include <stdlib.h> 
#ifdef __APPLE__ 
#include <OpenCL/opencl.h> 
#else 
#include <CL/cl.h> 
#endif 

int main() { 

    int i, j; 
    char* info; 
    size_t infoSize; 
    cl_uint platformCount; 
    cl_platform_id *platforms; 
    const char* attributeNames[5] = { "Name", "Vendor", 
     "Version", "Profile", "Extensions" }; 
    const cl_platform_info attributeTypes[5] = { CL_PLATFORM_NAME, CL_PLATFORM_VENDOR, 
     CL_PLATFORM_VERSION, CL_PLATFORM_PROFILE, CL_PLATFORM_EXTENSIONS }; 
    const int attributeCount = sizeof(attributeNames)/sizeof(char*); 

    // get platform count 
    clGetPlatformIDs(5, NULL, &platformCount); 

    // get all platforms 
    platforms = (cl_platform_id*) malloc(sizeof(cl_platform_id) * platformCount); 
    clGetPlatformIDs(platformCount, platforms, NULL); 

    printf("Platform count: %d\n",platformCount); 

    // for each platform print all attributes 
    for (i = 0; i < platformCount; i++) { 

     printf("n %d. Platform n", i+1); 

     for (j = 0; j < attributeCount; j++) { 

      // get platform attribute value size 
      clGetPlatformInfo(platforms[i], attributeTypes[j], 0, NULL, &infoSize); 
      info = (char*) malloc(infoSize); 

      // get platform attribute value 
      clGetPlatformInfo(platforms[i], attributeTypes[j], infoSize, info, NULL); 

      printf(" %d.%d %-11s: %sn", i+1, j+1, attributeNames[j], info); 
      free(info); 

     } 

     printf("n"); 

    } 

    free(platforms); 
    return 0; 

} 

И команда, которую я использовал для компиляции кода:

gcc platforms.c -lOpenCL 

Если я запускаю код, выход :

Platform count: 0 
+0

Когда вы вызываете clGetPlatformIDs, он расскажет вам, сколько платформ вы установили. Для AMD может быть один, один для NVIDIA, и один для Intel, например. Затем на каждой платформе вы вызываете clGetDeviceID, который будет возвращать количество устройств внутри этой платформы. На вашей платформе NVIDIA вы найдете свой K20, и на вашей платформе Intel вы найдете процессор Xeon и сопроцессор Xeon Phi. – LPs

+2

Установили ли вы проприетарный драйвер NVIDIA? Есть ли '/ etc/OpenCL/vendors/nvidia.icd', и содержит ли его имя библиотеки (обычно' libnvidia-opencl.so')? – jprice

+0

Файл '/ etc/OpenCL/vendors/nvidia.icd' существует, его содержимое также является' libnvidia-opencl.so.1'. –

ответ

2

Возможно, вы столкнулись с типичной проблемой 64-битных ошибок ICD. ICD для 64 и 32 бит полностью изолирован, и вы не можете запускать приложение на 64 бита, используя 32-битные ICD и наоборот.

Когда ICD не найден, или платформа для этого ICD архитектуры, clGetPlatformIDs возвращает код -1001 ошибки:

Returned by clGetPlatformIDs when no platforms are found 

    CL_PLATFORM_NOT_FOUND_KHR   -1001 

NVidia только устанавливает библиотеку платформы для версии вы загружаете, обычно 64 бита, оставляя 32-битные OpenCL-приложения вне сферы действия. ICD по-прежнему загружается, но не возвращает никаких платформ.

Скомпилируйте приложение в «другом режиме» (32/64 бит), и оно будет работать.

+0

Я просто проверил, что CUDA установлен в 64-битной версии. Программа OpenCL была скомпилирована в 64-битном режиме. Тем не менее, платформа не обнаружена. –