1 /* Copyright 2019 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 #include "tensorflow/core/profiler/internal/gpu/cupti_wrapper.h"
17
18 #include <type_traits>
19
20 namespace tensorflow {
21 namespace profiler {
22
ActivityDisable(CUpti_ActivityKind kind)23 CUptiResult CuptiWrapper::ActivityDisable(CUpti_ActivityKind kind) {
24 return cuptiActivityDisable(kind);
25 }
26
ActivityEnable(CUpti_ActivityKind kind)27 CUptiResult CuptiWrapper::ActivityEnable(CUpti_ActivityKind kind) {
28 return cuptiActivityEnable(kind);
29 }
30
ActivityFlushAll(uint32_t flag)31 CUptiResult CuptiWrapper::ActivityFlushAll(uint32_t flag) {
32 return cuptiActivityFlushAll(flag);
33 }
34
ActivityGetNextRecord(uint8_t * buffer,size_t valid_buffer_size_bytes,CUpti_Activity ** record)35 CUptiResult CuptiWrapper::ActivityGetNextRecord(uint8_t* buffer,
36 size_t valid_buffer_size_bytes,
37 CUpti_Activity** record) {
38 return cuptiActivityGetNextRecord(buffer, valid_buffer_size_bytes, record);
39 }
40
ActivityGetNumDroppedRecords(CUcontext context,uint32_t stream_id,size_t * dropped)41 CUptiResult CuptiWrapper::ActivityGetNumDroppedRecords(CUcontext context,
42 uint32_t stream_id,
43 size_t* dropped) {
44 return cuptiActivityGetNumDroppedRecords(context, stream_id, dropped);
45 }
46
ActivityConfigureUnifiedMemoryCounter(CUpti_ActivityUnifiedMemoryCounterConfig * config,uint32_t count)47 CUptiResult CuptiWrapper::ActivityConfigureUnifiedMemoryCounter(
48 CUpti_ActivityUnifiedMemoryCounterConfig* config, uint32_t count) {
49 return cuptiActivityConfigureUnifiedMemoryCounter(config, count);
50 }
51
ActivityRegisterCallbacks(CUpti_BuffersCallbackRequestFunc func_buffer_requested,CUpti_BuffersCallbackCompleteFunc func_buffer_completed)52 CUptiResult CuptiWrapper::ActivityRegisterCallbacks(
53 CUpti_BuffersCallbackRequestFunc func_buffer_requested,
54 CUpti_BuffersCallbackCompleteFunc func_buffer_completed) {
55 return cuptiActivityRegisterCallbacks(func_buffer_requested,
56 func_buffer_completed);
57 }
58
GetDeviceId(CUcontext context,uint32 * deviceId)59 CUptiResult CuptiWrapper::GetDeviceId(CUcontext context, uint32* deviceId) {
60 return cuptiGetDeviceId(context, deviceId);
61 }
62
GetTimestamp(uint64_t * timestamp)63 CUptiResult CuptiWrapper::GetTimestamp(uint64_t* timestamp) {
64 return cuptiGetTimestamp(timestamp);
65 }
66
Finalize()67 CUptiResult CuptiWrapper::Finalize() { return cuptiFinalize(); }
68
EnableCallback(uint32_t enable,CUpti_SubscriberHandle subscriber,CUpti_CallbackDomain domain,CUpti_CallbackId cbid)69 CUptiResult CuptiWrapper::EnableCallback(uint32_t enable,
70 CUpti_SubscriberHandle subscriber,
71 CUpti_CallbackDomain domain,
72 CUpti_CallbackId cbid) {
73 return cuptiEnableCallback(enable, subscriber, domain, cbid);
74 }
75
EnableDomain(uint32_t enable,CUpti_SubscriberHandle subscriber,CUpti_CallbackDomain domain)76 CUptiResult CuptiWrapper::EnableDomain(uint32_t enable,
77 CUpti_SubscriberHandle subscriber,
78 CUpti_CallbackDomain domain) {
79 return cuptiEnableDomain(enable, subscriber, domain);
80 }
81
Subscribe(CUpti_SubscriberHandle * subscriber,CUpti_CallbackFunc callback,void * userdata)82 CUptiResult CuptiWrapper::Subscribe(CUpti_SubscriberHandle* subscriber,
83 CUpti_CallbackFunc callback,
84 void* userdata) {
85 return cuptiSubscribe(subscriber, callback, userdata);
86 }
87
Unsubscribe(CUpti_SubscriberHandle subscriber)88 CUptiResult CuptiWrapper::Unsubscribe(CUpti_SubscriberHandle subscriber) {
89 return cuptiUnsubscribe(subscriber);
90 }
91
DeviceEnumEventDomains(CUdevice device,size_t * array_size_bytes,CUpti_EventDomainID * domain_array)92 CUptiResult CuptiWrapper::DeviceEnumEventDomains(
93 CUdevice device, size_t* array_size_bytes,
94 CUpti_EventDomainID* domain_array) {
95 return cuptiDeviceEnumEventDomains(device, array_size_bytes, domain_array);
96 }
97
DeviceGetEventDomainAttribute(CUdevice device,CUpti_EventDomainID event_domain,CUpti_EventDomainAttribute attrib,size_t * value_size,void * value)98 CUptiResult CuptiWrapper::DeviceGetEventDomainAttribute(
99 CUdevice device, CUpti_EventDomainID event_domain,
100 CUpti_EventDomainAttribute attrib, size_t* value_size, void* value) {
101 return cuptiDeviceGetEventDomainAttribute(device, event_domain, attrib,
102 value_size, value);
103 }
104
DisableKernelReplayMode(CUcontext context)105 CUptiResult CuptiWrapper::DisableKernelReplayMode(CUcontext context) {
106 return cuptiDisableKernelReplayMode(context);
107 }
108
EnableKernelReplayMode(CUcontext context)109 CUptiResult CuptiWrapper::EnableKernelReplayMode(CUcontext context) {
110 return cuptiEnableKernelReplayMode(context);
111 }
112
DeviceGetNumEventDomains(CUdevice device,uint32_t * num_domains)113 CUptiResult CuptiWrapper::DeviceGetNumEventDomains(CUdevice device,
114 uint32_t* num_domains) {
115 return cuptiDeviceGetNumEventDomains(device, num_domains);
116 }
117
EventDomainEnumEvents(CUpti_EventDomainID event_domain,size_t * array_size_bytes,CUpti_EventID * event_array)118 CUptiResult CuptiWrapper::EventDomainEnumEvents(
119 CUpti_EventDomainID event_domain, size_t* array_size_bytes,
120 CUpti_EventID* event_array) {
121 return cuptiEventDomainEnumEvents(event_domain, array_size_bytes,
122 event_array);
123 }
124
EventDomainGetNumEvents(CUpti_EventDomainID event_domain,uint32_t * num_events)125 CUptiResult CuptiWrapper::EventDomainGetNumEvents(
126 CUpti_EventDomainID event_domain, uint32_t* num_events) {
127 return cuptiEventDomainGetNumEvents(event_domain, num_events);
128 }
129
EventGetAttribute(CUpti_EventID event,CUpti_EventAttribute attrib,size_t * value_size,void * value)130 CUptiResult CuptiWrapper::EventGetAttribute(CUpti_EventID event,
131 CUpti_EventAttribute attrib,
132 size_t* value_size, void* value) {
133 return cuptiEventGetAttribute(event, attrib, value_size, value);
134 }
135
EventGetIdFromName(CUdevice device,const char * event_name,CUpti_EventID * event)136 CUptiResult CuptiWrapper::EventGetIdFromName(CUdevice device,
137 const char* event_name,
138 CUpti_EventID* event) {
139 return cuptiEventGetIdFromName(device, event_name, event);
140 }
141
EventGroupDisable(CUpti_EventGroup event_group)142 CUptiResult CuptiWrapper::EventGroupDisable(CUpti_EventGroup event_group) {
143 return cuptiEventGroupDisable(event_group);
144 }
145
EventGroupEnable(CUpti_EventGroup event_group)146 CUptiResult CuptiWrapper::EventGroupEnable(CUpti_EventGroup event_group) {
147 return cuptiEventGroupEnable(event_group);
148 }
149
EventGroupGetAttribute(CUpti_EventGroup event_group,CUpti_EventGroupAttribute attrib,size_t * value_size,void * value)150 CUptiResult CuptiWrapper::EventGroupGetAttribute(
151 CUpti_EventGroup event_group, CUpti_EventGroupAttribute attrib,
152 size_t* value_size, void* value) {
153 return cuptiEventGroupGetAttribute(event_group, attrib, value_size, value);
154 }
155
EventGroupReadEvent(CUpti_EventGroup event_group,CUpti_ReadEventFlags flags,CUpti_EventID event,size_t * event_value_buffer_size_bytes,uint64_t * event_value_buffer)156 CUptiResult CuptiWrapper::EventGroupReadEvent(
157 CUpti_EventGroup event_group, CUpti_ReadEventFlags flags,
158 CUpti_EventID event, size_t* event_value_buffer_size_bytes,
159 uint64_t* event_value_buffer) {
160 return cuptiEventGroupReadEvent(event_group, flags, event,
161 event_value_buffer_size_bytes,
162 event_value_buffer);
163 }
164
EventGroupSetAttribute(CUpti_EventGroup event_group,CUpti_EventGroupAttribute attrib,size_t value_size,void * value)165 CUptiResult CuptiWrapper::EventGroupSetAttribute(
166 CUpti_EventGroup event_group, CUpti_EventGroupAttribute attrib,
167 size_t value_size, void* value) {
168 return cuptiEventGroupSetAttribute(event_group, attrib, value_size, value);
169 }
170
EventGroupSetsCreate(CUcontext context,size_t event_id_array_size_bytes,CUpti_EventID * event_id_array,CUpti_EventGroupSets ** event_group_passes)171 CUptiResult CuptiWrapper::EventGroupSetsCreate(
172 CUcontext context, size_t event_id_array_size_bytes,
173 CUpti_EventID* event_id_array, CUpti_EventGroupSets** event_group_passes) {
174 return cuptiEventGroupSetsCreate(context, event_id_array_size_bytes,
175 event_id_array, event_group_passes);
176 }
177
EventGroupSetsDestroy(CUpti_EventGroupSets * event_group_sets)178 CUptiResult CuptiWrapper::EventGroupSetsDestroy(
179 CUpti_EventGroupSets* event_group_sets) {
180 return cuptiEventGroupSetsDestroy(event_group_sets);
181 }
182
183 // CUPTI metric API
DeviceEnumMetrics(CUdevice device,size_t * arraySizeBytes,CUpti_MetricID * metricArray)184 CUptiResult CuptiWrapper::DeviceEnumMetrics(CUdevice device,
185 size_t* arraySizeBytes,
186 CUpti_MetricID* metricArray) {
187 return cuptiDeviceEnumMetrics(device, arraySizeBytes, metricArray);
188 }
189
DeviceGetNumMetrics(CUdevice device,uint32_t * num_metrics)190 CUptiResult CuptiWrapper::DeviceGetNumMetrics(CUdevice device,
191 uint32_t* num_metrics) {
192 return cuptiDeviceGetNumMetrics(device, num_metrics);
193 }
194
MetricGetIdFromName(CUdevice device,const char * metric_name,CUpti_MetricID * metric)195 CUptiResult CuptiWrapper::MetricGetIdFromName(CUdevice device,
196 const char* metric_name,
197 CUpti_MetricID* metric) {
198 return cuptiMetricGetIdFromName(device, metric_name, metric);
199 }
200
MetricGetNumEvents(CUpti_MetricID metric,uint32_t * num_events)201 CUptiResult CuptiWrapper::MetricGetNumEvents(CUpti_MetricID metric,
202 uint32_t* num_events) {
203 return cuptiMetricGetNumEvents(metric, num_events);
204 }
205
MetricEnumEvents(CUpti_MetricID metric,size_t * event_id_array_size_bytes,CUpti_EventID * event_id_array)206 CUptiResult CuptiWrapper::MetricEnumEvents(CUpti_MetricID metric,
207 size_t* event_id_array_size_bytes,
208 CUpti_EventID* event_id_array) {
209 return cuptiMetricEnumEvents(metric, event_id_array_size_bytes,
210 event_id_array);
211 }
212
MetricGetAttribute(CUpti_MetricID metric,CUpti_MetricAttribute attrib,size_t * value_size,void * value)213 CUptiResult CuptiWrapper::MetricGetAttribute(CUpti_MetricID metric,
214 CUpti_MetricAttribute attrib,
215 size_t* value_size, void* value) {
216 return cuptiMetricGetAttribute(metric, attrib, value_size, value);
217 }
218
MetricGetValue(CUdevice device,CUpti_MetricID metric,size_t event_id_array_size_bytes,CUpti_EventID * event_id_array,size_t event_value_array_size_bytes,uint64_t * event_value_array,uint64_t time_duration,CUpti_MetricValue * metric_value)219 CUptiResult CuptiWrapper::MetricGetValue(CUdevice device, CUpti_MetricID metric,
220 size_t event_id_array_size_bytes,
221 CUpti_EventID* event_id_array,
222 size_t event_value_array_size_bytes,
223 uint64_t* event_value_array,
224 uint64_t time_duration,
225 CUpti_MetricValue* metric_value) {
226 return cuptiMetricGetValue(device, metric, event_id_array_size_bytes,
227 event_id_array, event_value_array_size_bytes,
228 event_value_array, time_duration, metric_value);
229 }
230
GetResultString(CUptiResult result,const char ** str)231 CUptiResult CuptiWrapper::GetResultString(CUptiResult result,
232 const char** str) {
233 return cuptiGetResultString(result, str);
234 }
235
GetContextId(CUcontext context,uint32_t * context_id)236 CUptiResult CuptiWrapper::GetContextId(CUcontext context,
237 uint32_t* context_id) {
238 return cuptiGetContextId(context, context_id);
239 }
240
GetStreamIdEx(CUcontext context,CUstream stream,uint8_t per_thread_stream,uint32_t * stream_id)241 CUptiResult CuptiWrapper::GetStreamIdEx(CUcontext context, CUstream stream,
242 uint8_t per_thread_stream,
243 uint32_t* stream_id) {
244 return cuptiGetStreamIdEx(context, stream, per_thread_stream, stream_id);
245 }
246
247 } // namespace profiler
248 } // namespace tensorflow
249