2016-05-03 2 views
0

Я хочу использовать представление библиотеки Intel в сочетании с OpenCL, но это не работает для меня. Чтобы показать проблему, я создал небольшой код, чтобы получить все OpenCL устройства:Использование OpenCL и embree одновременно

#include <stdio.h> 
#include <stdlib.h> 
#include <CL/cl.h> 

int main() { 
    int i, j; 
    char* value; 
    size_t valueSize; 
    cl_uint platformCount; 
    cl_platform_id* platforms; 
    cl_uint deviceCount; 
    cl_device_id* devices; 
    cl_uint maxComputeUnits; 

    // get all platforms 
    clGetPlatformIDs(0, NULL, &platformCount); 
    platforms = (cl_platform_id*) malloc(sizeof(cl_platform_id) * platformCount); 
    clGetPlatformIDs(platformCount, platforms, NULL); 
    printf("Found PLatform :%i\n",platformCount); 
    for (i = 0; i < platformCount; i++) { 

     // get all devices 
     clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, NULL, &deviceCount); 
     devices = (cl_device_id*) malloc(sizeof(cl_device_id) * deviceCount); 
     clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, deviceCount, devices, NULL); 

     // for each device print critical attributes 
     for (j = 0; j < deviceCount; j++) { 

      // print device name 
      clGetDeviceInfo(devices[j], CL_DEVICE_NAME, 0, NULL, &valueSize); 
      value = (char*) malloc(valueSize); 
      clGetDeviceInfo(devices[j], CL_DEVICE_NAME, valueSize, value, NULL); 
      printf("%i.%i Device: %sn\n", i+1,j+1, value); 
      free(value); 
     } 
     free(devices); 
    } 
    free(platforms); 
    return 0; 
} 

Если я скомпилировать этот код:

g++ --std=c++11 -march=native -o test test.c -lOpenCL 

я получаю следующий результат:

Found PLatform :2 
1.1 Device: GeForce GTX 670n 
2.1 Device: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHzn 

Если я скомпилирую тот же код с:

g++ --std=c++11 -march=native -o test test.c -lOpenCL -l:libembree.so.2 

Я не могу найти свой процессор больше, как доступное устройство OpenCL, как я получаю следующий поток вывода:

Found PLatform :1 
1.1 Device: GeForce GTX 670n 

Может кто-нибудь помочь мне получить мой процессор снова как устройство OpenCL?

+0

вы можете попробовать с помощью 'g ++ --std = C++ 11 -march = native -o test test.c -l: libembree.so.2 -lOpenCL'. Если libembree содержит OpenCL-код, может быть предпочтительнее связывание OpenCL.so. Другая возможность: libembree - 32/64 бит, ведь это приводит к компиляции в этом режиме, и в этой инструкции драйвер не имеет реализации ЦПУ в ICD. – DarkZeros

+0

Благодарим за ваш контакт: Я попытался переключить ссылки, как вы предлагали, но это не сработало. Я также проверил архитектуру, используя 'objdump' для обеих библиотек (libembree.so и libOpenCL.so), и оба возвращают' i386: x86-64, flags 0x00000150'. Есть ли у вас какие-либо предложения, как проверить, содержит ли libembree OpenCL? – Chris

+0

Я бы скорее проверил 'readelf -h test', а не библиотеки отдельно. Потому что легко пропустить то, что g ++ действительно связывает. Вы можете использовать 'readelf -a libembree | grep cl', чтобы увидеть, какие функции CL определены внутри. – DarkZeros

ответ

0

Я нашел решение этой проблемы:

Программа была связана с символической ссылкой, а не реальный путь к библиотеке. Путем связывания с реальным пути библиотеки проблема решена, используя LD_LIBRARY_PATH.

Смежные вопросы