北冥有鱼 记录生活点滴,分享学习心得

Paddle框架Op注册机制

Posted by YuChen on July 13, 2020

宏展开调试技巧1

宏代码会在编译前全部展开,因此可以使用编译器(gcc)输出预处理结果。

  • gcc -E让编译器在预处理结束后停止,不进行后续的编译及链接操作。
  • gcc -P屏蔽编译器输出预处理结果的行标记 (如#line lineno "filename"),减少干扰。
  • 由于输出结果没有格式化,可先传给clang-format --style=Google格式化后再输出。
  • 屏蔽无关的头文件,临时删掉不影响宏展开的#include行,避免多余的引用展开,导致实际关注的宏代码 “被淹没”。

Paddle fsp_op Op注册宏展开示例

  • 使用cd /work/Paddle命令进入Paddle源码根目录。
  • 删除paddle/fluid/operators/fsp_op.cc文件中的所有#include行,并添加#include "paddle/fluid/framework/op_registry.h"语句。
  • 删除paddle/fluid/framework/op_registry.h文件中的所有#include行。
  • 执行如下命令进行宏展开(为了将CUDA Op Kernel注册宏也展开,可将paddle/fluid/operators/fsp_op.cu中的cuda kernel注册语句也拷贝到fsp_op.cc文件中)。
1
2
gcc -E -P paddle/fluid/operators/fsp_op.cc -I. | clang-format --style=Google >./macro.cpp

Paddle fsp_op算子注册方式的宏展开代码

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
namespace ops = paddle::operators;
namespace plat = paddle::platform;
struct __test_global_namespace___reg_op__fsp__ {};
static_assert(std::is_same<::__test_global_namespace___reg_op__fsp__,
                           __test_global_namespace___reg_op__fsp__>::value,
              "REGISTER_OPERATOR must be called in global namespace");
static ::paddle::framework::OperatorRegistrar<
    ops::FSPOp, ops::FSPOpMaker, ops::FSPGradOpMaker<paddle::framework::OpDesc>,
    ops::FSPGradOpMaker<paddle::imperative::OpBase>>
    __op_registrar_fsp__("fsp");
int TouchOpRegistrar_fsp() {
  __op_registrar_fsp__.Touch();
  return 0;
};
struct __test_global_namespace___reg_op_kernel_fsp_CPU_DEFAULT_TYPE____ {};
static_assert(
    std::is_same<
        ::__test_global_namespace___reg_op_kernel_fsp_CPU_DEFAULT_TYPE____,
        __test_global_namespace___reg_op_kernel_fsp_CPU_DEFAULT_TYPE____>::
        value,
    "REGISTER_OP_KERNEL must be called in "
    "global namespace");
static ::paddle::framework::OpKernelRegistrar<
    ::paddle::platform::CPUPlace,
    ops::FSPOpKernel<paddle::platform::CPUDeviceContext, float>,
    ops::FSPOpKernel<paddle::platform::CPUDeviceContext, double>>
    __op_kernel_registrar_fsp_CPU_DEFAULT_TYPE__(
        "fsp", "CPU",
        ::paddle::framework::OpKernelType::kDefaultCustomizedTypeValue);
int TouchOpKernelRegistrar_fsp_CPU_DEFAULT_TYPE() {
  __op_kernel_registrar_fsp_CPU_DEFAULT_TYPE__.Touch();
  return 0;
};
struct __test_global_namespace___reg_op_kernel_fsp_CUDA_DEFAULT_TYPE____ {};
static_assert(
    std::is_same<
        ::__test_global_namespace___reg_op_kernel_fsp_CUDA_DEFAULT_TYPE____,
        __test_global_namespace___reg_op_kernel_fsp_CUDA_DEFAULT_TYPE____>::
        value,
    "REGISTER_OP_KERNEL must be called in "
    "global namespace");
static ::paddle::framework::OpKernelRegistrar<
    ::paddle::platform::CUDAPlace,
    ops::FSPOpKernel<plat::CUDADeviceContext, float>,
    ops::FSPOpKernel<plat::CUDADeviceContext, double>>
    __op_kernel_registrar_fsp_CUDA_DEFAULT_TYPE__(
        "fsp", "CUDA",
        ::paddle::framework::OpKernelType::kDefaultCustomizedTypeValue);
int TouchOpKernelRegistrar_fsp_CUDA_DEFAULT_TYPE() {
  __op_kernel_registrar_fsp_CUDA_DEFAULT_TYPE__.Touch();
  return 0;
};
struct __test_global_namespace___reg_op__fsp_grad__ {};
static_assert(std::is_same<::__test_global_namespace___reg_op__fsp_grad__,
                           __test_global_namespace___reg_op__fsp_grad__>::value,
              "REGISTER_OPERATOR must be called in global namespace");
static ::paddle::framework::OperatorRegistrar<ops::FSPOpGrad>
    __op_registrar_fsp_grad__("fsp_grad");
int TouchOpRegistrar_fsp_grad() {
  __op_registrar_fsp_grad__.Touch();
  return 0;
};
struct __test_global_namespace___reg_op_kernel_fsp_grad_CPU_DEFAULT_TYPE____ {};
static_assert(
    std::is_same<
        ::__test_global_namespace___reg_op_kernel_fsp_grad_CPU_DEFAULT_TYPE____,
        __test_global_namespace___reg_op_kernel_fsp_grad_CPU_DEFAULT_TYPE____>::
        value,
    "REGISTER_OP_KERNEL must be called in "
    "global namespace");
static ::paddle::framework::OpKernelRegistrar<
    ::paddle::platform::CPUPlace,
    ops::FSPGradOpKernel<paddle::platform::CPUDeviceContext, float>,
    ops::FSPGradOpKernel<paddle::platform::CPUDeviceContext, double>>
    __op_kernel_registrar_fsp_grad_CPU_DEFAULT_TYPE__(
        "fsp_grad", "CPU",
        ::paddle::framework::OpKernelType::kDefaultCustomizedTypeValue);
int TouchOpKernelRegistrar_fsp_grad_CPU_DEFAULT_TYPE() {
  __op_kernel_registrar_fsp_grad_CPU_DEFAULT_TYPE__.Touch();
  return 0;
};
struct __test_global_namespace___reg_op_kernel_fsp_grad_CUDA_DEFAULT_TYPE____ {
};
static_assert(
    std::is_same<
        ::__test_global_namespace___reg_op_kernel_fsp_grad_CUDA_DEFAULT_TYPE____,
        __test_global_namespace___reg_op_kernel_fsp_grad_CUDA_DEFAULT_TYPE____>::
        value,
    "REGISTER_OP_KERNEL must be called in "
    "global namespace");
static ::paddle::framework::OpKernelRegistrar<
    ::paddle::platform::CUDAPlace,
    ops::FSPGradOpKernel<plat::CUDADeviceContext, float>,
    ops::FSPGradOpKernel<plat::CUDADeviceContext, double>>
    __op_kernel_registrar_fsp_grad_CUDA_DEFAULT_TYPE__(
        "fsp_grad", "CUDA",
        ::paddle::framework::OpKernelType::kDefaultCustomizedTypeValue);
int TouchOpKernelRegistrar_fsp_grad_CUDA_DEFAULT_TYPE() {
  __op_kernel_registrar_fsp_grad_CUDA_DEFAULT_TYPE__.Touch();
  return 0;
};




更多文章