簡體   English   中英

關於 cudaMemcpyAsync 函數

[英]About cudaMemcpyAsync Function

我有一些問題。

最近我正在使用 CUDA 制作一個程序。

在我的程序中,Host 上有一個用 std::map(string, vector(int)) 編程的大數據。

通過使用這些數據,一些向量(int)被復制到 GPU 全局內存並在 GPU 上處理

處理后,在 GPU 上生成一些結果,並將這些結果復制到 CPU。

這些都是我的節目表。

  1. cudaMemcpy( ... , cudaMemcpyHostToDevice)
  2. 內核函數(內核函數只有在必要的數據被復制到 GPU 全局內存時才能完成)
  3. cudaMemcpy( ... , cudaMemcpyDeviceToHost)
  4. 重復 1~3 步 1000 次(對於另一個數據(向量))

但我想減少處理時間。

所以我決定在我的程序中使用 cudaMemcpyAsync 函數。

在搜索了一些文檔和網頁后,我意識到要使用 cudaMemcpyAsync 函數主機內存,其中有數據要復制到 GPU 全局內存必須分配為固定內存。

但是我的程序正在使用std::map,所以我不能把這個std::map數據放到固定內存中。

所以我沒有使用這個,而是創建了一個緩沖區數組類型的固定內存,這個緩沖區總是可以處理復制向量的所有情況。

最后,我的程序是這樣工作的。

  1. Memcpy(使用循環將數據從 std::map 復制到緩沖區,直到將整個數據復制到緩沖區)
  2. cudaMemcpyAsync( ... , cudaMemcpyHostToDevice)
  3. 內核(內核函數只有在將整個數據復制到 GPU 全局內存時才能執行)
  4. cudaMemcpyAsync( ... , cudaMemcpyDeviceToHost)
  5. 重復 1~4steps 1000 次(對於另一個數據(向量))

我的程序變得比以前的情況快得多。

但問題(我的好奇心)就在這一點上。

我試圖以類似的方式制作另一個程序。

  1. Memcpy(僅將數據從 std::map 復制到一個向量的緩沖區)
  2. cudaMemcpyAsync( ... , cudaMemcpyHostToDevice)
  3. 循環 1~2 直到整個數據復制到 GPU 全局內存
  4. 內核(內核函數只有在必要的數據被復制到 GPU 全局內存時才能執行)
  5. cudaMemcpyAsync( ... , cudaMemcpyDeviceToHost)
  6. 重復 1~5steps 1000 次(對於另一個數據(向量))

這種方法比上面討論的方法快了大約 10%。

但我不知道為什么。

我認為 cudaMemcpyAsync 只能與內核函數重疊。

但我的情況我認為不是。 而不是看起來可以在 cudaMemcpyAsync 函數之間重疊。

對不起我的長問題,但我真的很想知道為什么。

有人可以教我或向我解釋什么是確切的設施“cudaMemcpyAsync”以及哪些功能可以與“cudaMemcpyAsync”重疊?

cudaMemcpyAsync 的復制活動(以及內核活動)可以與任何主機代碼重疊。 此外,與設備之間的數據復制(通過 cudaMemcpyAsync)可以與內核活動重疊。 所有 3 個活動:主機活動、數據復制活動和內核活動,可以相互異步完成,並且可以相互重疊。

正如您所看到和演示的,主機活動和數據復制或內核活動可以以相對簡單的方式相互重疊:內核啟動立即返回到主機,cudaMemcpyAsync 也是如此。 然而,為了獲得數據復制和內核活動之間的最佳重疊機會,有必要使用一些額外的概念。 為了獲得最佳重疊機會,我們需要:

  1. 固定的主機內存緩沖區,例如通過 cudaHostAlloc()
  2. 使用 cuda 流來分離各種類型的活動(數據復制和內核計算)
  3. cudaMemcpyAsync 的使用(而不是 cudaMemcpy)

當然,您的工作也需要以可分離的方式分解。 這通常意味着如果您的內核正在執行特定功能,您可能需要多次調用此內核,以便每次調用都可以處理單獨的數據。 例如,這允許我們在第一次內核調用處理數據塊 A 時將數據塊 B 復制到設備。 這樣我們就有機會將數據塊 B 的副本與數據塊 A 的內核處理重疊。

與 cudaMemcpyAsync(與 cudaMemcpy 相比)的主要區別在於:

  1. 它可以在任何流中發出(它需要一個流參數)
  2. 通常,它會立即將控制權返回給主機(就像內核調用一樣),而不是等待數據復制完成。

第 1 項是必要的功能,以便數據副本可以與內核計算重疊。 第 2 項是一項必要功能,以便數據復制可以與主機活動重疊。

盡管復制/計算重疊的概念非常簡單,但在實踐中實現需要一些工作。 如需其他參考資料,請參閱:

  1. CUDA 最佳實踐指南的重疊復制/計算部分
  2. 顯示復制/計算重疊的基本實現的示例代碼。
  3. 顯示完整的多/並發內核復制/計算重疊場景的示例代碼。

請注意,上面的一些討論是基於具有 2.0 或更高計算能力的設備(例如並發內核)。 此外,不同的設備可能有一個或兩個復制引擎,這意味着同時復制到設備從設備復制只能在某些設備上進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM