2016-07-05 64 views
0

我是CUDA的新手。我只是嘗試使用Thrust對數組進行排序。使用推力,CUDA緩慢排序

clock_t start_time = clock(); 

thrust::host_vector<int> h_vec(10); 
thrust::generate(h_vec.begin(), h_vec.end(), rand); 
thrust::device_vector<int> d_vec = h_vec; 

thrust::sort(d_vec.begin(), d_vec.end()); 
//thrust::sort(h_vec.begin(), h_vec.end()); 

clock_t stop_time = clock(); 
printf("%f\n", (double)(stop_time - start_time)/CLOCKS_PER_SEC); 

時間走上排序d_vec是7.4S和時間走上排序h_vec是0.4秒

我假設在設備內存的並行計算,所以它不應該是更快?

+2

最有可能您正在測量[上下文創建時間](http://stackoverflow.com/q/10415204/5085250)。另外,你不能指望在高度並行的體系結構上,* small *向量排序得更快。嘗試使用矢量大小>> 10000. – havogt

+0

是的,你是對的,這些時間是第一次執行。此外,我嘗試了50k點,我在主機和設備上的時間都是0.12s。當尺寸接近100000時差異變大。我可以假設使用h_vec進行排序在CPU上嗎? – Syed

+0

是的,對'h_vec'進行排序是在主機上完成的。也許你應該閱讀[推力快速入門指南](https://github.com/thrust/thrust/wiki/Quick-Start-Guide),其中討論推力算法的發佈。 –

回答

3

可能主要的問題是上下文創建時間:第一個CUDA調用將初始化需要一些時間的CUDA上下文,請參閱here。因此,您應該在第一次CUDA調用之後纔開始測量時間。

一般而言,如果並行度足夠高,您只能期望GPU代碼與CPU代碼相比加速。如示例代碼中的矢量大小10肯定太小而不能實現加速。使用矢量大小>> 10000時,您可以期望充分利用現代GPU。

您還應該考慮只測量沒有複製d_vec = h_vec的分揀時間,因爲您經常會在下一步中使用設備向量。然後您可以將複製操作視爲一次性安裝成本。 (但是,如果排序是設備上的唯一操作,那麼將memcopy包括在測量中當然是合理的)。