Можно ли запустить кусок чистого кода C++ в графическом процессоре

Я не очень хорошо знаю OpenCL, но я знаю, что C/C++ API требует, чтобы программист предоставил код OpenCL в виде строки. Но недавно я обнаружил библиотеку ArrayFire, которая не требует строкового кода для вызова некоторых вычислений. Мне было интересно, как это работает (это с открытым исходным кодом, но код немного сбивает с толку). Можно ли написать параллель для бэкэнда OpenCL, который вызывает любой фрагмент скомпилированного (например, x86) кода, например:

template <typename F>
void parallel_for(int starts, int ends, F task) //API
{ /*some OpenCL magic */ }
//...
parallel_for(0, 255, [&tab](int i){ tab[i] *= 0.7; } ); //using

PS: я знаю, что я на 99% слишком оптимистичен


person jaskmar    schedule 28.12.2016    source источник
comment
github.com/arrayfire/arrayfire — исходный код находится в свободном доступе. Почему бы просто не прочитать?   -  person talonmies    schedule 28.12.2016
comment
OpenCL 2.2 поддерживает ядра, написанные на подмножестве C++14. (без виртуальных функций, добавления/удаления, исключений и т.д.)   -  person tmlen    schedule 29.12.2016


Ответы (1)


Вы не можете вызвать код хоста C++ с устройства, используя стандартный OpenCL. Вы можете использовать SYCL, стандарт Khronos для программирования на C++ с одним исходным кодом. SYCL позволяет компилировать C++ непосредственно в код устройства, не требуя строк OpenCL. Вы можете вызвать любую функцию C++ из ядра SYCL (если доступен исходный код). SYCL.tech содержит дополнительные ссылки и обновленную информацию.

person Ruyk    schedule 29.12.2016