未验证 提交 a4024a5f 编写于 作者: D dzhwinter 提交者: GitHub

"remove cudnn devicecontext" (#7207)

* "remove cudnndevicecontext"

* "remove unused init code"

* "fix hash functions"
上级 cd5fad13
...@@ -48,8 +48,8 @@ Fluid uses class [DeviceContext](https://github.com/PaddlePaddle/Paddle/blob/dev ...@@ -48,8 +48,8 @@ Fluid uses class [DeviceContext](https://github.com/PaddlePaddle/Paddle/blob/dev
``` ```
/-> CPUDeviceContext --> MKLDeviceContext /-> CPUDeviceContext
DeviceContext ----> CUDADeviceContext --> CUDNNDeviceContext DeviceContext ----> CUDADeviceContext
\-> FPGADeviceContext \-> FPGADeviceContext
``` ```
...@@ -79,16 +79,6 @@ private: ...@@ -79,16 +79,6 @@ private:
}; };
``` ```
- CUDNNDeviceContext
```
class CUDNNDeviceContext : public CUDADeviceContext {
private:
cudnnHandle_t cudnn_handle_;
};
```
### Memory and Tensor ### Memory and Tensor
......
...@@ -13,6 +13,7 @@ See the License for the specific language governing permissions and ...@@ -13,6 +13,7 @@ See the License for the specific language governing permissions and
limitations under the License. */ limitations under the License. */
#pragma once #pragma once
#include <cctype>
namespace paddle { namespace paddle {
namespace framework { namespace framework {
...@@ -41,6 +42,9 @@ inline std::string LibraryTypeToString(const LibraryType& library_type) { ...@@ -41,6 +42,9 @@ inline std::string LibraryTypeToString(const LibraryType& library_type) {
inline LibraryType StringToLibraryType(const char* ctype) { inline LibraryType StringToLibraryType(const char* ctype) {
std::string s(ctype); std::string s(ctype);
for (size_t i = 0; i < s.size(); ++i) {
s[i] = toupper(s[i]);
}
if (s == std::string("PLAIN")) { if (s == std::string("PLAIN")) {
return LibraryType::kPlain; return LibraryType::kPlain;
} else if (s == std::string("MKLDNN")) { } else if (s == std::string("MKLDNN")) {
......
...@@ -26,13 +26,12 @@ namespace framework { ...@@ -26,13 +26,12 @@ namespace framework {
struct OpKernelType { struct OpKernelType {
struct Hash { struct Hash {
size_t operator()(const OpKernelType& key) const { size_t operator()(const OpKernelType& key) const {
int place = key.place_.which() + (1 << LEFT_SHIFT); int place = key.place_.which();
int data_type = int data_type = static_cast<int>(key.data_type_) << LEFT_SHIFT;
static_cast<int>(key.data_type_) + (1 << (LEFT_SHIFT + 1)); int data_layout = static_cast<int>(key.data_layout_) << (LEFT_SHIFT * 2);
int data_layout = int library_type = static_cast<int>(key.library_type_)
static_cast<int>(key.data_layout_) + (1 << (LEFT_SHIFT + 2)); << (LEFT_SHIFT * 3);
int library_type =
static_cast<int>(key.library_type_) + (1 << (LEFT_SHIFT + 3));
std::hash<int> hasher; std::hash<int> hasher;
return hasher(place + data_type + data_layout + library_type); return hasher(place + data_type + data_layout + library_type);
} }
......
...@@ -127,15 +127,21 @@ CUDADeviceContext::CUDADeviceContext(CUDAPlace place) : place_(place) { ...@@ -127,15 +127,21 @@ CUDADeviceContext::CUDADeviceContext(CUDAPlace place) : place_(place) {
eigen_device_.reset(new Eigen::GpuDevice(eigen_stream_.get())); eigen_device_.reset(new Eigen::GpuDevice(eigen_stream_.get()));
PADDLE_ENFORCE(dynload::cublasCreate(&cublas_handle_)); PADDLE_ENFORCE(dynload::cublasCreate(&cublas_handle_));
PADDLE_ENFORCE(dynload::cublasSetStream(cublas_handle_, stream_)); PADDLE_ENFORCE(dynload::cublasSetStream(cublas_handle_, stream_));
PADDLE_ENFORCE(dynload::cudnnCreate(&cudnn_handle_)); if (dynload::HasCUDNN()) {
PADDLE_ENFORCE(dynload::cudnnSetStream(cudnn_handle_, stream_)); PADDLE_ENFORCE(dynload::cudnnCreate(&cudnn_handle_));
PADDLE_ENFORCE(dynload::cudnnSetStream(cudnn_handle_, stream_));
} else {
cudnn_handle_ = nullptr;
}
} }
CUDADeviceContext::~CUDADeviceContext() { CUDADeviceContext::~CUDADeviceContext() {
SetDeviceId(place_.device); SetDeviceId(place_.device);
Wait(); Wait();
PADDLE_ENFORCE(dynload::cublasDestroy(cublas_handle_)); PADDLE_ENFORCE(dynload::cublasDestroy(cublas_handle_));
PADDLE_ENFORCE(dynload::cudnnDestroy(cudnn_handle_)); if (cudnn_handle_ != nullptr) {
PADDLE_ENFORCE(dynload::cudnnDestroy(cudnn_handle_));
}
eigen_stream_.reset(); eigen_stream_.reset();
eigen_device_.reset(); eigen_device_.reset();
PADDLE_ENFORCE(cudaStreamDestroy(stream_)); PADDLE_ENFORCE(cudaStreamDestroy(stream_));
...@@ -160,20 +166,6 @@ cudnnHandle_t CUDADeviceContext::cudnn_handle() const { return cudnn_handle_; } ...@@ -160,20 +166,6 @@ cudnnHandle_t CUDADeviceContext::cudnn_handle() const { return cudnn_handle_; }
cudaStream_t CUDADeviceContext::stream() const { return stream_; } cudaStream_t CUDADeviceContext::stream() const { return stream_; }
CUDNNDeviceContext::CUDNNDeviceContext(CUDAPlace place)
: CUDADeviceContext(place) {
PADDLE_ENFORCE(dynload::cudnnCreate(&cudnn_handle_));
PADDLE_ENFORCE(dynload::cudnnSetStream(cudnn_handle_, stream()));
}
CUDNNDeviceContext::~CUDNNDeviceContext() {
SetDeviceId(boost::get<CUDAPlace>(GetPlace()).device);
Wait();
PADDLE_ENFORCE(dynload::cudnnDestroy(cudnn_handle_));
}
cudnnHandle_t CUDNNDeviceContext::cudnn_handle() const { return cudnn_handle_; }
#endif #endif
} // namespace platform } // namespace platform
......
...@@ -103,18 +103,6 @@ struct DefaultDeviceContextType<platform::CUDAPlace> { ...@@ -103,18 +103,6 @@ struct DefaultDeviceContextType<platform::CUDAPlace> {
using TYPE = CUDADeviceContext; using TYPE = CUDADeviceContext;
}; };
class CUDNNDeviceContext : public CUDADeviceContext {
public:
explicit CUDNNDeviceContext(CUDAPlace place);
virtual ~CUDNNDeviceContext();
/*! \brief Return cudnn handle in the device context. */
cudnnHandle_t cudnn_handle() const;
private:
cudnnHandle_t cudnn_handle_;
};
#endif #endif
/*! \brief device context pool singleton */ /*! \brief device context pool singleton */
...@@ -151,7 +139,7 @@ class DeviceContextPool { ...@@ -151,7 +139,7 @@ class DeviceContextPool {
struct Hash { struct Hash {
std::hash<int> hash_; std::hash<int> hash_;
size_t operator()(const platform::Place& place) const { size_t operator()(const platform::Place& place) const {
int pre_hash = place.which() + (1 << LEFT_SHIFT); int pre_hash = place.which() << LEFT_SHIFT;
if (platform::is_gpu_place(place)) { if (platform::is_gpu_place(place)) {
pre_hash += boost::get<platform::CUDAPlace>(place).GetDeviceId(); pre_hash += boost::get<platform::CUDAPlace>(place).GetDeviceId();
} }
......
...@@ -49,21 +49,6 @@ TEST(Device, CUDADeviceContext) { ...@@ -49,21 +49,6 @@ TEST(Device, CUDADeviceContext) {
} }
} }
TEST(Device, CUDNNDeviceContext) {
using paddle::platform::CUDNNDeviceContext;
using paddle::platform::CUDAPlace;
if (paddle::platform::dynload::HasCUDNN()) {
int count = paddle::platform::GetCUDADeviceCount();
for (int i = 0; i < count; ++i) {
CUDNNDeviceContext* device_context = new CUDNNDeviceContext(CUDAPlace(i));
cudnnHandle_t cudnn_handle = device_context->cudnn_handle();
ASSERT_NE(nullptr, cudnn_handle);
ASSERT_NE(nullptr, device_context->stream());
delete device_context;
}
}
}
TEST(Device, DeviceContextPool) { TEST(Device, DeviceContextPool) {
using paddle::platform::DeviceContextPool; using paddle::platform::DeviceContextPool;
using paddle::platform::CUDADeviceContext; using paddle::platform::CUDADeviceContext;
......
...@@ -65,13 +65,6 @@ class Executor(object): ...@@ -65,13 +65,6 @@ class Executor(object):
p.set_place(each) p.set_place(each)
act_places.append(p) act_places.append(p)
# TODO(dzhwinter) : consider that our fluid tests all written in
# CUDAPlace(gpu_id), this will be changed in the future
if core.is_compile_gpu():
core.init_devices(["CPU", "GPU:0"])
else:
core.init_devices(["CPU"])
# TODO(dzhwinter) : only use the first place # TODO(dzhwinter) : only use the first place
self.executor = core.Executor(act_places[0]) self.executor = core.Executor(act_places[0])
self.places = places self.places = places
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册