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