aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/core/util/device_name_utils.cc
diff options
context:
space:
mode:
authorGravatar Rohan Jain <rohanj@google.com>2018-06-25 15:42:59 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-06-25 15:45:45 -0700
commitf2460fc21b22b65ca57c7ea996e4e8d003aa3371 (patch)
treeb2194b3d6e3d6fadd83350999352953b872d636d /tensorflow/core/util/device_name_utils.cc
parent84a7f40c86a5ac3d8c427085dd28eef45036b48f (diff)
Making the device name comparison more robust for RemoteCall and
FunctionBufferingResource. Earlier target_device could be '/cpu:0' and source_device be '/job:localhost/replica:0/task:0/device:CPU:0' and we'd deem them to be different devices which is incorrect. PiperOrigin-RevId: 202032979
Diffstat (limited to 'tensorflow/core/util/device_name_utils.cc')
-rw-r--r--tensorflow/core/util/device_name_utils.cc57
1 files changed, 53 insertions, 4 deletions
diff --git a/tensorflow/core/util/device_name_utils.cc b/tensorflow/core/util/device_name_utils.cc
index 90c3fed2e8..8c24076aa9 100644
--- a/tensorflow/core/util/device_name_utils.cc
+++ b/tensorflow/core/util/device_name_utils.cc
@@ -184,16 +184,65 @@ bool DeviceNameUtils::ParseFullName(StringPiece fullname, ParsedName* p) {
return true;
}
+namespace {
+
+void CompleteName(const DeviceNameUtils::ParsedName& parsed_basename,
+ DeviceNameUtils::ParsedName* parsed_name) {
+ if (!parsed_name->has_job) {
+ parsed_name->job = parsed_basename.job;
+ parsed_name->has_job = true;
+ }
+ if (!parsed_name->has_replica) {
+ parsed_name->replica = parsed_basename.replica;
+ parsed_name->has_replica = true;
+ }
+ if (!parsed_name->has_task) {
+ parsed_name->task = parsed_basename.task;
+ parsed_name->has_task = true;
+ }
+ if (!parsed_name->has_type) {
+ parsed_name->type = parsed_basename.type;
+ parsed_name->has_type = true;
+ }
+ if (!parsed_name->has_id) {
+ parsed_name->id = parsed_basename.id;
+ parsed_name->has_id = true;
+ }
+}
+
+} // namespace
+
/* static */
-string DeviceNameUtils::CanonicalizeDeviceName(StringPiece fullname) {
+Status DeviceNameUtils::CanonicalizeDeviceName(StringPiece fullname,
+ StringPiece basename,
+ string* canonical_name) {
+ *canonical_name = "";
+ ParsedName parsed_basename;
+ if (!ParseFullName(basename, &parsed_basename)) {
+ return errors::InvalidArgument("Could not parse basename: ", basename,
+ " into a device specification.");
+ }
+ if (!(parsed_basename.has_job && parsed_basename.has_replica &&
+ parsed_basename.has_task && parsed_basename.has_type &&
+ parsed_basename.has_id)) {
+ return errors::InvalidArgument("Basename: ", basename,
+ " should be fully "
+ "specified.");
+ }
ParsedName parsed_name;
if (ParseLocalName(fullname, &parsed_name)) {
- return ParsedNameToString(parsed_name);
+ CompleteName(parsed_basename, &parsed_name);
+ *canonical_name = ParsedNameToString(parsed_name);
+ return Status::OK();
}
if (ParseFullName(fullname, &parsed_name)) {
- return ParsedNameToString(parsed_name);
+ CompleteName(parsed_basename, &parsed_name);
+ *canonical_name = ParsedNameToString(parsed_name);
+ return Status::OK();
}
- return "";
+ return errors::InvalidArgument("Could not parse ", fullname,
+ " into a device "
+ "specification.");
}
/* static */