/** * Copyright 2020 Huawei Technologies Co., Ltd * * Licensed 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. */ #include #include #include "utils/log_adapter.h" #include "profiler/device/gpu/cupti_interface.h" namespace mindspore { namespace profiler { namespace gpu { inline void *LoadLibrary(const char *name) { auto handle = dlopen(name, RTLD_LAZY | RTLD_LOCAL); if (handle == nullptr) { MS_LOG(EXCEPTION) << "Load lib " << name << " Please check whether configured the path of CUPTI to LD_LIBRARY_PATH"; } return handle; } inline void *GetCUPTIHandle() { static void *handle = LoadLibrary("libcupti.so"); return handle; } inline void *GetCUPTIFunc(const char *name) { static void *handle = GetCUPTIHandle(); void *func = dlsym(handle, name); if (func == nullptr) { MS_LOG(EXCEPTION) << "Load func " << name << " failed, make sure you have implied it!"; } return func; } typedef CUptiResult (*CuptiSubscribeFunc)(CUpti_SubscriberHandle *subscriber, CUpti_CallbackFunc callback, void *userdata); typedef CUptiResult (*CuptiEnableDomainFunc)(uint32_t enable, CUpti_SubscriberHandle subscriber, CUpti_CallbackDomain domain); typedef CUptiResult (*CuptiActivityEnableFunc)(CUpti_ActivityKind kind); typedef CUptiResult (*CuptiActivityRegisterCallbacksFunc)(CUpti_BuffersCallbackRequestFunc funcBufferRequested, CUpti_BuffersCallbackCompleteFunc funcBufferCompleted); typedef CUptiResult (*CuptiUnsubscribeFunc)(CUpti_SubscriberHandle subscriber); typedef CUptiResult (*CuptiActivityFlushAllFunc)(uint32_t flag); typedef CUptiResult (*CuptiActivityDisableFunc)(CUpti_ActivityKind kind); typedef CUptiResult (*CuptiActivityGetNextRecordFunc)(uint8_t *buffer, size_t validBufferSizeBytes, CUpti_Activity **record); typedef CUptiResult (*CuptiActivityGetNumDroppedRecordsFunc)(CUcontext context, uint32_t streamId, size_t *dropped); typedef CUptiResult (*CuptiGetTimestampFunc)(uint64_t *timestamp); typedef CUptiResult (*CuptiGetResultStringFunc)(CUptiResult result, const char **str); typedef CUptiResult (*CuptiGetStreamIdFunc)(CUcontext context, CUstream stream, uint32_t *streamId); typedef CUptiResult (*CuptiGetDeviceIdFunc)(CUcontext context, uint32_t *deviceId); CUptiResult CuptiSubscribe(CUpti_SubscriberHandle *subscriber, CUpti_CallbackFunc callback, void *userdata) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiSubscribe")); return func_ptr(subscriber, callback, userdata); } CUptiResult CuptiEnableDomain(uint32_t enable, CUpti_SubscriberHandle subscriber, CUpti_CallbackDomain domain) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiEnableDomain")); return func_ptr(enable, subscriber, domain); } CUptiResult CuptiActivityEnable(CUpti_ActivityKind kind) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiActivityEnable")); return func_ptr(kind); } CUptiResult CuptiActivityRegisterCallbacks(CUpti_BuffersCallbackRequestFunc funcBufferRequested, CUpti_BuffersCallbackCompleteFunc funcBufferCompleted) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiActivityRegisterCallbacks")); return func_ptr(funcBufferRequested, funcBufferCompleted); } CUptiResult CuptiUnsubscribe(CUpti_SubscriberHandle subscriber) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiUnsubscribe")); return func_ptr(subscriber); } CUptiResult CuptiActivityFlushAll(uint32_t flag) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiActivityFlushAll")); return func_ptr(flag); } CUptiResult CuptiActivityDisable(CUpti_ActivityKind kind) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiActivityDisable")); return func_ptr(kind); } CUptiResult CuptiActivityGetNextRecord(uint8_t *buffer, size_t validBufferSizeBytes, CUpti_Activity **record) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiActivityGetNextRecord")); return func_ptr(buffer, validBufferSizeBytes, record); } CUptiResult CuptiActivityGetNumDroppedRecords(CUcontext context, uint32_t streamId, size_t *dropped) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiActivityGetNumDroppedRecords")); return func_ptr(context, streamId, dropped); } CUptiResult CuptiGetTimestamp(uint64_t *timestamp) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiGetTimestamp")); return func_ptr(timestamp); } CUptiResult CuptiGetResultString(CUptiResult result, const char **str) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiGetResultString")); return func_ptr(result, str); } CUptiResult CuptiGetStreamId(CUcontext context, CUstream stream, uint32_t *streamId) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiGetStreamId")); return func_ptr(context, stream, streamId); } CUptiResult CuptiGetDeviceId(CUcontext context, uint32_t *deviceId) { static auto func_ptr = reinterpret_cast(GetCUPTIFunc("cuptiGetDeviceId")); return func_ptr(context, deviceId); } } // namespace gpu } // namespace profiler } // namespace mindspore