При простом понимании этих библиотек они выглядят очень похожими. Я знаю, что VexCL и Boost.Compute используют OpenCl в качестве бэкэнда (хотя VexCL версии 1.0 также поддерживает CUDA в качестве бэкэнда), а Thrust использует CUDA. Помимо разных бэкэндов, в чем разница между ними.
В частности, к какому проблемному пространству они относятся и почему я хотел бы использовать одно поверх другого.
Также в Thrust FAQ указано, что
Основным препятствием для поддержки OpenCL является отсутствие компилятора OpenCL и среды выполнения с поддержкой шаблонов C ++.
Если это так, то как возможно, что VexCL и Boost.Compute даже существуют.
Я разработчик VexCL, но мне очень нравится то, что Кайл Лутц, автор Boost.Compute, должен был сказать на ту же тему Увеличьте список рассылки. Короче говоря, с точки зрения пользователя осевая нагрузка, Boost.Compute, AMD’s болт и, вероятно, Microsoft C ++ AMP все реализуют STL-подобный API, тогда как VexCL — это библиотека на основе шаблонов выражений, которая ближе к собственный в природе. Я считаю, что основным отличием STL-подобных библиотек является их переносимость:
Опять же, все эти библиотеки пытаются реализовать 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) имеют очевидное преимущество от фактического компилятора времени компиляции (вы можете даже так сказать?), Поэтому интеграция с пользовательским кодом может быть намного более тесной.
Других решений пока нет …