forked from deepspeedai/DeepSpeed
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeepspeed_pin_tensor.cpp
More file actions
45 lines (34 loc) · 1.21 KB
/
deepspeed_pin_tensor.cpp
File metadata and controls
45 lines (34 loc) · 1.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Copyright (c) Microsoft Corporation.
// SPDX-License-Identifier: Apache-2.0
// DeepSpeed Team
/*
Functionality for managing CPU tensors occupying page-locked memory.
*/
#include "deepspeed_pin_tensor.h"
using namespace std;
deepspeed_pin_tensor_t::~deepspeed_pin_tensor_t()
{
for (auto iter = _locked_tensors.begin(); iter != _locked_tensors.end(); ++iter) {
munlock(iter->first, iter->second);
}
_locked_tensors.clear();
}
torch::Tensor deepspeed_pin_tensor_t::alloc(const size_t num_elem, const at::ScalarType& elem_type)
{
const auto num_bytes = num_elem * elementSize(elem_type);
auto pinned_buffer = ds_page_aligned_alloc(num_bytes, true);
assert(nullptr != pinned_buffer);
_locked_tensors[pinned_buffer] = num_bytes;
auto options = torch::TensorOptions().dtype(elem_type).device(torch::kCPU);
return at::from_blob(pinned_buffer, static_cast<long int>(num_bytes), options);
}
bool deepspeed_pin_tensor_t::free(torch::Tensor& locked_tensor)
{
auto addr = locked_tensor.data_ptr();
if (_locked_tensors.find(addr) != _locked_tensors.end()) {
munlock(addr, _locked_tensors[addr]);
_locked_tensors.erase(addr);
return true;
}
return false;
}