Пример Hello World дает простое приложение, которое печатает имя вычислительного устройства по умолчанию в системе.
Класс<boost::compute::system>обеспечивает доступ к платформам и устройствам OpenCL, присутствующим в хост-системе.
Компьютерные устройства представлены классом<device>.
#include<iostream>#include<boost/compute/core.hpp>namespacecompute=boost::compute;intmain(){// get the default devicecompute::devicedevice=compute::system::default_device();// print the device's namestd::cout<<"hello from "<<device.name()<<std::endl;return0;}
Прежде чем произойдет какое-либо вычисление, данные должны быть переданы от хоста к вычислительному устройству. Общая функция<copy()>обеспечивает простой интерфейс для передачи данных, а общий класс<vector<T>>обеспечивает контейнер для хранения данных на вычислительном устройстве.
Следующий пример показывает, как передавать данные из массива на хосте в<vector<T>>на устройстве, а затем обратно в отдельный<std::vector<T>>на хосте. В конце примера оба<host_array>и<host_vector>содержат одинаковые значения, которые были скопированы через память на вычислительном устройстве.
#include<vector>#include<boost/compute/algorithm/copy.hpp>#include<boost/compute/container/vector.hpp>namespacecompute=boost::compute;intmain(){// get default device and setup contextcompute::devicedevice=compute::system::default_device();compute::contextcontext(device);compute::command_queuequeue(context,device);// create data array on hostinthost_data[]={1,3,5,7,9};// create vector on devicecompute::vector<int>device_vector(5,context);// copy from host to devicecompute::copy(host_data,host_data+5,device_vector.begin(),queue);// create vector on hoststd::vector<int>host_vector(5);// copy data back to hostcompute::copy(device_vector.begin(),device_vector.end(),host_vector.begin(),queue);return0;}
Следующий пример показывает, как вычислить квадратный корень вектора<float>s на вычислительном устройстве с помощью функции<transform()>.
#include<vector>#include<algorithm>#include<boost/compute/algorithm/transform.hpp>#include<boost/compute/container/vector.hpp>#include<boost/compute/functional/math.hpp>namespacecompute=boost::compute;intmain(){// get default device and setup contextcompute::devicedevice=compute::system::default_device();compute::contextcontext(device);compute::command_queuequeue(context,device);// generate random data on the hoststd::vector<float>host_vector(10000);std::generate(host_vector.begin(),host_vector.end(),rand);// create a vector on the devicecompute::vector<float>device_vector(host_vector.size(),context);// transfer data from the host to the devicecompute::copy(host_vector.begin(),host_vector.end(),device_vector.begin(),queue);// calculate the square-root of each element in-placecompute::transform(device_vector.begin(),device_vector.end(),device_vector.begin(),compute::sqrt<float>(),queue);// copy values back to the hostcompute::copy(device_vector.begin(),device_vector.end(),host_vector.begin(),queue);return0;}
Статья Tutorial раздела Chapter 1. Boost.Compute Chapter 1. Boost.Compute может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.