Не удается скомпилировать приложение OpenCL с использованием заголовков 1.2 в версии 1.1
Я пишу небольшую программу Hello world OpenCL, используяcl.ГЭС для OpenCL 1.2 и библиотек openCL от nVidia. Драйверы и ICD у меня есть поддержка OpenCL 1.1. Поскольку сторона nVidia еще не поддерживает 1.2, я получаю некоторые ошибки в функциях, необходимых для OpenCL 1.2.
С другой стороны, cl.ГЭС для OpenCL 1.2 имеет флаг, CL_VERSION_1_1
чтобы быть точным, чтобы запустить заголовок в режиме 1.1, но он не работает. Кто-нибудь имеет подобный опыт или решение?
Примечание: cl.ГЭС для версии 1.1 работает, но генерирует много предупреждений во время компиляции. Вот почему я пытаюсь использовать версию 1.2.
5 ответов
к сожалению, NVIDIA распространяет старую версию OpenCL ICD (библиотека, которая отправляет вызовы API соответствующему драйверу). Ваши лучшие варианты либо
- получить более актуальную версию ICD (если вы используете Linux, это libOpenCL.Итак,и вы можете найти более новую копию в AMD APP SDK). Недостатком является то, что если вы распространяете скомпилированный код, он также потребует 1.2 ICD.
- используйте заголовочные файлы OpenCL 1.1, за исключением вы можете использовать последнюю версию cl.ТЭЦ. Он должен (теоретически) обнаружить, что он сочетается с заголовками OpenCL 1.1 и отключить весь код OpenCL 1.2 (который, однако, не тестируется). Преимущество использования последнего cl.hpp заключается в том, что есть много исправлений ошибок, которые не возвращаются к версии 1.1 cl.ТЭЦ.
-
вы можете сделать это:
#include <CL/cl.h> #undef CL_VERSION_1_2 #include <CL/cl.hpp>
Я только что реализовал это в своем коде, и, похоже, это делает трюк.
вы можете определить флаг CL_USE_DEPRECATED_OPENCL_1_1_APIS, который сделает файл 1.2 hpp 1.1 совместимым.
#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
Это то, что я сделал на NVIDIA и AMD. Работает как шарм
мне надоело загружать несколько GB OpenCL SDK от Intel, Nvidia и AMD с различными проблемами:
- Intel требует регистрации и имеет временную лицензию.
- NVIDIA SDK не поддерживает OpenCL 2.0, и вам нужно загрузить cl.во всяком случае, ГЭС.
- AMDs
cl.hpp
файл определяет min и max макросы, которые могут конфликтовать с макросами min и max MSVC (я трачу слишком много времени, выясняя, как это исправить, например,NOMINMAX
). Заголовок даже не то же самое, что определено Хроносом (у которого нет проблемы min/max).
поэтому я загрузил исходный код и включает в себя из Хроноса, как это предлагается этим так что ответ и составил сам. Включает в себя и OpenCL.файлы lib-это пара МБ. Это намного меньше, чем все дополнительные вещи в Intel/Nvidia/AMD SDKs! Я могу включить OpenCL включает и OpenCL.lib файлы в моем проекте и больше не должны говорить другие для загрузки SDK.
включает в себя для OpenCL 2.0 от реестра Хронос имеет новый файл привязки c++cl2.hpp
. Глядя на этот файл, я определил, что правильный способ поддержки устаревших функций с OpenCL 2.0-это что-то вроде этого.
#define CL_HPP_MINIMUM_OPENCL_VERSION 110
#define CL_HPP_TARGET_OPENCL_VERSION 120
#define CL_HPP_CL_1_2_DEFAULT_BUILD
#include "CL/cl2.hpp"
это потому, что cl2.файл HPP имеет этот код
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 100 && !defined(CL_USE_DEPRECATED_OPENCL_1_0_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_0_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 110 && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_1_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 120 && !defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS)
# define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#endif
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 200 && !defined(CL_USE_DEPRECATED_OPENCL_2_0_APIS)
# define CL_USE_DEPRECATED_OPENCL_2_0_APIS
#endif
обратите внимание, что вам больше не нужно (и не должно) включать <CL/opencl.h>
больше.
наконец, после #include "CL/cl2.hpp"
для того, чтобы мой код работал с Ускорение/Расчета мне пришлось добавить
#undef CL_VERSION_2_0
мой собственный код OpenCL работает без этого, но Boost / Compute этого не делает. похоже, я не единственный, у кого есть эта проблема. Мой GPU не поддерживает OpenCL 2.0.
похоже, единственный способ-использовать заголовки OpenCL 1.1 при работе с устройствами с поддержкой 1.1.
вы можете вызвать может установить параметры clBuildProgram следующим образом
const char options[] = "-cl-std=CL1.1";
clBuildProgram( program, 1, &devices, options, NULL, NULL );
это заставляет компилятор использовать OpenCL 1.1 независимо от того, какая версия поддерживается вашим устройством