データの大きな配列 (2.4G) をメモリにロードし、結果をホストに格納する計算を実行し (~1.5G)、初期データを解放し、結果をデバイスにロードし、その上で他の計算を実行する Thrust コードがあります。 、そして最後に初期データをリロードします。スラストコードは次のようになります。
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);
ただし、この時点で cudaMemGetInfo がそれを返しても、hostData を deviceData にコピーしようとすると、「thrust::system::detail::bad_alloc' what(): std::bad_alloc: out of memory」エラーが発生します ~デバイスの 6G の空きメモリ。free メソッドからの完全な出力は次のとおりです。
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
十分な空き容量があるにもかかわらず、デバイスのメモリが不足していることを示しているようです。Thrust ベクトルのメモリを解放する正しい方法ですか? また、コードは小さいサイズのデータ (最大 1.5G) に対してもうまく機能することに注意してください。