Шаг 22.
Технология CUDA.
Библиотека Thrust. Векторы

    На этом шаге мы рассмотрим векторы.

    В библиотеке Thrust содержатся два вектора контейнера host_vector и device_vector. Как можно понять из названия, host_vector хранится в памяти компьютера, в то время как device_vector хранится в памяти GPU устройства. Векторы host_vector и device_vector могут хранить данные любого типа. Так же, векторы host_vector и device_vector могут быть изменены динамически.

    Приведем ниже исходный код программ, которые иллюстрируют использование данных векторов библиотеки Thrust.


Пример 1. Здесь мы рассмотрим использование некоторых стандартных операций.
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <iostream>

int main(){
 //Создаем в памяти компьютера вектор из 4 целочисленных элементов
 thrust::host_vector<int> H(4);

 //Заполняем вектор произвольными числами
 H[0] = 14; H[1] = 20; H[2] = 38; H[3] = 46;

 //Выводим на экран текущий размер вектора
 std::cout << "H has size " << H.size() << std::endl;

 //Выводим содержимое вектора
 for(int i = 0; i < H.size(); i++)
  std::cout << "H[" << i << "] = " << H[i] << std::endl;

 //Изменяем размер нашего вектора
 H.resize(2);

 //Выводим на экран текущий размер вектора
 std::cout << "H now has size " << H.size() << std::endl;

 //Создаем в памяти видеокарты вектор и копируем в него элементы вектора H
 thrust::device_vector<int> D = H;

 //Изменяем содержимое вектора
 D[0] = 99; D[1] = 88;

 //Выводим на экран содержимое вектора
 for(int i = 0; i < D.size(); i++)
  std::cout << "D[" << i << "] = " << D[i] << std::endl;

 return 0;
}

/*
 Результат выполнения программы:
 H has size 4
 H[0] = 14
 H[1] = 20
 H[2] = 38
 H[3] = 46
 H now has size 2
 D[0] = 99
 D[1] = 88
*/

    Текст приложения можно взять здесь.


Пример 2. Еще одна программа с использованием стандартных операций над векторами.
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#include <thrust/fill.h>
#include <thrust/sequence.h>
#include <iostream>

int main(){
 //Создаем в памяти видеократы вектор, состоящий из 10 единиц
 thrust::device_vector<int> D(10, 1);

 //Изменяем первые 7 элементов на значение 9
 thrust::fill(D.begin(), D.begin() + 7, 9);

 //Создаем вектор в памяти компьютера, 
 //заполняя его значениями первых 5 элементов вектора D
 thrust::host_vector<int> H(D.begin(), D.begin() + 5);

 //Заполняем вектор H значениями 0, 1, 2, 3, 4
 thrust::sequence(H.begin(), H.end());

 //Заменяем первые 5 элементов вектора D на элементы вектора H
 thrust::copy(H.begin(), H.end(), D.begin());

 //Выводим на экран содержимое вектора D
 for(int i = 0; i < D.size(); i++)
  std::cout << "D[" << i << "] = " << D[i] << std::endl;

 return 0;
}

/*
 Результат выполнения программы:
 D[0] = 0
 D[1] = 1
 D[2] = 2
 D[3] = 3
 D[4] = 4
 D[5] = 9
 D[6] = 9
 D[7] = 1
 D[8] = 1
 D[9] = 1
*/

    Текст приложения можно взять здесь.

    На следующем шаге мы рассмотрим основные алгоритмы.




Предыдущий шаг Содержание Следующий шаг