2011-05-20 82 views
10

我有非常相似的代碼的東西:CUDA流不重疊

int k, no_streams = 4; 
cudaStream_t stream[no_streams]; 
for(k = 0; k < no_streams; k++) cudaStreamCreate(&stream[k]); 

cudaMalloc(&g_in, size1*no_streams); 
cudaMalloc(&g_out, size2*no_streams); 

for (k = 0; k < no_streams; k++) 
    cudaMemcpyAsync(g_in+k*size1/sizeof(float), h_ptr_in[k], size1, cudaMemcpyHostToDevice, stream[k]); 

for (k = 0; k < no_streams; k++) 
    mykernel<<<dimGrid, dimBlock, 0, stream[k]>>>(g_in+k*size1/sizeof(float), g_out+k*size2/sizeof(float)); 

for (k = 0; k < no_streams; k++) 
    cudaMemcpyAsync(h_ptr_out[k], g_out+k*size2/sizeof(float), size2, cudaMemcpyDeviceToHost, stream[k]); 

cudaThreadSynchronize(); 

cudaFree(g_in); 
cudaFree(g_out); 

「h_ptr_in」和「h_ptr_out」與cudaMallocHost分配的指針(無標誌)的陣列。

問題是流不重疊。 在可視化剖析器中,我可以看到第一個流的內核執行與第二個流的副本(H2D)重疊,但沒有其他重疊。

我可能沒有資源來運行2個內核(我想我會這樣做),但至少內核執行和副本應該重疊,對不對? 如果我把所有3(複製H2D,內核執行,複製D2H)在同一個for循環中,它們都不會重疊...

請幫助,這是什麼原因造成的?

我上運行:

的Ubuntu 10.04 64

設備 「的GeForce GTX 460」 (CUDA驅動程序版本:3.20, CUDA運行時版本:3.20, CUDA能力主要/次要版本數量:2.1, 併發拷貝和執行:是的, 同時內核執行:是)

+0

在某些情況下,CUDA中的分析機制會導致流內的序列化。您不能使用分析器來判斷異步API操作的重疊。 – talonmies 2011-05-20 10:29:43

+0

謝謝。有沒有其他方法可以確定重疊是否正確?從時間上看,它似乎並不是...... – pmcr 2011-05-20 10:36:50

+0

你打算如何計時? – talonmies 2011-05-20 11:10:03

回答

7

根據this post在NVIDIA論壇,剖析會序列STREA以獲得準確的時間數據。如果您認爲您的時間都關閉,請確保您正在使用CUDA事件......

我一直在嘗試流最近,我發現了「simpleMultiCopy」從SDK例子是真正特別是在適當的邏輯和同步時很有幫助。

3

如果您希望看到內核與內核(併發內核)重疊,則需要使用CUDA 5.0 Toolkit附帶的CUDA Visual Profiler 5.0。我不認爲以前的配置文件能夠做到這一點。它也應該顯示內核和memcpy重疊。

+0

是否真的有可能直接觀察與Visual Profiler 5.0重疊的流?如果是這樣,怎麼樣?我目前正在使用命令行分析器並將生成的.csv文件導入配置器,請參閱[NVIDIA重疊流發佈](https://devtalk.nvidia.com/default/topic/545476/cuda-programming-和性能/ CUDA的流性能/)。 – JackOLantern 2013-06-06 10:42:53