我有一些問題。關於cudaMemcpyAsync功能
最近我正在通過使用CUDA製作程序。
在我的節目,有上的std ::地圖(字符串,向量(INT))編程主機一個大的數據。
通過使用這些DATAS一些矢量(INT)被複制到GPU的全局存儲器和GPU
處理之後,一些結果在GPU上產生,並且這些結果被複制到CPU處理。
這些都是我的節目時間表。
- cudaMemcpy(...,cudaMemcpyHostToDevice)
- 內核函數
- cudaMemcpy(內核函數只可在必要時數據被複制到GPU的全局存儲器完成)(...,cudaMemcpyDeviceToHost)
- 重複1〜3次1000次(另一個數據(矢量))
但我想減少處理時間。
所以我決定用cudaMemcpyAsync功能在我的計劃。
搜索一些文件和網頁後,我認識到,使用具有被複制到GPU的全局內存數據必須被分配爲固定內存cudaMemcpyAsync功能主機內存。
但我的程序正在使用的std ::地圖,所以我不能做這樣的std ::地圖數據固定內存。
因此而不是使用這個的,我做了一個緩衝器陣列類型的固定內存和該緩衝區可以隨時處理複製向量的所有情況。
最後,我的程序像這樣工作。
- 的memcpy(從複製的std ::地圖數據使用循環緩衝,直到整個數據被複制到緩衝器)只有
- cudaMemcpyAsync(...,cudaMemcpyHostToDevice)
- 內核(內核函數可被執行時整個數據被複制到GPU全局存儲器)
- cudaMemcpyAsync(...,cudaMemcpyDeviceToHost)
- 重複1〜1000次4steps(爲另一數據(矢量))
而且我的程序變得比以前的案例快得多。
但問題(我的好奇心)是在這一點上。
我試圖以類似的方式製作另一個程序。
- 的memcpy(從標準::地圖拷貝數據僅緩衝用於一個向量)
- cudaMemcpyAsync(...,cudaMemcpyHostToDevice)
- 循環1〜2,直到整個數據被複制到GPU全局存儲器
- 內核(核函數僅可以在必要時數據被複制到GPU全局存儲器)
- cudaMemcpyAsync(執行...,cudaMemcpyDeviceToHost )
- 重複1〜5個步驟1000倍(對於另一個數據(矢量))
此方法出來爲比上面討論的方法快約10%。
但我不知道爲什麼。
我認爲cudaMemcpyAsync只能與內核函數重疊。
但我的情況我認爲不是。而不是它看起來可以重疊在cudaMemcpyAsync函數之間。
對不起,我很長的問題,但我真的想知道爲什麼。
有人可以教或向我解釋什麼是確切的設施「cudaMemcpyAsync」和什麼功能可以與「cudaMemcpyAsync」重疊?
首先讓我們知道你在哪個SDK工作以及什麼卡(Tesla,Fermi,Kepler),因爲不同的架構有不同的asyncCopy/kernel overlaping –