我有非常相似的代碼的東西: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, 併發拷貝和執行:是的, 同時內核執行:是)
在某些情況下,CUDA中的分析機制會導致流內的序列化。您不能使用分析器來判斷異步API操作的重疊。 – talonmies 2011-05-20 10:29:43
謝謝。有沒有其他方法可以確定重疊是否正確?從時間上看,它似乎並不是...... – pmcr 2011-05-20 10:36:50
你打算如何計時? – talonmies 2011-05-20 11:10:03