【CUDA开发】Thrust库
生活随笔
收集整理的這篇文章主要介紹了
【CUDA开发】Thrust库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Thrust庫從C++的STL中得到靈感,將最簡單的類似于STL的結構放在Thrust庫中,比如STL中的vector。此外,Thrust庫還包含STL中的算法和迭代器。
????????Thrust函數庫提供了兩個向量容器,分別為主機和設備提供了向量類并且分別駐留在主機和設備的全局內存中。向量可以使用數組下標進行讀取或者修改。然而,如果向量在設備上,那么對于每個這樣的訪問,Thrust通過PCI-E總線在后臺執(zhí)行單獨的傳輸,因此,將這樣一個結構放在循環(huán)里不是一個好的主意。
????????Thrust提供了大量的函數類型集合,包括:轉換(transformation),規(guī)約(reduction),前綴求和(prefix?sum),再排序(reordering),排序(sorting)。Thrust并不是傳統意義上的函數庫,因為它的所有內容都在所包含的頭文件中。因此,要避免包含所有的文件。只要包含需要的頭文件就行了。
????????通過如下代碼,我們可以創(chuàng)建對應的host_vector和device_vector向量對象:
C/C++ code ?
????????從代碼中可以看出,聲明一個host_vector和device_vector是很容易的,只要添上對應的頭文件,并加上命名空間就可以了。Thrust的vector同C++?STL標準庫中vector類似,可以動態(tài)改變大小。其它的一些操作可以參看官方文檔。
????????一旦數據在Thrust設備向量或主機向量容器中,我們就可以使用大量Thrust提供的標準函數。比如,Thrust提供了一個簡單的排序函數,該函數只需要提供向量開頭和結尾的索引。它把任務分配到不同的線程塊上并且執(zhí)行任何規(guī)約和線程間的通信操作。下面舉個排序函數的例子:
C/C++ code ?
????????Thrust函數庫提供了兩個向量容器,分別為主機和設備提供了向量類并且分別駐留在主機和設備的全局內存中。向量可以使用數組下標進行讀取或者修改。然而,如果向量在設備上,那么對于每個這樣的訪問,Thrust通過PCI-E總線在后臺執(zhí)行單獨的傳輸,因此,將這樣一個結構放在循環(huán)里不是一個好的主意。
????????Thrust提供了大量的函數類型集合,包括:轉換(transformation),規(guī)約(reduction),前綴求和(prefix?sum),再排序(reordering),排序(sorting)。Thrust并不是傳統意義上的函數庫,因為它的所有內容都在所包含的頭文件中。因此,要避免包含所有的文件。只要包含需要的頭文件就行了。
????????通過如下代碼,我們可以創(chuàng)建對應的host_vector和device_vector向量對象:
C/C++ code ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #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;? ????}? |
????????從代碼中可以看出,聲明一個host_vector和device_vector是很容易的,只要添上對應的頭文件,并加上命名空間就可以了。Thrust的vector同C++?STL標準庫中vector類似,可以動態(tài)改變大小。其它的一些操作可以參看官方文檔。
????????一旦數據在Thrust設備向量或主機向量容器中,我們就可以使用大量Thrust提供的標準函數。比如,Thrust提供了一個簡單的排序函數,該函數只需要提供向量開頭和結尾的索引。它把任務分配到不同的線程塊上并且執(zhí)行任何規(guī)約和線程間的通信操作。下面舉個排序函數的例子:
C/C++ code ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include?<thrust/host_vector.h> #include?<thrust/device_vector.h> #include?<thrust/generate.h> #include?<thrust/sort.h> #include?<thrust/copy.h> #include?<cstdlib> #define?NUM_ELEM?(1024?*?1024) int?main(void) { ????thrust::host_vector<int>?host_array(NUM_ELEM); ????thrust::generate(host_array.begin(),?host_array.end(),?rand); ????thrust::device_vector<int>?device_array?=?host_array; ????thrust::sort(device_array.begin(),?device_array.end()); ????thrust::sort(host_array.begin(),?host_array.end()); ????thrust::host_vector<int>?host_array_sorted?=?device_array; ????return?0; } |
轉載于:https://www.cnblogs.com/huty/p/8517917.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【CUDA开发】Thrust库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Docker搭建RabbitMQ(多
- 下一篇: jedate选中日期后关闭弹层_jeDa