OpenCL: не удалось найти clRetainDevice в dll

При использовании привязки AMD C++ и SDK (самого последнего) с запуском программы OpenCL, которая получает платформу, графический процессор, а затем компилирует 4 ядра, при запуске появляется указанная выше ошибка. Он отлично работает на моем компьютере, чей графический процессор поддерживает только версию до 1.1, но на других компьютерах, похоже, возникает вышеуказанная ошибка. Это проблема в компиляции (например, я должен определить некоторые макросы), в отсутствии драйвера, привязке к C++ или в чем-то еще? Я не вызываю clRetainDevice явно в своем собственном коде — это где-то часть привязки?


person Sky    schedule 17.03.2013    source источник
comment
clRetainDevice определен только в OpenCL 1.2. Вы перекомпилируете свою программу для других компьютеров? Я предполагаю, что в то время как привязки AMD C++, которые вы создаете, поддерживают OpenCL 1.2 (даже если ваше устройство не поддерживает), но среды выполнения на других компьютерах этого не делают. Тем не менее, если вы не используете clRetainDevice, этого не должно происходить, поэтому я предполагаю, что он вызывается внутри. Вы используете подустройства?   -  person Thomas    schedule 17.03.2013
comment
Я скопировал то, что скомпилировал, на другой компьютер и просто запустил. Я использую только такие вызовы, как getDevices() или Platform::get(), никаких причудливых подустройств... ›_›   -  person Sky    schedule 17.03.2013


Ответы (1)


Это происходит, когда вы используете заголовочный файл привязок C++ с заголовком OpenCL 1.2. Например, когда вы запускаете приложение, скомпилированное с помощью AMD SDK (OpenCL 1.2) на платформе NVIDIA (только OpenCL 1.1).

В качестве быстрого и грязного обходного пути вы можете просто отредактировать заголовок AMD SDK cl.h и символ препроцессора undef "CL_VERSION_1_2". Если вас не интересуют функции 1.2, это должно решить вашу проблему.

person Dade916    schedule 17.03.2013
comment
Проблема заключается в том, что компилятор выдает ошибки, связанные с функциями, связанными с изображением. Я действительно сбит с толку. ›_‹ - person Sky; 17.03.2013
comment
1.2 переработаны функции API изображений, поэтому, если вы не используете 1.2, вам следует, как было предложено, понизить заголовки до 1.1 и использовать правильную функцию (которая больше не clCreateImage, а clCreateImage2D, clCreateImage3D и т. д., это для привязок C, по крайней мере, я полагаю, что привязки C++ остаются совместимыми, но, по-видимому, нет. - person Thomas; 18.03.2013