Пожалуйста, представьте вопрос на трекере проблем GitHub по адресуhttps://github.com/boostorg/compute/issues.
Список рассылки по адресуhttps://groups.google.com/forum/#!forum/boost-compute.
Поддерживается любое устройство, которое реализует стандарт OpenCL. Это включает в себя графические процессоры от NVIDIA, AMD и Intel, а также процессоры от AMD и Intel и другие ускорители, такие как Xeon Phi.
Thrust реализует C++ STL-подобный API для GPU и CPU. Он построен с несколькими бэкэндами. NVIDIA GPU используют CUDA backend, а многоядерные CPU могут использовать Intel TBB или OpenMP backends. Однако тяга не будет работать с видеокартами AMD или другими менее известными ускорителями. Я чувствую себя лучше. Вычисления превосходны тем, что они используют нейтральную для поставщиков библиотеку OpenCL для обеспечения портативности всех типов вычислительных устройств.
Bolt - это специальная обертка AMD C++ вокруг API OpenCL, которая расширяет язык OpenCL на основе C99 для поддержки функций C++ (в первую очередь шаблонов). Он похож на библиотеку Thrust от NVIDIA и имеет тот же сбой, отсутствие переносимости.
VexCL - это библиотека линейной алгебры на основе экспрессии-темплы для OpenCL. Цели и объем немного отличаются от библиотеки Boost Compute. VexCL ближе по своей природе к библиотеке Эйгена. Компьютер ближе к стандартной библиотеке C++. Я не чувствую этого роста. Вычисления выполняют ту же роль, что и VexCL. Фактически, последние версии VexCL позволяют использовать Boost. Вычислите как один из бэкэндов, что делает взаимодействие между двумя библиотеками легким.
Also see this StackOverflow question: http://stackoverflow.com/questions/20154179/differences-between-vexcl-thrust-and-boost-compute
Невозможно обеспечить тот же API, который Thrust ожидает для OpenCL. Основная причина заключается в том, что функции/функторы, передаваемые алгоритмам Thrust, являются фактическими компилируемыми функциями C++, тогда как для Boost. Вычислите эти объекты выражения формы, которые затем переводятся в код C99, который затем компилируется для OpenCL.
CUDA и OpenCL — это две совершенно разные технологии. OpenCL работает путем компиляции кода C99 во время выполнения для генерации объектов ядра, которые затем могут быть выполнены на GPU. CUDA, с другой стороны, работает, компилируя свои ядра с помощью специального компилятора (nvcc), который затем производит двоичные файлы, которые могут выполняться на GPU.
OpenCL уже имеет несколько реализаций, которые позволяют использовать его на различных платформах (например, графические процессоры NVIDIA, процессоры Intel и т. Д.). Я чувствую, что это добавляет еще один уровень абстракции. Вычисления только усложняют и раздувают библиотеку.
К сожалению, нет. OpenCL полагается на наличие исходного кода C99, доступного во время выполнения, чтобы выполнять код на GPU. Таким образом, скомпилированные функции C++ или лямбды C++11 не могут быть просто переданы в среду OpenCL для выполнения на GPU.
Именно по этой причине я и написала книгу. Вычислите библиотеку лямбда. В основном он принимает выражения лямбда C++ (например, _1 * sqrt(_1) + 4) и преобразует их в фрагменты исходного кода C99 (например, & #8220; input[i] * sqrt(input[i]) + 4) & #8221;), которые затем передаются на Boost. Вычислите алгоритмы в стиле STL для выполнения. Хотя он не идеален, он позволяет пользователю писать код ближе к C++, который все еще может быть выполнен через OpenCL.
Также ознакомьтесь с макросом BOOST_COMPUTE_FUNCTION() Функции OpenCL определяются в соответствии с кодом C++. Пример можно найти в примере monte_carlo.
Очереди команд определяют контекст и устройство для выполнения алгоритма. Для всех стандартных алгоритмов параметр Command_queue является необязательным. Если не предусмотрено, для устройства GPU по умолчанию будет создана командная строка по умолчанию, и алгоритм будет выполняться там.
Это можно легко скомпилировать с помощью общего алгоритма boost::compute::copy() вместе со std::ostream_iterator< T>Например:
std::cout << "vector: [ ";
boost::compute::copy(
vector.begin(), vector.end(),
std::ostream_iterator<int>(std::cout, ", "),
queue
);
std::cout << "]" << std::endl;
Нулевая копия памяти позволяет Ядра OpenCL напрямую работают на областях памяти хоста (при поддержке платформы).
Повышаю. Компьютер поддерживает память с нулевой копией несколькими способами. Низкоуровневый интерфейс обеспечивается выделением<buffer
>объектов с флагом<CL_MEM_USE_HOST_PTR
>. Интерфейс высокого уровня обеспечивается классом<mapped_view<T>
>, который обеспечивает интерфейс типа std::vector в область памяти хоста и может использоваться непосредственно со всем Boost. Вычислить алгоритмы.
Низкоуровневый буст. Вычислительные API предлагают те же гарантии безопасности потоков, что и реализация библиотеки OpenCL. Однако высокоуровневые API используют несколько глобальных статических объектов для таких функций, как автоматическое кэширование программ, что делает их по умолчанию небезопасными для потоков.
Для составления Boost. Вычислить в безвредном режиме определяют<BOOST_COMPUTE_THREAD_SAFE
>перед включением любого из Boost. Вычислите заголовки. По умолчанию для этого потребуется связать ваше приложение / библиотеку с Boost. Библиотека ниток.
Повышаю. Компьютер используется рядом библиотек и приложений с открытым исходным кодом, включая:
- [ORIG_END] -->
- [ORIG_END] -->
- [ORIG_END] -->
- [ORIG_END] -->
Если вы используете Boost. Вычислите в своем проекте и хотите, чтобы он был указан здесь, пожалуйста, отправьте электронное письмо Кайлу Лутцу (kyle.r.lutz@gmail.com).
Мы активно ищем дополнительных разработчиков C++ с опытом работы в GPGPU и параллельных вычислениях.
Пожалуйста, отправьте электронное письмо Кайлу Лутцу (kyle.r.lutz@gmail.com) для получения дополнительной информации.
Также смотрите руководствои проверьте список вопросов по адресу:https://github.com/boostorg/compute/issues.