На этом шаге мы рассмотрим векторы.
В библиотеке Thrust содержатся два вектора контейнера host_vector и device_vector. Как можно понять из названия, host_vector хранится в памяти компьютера, в то время как device_vector хранится в памяти GPU устройства. Векторы host_vector и device_vector могут хранить данные любого типа. Так же, векторы host_vector и device_vector могут быть изменены динамически.
Приведем ниже исходный код программ, которые иллюстрируют использование данных векторов библиотеки Thrust.
#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 */
Текст приложения можно взять здесь.
#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 */
Текст приложения можно взять здесь.
На следующем шаге мы рассмотрим основные алгоритмы.