2013-07-26 157 views
0

我有一個Thrust代碼,它將大量數據(2.4G)加載到內存中,執行計算結果存儲在主機中(〜1.5G),然後釋放初始數據,加載結果進入設備,對其執行其他計算,並最終重新加載初始數據。推力代碼如下所示:CUDA推力內存分配問題

thrust::host_device<float> hostData; 
// here is a code which loads ~2.4G of data into hostData 
thrust::device_vector<float> deviceData = hostData; 
thrust::host_vector<float> hostResult; 
// here is a code which perform calculations on deviceData and copies the result to hostResult (~1.5G) 
free<thrust::device_vector<float> >(deviceData); 
thrust::device_vector<float> deviceResult = hostResult; 
// here is code which performs calculations on deviceResult and store some results also on the device 
free<thrust::device_vector<float> >(deviceResult); 
deviceData = hostData; 

用我的自由定義功能:

template<class T> void free(T &V) { 
    V.clear(); 
    V.shrink_to_fit(); 
    size_t mem_tot; 
    size_t mem_free; 
    cudaMemGetInfo(&mem_free, &mem_tot); 
    std::cout << "Free memory : " << mem_free << std::endl; 
} 

template void free<thrust::device_vector<int> >(thrust::device_vector<int>& V); 
template void free<thrust::device_vector<float> >(
    thrust::device_vector<float>& V); 

不過,我得到一個「推力::系統::詳細:: bad_alloc的」什麼():STD: :bad_alloc:內存不足「錯誤嘗試將hostData複製回deviceData時,即使cudaMemGetInfo在此時返回,我有約6G的可用內存的設備。下面是自由的方法輸出完整:

Free memory : 6295650304 
Free memory : 6063775744 
terminate called after throwing an instance of 'thrust::system::detail::bad_alloc' 
what(): std::bad_alloc: out of memory 

這似乎表明,該設備是內存不足,雖然有很多免費的。這是釋放推力矢量記憶的正確方法嗎?我還應該注意到,代碼適用於更小的數據量(最高1.5G)

+0

您使用的是什麼操作系統,驅動程序和GPU。如果這是Windows Vista/7/8,您是否啓用了TCC模式? – talonmies

+0

我在使用CUDA 5和驅動程序的Ubuntu 12.04上使用GTX Titan 310.40 – Namux

回答

2

查看完整的,可編輯的複製代碼將很有用。但是,您可能會遇到內存碎片。

即使大量的內存可能被報告爲空閒的,但它可能無法分配到一個大的連續塊中。然後,這種碎片將限制您可以請求的單個分配的最大大小。

這可能不是一個真正的問題,你如何釋放內存,而是釋放內存後,更多的開銷分配的功能。事實上,你正在檢查MEM信息,並獲得大量的回覆告訴我,你正在釋放你的分配正確。

要嘗試解決此問題,一種方法是仔細管理和重新使用您的分配。例如,如果設備上需要一個大型的2.4G工作設備矢量float,則分配一次,然後重複使用它進行連續操作。此外,如果您在嘗試重新分配2.4G矢量之前在設備上有任何剩餘分配,則嘗試在嘗試重新分配2.4G矢量之前嘗試釋放這些(即,釋放您在設備上進行的所有分配)向量。

+0

通過代碼重複使用2.4G矢量可以解決這個問題。謝謝! – Namux

1

我提供這個答案,因爲當我搜索同樣的錯誤消息/問題的答案時,我遇到了這個問題。

羅伯特Crovella的出色答卷當然是正確的,但是,它可能是有用的人知道,當創建/請求device_vector容量分配的device_vector遠遠大於尺寸要求device_vector更大。

此答案:Understanding Thrust (CUDA) memory usage,更詳細地解釋了爲什麼Thrust以這種方式表現。

在我的情況下,在Ubuntu 16.04上,Quadro K1200,CUDA工具包8.0,請求尺寸爲67108864(雙打)的device_vector產生了device_vector,分配容量爲8倍(536870912)。

Requested (R) | Capacity (C) | Total Mem | Free Mem | C/Free | R/C 
67108864  | 536870912  | 4238540800 | 3137077248 | 0.171137 | 0.125 

上面的輸出來自修改我鏈接到的答案中的一些非常有用的代碼。