我有一個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)
您使用的是什麼操作系統,驅動程序和GPU。如果這是Windows Vista/7/8,您是否啓用了TCC模式? – talonmies
我在使用CUDA 5和驅動程序的Ubuntu 12.04上使用GTX Titan 310.40 – Namux