2012-12-09 65 views
0

我想了解CUDA流,我已經做了我的第一個程序與流慢,但它是比通常的內核函數慢...CUDA流比平時內核

這是爲什麼代碼慢

cudaMemcpyAsync(pole_dev, pole, size, cudaMemcpyHostToDevice, stream_1);  
addKernel<<<count/100, 100, 0, stream_1>>>(pole_dev); 
cudaMemcpyAsync(pole, pole_dev, size, cudaMemcpyDeviceToHost, stream_1); 
cudaThreadSynchronize(); // I don't know difference between cudaThreadSync and cudaDeviceSync 
cudaDeviceSynchronize(); // it acts relatively same... 

比:

cudaMemcpy(pole_dev, pole, size, cudaMemcpyHostToDevice); 
addKernel<<<count/100, 100>>>(pole_dev); 
cudaMemcpy(pole, pole_dev, size, cudaMemcpyDeviceToHost); 

我thounght它應該運行得更快...變量count的值是6 500 000(最大)... 第一源代碼需要14毫秒conds和第二個源代碼需要11毫秒。

有人可以向我解釋嗎?

+1

是什麼讓你覺得第一個應該比第二個更快? – talonmies

+0

另外,對於流,您可能需要cudaStreamSychronize(),但在這種情況下不會影響性能。 – talonmies

回答

2

在這個片段中,您只需處理單個流(stream_1),但實際上,CUDA在您不明確操作流時會自動爲您做。

要利用數據流和異步存儲器傳輸,您需要使用幾個數據流,並通過它們中的每一個來拆分數據和計算。

+0

所以你的意思是,在第一個memcpy函數中,我應該使用stream_1,在內核中使用stream_2,在第二個memcpy函數中使用stream_3? –

+1

@snukrabill:流不能加速這個操作。複製和內核執行之間沒有重疊的範圍,您必須在內核可以運行之前完成第一次複製,並且在內核完成之前您的第二個副本不能啓動。 – talonmies

+0

我認爲流可以將大數組劃分爲小塊,並且可以在這些塊上啓動內核...正如您所說,現在我需要等待,直到memcpy完成,但是我希望memcpy和內核同時運行。 ..所以這是不正確的方式? –