0

データの大きな配列 (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) に対してもうまく機能することに注意してください。

4

2 に答える 2