我正在學習cuda,到目前爲止我已經瞭解到cuda有爲全局對象分配內存的函數cudaMalloc()
。但是現在在一些矩陣乘法代碼中,我已經看到他們正在使用稱爲cudaMemcpy()
的另一個函數,它從主機到設備或其他方式複製一個對象。但我不明白爲什麼它需要?由於cudaMalloc()
正在分配全局內存,所有設備內核都應該有權訪問它,不是嗎?如果cudaMalloc()分配全局內存,那麼爲什麼我需要cudaMemcpy()?
我的誤解在哪裏?
我正在學習cuda,到目前爲止我已經瞭解到cuda有爲全局對象分配內存的函數cudaMalloc()
。但是現在在一些矩陣乘法代碼中,我已經看到他們正在使用稱爲cudaMemcpy()
的另一個函數,它從主機到設備或其他方式複製一個對象。但我不明白爲什麼它需要?由於cudaMalloc()
正在分配全局內存,所有設備內核都應該有權訪問它,不是嗎?如果cudaMalloc()分配全局內存,那麼爲什麼我需要cudaMemcpy()?
我的誤解在哪裏?
cudaMalloc()僅爲您提供一塊未定義初始值的GPU內存內存。您必須從主機或設備上的某個位置複製預期的內存內容。
查看this deck中的幻燈片10,11和12。他們說明了基本的處理流程。通常在內核調用之前出現的cudaMemcpy對應於幻燈片10中的活動。內核調用本身由幻燈片11表示。幻燈片12表示內核調用後發生的cudaMemcpy。 GPU cudaMalloc
與CPU malloc
類似 - 它只分配空間,但不填充任何數據。一旦使用cudaMalloc
在GPU上分配了空間,就需要使用cudaMemcpy
將數據複製到該空間。在這種情況下,「全局存儲器」是指設備上的存儲器,即在幻燈片10,11和12的右側。設備內核只能與設備上的數據一起工作,即已移至幻燈片10,11和12右側的DRAM上。
在CPU上運行的代碼只能訪問分配在其(主機)內存中的緩衝區,而GPU代碼(CUDA內核)只能訪問設備(GPU)內存中的內存。由於在矩陣乘法示例中初始化輸入矩陣的代碼在CPU上運行,因此它只能在主機內存中執行。然後它必須調用cudaMemcpy,以便將這些matricies複製到它在設備內存中分配的空間,因爲它不能直接在那裏寫入它。然後啓動CUDA內核,對設備內存中的設備進行處理,並將結果存儲在設備內存的另一個緩衝區中。 cudaMemcpy然後在內核完成後將結果從設備內存複製到主機內存中再次使用,以便主機代碼可以再次使用結果(例如,顯示或存儲結果)。
所有內存分配和複製只能從主機完成。
對於所有GPU活動,內存將被分配到設備(GPU)中,該設備應該從主機(CPU)啓動。
之後,主機的內存將被傳輸到設備(Memcpy)進行計算/處理。
然後在此之後,內核被調用來進行計算。
然後在設備中計算的結果通過Memcpy傳回主機。
malloc()在主機上分配動態內存,即在CPU上。 在設備上分配全局內存需要調用cudaMalloc()。 要使用GPU對數據進行操作,需要在全局內存上傳輸洞數據。 cudaMalloc()只分配內存,它不會將數據複製到設備內存中。因此,要將數據從主機內存複製到設備內存,您需要調用cudaMemcpy()。
下一次,請在提交之前考慮證明您的問題。通過這樣做,可以修復粗心的拼寫錯誤,並且可以大大提高可讀性。 – aLearner