当前位置: 首页 > 工具软件 > Thrust > 使用案例 >

CUDA thrust

廉子民
2023-12-01

thrust

Thrust是一个类似于STL的针对CUDA的C++模板库,能够使程序更简洁易读。Thrust提供与CUDA C完全兼容的接口,可以使我们高效地编写高性能并行程序。通过利用Thrust,程序员得以快速构建CUDA程序,并能够获得极高的稳定性和性能与精度,并行排序等例程的速度可提升5至100倍。

thrust :: sort_by_key

将keys 从小到大排序,同时按keys重排后的顺序排列values

#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 '}
 thrust::sort_by_key(dev_sortval, dev_sortval + num_vec, dev_sortidx, thrust::greater<float>());
 //sort_by_key:将dev_sortval的值排序,同时对应下标dev_sortidx也按dev_sortval重排后的顺序重排,num_vec排序元素的个数。
              

thrust::greater/less< float/int >( )

greater表示内置类型从大到小排序,less表示内置类型从小到大排序。
举两个例子

thrust :: stable_sort (A, A + N, thrust :: greater <int >());
thrust :: sort_by_key (keys , keys + N, values , thrust::greater<float>());

如无greater则默认从小到大排序

thrust::device_ptr < float> dev_sortval = thrust::device_pointer_cast(d_sortval)

*d_sortval = nullptr;//初始值是空指针,nullptr:空指针
使用thrust排序的时候,如果传入的指针是指向设备端内存的指针,那么在调用函数之前需要用thrust::device_ptr封装。
如需从device_ptr中提取“原始”指针需要使用raw_pointer_cast,使用如下

thrust::device_ptr<float> dev_sortval = thrust::device_pointer_cast(d_sortval);
thrust::device_ptr<int> dev_sortidx = thrust::device_pointer_cast(d_sortidx);

device_pointer_cast(d_sortval)是thrust库中的一个指针类型转换函数,可将thrust::raw指针转换为thrust::device_ptr指针,其作用与thrust::raw_pointer_cast(d_sortval)刚好相反。
经过类型转换,就可以很方便的使用thrust::sort等函数,而无需将其赋值给thrust::device_vector

thrust :: stable_sort

跟STL类似,sorting函数同样接受用户自定义对比操作。

#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}
 类似资料:

相关阅读

相关文章

相关问答