2011-05-05 101 views
2

我總是讀到它分配和傳輸數據到CPU的速度很慢。這是因爲cudaMalloc速度慢嗎?是因爲cudaMemcpy速度慢嗎?或者它是否因爲它們都很慢?Cuda cudaMemcpy和cudaMalloc

回答

3

它主要與2件事有關,第一件事開始卡和CPU之間的PCIExpress總線的速度。另一個與這些功能的運作方式有關。現在,我認爲新的CUDA 4可以更好地支持內存分配(標準或固定)以及通過總線透明訪問內存的方式。

現在,讓我們面對它,在某些時候,您需要從點A到點B的數據來計算一些東西。最好的處理方式是要麼進行非常大的計算,要麼使用CUDA流來重疊GPU上的傳輸和計算。

3

在大多數應用程序中,您應該在開始時執行一次cudaMalloc,然後不再調用它。因此,瓶頸真的是cudaMemcpy。

這是由於物理限制。對於一個標準的PCI-E 2.0 x16鏈路,你可以得到8GB/s的理論值,但實際上通常爲5-6GB/s。比較這個w /甚至是一箇中等範圍的Fermi,就像GTX460那個設備上有80 + GB/s的帶寬。實際上,內存帶寬的命中率達到了一個數量級,因此您的數據傳輸時間也相應增加。

GPGPU應該是超級計算機,我相信Seymour Cray(超級計算機傢伙)說,「一臺超級計算機將計算受限的問題轉化爲I/O約束問題」。因此,優化數據傳輸就是一切。

根據我個人的經驗,迭代算法是通過移植到GPGPU(2-3個數量級)顯示最佳改進的算法,因爲您可以通過將所有內容保持在原位來消除傳輸時間GPU。

+0

在我的情況下是相反的......我做一個cudaMemcpy和很多cudaMalloc .... – Lora 2011-05-05 14:18:37

+0

你能談談更多關於你的應用程序嗎?你只是保留許多轉換的副本? – peakxu 2011-05-05 15:06:21

+0

以及在我的情況下,我有一個輸入...但我無法檢測到我需要分配多少內存來解決這個輸入。因此我做了一個輸入的副本....並在需要時分配全局內存。換句話說,當前一個內存已滿時,我分配新的內存。 (請注意,我將需要所有分配的內存來計算完整的結果...) – scatman 2011-05-06 07:40:05