Я хочу использовать представление библиотеки 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?
вы можете попробовать с помощью 'g ++ --std = C++ 11 -march = native -o test test.c -l: libembree.so.2 -lOpenCL'. Если libembree содержит OpenCL-код, может быть предпочтительнее связывание OpenCL.so. Другая возможность: libembree - 32/64 бит, ведь это приводит к компиляции в этом режиме, и в этой инструкции драйвер не имеет реализации ЦПУ в ICD. – DarkZeros
Благодарим за ваш контакт: Я попытался переключить ссылки, как вы предлагали, но это не сработало. Я также проверил архитектуру, используя 'objdump' для обеих библиотек (libembree.so и libOpenCL.so), и оба возвращают' i386: x86-64, flags 0x00000150'. Есть ли у вас какие-либо предложения, как проверить, содержит ли libembree OpenCL? – Chris
Я бы скорее проверил 'readelf -h test', а не библиотеки отдельно. Потому что легко пропустить то, что g ++ действительно связывает. Вы можете использовать 'readelf -a libembree | grep cl', чтобы увидеть, какие функции CL определены внутри. – DarkZeros