You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by cs...@apache.org on 2023/08/04 15:40:28 UTC

[tvm] branch main updated: [TIR] Output DeclBuffer in MakePackedAPI (#15263)

This is an automated email from the ASF dual-hosted git repository.

csullivan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git


The following commit(s) were added to refs/heads/main by this push:
     new dcbf2b2fb4 [TIR] Output DeclBuffer in MakePackedAPI (#15263)
dcbf2b2fb4 is described below

commit dcbf2b2fb43409cb89a815a70a35bb1e97239f09
Author: Eric Lunderberg <Lu...@users.noreply.github.com>
AuthorDate: Fri Aug 4 10:40:22 2023 -0500

    [TIR] Output DeclBuffer in MakePackedAPI (#15263)
    
    For the `buf_shape` and `buf_strides` buffers, used while unpacking,
    generate a `DeclBuffer`.  For each buffer that was in the
    `buffer_map`, generate a `DeclBuffer`.
    
    This is a subset of the changes made in
    https://github.com/apache/tvm/pull/14778, broken out for ease of
    testing and review.
---
 src/tir/transforms/arg_binder.cc      |  2 ++
 src/tir/transforms/make_packed_api.cc | 11 ++++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/tir/transforms/arg_binder.cc b/src/tir/transforms/arg_binder.cc
index 571acf8e09..f3d799365d 100644
--- a/src/tir/transforms/arg_binder.cc
+++ b/src/tir/transforms/arg_binder.cc
@@ -206,6 +206,7 @@ void ArgBinder::BindDLTensor(const Buffer& buffer, const PrimExpr& device_type,
   def_handle_dtype_.Set(v_shape, make_const(tvm_shape_type, 0));
   init_nest_.emplace_back(
       LetStmt(buf_shape->data, TVMArrayGet(DataType::Handle(), handle, builtin::kArrShape), nop));
+  init_nest_.emplace_back(DeclBuffer(buf_shape, nop));
   for (size_t k = 0; k < buffer->shape.size(); ++k) {
     if (buffer->dtype == DataType::Int(4) || buffer->dtype == DataType::UInt(4) ||
         buffer->dtype == DataType::Int(1)) {
@@ -221,6 +222,7 @@ void ArgBinder::BindDLTensor(const Buffer& buffer, const PrimExpr& device_type,
   def_handle_dtype_.Set(buf_strides->data, tir::TypeAnnotation(tvm_shape_type));
   init_nest_.emplace_back(LetStmt(
       buf_strides->data, TVMArrayGet(DataType::Handle(), handle, builtin::kArrStrides), nop));
+  init_nest_.emplace_back(DeclBuffer(buf_strides, nop));
   PrimExpr v_strides_is_null = Call(DataType::Bool(1), builtin::isnullptr(), {buf_strides->data});
   if (buffer->strides.size() == 0) {
     // Assert the buffer is compact
diff --git a/src/tir/transforms/make_packed_api.cc b/src/tir/transforms/make_packed_api.cc
index e387204045..94e245b636 100644
--- a/src/tir/transforms/make_packed_api.cc
+++ b/src/tir/transforms/make_packed_api.cc
@@ -251,9 +251,12 @@ PrimFunc MakePackedAPI(PrimFunc func) {
   Integer device_type(target_device_type);
   // seq_init gives sequence of initialization
   // seq_check gives sequence of later checks after init
-  std::vector<Stmt> seq_init, seq_check;
+  std::vector<Stmt> seq_init, seq_check, arg_buffer_declarations;
   std::unordered_map<const VarNode*, PrimExpr> vmap;
   ArgBinder binder(&vmap);
+
+  seq_init.emplace_back(DeclBuffer(buf_packed_arg_type_ids, nop));
+
   // ---------------------------
   // local function definitions
   // load i-th argument as type t
@@ -331,6 +334,7 @@ PrimFunc MakePackedAPI(PrimFunc func) {
   for (const auto& kv : buffer_def) {
     binder.BindDLTensor(kv.second, device_type, device_id, kv.first,
                         name_hint + "." + kv.first->name_hint);
+    arg_buffer_declarations.push_back(DeclBuffer(kv.second, nop));
   }
 
   func = WithAttrs(std::move(func), {{tvm::attr::kCallingConv, Integer(CallingConv::kCPackedFunc)},
@@ -360,8 +364,9 @@ PrimFunc MakePackedAPI(PrimFunc func) {
   std::ostringstream num_args_error;
   num_args_error << name_hint << ": num_args should be " << num_args;
   std::vector<Stmt> arg_assert = {MakeAssertEQ(v_num_packed_args, num_args, num_args_error.str())};
-  body = MergeNest({arg_assert, seq_init, binder.init_nest(), seq_check, binder.asserts()}, body);
-
+  body = MergeNest({arg_assert, seq_init, binder.init_nest(), seq_check, binder.asserts(),
+                    arg_buffer_declarations},
+                   body);
   func_ptr->body = body;
   func_ptr->params = args;