Различия между VexCL, Thrust и Boost.Compute
При простом понимании этих библиотек они выглядят очень похожими. Я знаю, что VexCL и Boost.Compute используют OpenCl в качестве бэкэнда (хотя VexCL версии 1.0 также поддерживает CUDA в качестве бэкэнда), а Thrust использует CUDA. Помимо разных бэкэндов, в чем разница между ними.
В частности, к какому проблемному пространству они относятся и почему я хотел бы использовать одно поверх другого.
Также в Thrust FAQ указано, что
Основным препятствием для поддержки OpenCL является отсутствие компилятора OpenCL и среды выполнения с поддержкой шаблонов C++.
Если это так, то как возможно, что VexCL и Boost.Compute даже существуют.
1 ответ
Я разработчик VexCL, но мне действительно нравится то, что Kyle Lutz, автор Boost.Compute, должен был сказать на ту же тему в списке рассылки Boost. Короче говоря, с точки зрения пользователя, Thrust, Boost.Compute, AMD Bolt и, вероятно, Microsoft C++ AMP реализуют STL-подобный API, а VexCL - это библиотека на основе шаблонов выражений, которая по своей природе ближе к Eigen. Я считаю, что основным отличием STL-подобных библиотек является их переносимость:
- Thrust поддерживает только графические процессоры NVIDIA, но также может работать на процессорах через свои OpenMP и TBB-серверы.
- Bolt использует расширения AMD для OpenCL, которые доступны только на графических процессорах AMD. Он также предоставляет Microsoft C++ AMP и Intel TBB.
- Единственным компилятором, который поддерживает Microsoft C++ AMP, является Microsoft Visual C++ (хотя работа над Bringing C++AMP Beyond Windows уже ведется).
- Boost.Compute, похоже, является наиболее переносимым решением, поскольку оно основано на стандартном OpenCL.
Опять же, все эти библиотеки пытаются реализовать STL-подобный интерфейс, поэтому они имеют очень широкое применение. VexCL был разработан с учетом научных вычислений. Если бы Boost.Compute был разработан немного раньше, я бы, вероятно, основал VexCL поверх него:). Другой библиотекой для научных вычислений, на которую стоит обратить внимание, является ViennaCL, бесплатная библиотека линейной алгебры с открытым исходным кодом для вычислений на многоядерных архитектурах (GPU, MIC) и многоядерных процессорах. Взгляните на [1] для сравнения VexCL, ViennaCL, CMTL4 и Thrust для этой области.
Что касается заявленной неспособности разработчиков Thrust добавить бэкэнд OpenCL: Thrust, VexCL и Boost.Compute (я не знаком с внутренностями других библиотек), все используют методы метапрограммирования, чтобы делать то, что они делают. Но поскольку CUDA поддерживает шаблоны C++, работа разработчиков Thrust, вероятно, немного проще: им приходится писать метапрограммы, которые генерируют программы CUDA с помощью компилятора C++. Авторы VexCL и Boost.Compute пишут метапрограммы, которые генерируют программы, генерирующие исходный код OpenCL. Взгляните на слайды, где я пытался объяснить, как реализован VexCL. Поэтому я согласен с тем, что нынешний дизайн Thrust запрещает им добавлять бэкэнд OpenCL.
[1] Денис Демидов, Карстен Анерт, Карл Рупп, Питер Готшлинг, Программирование CUDA и OpenCL: тематическое исследование с использованием современных библиотек C++, SIAM J. Sci. Comput., 35(5), C453–C472. ( версия arXiv также доступна).
Обновление: @gnzlbg отметил, что в библиотеках на основе OpenCL нет поддержки функторов C++ и лямбда-выражений. И действительно, OpenCL основан на C99 и скомпилирован из источников, хранящихся в строках во время выполнения, поэтому нет простого способа полностью взаимодействовать с классами C++. Но, честно говоря, библиотеки на основе OpenCL поддерживают в некоторой степени пользовательские функции и даже лямбды.
- Boost.Compute предоставляет собственную реализацию простых лямбд (на основе Boost.Proto) и позволяет взаимодействовать с определяемыми пользователем структурами с помощью макросов BOOST_COMPUTE_ADAPT_STRUCT и BOOST_COMPUTE_CLOSURE.
- VexCL предоставляет DSL, подобный линейной алгебре (также основанный на Boost.Proto), а также поддерживает преобразование универсальных алгоритмов и функторов C++ (и даже лямбда-выражений Boost.Phoenix) в функции OpenCL (с ограничениями).
- Я считаю, что AMD Bolt поддерживает определяемые пользователем функторы с помощью C++ для магии расширения OpenCL.
Сказав это, библиотеки на основе CUDA (и могут быть C++ AMP) имеют очевидное преимущество от фактического компилятора времени компиляции (вы можете даже так сказать?), Поэтому интеграция с пользовательским кодом может быть намного более тесной.