![](/img/trans.png)
[英]In CUDA9, is “cudaMemcpyAsync()” both a device and a host function?
[英]About cudaMemcpyAsync Function
我有一些問題。
最近我正在使用 CUDA 制作一個程序。
在我的程序中,Host 上有一個用 std::map(string, vector(int)) 編程的大數據。
通過使用這些數據,一些向量(int)被復制到 GPU 全局內存並在 GPU 上處理
處理后,在 GPU 上生成一些結果,並將這些結果復制到 CPU。
這些都是我的節目表。
但我想減少處理時間。
所以我決定在我的程序中使用 cudaMemcpyAsync 函數。
在搜索了一些文檔和網頁后,我意識到要使用 cudaMemcpyAsync 函數主機內存,其中有數據要復制到 GPU 全局內存必須分配為固定內存。
但是我的程序正在使用std::map,所以我不能把這個std::map數據放到固定內存中。
所以我沒有使用這個,而是創建了一個緩沖區數組類型的固定內存,這個緩沖區總是可以處理復制向量的所有情況。
最后,我的程序是這樣工作的。
我的程序變得比以前的情況快得多。
但問題(我的好奇心)就在這一點上。
我試圖以類似的方式制作另一個程序。
這種方法比上面討論的方法快了大約 10%。
但我不知道為什么。
我認為 cudaMemcpyAsync 只能與內核函數重疊。
但我的情況我認為不是。 而不是看起來可以在 cudaMemcpyAsync 函數之間重疊。
對不起我的長問題,但我真的很想知道為什么。
有人可以教我或向我解釋什么是確切的設施“cudaMemcpyAsync”以及哪些功能可以與“cudaMemcpyAsync”重疊?
cudaMemcpyAsync 的復制活動(以及內核活動)可以與任何主機代碼重疊。 此外,與設備之間的數據復制(通過 cudaMemcpyAsync)可以與內核活動重疊。 所有 3 個活動:主機活動、數據復制活動和內核活動,可以相互異步完成,並且可以相互重疊。
正如您所看到和演示的,主機活動和數據復制或內核活動可以以相對簡單的方式相互重疊:內核啟動立即返回到主機,cudaMemcpyAsync 也是如此。 然而,為了獲得數據復制和內核活動之間的最佳重疊機會,有必要使用一些額外的概念。 為了獲得最佳重疊機會,我們需要:
當然,您的工作也需要以可分離的方式分解。 這通常意味着如果您的內核正在執行特定功能,您可能需要多次調用此內核,以便每次調用都可以處理單獨的數據。 例如,這允許我們在第一次內核調用處理數據塊 A 時將數據塊 B 復制到設備。 這樣我們就有機會將數據塊 B 的副本與數據塊 A 的內核處理重疊。
與 cudaMemcpyAsync(與 cudaMemcpy 相比)的主要區別在於:
第 1 項是必要的功能,以便數據副本可以與內核計算重疊。 第 2 項是一項必要功能,以便數據復制可以與主機活動重疊。
盡管復制/計算重疊的概念非常簡單,但在實踐中實現需要一些工作。 如需其他參考資料,請參閱:
請注意,上面的一些討論是基於具有 2.0 或更高計算能力的設備(例如並發內核)。 此外,不同的設備可能有一個或兩個復制引擎,這意味着同時復制到設備和從設備復制只能在某些設備上進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.