Thrust庫從C++的STL中得到靈感,將最簡單的類似于STL的結構放在Thrust庫中,比如STL中的vector。此外,Thrust庫還包含STL中的算法和迭代器。
????????Thrust函數庫提供了兩個向量容器,分別為主機和設備提供了向量類并且分別駐留在主機和設備的全局內存中。向量可以使用數組下標進行讀取或者修改。然而,如果向量在設備上,那么對于每個這樣的訪問,Thrust通過PCI-E總線在后臺執行單獨的傳輸,因此,將這樣一個結構放在循環里不是一個好的主意。
????????Thrust提供了大量的函數類型集合,包括:轉換(transformation),規約(reduction),前綴求和(prefix?sum),再排序(reordering),排序(sorting)。Thrust并不是傳統意義上的函數庫,因為它的所有內容都在所包含的頭文件中。因此,要避免包含所有的文件。只要包含需要的頭文件就行了。
????????通過如下代碼,我們可以創建對應的host_vector和device_vector向量對象:
????????從代碼中可以看出,聲明一個host_vector和device_vector是很容易的,只要添上對應的頭文件,并加上命名空間就可以了。Thrust的vector同C++?STL標準庫中vector類似,可以動態改變大小。其它的一些操作可以參看官方文檔。
????????一旦數據在Thrust設備向量或主機向量容器中,我們就可以使用大量Thrust提供的標準函數。比如,Thrust提供了一個簡單的排序函數,該函數只需要提供向量開頭和結尾的索引。它把任務分配到不同的線程塊上并且執行任何規約和線程間的通信操作。下面舉個排序函數的例子:
????????Thrust函數庫提供了兩個向量容器,分別為主機和設備提供了向量類并且分別駐留在主機和設備的全局內存中。向量可以使用數組下標進行讀取或者修改。然而,如果向量在設備上,那么對于每個這樣的訪問,Thrust通過PCI-E總線在后臺執行單獨的傳輸,因此,將這樣一個結構放在循環里不是一個好的主意。
????????Thrust提供了大量的函數類型集合,包括:轉換(transformation),規約(reduction),前綴求和(prefix?sum),再排序(reordering),排序(sorting)。Thrust并不是傳統意義上的函數庫,因為它的所有內容都在所包含的頭文件中。因此,要避免包含所有的文件。只要包含需要的頭文件就行了。
????????通過如下代碼,我們可以創建對應的host_vector和device_vector向量對象:
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類似,可以動態改變大小。其它的一些操作可以參看官方文檔。
????????一旦數據在Thrust設備向量或主機向量容器中,我們就可以使用大量Thrust提供的標準函數。比如,Thrust提供了一個簡單的排序函數,該函數只需要提供向量開頭和結尾的索引。它把任務分配到不同的線程塊上并且執行任何規約和線程間的通信操作。下面舉個排序函數的例子:
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; } |