mbs-octoml commented on a change in pull request #9038:
URL: https://github.com/apache/tvm/pull/9038#discussion_r717097996



##########
File path: src/relay/transforms/device_planner.cc
##########
@@ -0,0 +1,1986 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+/*!
+ * \file src/relay/analysis/device_planner.cc
+ * \brief Determines a unique device to hold the result of every Relay 
sub-expression.
+ *
+ * We say a Relay expression E is 'on device D' if the result of executing E 
is stored on D.
+ * Currently we only track the 'device_type' of D and not its 'device id'. We 
do not track the
+ * specific target associated with D (this is recovered independently via a 
TargetMap), and we
+ * do not track the storage scope within D (this is yet to be implemented).
+ *
+ * Note that 'stored on device D' is almost but not quite the same as 
'executes on device D',
+ * see below.
+ *
+ * This pass assumes the module already contains some "on_device" and/or 
"device_copy" CallNodes:
+ *  - "device_copy" CallNodes (with a \p DeviceCopyAttrs attribute) specify a 
'src_dev_type' and
+ *    'dst_dev_type' device type, which constrain the argument and context of 
the call
+ *     respectively. It is ok if source and destination devices are the same, 
such no-op copies
+ *     will be removed after accounting for the device preference.
+ *  - "on_device" CallNodes (with a \p OnDeviceAttrs attribute) specify a 
'device_type', which
+ *    constrains the argument of the call, but (usually, see below) leaves the 
context
+ *    unconstrained. These are called 'annotations' in the rest of the code, 
have no operational
+ *    significance by themselves, but may trigger the insertion of a new 
"device_copy".
+ *  - In two situations the result of an "on_device" CallNode may also be 
constrained to the
+ *    given device:
+ *     - The "on_device" call occurs at the top-level of a function body, or 
occurs as an
+ *       immediately let-bound expression. In this situation the extra degree 
of freedom in
+ *       the function result and let-binding leads to surprising device 
copies, so we simply
+ *       force the function result or let-bound variable to the given device.
+ *     - The \p OnDeviceAttrs has an \p is_fixed field of \p true, which 
indicates we inserted
+ *       it ourselves during an earlier invocation of this pass. This helps 
make this pass
+ *       idempotent.
+ *
+ * We proceed in four phases:
+ *
+ * Phase 0
+ * -------
+ * We rewrite the programs to handle some special cases:
+ *  - "on_device" calls at the top-level of function or immediately let-bound 
are rewritten
+ *    to have \code is_fixed=true \endcode.
+ *  - We wish to treat \code on_device(expr, device_type=d).0 \endcode as if 
it were written

Review comment:
       No, it's just a clever peephole optimization hiding in the original 
device_annotation.cc that silently interprets a 'copy tuple then project' as if 
it were a 'project from tuple then copy'. It threw a bit of a spanner in the 
works and pushed me to require the 'phase 0' to spell it out explicitly since 
the trick in device_annotation.cc does not carry over into the 
unification-based approach in context_analysis.cc which this impl is derived 
from.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@tvm.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to