1. 程式人生 > 其它 >cuda 使用trust庫計算最值

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