tensorrt.h 4.6 KB
Newer Older
Y
Yan Chunwei 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#pragma once

#include <NvInfer.h>
Z
zlsh80826 已提交
17
#include <NvInferPlugin.h>
18
#if !defined(_WIN32)
Y
Yan Chunwei 已提交
19
#include <dlfcn.h>
20
#endif
Y
Yan Chunwei 已提交
21 22 23 24 25 26 27 28 29 30

#include <mutex>  // NOLINT

#include "paddle/fluid/platform/dynload/dynamic_loader.h"
#include "paddle/fluid/platform/enforce.h"

namespace paddle {
namespace platform {
namespace dynload {

P
Pei Yang 已提交
31
void* GetTensorRtHandle();
Z
zlsh80826 已提交
32
void* GetTensorRtPluginHandle();
P
Pei Yang 已提交
33

Y
Yan Chunwei 已提交
34 35 36
extern std::once_flag tensorrt_dso_flag;
extern void* tensorrt_dso_handle;

Z
zlsh80826 已提交
37 38 39
extern std::once_flag tensorrt_plugin_dso_flag;
extern void* tensorrt_plugin_dso_handle;

G
GaoWei8 已提交
40 41 42 43 44 45
#define DECLARE_DYNAMIC_LOAD_TENSORRT_WRAP(__name)                            \
  struct DynLoad__##__name {                                                  \
    template <typename... Args>                                               \
    auto operator()(Args... args) -> DECLARE_TYPE(__name, args...) {          \
      using tensorrt_func = decltype(&::__name);                              \
      std::call_once(tensorrt_dso_flag, []() {                                \
P
Pei Yang 已提交
46
        tensorrt_dso_handle = paddle::platform::dynload::GetTensorRtHandle(); \
G
GaoWei8 已提交
47 48 49 50 51 52 53 54 55 56 57
        PADDLE_ENFORCE_NOT_NULL(tensorrt_dso_handle,                          \
                                platform::errors::Unavailable(                \
                                    "Load tensorrt %s failed", #__name));     \
      });                                                                     \
      static void* p_##__name = dlsym(tensorrt_dso_handle, #__name);          \
      PADDLE_ENFORCE_NOT_NULL(                                                \
          p_##__name,                                                         \
          platform::errors::Unavailable("Load tensorrt %s failed", #__name)); \
      return reinterpret_cast<tensorrt_func>(p_##__name)(args...);            \
    }                                                                         \
  };                                                                          \
Y
Yan Chunwei 已提交
58 59
  extern DynLoad__##__name __name

Z
zlsh80826 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#define DECLARE_DYNAMIC_LOAD_TENSORRT_PLUGIN_WRAP(__name)                      \
  struct DynLoad__##__name {                                                   \
    template <typename... Args>                                                \
    auto operator()(Args... args) -> DECLARE_TYPE(__name, args...) {           \
      using tensorrt_plugin_func = decltype(&::__name);                        \
      std::call_once(tensorrt_plugin_dso_flag, []() {                          \
        tensorrt_plugin_dso_handle =                                           \
            paddle::platform::dynload::GetTensorRtPluginHandle();              \
        PADDLE_ENFORCE_NOT_NULL(                                               \
            tensorrt_plugin_dso_handle,                                        \
            platform::errors::Unavailable("Load tensorrt plugin %s failed",    \
                                          #__name));                           \
      });                                                                      \
      static void* p_##__name = dlsym(tensorrt_plugin_dso_handle, #__name);    \
      PADDLE_ENFORCE_NOT_NULL(p_##__name,                                      \
                              platform::errors::Unavailable(                   \
                                  "Load tensorrt plugin %s failed", #__name)); \
      return reinterpret_cast<tensorrt_plugin_func>(p_##__name)(args...);      \
    }                                                                          \
  };                                                                           \
  extern DynLoad__##__name __name

Y
Yan Chunwei 已提交
82 83
#define TENSORRT_RAND_ROUTINE_EACH(__macro) \
  __macro(createInferBuilder_INTERNAL);     \
P
Pei Yang 已提交
84 85
  __macro(createInferRuntime_INTERNAL);     \
  __macro(getPluginRegistry);
Y
Yan Chunwei 已提交
86

Z
zlsh80826 已提交
87 88 89
#define TENSORRT_PLUGIN_RAND_ROUTINE_EACH(__macro) \
  __macro(initLibNvInferPlugins);

Y
Yan Chunwei 已提交
90
TENSORRT_RAND_ROUTINE_EACH(DECLARE_DYNAMIC_LOAD_TENSORRT_WRAP)
Z
zlsh80826 已提交
91
TENSORRT_PLUGIN_RAND_ROUTINE_EACH(DECLARE_DYNAMIC_LOAD_TENSORRT_PLUGIN_WRAP)
Y
Yan Chunwei 已提交
92 93 94 95

}  // namespace dynload
}  // namespace platform
}  // namespace paddle