thrust是NVIDIA推出的一个高性能的GPU版本并行开发库,thrust提供了丰富的算法和容器, 我们可以使用这些工具来简化我们的编程
thrust的库的API都是STL like的, 对于STL比较熟悉的人学习起来会比较简单, 当然thrust库提供了很多C++11和C++17 风格的接口,如果对于C++11 和 C++17 不熟悉的人学习起来还是有点吃力,推荐在学习thrust库前先把C++11 和 C++17的库学习下, thrust库提供的不过都是这些接口的并行版本
C++参考网页
thrust库虽然提供了高性能的接口,帮我们简化了很多代码,但是本质上还是依赖于CUDA的底层那套机制,无非是cudaMemcpy之类的, 所以在实际项目中,推荐还是要会这一套接口, 否则在使用的过程中, 但是很容易写出低效的版本
vector是thrust最基础也是最简单的容易,分为host_vector和device_vector
host_vector就是指在CPU和内存里面的数据
device_vector就是指GPU里面的数据
vector提供iterator进行遍历等操作, 所有thrust的容器都支持迭代器
#include
#include
#include
int main(void)
{
thrust::host_vector<int> H(4);
// 初始化host_vector
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;
// 将host的数据拷贝到device上面
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;
}
上面只是一个简单的示例, 可以看到基本跟我们使用STL的vector差不多, 但是内部实现不同
上面的图片是跑了示例后用Nsight查看的结果, 可以看到vector还是使用cudaMalloc和cudaMemcpyAsync来进行操作的, 所以在使用这些库之前,还是要先了解下这些函数
之前自己用CUDA传输数据的时候,都要用cudaMalloc和cudaMemcpy, cudaFree等一系列函数, 非常麻烦,使用vector后, 可以简化这些数据的传输
thrust::device_vector<int> D = H;
thrust::device_ptr<int> p = D.data();
D[0] = H[0];
D[1] = H[1];
这段代码如果在之前的STL是没问题的,数据量少的时候也没问题, 但是因为D是device_vecto, 开辟的是显存,H是host_vector, 开辟的是内存, 这里将会触发2次内存拷贝, 在数据量多的时候,效率会非常低, 非常不建议这样内存, 建议内存还是一次性拷贝好, 直接调用 = 就只会调用一次