You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cupti_interface.cc 6.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /**
  2. * Copyright 2020 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include <cupti.h>
  17. #include <dlfcn.h>
  18. #include "utils/log_adapter.h"
  19. #include "profiler/device/gpu/cupti_interface.h"
  20. namespace mindspore {
  21. namespace profiler {
  22. namespace gpu {
  23. inline void *LoadLibrary(const char *name) {
  24. auto handle = dlopen(name, RTLD_LAZY | RTLD_LOCAL);
  25. if (handle == nullptr) {
  26. MS_LOG(EXCEPTION) << "Load lib " << name << " Please check whether configured the path of CUPTI to LD_LIBRARY_PATH";
  27. }
  28. return handle;
  29. }
  30. inline void *GetCUPTIHandle() {
  31. static void *handle = LoadLibrary("libcupti.so");
  32. return handle;
  33. }
  34. inline void *GetCUPTIFunc(const char *name) {
  35. static void *handle = GetCUPTIHandle();
  36. void *func = dlsym(handle, name);
  37. if (func == nullptr) {
  38. MS_LOG(EXCEPTION) << "Load func " << name << " failed, make sure you have implied it!";
  39. }
  40. return func;
  41. }
  42. using CuptiSubscribeFunc = CUptiResult (*)(CUpti_SubscriberHandle *subscriber, CUpti_CallbackFunc callback,
  43. void *userdata);
  44. using CuptiEnableDomainFunc = CUptiResult (*)(uint32_t enable, CUpti_SubscriberHandle subscriber,
  45. CUpti_CallbackDomain domain);
  46. using CuptiActivityEnableFunc = CUptiResult (*)(CUpti_ActivityKind kind);
  47. using CuptiActivityRegisterCallbacksFunc = CUptiResult (*)(CUpti_BuffersCallbackRequestFunc funcBufferRequested,
  48. CUpti_BuffersCallbackCompleteFunc funcBufferCompleted);
  49. using CuptiUnsubscribeFunc = CUptiResult (*)(CUpti_SubscriberHandle subscriber);
  50. using CuptiActivityFlushAllFunc = CUptiResult (*)(uint32_t flag);
  51. using CuptiActivityDisableFunc = CUptiResult (*)(CUpti_ActivityKind kind);
  52. using CuptiActivityGetNextRecordFunc = CUptiResult (*)(uint8_t *buffer, size_t validBufferSizeBytes,
  53. CUpti_Activity **record);
  54. using CuptiActivityGetNumDroppedRecordsFunc = CUptiResult (*)(CUcontext context, uint32_t streamId, size_t *dropped);
  55. using CuptiGetTimestampFunc = CUptiResult (*)(uint64_t *timestamp);
  56. using CuptiGetResultStringFunc = CUptiResult (*)(CUptiResult result, const char **str);
  57. using CuptiGetStreamIdFunc = CUptiResult (*)(CUcontext context, CUstream stream, uint32_t *streamId);
  58. using CuptiGetDeviceIdFunc = CUptiResult (*)(CUcontext context, uint32_t *deviceId);
  59. CUptiResult CuptiSubscribe(CUpti_SubscriberHandle *subscriber, CUpti_CallbackFunc callback, void *userdata) {
  60. static auto func_ptr = reinterpret_cast<CuptiSubscribeFunc>(GetCUPTIFunc("cuptiSubscribe"));
  61. return func_ptr(subscriber, callback, userdata);
  62. }
  63. CUptiResult CuptiEnableDomain(uint32_t enable, CUpti_SubscriberHandle subscriber, CUpti_CallbackDomain domain) {
  64. static auto func_ptr = reinterpret_cast<CuptiEnableDomainFunc>(GetCUPTIFunc("cuptiEnableDomain"));
  65. return func_ptr(enable, subscriber, domain);
  66. }
  67. CUptiResult CuptiActivityEnable(CUpti_ActivityKind kind) {
  68. static auto func_ptr = reinterpret_cast<CuptiActivityEnableFunc>(GetCUPTIFunc("cuptiActivityEnable"));
  69. return func_ptr(kind);
  70. }
  71. CUptiResult CuptiActivityRegisterCallbacks(CUpti_BuffersCallbackRequestFunc funcBufferRequested,
  72. CUpti_BuffersCallbackCompleteFunc funcBufferCompleted) {
  73. static auto func_ptr =
  74. reinterpret_cast<CuptiActivityRegisterCallbacksFunc>(GetCUPTIFunc("cuptiActivityRegisterCallbacks"));
  75. return func_ptr(funcBufferRequested, funcBufferCompleted);
  76. }
  77. CUptiResult CuptiUnsubscribe(CUpti_SubscriberHandle subscriber) {
  78. static auto func_ptr = reinterpret_cast<CuptiUnsubscribeFunc>(GetCUPTIFunc("cuptiUnsubscribe"));
  79. return func_ptr(subscriber);
  80. }
  81. CUptiResult CuptiActivityFlushAll(uint32_t flag) {
  82. static auto func_ptr = reinterpret_cast<CuptiActivityFlushAllFunc>(GetCUPTIFunc("cuptiActivityFlushAll"));
  83. return func_ptr(flag);
  84. }
  85. CUptiResult CuptiActivityDisable(CUpti_ActivityKind kind) {
  86. static auto func_ptr = reinterpret_cast<CuptiActivityDisableFunc>(GetCUPTIFunc("cuptiActivityDisable"));
  87. return func_ptr(kind);
  88. }
  89. CUptiResult CuptiActivityGetNextRecord(uint8_t *buffer, size_t validBufferSizeBytes, CUpti_Activity **record) {
  90. static auto func_ptr = reinterpret_cast<CuptiActivityGetNextRecordFunc>(GetCUPTIFunc("cuptiActivityGetNextRecord"));
  91. return func_ptr(buffer, validBufferSizeBytes, record);
  92. }
  93. CUptiResult CuptiActivityGetNumDroppedRecords(CUcontext context, uint32_t streamId, size_t *dropped) {
  94. static auto func_ptr =
  95. reinterpret_cast<CuptiActivityGetNumDroppedRecordsFunc>(GetCUPTIFunc("cuptiActivityGetNumDroppedRecords"));
  96. return func_ptr(context, streamId, dropped);
  97. }
  98. CUptiResult CuptiGetTimestamp(uint64_t *timestamp) {
  99. static auto func_ptr = reinterpret_cast<CuptiGetTimestampFunc>(GetCUPTIFunc("cuptiGetTimestamp"));
  100. return func_ptr(timestamp);
  101. }
  102. CUptiResult CuptiGetResultString(CUptiResult result, const char **str) {
  103. static auto func_ptr = reinterpret_cast<CuptiGetResultStringFunc>(GetCUPTIFunc("cuptiGetResultString"));
  104. return func_ptr(result, str);
  105. }
  106. CUptiResult CuptiGetStreamId(CUcontext context, CUstream stream, uint32_t *streamId) {
  107. static auto func_ptr = reinterpret_cast<CuptiGetStreamIdFunc>(GetCUPTIFunc("cuptiGetStreamId"));
  108. return func_ptr(context, stream, streamId);
  109. }
  110. CUptiResult CuptiGetDeviceId(CUcontext context, uint32_t *deviceId) {
  111. static auto func_ptr = reinterpret_cast<CuptiGetDeviceIdFunc>(GetCUPTIFunc("cuptiGetDeviceId"));
  112. return func_ptr(context, deviceId);
  113. }
  114. } // namespace gpu
  115. } // namespace profiler
  116. } // namespace mindspore