Обновленный ответ
Если настройка MAGICK_OCL_DEVICE
не имеет никакого эффекта и / или EnableOpenCl
возвращает false
, то ядра OpenCL не могут быть загружены на целевую платформу / устройство. Поведение ImageMagick - DelegateWarning
(не ошибка) и возврат к процессору.
Я подозреваю, что это так, и причины , почему записываются в файл с именем magick_badcl_build.log
, а фактический код OpenCL, который не удался, записывается в magick_badcl.cl
. Оба файла должны быть опубликованы на форумах для разработчиков для ознакомления.
Кроме того, переменная окружения должна быть MAGICK_OPENCL_CACHE_DIR
, а не IMAGEMAGICK_OPENCL_CACHE_DIR
. Я думаю, что документация неверна.
из opencl.c
home=GetEnvironmentValue("MAGICK_OPENCL_CACHE_DIR");
if (home == (char *) NULL)
{
home=GetEnvironmentValue("XDG_CACHE_HOME");
if (home == (char *) NULL)
home=GetEnvironmentValue("LOCALAPPDATA");
if (home == (char *) NULL)
home=GetEnvironmentValue("APPDATA");
if (home == (char *) NULL)
home=GetEnvironmentValue("USERPROFILE");
}
Оригинальный ответ
Используйте метод InitImageMagickOpenCL
для управления управлением устройством OpenCL, а не EnableOpenCl
(который автоматически выберет лучшее устройство, а лучшим устройством обычно является процессор).
cl_uint platformCount;
cl_platform_id platforms[4];
cl_uint deviceCount;
cl_device_id devices[8];
cl_device_id * user_selected_GPU = nullptr;
clGetPlatformIDs(4, platforms, &platformCount);
// Grap the first GPU off the first platform.
// !!! Check docs as this is a _very_ bad example. !!!
if (platformCount > 0) {
clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_GPU, 8, devices, &deviceCount);
if (deviceCount > 0) {
user_selected_GPU = devices[0];
}
}
if (user_selected_GPU) {
MagickCore::ExceptionInfo * exception = MagickCore::AcquireExceptionInfo();
MagickCore::InitImageMagickOpenCL(
MagickCore::MAGICK_OPENCL_DEVICE_SELECT_USER,
user_selected_GPU,
nullptr,
exception
);
} else {
// No GPU found...
}
Обычно вам не нужно беспокоиться о том, на каком устройстве работать, так как ImageMagick будет получать информацию о системе и среде. Например, на моем Mac процессор всегда будет выбран из пула устройств. Если я предпочитаю использовать GPU напрямую, я могу определить это во время выполнения с помощью переменных среды.
MAGICK_OCL_DEVICE=GPU ./my_opencl_enabled_magick_application