cuda 使用trust库计算最值
Thrust是并行算法和数据结构的基于GPU CUDA的C++库,类似于C++标准库stl,cuda安装后自带。Trust用于求最值的函数为min_element和max_element,和stl名字一样;
我是偶然发现原来cuda还有一个这个库,在项目中,因为中间有一个过程需要最值的索引,原本我是把数据从显存中拷贝到主机,然后使用stl的标准库计算的,因为主机与设备之间的数据交换慢,速度不是很理想,本来想自己写核函数了,突然百度冒出来一个这个库,真是久旱逢甘霖啊;
以max_element为例,一种方法是使用容器:
thrust :: host_vector< float> h_vec(100); thrust :: generate(h_vec.begin(),h_vec.end(),rand); thrust :: device_vector< float> d_vec = h_vec; thrust :: device_vector< float> :: iterator iter = thrust :: max_element(d_vec.begin(),d_vec.end()); int position = iter - d_vec.begin(); float max_val = * iter; std :: cout<< 最大值是”< max_val<< at position”<<位置<< std :: endl;
但是容器有个麻烦事,在cuda计算中,核函数等不可能全部用容器当参数传入,如果求最值用容器,还得把指针所对应值压入容器中,数据小无多大关系,如果太大,又是一个消耗时间的事,这时可以用device_ptr:
假设有一个设备指针dev_ptr,长度为N:
thrust::device_ptr<float> d_ptr=thrust::device_pointer_cast<dev_ptr>; thrust::device_ptr<float> iter=thrust::max_element(d_ptr,d_ptr+N); float maxValue=*iter; int pos=iter-d_ptr;
这里主要用到了指针地址的概念,因为通过new,malloc等申请的地址为虚拟地址,虽然对应的物理地址不一定连续,但虚拟地址是一定连续的,这样通过地址相减,就可以得到索引值;
更多Trust的详情可以参考博客:https://blog.csdn.net/yychentracy/article/details/90729326
分类:
CUDA
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-03-30 QT -- 代码封装成库给C调用的问题