• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2019 Huawei Technologies Co., Ltd
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef MINDSPORE_CCSRC_RUNTIME_DEVICE_GPU_GPU_DEVICE_MANAGER_H_
18 #define MINDSPORE_CCSRC_RUNTIME_DEVICE_GPU_GPU_DEVICE_MANAGER_H_
19 
20 #include <cudnn.h>
21 #include <cublas_v2.h>
22 #include <cusolverDn.h>
23 #include <cusparse.h>
24 #include <vector>
25 #include <set>
26 #include <memory>
27 #include "plugin/device/gpu/hal/device/cuda_driver.h"
28 #include "plugin/device/gpu/hal/device/gpu_memory_allocator.h"
29 
30 namespace mindspore {
31 namespace device {
32 namespace gpu {
33 class GPUDeviceManager {
34  public:
35   void InitDevice();
36   void ReleaseDevice();
37 
38   int device_count() const;
39   bool set_cur_device_id(uint32_t device_id);
40   uint32_t cur_device_id() const;
41   bool is_device_id_init() const;
42 
43   bool CreateStream(CudaDeviceStream *stream);
44   bool CreateStream(size_t *stream_id);
45   bool CreateStreamWithPriority(size_t *stream_id, int32_t priority);
46   bool DestroyStream(size_t stream_id);
47   CudaDeviceStream GetStream(size_t stream_id) const;
48   size_t QueryStreamSize() const;
49   std::vector<uint32_t> GetStreamIds() const;
50   void set_current_stream(size_t stream_id);
51   size_t current_stream() const;
52   bool QueryStream(size_t stream_id);
53   bool SyncStream(size_t stream_id) const;
54   bool SyncStream(const CudaDeviceStream &stream) const;
55   bool SyncAllStreams() const;
56   bool SyncNotDefaultStreams() const;
57   // Sync all streams except the streams in except_streams.
58   bool SyncExceptStreamsInList(const std::set<CudaDeviceStream> &except_streams) const;
59   const CudaDeviceStream &default_stream() const;
60   size_t default_stream_id() const;
61 
62   const cudnnHandle_t &GetCudnnHandle() const;
63   const cublasHandle_t &GetCublasHandle() const;
64   const cusolverDnHandle_t &GetCusolverDnHandle() const;
65   const cusparseHandle_t &GetCuSparseHandle() const;
66 
67   bool CopyDeviceMemToHost(const HostMemPtr &dst, const DeviceMemPtr &src, size_t size) const;
68   bool CopyHostMemToDevice(const DeviceMemPtr &dst, const void *src, size_t size) const;
69 
70   bool CopyDeviceMemToHostAsync(const HostMemPtr &dst, const void *src, size_t size, CudaDeviceStream stream) const;
71   bool CopyHostMemToDeviceAsync(const DeviceMemPtr &dst, const void *src, size_t size, CudaDeviceStream stream) const;
72   bool CopyDeviceMemToDeviceAsync(const DeviceMemPtr &dst, const void *src, size_t size, CudaDeviceStream stream) const;
73   bool CopyHostMemToHost(const HostMemPtr &dst, const void *src, size_t size) const;
74 
75   static GPUDeviceManager &GetInstance();
single_op_multi_stream_enable()76   bool single_op_multi_stream_enable() const { return single_op_multi_stream_enable_; }
set_single_op_multi_stream_enable(bool single_op_multi_stream_enable)77   void set_single_op_multi_stream_enable(bool single_op_multi_stream_enable) {
78     single_op_multi_stream_enable_ = single_op_multi_stream_enable;
79   }
80 
81  private:
GPUDeviceManager()82   GPUDeviceManager() : dev_id_init_(false), cur_dev_id_(0), dev_alive_(false) {}
83   ~GPUDeviceManager() = default;
84   GPUDeviceManager(const GPUDeviceManager &) = delete;
85   GPUDeviceManager &operator=(const GPUDeviceManager &) = delete;
86 
87   // Ensure the thread safety for creating and destroying stream.
88   std::mutex stream_mutex_;
89 
90   // default CUDA stream used for all the kernels.
91   CudaDeviceStream default_stream_{nullptr};
92 
93   size_t default_stream_id_{0};
94 
95   size_t current_stream_id_{0};
96 
97   // all gpu CUDA streams including default_stream_.
98   std::vector<CudaDeviceStream> gpu_streams_;
99 
100   // handle used for cuDNN kernels.
101   cudnnHandle_t cudnn_handle_{nullptr};
102 
103   // handle used for cuBLAS kernels.
104   cublasHandle_t cublas_handle_{nullptr};
105 
106   // handle used for cusolver dn kernels;
107   cusolverDnHandle_t cusolver_dn_handle_{nullptr};
108 
109   // handle used for cusparse kernels;
110   cusparseHandle_t cusparse_handle_{nullptr};
111   bool dev_id_init_;
112   uint32_t cur_dev_id_;
113   bool dev_alive_;
114   bool single_op_multi_stream_enable_{false};
115 };
116 }  // namespace gpu
117 }  // namespace device
118 }  // namespace mindspore
119 
120 #endif  // MINDSPORE_CCSRC_RUNTIME_DEVICE_GPU_GPU_DEVICE_MANAGER_H_
121