mxnet
io.h
Go to the documentation of this file.
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
26 #ifndef MSHADOW_IO_H_
27 #define MSHADOW_IO_H_
28 #include "./tensor.h"
29 
30 namespace mshadow {
31 namespace utils {
37 class IStream {
38  public:
45  virtual size_t Read(void *ptr, size_t size) = 0;
51  virtual void Write(const void *ptr, size_t size) = 0;
53  virtual ~IStream(void) {}
54 };
55 } // namespace utils
64 template<int dim, typename DType, typename TStream>
65 inline void SaveBinary(TStream &fo, const Tensor<cpu, dim, DType> &src); // NOLINT(*)
74 template<int dim, typename DType, typename TStream>
75 inline void SaveBinary(TStream &fo, const Tensor<gpu, dim, DType> &src); // NOLINT(*)
87 template<int dim, typename DType, typename TStream>
88 inline void LoadBinary(TStream &fi, // NOLINT(*)
89  Tensor<cpu, dim, DType> *dst, bool pre_alloc);
102 template<int dim, typename DType, typename TStream>
103 inline void LoadBinary(TStream &fi, // NOLINT(*)
104  Tensor<gpu, dim, DType> *dst, bool pre_alloc);
105 
106 // implementations
107 template<int dim, typename DType, typename TStream>
108 inline void SaveBinary(TStream &fo, const Tensor<cpu, dim, DType> &src_) { // NOLINT(*)
109  fo.Write(&src_.shape_, sizeof(src_.shape_));
110  Tensor<cpu, 2, DType> src = src_.FlatTo2D();
111  for (index_t i = 0; i < src.size(0); ++i) {
112  fo.Write(src[i].dptr_, sizeof(DType) * src.size(1));
113  }
114 }
115 template<int dim, typename DType, typename TStream>
116 inline void SaveBinary(TStream &fo, const Tensor<gpu, dim, DType> &src) { // NOLINT(*)
117  // copy to CPU, then save
119  AllocSpace(&tmp);
120  Stream<gpu> stream;
121  Copy(tmp, src, &stream);
122  SaveBinary(fo, tmp);
123  FreeSpace(&tmp);
124 }
125 template<int dim, typename DType, typename TStream>
126 inline void LoadBinary(TStream &fi, // NOLINT(*)
127  Tensor<cpu, dim, DType> *dst_, bool pre_alloc) {
128  Shape<dim> shape;
129  CHECK_NE(fi.Read(&shape, sizeof(shape)), 0) << "mshadow::LoadBinary";
130  if (pre_alloc) {
131  CHECK_EQ(shape, dst_->shape_) << "LoadBinary, shape do not match pre-allocated shape";
132  } else {
133  dst_->shape_ = shape; AllocSpace(dst_);
134  }
135  Tensor<cpu, 2, DType> dst = dst_->FlatTo2D();
136  if (dst.size(0) == 0) return;
137  for (index_t i = 0; i < dst.size(0); ++i) {
138  CHECK_NE(fi.Read(dst[i].dptr_, sizeof(DType) * dst.size(1)), 0) << "mshadow::LoadBinary";
139  }
140 }
141 template<int dim, typename DType, typename TStream>
142 inline void LoadBinary(TStream &fi, // NOLINT(*)
143  Tensor<gpu, dim, DType> *dst, bool pre_alloc) {
145  LoadBinary(fi, &tmp, false);
146  if (pre_alloc) {
147  CHECK_EQ(tmp.shape, dst->shape_) << "LoadBinary, shape do not match pre-allocated shape";
148  } else {
149  dst->shape = tmp.shape; AllocSpace(dst);
150  }
151  Stream<gpu> stream;
152  Copy(*dst, tmp, &stream);
153  FreeSpace(&tmp);
154 }
155 } // namespace mshadow
156 #endif // MSHADOW_IO_H_
void FreeSpace(Tensor< cpu, dim, DType > *obj)
CPU/GPU: free the space of tensor, will set obj.dptr to NULL.
Definition: tensor_cpu-inl.h:141
DType * dptr_
pointer to the data
Definition: tensor.h:435
virtual size_t Read(void *ptr, size_t size)=0
read data from stream
void LoadBinary(TStream &fi, Tensor< cpu, dim, DType > *dst, bool pre_alloc)
CPU/GPU: load a tensor by binary format, for GPU version, a temp Tensor<cpu,dim> storage will be allo...
Definition: io.h:126
void Copy(Tensor< cpu, dim, DType > dst, const Tensor< cpu, dim, DType > &src, Stream< cpu > *stream=NULL)
copy data from one tensor to another, with same shape
Definition: tensor_cpu-inl.h:146
Definition: stream_gpu-inl.h:38
Shape< dimension > shape_
shape of the tensor
Definition: tensor.h:437
header file of tensor data structure and functions This lib requires explicit memory allocation and d...
MSHADOW_XINLINE Tensor< Device, 2, DType > FlatTo2D(void) const
flatten the tensor to 2 dimension, collapse the higher dimensions together
Definition: tensor.h:520
int32_t index_t
type that will be used for index
Definition: base.h:336
void AllocSpace(Tensor< cpu, dim, DType > *obj, bool pad=MSHADOW_ALLOC_PAD)
CPU/CPU: allocate space for CTensor, according to the shape in the obj this function is responsible t...
Definition: tensor_cpu-inl.h:117
overloaded + operator between half_t and bf16_t
Definition: base.h:327
interface of stream I/O, used to serialize data, mshadow does not restricted to only this interface i...
Definition: io.h:37
MSHADOW_XINLINE index_t size(int idx) const
return size of i-th dimension, start counting from highest dimension
Definition: tensor.h:506
void SaveBinary(TStream &fo, const Tensor< cpu, dim, DType > &src)
CPU/GPU: save a tensor by binary format, for GPU version, a temp Tensor<cpu,dim> storage will be allo...
Definition: io.h:108
virtual ~IStream(void)
virtual destructor
Definition: io.h:53
general tensor
Definition: tensor.h:421
virtual void Write(const void *ptr, size_t size)=0
write data to stream