Lunderberg commented on code in PR #11173:
URL: https://github.com/apache/tvm/pull/11173#discussion_r865104858
##########
src/target/compilation_config.cc:
##########
@@ -53,194 +69,186 @@ VirtualDevice
CompilationConfigNode::CanonicalVirtualDevice(
target,
virtual_device->memory_scope));
}
-void CompilationConfigNode::EstablishDefaultVirtualDevices(const
transform::PassContext& pass_ctx) {
+void CompilationConfigNode::Init(const transform::PassContext& pass_ctx,
+ const Array<Target>& raw_targets) {
+ VLOG_CONTEXT << "CompilationConfig";
+ CHECK_GT(raw_targets.size(), 0U) << "Require at least one target";
+
//
- // Gather the hints as to what our default device type for the 'host' should
be, and
- // create an appropriate target if we don't already have one.
+ // Decide on the host target.
//
- DLDeviceType host_device_type;
- if (host_target.defined()) {
- CHECK(!host_target->host.defined()) << "Host targets are not expected to
have hosts";
- host_device_type =
static_cast<DLDeviceType>(host_target->kind->device_type);
- VLOG(1) << "Using the given host target " << host_target->ToDebugString()
<< " of device type "
- << host_device_type << " for the host target";
- for (const auto& primitive_target : primitive_targets) {
- if (primitive_target->host.defined() &&
- !StructuralEqual()(primitive_target->host, host_target)) {
- VLOG(1) << "The primitive target " << primitive_target->ToDebugString()
- << " already has a host which disagrees with the desired host
target. It "
- << "will be ignored.";
- }
- }
- } else if (primitive_targets.size() == 1 &&
primitive_targets.front()->host.defined()) {
- host_target = primitive_targets.front()->GetHost().value();
- CHECK(!host_target->host.defined()) << "Host targets are not expected to
have hosts";
- host_device_type =
static_cast<DLDeviceType>(host_target->kind->device_type);
- VLOG(1) << "Using the host of the unique primitive target, namely "
- << host_target->ToDebugString() << " of device type " <<
host_device_type
- << " for the host target";
- } else if (primitive_targets.size() == 1 &&
- primitive_targets.front()->kind->device_type == kDLCPU) {
- // In the homogenous case without an explicit host target just use the
given target so long as
- // it's a CPU.
- host_device_type = kDLCPU;
- host_target = primitive_targets.front();
- VLOG(1) << "Using the unique primitive target " <<
host_target->ToDebugString()
- << " of device type " << host_device_type << " for the host
target";
+
+ // Any CPU-like targets?
+ auto cpu_itr = std::find_if(raw_targets.begin(), raw_targets.end(), [](const
Target& target) {
+ // TODO(tvm-team): AoT only works with kDLCPU device type. We can remove
kDLHexagon
Review Comment:
> Note the Hexagon special case in CompliationConfigNode::Init, which I
transliterated from the AOT build. Would be good to check that's the Right
Thing to Do.
That check looks reasonable to me, as it is selecting out any targets whose
device types are able to make system calls, and are capable of being the host.
The same refactoring of `kDLHexagon` to `kDLCPU` will simplify this check.
That said, we should probably update the comment, as this instance doesn't
appear AOT-specific.
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]