Files
paddlepaddle--paddle/paddle/cinn/lang/compute.h
T
2026-07-13 12:40:42 +08:00

135 lines
4.7 KiB
C++
Executable File

// Copyright (c) 2021 CINN 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 <variant>
#include <functional>
#include <map>
#include <string>
#include <utility>
#include <vector>
#include "paddle/cinn/ir/ir.h"
#include "paddle/cinn/ir/op/ir_operators.h"
#include "paddle/cinn/lang/placeholder.h"
#include "paddle/common/enforce.h"
namespace cinn {
namespace lang {
using compute_handler_t = std::function<Expr(const std::vector<Expr> &)>;
using attr_t = std::variant<int, float, bool, std::string>;
//! Compute methods for one to five Vars as arguments.
// @{
// The shape are constant integers.
ir::Tensor Compute(const std::vector<Expr> &domain,
std::function<Expr()> fn,
const std::string &name,
const std::vector<Expr> &shape = {});
ir::Tensor Compute(const std::vector<Expr> &domain,
std::function<Expr(Expr)> fn,
const std::string &name,
const std::vector<Expr> &shape = {});
ir::Tensor Compute(const std::vector<Expr> &domain,
std::function<Expr(Expr, Expr)> fn,
const std::string &name,
const std::vector<Expr> &shape = {});
ir::Tensor Compute(const std::vector<Expr> &domain,
std::function<Expr(Expr, Expr, Expr)> fn,
const std::string &name,
const std::vector<Expr> &shape = {});
ir::Tensor Compute(const std::vector<Expr> &domain,
std::function<Expr(Expr, Expr, Expr, Expr)> fn,
const std::string &name,
const std::vector<Expr> &shape = {});
ir::Tensor Compute(const std::vector<Expr> &domain,
std::function<Expr(Expr, Expr, Expr, Expr, Expr)> fn,
const std::string &name,
const std::vector<Expr> &shape = {});
ir::Tensor Compute(const std::vector<Expr> &domain,
std::function<Expr(Expr, Expr, Expr, Expr, Expr, Expr)> fn,
const std::string &name,
const std::vector<Expr> &shape = {});
ir::Tensor Compute(const std::vector<Expr> &domain,
compute_handler_t fn,
const std::string &name,
const std::vector<Expr> &shape = {});
// @}
struct ReturnType {
Type type;
std::vector<Expr> dims;
std::string name;
};
/**
* \brief Call a lowered function and return one or more tensors as result.
*
* A lowered function is generated by lang::Lower method.
*
* TODO(Superjomn) Add a registry (symbol table?) to make return result
* inference automatically.
*
* @param func_name The name of the function to call.
* @param args The readonly arguments(while the mutable tensors are return
* result).
* @param return_types The types of the return values.
* @return Return one or more tensors as result.
*/
std::vector<ir::Tensor> CallLowered(
const std::string &func_name,
const std::vector<Expr> &args,
const std::vector<ReturnType> &return_types);
/**
* \brief Call an external function and get some tensors as result.
*
* There are two kinds of extern functions distinguished by the return type.
*
* 1. Void, there are one or more mutable tensors in the argument list.
* \code
* Tensor tuple = Compute({M}, []() { return CallExtern("mkl_gemm", {X, W}); });
* \endcode
*
* To support returning multiple value one time, we include the tuple concept,
* it is a Tensor with CallOp marked with value_offset(from 0 to num_returns-1).
*
* 2. POD value, return an expression directly, and it can be inline expand in
* following computations. \code Tensor tanh_out = Compute({M}, [](Var i) {
* return CallExtern("tanh", X(i)); }); \endcode
*
* Will generate something like
*
* \code
* for (i) {
* gemm_mkl(X[i], gemm_out[i])
* }
* \endcode
*
* @param func_name The name of the function to call.
* @param args The readonly arguments(while there should be only one tensor as
* result).
* @param attrs The readonly attrs.
*/
Expr CallExtern(const std::string &func_name,
const std::vector<Expr> &args,
const std::map<std::string, attr_t> &attrs = {});
} // namespace lang
} // namespace cinn