Как поток управления извлекается из ядра SYCL?

Использование SYCL для запуска кода на любом устройстве OpenCL не требует специального компилятора, так как все делается в библиотеке (полной магии шаблонов), и стандартный GCC/Clang прекрасно подойдет. Это правильно? (Особенно в случае с triSYCL, который я использую...)

Если так... Я знаю, что простые деревья выражений могут быть извлечены путем перегрузки группы операторов в пользовательских классах "handle" или "wrapper", но это не относится к потоку управления. Я ошибся?

В разделе 3.1 этой статьи обсуждаются плюсы и минусы нескольких различных подходов к добавлению EDSL в C++, но меня больше интересует фактическая техническая реализация метода, используемого SYCL.

Я пытался взглянуть на источник в некоторых проектах, связанных с SYCL (Eigen, TensorFlow, triSYCL, ComputeCpp и т. Д.), Но пока не смог найти в них ответа.

Итак: Как может библиотека SYCL (?) Обнаружить полный граф управления потоком ядра, заданный как обычная лямбда C++, без необходимости в специальном / расширенном компиляторе?

2 ответа

Решение

Я думаю, вы правы.

Если вы компилируете 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?"

Другие вопросы по тегам