Files
paddlepaddle--paddle/paddle/phi/core/kernel_registry.h
T
2026-07-13 12:40:42 +08:00

1681 lines
104 KiB
C++

// Copyright (c) 2021 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 <typeindex>
#include <typeinfo>
#include "paddle/phi/core/custom_kernel.h"
#include "paddle/phi/core/kernel_utils.h"
namespace phi {
#define BACKEND(arg__) phi::Backend::arg__
#define DATA_LAYOUT(arg__) phi::DataLayout::arg__
#define DATATYPE(arg__) DataType::arg__
template <typename Func>
struct KernelArgsParseFunctor;
PADDLE_API void SetKernelArgsDef(const std::vector<std::type_index>& args_type,
const KernelKey& default_key,
KernelArgsDef* args_def);
template <typename Return_, typename... Args_>
struct KernelArgsParseFunctor<Return_ (*)(Args_...)> {
using Args = std::tuple<Args_...>;
enum : std::size_t { Arity = sizeof...(Args_) };
using Indices = std::make_index_sequence<Arity>;
template <std::size_t Index>
using Arg = typename std::tuple_element<Index, Args>::type;
static void Parse(const KernelKey& default_key, KernelArgsDef* args_def) {
// TODO(chenweihang): The fluid Tensor's default layout is NCHW,
// it is not same as kernel's layout, we should fix this error on
// fluid Tensor
auto args_type = ParseArgType(Indices{});
SetKernelArgsDef(args_type, default_key, args_def);
}
private:
template <std::size_t... INDEX>
static std::vector<std::type_index> ParseArgType(
std::index_sequence<INDEX...>) {
return {std::type_index(typeid(Arg<INDEX>))...};
}
};
// NOTE: used for making a difference between inner or outer registration.
enum class RegType : uint8_t {
INNER = 0,
OUTER,
};
// TODO(chenweihang): Polish the kernel selection logic, support the selection
// of ALL_DTYPE kernel, and simplify the constructor
struct KernelRegistrar {
public:
KernelRegistrar(RegType reg_type,
const char* kernel_name_cstr,
const char* backend_cstr,
DataLayout layout,
DataType dtype,
KernelArgsParseFn args_parse_fn,
KernelArgsDefFn args_def_fn,
KernelFn kernel_fn,
void* variadic_kernel_fn) {
ConstructKernel(reg_type,
kernel_name_cstr,
backend_cstr,
layout,
dtype,
args_parse_fn,
args_def_fn,
kernel_fn,
variadic_kernel_fn);
}
KernelRegistrar(RegType reg_type,
const char* kernel_name_cstr,
const char* backend_cstr,
DataLayout layout,
KernelArgsParseFn args_parse_fn,
KernelArgsDefFn args_def_fn,
KernelFn kernel_fn,
void* variadic_kernel_fn) {
for (size_t dtype = static_cast<size_t>(DataType::BOOL);
dtype != static_cast<size_t>(DataType::NUM_DATA_TYPES);
dtype++) {
// NOTE(zhiqiu): why skip these types, because fluid kernel has no kernel
// of these type.
if (dtype == static_cast<size_t>(DataType::UINT32) ||
dtype == static_cast<size_t>(DataType::UINT64) ||
dtype == static_cast<size_t>(DataType::UINT16)) {
continue;
}
// NOTE(zhoushunjie): Only the strings kernels can support pstring dtype
constexpr char strings_kernels_prefix[] = "strings_";
if (dtype == static_cast<size_t>(DataType::PSTRING) &&
strncmp(kernel_name_cstr,
strings_kernels_prefix,
strlen(strings_kernels_prefix))) {
continue;
}
ConstructKernel(reg_type,
kernel_name_cstr,
backend_cstr,
layout,
static_cast<DataType>(dtype),
args_parse_fn,
args_def_fn,
kernel_fn,
variadic_kernel_fn);
}
}
private:
void ConstructKernel(RegType reg_type,
const char* kernel_name_cstr,
const char* backend_cstr,
DataLayout layout,
DataType dtype,
KernelArgsParseFn args_parse_fn,
KernelArgsDefFn args_def_fn,
KernelFn kernel_fn,
void* variadic_kernel_fn) {
std::string kernel_name(kernel_name_cstr);
KernelKey kernel_key(
paddle::experimental::StringToBackend(backend_cstr), layout, dtype);
Kernel kernel(kernel_fn, variadic_kernel_fn);
if (kernel.GetKernelRegisteredType() == KernelRegisteredType::FUNCTION) {
args_parse_fn(kernel_key, kernel.mutable_args_def());
}
args_def_fn(kernel_key, &kernel);
if (reg_type == RegType::INNER) {
KernelFactory::Instance().kernels()[kernel_name][kernel_key] = kernel;
} else {
CustomKernelMap::Instance().RegisterCustomKernel(
kernel_name, kernel_key, kernel);
}
}
};
/**
* Reference:
*
* https://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros
* https://stackoverflow.com/questions/9183993/msvc-variadic-macro-expansion?rq=1
* https://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly
*
* Very carefully tiptoeing around an MSVC bug where it improperly expands
* __VA_ARGS__ as a single token in argument lists. See these URLs for details:
*
* http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement
* http://cplusplus.co.il/2010/07/17/variadic-macro-to-count-number-of-arguments/#comment-644
*/
#define PD_NARGS(...) _PD_NARGS((__VA_ARGS__, _PD_RESQ_N()))
#define _PD_NARGS(...) _PD_ARG_N(__VA_ARGS__)
#define _PD_ARG_N_EXPAND(_1, \
_2, \
_3, \
_4, \
_5, \
_6, \
_7, \
_8, \
_9, \
_10, \
_11, \
_12, \
_13, \
_14, \
_15, \
_16, \
_17, \
N, \
...) \
N
#define _PD_ARG_N(args) _PD_ARG_N_EXPAND args
#define _PD_RESQ_N() \
17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
// The macro for passing KernelArgsParseFunctor's function
#define ARG_PARSE_FUNCTOR(meta_kernel_fn, cpp_dtype, context) \
::phi::KernelArgsParseFunctor< \
decltype(&meta_kernel_fn<cpp_dtype, context>)>::Parse
// nvcc 13.x crashes in cudafe++ on the explicit instantiation form
// `template decltype(fn<T, Ctx>) fn<T, Ctx>;`. Keep macro registration intact
// by replacing it with a `used` anchor that still forces the specialization
// to be emitted without hitting the buggy syntax.
#if defined(__CUDACC__) && !defined(_WIN32) && \
defined(__CUDACC_VER_MAJOR__) && (__CUDACC_VER_MAJOR__ >= 13)
#define PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION_IMPL(id, ...) \
static auto* const PD_CONCATENATE(__pd_kernel_instantiation_anchor_, id) \
__attribute__((used)) = &__VA_ARGS__;
#define PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION(...) \
PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION_IMPL(PD_ID, __VA_ARGS__)
#else
#define PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION(...) \
template decltype(__VA_ARGS__) __VA_ARGS__;
#endif
// The macro for instantiating function kernel
#define FUNCTION_KERNEL_INSTANTIATION(meta_kernel_fn, cpp_dtype, context) \
PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION( \
meta_kernel_fn<cpp_dtype, context>)
/** PD_REGISTER_KERNEL
*
* The most frequently used kernel registration macro, used for kernel
* registration with only data type as template parameter, and the function
* pointer of the corresponding data type is automatically instantiated
* during registration.
*
* Note: `2TA` means `2 template argument`
*/
#ifndef PADDLE_WITH_CUSTOM_DEVICE
#define PD_REGISTER_KERNEL(kernel_name, backend, layout, meta_kernel_fn, ...) \
_PD_REGISTER_KERNEL(::phi::RegType::INNER, \
kernel_name, \
backend, \
::phi::backend##Context, \
layout, \
meta_kernel_fn, \
FUNCTION_KERNEL_INSTANTIATION, \
ARG_PARSE_FUNCTOR, \
PHI_KERNEL, \
PHI_VARIADIC_KERNEL, \
__VA_ARGS__)
#else
#define PD_REGISTER_CPU_KERNEL( \
kernel_name, backend, layout, meta_kernel_fn, ...) \
_PD_REGISTER_KERNEL(::phi::RegType::INNER, \
kernel_name, \
backend, \
::phi::backend##Context, \
layout, \
meta_kernel_fn, \
FUNCTION_KERNEL_INSTANTIATION, \
ARG_PARSE_FUNCTOR, \
PHI_KERNEL, \
PHI_VARIADIC_KERNEL, \
__VA_ARGS__)
#define PD_REGISTER_NON_CPU_KERNEL( \
kernel_name, backend, layout, meta_kernel_fn, ...) \
_PD_REGISTER_NON_CPU_KERNEL(::phi::RegType::OUTER, \
kernel_name, \
backend, \
::phi::CustomContext, \
layout, \
meta_kernel_fn, \
FUNCTION_KERNEL_INSTANTIATION, \
__VA_ARGS__)
#define _PD_REGISTER_NON_CPU_KERNEL(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
meta_kernel_fn, \
kernel_instantiation_macro, \
...) \
PD_KERNEL_INSTANTIATION(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__) \
static void \
__FAKE_PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey kernel_key UNUSED, \
::phi::Kernel* kernel UNUSED)
#define CONCATENATE(x, y) CONCATENATE_HELPER(x, y)
#define CONCATENATE_HELPER(x, y) x##y
// check backend
#define IS_BACKEND_CPU(backend) PD_EXPAND(IS_BACKEND_CPU_HELPER(backend))
#define IS_BACKEND_CPU_HELPER(backend) PD_EXPAND(IS_BACKEND_CPU_##backend)
#define IS_BACKEND_CPU_CPU 1
#define IS_BACKEND_CPU_Custom 1
#define IS_BACKEND_CPU_OneDNN 1
#define IS_BACKEND_CPU_KPS 0
#define IS_BACKEND_CPU_GPU 0
#define IS_BACKEND_CPU_GPUDNN 0
#define IS_BACKEND_CPU_DEFAULT 0
#define IF_ELSE(condition) IF_ELSE_EXPAND(IF_ELSE_HELPER(condition))
#define IF_ELSE_HELPER(condition) CONCATENATE(IF_, condition)
#define IF_ELSE_EXPAND(x) x
#define IF_1(true_branch, false_branch) true_branch
#define IF_0(true_branch, false_branch) false_branch
#define IF_IS_BACKEND_CPU_DEFAULT(true_branch, false_branch) false_branch
#define PD_REGISTER_KERNEL(kernel_name, backend, layout, meta_kernel_fn, ...) \
PD_EXPAND(IF_ELSE(IS_BACKEND_CPU(backend))( \
PD_REGISTER_CPU_KERNEL( \
kernel_name, backend, layout, meta_kernel_fn, __VA_ARGS__), \
PD_REGISTER_NON_CPU_KERNEL( \
kernel_name, backend, layout, meta_kernel_fn, __VA_ARGS__)))
// This macro is used for registering custom kernel.
#define PD_CUSTOM_KERNEL_REGISTER( \
kernel_name, backend, layout, meta_kernel_fn, ...) \
_PD_CUSTOM_REGISTER_KERNEL(::phi::RegType::OUTER, \
kernel_name, \
backend, \
::phi::CustomContext, \
layout, \
meta_kernel_fn, \
FUNCTION_KERNEL_INSTANTIATION, \
ARG_PARSE_FUNCTOR, \
PHI_KERNEL, \
PHI_VARIADIC_KERNEL, \
__VA_ARGS__)
#define _PD_CUSTOM_REGISTER_KERNEL(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
meta_kernel_fn, \
kernel_instantiation_macro, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
...) \
PD_STATIC_ASSERT_GLOBAL_NAMESPACE( \
PD_REGISTER_tp_kernel_ns_check_##kernel_name##_##backend##_##layout, \
"PD_REGISTER_KERNEL must be called in global namespace."); \
static void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key UNUSED, \
::phi::Kernel* kernel UNUSED); \
PD_KERNEL_REGISTRAR_INIT( \
reg_type, \
kernel_name, \
backend, \
context, \
layout, \
&__PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__) \
void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key UNUSED, ::phi::Kernel* kernel UNUSED)
#endif
#define _PD_REGISTER_KERNEL(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
meta_kernel_fn, \
kernel_instantiation_macro, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
...) \
PD_STATIC_ASSERT_GLOBAL_NAMESPACE( \
PD_REGISTER_tp_kernel_ns_check_##kernel_name##_##backend##_##layout, \
"PD_REGISTER_KERNEL must be called in global namespace."); \
PD_EXPAND(_PD_REGISTER_2TA_KERNEL(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
meta_kernel_fn, \
kernel_instantiation_macro, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#ifndef _WIN32
#define _PD_REGISTER_2TA_KERNEL(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
meta_kernel_fn, \
kernel_instantiation_macro, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
...) \
PD_KERNEL_INSTANTIATION(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__); \
static void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel); \
PD_KERNEL_REGISTRAR_INIT( \
reg_type, \
kernel_name, \
backend, \
context, \
layout, \
&__PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__); \
void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key UNUSED, ::phi::Kernel* kernel UNUSED)
#else
/**
* `template decltype(fn) fn` can work on gcc and clang,
* but msvc will failed, error like:
*
* error C2206: typedef cannot be used for function definition
*
* reference:
*
* https://stackoverflow.com/questions/63989585/explicit-instantiation-of-function-using-decltype-work-on-g-but-not-on-visua
*
* And msvc can work without template instantiation
*/
#define _PD_REGISTER_2TA_KERNEL(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
meta_kernel_fn, \
kernel_instantiation_macro, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
...) \
static void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel); \
PD_EXPAND(PD_KERNEL_REGISTRAR_INIT( \
reg_type, \
kernel_name, \
backend, \
context, \
layout, \
&__PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__)); \
void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel)
#endif
#define PD_KERNEL_INSTANTIATION( \
meta_kernel_fn, backend, context, kernel_instantiation_macro, ...) \
_PD_KERNEL_INSTANTIATION(PD_NARGS(__VA_ARGS__), \
meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__)
#define _PD_KERNEL_INSTANTIATION( \
N, meta_kernel_fn, backend, context, kernel_instantiation_macro, ...) \
PD_CONCATENATE(_PD_KERNEL_INSTANTIATION_, N) \
(meta_kernel_fn, backend, context, kernel_instantiation_macro, __VA_ARGS__)
#define _PD_KERNEL_INSTANTIATION_1( \
meta_kernel_fn, backend, context, kernel_instantiation_macro, cpp_dtype) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context)
#define _PD_KERNEL_INSTANTIATION_2(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_1(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_3(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_2(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_4(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_3(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_5(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_4(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_6(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_5(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_7(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_6(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_8(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_7(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_9(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_8(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_10(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_9(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_11(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_10(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_12(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_11(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_13(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_12(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_14(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_13(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_15(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_14(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_16(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_15(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define _PD_KERNEL_INSTANTIATION_17(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
cpp_dtype, \
...) \
kernel_instantiation_macro(meta_kernel_fn, cpp_dtype, context) \
PD_EXPAND(_PD_KERNEL_INSTANTIATION_16(meta_kernel_fn, \
backend, \
context, \
kernel_instantiation_macro, \
__VA_ARGS__))
#define PD_KERNEL_REGISTRAR_INIT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
...) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT(PD_NARGS(__VA_ARGS__), \
reg_type, \
kernel_name, \
backend, \
context, \
layout, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
// clang-format off
/* The =pre-commit always treats this macro into the wrong format,
and multi-line macros cannot be skipped with NOLINT.*/
#define _PD_KERNEL_REGISTRAR_INIT(N, \
reg_type, \
kernel_name, \
backend, \
context, \
layout, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
...) \
PD_EXPAND(PD_CONCATENATE(_PD_KERNEL_REGISTRAR_INIT_, N) ( \
reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
// clang-format on
#define _PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
static const ::phi::KernelRegistrar PD_CONCATENATE( \
__reg_phi_kernel_##kernel_name##_##backend##_##layout##_, registrar_id)( \
reg_type, \
#kernel_name, \
#backend, \
DATA_LAYOUT(layout), \
::phi::CppTypeToDataType<cpp_dtype>::Type(), \
arg_parse_functor_macro(meta_kernel_fn, cpp_dtype, context), \
args_def_fn, \
kernel_unfold_macro(meta_kernel_fn<cpp_dtype, context>), \
variadic_kernel_unfold_marco(meta_kernel_fn<cpp_dtype, context>));
#define _PD_KERNEL_REGISTRAR_INIT_1(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PADDLE_EXP_API int \
TouchKernelSymbolFor_##kernel_name##_##backend##_##layout() { \
return 0; \
}
#define _PD_KERNEL_REGISTRAR_INIT_2(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_1(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_3(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_2(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_4(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_3(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_5(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_4(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_6(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_5(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_7(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_6(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_8(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_7(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_9(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_8(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_10(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_9(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_11(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_10(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_12(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_11(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_13(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_12(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_14(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_13(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_15(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_14(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_16(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_15(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
#define _PD_KERNEL_REGISTRAR_INIT_17(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype, \
...) \
_PD_CREATE_REGISTRAR_OBJECT(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
registrar_id, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
cpp_dtype) \
PD_EXPAND(_PD_KERNEL_REGISTRAR_INIT_16(reg_type, \
kernel_name, \
backend, \
context, \
layout, \
PD_ID, \
args_def_fn, \
meta_kernel_fn, \
arg_parse_functor_macro, \
kernel_unfold_macro, \
variadic_kernel_unfold_marco, \
__VA_ARGS__))
/** PD_REGISTER_KERNEL_FOR_ALL_DTYPE
*
* Basic Kernel register marco, used to register a instantiated kernel function
* with one template argument.
*/
#if (defined(PADDLE_WITH_CUSTOM_DEVICE) && defined(PADDLE_WITH_CUDA))
#define PD_REGISTER_KERNEL_FOR_ALL_DTYPE( \
kernel_name, backend, layout, kernel_fn) \
PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION(kernel_fn) \
static void \
__FAKE_PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key UNUSED, \
::phi::Kernel* kernel UNUSED)
#else
#define PD_REGISTER_KERNEL_FOR_ALL_DTYPE( \
kernel_name, backend, layout, kernel_fn) \
_PD_REGISTER_KERNEL_FOR_ALL_DTYPE( \
::phi::RegType::INNER, kernel_name, backend, layout, kernel_fn)
#endif
#define _PD_REGISTER_KERNEL_FOR_ALL_DTYPE( \
reg_type, kernel_name, backend, layout, kernel_fn) \
PD_STATIC_ASSERT_GLOBAL_NAMESPACE( \
PD_REGISTER_no_t_kernel_ns_check_##kernel_name##_##backend##_##layout, \
"PD_REGISTER_NO_TEMPLATE_KERNEL must be called in global namespace."); \
__PD_REGISTER_KERNEL_FOR_ALL_DTYPE( \
reg_type, kernel_name, backend, layout, kernel_fn)
#ifndef _WIN32
#define __PD_REGISTER_KERNEL_FOR_ALL_DTYPE( \
reg_type, kernel_name, backend, layout, kernel_fn) \
PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION(kernel_fn) \
static void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel); \
static const ::phi::KernelRegistrar \
__reg_phi_kernel_##kernel_name##_##backend##_##layout( \
reg_type, \
#kernel_name, \
#backend, \
DATA_LAYOUT(layout), \
::phi::KernelArgsParseFunctor<decltype(&kernel_fn)>::Parse, \
&__PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout, \
PHI_KERNEL(kernel_fn), \
PHI_VARIADIC_KERNEL(kernel_fn)); \
PADDLE_API int TouchKernelSymbolFor_##kernel_name##_##backend##_##layout() { \
return 0; \
} \
void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key UNUSED, ::phi::Kernel* kernel UNUSED)
#else
#define __PD_REGISTER_KERNEL_FOR_ALL_DTYPE( \
reg_type, kernel_name, backend, layout, kernel_fn) \
static void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel); \
static const ::phi::KernelRegistrar \
__reg_phi_kernel_##kernel_name##_##backend##_##layout( \
reg_type, \
#kernel_name, \
#backend, \
DATA_LAYOUT(layout), \
::phi::KernelArgsParseFunctor<decltype(&kernel_fn)>::Parse, \
&__PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout, \
PHI_KERNEL(kernel_fn), \
PHI_VARIADIC_KERNEL(kernel_fn)); \
PADDLE_EXP_API int \
TouchKernelSymbolFor_##kernel_name##_##backend##_##layout() { \
return 0; \
} \
void __PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel)
#endif
/** PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE
*
* Used to register a instantiated kernel function
* for all backend with one template argument.
*/
#if (defined(PADDLE_WITH_CUSTOM_DEVICE) && defined(PADDLE_WITH_CUDA))
#define PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
kernel_name, layout, meta_kernel_fn) \
PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION( \
meta_kernel_fn<::phi::CustomContext>) \
static void \
__FAKE_PD_KERNEL_args_def_FN_##kernel_name##_##backend##_##layout( \
const ::phi::KernelKey kernel_key UNUSED, \
::phi::Kernel* kernel UNUSED)
#define PD_CUSTOM_KERNEL_REGISTER_FOR_ALL_DTYPE( \
kernel_name, backend, layout, meta_kernel_fn) \
PD_STATIC_ASSERT_GLOBAL_NAMESPACE( \
PD_REGISTER_nt_kernel_ns_check_##kernel_name##_##layout, \
"PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE must be called in global " \
"namespace."); \
static void __PD_KERNEL_args_def_FN_##kernel_name##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel); \
static const ::phi::KernelRegistrar \
__reg_phi_kernel_##kernel_name##_##backend##_##layout( \
::phi::RegType::OUTER, \
#kernel_name, \
#backend, \
DATA_LAYOUT(layout), \
::phi::KernelArgsParseFunctor< \
decltype(&meta_kernel_fn<::phi::CustomContext>)>::Parse, \
&__PD_KERNEL_args_def_FN_##kernel_name##_##layout, \
PHI_KERNEL(meta_kernel_fn<::phi::CustomContext>), \
PHI_VARIADIC_KERNEL(meta_kernel_fn<::phi::CustomContext>)); \
PADDLE_API int TouchKernelSymbolFor_##kernel_name##_##backend##_##layout() { \
return 0; \
} \
void __PD_KERNEL_args_def_FN_##kernel_name##_##layout( \
const ::phi::KernelKey& kernel_key UNUSED, ::phi::Kernel* kernel UNUSED)
#else
#define PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
kernel_name, layout, meta_kernel_fn) \
_PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE(::phi::RegType::INNER, \
kernel_name, \
layout, \
meta_kernel_fn, \
BACKEND_LIST)
#endif
#define PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE_EXCEPT_CUSTOM( \
kernel_name, layout, meta_kernel_fn) \
_PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE(::phi::RegType::INNER, \
kernel_name, \
layout, \
meta_kernel_fn, \
BACKEND_LIST_EXCEPT_CUSTOM)
#if defined(PADDLE_WITH_CUDA) || defined(PADDLE_WITH_HIP)
#define _DEVICE GPU,
#elif defined(PADDLE_WITH_XPU)
#define _DEVICE XPU,
#else
#define _DEVICE
#endif
#ifdef PADDLE_WITH_CUSTOM_DEVICE
#define _CUSTOM Custom,
#else
#define _CUSTOM
#endif
#define BACKEND_LIST _DEVICE _CUSTOM CPU
#define BACKEND_LIST_EXCEPT_CUSTOM _DEVICE CPU
#define _PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
reg_type, kernel_name, layout, meta_kernel_fn, ...) \
PD_STATIC_ASSERT_GLOBAL_NAMESPACE( \
PD_REGISTER_nt_kernel_ns_check_##kernel_name##_##layout, \
"PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE must be called in global " \
"namespace."); \
PD_EXPAND(__PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE(reg_type, \
kernel_name, \
layout, \
meta_kernel_fn, \
PD_NARGS(__VA_ARGS__), \
__VA_ARGS__))
#define __PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
reg_type, kernel_name, layout, meta_kernel_fn, N, ...) \
static void __PD_KERNEL_args_def_FN_##kernel_name##_##layout( \
const ::phi::KernelKey& kernel_key, ::phi::Kernel* kernel); \
PD_EXPAND(PD_CONCATENATE(_PD_FOR_ALL_BACKEND_DTYPE_, N)( \
reg_type, \
kernel_name, \
layout, \
meta_kernel_fn, \
__PD_KERNEL_args_def_FN_##kernel_name##_##layout, \
__VA_ARGS__) void \
__PD_KERNEL_args_def_FN_##kernel_name##_##layout( \
const ::phi::KernelKey& kernel_key UNUSED, \
::phi::Kernel* kernel UNUSED))
#ifndef _WIN32
#define ___PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
reg_type, kernel_name, backend, layout, kernel_fn, args_def_fn) \
PD_DECLTYPE_FUNCTION_TEMPLATE_INSTANTIATION(kernel_fn) \
static const ::phi::KernelRegistrar \
__reg_phi_kernel_##kernel_name##_##backend##_##layout( \
reg_type, \
#kernel_name, \
#backend, \
DATA_LAYOUT(layout), \
::phi::KernelArgsParseFunctor<decltype(&kernel_fn)>::Parse, \
&args_def_fn, \
PHI_KERNEL(kernel_fn), \
PHI_VARIADIC_KERNEL(kernel_fn)); \
PADDLE_API int TouchKernelSymbolFor_##kernel_name##_##backend##_##layout() { \
return 0; \
}
#else
#define ___PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
reg_type, kernel_name, backend, layout, kernel_fn, args_def_fn) \
static const ::phi::KernelRegistrar \
__reg_phi_kernel_##kernel_name##_##backend##_##layout( \
reg_type, \
#kernel_name, \
#backend, \
DATA_LAYOUT(layout), \
::phi::KernelArgsParseFunctor<decltype(&kernel_fn)>::Parse, \
&args_def_fn, \
PHI_KERNEL(kernel_fn), \
PHI_VARIADIC_KERNEL(kernel_fn)); \
PADDLE_EXP_API int \
TouchKernelSymbolFor_##kernel_name##_##backend##_##layout() { \
return 0; \
}
#endif
#define _PD_FOR_ALL_BACKEND_DTYPE_1( \
reg_type, kernel_name, layout, meta_kernel_fn, args_def_fn, backend) \
___PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
reg_type, \
kernel_name, \
backend, \
layout, \
meta_kernel_fn<::phi::backend##Context>, \
args_def_fn)
#define _PD_FOR_ALL_BACKEND_DTYPE_2( \
reg_type, kernel_name, layout, meta_kernel_fn, args_def_fn, backend, ...) \
___PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
reg_type, \
kernel_name, \
backend, \
layout, \
meta_kernel_fn<::phi::backend##Context>, \
args_def_fn) \
PD_EXPAND(_PD_FOR_ALL_BACKEND_DTYPE_1(reg_type, \
kernel_name, \
layout, \
meta_kernel_fn, \
args_def_fn, \
__VA_ARGS__))
#define _PD_FOR_ALL_BACKEND_DTYPE_3( \
reg_type, kernel_name, layout, meta_kernel_fn, args_def_fn, backend, ...) \
___PD_REGISTER_KERNEL_FOR_ALL_BACKEND_DTYPE( \
reg_type, \
kernel_name, \
backend, \
layout, \
meta_kernel_fn<::phi::backend##Context>, \
args_def_fn) \
PD_EXPAND(_PD_FOR_ALL_BACKEND_DTYPE_2(reg_type, \
kernel_name, \
layout, \
meta_kernel_fn, \
args_def_fn, \
__VA_ARGS__))
/** PD_DECLARE_KERNEL
*
* Used to export the symbols of the file where the kernel is located,
* to avoid being removed by linker
*/
#define PD_DECLARE_KERNEL(kernel_name, backend, layout) \
PD_STATIC_ASSERT_GLOBAL_NAMESPACE( \
PD_DECLARE_tp_kernel_ns_check_##kernel_name##_##backend##_##layout, \
"PD_DECLARE_KERNEL must be called in global namespace."); \
PADDLE_API extern int \
TouchKernelSymbolFor_##kernel_name##_##backend##_##layout(); \
UNUSED static int \
__declare_kernel_symbol_for_##kernel_name##_##backend##_##layout = \
TouchKernelSymbolFor_##kernel_name##_##backend##_##layout()
/** PD_REGISTER_BUILTIN_KERNEL
*
* Used to register kernels for built-in backends.
* Support CPU GPU XPU.
*/
#define PD_REGISTER_BUILTIN_KERNEL( \
kernel_name, backend, layout, meta_kernel_fn, ...) \
_PD_REGISTER_KERNEL(::phi::RegType::OUTER, \
kernel_name, \
backend, \
::phi::backend##Context, \
layout, \
meta_kernel_fn, \
FUNCTION_KERNEL_INSTANTIATION, \
ARG_PARSE_FUNCTOR, \
PHI_KERNEL, \
PHI_VARIADIC_KERNEL, \
__VA_ARGS__)
/** PD_REGISTER_PLUGIN_KERNEL
*
* Used to register kernels for plug-in backends.
* Support user-defined backend such as 'Ascend910'.
*/
#define PD_REGISTER_PLUGIN_KERNEL( \
kernel_name, backend, layout, meta_kernel_fn, ...) \
_PD_REGISTER_KERNEL(::phi::RegType::OUTER, \
kernel_name, \
backend, \
::phi::CustomContext, \
layout, \
meta_kernel_fn, \
FUNCTION_KERNEL_INSTANTIATION, \
ARG_PARSE_FUNCTOR, \
PHI_KERNEL, \
PHI_VARIADIC_KERNEL, \
__VA_ARGS__)
} // namespace phi