2012-11-30 28 views
1

我有test.cu文件,它的編制與NVCC爲什麼我的CUDA程序的初始執行時間比後續執行時間更長?

void sort() 
{ 

thrust::host_vector<int> dat1(50); 
thrust::generate(dat1.begin(),dat1.end(),rand); 

for(int i=0; i<dat1.size(); i++) 
{ 
    std::cout << dat1[i] << std::endl; 
} 

thrust::device_vector<int> dev_vec1 = dat1; 


thrust::sort(dev_vec1.begin(),dev_vec1.end()); 
thrust::copy(dev_vec1.begin(),dev_vec1.end(),dat1.begin()); 

for(int i=0; i<dat1.size(); i++) 
{ 
    std::cout << dat1[i] << std::endl; 
} 

} 


#include "test.cuh" 


int main() 
{ 
    sort(); 
    return 0; 
} 

但對設備進行排序需要40秒。但是,當我運行它第二次它的工作速度快。 什麼問題?

+2

在linux系統上可能會有幫助的一件事是將GPU設置爲持久模式。 'nvidia-smi -g 0 -pm 1',你可以通過'nvidia-smi --help'獲得幫助。另一個影響因素可能是JIT編譯步驟,具體取決於您編譯代碼的方式。當你第一次啓動一個新的代碼時,它沒有針對GPU的實際二進制代碼,它必須執行最後的編譯步驟來創建它。這通常只發生一次,因爲它被緩存了。你可以通過使用適當的'-arch = sm_xx'開關進行編譯來避免這種情況,其中xx是GPU的計算能力 –

+0

「\t 你可以通過發出一個適當的-arch = sm_xx開關進行編譯來避免這種情況,其中xx是GPU的計算能力「 如何做到這一點? – Alatriste

+0

你有什麼樣的GPU,以及你使用的nvcc編譯命令行是什麼? –

回答

1

最可能的原因是,在第一次運行期間,您的操作系統正在加載CUDA庫並在CUDA上下文實際初始化之前執行其他一些技術任務。在第二次運行時,所有內容都已經加載並且上下文速度更快。

+0

你可以通過使用合適的-arch = sm_xx開關進行編譯來避免這種情況,其中xx是GPU的計算能力。 如何做到這一點? – Alatriste