Не удается скомпилировать приложение 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 независимо от того, какая версия поддерживается вашим устройством