Можно ли скомпилировать код OpenCL в обычные двоичные файлы без OpenCL?

Я оцениваю OpenCL для своих целей. Мне пришло в голову, что вы не можете предположить, что он работает «из коробки» ни на Windows, ни на Mac, потому что:

  • Windows нужен драйвер OpenCL (который, конечно, можно установить)
  • MacOS поддерживает OpenCL только в MacOS >= 10.6

Поэтому мне пришлось бы кодировать код FPU/SSE/AVX и OpenCL отдельно, чтобы создать два двоичных файла: один без и один с поддержкой OpenCL.

Было бы намного лучше, если бы я мог скомпилировать OpenCL в время компиляции в SSE/AVX, а затем отправить двоичный файл без OpenCL. Таким образом, мне не понадобится отдельная реализация для FPU/SSE/AVX!

Есть ли способ сделать это?

Ура, - Клеменс


person clemens    schedule 09.01.2012    source источник


Ответы (1)


Один из способов добиться этого — установить Intel OpenCL SDK на свой компьютер для разработки и использовать содержащийся в нем инструмент OpenCL Offline Compiler для создания кода сборки для вашего ядра OpenCL и напрямую скомпилировать/связать этот код сборки с вашим приложением. Однако может потребоваться некоторая работа, чтобы выяснить правильные соглашения о вызовах и т. д., чтобы вызвать сгенерированный код сборки вручную, и тогда вы сами будете нести ответственность за разделение своей работы на несколько потоков.

Поэтому, хотя это не то, о чем вы просили, по крайней мере, в Windows, вероятно, было бы проще отправить ваше приложение с intelocl.dll и его зависимостями (если это разрешено лицензией; я не проверял), динамически загружать запись функции OpenCL точки оттуда, компилируйте ядро ​​OpenCL в сборку на лету и выполняйте его, используя среду выполнения OpenCL.

person sschuberth    schedule 09.01.2012
comment
Хм, это звучит слишком сложно... Я думал о том, чтобы просто заменить функции OpenCL-библиотеки собственным C/C++-кодом... - person clemens; 09.01.2012
comment
Повторная реализация реализации OpenCL поставщика, даже частично и без включенного компилятора, вероятно, потребует много работы. Я думаю, вам было бы лучше просто перераспределить среду выполнения OpenCL, от которой вы зависите, аналогично тому, что я предложил выше. - person sschuberth; 09.01.2012
comment
mh, не уверен, но код openCL выглядит C-совместимым для меня, так что с небольшой магией препроцессора...? Я до сих пор не понимаю, насколько большой проблемой будет, если вы ограничите его однопоточным скалярным кодом... нет?! - person clemens; 11.01.2012
comment
OpenCL имеет довольно много (векторных) типов данных и ключевых слов, которых нет в C/C++. Однако, если вы делаете (довольно большое) ограничение, что достаточно однопоточного кода, ваш вопрос сводится к созданию SIMD-кода из языка высокого уровня. В этом случае используйте хороший компилятор с автовекторизацией (например, Intel Compiler) или библиотеку, например IPP, которая поставляется с оптимальными путями кода для разных процессоров для своих алгоритмов. - person sschuberth; 11.01.2012