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

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

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

Также в Thrust FAQ указано, что

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

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

41

Решение

Я разработчик VexCL, но мне очень нравится то, что Кайл Лутц, автор Boost.Compute, должен был сказать на ту же тему Увеличьте список рассылки. Короче говоря, с точки зрения пользователя осевая нагрузка, Boost.Compute, AMD’s болт и, вероятно, Microsoft C ++ AMP все реализуют STL-подобный API, тогда как VexCL — это библиотека на основе шаблонов выражений, которая ближе к собственный в природе. Я считаю, что основным отличием STL-подобных библиотек является их переносимость:

  1. Thrust поддерживает только графические процессоры NVIDIA, но также может работать на процессорах через свои OpenMP и TBB-серверы.
  2. Bolt использует расширения AMD для OpenCL, которые доступны только на графических процессорах AMD. Он также предоставляет Microsoft C ++ AMP и бэкэнды Intel TBB.
  3. Единственным компилятором, который поддерживает Microsoft C ++ AMP, является Microsoft Visual C ++ (хотя работа над Внедрение C ++ AMP за пределы Windows в настоящее время делается).
  4. 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 поддерживают в некоторой степени пользовательские функции и даже лямбды.

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

65

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]