Подтвердить что ты не робот

Различия между VexCL, Thrust и Boost.Compute

С просто беглым пониманием этих библиотек они выглядят очень похожими. Я знаю, что VexCL и Boost.Compute используют OpenCl в качестве бэкэнд (хотя версия V1.0 VexCL также поддерживает CUDA в качестве бэкэнд), а Thrust использует CUDA. Помимо разных бэкендов, какая разница между ними.

В частности, какое пространство проблем они адресуют и почему я хочу использовать один над другим.

Кроме того, в FAQ Thrust указано, что

Основным препятствием для поддержки OpenCL является отсутствие компилятора OpenCL и среды выполнения с поддержкой шаблонов С++

Если это так, то как возможно, что VexCL и Boost.Compute даже существуют.

4b9b3361

Ответ 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.

Сказав, что библиотеки на основе CUDA (и могут быть С++ AMP) имеют очевидное преимущество реального компилятора времени компиляции (можете ли вы даже сказать это?), поэтому интеграция с пользовательским кодом может быть намного более жесткой.