一、簡介
Thrust開源庫的簡介是“code at speed of light”。光速代碼的實現聽上去太過誇張,但是thrust在cuda硬件加速中確實有著無比強大的功能。
Thrust是並行算法和數據結構的基於GPU CUDA的C++庫。Thrust主要通過管理系統底層的功能比如memory access(內存獲取)和memory allocation(內存分配)來實現加速,使得工程師們在GPU編程的環境下能更focus在算法的設計上。
Thrust的最主要特征是實現了幾種數據結構和算法的高速並行計算(high performance heterogeneous parallel computing)。例如sort,reduce,scan等。
PS. 安裝CUDA tooltik的時候會自動將thrust的頭文件加入標准CUDA文件路徑。因此應用thrust庫並不需要額外安裝手續。
二、Vectors
vector是C++標准程序庫(STL)中的一個類。C++ STL中也有例如std::vector的vector容器(container)。Thrust中提供了兩種vector container:host_vector和device_vector。host_vector會存儲在host memory中而device_vector會存儲在GPU device memory中。
Ubuntu 12.04 下 CUDA 編程 http://www.linuxidc.com/linux/2014-06/103056.htm
Ubuntu 12.04 安裝 CUDA-5.5 http://www.linuxidc.com/Linux/2013-10/91101.htm
Ubuntu 11.10 上安裝CUDA開發環境 http://www.linuxidc.com/Linux/2012-04/58913.htm
Fedora 15系統下配置CUDA環境 http://www.linuxidc.com/Linux/2011-12/49874.htm
Ubuntu 11.04 安裝 NVIDIA CUDA 4.0 RC2 http://www.linuxidc.com/Linux/2011-10/46304.htm
Linux Mint 13/Ubuntu 12.04 配置CUDA 4.2 & OpenCV 2.4.2 方法 http://www.linuxidc.com/Linux/2013-10/91102.htm
CUDA入門教程 http://www.linuxidc.com/Linux/2014-07/104328.htm
以下來自NVIDIA CUDA官網的例子闡釋了如何使用vector containers:
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <iostream>
int main(void)
{
// H has storage for 4 integers
thrust::host_vector<int> H(4);
// initialize individual elements
H[0] = 14;
H[1] = 20;
H[2] = 38;
H[3] = 46;
// H.size() returns the size of vector H
std::cout << "H has size " << H.size() << std::endl;
// print contents of H
for(int i = 0; i < H.size(); i++)
std::cout << "H[" << i << "] = " << H[i] << std::endl;
// resize H
H.resize(2);
std::cout << "H now has size " << H.size() << std::endl;
// Copy host_vector H to device_vector D
thrust::device_vector<int> D = H;
// elements of D can be modified
D[0] = 99;
D[1] = 88;
// print contents of D
for(int i = 0; i < D.size(); i++)
std::cout << "D[" << i << "] = " << D[i] << std::endl;
// H and D are automatically deleted when the function returns
return 0;
}
三、算法
Thrust提供了很多的並行算法。例如thrust::sort。Thrust中的所有算法都會有host何device的版本。唯一例外的就是thrust::copy函數,它的所有iterator arguments都應該在同一個地方:要麼都在host上要麼都在device上。
以thrust::sort舉例說明:
對於一個數組進行排序,只需一個指令即可達成:
#include <thrust/sort.h>
...
const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
thrust::sort(A, A + N);
// A is now {1, 2, 4, 5, 7, 8}
此外thrust還非常神奇地提供thrust::sort_by_key以及thrust::stable_sort_by_key能直接sort key和value存在不同地方的key-value對。
#include <thrust/sort.h>
...
const int N = 6;
int keys[N] = { 1, 4, 2, 8, 5, 7};
char values[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::sort_by_key(keys, keys + N, values);
// keys is now { 1, 2, 4, 5, 7, 8}
// values is now {'a', 'c', 'b', 'e', 'f', 'd'}
正如C++標准程序庫中的sort一樣,thrust中的sort函數也能接受用戶自定義的運算符。例如我們在functional.h中定義比較大小的運算,然後使sort時按大小順序由大到小排列。
#include <thrust/sort.h>
#include <thrust/functional.h>
...
const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
thrust::stable_sort(A, A + N, thrust::greater<int>());
// A is now {8, 7, 5, 4, 2, 1}