Использование SYCL для запуска кода на любом устройстве OpenCL не требует специального компилятора, так как все делается в библиотеке (полной магии шаблонов), и стандартный GCC / Clang прекрасно подойдет. Это правильно? (Особенно в случае с triSYCL, который я использую …)
Если так … Я знаю, что простые деревья выражений могут быть извлечены путем перегрузки группы операторов в пользовательских классах «handle» или «wrapper», но это не относится к потоку управления. Я ошибся?
Раздел 3.1 из Эта бумага обсуждаются плюсы и минусы нескольких разных подходов к добавлению EDSL в C ++, но меня больше интересует реальная техническая реализация метода, используемого SYCL.
Я пытался взглянуть на источник в некоторых проектах, связанных с SYCL (Eigen, TensorFlow, triSYCL, ComputeCpp и т. Д.), Но пока не смог найти в них ответа.
Итак: Как может библиотека SYCL (?) Обнаружить полный граф управления потоком ядра, заданный как обычная лямбда C ++, без необходимости в специальном / расширенном компиляторе?
Я думаю, вы правы.
Если вы компилируете SYCL для ЦП, поскольку SYCL — это чистый исполняемый DSEL на C ++, вы можете иметь реализацию, которая просто использует обычный компилятор C ++.
Так работает, например, triSYCL. https://github.com/triSYCL/triSYCL
Я не знаю подробностей о ComputeCpp. На https://github.com/triSYCL/triSYCL/blob/master/doc/about-sycl.rst есть ссылка об очень интересной, но старой презентации:
Реализация модели программирования OpenCL SYCL Shared Source C ++ с использованием
Clang / LLVM, Гордон Браун. 17 ноября 2014 г., семинар по LLVM
Компиляторная инфраструктура в HPC, SuperComputing 2014
http://www.codeplay.com/public/uploaded/publications/SC2014_LLVM_HPC.pdf
В случае, если triSYCL нацелен на устройство, также существует компилятор устройства. Я должен выдвинуть новую версию с документом дизайна … А пока вы можете посмотреть на https://github.com/triSYCL/triSYCL/tree/device https://github.com/triSYCL/llvm https://github.com/triSYCL/clang
sycl-gtx использует некоторые расширения синтаксиса SYCL, основанные на макросах, чтобы иметь мета-представление потока управления в ядре, как показано, например, в этом примере: https://github.com/ProGTX/sycl-gtx/blob/master/tests/regression/work_efficient_prefix_sum.cpp
И ответ таков: это не так, и я до сих пор не думаю, что это возможно.
Даже мое первое предположение было неверным.
Если все, что у вас есть, это обычный компилятор C ++, то любое ядро SYCL может быть выполнено только «программно», с помощью главного устройства (ЦП), выполняющего код «контроллера».
Чтобы перевести ядра в OpenCL (или SPIR-V) для выполнения на любом другом устройстве, необходим «расширенный» компилятор; или два компилятора, один для хоста и один для вычислительного устройства.
Хорошее объяснение можно найти здесь: https://www.codeplay.com/portal/introduction-to-sycl
Наиболее похожий раздел — «Как будет выглядеть рабочий процесс SYCL?»