1 | /* Copyright 2015 The TensorFlow Authors. All Rights Reserved. |
2 | |
3 | Licensed under the Apache License, Version 2.0 (the "License"); |
4 | you may not use this file except in compliance with the License. |
5 | You may obtain a copy of the License at |
6 | |
7 | http://www.apache.org/licenses/LICENSE-2.0 |
8 | |
9 | Unless required by applicable law or agreed to in writing, software |
10 | distributed under the License is distributed on an "AS IS" BASIS, |
11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | See the License for the specific language governing permissions and |
13 | limitations under the License. |
14 | ==============================================================================*/ |
15 | |
16 | // See docs in ../ops/array_ops.cc. |
17 | #include "tensorflow/core/kernels/debug_ops.h" |
18 | |
19 | #include "tensorflow/core/framework/op_kernel.h" |
20 | #include "tensorflow/core/framework/register_types.h" |
21 | #include "tensorflow/core/framework/tensor.h" |
22 | #include "tensorflow/core/framework/types.h" |
23 | |
24 | namespace tensorflow { |
25 | |
26 | // Register Copy ops. |
27 | REGISTER_KERNEL_BUILDER(Name("Copy" ).Device(DEVICE_CPU), CopyOp); |
28 | |
29 | REGISTER_KERNEL_BUILDER(Name("CopyHost" ).Device(DEVICE_CPU), CopyOp); |
30 | |
31 | REGISTER_KERNEL_BUILDER(Name("Copy" ).Device(DEVICE_DEFAULT), CopyOp); |
32 | |
33 | REGISTER_KERNEL_BUILDER(Name("CopyHost" ) |
34 | .Device(DEVICE_DEFAULT) |
35 | .HostMemory("input" ) |
36 | .HostMemory("output" ), |
37 | CopyOp); |
38 | |
39 | // Register debug identity (non-ref and ref) ops. |
40 | REGISTER_KERNEL_BUILDER(Name("DebugIdentity" ).Device(DEVICE_CPU), |
41 | DebugIdentityOp); |
42 | |
43 | REGISTER_KERNEL_BUILDER(Name("DebugIdentity" ) |
44 | .Device(DEVICE_DEFAULT) |
45 | .HostMemory("input" ) |
46 | .HostMemory("output" ), |
47 | DebugIdentityOp); |
48 | |
49 | // Register debug NaN-counter (non-ref and ref) ops. |
50 | #define REGISTER_DEBUG_NAN_COUNT(type) \ |
51 | REGISTER_KERNEL_BUILDER( \ |
52 | Name("DebugNanCount").Device(DEVICE_CPU).TypeConstraint<type>("T"), \ |
53 | DebugNanCountOp<type>); |
54 | TF_CALL_REAL_NUMBER_TYPES(REGISTER_DEBUG_NAN_COUNT); |
55 | |
56 | #define REGISTER_DEFAULT_DEBUG_NAN_COUNT(type) \ |
57 | REGISTER_KERNEL_BUILDER(Name("DebugNanCount") \ |
58 | .Device(DEVICE_DEFAULT) \ |
59 | .HostMemory("input") \ |
60 | .HostMemory("output") \ |
61 | .TypeConstraint<type>("T"), \ |
62 | DebugNanCountOp<type>); |
63 | REGISTER_DEFAULT_DEBUG_NAN_COUNT(Eigen::half); |
64 | REGISTER_DEFAULT_DEBUG_NAN_COUNT(float); |
65 | REGISTER_DEFAULT_DEBUG_NAN_COUNT(double); |
66 | |
67 | // Register debug numeric summary ops. |
68 | #define REGISTER_DEBUG_NUMERIC_SUMMARY_COUNT(type) \ |
69 | REGISTER_KERNEL_BUILDER(Name("DebugNumericSummary") \ |
70 | .Device(DEVICE_CPU) \ |
71 | .TypeConstraint<type>("T"), \ |
72 | DebugNumericSummaryOp<type>); |
73 | TF_CALL_bool(REGISTER_DEBUG_NUMERIC_SUMMARY_COUNT); |
74 | TF_CALL_INTEGRAL_TYPES(REGISTER_DEBUG_NUMERIC_SUMMARY_COUNT); |
75 | TF_CALL_float(REGISTER_DEBUG_NUMERIC_SUMMARY_COUNT); |
76 | TF_CALL_double(REGISTER_DEBUG_NUMERIC_SUMMARY_COUNT); |
77 | |
78 | #define REGISTER_DEFAULT_DEBUG_NUMERIC_SUMMARY_COUNT(type) \ |
79 | REGISTER_KERNEL_BUILDER(Name("DebugNumericSummary") \ |
80 | .Device(DEVICE_DEFAULT) \ |
81 | .HostMemory("input") \ |
82 | .HostMemory("output") \ |
83 | .TypeConstraint<type>("T"), \ |
84 | DebugNumericSummaryOp<type>); |
85 | TF_CALL_bool(REGISTER_DEFAULT_DEBUG_NUMERIC_SUMMARY_COUNT); |
86 | TF_CALL_INTEGRAL_TYPES(REGISTER_DEFAULT_DEBUG_NUMERIC_SUMMARY_COUNT); |
87 | TF_CALL_float(REGISTER_DEFAULT_DEBUG_NUMERIC_SUMMARY_COUNT); |
88 | TF_CALL_double(REGISTER_DEFAULT_DEBUG_NUMERIC_SUMMARY_COUNT); |
89 | |
90 | #undef REGISTER_DEFAULT_DEBUG_NUMERIC_SUMMARY_COUNT |
91 | |
92 | REGISTER_KERNEL_BUILDER(Name("DebugIdentityV2" ).Device(DEVICE_CPU), |
93 | DebugIdentityV2Op); |
94 | |
95 | REGISTER_KERNEL_BUILDER(Name("DebugIdentityV2" ) |
96 | .Device(DEVICE_DEFAULT) |
97 | .HostMemory("input" ) |
98 | .HostMemory("output" ), |
99 | DebugIdentityV2Op); |
100 | |
101 | #define REGISTER_DEBUG_NUMERIC_SUMMARY_V2_FLOAT(type) \ |
102 | REGISTER_KERNEL_BUILDER(Name("DebugNumericSummaryV2") \ |
103 | .Device(DEVICE_CPU) \ |
104 | .TypeConstraint<type>("T") \ |
105 | .TypeConstraint<float>("output_dtype"), \ |
106 | DebugNumericSummaryV2Op<CPUDevice, type, float>); |
107 | TF_CALL_half(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_FLOAT); |
108 | TF_CALL_bfloat16(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_FLOAT); |
109 | TF_CALL_float(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_FLOAT); |
110 | TF_CALL_double(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_FLOAT); |
111 | TF_CALL_INTEGRAL_TYPES(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_FLOAT); |
112 | TF_CALL_bool(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_FLOAT); |
113 | // TODO(cais): Add string support. |
114 | |
115 | #define REGISTER_DEBUG_NUMERIC_SUMMARY_V2_DOUBLE(type) \ |
116 | REGISTER_KERNEL_BUILDER(Name("DebugNumericSummaryV2") \ |
117 | .Device(DEVICE_CPU) \ |
118 | .TypeConstraint<type>("T") \ |
119 | .TypeConstraint<double>("output_dtype"), \ |
120 | DebugNumericSummaryV2Op<CPUDevice, type, double>); |
121 | TF_CALL_half(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_DOUBLE); |
122 | TF_CALL_bfloat16(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_DOUBLE); |
123 | TF_CALL_float(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_DOUBLE); |
124 | TF_CALL_double(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_DOUBLE); |
125 | TF_CALL_INTEGRAL_TYPES(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_DOUBLE); |
126 | TF_CALL_bool(REGISTER_DEBUG_NUMERIC_SUMMARY_V2_DOUBLE); |
127 | // TODO(cais): Add string support. |
128 | |
129 | #if GOOGLE_CUDA || TENSORFLOW_USE_ROCM |
130 | #define REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(in_type, out_type) \ |
131 | REGISTER_KERNEL_BUILDER( \ |
132 | Name("DebugNumericSummaryV2") \ |
133 | .Device(DEVICE_GPU) \ |
134 | .TypeConstraint<in_type>("T") \ |
135 | .TypeConstraint<out_type>("output_dtype"), \ |
136 | DebugNumericSummaryV2Op<GPUDevice, in_type, out_type>); |
137 | |
138 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(Eigen::half, float); |
139 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(float, float); |
140 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(double, float); |
141 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(int16, float); |
142 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(int32, float); |
143 | |
144 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(Eigen::half, double); |
145 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(float, double); |
146 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(double, double); |
147 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(int16, double); |
148 | REGISTER_DEBUG_NUMERIC_SUMMARY_V2_GPU(int32, double); |
149 | |
150 | #endif // GOOGLE_CUDA || TENSORFLOW_USE_ROCM |
151 | |
152 | } // namespace tensorflow |
153 | |