From 3773404551e2487e1b6276ad16997f367eb126f8 Mon Sep 17 00:00:00 2001 From: Tianqi Chen <tqchen@users.noreply.github.com> Date: Wed, 24 Jan 2018 13:59:30 -0800 Subject: [PATCH] [CODE COMMENT] Comment BindBufferScope (#815) --- src/pass/storage_flatten.cc | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/pass/storage_flatten.cc b/src/pass/storage_flatten.cc index 45ad081f8..bc380d473 100644 --- a/src/pass/storage_flatten.cc +++ b/src/pass/storage_flatten.cc @@ -296,7 +296,40 @@ class StorageFlattener : public IRMutator { } private: - // Start bind + // The specific tensor data layout is not determined before + // StorageFlatten pass. We use buffer_bind_scope + // to specify before hand we want to bind a subregion + // of tensor to a symbolic buffer, which get used in extern. + // + // Example: + // + // realize A in range [i*4, extent=10) { + // bind Ab to A in [i*4+1, extent=4) { + // call_func(Ab.ptr, Ab.shape[0]) + // } + // } + // + // After StorageFlatten + // + // alloc A[10] + // call(A + 1, 4) + // + // Buffer is a protocol to declare specific + // data layout and shape we expect. + // So this function need to check: + // - If the bind range is within the realize range + // - If we can match the requirement of buffer + // - Remap variables such as Ab.ptr to the actual value. + // + // Here are a few possible failure cases: + // - Buffer is declared to have constant shape, + // but we try to bind it to a different one. + // - Buffer is declared to be compact(no strides) + // but this binded region is a subregion of + // a matrix(tensor), which means it requires strides. + // + // We do support a few relaxed case, such as bindingx + // region with shape [1, 1, n, m] to buffer with shape [n, m] Stmt HandleBufferBindScope(const AttrStmt* op) { Array<NodeRef> arr(op->node.node_); CHECK_EQ(arr.size(), 2U); -- GitLab